vim 配置

  • vim 配置文件: vim 首先读取当前用户的配置文件 ~/.vimrc,如果没有则读取 root 用户的配置文件/root/.vimrc
  • .vimrc文件中可以配置 vim 的永久属性。.vimrc 文件里面的注释用英文的双引号"
  • 在文件编辑时,命令模式下可以配置 vim 的暂时属性,即关闭文件则失效。如给当前文件显示行号::set nu

常见配置:

  • set nu:添加行号。
  • set nonu:删除行号。
  • set tabstop=4:设置 Tab 键占 4 个空格。
  • set ai:自动换行。

vim 常见用法

  • :w:保存当前修改。
  • :w new_file:保存到新文件。当编辑没有权限的文件时,可以利用这个命令将当前修改保存到有权限的新文件中。
  • :w! exist_file:保存到已有文件。

  • :q:退出,当文件没有修改过的时候才有效,如果有修改过,需要保存退出或强制退出。
  • :wq, :x:退出,并保存修改。:wq,不管文件有没有修改,每次执行命令都会更新文件的修改时间;:x,当文件没有修改过的时候,直接退出,并不更新文件的修改时间。
  • :q!:强制退出,放弃修改。

  • 查找

    • /word:从开头到结尾查找文件中的 “word”。
    • ?word:从结尾到开头查找文件中的 “word”。
      查看下一个,按n;上一个,按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 选择。
  • ye:复制当前光标位置到单词结尾的字符内容到 vim 缓冲区。nye,复制 n 个单词。
  • 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 16.04)我们可以看到,系统中复制的内容保存在 "*"+ 的 register 中。所以,如果我们想要将系统剪贴板的内容粘贴到当前 vim,只需在粘贴命令前添加 register 标记就可以了。

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

删除 (非插入模式下)

  • xd:删除当前光标下的字符。
  • dw:删除光标之后的单词剩余部分。
  • d$:删除光标之后的该行剩余部分。
  • dd:删除当前行。
  • dnn为最后一行的行号减去开始行的行号的值,删除光标所在的行开始的 n + 1 行。
  • c:删除光标下的字符后,进入插入模式。
  • cc:删除当前行之后,进入插入模式。