已复制
全屏展示
复制代码

linux 最强编辑器 vim 精通


· 17 min read

vim 可以说是程序员最常用的编辑器了,主要原因是因为它高效、功能强大等优点,本文是我倾力总结的 vim 的一些最常用的一些操作,从前往后循序渐进,即适合刚上手的同学,也适合已经在使用 vim 的同学查阅。

vim 的四种模式

vim的每种模式都有其特定的作用,刚开始接触可能有点不适应,当你上手后就知道为什么要这么设计了。

  • 正常模式: 启动 vim 后默认处于正常模式。不论位于什么模式,按下键(有时需要按两下)都会进入正常模式。按:进入命令行模式。
  • 插入模式: 可以输入文本,在正常模式下,按i、a、o等都可以进入插入模式。
  • 命令行模式:在正常模式下,按下:键,会进入命令模式。在命令模式中可以执行一些输入并执行一些 vim 或插件提供的指令,就像在 shell 里一样。这些指令包括设置环境、文件操作、调用某个功能等等。
  • 可视模式: 正常模式下按v可以进入可视模式, 在可视模式下,移动光标可以选择文本。按V进入可视行模式, 总是整行整行的选中。ctrl+v进入可视块模式。

启动 vim

  • vim -d file1 file2  比较两个文件的不同,同vimdff,后面描述;
  • vim -R file  以只读的方式打开文件,但可以强制保存(使用感叹号保存);
  • vim -M file 以只读的方式打开文件;
  • vim + file 打开文件后光标跳到文件的末尾;
  • vim +num file 打开文件后光标跳到第num行;
  • vim +/string file 打开file,并将光标停留在第一个找到的string行上。

  • vim -p file1 file2 file3  打开多个文件,每个文件占用一个标签页。
  • gT :跳转到前一个 tab
  • gt :跳转到后一个 tab
  • :tabc[lose]   关闭当前的标签页。
  • :tabo[nly]    关闭其它的标签页。
  • 如果想关闭当前 Tab,用 vim 的自带命令 :q 或 :wq

不创建隐藏文件

编辑文件时不创建临时文件,不创建隐藏文件:set noswapfile

文档操作

  • :e file --关闭当前编辑的文件,并开启新的文件file。 如果对当前文件的修改未保存,会看到警告。
  • :e! file --放弃对当前文件的修改,编辑新的文件file。
  • :e! -- 重新加载当前文档,并丢弃已做的改动。
  • :e#ctrl+^ -- 回到刚才编辑的文件(只能在打开两个文件时,在这两个文件之间来回切换),很实用。
  • :fctrl+g -- 显示文档名,是否修改,和光标位置。
  • gf -- 打开以光标所在字符串为文件名的文件。
  • :w -- 保存修改。
  • :wq -- 保存并退出。
  • ZZ -- 保存并退出。
  • :x -- 保存并退出。
  • :q[uit] --退出当前窗口。
  • :saveas newfilename -- 另存为 newfilename,原来的文件不变;
  • :Sex -- 水平分割一个窗口,浏览文件系统;
  • :Vex -- 垂直分割一个窗口,浏览文件系统;

光标的移动

注意:光标移动都是在 normal 模式下进行的。

  • h或退格:  左移一个字符;
  • l或空格 :  右移一个字符;
  • j:  下移一行;
  • k: 上移一行;

  • +Enter: 把光标移至下一行第一个非空白字符。
  • -: 把光标移至上一行第一个非空白字符。

  • w: 前移一个单词,光标停在下一个单词开头;
  • W: 移动下一个单词开头,但忽略一些标点,只要是连成一串的就做为一个单词;

  • e: 前移一个单词,光标停在下一个单词末尾;
  • E: 移动到下一个单词末尾,但忽略一些标点,只要是连成一串的就做为一个单词;

  • b: 后移一个单词,光标停在上一个单词开头;
  • B: 移动到上一个单词开头,但忽略一些标点,只要是连成一串的就做为一个单词;

  • {: 前移1段,只要有空行则表示为一段。
  • }: 后移1段,只要有空行则表示为一段。

  • 0: 移动到行首。
  • ^: 移动到本行第一个非空白字符。
  • $: 移动到行尾。

  • 3G: 到文件第3行。
  • :n 移动到第n行。
  • :$ 移动到最后一行。

  • H: 把光标移到屏幕最顶端一行。
  • M: 把光标移到屏幕中间一行。
  • L : 把光标移到屏幕最底端一行。

  • gg: 到文件头部。
  • G : 到文件尾部。

  • Ctrl + o :跳转到光标上次位置
  • Ctrl + i  :再跳回来

  • fy : 表示在当前行从光标处开始,往后搜索y字符,如果搜索出结果,则跳转到y处,否则光标不移动
  • Fy : 表示在当前行从光标处开始,往前搜索y字符,如果搜索出结果,则跳转到y处,否则光标不移动
  • ;  : 重复如上的某一个操作。
  • ,  : 反向重复如上操作。

  • [{  :   跳转到当前块开始处(特指{}组成的块儿);
  • ]}  :   跳转到当前块结束处(特指{}组成的块儿);

  • %  :  移动到匹配的(), {}, []上。
  • 50%  : 移动到全文中部
  • 20%  : 移动到全文百分之20处
  • 80%  : 移动到全文80%处

