基于北大前沿计算实践课和missing semester的vim笔记
you are your dotfiles

帮助
按f1或命令行输入help开启在线帮助 <Cw>切换到另一个窗口,q关闭窗口
编辑
如之前所述,Vim最主要的编辑模式是Insert模式,想要修改文本,先将光标在Normal模式下移动到对应位置,然后再键入i进入Insert模式,在这个模式下添加或者删除文本。但是当我们需要修改的地方非常多时,每次都需要先移动光标再输入i就是一个相对麻烦的操作,因而Vim提供了一些命令将移动光标和进入Insert模式合成一步:
i在当前位置输入(光标前),I在行首输入a在光标后输入(append),A在行尾输入o在当前行下新建一行输入,O在当前行上新建一行输入c+光标移动命令会先删除然后进入Insert模式,比如cl会删除下一个字符,cw会删除到单词尾,c10l会删除10个字符。此外,ciw会删除整个单词,cc会删除整行,ci((change in)会删除小括号里的内容,ca((change around)则会删除小括号以及小括号里的内容,这在修改代码里的字符串、修改函数变量之类的工作中极其有用s(substitute)会删除当前字符并进入Insert模式,等同于clr(replace)替换当前字母p把上次删除的行放置在当前位置
进入Insert模式之后,Vim也有一些奇奇怪怪的命令,比如<C-h>等同于删除键,会删除前一个字符,<C-j>等同于回车键,将光标后的文本移到下一行,但是否要这样做就全凭个人喜好了。
其实在Normal模式下也能进行一些删除操作,x会删除当前字符,d+光标移动命令会删除对应文本,与s以及c命令的区别仅仅在于x和d操作完之后依然处在Normal模式,所以s也等同于xi。此外,r的作用也是替换当前字符,键入r之后会提示输入一个字符,输入完成之后自动回到Normal模式,想要替换长文本就需要键入R进入Replace模式。因此如果想要替换一个字符成x,最快的方法是r+x,也可以s+x+<ESC>,也可以xi+x+<ESC>,也可以cl+x+<ESC>。
撤销和重做也是非常常用的编辑命令,在Vim中分别对应Normal模式下的u(undo)和U,同时.可以重复之前最后一个命令。
“U”(行撤销)。恢复整行的所有操作
<C-r>重做上一个 被撤销的命令
命令行
在Normal模式下键入:就会进入命令行模式,此时光标已经移动到了最下面。命令行中可以输入的命令种类非常多:
w保存文件,但是不退出w !sudo tee %使用sudo保存文件 w filename保存文件到当前目录wq、x、ZZ保存并退出q!、ZQ退出但不保存!+命令 可以在shell环境下执行命令r !+命令 可以在shell环境下执行命令并插入到当前光标下一行e+文件 可以加载新的文件(当前文件没保存的话会报错)e!+文件 加载新文件并丢弃当前更改f显示当前文件的文件名%s/old/new/g搜索所有old并替代成new,支持正则表达式o 命令行界面输入<Cd>显示可以选择的命令,tab自动补全o
搜索
除了这些直接跳转命令,Vim也提供了搜索机制。
首先是行内的搜索,f、t、F、T后面加上任意字符x,代表跳转到当前光标下一个x、跳转到下一个x之前、跳转到上一个x、跳转到上一个x之后,搜索到了之后也可以继续按,和;在搜索结果之间前后移动。 然后是文件内的搜索:
直接键入/或者?会进入命令行搜索模式,/是从开头开始搜索,?是从结尾开始搜索,后面可以加上任意长度的字符
然后键入<CR>就可以高亮显示所有的搜索结果,按n和N就可以在搜索结果之间向前和向后移动。
输入:set ic(ignore case)忽略大小写搜索 set noic取消
仅搜索一次忽略大小写:/search_sth\s
输入:set hls is高亮搜索结果
//'ic' 'ignorecase' ignore upper/lower case when searching
'is' 'incsearch' show partial matches for a search phrase
'hls' 'hlsearch' highlight all matching phrases
搜索模式支持正则表达式。最后如果想要关闭搜索结果的高亮,需要借助命令行命令,输入:noh即可关闭高亮。
type :#,#s/old/new/g where #,# are the line numbers of the range
of lines where the substitution is to be done.
Type :%s/old/new/g to change every occurrence in the whole file.
Type :%s/old/new/gc to find every occurrence in the whole file,
with a prompt whether to substitute or not.
选择
编辑文本和代码难免要复制和粘贴,复制操作涉及到选择需要复制的文本,在Vim中这需要在Visual模式下进行。在Normal模式中键入v进入选择模式,可以跟在Normal模式下一样移动光标,被选择的文本就会高亮。
或者在Normal模式中键入V进入行选择模式,被选择的行会高亮。选择完成后,如果直接按<ESC>就会返回Normal模式,并且选择的内容高亮消失,因此不应该这么做,而应该直接在Visual模式下键入y(yank)复制高亮的文本,如果输入的是d则会删除被选择的文本,此时会自动回到Normal模式。
不管是y还是d操作,被选择的文本都会被操作到Vim的缓存中,在Normal模式下按p就会粘贴其中的文本到当前位置。与之前介绍的cc、dd类似,也可以直接在Normal模式下输入yy,对应复制当前行。
Vim还提供了列选择模式,在Normal模式下键入<C-V>进入,选择完列之后可以跟Normal模式一样进行r、d等操作,这在制表、注释中非常有用。
移动
Vim中所有键盘输入都可以视为命令,可以被记录下来映射到快捷键。在Normal模式下,最基本的命令是控制光标移动的命令hjkl,其中jk控制上下(大写状态下删除行间空格),hl控制左右,方向键同样可以控制光标,但是因为方向键盘离打字的范围比较远,所以推荐大家熟悉hjkl这四个键。在没有鼠标的情况下想实现长距离的光标跳转,每次只能移动一个单位显然是低效的,好在Vim为光标跳转提供了多种命令:
单词间:
w可以跳转到下一个单词的开头,b跳转到当前单词的开头,继续按跳转到上一个单词的开头,e跳转到当前单词的结尾,继续按跳转到下一个单词的结尾遗憾的是中文很难分词,所以在中文中键入
w会跳转到下一个短句括号、引号间:如果光标在括号或者引号中间,
%会高亮显示括号或引号,继续按会在头和尾反复横跳
行内:
0跳转到行的开头,^跳转到行的第一个非空格的字符,$跳转到行的结尾
段落间:
{跳转到上一段,}跳转到下一段屏幕内:
H跳转到屏幕最上面,M跳转到屏幕最中间,L跳转到屏幕最下面屏幕滑动:
<C-u>向上滑动,<C-d>向下滑动文件内:
gg跳转到文件开头,G跳转到文件结尾,<CG>显示当前行数,数字G跳转到对应行其他:
zz会将光标置于屏幕中心
这些基本命令可以和数字进行组合,输入任意数字(默认情况下显示在右下角),然后输入j就会向下移动对应行数,同理,如果是数字+w,就会移动对应单词数。另外,数字+<CR>等同于数字+j,数字+G会跳转到整个文件的第几行。
模式
Normal模式是最基本的模式,在这个模式下基本只能移动光标,不能直接输入文本,因为此时键入任何字符都会被当成是Vim的命令而非插入到文本中。 想要输入文本需要切换到Insert模式,可以直接键入i进入Insert模式,此时输入任何字符都会插入到光标所在位置。想从输入模式中返回Normal模式,只需要键入<ESC>。事实上,在任何模式下键入<ESC>都 能回到Normal模式。
Normal模式和Insert模式是Vim中最常用的两种模式,理论上我们只需要这两种模式就能完成修改文本的所有操作,其他模式和命令都是用来更快地完成一些任务。默认情况下,所处模式会显示在Vim窗口的左下角,Normal模式没有显示,Insert模式会显示--INSERT--,Command-line模式会显示所输入的命令等等。
在Normal模式下键入R进入Replace模式,用于替换当前光标处的文本,键入v进入Visual模式,用于选择文本。

进阶
.命令重复上一次命令,可用于简化操作
- C=c$
- s=cl
- S=^C//整行替换
- I=^i
- A=$a