vim 学习笔记(二)

前言

之前记的笔记已经在日常生活中大量的使用了,但是还是有很多技巧值得自己去探索,虽然下面的笔记中会经常用到,鉴于笔记的完整性,还是记录下来。这里的笔记很多源自于《vim实用技巧》

PowerShell下使用vim

第一步,以管理员的方式打开powershell

第二步,输入 Set-ExecutionPolicy RemoteSigned, 选择Y

第三步,输入命令

new-item -path $profile -itemtype file -force

创建配置文件。先切换到给出的地址,然后用记事本编辑(复制地址的时候,可以先选择,然后Contrl+ins)

cd C:\Users\yourComputerName\Documents\windowsPowerShell
notepad .\Microsoft.PowerShell_profile.psl

第四步,在打开的文本中输入如下内容

set-alias vim "D:\Vim\vim82\vim.exe" # 此处为vim的安装路径

Function Edit-Profile
{
vim $profile
}

Function Edit-Vimrc
{
vim $HOME\_vimrc
}

添加结束后,重启powershell即可。也只有windows可以这么折腾人了。

宏的读取与执行

宏允许把一段修改序列录制下来,用于之后的重复操作。 q 键既是“录制”按钮,也是“停止”按钮。为了录制按键操作,一开始需要按 q{register},从而指定一个用于保存宏的寄存器。当状态栏中出现“记录中”时,表示录制已经开始。此后,执行的每一条命令都将被宏捕获,直到再次按下 q 键停下为止。
可以用@{register}命令执行指定寄存器的内容,也可以用 @@ 来重复最近调用过的宏。

为不同类型定制样式

vim 有很多的选项可以让我们来定制自己习惯的行为,完整的列表可以参考 :h option-list。可以通过在vimrc中通过:set命令来改变它们。 不同的语言或者是文档,由于类型不同,排版会有所差异。比如,对Ruby文件采用两个空格的缩进,而对JavaScript文件采用4列宽度的制表符。可以将下面的代码放到配置文件vimrc中:

if has("autocmd")
filetype on
autocmd FileType ruby setlocal ts=2 sts=2 sw=2 et
autocmd FileType javascript setlocal ts=4 ts=4 sts=4 sw=4 noet
endif

折叠

开始介绍折叠功能之前, 需要将折叠选项功能打开:

:set foldenable

打开后, Vim就会注意到在普通模式下输入的折叠命令. 用来打开和关闭折叠的命令有很多个, 主要的有:

zc: 关闭一个折叠 
zo: 打开一个折叠
zM: 关闭所有的折叠
zR: 打开所有的折叠
zf: 可视模式下进行折叠(自己用的比较多)
zd: 删除折叠

格式化代码

在对代码进行格式化时经常需要考虑很多因素. 每一种语言都有自己的语法规则, 还有些语言对格式非常依赖. 在有些情况下, 程序员需要按照公司给出的规定来格式化代码.虽然具体的格式化细节不尽相同, 但是它们都遵循一些基本的规则, 也就是说, 用户只需要关心不同的地方即可. 在大部分情况下, 格式化规则的修改可以通过一系列的 Vim选项来设置, 在这些选项当中, 比较重要的有以下几个:

formatoptions: 这个选项负责特定格式的设置。

comments: 什么是注释, 以及如何对它们进行格式化

(no)expandtab: 用空格代替制表符

softtabstop: 一个制表符可以用多少个空格来代替

tabstop: 一个制表符的宽度

通过这些选项, 用户几乎可以设置与缩进相关的方方面面. 但是光有这些还不足够, 用户仍然需要告诉 Vim 是否需要自动缩进, 还是由用户手动完成缩进. 如果用户希望由 Vim来完成缩进, 可以通过 4 种方法来完成。

保持相同的缩进层次

Autoindent 是缩进代码最简单的方式. 它的功能仅仅是与上一行保持相同的缩进层次. 所以说, 如果当前行缩进了 4 个空格, 按下 Enter 后插入的空行也会缩进 4 个空格. 至于什么时候修改缩进的层次则完成取决于用户. 这种缩进方式适用于若干行需要保持相同缩进层次的语言. 打开 autoindent 的命令是 :set autoindent 或 :set ai.

上一行的缩进层次保持到下一行

