vim 学习笔记(一)

前言

花时间找易用的工具,不如花时间掌握强大的工具. 收集了一些自己经常使用的一些指令, 这个工具强大之处在于尽可能的按照想法去实现. 不一定是程序员才用VIM, 如此高效的工具是值得去学的. 笔记很多来自于《VIM中文手册》《Practical Vim》《VIM 7.2》。 里面摘抄部分自己经常查阅的内容, 以便于日后翻阅, 也希望能够给那些想入坑的提供些参考. 想想那时是18年开始使用的这个工具, 不觉感慨时间飞逝, 现在还不断的学习相关的知识, 发现很多神奇的操作。

如果仅仅是为了能够实现一些其他IDE的功能进而安装大量的插件, 而忽略了VIM本身, 那还是直接用其他IDE吧。现成的工具也是极其优秀的。 有的时候自己在怀疑自己,学这个有什么用….可能就是喜欢单纯的折腾吧, 毋庸置疑的是, 这个工具确实可以帮到自己提升效率, 就像屠龙刀一样, 自己并不排斥其他的编辑器, 比如vscode, 但是绝大多数的时间, 还是以vim作为自己的主力。 这个视频Mastering the Vim Language里可以学到很多东西。

定制VIM

更改字体

这个是自己在工作中遇到的问题,由于公司配的电脑使用的windows系统,在公司工作的时候用的编辑器就是GVim了,但是默认的GVIM的字体是挺小的,看起来挺吃力的。下面说明下如何更改字体。在LINUX和windows上还是有些区别。其主要的指令还是guifont

在 Linux 中,

set guifont=yourFont\ 18 

可以把 yourFont替换成你喜欢的任意一种字体的名字,字体大小根据自己的需求更改。在Windows:

set guifont=yourFont:h18 

修改配色方案

在默认情况下,Vim 的窗口颜色与打开它的控制台相同不仅难看,而且还很苍白。。。。为了把配色方案修改成某个系统中已有的方案,只需要执行

colorscheme mycolors

在这个命令中,mycolors 是系统中已安装的某个配色方案的名字,自己选择的是经典的molokai主题。

除了前景色与背景色,配色方案还会影响代码高亮,错误标记,以及文件中的其他可视化标记。根据自己的需求,去选择适合自己的主题,要不就自己配。。。。

用彩色标记某列后面的文字

第一次见到这种做法的时候,是在油管的一个vim讲座里出现的,正巧在《vim 7.2》这本书看到了,举得例子都很棒,就全抄下来吧。。。。

当你在一行内写出的字符数超过某个上限时,只需要下面这个命令就可以给出提示

:match ErrorMsg /\%>73v.\+/

执行该命令后,一行内的第 73 个字符之后的那些字符都会被标记成错误. 匹配命令中含有一个正则表达式, 这个表达式可以拆成:

命令   内容
\%> 匹配该列之后的内容,   匹配该列之后的内容, 列号紧跟在尖括号的右边
73   列号
v   只能工作在可见的列上面
.+   匹配一个或多个任意的字符

补全方式

vim 的补全命令比较多,建议使用一些插件,比如ycm

展开
ctrl+x +l       整行补全
ctrl+x +n 根据当前文件里关键字补全
ctrl+x +k 根据字典补全 实现创建好字典(或下载):set dictionary+=/path/to/dictionary/file/with/words
ctrl+x +t 根据同义词字典补全
ctrl+x +i 根据头文件内关键字补全
ctrl+x +] 根据标签补全
ctrl+x +f 补全文件名
ctrl+x +d 补全宏定义
ctrl+x +v 补全vim命令
ctrl+x +u 用户自定义补全方式
ctrl+x +s 拼写建议
ctrl+n|p 代码内基本补全

组合键ctrl+n所做的工作是向前搜索匹配的单词. 如果用户知道自己刚刚才输入过同样的单词, 那么用ctrl+p会更快一点, 因为这个组合键是向后搜索匹配. 一般来说, 除非文件非常大, 或者可能的匹配非常多, 否则ctrl+n与ctrl+p对用户来说并没有太大的区别. 对于补全的插件也很多,自己用的是ycm(编译这个得看自己的环境了MBP编译了N次都是提示个莫名奇妙的错误,用macMINI一次就好了),使用起来感觉还行。

加密文件

