Zeka 的记事本

2021 年 5 月
Jetbrains 配合 IdeaVim 实现简单键盘流
2021527 日说: Linux Vim IDE

由于水平有限,还需要大量完善

目前收获最大的文章是 这一篇,非常感谢这一篇文章使得我对 IDE 的使用更加熟练 已经离不开 JB 了(指 Jetbrains)

本文主要基于 Jetbrains 家的 WebStorm 。开发常用工具栈为 React + TS + SCSS。使用到的核心插件为 IdeaVIM。

这对其他语言也有参考意义。

每个人有自己的的使用习惯,决定使用与否,还需要自己斟酌。

本文不涉及 VIM 教学操作。

我没有开发过大型项目,如果项目非常大,以至于很难记忆,或者重名文件太多,目录太深,导致搜索功能难以使用的,可能使用鼠标更加方便。

将 CapLock 与 Ctrl 交换

使用标准打字方式的人会很快意识到 CapLock 占用了黄金地段,但是几乎没有使用场景(或者说可以被其他操作替代)。因此我们需要将 CapLock 与 Ctrl 交换。

抛弃 CapLock 按键

CapLock (大写锁定)可能比较有作用的的时候可能是声明全局变量:

const THIS_IS_A_VARY_LONG_VARIABLE = 1;

但是我们有替代方案,可以让我们只输入小写,然后自动转为大写

  • vim 用户在命令模式下使用 gUaw 即可将整个单词(注意 _ 与大写字母相连也是一个单词)快速切换成大写。
  • 对于 JetBrains IDE,选中单词后 ctrl+shift+u 也可以做到。
  • 对于其他编辑器,也一定有属于自己的快捷键。

JetBrains IDE 补全是大小写敏感的,所以使用小写再转换成大写过程没有代码提示,因此上述转换只适用于定义过程。

要使用到 Jetbrains 补全功能,可以只输入首字母。这样也能避免手动输入长全局变量。

在使用上述方法后,我们输入最多的就是单个首字母了。为了提高打字速度,同时减少左手拇指压力,你应该学会同时使用两侧的 Shift 按键。

一个比较好的免费练习打字网站为 https://www.typingclub.com,它可以你的训练标准键位,两侧 Shift 键,标点输入能力。

替换为 Ctrl 而不是 ESC

对于 EMACS 用户,交换 CapLock 为 Ctrl 为必然的事情。

但是对于 VIM 用户,还有一个关键键位是 ESC。在一些教程中,它们会建议你将 CapLock 与 ESC 交换。

我个人使用经验告诉我,交换为 Ctrl 有更大好处。

首先在各种日常使用中 Ctrl 为常用键位,各种复制粘贴都需要用到。交换后你会发现复制粘贴非常丝滑,浏览器切换 tab(Ctrl+Tab)也非常爽。

其次,虽然和 Shift 一样,左右都有 Ctrl 按键。但是使用下来你就会发现,右边的 Ctrl 是几乎不可用的——太远了!左边的 Ctrl 为不可避免的高频按键。

