1924 words
10 minutes
Vim 使用笔记

目录#

Command Mode#

Cursor Motions#

  • ^: 回到行首

  • $: 回到行尾

  • l: 向前移动一个单词

  • w: 向后移动一个单词

Note: w通常表示一个单词,如dw删除一个单词, yw复制一个单词,cw替换一个单词。

Edit Command#

Deletion#

  • x: 删除一个字符

  • dd: 删除一行

  • ndd: 删除n行

  • dw: 删除一个单词

  • D: 删除至行尾

Note: 这里的删除类似于剪切,可以粘贴。

Copy and Paste#

  • yy: 复制一行

  • yw: 复制一个单词

  • p: 在光标后复制

  • P: 在 光标前复制

Undo and Redo#

  • u: 撤销

  • <ctrl>r: 恢复

Window Motion#

  • <ctrl>f or <Page Down>: 向下翻页

  • <ctrl>b or <Page Up>: 向上翻页

  • <ctrl>d: 下滚(向下翻半页)

  • <ctrl>u: 上滚(向上翻半页)

  • G: 定位文件最后一行

  • :n: 定位到第n行

Insert Mode#

  • a: 光标后插入

  • i: 光标前插入

  • :r file: 在当前行之后插入文件内容

Visual Mode#

  • v: 进入可视模式

  • V: 进入可视行模式

  • <ctrl>v: 进入可视块模式

Search and Replace#

Basic usage#

  1. 在Command Mode 下输入/xxxx 后按<Enter>可在光标后搜索内容为xxxx的字段。
  2. n: 跳转下一个字段,N: 跳转上一个字段。

Replace#

Syntax:[addr]s/源字符串/目的字符串/[option]
  • addr: 表示搜索范围
选项功能
.当前行
n第n行
$最后一行
%全文
[addr1],[addr2]指定一个范围
TIP

我们常用的范围有%(全文),n1,n2(从第n1行到n2行)。

  • option
选项功能
g全局替换
c替换时进行确认
i忽略大小写

Regular Expression#

正则表达式是一种按一定规则匹配一系列文本的字符串表达式。

“正则表达式是烦琐的,但它是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。”

这里推荐一个网站来学习正则表达式:http://www.runoob.com/regexp/regexp-tutorial.html Vim中的搜索和替换同样支持正则表达式。大部分语法与其他正则表达式语法相同,但有一小部分略有区别。这里列出一些规则供参考。

  • 元字符
