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
反馈
此页是否对你有帮助?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.