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 不但提供方便的多备份管理,还做到仅还原部分文件等等操作。

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