加密文件的方式是当使用vim打或新建,加上-x参数使用以下命令,可以查看当前使用的加密算法:set cm?使用以下命令,可以切换使用的不同加密算法:

:set cm=zip
:set cm=blowfish
:set cm=blowfish2

使用以下命令将选项key置空,解除加密:set key=

搜索文件夹中含有的特定代码

使用vimgrep可以搜索文件夹下的文件含有特定文字/代码,方式如下

展开
vimgrep /匹配模式/[g][j] 要搜索的文件/范围 
g:表示是否把每一行的多个匹配结果都加入
j:表示是否搜索完后定位到第一个匹配位置
vimgrep /pattern/ %           在当前打开文件中查找
vimgrep /pattern/ \*             在当前目录下查找所有
vimgrep /pattern/ \*\*            在当前目录及子目录下查找所有(目前这个自己用的比较多)
vimgrep /pattern/ \*.c          查找当前目录下所有.c文件
vimgrep /pattern/ \*\*/\*         只查找子目录

编写库脚本

有些功能会在多个地方调用。如果这已经不是一两行的代码,你可能会希望把这些代码放进脚本,然后被许多其它脚本使用。我们把这种脚本称为库脚本。 可以手动载入库脚本,只要你不要重复调用它就行了。用 |exists()| 函数可以判断。

if !exists('*MyLibFunction')
runtime library/mylibscript.vim
endif
call MyLibFunction(arg)

这里你需要知道 MyLibFunction() 在脚本 “library/mylibscript.vim” 里定义,该脚本 在 ’runtimepath’ 的某个目录里。 为了稍稍简化,Vim 提供了自动载入机制。如下所示:

call mylib#myfunction(arg)

下面的内容源自于书籍HACKINGVIM. 在Vim中, 与高亮相关的技术是匹配(matching).匹配通过下面这个命令完成:

:match Group /pattern/

比如超过一行内的11个字符以后的字符被标记为错误

:match ErrorMsg /\%>11v.\+/

其中\%> 匹配该列之后的内容, 列号紧跟在尖括号的右边;v 只能工作在可见的列上面;.+ 匹配一个或多个任意的字符, 想匹配有效的 IP 地址, 只需要执行:

match todo
/\(\(25[0-5]\|2[0-4][0-9]\|[01]\?[0-9][0-9]\?\)\.\)\\\{3\}\(25[0-5]\|2[0-4][0-9]\|[01]\?[0-9][0-9]\?\)/

打开拼写检查的命令是

:set spell

命令使用默认的语言 (英语) 打开拼写检查, 如果想要使用其他语言, 只需要把 spelllang 设置成该语言的代号即可;语言的名字甚至可以是专业名词, 比如 medical. 如果 Vim 无法识别用户输入的语言名字, 那么在执行属性设置命令时, 它就会高亮显示无法识别的语言名字.

为了避免多次输入同一个内容, 用户可以使用缩写 (abbreviations).根据不同的使用模式, 可以使用以下三个命令来创建缩写:

abbreviate: 创建在所有模式中均可使用的缩写
iabbrev: 创建只能在插入模式中使用的缩写
cabbrev: 创建只能在命令行中使用的缩写

为了避免每次都执行一次缩写命令, 用户可以把它们放在 VIMHOME 的某个文件中, 假设文件名就叫 abbreviations.vim, 然后在文件 vimrc 使用命令 source 来使能该文件 (需确保该文件是可读的) :source $VIM/abbreviations.vim

比如写个编程模板(tex,等等都是可以自定义的)

iabbr forx for(x=0;x<100;x++){<cr><cr>}

用寄存器实现删除,复制与粘贴操作

在技巧里面说了一小部分,但是没有系统的说明,在这里详细的补充一下。通常情况下, 在许多程序与操作系统中, 用户只能利用一个剪贴板来完成文本的剪切与复制. 在 Vim 中不会出现这种情况,因为用户可以访问多达 9 种不同的剪贴板, 更准确来说, 应该是 9 种不的寄存器类型. vim 缺省使用无名寄存器。无名寄存器用引号表示。

