基于北大前沿计算实践课和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模式,等同于cl
  • r(replace)替换当前字母
  • p把上次删除的行放置在当前位置

进入Insert模式之后,Vim也有一些奇奇怪怪的命令,比如<C-h>等同于删除键,会删除前一个字符,<C-j>等同于回车键,将光标后的文本移到下一行,但是否要这样做就全凭个人喜好了。
其实在Normal模式下也能进行一些删除操作,x会删除当前字符,d+光标移动命令会删除对应文本,与s以及c命令的区别仅仅在于xd操作完之后依然处在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保存文件到当前目录
  • wqxZZ保存并退出
  • q!ZQ退出但不保存
  • !+命令 可以在shell环境下执行命令
  • r !+命令 可以在shell环境下执行命令并插入到当前光标下一行
  • e+文件 可以加载新的文件(当前文件没保存的话会报错)
  • e!+文件 加载新文件并丢弃当前更改
  • f显示当前文件的文件名
  • %s/old/new/g搜索所有old并替代成new,支持正则表达式o 命令行界面输入<Cd>显示可以选择的命令,tab自动补全o

搜索

除了这些直接跳转命令,Vim也提供了搜索机制。 首先是行内的搜索,ftFT后面加上任意字符x,代表跳转到当前光标下一个x、跳转到下一个x之前、跳转到上一个x、跳转到上一个x之后,搜索到了之后也可以继续按,;在搜索结果之间前后移动。 然后是文件内的搜索, 直接键入/或者?会进入命令行搜索模式,/是从开头开始搜索,?是从结尾开始搜索,后面可以加上任意长度的字符 然后键入<CR>就可以高亮显示所有的搜索结果,按nN就可以在搜索结果之间向前和向后移动。 输入: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就会粘贴其中的文本到当前位置。与之前介绍的ccdd类似,也可以直接在Normal模式下输入yy,对应复制当前行。
Vim还提供了列选择模式,在Normal模式下键入<C-V>进入,选择完列之后可以跟Normal模式一样进行rd等操作,这在制表、注释中非常有用。

移动

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