Vim

概述

参考:

Syntax(语法)

参考:

vim [OPTIONS]

OPTIONS:

  • -o FILENAME1 FILENAME2 …… # 水平分割使用 vi 打开多个文件
  • -O FILENAME1 FILENAME2…… # 垂直分割使用 vi 打开多个文件
    • 使用 ctrl+w 后,按上下左右箭头,切换编辑哪方向的文件
  • +# # 打开文件后直接让光标处于第#行的行首,不输入#默认为最后一行
  • -b # 使用二进制模式打开 vim

三种主要模式

  • 默认命令(Normal)模式,可以移动光标,剪切和粘贴。
  • 插入(Insert)模式,用户可以编辑文本。
  • 扩展(Extended)命令模式(或末行模式)e.g.在编辑器下直接输入:wq 可保存退出,或者:q!强制退出。

Exc 按键可退出当前模式。

默认模式

移动定位光标位置

所有其余命令都可以跟该命令联合使用,表示命令执行到哪个位置

注:在任意移动前加数字则代表该移动模式移动几次(例:#→,向右移动#个字符,#为任意数或者字符)

行跳转

  • #G 移动光标到指定的 #
  • G 到文件尾
  • gg 到文件首

w 移至下一个单词的词首 e 移动至当前或下一个单词的词尾(这两项前面跟数字可以移动数字个单词)

b 移动至当前或之前一个单词的词首

0 绝对行首 $绝对行尾 ^ 跳转至行首的第一个非空白字符

)下一句 (上一句 }下一段 {上一段

H 移动光标到屏幕上面 M 移动光标到屏幕中间 L 移动光标到屏幕下面

Scroll(滚动 i.e. 翻页)

https://vimdoc.sourceforge.net/htmldoc/scroll.html

  • ctrl + d # 向下翻半页 Downwards
  • ctrl + u # 向上翻半页 Upwards
  • ctrl + f # 向下翻一页 Forwards
  • ctrl + b # 向上翻一页 Backwards

搜索

进入搜索模式后,所有特殊字符都按正则表达式处理。直接在搜索指令后面加 \c,即可可不区分大小写搜索

用法描述
/word从当前光标处开始搜索字符串 word,按 n 移动到下个单词处,N 移动到上一个。
?word和上面类似,但是是反方向。
fX查找 X 这个字符并向前移动光标到 X 这个字符上
FX查找 X 这个字符并向后移动光标到 X 这个字符上

替换

rX # 替换当前光标所在字符为 X,X 可以是任意字符

*rX # 替换光标所在字符后的 * 个字符为 X

撤销改变

u # 撤消前一次的编辑操作,连续 u 命令可撤消此前的 n 次编辑操作

#u # 直接撤消最近#次编辑操作

Ctrl + r # 撤消最近一次撤消操作

字符选择(进入字符选择模式,然后可以使用移动光标命令)

  • v # 字符选择,将光标经过的字符选择
  • V # 行选择,将光标经过的行选择
  • Ctrl + v # 矩形选择,可以用矩形的方式选择数据

删除,剪切和拷贝

x 删除光标所在处的单个字符

#x # 删除光标所在处及向后的共#个字符

d 命令可跟光标移动命令结合使用,d 还可以在扩展模式中使用,详情下扩展模式介绍

例:

d$ # 剪切到行尾

d^ # 剪切到非空行首

d0 # 剪切到行首

dG # 从当前光标行剪切到最后一行

dd # 剪切当前光标所在行

dXd # 剪切光标所在行下共 x 行

#dd # 删除包括当前光标所在行在内的 # 行

x:剪切当前字符到剪贴板。

c:剪贴选择的内容到剪贴板并且进入插入模式。

cc:剪切当前行并且进入插入模式。

D:剪切从光标位置到行尾到剪贴板。

Y:拷贝当前行 # Y:拷贝当前行下的#行,#为数字

y:拷贝选择的内容到剪贴板。

yy:拷贝当前行。

粘贴:p

插入模式

i:在当前字符的左边插入 I:在当前行首插入

a:在当前字符的右边插入 A:在当前行尾插入

o:在当前行下面插入一个新行 O:在当前行上面插入一个新行

Vim 多缓冲区编辑

剪贴板在 VIM 里面被称为寄存器(Registers)。你可以列出当前定义的所有寄存器名和它们的内容

比如:我们要拷贝当前行到寄存器 a 或者其他字母。你应该按 “ayy。现在当前行已存在寄存器 a 里面直到你又拷贝了一些东西进入寄存器 a。你可以使用命令 “ap 来粘贴寄存器 a 里面的内容到你想要的位置。

扩展模式(命令模式)(与 sed 通用)

替换

Syntax(语法)

:[查找范围]s/查找模式/替换为的内容[/g 或者 i]

注:/可以用@代替,如果使用@则查找模式和替换的内容中的特殊字符不用转义,类似 grep 与 egrep 的区别,g 为全局,i 为忽略大小写

  • s/XXX/YYY(/g) 把当前光标所在行的第一个 XXX 替换成 YYY(把当前光标所在行的所有 XXX 替换成 YYY)
  • :A,Bs/XXX/YYY(/g) 把 A 行到 B 行的每行第一个 XXX 替换成 YYY(把 A 行到 B 行所有的 XXX 替换成 YYY)
  • :%s/XXX/YYY(/g) 把所有行的第一个 XXX 替换成 YYY(把所有行的所有 XXX 替换成 YYY,即全文替换)
  • 符号&:替换的内容中可加符号&,用户在替换内容中引用前面查找模式中匹配到的所有内容
  • 范围定界 start,end 别忘了中间的逗号,
  • . 表示当前行 $表示最后一行
  • .,$-(+)2 从当前行到最后一行的前(后)两行
  • 5,10 从 5 到 10 行

EXAMPLE

  • 1,3s@^@#@ # 给前三行开头加#号
  • :62,131s@^#@@ # 删除62到131行开头的#
  • :5,15s@^[^#].*@#&@g # 查找开头不带#的5至15行,在搜索到的内容前(&)添加#号
  • :%s@ \+@:@g # 替换每行的所有空格为冒号:(注意@和\中间有个空格)
  • :%s@^[[:space:]]\+@@g # 删除行首的所有空白字符
  • :%s@\(enabl.*\)[0-9]@\12@g # 查找enabl后面的跟任意字符然后跟0-9的数字,然后替换0-9的数字为2,\1为引用()中匹配的内容
  • :%s/\[\ \(.*\)\ \]/\1/g # 删除每行的中括号空格
  • :%s@^.\{3\}@@g # 删除每一行的前3个字符

搜索:

  • :g 即为 :global,该搜索命令极其强大,可以对 global 命令在[range]指定的文本范围内(缺省为整个文件)查找 PATTERN,然后对匹配到的行执行命令 COMMAND,如果希望对没匹配上的行执行命令,则使用 global!或 vglobal 命令(注:模式 PATTERN 可以是字符串,也可是是正则表达式的筛选内容)
    • 命令模式
      • :[range]global/PATTERN/COMMAND
    • 应用例子:
      • :g/^$/d # 搜索所有空白行并剪切
      • :g/^#/d # 搜索所有所有开头带#号的行并剪切
  • :v

设置

  • :set ignorecase(或简写成:set ic) # 设置搜索的时候不区分大小写

  • :set noignorecase(或简写成:set noic) # 设置成搜索的时候区分大小写

  • :set number(简写:set nu) # 显示行号

  • :set nonumber(简 set nonu) # 取消行号

  • :nohlsearch # 取消左侧第一排黄色阴影

  • :set fo-=cro # 取消每次按回车都会自动添加#、//等注释符号的功能

  • -r: 按回车不会添加注释

  • -o 按 o 不会添加注释

  • -c:重新格式化长注释行不会添加注释

显示查找内容高亮 :set hlsearch 取消显示查找内容的高亮 :set nohlsearch


最后修改 March 25, 2025: clearup (feb59d93)