Smartindent 比 autoindent 稍微智能一些. 它仍然可以让上一行的缩进层次保持到下一行, 但用户无需手动修改缩进层次. Smartindent 可以识别出 C 语言的大部分结构, 并根据它们来决定何时增加/减少缩进层次. 由于许多 编程语言都或多或少地都继承了 C 语言的语法, 所以 smartindent 也可以应用到其他语言. 打开 smartindent 可以用:set smartindent 或 :set si。

cindent Cindent

Cindent 经常被称为 clever indent(聪明的缩进) 或 configurable indent(可配置的缩进), 这是因为与前面介绍的两种缩进相比, 它的可配置性更强. 有三种设置选项:

cinkeys: 这个选项包含了一个列表, 列表中的各项之间用逗号分开, Vim 可以根据列表中的项来改变缩进 层次. 一个例子是: :set cinkeys=”0{,0},0#,:”, 意思是说无论何时碰到一个以 {, 或 }, 或 # 作为开 始的行, 或者是以 : 作为结束的行 (很多语言的 switch 结构都用到了 :), Vim 都要再缩进一层. cinkeys 的默认值是 “0{, 0}, 0), :, 0#, !^F, o, O, e”,

cinoptions: 这个选项包含了所有的, 专门用于 cindent 的选项. 它是一个各项之间由逗号分开的列表, 通 过这个列表可以设置大量的选项. 一个例子是 cinoptions=”>2,{3,}3”, 意思是说在正常的缩进之上, 再额外添加两个空格, 另外, 在 { 与 } 的左边添加三个空格, 以便与前一行作比较。

cinwords: 这个选项包含的关键词会让Vim在下一行增加缩进. 一个例子是:set cinwords=”if,else,do,while 这同时也是它的默认值。

Indentexpr

Indentexpr 是最灵活的缩进选项, 但同时也是最复杂的. 使用 indentexpr 时, 它会对一个表达式求值, 然后计算出一行的缩进. 因此, 用户写出的表达式必须能被 Vim求值。这里就不举例了。。。。

代码块快速格式化

缩进选项设置完毕后, 用户可能想根据新设置的选项更新一下代码的格式. 为了更新代码, 只需要告诉 Vim 重新缩进第一行到最后一行, 具体的命令是:

1G=G

如果把命令拆开来看, 各个部分的意思是:
1G: 跳到文件的第一行 (也可以使用 gg),=: 根据格式化的配置对文本加以缩进,G: 跳到文件的最后一行 (缩进的结束位置)

部分插件介绍

auto-pairs:自动补全括号和引号等, Plugin 'jiangmiao/auto-pairs'

vim-gitgutter:支持Git 的高亮,airblade/vim-gitgutter

技巧

1, 向下查找当前光标所在单词或字符串
g* 查找则不限制whole word。 区别:比如在if这个单词上按*键则查找单词if,按g*键则查找if。

2, 向上查找当前光标所在单词或字符串
g# 查找则不限制whole word。 区别:比如在if这个单词上按#键则查找单词if,按g#键则查找if。

3, 删掉奇偶行

:g/^/+1 d 或 %norm jdd 删除偶数行
:g/^/d|m %删除奇数行

4, C-o (fast out, fast in)
在insert模式下,用C-o后可以执行一个normal命令,然后立即返回insert模式,省去了用ESC的麻烦。

5, 特殊的“寄存器”:”=”
在插入模式或命令模式中,键入“Ctrl-R=”,Vim 会提示你输入一个表达式,普通的整数运算在此完全有效。

5, Make 和 grep
Make 和grep 应当算是 Unix 世界里无人不晓的基本工具了吧。很自然的,Vim 对它们有着特殊的支持。该支持主要通过访问一个特殊的快速修订窗口(quickfix window)来实现。直接在 Vim 的命令模式里输入相应的 make 或 grep 命令(如“:grep foo *.c”)即可将命令的执行结果放入该窗口,同时根据返回的结果跳转到第一个错误(make 的情况;在使用 grep 时是匹配成功之处)。以下是常用的“快速修订”命令:

