基于北大前沿计算实践课和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
命令的区别仅仅在于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