vim 配置文件: ~/.vimrc,在.vimrc文件中可以配置 vim 的永久属性。.vimrc 文件里面的注释用英文的双引号"。配置 vim 暂时属性可以在命令模式下设置,如给当前文件显示行号::set nu

  • 行号,暂时显示行号,:set nu;暂时取消行号,:set nonu。永久显示行号。终端输入命令 vim ~/.vimrc,打开文件后,添加 set nu

  • Tab 键占空格数,set tabstop=4


  • 保存,:w

  • 保存到新文件,:w new_file

  • 保存到已有文件,:w! exist_file


  • 退出,没有做过修改。:q

  • 退出,保存修改。:wq:x

  • 退出,放弃修改。:q!


  • 查找,从开头到结尾查找文件“word” /word;从结尾到开头查找“word” ?word。查看下一个,按n

  • 替换

    在命令模式下,可以用 s 命令来替换字符串:: [option1]s/oldStr/newStr/[option2]

    • [option2] 可以是 g c p
      • g:表示全局替换

      • c:表示进行确认再替换

      • p:表示替换结果逐行显示(Ctrl + L 恢复屏幕)

    • : s/oldStr/newStr/:替换当前行第一个 oldStr 字符串

    • : s/oldStr/newStr/g:替换当前行所有 oldStr 字符串

    • : m, ns/oldStr/newStr:替换从第 m 行到第 n 行中的第一个 oldStr 字符串

    • : n, $s/oldStr/newStr/g:替换从第 n 行到最后一行的所有 oldStr 字符串

    • : ., $s/oldStr/newStr/:替换从当前行到最后一行的第一个 oldStr 字符串

    • : %s/oldStr/newStr/g:替换每一行中所有的 oldStr 字符串

    • : %s/oldStr/newStr/c:替换每行中的第一个 oldStr 字符串,但是替换需要确认

    • : %s/oldStr/newStr/gc:替换所有的 oldStr 字符串,但是替换需要确认

    • 可以使用 #+ 代替 / 作为分隔符,此时命令中出现的 / 将作为普通字符处理,如:

      • : s#oldStr/#newStr#:替换当前行的 oldStr/ 字符串

      • : %s+/oldStr/+newStr:替换所有 /oldStr/ 字符串


  • 跳到指定行

    • 正常模式下,nggnGn 为行号。如跳到 35 行,35ggG 可以直接跳到最后一行。

    • 命令模式下,:n

    • 如果想打开文件即跳转,sudo vim +n file_name


  • 复制一(n)行

    正常模式下,复制光标所在的整行,yy;复制 n 行(从光标所在行开始),nyy

    或者:

    命令模式下,复制从第 n 行到 n + 5 行的内容到第 m 行后面 n, n+5 copy/co m

    或者:

    正常模式下,把光标移到要开始复制的那一行 ngg,然后,计算一下删除哪几行(如,n ~ n+5,包括n和n+5),执行 d5(即删除第 n 到第 n+5 这 6 行)。删除完之后,恢复 u。将光标移到要粘贴的位置,p

  • 粘贴一行

    正常模式下,将复制到的内容粘贴到光标所在的行,p

  • 删除一行

    正常模式下,删除光标所在的行,dd

  • 删除多行

    正常模式下,删除光标所在的行开始的 n + 1 行,dnn的值为最后一行的行号减去开始行的行号


  • 撤消

    在正常模式下,撤消上一步,u

  • 恢复撤消

    在正常模式下,恢复撤消的内容,Ctrl + r


光标移动

  • h:向左;nh,向左移动 n 个字符。

  • j:向下;nj,向下移动 n 行。

  • k:向上;nk,向上移动 n 行。

  • l:向右。nl,向右移动 n 个字符。

  • w:向右移动到下个单词的首个字符处;nw,向右移动 n 个单词。

  • b:与 w 方向相反。

  • e:向右移动到下个单词的尾字符处;ne,向右移动 n 个单词。

  • ge:与 e 方向相反。

  • ^:光标移动到该行的第一个字符处(不包括空格)。

  • $:光标移动到该行的尾字符处。

  • 0:光标移动到该行的行首。

  • nggnG:光标移动到 n 行的第一个字符上。

  • gg:移动到文件首行。

  • G:光标移动到文件末行。

  • Ctrl + f:向上翻页。

  • Ctrl + b


  • 选择字符

    正常模式下,v,进入可视模式,然后通过光标移动来选择字符。


复制

  • y:复制选中的字符,选中字符可以在可视模式下,然后 hjkl 选择。

  • yw:复制当前光标位置到单词尾字符的内容到 vim 缓冲区。nyw,复制 n 个单词。

  • y^:复制当前光标位置到行首的内容到 vim 缓冲区。

  • y$:复制当前光标位置到行尾的内容到 vim 缓冲区。

  • yy:复制当前行的内容到 vim 缓冲区。nyy,复制 n 行。

  • 复制第 m 行到第 n 行的内容到 vim 缓冲区:

    命令模式下,m, ny

  • 复制第 m 行到第 n 行的内容到第 k 行后面:

    命令模式下,m, n copy/co k

以上复制,都是将内容复制到 vim 剪贴板,而且 vim 具有多个剪贴板,而我们平时操作的复制粘贴是将内容保存到系统的剪贴板。所以,当你想从另外的地方复制了一段内容(如,浏览器某个网址上复制一段内容)到当前 vim 来,是不能够直接用 p 来粘贴的。因为,p 命令是默认粘贴当前 vim 缓冲区的内容。

vim 中的剪贴板内容是保存在 register 中的,在 vim 命令模式下,可以用 reg 命令来查看 register 中的内容。

(ubuntu 15.10)我们可以看到,系统中复制的内容保存在 "*"+ 的 register 中。所以,如果我们想要将系统剪贴板的内容粘贴到当前 vim,只需在粘贴命令前添加 register 标记就可以了。

  • "*p"+p:将系统剪贴板的内容粘贴到光标后面。

  • "*y“+y:将当前 vim 中选中的内容复制到系统剪贴板中。


删除(非插入模式下)

  • xd:删除当前光标下的字符。

  • dw:删除光标之后的单词剩余部分。

  • d$:删除光标之后的该行剩余部分。

  • dd:删除当前行。

  • dnn为最后一行的行号减去开始行的行号的值,删除光标所在的行开始的 n + 1 行。

  • c:删除光标下的字符后,进入插入模式。

  • cc:删除当前行之后,进入插入模式。

  • :wq 强制性写入文件并退出(存盘并退出 write%quite)。即使文件没有被修改也强制写入,并更新文件 的修改时间。
  • :x 写入文件并退出。仅当文件被修改时才写入,并更新文件修改时间;否则不会更新文件修改时间。

这两者一般情况下没什么不一样,但是在编程方面,对编辑源文件可能会产生重要影响。因为文件即使没有修改,:wq 强制更新文件的修改时间,这样会让 Makefile 编译整个项目时以为文件被修改过了,然后就得重新编译链接生成可执行文件。这可能会产生让人误解的后果,当然也产生了不必要的系统资源花销。