常用命令
光标移动
- h 光标左移。
- j 光标下移。
- k 光标上移。
- l 光标右移。
- w 跳到单词开头。
- W 跳到下一个单词开头出,如果多个单词连接起来,当作一个单词。
- e 跳到单词的尾部。
- E 跳到单词的尾部,多个单词当作一个。
- b 往前跳到上一个单词开头出。
- B 往前跳到上一个单词开头出,多个单词当作一个。
- 0 跳到一行的开始
- ^跳到第一个非空格的行。
- $跳到行尾。
- G 跳到文本的最后一行
- 5G 跳到文本的第5行。
- [ 跳到文本首位。
- ] 跳到文本末尾。
插入
- i 在光标前插入。
- I 在行首插入。
- a 在光标前添加
- A 在行尾添加。
- o 在当前行的下一行添加。
- O 在当前行的上一行添加。
- ea 在单词尾添加。
- ESC 退出插入模式。
例子:
在行首插入内容::%s/^/要添加的内容
在行尾插入内容::%s/$/要添加的内容
编辑
- r 替代一个字符。
- J 将当前行的下一行加入到当前行尾部。
- cc 取代当前行。
- cw 取代当前光标到该单词尾部为空字符,进入插入模式。
- c$ 取代当前光标所在位置到该行尾部为空字符,进入插入模式。
- s 删除光标所在字符,进入插入模式。
- S 删除光标所在行,进入插入模式。
- u 撤销之前操作。
- Ctrl+r: 重做
- . 重复最后一条命令。
标记文本
- v:可视模式,按光标位置视选取内容。
- V:可视模式,按行可视选取。
- o:移动到另一个标记的尾部。
- O:移动到另一个块角落。
- aw:标记一个单词。
- ab:标记一个块()
- aB:标记一个块{}
- ib:插入一个块()
- iB:插入一个块{}
替换
~:将选中内容变换大小写。
剪切和粘贴
- yy:复制一行
- 2yy:复制当前光标所在行后一行,共两行内容。
- yw:复制一个单词。
- y$:复制当前光标所在位置到行尾。
- p:粘贴寄存器内容到当前光标后。
- P:粘贴当前寄存器内容到当前光标前。
- dd:删除当前行。
- 2dd:删除当前行内容后一行,共两行。
- dw:删除一个单词。
- D:删除光标所在位置到行尾。
- d$:删除当前光标所在位置到行尾。
- x:删除当前光标所在字符。
复制操作进阶
- 复制指定行内容到指定位置
:5,10 co 2
:复制第5-10行内容到第2行后 :6,9 de
删除第6-9行- 标记复制开始行a,结束行b和处理行c。
ma(移动到标记光标开始位置输入)
mb(移动到光标结束位置)
mc(移动光标处理位置到处理位置)
:'a,'b co 'c
:复制标记a,b之间的内容到标记c行之后:'a,'b de
:删除标记a和b之间的内容
5yl
:复制5个字符
多文件操作
- :e 在新的缓冲区编辑文件。
- :bnext or bn 跳到新的缓冲区
- :bpewv or bp 跳到之前的缓冲区。
- :sp 分割当前窗口,打开一个新的缓冲区。
- :vsp 水平分割一个窗口,在新的缓冲区打开文件。
- :vertical resize +3:在当前分割窗口添加3个字符宽度。
快捷键
- Ctrl+ws 分割窗口
- Ctrl+ww 切换窗口
- Ctrl+wq 退出窗口
- Ctrl+wv 水平分割窗口
大小写转换
命令 | 含义 |
---|---|
` | 将光标位置下的字母改变大小写(normal) |
3` | 将光标位置开始往后的3个字母改变其大小写(如果是小写则变成大写反之亦然)(normal) |
g`` | 改变当前行字母的大小写(normal) |
U | 将可视模式下选择的字母全改成大写字母(visual) |
u | 将可视模式下选择的字母全改成小写(visual) |
gUU | 将当前行的字母改成大写(normal) |
3gUU | 将从光标开始到下面3行字母改成大写(normal) |
guu | 将当前行的字母全改成小写(normal) |
gUw | 将光标下的单词改成大写(normal)。 |
guw | 将光标下的单词改成小写(normal)。 |
VIM高级
- 在文本的指定行行首添加字符。
- ctrl+v
- 上下键选取需要添加字符的行。
- 输入大写的I进入插入模式。
- 输入想要插入的内容。
- 按ESC
- 在文本的指定行行首删除字符
- ctrl+v
- 上下键选择想要删除的行首字符
- 按d。
- 比较两个文件
- 在vim外部同一窗口比较两个文件:vim -d filename1 filename2
- 如果已经打开了一个文件filename1,然后需要比较另一个文件 :diffsplit filename2(上下方向)。:vert diffsplit filename2(左右方向)
- 只在某一文件中存在的行,显示为蓝色;
- 而在另一文件中的对应位置的行,显示为绿色;
- 在两个文件中都存在的行,显示为紫色
- 行中不相同的字符,显示为红色;
如果已经用split打开了两个窗口,可以用下面的命令对比打开窗口的文件
:diffthis
使用zo命令,可以展开被折叠的相同的文本行;而zc命令,则可以重新折叠相同的行。
比较文件时,经常需要结合上下文来确定最终要采取的操作。缺省情况下,是会把不同之处上下各6行的
文本显示出来以供参考。其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数为3行,可以使用以下命令:
:set diffopt=context:3
如果你在一个文件中滚动屏幕,那么另一个文件也会自动滚动以显示相同的位置:
取消同步:
:set noscrollbind
确定同步:
:set scrollbind
- 删除空行
如果需要删除文章中的空行,可以使用一下语句:
:g/^\s*$/d
删除指定内容的行
:g/delete_string/d
简单解释一下:
- g :全区命令
- / :分隔符
^\s*$
:匹配空行,其中^表示行首,\s表示空字符,包括空格和制表符,*重复0到n个前面的字符- $表示行尾。连起来就是匹配只有空字符的行,也就是空行。
- /d :删除该行
- 寄存器复制
使用p来粘贴,如果最近一次操作是复制,那么p就会添加“0
寄存器的内容,如果最近一次操作是删除那么就添加 "1 寄存器的内容 ,如果要粘贴其它数字寄存器的内容,使用"?p
来粘贴,比如要粘贴“2
寄存器里面的,则在vim命令模式下 输入"2p
就可以取出“2
寄存器里面的内容了
其他的寄存器都是通过 "?p 来访问使用的。
小技巧
1.如何退出后再次进入文本编辑的时候光标在之前退出的位置?
在我是用的vim8(arch,deepin,ubuntu14(vim7.4))基本都是退出后再次进入,光标在第一行。这可能是vim8以上的默认设置,修改/etc/vim/vimrc
" Uncomment the following to have Vim jump to the last position when
" reopening a file
"if has("autocmd")
" au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
"endif
删除掉if开头到endof之前的引号。
2. ctrl+s卡死
使用vim时,如果你不小心按了 Ctrl + s后,vim停止向终端输出,要想退出这种状态,只需按Ctrl + q 即可恢复正常
QA
- 使用vim的时候发现backspace无法删除如何解决。
set nocompatible
set backspace=indent,eol,start
- 打开windows文件出现乱码如何解决
出现乱码是因为vim默认不支持gbk2312
,cp936
,打开文件默认是以utf-8
编码打开。为此需要添加对gbk2312
,cp936
的支持,同事设置文件编码为utf-8
,可以在vimrc文件中添加
set fileencodings=utf-8,gb2312,cp936,big5
set encoding=utf-8
这样vim将尝试使用fileencoding中的不同编码来对文件打开,即可打开windows下如gb2312
编码的文件,为了能适应linux,你可转换文件为utf-8
然后保存文件。输入:set fileencoding=utf-8
然后保存文件即可。
相关引用
menggucaoyuan的专栏
VIM学习笔记 比较文件(diff)
vim中寄存器使用和vim标记
vi编辑器中的各种(整行,多行,一个单词)复制
vim在每行行首或行尾添加/删除内容