在终端里使用 Vim 键绑定

说明

《konsole 下的一些可以提高效率快捷键》]([ 小技巧 ]konsole 下的一些可以提高效率快捷键) 介绍了能在终端里使用的 EMACS 快捷键。我来补充一些 Vim 按键。下文第一部分向 Vim 用户简单说明终端与编辑器的按键差异,第二部分从零开始介绍 Vim 操作,适合新用户阅读。

第一部分:Vim 用户

设置 VI 键绑定

向 .bashrc 内添加两行:

# VI keybinding
set -o vi

重启 Konsole。

可用模式

Vim 有 6 种基础模式(Basic Mode)和 6 种附加模式(Additional Mode),其中 4 种可在终端内使用:

Normal mode
Insert mode
Operator-pending mode
Replace mode

在 Vim 里查阅有关模式的帮助文档:

:h vim-modes

普通模式

j/k:搜索上一条 / 下一条命令
v:启动 Vim 编辑器

插入模式

<ctrl-n/p>:补全下一个 / 上一个选项

Vim 编辑器

:x 保存并退出编辑器后,终端会从第 1 行开始依次执行 ** 所有 ** 命令。如果你不想执行任何命令,

ggdG
:x

:q! ** 不会 ** 取消已输入的命令。

翻页

有问题,找男人(man man):

f/b:向下 / 向上翻页
j/k:向下 / 向上移动一行
g/G:移动到行首 / 行尾
/:搜索

第二部分:新用户

设置 VI 键绑定

“set -o vi” 启用 Vim 键绑定,重启终端后恢复旧设定。如果你希望这套键绑定始终生效,打开 ~/.bashrc,添加两行:

# VI keybinding
set -o vi

重启 Konsole。

Vim 的模式

你或许听说过,Vim 是有“模式”的文本编辑器。同一个按键在不同模式下执行不同的功能。比如,插入模式下按 h 输入字母 h;普通模式下按 h 让光标向左移动一个字符。这种设计的好处是,我们不会过于依赖修饰键(Esc、Meta、Alt、Ctrl、Shift),一到两次按键就能完成许多操作。坏处是,新用户会感到困惑:文本编辑器居然不需要脚踏板?

前面提到两种模式:普通模式和插入模式。你可以这样理解 Vim 的“ 忍者之道 ](http://philosecurity.org/2009/03/23/pirates-and-ninjas-emacs-or-vi) ”:

普通模式:飞檐走壁 / 移动光标
插入模式:制造尸体 / 输入字符

在普通模式和插入模式间切换

设置了 Vim 键绑定后,默认停留在插入模式,你可以正常输入字符。

或 :退出插入模式,进入普通模式
无论是 Windows 还是 Linux 用户,我都建议把大写键映射为 Ctrl,具体方法不作赘述。

怎样确定你在哪个模式?按 h 或 l,如果屏幕上没有出现字母,光标却在向左 / 向右移动,那么你正处于普通模式。

当你处于普通模式时,以下 4 个按键都能进入插入模式,但是光标会停留在不同位置:

i:光标停留在当前字符的左侧
a:光标停留在当前字符的右侧
I:光标停留在行首
A:光标停留在行尾

插入模式

方向键和功能键(、、、 等)都能正常使用。

:向左删除一个字符
:向左删除一个大写词(WORD)

下文会解释大写词(WORD)和小写词(word)的区别。

<ctrl-n/p>:补全下一个 / 上一个选项

比如,你有三个文件:

1.vim 2.vim 3.vim

输入 “less *vim”,然后按 依次补全三个文件名。

普通模式:基础

如果没有特别说明,执行以下操作后,你依然停留在普通模式。

h/l:光标向左 / 向右移动一个字符
^/$:光标移动到行首 / 行尾

j/k:搜索上一条 / 下一条命令

x:删除光标覆盖的字符(如果光标显示为细线,那么删除细线右侧的字符)
X:删除光标左侧的字符

cc:删除整行,进入插入模式
s:删除当前字符,进入插入模式

除了 ^/$ 和 cc 以外的命令前都能添加数字。比如,3h 让光标向左移动 3 个字符。

带条毛巾,退出 Vim 编辑器

在普通模式下按 v 将启动 Vim 编辑器。不要慌!执行以下操作,安全退出:

<esc>		" 返回普通模式
gg			" 光标移动到第 1 行
dG			" 删除所有文本
:x<cr>		" 保存并退出

普通模式:进阶

如果你已经能熟练运用之前提到的操作,以下命令能帮你更快地编辑文本。

** 小写词和大写词 **

大写词(WORD)是指连续的空格或制表符分隔的字符串。例如,“abc123 def-ghj” 是两个大写词。

小写词(word)是大写词的子集。连续出现的字母、数字和下划线是一个小写词(word),其他连续出现的符号是另一个小写词。上述字符串包含 4 个小写词:“abc123”、“def”、"-" 和 “ghj”。

** 在词之间移动 **

h/j 和 ^/$ 都能移动光标,但是还有更多针对“词”的移动命令。

w:向右移动一个小写词,光标停在词首
b:向左移动一个小写词,光标停在词首

W:向右移动一个大写词,光标停在词首
B:向左移动一个大写词,光标停在词首

e:向右移动一个小写词,光标停在词尾
ge(*):向左移动一个小写词,光标停在词尾

E:向右移动一个大写词,光标停在词尾
gE(*):向右移动一个大写词,光标停在词尾

  • ge 和 gE 只能在 Vim 里使用。

** 特殊移动:寻找特定字符 **

fx:向右寻找字符 x,光标覆盖字符 x
Fx:向左寻找字符 x,光标覆盖字符 x

tx:向右寻找字符 x,光标停在字符 x 左侧
Tx:向左寻找字符 x,光标停在字符 x 右侧

;:按原方向寻找下一个字符 x
,:按反方向寻找下一个字符 x

字符 x 可以是字母、数字、空格、其他符号……

** 操作字符 **

x/X、s 和 cc 能对字符进行操作(删除和替换),以下是更多操作命令:

C:删除从光标开始到行尾的所有字符,进入插入模式

D:删除从光标开始到行尾的所有字符,停留在普通模式
dd:删除整行,停留在普通模式

** 寄存器 **

删除或替换的字符会进入寄存器,以下命令把它们放到(put)特定位置:

p:从寄存器里取出字符,放到当前字符的右侧
P:从寄存器里取出字符,放到当前字符的左侧

xp 和 Xp 都能交换相邻字符的位置。你知道它们的区别吗?

yy:把当前行放入寄存器
Y:把从光标位置到行尾的字符放入寄存器

** 数字、移动和操作:去吧,皮卡丘!**

我们已经知道 dd、cc 和 yy 的作用。但是,单独输入 d、c 或 y 有什么效果?这三个操作命令相当于动词——“删除(delete)”、“改变(change)”和“复制(yank*)”。目前,它们处于待命状态(Operator-pending mode),需要用户输入宾语。

  • 不要吐槽美国人的英文。

之前提到的移动命令都能用作宾语。例如,dw、cB、y^、cfa……你可以按需要构建更复杂的、带数字(副词)的句子。3dw、c2T0、C3PO、R2D2……

小伙伴们,大湿球的用法都记住了吗?

mark

感谢分享。。。