vi/vim 指引

参考:Learn Vim Progressively, 简明vim练级攻略



打开文件

在shell中通过vi <path/to/file1> <path/to/file2> ...同时打开多个文件,在vi中通过:e <path/to/file1> <path/to/file2> ...打开文件。

:bn:bp在打开的多个文件之间切换,:ls查看当前打开的文件列表。


模式

打开vi后就是普通模式,按i进入插入模式,按Esc返回普通模式,按:进入命令行模式,输入命令运行后自动返回普通模式。

:w是保存,:q是退出,:x:wq是保存并退出,:q!是不保存并强制退出。


移动光标

j,k,h,l分别对应上下左右,w是移动到下一个单词开头,b是移动到上一个单词开头。这些动作之前都可以加数字N,表示重复动作N次。

:NNG移动光标到第N行,gg移动光标到首行,G移动光标到末行;使用<Ctrl+o><Ctrl+i>可在两点之间快速跳转。

0^移动光标到行首,$移动光标到行尾,fx,Fx向后或向前搜索“x”并跳转到第一个匹配项。

zz将光标所在行重置在屏幕正中,M移动光标到当前屏幕中间,H,L移动光标到当前屏幕首行或末行。

<Ctrl+d>,<Ctrl+u>向下或向上滚动半屏,<Ctrl+f>,<Ctrl+b>向下或向上滚动一屏,<Ctrl+y>,<Ctrl+e>向下或向上滚动一行。


插入

i在光标处插入字符,a在光标后插入字符,I,A则是行首和行末插入,o是在本行之后插入新行,O是本行之前插入新行。

s删除当前字符并插入,S,cc删除当前行并插入,cw删除当前所在单词并插入,C删除光标到行末的字符并插入,ctx删除光标到x的字符并插入。

在插入模式,按<Ctrl+o> zz可快速将正在输入的行重置在屏幕正中。


删除

x删除光标处字符,dd删除整行,dw删除一个单词,d$D删除至行尾,d^删除至行首,dG删除至末行,d1G删除至首行,ctx删除光标到x的字符。

x,dd,dw前都可以加数字N,表示重复删除动作N次。


复制

yy复制光标所在行,5yy复制5行,y^复制行首到光标之前的字符,y$复制光标到行尾的字符,y5w复制5个单词,yG复制至末行,y1G复制从首行到当前行;dd剪切当前行。

p粘贴至光标后。


替换与撤销

r替换当前字符,R连续替换,直至按下Esc~转换光标处字母大小写;uN撤销N次操作,U撤销当前行的所有修改,<Ctrl+r>撤销undo。


查找

/表示向后查找,?表示向前查找。

*#分别表示向后和向前查找光标处的单词,g*g#表示部分符合该单词即可。

%查看匹配的括号。

在查找模式下,n表示继续查找,N表示反向查找。


快速选择

vixvax可用于快速选择一个区域,如:对于(@app.route('/', methods=['GET', 'POST'])),当前光标位于POST的O处,则:

vi'将选定POSTva'将选定'POST'i表示in。

vi)选定'/', methods=['GET', 'POST']v2a)选定(@app.route('/', methods=['GET', 'POST']))

v可以换成y(复制),d(删除),c(删除并插入);x可以是字符、w(当前单词)、s(当前句子)、p(当前段落)等等。


块操作

v可视化工具,在该模式下可将光标经过的地方标记反白并选定,V按行选定,<Ctrl+v>按块选定(与jk等配合使用)。

对于选定的区域,可用d删除或y复制,J将所有选定行连接成一行,>><<快速缩进,=自动缩进排版。

0 <Ctrl+v> Nj I# ESC

适用于注释多行文本。0将光标移动到行首,<Ctrl+v>开始块操作,j标记块,I# 插入#ESC确认生效。

<Ctrl+v> Nj $ A; ESC

适用于多行文本后补充;<Ctrl+v>开始块操作,j标记块,$将光标移动到行末,A;插入;ESC确认生效。


自动补齐

在插入模式下按<Ctrl+n>,启用自动补齐功能。


分屏

:sp:split为水平分屏,:vsp:vsplit为垂直分屏。

<Ctrl+w>[hjkl]切换分屏。

<Ctrl+w>[_|]最大化分屏,<Ctrl+w>[+-]增加或减小分屏尺寸。


常用功能设定

:set all显示所有的设定值。

:set number显示行号,简写nu;:set nonumber不显示行号,简写nonu。

:set shiftwidth=4设置>>的缩进字符数,简写sw。

:set expandtab将tab自动转化为空格,取消该设定为:set noexpandtab

:set autoindent开启自动缩进,简写ai。

:set pastetoggle关闭自动缩进;修改/etc/vim/vimrc,添加set pastetoggle=<F9>,在粘贴代码前,按i后再按F9,就可以关闭自动缩进。