vim

  • vim(vi的增强版)是我最喜欢的编辑器,也是linux下第二强大的编辑器
  • 虽然emacs是公认的世界第一,但我认为emacs并没有vi编辑来得高效
  • 如果是初学vi,运行一下vimtutor是个聪明的决定

如果你的系统环境不是中文,而你想使用中文的vimtutor,就运行vimtutor zh

vim的模式

  • 正常模式(normal-mode):可以使用快捷键
  • 插入模式(insert-mode):可以输入文本
  • 命令模式(command-mode):可以执行命令,又称末行模式
  • 替换模式(replace-mode):替换光标后的文字
  • 可视模式(visual-mode):按行或按列选择区块

模式切换

正常模式 -》 插入模式

打开Vim时是正常模式。在任何模式下,只要按下Esc键就可以返回正常模式

快捷键 功能
i 在光标左侧输入正文
I 在光标所在行的行首输入正文,此行首指第一个非空白字符处
a 在光标右侧输入正文
A 在光标所在行的行尾输入正文
s 删除光标所在的字符,并进入输入模式
S 删除光标所在的行,并进入输入模式
o 在光标所在行的下一行增添新行,光标位于新行的行首
O 在光标所在行的上一行增添新行,光标位于新行的行首
r 修改光标所在字符,r后面跟要修改为的字符
R 替换光标所在处开始的字符,直到按【ESC】回到普通模式

正常模式 -》 命令模式

按冒号(:)即可进入命令模式,又称末行模式

正常模式 -》 替换模式

按大写的R即可进入替换模式,替换光标所在处开始的字符,直到按【ESC】回到普通模式

正常模式 -》 可视模式

快捷键 功能
v 进入可视模式,移动光标可以选择文本
V 进入可视行模式,总是整行整行的选中
ctrl + v 进入可视块模式,左右移动选择区块

启动vim

vim可以启动多个文件

vim [选项] [文件...]
命令 功能
vim -b FILENAME 用二进制模式打开
vim -c CMD FILENAME 在打开文件前,先执行指定的命令
vim -r FILENAME 恢复上次异常退出的文件
vim -R FILENAME 以只读的方式打开文件,但可以强制保存
vim -M FILENAME 以只读的方式打开文件,不可以强制保存
vim -y N FILENAME 将编辑窗口的大小设为N行
vim + FILENAME 从文件的末尾开始
vim +N FILENAME 从第N行开始
vim +/STRING FILENAME 打开file,并将光标停留在第一个找到的string上
vim --remote FILENAME 用已有的vim进程打开指定的文件

退出vim

退出vim将是初学者面临的第一大难题,趣闻可以参考这里

快捷键 功能
:wq或:x 保存文件,退出vi编辑器
:w 保存文件,但不退出vi编辑器
:q 退出vi编辑器
:q! 不保存文件,退出vi编辑器
ZZ 保存文件,退出vi编辑器

在字符命令后加上字符a表示操作全部文件,如qa退出所有文件

vim的使用

  • 注意后续带冒号(:)开头的字符命令都是在命令模式下,否则在正常模式下
  • ctrl-w是指control 和 w字符的组合,不包括减号,是非常常用的组合
  • 快捷键中的加号表达组合的意思,不需要输入

光标移动

下面的操作都可以配合数字n使用,比如3h, 则光标向左移动3个字符。

快捷键 功能
h | Backspace 左移一个字符
l | Space 右移一个字符
j 下移一行
k 上移一行
gj 移动到一段内的下一行
gk 移动到一段内的上一行
Enter | + 把光标移至下一行第一个非空白字符
- 把光标移至上一行第一个非空白字符
w 移动下一个单词开头
W 移动下一个单词开头,忽略一些标点符号
e 移动下一个单词末尾
E 移动下一个单词末尾,忽略一些标点符号
b 移动到上一个单词开头
B 移动到上一个单词开头,忽略一些标点符号
ge 移动到上一个单词末尾
gE 移动到上一个单词末尾,忽略一些标点符号
( 前移1句
) 后移1句
{ 前移1段
} 后移1段
fc 把光标移到同一行的下一个c字符处,c可换为其他字符
Fc 把光标移到同一行的上一个c字符处,c可换为其他字符
tc 把光标移到同一行的下一个c字符前,c可换为其他字符
Tc 把光标移到同一行的上一个c字符后,c可换为其他字符
; 配合f & t使用,重复一次
, 配合f & t使用,反向重复一次

一行文本在屏幕上可以显示多行,屏幕行是屏幕上的一行,而非文本行

快捷键 功能
0 移动到行首
g0 移到光标所在屏幕行行首
^ 移动到文本行第一个非空白字符
g^ 移动到屏幕行第一个非空白字符处
$ 移动到行尾
g$ 移动屏幕行行尾
n 向前移动n列
n| 移动到第n
nG 移动到文件第n行
:n 移动到文件第n行
gg 移动到文件头部
G 移动到文件尾部
:$ 移动到文件尾部
H 移动到屏幕最顶端
M 移动到屏幕中间
L 移动到屏幕最底端