有些寄存器类型的工作领域有所重叠, 但还有一些则拥有自己独特的目的. 用户可以在多种不同的命令或操 作中 (比如复制, 删除, 粘贴) 使用寄存器. 寄存器的名字都以双引号 “ 开始, 比如 “x, 所以, 现在让我们来看一下 如何使用一个寄存器. 假设我们现在要用的寄存器是 “x 为了把某段文本复制到寄存器中, 可以用命令 y 来完成, 不过这次有所不同, 在复制之前, 我们先告诉 Vim 被 复制文本的存放位置: “xy (用 “xyy 可以复制一整行) 对于用来剪切文本的命令 x 也是一样的: “xx 对于删除文本的命令 d 则是: “xd 现在, 用户已经在寄存器 “x 中存放了一段文本, 并且想要把这段文本粘贴到正式文本中, 可以用命令 P (粘贴 在光标位置之前) 或 p (粘贴在光标位置之后), 但在粘贴之前, 我们要先指定寄存器: “xP 或 “xp 如果用户忘记自己使用了哪些寄存器, 可以执行命令: :registers.更多的内容可以通过网络搜索获得,这里就不加赘述了。

展开
命令   &            用途                                         
c & 修改
d & 删除
y & 复制到寄存器
g~ & 反转大小写
gu & 转换为小写
gU & 转换为大写
> & 增加缩进
< & 减小缩进
= & 自动缩进
! & 使用外部程序过滤{motion}所跨越的行
展开
目的                        &   操作                   &  重复              &    回退   
做出一个修改 & {edit} & . & u
在行内查找下一指定字符 & f{char}/t{char} & ; & ,
在行内查找上一指定字符 & F{char}/T{char} & ; & ,
在文档中查找下一处匹配项 & /pattern & n & N
在文档中查找上一处匹配项 & ?pattern & n & N
执行替换 & :s/target/replacement & \& & u
执行一系列修改 & qx{changes}q & @x & u

搜集的技巧

1,gd 快速跳转到当前光标所在变量或者函数名的定义处. gD: 跳转到全局变量的定义处,从当前文件开头开始搜索; 类似的还有gf,来打开被包含的文件。

2,:g /word/d 删除所有含有word的单词所在行. 相反的可以:v /abc/d,也就是删除没有word这个字母所在行, 删除空行可以用 :g /^\s*$/d, 其中^表示开头,\s 表示空格, * 代表匹配任意字符,$ 代表末尾。

3,autocmd可以用这个命令实现对不同的文件格式应用不同的配置; 可以在新建文件时自动添加上版权声明等等. 这些命令一般定义在 ~/.vimrc 这样的配置文件里面。

4,在打开一个文件编辑后才知道登录的用户对该文件没有写权,不能存盘, 可以执行vim file :w /tmp/1,先临时存到/tmp/1 中, 然后进行后续的操作。

