说明
《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……
小伙伴们,大湿球的用法都记住了吗?