事实上,对于 VIM 用户,使用 Ctrl 也能实现 ESC 功能。默认的 VIM 中,Ctrl+[ 组合按键与 ESC 等价。这是开箱即用的,哪怕你 SSH 到一台新机器,也能立即上手,而不需要任何额外配置。

低头看看交换后的 Ctrl 与 [,你会发现虽然需要按下两次,但是都离手指非常近,非常方便。

交换为 Ctrl 后,即使使用 VIM 编辑,ESC 的使用频率也大幅减少了。不过在 JetBrains IDE 中 ESC 还有其他作用,但是使用不多。之后会提到。

搜索

之后小节都是使用 JetBrains 家编辑器,并配合了 IdeaVim。

JetBrains 家的补全功能可以让人高潮。

JetBrains 运行需要消耗大量内存,取而代之的是借助空间换来的强大补全能力。

与强大的补全能力相对的,却是相对低廉的学习成本。

要丢弃鼠标,就必须学会将所有鼠标操作转换为搜索或者快捷键,从而实现比鼠标更快,更强大的跳转能力。

文件内搜索(Ctrl+f)非常简单,就不赘述了。

Search Everywhere

这是 JetBrains 家的功能,更详细的使用可以参照 官方说明

双击 Shift,就能呼出 Search Everywhere 菜单。

在我的使用场景下,我主要用它创建,打开文件。在需要全局搜索时,也会使用它搜索变量,函数等等。

打开文件直接输入文件名字,你可以加上路径来打开特定目录下的文件。

输入 new 指令可以创建新文件。

输入 settings 可以进入设置界面。

直接搜索可以搜索到变量,函数等等。

函数列表

一个文件几百几千行,函数变量太多了?使用函数列表查看吧。

在 Windows/Linux 下,输入 Ctrl+0 进入函数列表,在这里可以直接查看到函数与变量定义。你还可以直接搜索,并按下 enter 进行快速跳转。

结构复杂会导致函数列表过长,对于笔记本可能还是需要一个触摸板进行滚动。

在任何位置使用搜索

难以置信的一点是 JetBrains 几乎在任何地方都集成了搜索功能,并且不需要点击输入框,直接输入字母就自动进入搜索模式,非常智能。

你可以在任何设置页面,目录树下使用搜索功能。搜索到后按下 enter 即可以进入目录/打开文件/进入设置选项卡。然后很多选项卡中也可以搜索。

文件与目录操作

在不使用目录时,应该将其收起。

你可以使用 Alt + 4 将目录收起。Alt 右边比较舒服,但是这个组合键还是不方便。你可以修改成自己舒服的按键。

但是后面学习了 Switcher,加上对小型项目框架了解,可以直接在 Search Everywhere 中打开文件,可以减少对目录的使用。

快速切换文件

jetBrains 有自带 Switcher 功能,在交换完 Ctrl 按键后,按下 Ctrl + Tab,你就做到了快速切换文件。

切换文件范围是在你打开的 tab 中的。Switcher 逻辑与桌面的 Switcher 相同,即连续两下的 Ctrl + Tab 会返回原本文件。

有了这个就可以将 tab 视为缓冲区,将需要的文件送入 tab,将不需要的文件移出 tab。为了使 Switcher 足够好用,最好保证 tab 不超过一定数量。我习惯保留在 4-6 个以内。

对于前端开发常见的是 HTML 与 CSS 切换,主要集中在两个文件中,这样相互切换速度很快。

同时修改多个文件的情况,不论是 Switcher 还是鼠标都不会方便,因为 tab 宽度是有限的,过多的 tab 会导致无法看到,造成操作困难。

添加文件到 tab

上面通过 Switcher 进行文件切换,所以需要有一个将文件添加的过程。

Search Everywhere 在知道文件名的时候是比较合适的选择。

否则就需要浏览目录。所以需要不借助鼠标浏览目录的方法。

按下 Alt + 1 可以开关/选中目录,然后输入任何字母就可以直接进行搜索。

搜索到目录通过 enter 可以切换 开关状态,enter 文件可以直接打开。

打开完文件后 Alt+1 关闭目录,进行编辑操作。

如果目录过长,不借助鼠标还是比较 难以操作。如果是笔记本,可以考虑通过触摸板进行滚动,再通过搜索打开文件。

从 tab 中删除文件

当 tab 过多了,就需要及时清理。

按下 Ctrl+4 可以关闭当前打开的文件。

使用 Snippets

JetBrains 自带集成了大量 Snippets。

除了内建的 Snippets,还可以在插件市场查找,或者进行自定义。

这不是 JetBrains 独有的功能,一般的代码编辑器都具有。但是 JetBrains 自带的 Snippets 很强大,在自定义之前最好可以熟悉一下自带的(快速生成 if 等语句)。

使用 Duplicati 进行数据备份
202157 日说: Linux

Duplicati 是一款开源的备份软件开源拖拉机所以 UI 有点丑。使用它可以很方便的进行备份。

除了支持按照时间自动,手动,增量备份外,它的一个特点是支持加密,并提供了数量众多的功能(支持各大主流云盘,国内基本不用想了,除非部署在外服)。

准备远程目录

本机目录只需要之后在 docker-compose 上挂载即可。但是这样只能备份本机目录,如果有多台服务器的话,必须逐一部署,这样会造成管理上的不便。

因此需要进行远程挂载。对于 Linux 用户,可选的方案是 nfs 与 sshfs,后者除了提供挂载,还能顺便提供 ssh 功能。由于我的树莓派是一台跳板机,可以很方便的使用 sshfs 挂载到本地:

sshfs [user@]host:[dir] mountpoint

为保证无密码,最好使用非密码登陆。

考虑到 ssh 可能有中断的问题,需要事先调整好参数发送心跳并进行自动重连(可以看 这里)。

挂载后相当于出现了一台 IO 其慢无比的石头盘,其行为与普通磁盘无异。

部署

使用 docker 部署是最为快捷的方法。单容器也可以使用 docker-compose 方便的进行管理:

version: "3"
                           
services:
        duplicati:
                # seems my upstream has some problem, change it to
        	# latest if you're ok.
                image: duplicati/duplicati:canary
                container_name: "duplicati"
                # webui port
                ports:
                        - 8200:8200
                volumes:
                		- /path/to/local/duplicati/config/dir:/data
                		- /path/to/local/backup/dir:/path/to/mount/point

docker 在这里的缺点在于目录需要手动挂载,要保证其能正常使用。其中最重要的 /data 目录保存了 duplicati 的配置文件,可以考虑挂载自己的目录。

个人感觉字体有点太大了,整体色调有点淡(文字甚至都是灰色的),给人感觉不是很舒服。

这就是开源拖拉机吗,爱了爱了。

设置访问控制

如果准备暴露在公网上,密码是必不可少的,你可以在 settings 中配置密码,同时,不要忘了配置好证书。

但是对于这样的私人服务,更好的方案是通过 ssh 隧道,一条可用的简单配置为:

ssh -CTNL local_host:local_port:remote_host:remote_port root@host

这会将端口映射到本地,好处是不需要考虑证书配置,不需要额外开启端口,而且利用 ssh 可以保证安全性。缺点是你必须具有 ssh 权限,并且能进行转发。可能的不适用场景为手机等。

Duplicati UI 还是很直观的,按照步骤一步一步设置即可。

设置钩子

Duplicati 本身提供了大量可定制的 action,用户可以在备份完成前后执行一系列行为。常用行为为发送邮件,执行脚本等等。

由于我有自己的提醒系统,需要发送 http 报文到指定服务器,因此我选择使用 run-scripts-after 钩子发送简短信息。如果需要查看详细信息,进入管理界面是更好的选择。

官方有提供 模板,但是我似乎没有找到文档描述所有可用变量,只能在论坛上搜到零散的结果。

#!/bin/bash
# check action type
if [[ "$DUPLICATI__OPERATIONNAME" != "Backup" ]]
then
        exit 0
fi
# check if success
if [[ "$DUPLICATI__PARSED_RESULT" == "Success" ]]
then
        curl -v --header "Content-Type: application/json" -X POST --data "YOUR BODY" https://example.com
        exit 0
else
        curl -v --header "Content-Type: application/json" -X POST --data "YOUR BODY" https://example.com
        exit 0
fi

之后在每一条备份最后的 Advanced options 找到 run-script-after,然后输入脚本路径。注意脚本路径必须在 Duplicati 容器可访问范围内。

由于是 docker 部署,所以可执行脚本受到 Duplicati 容器内限制,比如 python3 是不存在的,但是 curl 是可用的。

备份还原

进入 restore 可以将文件还原到指定位置,按照操作进行即可。

注意还原是不需要输入密码的,因为 admin 已经帮我们完成了解密。那么之前我们设置的加密到底在有什么用呢?我们打开备份位置,出现的都是 .zip.aes 文件(如果使用默认的 aes-256 加密的话)。而且在之前配置中我们设置了单个 volume 的大小为 50M,所以它被分到了多个不同大小的 volume 中。

这样的话通过管理界面可以完成还原。但是如果备份页面不可用(或者数据库出现了问题),应该如何手动还原? 官方有介绍 restore 过程,可以照着进行相应还原操作,这里解压 .aes 文件就需要之前的密钥了。

这比较复杂,因为它不是我想象中的一个 aes 加密的 .tar.gz 文件,而是被分为了很多块。要进行完全解密首先得解压 dlist 文件,然后按照列表顺序进行组合。这个过程还可能遇到大文件的情况(比如部分大文件超过了 volume 大小,一个文件可能分散在不同的 volume 中),就需要结合不同情况进行处理了。

总之,使用 Duplicati GUI 完成还原可以极大减小心智负担,GUI 不但提供方便的多备份管理,还做到仅还原部分文件等等操作。

所以,正常使用的话,还是别随意手动修改配置文件吧。

  1. 1 TheReluctantHeroes(Piano) Nanakori
  2. 2 小さな魂 ryo
TheReluctantHeroes(Piano) - Nanakori
00:00 / 04:23