5,按v键进入选择模式,然后移动光标选择你要的文本,按u转小写,按U转大写,把光标移动到 { 处.按%光标会自动跳到与之成对的 } 上面.反之也可以.把函数体折叠起来:把光标移动到函数开始的 { 处, 然后(normal mode)输入zf来创建函数折叠;在已经折叠的加号位置输入zc 来打开折叠的函数。当要把打开的函数再折叠就输入zx关闭(第二次折叠)shift+v块选以后,输入zf——实现块折叠. [z 到当前打开的折叠的开始处。 zj 向下移动。到达下一个折疊的开始处。关闭的折疊也被计入. 删除折叠可以用zd或zD,一个用于删除光标下的折叠,另外一个是用于删除嵌套用的。

6,按 Ctrl + r 最后按 Ctrl + w。这个在光标下的单词会被拷贝, 这就省的在输入或是在查找一个单词的时候自己手动输入啦。

7,在Vim中直接进行转换文件编码,比如将一个文件转换成utf-8格式可用如下指令:set fileencoding=utf-8.

8,\>是一个特殊的记号,表示只匹配单词末尾.类似地,\< 只匹配单词的开头.所以要匹配一个完整的单词 “int”,只需:/\< int\>

9, 对同一个文件夹下的文件批量处理方法,以.m文件为例(因为有的时候,需要转换文件编码方式),:args ./\*.m ; :argdo set fileencoding=utf-8 (之所以写这个,是因为小董问我要代码,而自己电脑里的编码方式又和windows不一样,自己又懒,文件一多就不想让每个都转化格式,所以就…..)

10,可以用 = 符号指明使用表达式寄存器.在插入模式中,输入 = 就可以访问这一寄存器.这条命令会在屏幕的下方显示一个提示符,我们可以在其后输入要执行的表达式.输入表达式后敲一下 , Vim 就会把执行的结果插入到文档的当前位置了。

11,替换目标字符串前加一个\<,它就会匹配一个word的起始位置,>可以用来指示一个word的结束位置。

12,:write !wc 统计字数;J 命令则用来把当前行和下一行连接在一起.”yas” 命令拷贝一个句子。

13,宏的录制,在Normal模式下先按q,录制的符号可以在[a-z]中选择(假设这里选择了a),就像标记m那样,一系列胡乱操作后,在Normal模式下按q停止,想重复录制的内容,按下@a就行,喜欢重复的又不想连续按@a的可以输入.,来重复上一过程。

14,在当前行正好处于窗口顶部或底部时,有时我会滚动一下屏幕,以便看到更多的上下文.用 zz (用智障记忆,很快的…)命令可以重绘屏幕,并把当前行显示在窗口正中,这样就能够阅读当前行之上及之下的半屏内容。

15,:Sex 水平分割一个窗口,浏览文件系统; :Vex 垂直分割一个窗口,浏览文件系统;(安装了插件后,就没用过这个功能了),有必要补充一句,如果在mac中,感觉分割窗口并不是必须的,如果屏幕比较小,看起来挺难受的,ctrl+N, 这样就另开了一个命令行,然后通过触摸板,用手势即可切换,长时间的编辑,有的时候受不了那种强度,所以换换口味也挺好。

16,m{a-z}: 标记光标所在位置,局部标记,只用于当前文件.m{A-Z}: 标记光标所在位置,全局标记.标记之后,退出Vim, 重新启动,标记仍然有效.:marks 显示所有标记. :delmarks! 删除当前缓冲区的所有标记。

17,'': 移动到上次离开的地方。

18,%: 不仅能移动到匹配的(),{}或[]上,而且能在#if,#else, #endif之间跳跃。

19,:r !date 在光标处插入当前日期与时间.同理,:r !command可以将其它shell命令的输出插入当前文档。

20,w: 移到下一个单词的首字母; b: 移到前一个单词的首字母;e: 移到单词的末尾;这些命令可以互相组合, 比如, 用户想要移到下一个单词的末尾, 只需要执行we。

21,所有类型的变量都是通过命令 :let 定义。 置位 ruler 选项.这会在 Vim 窗口的右下角显示当前光标的位置。

22,自动缩进的一种简洁形式gg=G。

23,Vim 有一套功能非常强大的命令,可以完成所有功能。但有些东西外部命令能够完成得更好或者更快。命令 “!{motion}{program}” 用一个外部程序对一个文本块进行过滤。换句话说,它用一个文本块作为输入,执行一个由{program}指定的外部命令,然后用该程序的输出替代选中的文本块。

24,在插入模式,当我们按下 + R键,再加上相应的寄存器的名字,就可以插入寄存器中的内容了。 无名寄存器用(“)来标识,如果没指定的话,复制(y),剪切(x,s,d,c和他们的大写),粘贴(p)命令都会将内容存放到这个寄存器里面,或是从这个寄存器里面来读取内容。查看寄存器:reg, 这个用起来会非常方便,就像把一些自己会用到的内容放在一个寄存器中,想调出来”” + 寄存器名字 +操作”即可。

25,如果厌倦了使用ESC,,来切换,不妨更改一下映射关系,自己是这么做的: :imap oo , 买了HHKB后,这个语句就从配置文件中消失了。。。。。还有,HHKB真香,不过适用的群体真的很小众,如果是用来打游戏,还是别了,会让你失望的。

26,>> 当前行增加缩进 <<当前行减少缩进, 个人比较喜欢在可视模式中使用这个。

27,set ts=4 (注:ts是tabstop的缩写,设TAB宽4个空格) set expandtab

28,G 命令会增加从当前行到文档末尾处的缩进层级。

29,gv 命令是个有用的快捷键,它用来重选上一次由可视模式所选择的文本范围。不管上个选区是面向字符的、面向行的,或是面向列块的,g 命令都能够正确地工作。不过如果上次的选区被删除了,它也许会工作得不太正常.

30,o:切换高亮选区的活动端(可视模式下)。

31,it 命令是一种被称为文本对象。

32,ctrl+w+s 可以水平切分此窗口,类似的,ctrl+w+s 可以进行垂直切分,且不受次数限制(用了这么久才知道T_T 该死的vsplit),ctrl+w可以切换这两个窗口。

33,命令模式下 按g 再按 Ctrl+g 可以统计字数。

34,only 命令关闭除活动窗口外的所有其他窗口。

35,要想跳到上次文档中被更改过的地方,我们可以按 g;。它会跳到上次完成编辑时光标所在的行及列上,其结果与按 u 类似,只是它不会对文档造成暂态的改变。

36,每次用 gf 命令时,vim 都会在跳转列表中增添一条记录,因此可以用Ctrl+o 命令返回原处。

37, vim -d file1 file2 的时候,如果感觉左或者右边的窗口太小,可通过命令 vertical res +20, 来改变窗口大小。

38,文本倒序: :g /^/m0

下面是问chatGPT给我的一些技巧,有些还挺实用的

39, 插入模式下,按 Ctrl + h 可以删除前一个字符,按 Ctrl + w 可以删除前一个单词,按 Ctrl + u 可以删除整行。

40, 在普通模式下,按 i 进入插入模式,按 a 在光标后插入,按 o 在下一行插入,按 O 在上一行插入。

41, 在普通模式下,按 x 删除当前光标所在的字符,按 dw 删除当前光标所在的单词,按 dd 删除当前光标所在的整行。

42, 在普通模式下,按 yy 复制当前光标所在的整行,按 p 将剪贴板中的内容粘贴到当前光标所在的位置。

43, 在普通模式下,按 Ctrl + f 可以向下翻页,按 Ctrl + b 可以向上翻页。

44, 在普通模式下,按 gg 跳到文件的第一行,按 G 跳到文件的最后一行。

45, 在普通模式下,按 :w 可以保存文件,按 :q 可以退出 Vim,按 :wq 可以保存并退出 Vim。

46, 在普通模式下,按 u 可以撤销上一步操作,按 Ctrl + r 可以重做上一步操作。

47, 在普通模式下,按 . 可以重复上一次操作。

48,在普通模式下,按 % 可以匹配括号(包括圆括号、方括号和花括号),并跳转到匹配的括号处。

49, 在普通模式下,按 * 可以匹配当前光标所在的单词,并向下跳转到下一次出现该单词的位置,按 # 则是向上跳转到上一次出现该单词的位置。

50, 在普通模式下,按 :set nu 可以显示行号,按 :set nonu 可以隐藏行号。

51, 在普通模式下,按 :set paste 可以开启粘贴模式,使得从外部复制内容时可以避免自动缩进等问题,按 :set nopaste 可以关闭粘贴模式。

52, 在普通模式下,按 :set incsearch 可以开启增量搜索,使得在搜索时可以实时匹配输入的字符,按 :set noincsearch 可以关闭增量搜索

53, 在普通模式下,按 :set hlsearch 可以开启搜索高亮,使得在搜索时匹配到的内容会被高亮显示,按 :set nohlsearch 可以关闭搜索高亮。

54, 在普通模式下,按 Ctrl + g 可以显示当前文件的信息,包括文件名、文件类型、文件行数等。

55, 在普通模式下,按 :tabnew 可以新建一个标签页,按 gt 可以切换到下一个标签页,按 gT 可以切换到上一个标签页。

56, 在普通模式下,按 :vsp 可以在垂直方向上分割窗口,按 Ctrl + w + w 可以在窗口之间切换,按 :q 可以关闭当前窗口

57,在普通模式下,按 :r !date 可以将当前时间插入到当前光标所在行的下一行。

58,在普通模式下,按 :g/foo/d 可以删除所有包含字符串 foo 的行。

参考

[1] 《VIM中文手册》
[2] 《Practical Vim》
[3] 《VIM 7.2》

CMakeLists Eigen FCPX GNU Gazebo Git Interest KDL Life Linux Matrix ODE ROS Ros UML Ubuntu VcXsrv algorithm algorithms axis-angle bode calibration chrome control cpp data_struct dots figure gdb latex launch life linux mac math matlab memory motor moveit operator optimal algorithm python robot robotics ros ros2 rtb simulation stl thread tools twist urdf velocity vim web work wsl
知识共享许可协议