very good
Vim基本操作
来自KlniuWiki
目录
[隐藏]1 打开文件
- vim -c cmd file
- 在打开文件前,先执行指定的命令;
- vim -r file
- 恢复上次异常退出的文件;
- vim -R file
- 以只读的方式打开文件;
- vim -y num file
- 将编辑窗口的大小设为num行;
- vim + file
- 从文件的末尾开始;
- vim +num file
- 从第num行开始;
2 模式
- 正常模式
- 可以使用快捷键命令,或按:输入命令行。
- 插入模式
- 可以输入文本,在正常模式下,按i、a、o等都可以进入插入模式。
- 可视模式
- 正常模式下按v可以进入可视模式,在可视模式下,移动光标可以选择文本。
- 块选择模式
- 正常模式下按ctrl+v进入。
- 替换模式
- 正常模式下,按R进入。
3 光标移动
命令模式:
[number] [action] object或者
[action] [number] objectnumber为执行次数;action为命令;object为执行对象
k 上 h l 左 右 j 下
- w
- 以单词为单位向右移动光标,支持计数,如3w,向右移动3个单词。
- W
- 向右移动一个单词,不把符号或标点当作单词处理
- b
- 向左移动一个单词,把符号或标点当作单词处理,如3b,向前移动3个单词。
- B
- 向左移动一个单词,不把符号或标点当作单词处理
- e
- 向右移动一个单词,光标在单词的尾字母处,如3e,向后移动3个单词。
- E
- 向右移动一个单词,光标在单词的尾字母处,如3e,向后移动3个单词,但忽略其他边界字符。
- ge
- 向左移动一个单词,光标在单词的尾字母处,如3ge,向前移动3个单词。
- gE
- 向左移动一个单词,光标在单词的尾字母处,如3ge,向前移动3个单词,但忽略其他边界字符
- ^
- 移动到该行第一个非空格的字符处
- 0
- 到行首
- $Snbsp;
- 到行尾
- gg
- 到页首
- G
- 到页末
- 行号+G
- 跳转到指定行
- Ctrl+g
- 查询当前行位置和当前文件位置
- fx
- 向右跳到本行字符x处(x可以是任何字符)
- Fx
- 向左跳到本行字符x处(x可以是任何字符)
- tx
- 和fx相同,区别是跳到字符x前
- Tx
- 和Fx相同,区别是跳到字符x后
- CTRL+U
- 向上滚动半屏
- CTRL+D
- 向下滚动半屏
- %
- 跳转到与当前光标下的括号相匹配的字符上记数+% 跳转到正文的某个部分,如"50%"将会把光标定位在文件的中间。
- H
- 跳转到本屏幕的开始
- M
- 跳转到本屏幕的中间
- L
- 跳转到本屏幕的结尾
- zz
- 把当前行置为屏幕正中央
- zt
- 把当前行置于屏幕顶端
- zb
- 把当前行置于屏幕底端
4 退出Vi
- ZZ
- 退出vi并保存
- :q!
- 退出vi,不保存
- :wq
- 退出vi并保存
5 重复操作
- .
- 重复上一次操作
6 自动补齐
- C-n
- 匹配下一个关键字
- C-p
- 匹配上一个关键字
7 插入
- o
- 在光标下方新开一行并将光标置于新行行首,进入插入模式。
- O
- 同上,在光标上方。
- a
- 在光标之后进入插入模式。
- A
- 同上,在光标之前。
- i
- 在当前光标处进入插入模式
- I
- 在行首进入插入模式
- R
- 进入替换模式,直到按下Esc
- :r filename
- 在当前位置插入另一个文件的内容。
- :r !date
- 在光标处插入当前日期与时间。同理,:r!command可以将其它shell命令的输出插入当前文档。
8 删除
- dl
- 删除当前光标下的字符,同 x 功能一样,建议将 x 映射为其他功能。(用"c"命令代替"d"这些命令就都变成更改命令)。
- dh
- 删除当前光标左边的字符,同 X 功能一样,建议将 X 映射为其他功能。(用"c"命令代替"d"这些命令就都变成更改命令)。
- dw
- 删除光标之后的单词剩余部分,包括空格。(用"c"命令代替"d"这些命令就都变成更改命令)。
- de
- 删除光标之后的单词剩余部分,不包括空格。(用"c"命令代替"d"这些命令就都变成更改命令)。
- db
- 删除自当前光标至前一个单词的开始。(用"c"命令代替"d"这些命令就都变成更改命令)。
- diw
- 删除当前光标所在的单词(不包括空白字符)。(用"c"命令代替"d"这些命令就都变成更改命令)。
- daw
- 删除当前光标所在的单词包括空白字符)。(用"c"命令代替"d"这些命令就都变成更改命令)。
- d$Snbsp;
- 删除光标之后的该行剩余部分,同 D 功能一样,建议将 D 映射为其他功能。(用"c"命令代替"d"这些命令就都变成更改命令)。
- dd
- 删除当前行。(用"c"命令代替"d"这些命令就都变成更改命令)。
- cl
- 功能和 dl 相同,删除当前光标下的字符,区别在于完成删除操作后进入 INSERT MODE,同 s 功能相同,建议将 s 映射为其他功能。
- ch
- 功能和 dh 相同,删除当前光标左边的字符,区别在于完成删除操作后进入 INSERT MODE。
- cw
- 功能和 dw 相同,删除光标之后的单词剩余部分,区别在于完成删除操作后进入 INSERT MODE。
- ce
- 功能和 de 相同,删除光标之后的单词剩余部分,区别在于完成删除操作后进入 INSERT MODE。
- c$Snbsp;
- 功能和 d$ 相同,区别在于完成删除操作后进入 INSERT MODE,同 C 功能一样,建议将 C 映射为其他功能。
- cc
- 也是删除当前行,然后进入 INSERT MODE,同 S 功能相同,建议将 S 映射为其他功能。
- ci[
- 删除一对 [] 中的所有字符并进入插入模式
- ci(
- 删除一对 () 中的所有字符并进入插入模式
- ci<
- 删除一对 <> 中的所有字符并进入插入模式
- ci{
- 删除一对 {} 中的所有字符并进入插入模式
- cit
- 删除一对 HTML/XML 的标签内部的所有字符并进入插入模式
- ci” ci’ ci`
- 删除一对引号字符 (” 或 ‘ 或 `) 中所有字符并进入插入模式
- J
- 删除一个换行符。
- dG
- 删除当前行至文件尾的内容(用"c"命令代替"d"这些命令就都变成更改命令)。
- dgg
- 删除当前行至文件头的内容 (用"c"命令代替"d"这些命令就都变成更改命令)。
9 更改字符
- rx
- 将当前光标下的字符更改为x(x为任意字符)
- ~
- 更改当前光标下的字符的大小写
- xp
- 交换两个字母。
10 定位及文件状态
- CTRL-g
- 显示当前编辑文件中当前光标所在行位置以及文件状态信息。
- SHIFT-G
- 则直接跳转到文件中的某一指定行
11 可视模式
- v
- 进入行选择模式。
- CTRL-v
- 进入块选择模式。
- vi[
- 选择一对 [] 中的所有字符
- vi(
- 选择一对 () 中的所有字符
- vi<
- 选择一对 <> 中的所有字符
- vi{
- 选择一对 {} 中的所有字符
- vit
- 选择一对 HTML/XML 的标签内部的所有字符
- vi” vi’ vi`
- 选择一对引号字符 (” 或 ‘ 或 `) 中所有字符
12 键盘宏操作
- qcharacter
- 开始录制宏,character为a到z的任意字符
- q
- 终止录制宏
- @character
- 调用先前录制的宏
13 恢复误操作
- u
- 撤销最后执行的命令
- U
- 修正之前对该行的操作
- Ctrl+R
- Redo
14 查找与替换
- /字符串
- 在当前文件正向查找相应的字符串。继续查找同一个字符串,按n或/(ENTER),若要反向继续查找,按Shift+N,.*[]^%~$ 在Vi中具有特殊含义,若需要查找则应该加上转义字符"\"
- ?字符串
- 在当前文件反向查找相应的字符串。继续查找同一个字符串,按n或/(ENTER),若要反向继续查找,按Shift+N,.*[]^%~$ 在Vi中具有特殊含义,若需要查找则应该加上转义字符"\"
- %
- 查找配对的括号
- :s/old/new/g
- 在当前行替换old为new,若没有g则表示只替换一个。若要每个替换都向用户询问则应该用gc选项。
- :#,#s/old/new/g
- 在两行之间替换old为new,#,#代表的是两行的行号。
- :%s/old/new/g
- 替换整个文件中的每个匹配串。
- :%s/^/xxx/g
- 在每一行的行首插入xxx,^表示行首。
- :%s/$/xxx/g
- 在每一行的行尾插入xxx,^表示行尾。
- *
- 向下搜索光标所在词。
- #
- 向上搜索光标所在词。
- :set hlsearch
- 设置高亮
- :set nohlsearch
- 关闭高亮
- :nohlsearch
- 关闭当前已经设置的高亮
- :set incsearch
- 设置增量查找
- :set noincsearch
- 关闭增量查找
15 剪切、复制与粘贴
- [n]x
- 剪切光标右边n个字符,相当于d[n]l。
- [n]X
- 剪切光标左边n个字符,相当于d[n]h。
- y
- 复制在可视模式下选中的文本。
- yy or Y
- 复制整行文本。
- y[n]w
- 复制一(n)个词。
- y[n]l
- 复制光标右边1(n)个字符。
- y[n]h
- 复制光标左边1(n)个字符。
- y$Snbsp;
- 从光标当前位置复制到行尾。
- y0
- 从光标当前位置复制到行首。
- :m,ny
- 复制m行到n行的内容。
- y1G或ygg
- 复制光标以上的所有行。
- yG
- 复制光标以下的所有行。
- d
- 删除(剪切)在可视模式下选中的文本。
- d$ or D
- 删除(剪切)当前位置到行尾的内容。
- d[n]w
- 删除(剪切)1(n)个单词
- d[n]l
- 删除(剪切)光标右边1(n)个字符。
- d[n]h
- 删除(剪切)光标左边1(n)个字符。
- d0
- 删除(剪切)当前位置到行首的内容
- [n] dd
- 删除(剪切)1(n)行。
- :m,nd
- 剪切m行到n行的内容。
- d1G或dgg
- 剪切光标以上的所有行。
- dG
- 剪切光标以下的所有行。
- p
- 在光标之后粘贴。
- P
- 在光标之前粘贴。
16 分割窗口
- :split(
- sp) [filename] : 水平分割窗口,如果指定文件名,则在新窗口内打开文件。
- :nsplit(
- nsp) [filename] : 水平分割出一个n行高的窗口,如果指定文件名,则在新窗口内打开文件。
- :new
- 水平分割出一个窗口,并编辑一个新文件。
- :vsplit(
- vsp) : 把当前窗口分割成水平分布的两个窗口,如果指定文件名,则在新窗口内打开文件。
- :vnew
- 垂直分割出一个新窗口。
- ctrl+w +
- 当前窗口增高一行。也可以用n增高n行。
- ctrl+w -
- 当前窗口减小一行。也可以用n减小n行。
- ctrl+w_
- 当前窗口扩展到尽可能的大。
17 缩进缩出
- [n]>>
- 正常模式下,按两下>,即>>光标所在行会缩进。如果先按了n,再按>>,光标以下的n行会缩进。
- [n]<<
- 正常模式下,按两下<,即<<光标所在行会缩出。如果先按了n,再按<<,光标以下的n行会缩出。
- [n]=
- 如果在编辑代码文件,可以用=进行调整,在可视模式下,选择要调整的代码块,按=,代码会按书写规则缩排好,或者n=,调整n行代码的缩排。
18 多标签编辑
- :tabe filename
- 在新的标签中打开一个文件。
- :tabn
- 切换到下一个标签。
- :tabp
- 切换到上一个标签。
19 外部命令、文件保存与删除
- :!cmd
- cmd即代表外部命令,比如:ls,列出当前目录文件。
- :w
- 保存文件内容默认文件名。
- :w TEST
- 保存文件内容至TEST文件。
- :!rm TEST
- 删除TEST文件。
- :#,# w TEST
- 保存两行之间文件内容至TEST文件。其中#,#代表两行号。
- :e file
- 关闭当前编辑的文件,并开启新的文件。如果对当前文件的修改未保存,vi会警告。
- :e! file
- 放弃对当前文件的修改,编辑新的文件。
- :e+file
- 开始新的文件,并从文件尾开始编辑。
- :e+n file
- 开始新的文件,并从第n行开始编辑。
- :enew
- 编辑一个未命名的新文档。
- :e
- 重新加载当前文档。
- :e!
- 重新加载当前文档,并丢弃已做的改动。
- :wq
- 保存并退出。
- :x
- 保存并退出。
- :saveas newfilename
- 另存为
- :q! 或 ZZ
- 不保存退出
20 其他
- :set fileencodings
- 查看编码
- :set fileencodings 编码
- 设置编码,例如set fileencodings=utf-8,gb2312
- :set nu
- 设置行号
- :set nonu
- 取消行号显示