翻屏

  • ctrl+f: 下翻一屏。
  • ctrl+b: 上翻一屏。

  • ctrl+d: 下翻半屏。
  • ctrl+u: 上翻半屏。

  • ctrl+e: 屏幕向下滚动一行。
  • ctrl+y: 屏幕向上滚动一行。

  • zt : 把光标所在行移动到窗口顶端
  • zz : 把光标所在行移动到窗口中间
  • zb : 把光标所在行移动到窗口底部
  • n% : 到文件n%的位置。

标记

使用标记可以快速移动。到达标记后,可以用Ctrl+o返回原来的位置。 Ctrl+oCtrl+i 很像浏览器上的 后退 和 前进 。

  • m{a-z}   标记光标所在位置,局部标记,只用于当前文件。
  • `{a-z} 移动到标记位置。
  • `` 移动到上次编辑的位置。

  • :marks   显示所有标记。
  • :delmarks a b    删除标记a和b。
  • :delmarks a-c    删除标记a、b和c。
  • :delmarks a c-f    删除标记a、c、d、e、f。
  • :delmarks!     删除当前缓冲区的所有标记。

插入文本

  • i: 在光标前插入
  • I: 在当前行第一个非空字符前插入;

  • a: 在光标后插入;
  • A: 在当前行最后插入;

  • o: 在下面新建一行插入;
  • O: 在上面新建一行插入;

  • :r filename 在当前位置插入另一个文件的内容。
  • :[n]r filename 在第n行插入另一个文件的内容。

  • :r !date   在光标处插入当前日期与时间。
  • :r !command  可以将其它 shell 命令的输出插入当前文档。

剪切、复制、粘贴、删除

  • x : 剪切光标当前字符

  • y :  复制在可视模式下选中的文本。
  • yy or Y:  复制整行文本。

  • y$: 从光标当前位置复制到行尾。
  • y0: 从光标当前位置复制到行首。

  • :m,ny: 复制m行到n行的内容。
  • ygg :  复制光标以上的所有行。
  • yG:  复制光标以下的所有行。

  • byw :复制一个单词
  • bdw :删除一个单词

  • d : 删除(剪切)在可视模式下选中的文本。

  • dd : 删除当前行
  • [n] dd : 删除(剪切)1(n)行。
  • :m,nd  剪切m行到n行的内容。

  • d$ or D :  删除(剪切)当前位置到行尾的内容。
  • d0 :  删除(剪切)当前位置到行首的内容
  • d^ :  删除(剪切)当前位置到行首的非空字符内容

  • dgg :  剪切光标以上的所有行。
  • dG: 剪切光标以下的所有行。

  • p :  在光标之后粘贴。
  • P :  在光标之前粘贴。
多行处理(首先显示行号)
  • 2,9 co 20  表示复制2行到9行内容,然后粘贴到20行后
  • 2,9 de   表示删除2到9行

  • v    从光标当前位置开始,光标所经过的地方会被选中,再按一下v结束。
  • V    从光标当前行开始,光标经过的行都会被选中,再按一下V结束(选中一行)。
  • Ctrl + v  从光标当前位置开始,选中光标起点和终点所构成的矩形区域,再按一下Ctrl + v结束。

  • 删除对称符号之间的内容,这些符号包括  '' "" [] () {} <> ,删除其实是保存在了寄存器里面,删除之后可以使用p命令粘贴
  • 1 将光标定位到两个符号里面
  • 2 命令行模式下输入di(da),然后输入对应的一个符号
  • 3 例如 di" 表示删除双引号间的内容,da"表示将符号本身也删除

寄存器

  • a-z:都可以用作寄存器名。"ayy把当前行的内容放入a寄存器。
  • A-Z:用大写字母索引寄存器,可以在寄存器中追加内容。 如"Ayy把当前行的内容追加到a寄存器中。
  • :reg 显示所有寄存器的内容。
  • "":不加寄存器索引时,默认使用的寄存器。
  • "*:当前选择缓冲区,"*yy把当前行的内容放入当前选择缓冲区。
  • "+:系统剪贴板。"+yy把当前行的内容放入系统剪贴板。

查找与替换

  • :set ignorecase  忽略大小写搜索
  • :set noignorecase  返回精确匹配用命令

  • /something :  在后面的文本中查找something。
  • ?something :  在前面的文本中查找something。
  • n: 向后查找下一个。
  • N: 向前查找下一个。

  • /something\\>    精确匹配某个关键字,"\>"是一个特殊的记法,它只匹配一个word的结束处。

  • ^  字符匹配一行的开头,所以"/^was"只匹配位于一行开始的单词 was
  • $  字符匹配一行的末尾 ,所以"/was\$"只匹配位于一行末尾的单词 was

  • :noh  取消搜索出现的高亮关键字

  • *  向后搜索光标处的关键词,n、N在搜索到的词上来回跳动
  • #  先前搜索光标处的关键词,n、N在搜索到的词上来回跳动

  • :s/old/new  -- 用new替换当前行第一个old。
  • :s/old/new/g  -- 用new替换当前行所有的old。
  • :n1,n2s/old/new/g  -- 用new替换文件n1行到n2行所有的old。

  • :%s/old/new/g - 用 new 替换文件中所有的 old。
  • :%s/^/xxx/g - 在每一行的行首插入xxx,^ 表示行首。
  • :%s/$/xxx/g - 在每一行的行尾插入xxx,$ 表示行尾。
注意
  • 所有替换命令末尾加上c,每个替换都将需要用户确认。 如:%s/old/new/gc
  • 所有替换命令末尾加上i,则忽略大小写(ignore)。 如:%s/old/new/gi

排版格式化

  • << 向左缩进一个shiftwidth >> 向右缩进一个shiftwidth
多行缩进:按V进入行的 visual 状态,选择多行,用>或<缩进或缩出
  • :ce(nter)  本行文字居中
  • :le(ft)  本行文字靠左
  • :ri(ght) 本行文字靠右
  • J 拼接当前行和下一行
代码格式化,vim 格式化代码实际上就是 "缩进代码", 命令是等号=
  • 全部格式化 : gg=G
  • 对当前行格式化(缩进): ==
  • 选择多行后, 执行 等号命令 =
折叠功能使用插件 pseewald/vim-anyfold
  • zc  光标当前往上折叠一节
  • zC  光标当前往上折叠所有
  • zo  光标当前往上展开一节
  • zO  光标当前往上展开所有
  • zR  展开所有
  • zM  折叠所有

拼写检查

  • :set spell -开启拼写检查功能
  • :set nospell-关闭拼写检查功能

多文件同时编辑

可以一次打开多个文件,可以在编辑过程中在不同的文件之间切换

  • vim a.txt b.txt c.txt
  • :next(:n)  编辑下一个文件。
  • :previous(:N)  编辑上一个文件。

  • :args  显示文件列表。
  • Ctrl ^ 在最近编辑的两个文件之间来回切换

  • vim -o filenames 在水平分割的多个窗口中编辑多个文件。
  • vim -O filenames 在垂直分割的多个窗口中编辑多个文件。

分屏编辑

  • vim -o file1 file2 : 水平分割窗口,同时打开file1和file2
  • vim -O file1 file2 : 垂直分割窗口,同时打开file1和file2

  • :split(:sp) -- 把当前窗水平分割成两个窗口,这两个窗口显示的内容是相同的。
  • :split filename -- 水平分割窗口,并在新窗口中显示另一个文件。

  • :vsplit(:vsp) -- 把当前窗口分割成垂直分布的两个窗口。
  • :vsplit filename -- 垂直分割窗口,并在新窗口中显示另一个文件。

  • :qall -- 关闭所有窗口,退出vim。
  • :wall -- 保存所有修改过的窗口。
  • :only -- 只保留当前窗口,关闭其它窗口。
  • :close -- 关闭当前窗口。

  • ctrl+w ctrl+w  :   切换到下一个窗口。或者是ctrl+w w。
  • ctrl+w p  :   切换到前一个窗口。
  • ctrl+w h(l,j,k)  :  切换到左(右,下,上)的窗口。
  • ctrl+w t(b)  :  切换到最上(下)面的窗口。
  • ctrl+w H(L,K,J)  :  将当前窗口移动到最左(右、上、下)面。
  • ctrl+w r:旋转窗口的位置。

大小写切换

  • ~ :  反转光标所在字符的大小写。
  • 可视模式下的 Uu 把选中的文本变为大写或小写。

替换(normal模式)

  • r: 替换光标处的字符,同样支持汉字。
  • R: 进入替换模式,按esc回到正常模式。

撤消与重做(normal模式)

  • [n] u: 取消一(n)个改动。
  • :undo 5 : 撤销5个改变。
  • :undolist : 你的撤销历史。
  • ctrl + r: 重做最后的改动。
  • U: 取消当前行中所有的改动。
  • :earlier 4m : 回到4分钟前
  • :later 55s : 前进55秒

  • . : 重复上一个编辑动作
  • qa:开始录制宏a(键盘操作记录)
  • q:停止录制
  • a:播放宏a,就是把刚才的键盘操作记录重新执行一遍

文件加解密

  • vim -x file: 开始编辑一个加密的文件。
  • :X :  为当前文件设置密码。
  • :set key= :  去除文件的密码,然后使用wq保存退出(不能使用x保存退出)。

文件的编码

  • :e ++enc=utf8 filename, 让 vim 用 utf-8 的编码打开这个文件。
  • :w ++enc=gbk,不管当前文件什么编码,把它转存成gbk编码。
  • :set fenc:set fileencoding,查看当前文件的编码。
  • 在vimrc中添加set fileencoding=ucs-bom,utf-8,cp936,vim会根据要打开的文件选择合适的编码。 注意:编码之间不要留空格。 cp936对应于gbk编码。 ucs-bom对应于windows下的文件格式。让vim 正确处理文件格式和文件编码,依赖于 ~/.vimrc 的正确配置

文件格式

  • 有三种文件格式:unix, dos, mac 三种格式的区别主要在于回车键的编码:dos 下是回车加换行,unix 下只有 换行符,mac 下只有回车符。
  • :e ++ff=dos filename, 让vim用 dos 格式打开这个文件。
  • :w ++ff=mac filename, 以 mac 格式存储这个文件。
  • :set ff,显示当前文件的格式。
  • 在 vimrc 文件中添加 set fileformats=unix,dos,mac,让 vim 自动识别文件格式。

命令行

  • normal 模式下按:进入命令行模式,命令行模式下的快捷键:
  • 上下方向键:上一条或者下一条命令。如果已经输入了部分命令,则找上一 条或者下一条匹配的命令。
  • 左右方向键:左/右移一个字符。
  • 正常模式下,q然后按':',打开命令行历史缓冲区, 可以像编辑文件一样编辑命令。
  • q/  可以打开查找历史记录。

执行外部命令

  • :! cmd 执行外部命令。
  • :!! 执行上一次的外部命令。
  • :sh 调用 shell,用 exit 返回 vim。
  • :r !cmd将命令的返回结果插入文件当前位置。

  • :pwd 显示vim的工作目录。
  • :cd path 改变vim的工作目录。
  • :set autochdir 可以让vim 根据编辑的文件自动切换工作目录。

vim内置自动补全

  • 开启自动补全功能(vimrc文件)
filetype plugin on
set completeopt=menuone,popup,noinsert,noselect
  • 查看文档
    查看自动补全文档:help ins-completion
  • 关键字补全
    CTRL+N 或者 CTRL+P 可以启动。它会检索当前正在编辑的文件中所有的“词”,然后根据你当前在编辑的“词”进行匹配。这里“词”的概念类似英语中的单词,必须前后要有特殊的、不表意的字符隔开。
  • 全能的补全
    CTRL+X CTRL+O 可以启动。全能的补全Omni completion,它可以补全各种编程语言的内容。
  • 命令行补全
    CTRL+X CTRL+V 可以启动。这个通常是用在写Vim脚本时使用。
  • 文件名补全
    CTRL+X CTRL+F 可以启动。CTRL+X被称为^X模式。用这个功能,它会根据你已经输入的路径进行匹配,在打文件名的时候很方便,如果你什么路径都没输入,那么它会去当前工作目录匹配。
  • 整行的补全
    CTRL+X CTRL+L 可以启动。查找每一行的开头是否匹配来补全。
  • 常用快捷键
Ctrl+Y 选择选中的补全内容,退出补全模式
Ctrl+E 在查找过一遍待选的补全之后发现不合适,要取消补全,按此快捷键组合
Ctrl+W 在查找过一遍待选的补全之后发现不合适,要取消补全,按此快捷键组合

二进制文件操作

  • vim -b datafile
  • xxd 把这个文件转换成十六进制,如果保存的话,会替换原文件。
  • :%!xxd
  • 用下面的命令把它转换回来,如果保存的话,会替换原文件。
  • :%!xxd -r

vimrc配置

我的 .vimrc 配置内容很简单,由于经常会在服务器上操作,服务器上是大家共有的环境,所以不宜设置太多的自定义快捷键。

syntax on
set hlsearch
set incsearch
set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
set autoindent

其他技巧

  • 一个小技巧:按8,再按i,进入插入模式,输入=, 按esc进入命令模式,就会出现8个=。 这在插入分割线时非常有用,如 30i+<esc> 就插入了36个+组成的分割线。

文章推荐