模式功能
.匹配任意字符
[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个
  • 表示位置的元字符
模式功能
$匹配行尾
^匹配行首
\<匹配单词词首
\>匹配单词词尾

Vim 中常用的替换表达式#

简单替换表达式#

  • 替换命令可以在全文中用一个单词替换另一个单词:
:%s/four/4/g
  • 如果你有一个象 “thirtyfour” 这样的单词,上面的命令会出错。这种情况下,这个单词会被替换成”thirty4”。要解决这个问题,用 ”<” 来指定匹配单词开头:
:%s/\<four/4/g
  • 显然,这样在处理 “fourty” 的时候还是会出错。用 ”>” 来解决这个问题:
:%s/\<four\>/4/g
  • 如果你在编码,你可能只想替换注释中的 “four”,而保留代码中的。由于这很难指定,可以在替换命令中加一个 “c” 标记,这样,Vim 会在每次替换前提示你:
:%s/\<four\>/4/gc

删除多余的空格#

  • 要删除这些每行后面多余的空格,可以执行如下命令: :%s/\s\+$// 匹配模式为\s\+$,这表示行末($)前的一个或者多个(\+)空格(\s)。替换命令的部分是空的://

匹配重复性#

星号项 * 规定在它前面的项可以重复任意次。

  • /a*匹配 “a”,“aa”,“aaa”,等等。但也匹配 "" (空字串),因为零次也包含在内。星号 * 仅仅应用于那个紧邻在它前面的项。

  • ab* 匹配 “a”,“ab”,“abb”,“abbb”,等等。如要多次重复整个字符串,那么该字符串必须被组成一个项。组成一项的方法就是在它前面加 \(,后面加 \)

  • /\(ab\)*匹配: “ab”,“abab”,“ababab”,等等。而且也匹配 ""。

要避免匹配空字串,使用 \+。这表示前面一项可以被匹配一次或多次。

  • /ab\+匹配 “ab”,“abb”,“abbb”,等等。它不匹配 后面没有跟随 “b” 的 “a”。

指定重复次数#

  • 要匹配某一项的特定次数重复,使用 \{n,m} 这样的形式。其中 “n” 和 “m” 都是数字。在它前面的那个项将被重复 “n” 到 “m” 次 (包含 “n” 和 “m”)。例如:

/ab\{3,5}匹配 “abbb”,“abbbb” 以及 “abbbbb”。 当 “n” 省略时,被默认为零。当 “m” 省略时,被默认为无限大。当 “,m” 省略时,就表示重复正好 “n” 次。例如:

模式匹配次数
\{,4}0,1,2,3 或 4
\{3,}3,4,5,等等
\{0,1}0 或 1
\{0,}0 或 更多,同 *
\{1,}1 或 更多,同 +
\{3}3

多选一匹配#

在一个查找模式中,“或” 运算符是 \\|。例如:

/foo\|bar

这个命令匹配了 foobar。更多的抉择可以连在后面:

/one\|two\|three

匹配 onetwothree

如要匹配其多次重复,那么整个抉择结构须置于 \(\) 之间:

/\(foo\|bar\)\+

这个命令匹配 foofoobarfoofoobarfoobar,等等。

变量替换#

置于 \(\) 之间的字符串可以作为变量在替换是引用,例如xxxx this is that xxxx,我们想将这段文本中的thisthat进行换位变成xxxx that is this xxxx,Vim的替换命令应该这样写:

:.s/\( this \) is \(that\)/\2 is \1/`

其中\1表示this\2表示that

Ctags and Taglist#

Ctags可以定义项目目录下的文件所包含的结构体、函数类型、变量类型、函数名所在位置,并可以他们之间跳转。

Ctags Configure#

  1. 在项目目录下生成tags文件,文件记录了函数、变量等的位置和类型。
Terminal window
cd /path/to/project
ctags -R *
  1. ~/.vimrc中设置
set tags=tags
  1. 打开项目中的文件
  • <ctrl>]: 进入光标所指的标识符的定义

  • <ctrl>t: 回到前一个标签处

为Python标准库添加标签#

  1. 假设Python标准库的位置是/usr/lib/python3.6
Terminal window
ctags -R -f ~/.python.tags /usr/lib/python3.6
  1. ~/.vimrc中添加设置
set tags+=~/.python.tags

为C/C++系统函数添加标签#

  1. 设置系统头文件标签
Terminal window
ctags -R -f ~/.sys.tags /usr/include /usr/local/include
  1. ~/.vimrc中添加设置
set tags+=~/.sys.tags

Taglist Configure#

  1. 安装Taglist,在Taglist官网下载插件,并解压到~/.vim/目录中,保证该目录下存在:
plugin/taglist.vim
doc/taglist.txt
  1. 打开项目中的文件,在Command Mode下输入
Terminal window
:Tilst
  1. Taglist中常用快捷键
命令功能
<ctrl>ww在文本窗口和Taglist窗口间切换
o在一个新打开的窗口中显示光标下tag
s更改排序方式,在按名字排序和按出现顺序排序间切换
+打开一个折叠,同zo
-将tag折叠起来,同zc
*打开所有的折叠,同zR
=将所有tag折叠起来,同zM
[[跳到前一个文件
]]跳到后一个文件
q关闭taglist窗口
Vim 使用笔记
https://fuwari.vercel.app/posts/vim-intro/
Author
Mijian Xu
Published at
2017-11-01
License
CC BY-NC-SA 4.0