目录

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

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

我们常用的范围有%(全文),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 中常用的替换表达式

简单替换表达式

  • 替换命令可以在全文中用一个单词替换另一个单词:

    1
    
    :%s/four/4/g
  • 如果你有一个象 “thirtyfour” 这样的单词,上面的命令会出错。这种情况下,这个单词会被替换成”thirty4”。要解决这个问题,用 “<” 来指定匹配单词开头:

    1
    
    :%s/\<four/4/g
  • 显然,这样在处理 “fourty” 的时候还是会出错。用 “>” 来解决这个问题:

    1
    
    :%s/\<four\>/4/g
  • 如果你在编码,你可能只想替换注释中的 “four”,而保留代码中的。由于这很难指定,可以在替换命令中加一个 “c” 标记,这样,Vim 会在每次替换前提示你:

    1
    
    :%s/\<four\>/4/gc

删除多余的空格

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

匹配重复性

  • 星号项 * 规定在它前面的项可以重复任意次。因此:\

    1
    
    /a*


    匹配 “a”,”aa”,”aaa”,等等。但也匹配 “” (空字串),因为零次也包含在内。星号 * 仅仅应用于那个紧邻在它前面的项。因此 ab* 匹配 “a”,”ab”,”abb”,“abbb”,等等。如要多次重复整个字符串,那么该字符串必须被组成一个项。组成一项的方法就是在它前面加 \(,后面加 \)。因此这个命令:\

    1
    
    /\(ab\)*


    匹配: “ab”,”abab”,”ababab”,等等。而且也匹配 ““。要避免匹配空字串,使用 \+。这表示前面一项可以被匹配一次或多次。\

    1
    
    /ab\+


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

指定重复次数

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

    1
    
    /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

多选一匹配

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

    1
    
    /foo\|bar


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

    1
    
    /one\|two\|three


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

    1
    
    /\(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文件,文件记录了函数、变量等的位置和类型。\

    1
    2
    
    cd /path/to/project
    ctags -R *
  2. ~/.vimrc中设置\

    1
    
    set tags=tags
  3. 打开项目中的文件

  4. <ctrl>]: 进入光标所指的标识符的定义

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

为Python标准库添加标签

  1. 假设Python标准库的位置是/usr/lib/python3.6\

    1
    
    ctags -R -f ~/.python.tags /usr/lib/python3.6
  2. ~/.vimrc中添加设置\

    1
    
    set tags+=~/.python.tags

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

  1. 设置系统头文件标签\

    1
    
    ctags -R -f ~/.sys.tags /usr/include /usr/local/include
  2. ~/.vimrc中添加设置\

    1
    
    set tags+=~/.sys.tags

Taglist Configure

  1. 安装Taglist,在Taglist官网下载插件,并解压到~/.vim/目录中,保证该目录下存在:\

    1
    2
    
    plugin/taglist.vim
    doc/taglist.txt
  2. 打开项目中的文件,在Command Mode下输入\

    1
    
    :Tilst
  3. Taglist中常用快捷键

命令 功能
<ctrl>ww 在文本窗口和Taglist窗口间切换
o 在一个新打开的窗口中显示光标下tag
s 更改排序方式,在按名字排序和按出现顺序排序间切换
+ 打开一个折叠,同zo
- 将tag折叠起来,同zc
* 打开所有的折叠,同zR
= 将所有tag折叠起来,同zM
[[ 跳到前一个文件
]] 跳到后一个文件
q 关闭taglist窗口