翻屏移动

ctrl是control键,加号(+)表示组合的意思,不需要输入

快捷键 功能
ctrl + f 一屏
ctrl + b 一屏
ctrl + d 半屏
ctrl + u 半屏
ctrl + e 滚动一行
ctrl + y 滚动一行
zz 将当前行移动到屏幕中央
zt 将当前行移动到屏幕顶端
zb 将当前行移动到屏幕底端

f -> forward | b -> backward | d -> down | u-> up

文档标记

使用标记可以快速移动。到达标记后,可以用ctrl + o后退,ctrl + i继续前进

快捷键 功能
m[a-z] 标记光标所在位置,局部标记,只用于当前文件
m[A-Z] 标记光标所在位置,全局标记,重新启动时标记仍然有效
[a-z] 移动到标记位置
'[a-z] 移动到标记位置的行首
`[0-9] 移动到倒数第[2-10]次关闭vim时离开的位置
`` 移动到上次编辑的位置,精确到
" 移动到上次编辑的位置,精确到
`" 移动到上次离开的地方
`. 移动到最后改动的地方
ctrl + o 移动到更老的位置
ctrl + i 移动到更新的位置
:marks 显示所有标记
:delmarks a b 删除标记a和b
:delmarks a-c 删除标记a、b和c
:delmarks a c-f 删除标记a和c、d、e、f
:delmarks! 删除当前缓冲区的所有标记
:help mark-motions 查看更多关于mark的知识

文档操作

快捷键 功能
:e 重新加载当前文档
:e! 重新加载当前文档,并丢弃已做的改动
:e FILENAME 关闭当前文件并打开新的文件,如果修改未保存则会有警告
:e! FILENAME 关闭当前文件并打开新的文件,并丢弃已做的改动
:e+ FILENAME 开始新的文件,并从文件尾开始编辑
:e+n FILENAME 开始新的文件,并从第n行开始编辑
:enew 编辑一个未命名的新文档(ctrl-w + n)
:e# 切回到刚才编辑的文件(ctrl + ^)
:f 显示文档和光标等相关信息(ctrl + g )
:f FILENAME 改变编辑的文件名,这时再保存相当于另存为
gf 打开以光标所在字符串为文件名的文件
:w 保存修改
:n1,n2w FILENAME 保存第n1行到n2行的内容到指定文件中
:wq 保存并退出
:x 保存并退出
ZZ 保存并退出
:q[uit] 退出当前窗口(ctrl-w + q或ctrl-w + ctrl-q)
:saveas NEW_FILENAME 文件另存为
:browse e 打开一个文件浏览器来选择要编辑的文件
:set browsedir=last 用上次访问过的目录(默认)
:set browsedir=buffer 用当前文件所在目录
:set browsedir=current 用当前工作目录
:Ex(plore) 浏览当前目录下的所有文件
:Sex 水平分割一个窗口,浏览文件系统
:Vex 垂直分割一个窗口,浏览文件系统

:browse e

  • vim --version | grep browse用来检查支不支持browse命令
  • 加号(+)开头表示支持,减号(-)开头表示不支持
  • 如果是终端,则会打开netrw文件浏览窗口
  • 如果是gvim,则会打开一个图形界面的浏览窗口
  • :browse后可以跟任何编辑文档的命令,如sp等
  • 打开的起始目录可以由browsedir来设置

基本插入

快捷键 功能
i 在光标左侧输入正文
I 在光标所在行的行首第一个非空白字符处输入正文
a 在光标右侧输入正文
A 在光标所在行的行尾输入正文
s 删除光标所在的字符,并进入输入模式
S 删除光标所在的,并进入输入模式
o 在光标所在行的下一行增添新行,光标位于新行的行首
O 在光标所在行的上一行增添新行,光标位于新行的行首
:r FILENAME 在当前行下面插入另一个文件的内容
:[n]r FILENAME 在第n行下面插入另一个文件的内容
:r !date 在当前行下面插入当前日期与时间
:r !command 在当前行下面插入指定command命令的输出

一个小技巧:

  • 按7
  • 再按 i 进入插入模式
  • 输入=
  • 按 esc 回到命令模式
  • 就会出现7个=

这在插入分割线时非常有用,如 36i + esc 就插入了36个+组成的分割线

改写插入

类似[n]cw的类型也可以写为c[n]w

快捷键 功能
[n]cw 改写光标(包括光标)后n个
[n]ch 改写光标(包括光标)前n个字符
[n]cl 改写光标(包括光标)后n个字符
[n]cc 改写当前n行
[n]s 以输入的文本代替光标(包括光标)之后的n个字符
[n]S 以输入的文本代替当前n行

b, w, e大写时,表示忽略一些标点符号

删除和剪切

类似[n]dw的类型也可以写为d[n]w

快捷键 功能
d 删除(剪切)在可视模式下选中的文本
[n]dd 删除(剪切)n
[n]db 删除(剪切)光标左边n个单词
[n]dw 删除(剪切)光标右边n个单词
[n]dh 删除(剪切)光标左边n个字符
[n]dl 删除(剪切)光标右边n个字符
[n]x 剪切光标右边n个字符,相当于d[n]l
[n]X 剪切光标左边n个字符,相当于d[n]h
d0 删除(剪切)当前位置到行首的内容
d$ | D 删除(剪切)当前位置到行尾的内容
dgg | d1G 删除(剪切)光标及光标以上的所有行
dG 删除(剪切)光标及光标以下的所有行
:m,nd 删除(剪切)m行到n行的内容
daw 删除(剪切)一个,即使光标不在词首和词尾
das 删除(剪切)一个句子,即使光标不在句首和句尾
d/c 删除(剪切)当前位置到下一个字符c之间(不包括字符c)的内容,c可换为其他字符

b, w, e大写时,表示忽略一些标点符号

复制

类似[n]yw的类型也可以写为y[n]w

快捷键 功能
y 复制在可视模式下选中的文本
[n]yy | [n]Y 复制n行
[n]yw 复制n个
[n]yh 复制光标左边n个字符
[n]yl 复制光标右边n个字符
y0 从光标当前位置复制到行首
y$ 从光标当前位置复制到行尾
ygg | y1G 复制光标及光标以上的所有行
yG 复制光标及光标以下的所有行
:m,ny 复制m行到n行的内容
yaw 复制一个,即使光标不在词首和词尾
yas 复制一个句子,即使光标不在词首和词尾

b, w, e大写时,表示忽略一些标点符号

粘贴

快捷键 功能
p 粘贴到光标所在行之
P 粘贴到光标所在行之

文本对象

c(change), y(yank), d(delete), p(paste)都可以跟文本对象,进行更复杂的操作

  • aw:一个词
  • as:一句
  • ap:一段
  • ab:一块(包含在圆括号中的)

寄存器

Vim中的复制、删除的内容都会被存放到默认(未命名)寄存器中,可以在相关命令前添加字母表示将数据放入指定寄存器中

字符 说明
a-z 拷贝内容到寄存器,如ayy把当前行的内容放入a寄存器
A-Z 追加内容到寄存器,如Ayy把当前行的内容追加到a寄存器中
:reg 显示所有寄存器的内容
"" 不加寄存器索引时,默认使用的寄存器
"* 拷贝内容到默认缓冲区
"+ 拷贝内容到系统剪贴板

vim --version | grep clipboard 用来检查支不支持系统剪切板 加号(+)开头表示支持,减号(-)开头表示不支持

文件加解密

`vim -x file` 开始编辑一个加密的文件

快捷键 功能
:X 为当前文件设置密码
:set key= 去除文件的密码

文件的编码

快捷键 功能
:e ++enc=utf8 filename 使用utf-8的编码打开指定文件
:w ++enc=gbk 转存为gbk编码
:set fenc | fileencoding 查看当前文件的编码
  • 在vimrc中添加set fileencoding=ucs-bom,utf-8,cp936
  • vim会为要打开的文件选择合适的编码,注意编码之间不要留空格
  • cp936对应于gbk编码,ucs-bom对应于windows下的文件格式

文件换行格式

有三种文件换行格式:dos, unix, mac

系统 换行
dos \r\n(CRLF)(ASCII 13,10)
unix \n(LF)(ASCII 10)
mac \r(CR)(ASCII 13)
快捷键 功能
:e ++ff=dos FILENAME 用dos格式来打开指定文件
:w ++ff=mac FILENAME 以mac格式存储到指定文件
:set ff 显示当前文件的格式

在vimrc中添加set fileformats=unix,dos,mac,vim会自动识别文件格式

vim退格键

vim 退格键(backspace)不能用是由于vi一致性模式造成的

  1. 去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限
    set nocompatible
    
  2. backspace有几种工作方式,默认是vi兼容的
    set backspace=indent,eol,start
    
    |可选值 | 说明 | |---|--- | |indent | 如果用了:set indent等自动缩进,必须设置这个选项 | |eol | 想通过退格键合并两行,需要设置eol | |start | 要想删除此次插入前的输入,需设置这个 |



参考

Vim使用笔记
Stack Overflow:帮助一百万开发者退出 Vim
vim命令模式与输入模式切换
vim 退格键(backspace)不能用
vim自定义设置-配置文件

Copyright © zhujipeng 2017 all right reserved,powered by Gitbook 该文件修订时间: 2017-11-04 14:57:24

results matching ""

    No results matching ""