:cn(显示下一个错误)
:cp(显示上一个错误)
:cl(列出所有的错误及其编号)
:cc(跳转到指定编号的错误)
:copen(打开快速修订窗口,在其中显示所有错误,可在错误上双击鼠标或按回车键跳转至该错误

6, 快捷键

CTRL-A          插入最近插入的文本
CTRL-H 删除光标前的字符
CTRL-W 删除光标前的单词
CTRL-U 删除光标所有输入的字符

7, 跳回上次修改过的地方
很简单的一种方法就是先撤销,再反撤销:u

8, 跳转文件
在使用 df 后跳转回来,可用跳转回原文件。

手动载入插件

filetype 提供一种方便的机制来定义不同文件类型的配置。 也可以不用这种机制,手动载入对应文件的配置,例如, 创建或读取 *.plt 文件时执行 plt.vim:

au BufNewFile,BufRead *.plt  source ~/.vim/after/ftplugin/plt.vim

创建分割窗口

vim 在启动的时候只会打开单个窗口,可用Control+W+s 来水平切分窗口,类似的,可用Control+w+v 来进行垂直切分。或者是用命令的方式来打开新的文件:

:sp[lit] {file}   水平切分
:vsp[lit] {file} 垂直切分

窗口之间的切换

常见的一些命令如下所示

<C-w>w   在窗口间循环切换
<C-w>h,j,k,l 类似移动一样的切换

关闭窗口

减少工作去中窗口的数量,可以采用两种方式::close, 命令关闭活动窗口,:only 命令关闭除了活动窗口以外的所有窗口,其等效的普通模式命令:

EX命令          普通模式命令      用途
:clo[se] <C-w>c 关闭活动窗口
:on[ly] <C-w>o 只保留活动窗口

正则表达式

元字符

. 匹配任意字符
[abc] 匹配方括号中的任意一个字符,可用-表示字符范围。如[a-z0-9]匹配小写字母和数字
[^abc] 匹配除方括号中字符之外的任意字符
\d 匹配阿拉伯数字,等同于[0-9]
\D 匹配阿拉伯数字之外的任意字符,等同于[^0-9]
\x 匹配十六进制数字,等同于[0-9A-Fa-f]
\X 匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f]
\l 匹配[a-z]
\L 匹配[^a-z]
\u 匹配[A-Z]
\U 匹配[^A-Z]
\w 匹配单词字母,等同于[0-9A-Za-z_]
\W 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]
\t 匹配<TAB>字符
\s 匹配空白字符,等同于[\t]
\S 匹配非空白字符,等同于[^\t]

表示数量的元字符

\* 匹配0-任意个
\+ 匹配1-任意个
\? 匹配0-1
\{n,m} 匹配n-m个
\{n} 匹配n个
\{n,} 匹配n-任意个
\{,m} 匹配0-m个
\_. 匹配包含换行在内的所有字符
\{-} 表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的字符数越少越好(使用“\{-}”来代替“*”,实现非贪婪匹配)
\= 匹配一个可有可无的项
\_s 匹配空格或断行
\_[]
\\*匹配 \* 字符
\.匹配 . 字符
\/匹配 / 字符
\\匹配 \ 字符
\[匹配 [ 字符

表示位置的符号

$ 匹配行尾
^ 匹配行首
\< 匹配单词词首
\> 匹配单词词尾

懒惰模式

\{-n,m}\{n,m}一样,尽可能少次数地重复
\{-} 匹配它前面的项一次或0次, 尽可能地少
\|"或"操作符
\&并列

另外需要注意的一点是,在ex中,竖直线(|)是命令的分割符,有点像shell里面的管道,不过没有测试过是不是第二个命令可以用来接收第一个命令输出的结果。

跳转

跳转用 ctags 是真的香, 配置好了后在各种函数之间跳转,可以快速的浏览代码的感觉真是爽爆了,macOs下面可以按照如下操作去安装

brew install exuberant-ctags

然后更改一下~/.zprofile文件(自己用的zsh, bash 的话应该有类似的文件), 往里面写入如下内容

export PATH="/usr/local/bin:/usr/local/sbin:$PATH"

然后source一下这个文件,再查看下ctags 所处位置

source ~/.zprofile
which ctags

自己这边输出的是/opt/homebrew/bin/ctags, 然后在vim的配置文件中输入如下内容即可:

let Tlist_Ctags_Cmd="/opt/homebrew/bin/ctags"
set tags=../*/tags,./*/tags,./tags,./../tags

后记

寄存器部分单独拿出来作为说明;

参考

[1] Vim 7.2
[2] Practice Vim
[3] 感受Vim的强大:进阶技巧

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
知识共享许可协议