Vim 官网:http://www.vim.org/
参考:https://wenku.baidu.com/view/21c5f387d4d8d15abe234ecb.html
参考:https://www.douban.com/group/topic/1815089/
参考:http://www.tuicool.com/articles/rq6ryqi
参考:http://darksun.blog.51cto.com/3874064/1548082/
VIM 使用技巧 PDF 下载:http://download.csdn.net/download/freeking101/9882394
史上最全Vim快捷键键位图(入门到进阶):https://www.linuxidc.com/Linux/2016-06/132019.htm
vim键位图(如果网页图片看不清,可以 “右键->在新标签页中打开图片” 查看)
英文版(基础版)
简体中文版(基础版)
程序员定制版
https://blog.csdn.net/zhlh_xt/article/details/52458672
个性化配置
vim是什么?
所有的Linux/UNIX都会默认安装Vi,现在主流的linux都会给默认安装vim。vim是Vi IMproved,是编辑器Vi的一个加强版。Vim/Vi是一个功能强大的全屏幕文本编辑器, 是Linux/UNIX上最常用的文本编辑器, 它的作用是建立、编辑、显示文本文件;Vi几乎支持所有的语言。Vim/Vi 没有菜单,只有命令。 如果你是一名职业的SE,那么一定在寻找一款出色的能够自由定制、满足灵活编辑功能的编辑器。那么答案,就是vim或者Emacs。本文介绍vim编辑器。至于另一款强大的编辑器Emacs,以后有时间在整理学习。。。。
配置文件在哪?
Windows系统的配置文件是vim安装目录下的vimrc文件。
Linux系统,RHEL和CentOS的配置文件是/etc/vimrc,Debian和Ubuntu的配置文件是/usr/share/vim/vimrc。
Mac OS X的配置文件是/usr/share/vim/vimrc。
vimRC中的RC是什么意思?
一般在运行某个软件、环境或工具之初,要初始执行的一些命令,称为Run Commands,即RC。根据Wikipedia.org的记载,RC缩写的用法源自MIT的相容分时操作系统(Compatible Time-Sharing System,CTSS)[参考1]。所以以后如果你看到了SystemRC或者ScreenRC,也就知其缘由了。
三种基本模式
在《大家来学vim》中提到vim有6+5种模式,除了细分程度不同外,实际上常用的只有3种模式:Normal Mode、Insert Mode和Command-line Mode。从Normal Mode进入Insert Mode,可以按i、I、a、A、o、O、r、R即可。其中i和I表示插入(Insert),r和R表示替换(replace)。从Insert Mode进入Normal Mode,只需要按ESC键即可。从Normal Mode进入Command-line Mode,可以按“:”、“/”、“?”。其中“:”表示输入vim命令,“/”表示后面输入要向下搜索的字符串,“?”表示后面输入要向上搜索字符串。从Command-line Mode进入Normal Mode,只需要按ESC键即可了。可以把Normal Mode理解为常态,进入其他任何一种模式,需要某种特殊方式,而从其他特殊模式回到Normal Mode,就按ESC键即可。
Vim/Vi工作模式
vim中那些最最常用的配置
(1)颜色设置
(2)搜索设置
可以使用如下方式来实现快速查找:
最快的方式是让光标停留在想要查找的单词的任意一个字母上面, 然后输入Shift + * ,即可快速选中该单词,并且可以通过 n 或 N 进行上一个或下一个的匹配。
让光标停留在单词的第一个字母上, 然后输入yw拷贝该单词, 然后输入 / (Ctrl + R) 0 (即 /”0),回车, 就查找到了第一个匹配的单词, 并且可以通过 n 或 N 进行上一个或下一个的匹配。
解释一下:
Ctrl + r 是指使用寄存器 , 你会发现先输入/ , 然后输入 Ctrl + r , 会立刻变为 “ , 即寄存器的前缀, 然后 ”0 就可以理解了吧? 合起来就是 /“0, 就是查找刚才复制的那个单词, 不懂的请查看上一个帖子:
vim的复制粘贴(系统剪切板 剪贴板):http://blog.csdn.net/hk2291976/article/details/42196559
vim之寄存器的使用和配置:http://blog.csdn.net/ballack_linux/article/details/53078836还有一种方式, 和第二种方式差不多,不过是将单词拷贝到系统剪贴板, 然后再从系统剪贴板拿出来。 即选中需要查找的单词, 然后输入 “+y, 然后输入/(Shfit + Ctrl + v), 就查找到了第一个匹配的单词, 并且可以通过 n 或 N 进行上一个或下一个的匹配。
(3)用户界面
(4)编辑辅助配置
(5)set 命令 和 set 的一些选项
参考:
[1]Run Commands,http://en.wikipedia.org/wiki/Run_commands
[2]The Ultimate vim Configuration(vimRC),http://amix.dk/blog/post/19486
1、用vim打开一个文件,例如:original.trace
2、在普通模式下,输入:":sp"(不含引号)横向切分一个窗口,或者":vsp"纵向切分一个窗口,敲入命令后,你将看到两个窗口打开的是同一个文件
3、在普通模式下,输入:":e new.trace",在其中一个窗口里打开另一个文件
1、用vim打开a.txt
# vim a.txt
Esc进入指令模式(默认刚打开就是这个模式)
输入"a3yy
解释:引号要结合shift输入,a代表剪贴板a(26个英文字母都可以),3yy当然代表从当前行复制3行了
退出a.txt
:q
2、打开b.txt
光标移动到你想要复制的位置
进入指令模式,输入"ap
解释:引号要结合shift输入,a代表使用剪贴板a,p当然代表粘贴了
Vim复制到系统剪贴板
怎样在vim的命令行中拷贝,粘贴?
在vim的普通模式下,输入':'进入命令行模式,我们可以在屏幕下方输入我们想让vim执行的命令。有时候,我们需要在命令行中执行拷贝粘贴,
例如:我们想要查找替换正文中的特殊字符,但我们又不知道怎么在命令行中输入这个特殊字符。查找还好说,不一定非要在命令行中输入这个特殊字符,只要把光标放在这个特殊字符上,按'*'向下查找,按'#'向上查找。但是如果我们要替换这个特殊字符,就必须在命令行中输入它了,但是又不知道怎么输入这个特殊字符,怎么办?
答案是拷贝粘贴,先在正文中复制这个字符,然后粘贴在命令行中。
可是怎么在命令行中实现粘贴呢?别急,介绍一个好东西:命令行窗口。在正常模式下,输入'q:',就打开了命令行窗口。命令行窗口中都是我们输入过的命令,在这个窗口中我们可以像编辑正文一样编辑新的命令,或修改旧的命令。因为像编辑普通缓冲区一样,自然可以拷贝粘贴了。编辑完之后,在想要执行的命令上按回车,就ok了。命令执行后,命令行窗口也自动关闭了。
常用快捷键
高效移动
光标移动效率是vim程序员达到甚至超过鼠标流程序员的关键技能。vim中的移动光标的方式有很多,我来举几个我实际使用过程中应用比较频繁的技巧:
set relativenumber(显示相对行号)
。我无意间发现的一个十分实用的技巧,比set number
显示行号更好用。通过这个设置,行号的显示会根据当前的光标的相对位置显示成偏移数,并动态变化。这个好处是,可以利用数字+j
数字+k
来进行多行跳转,因为是编译行数,所以数字不会太大。否则就算要向下移动10行,我们可能也需要用138gg
。
w
、e
、b
:按照单词进行前后光标跳转,也可以组合数字进行跳转,不过以我的经验,与其去算要跳多少个单词,不如多按几次吧。I
、A
:移动到行首或行末的第一个字符处,并进入插入模式。H
、M
、L
:光标分别跳转到可视区域的最上面、中间、最下面。Ctrl+D
、Ctrl+U
:有时,需要看的文本不在可视区域,通过这些组合进行上下翻页。^
、$
、0
:光标移动到行首和行尾(0是绝对行首)。不过因为^
和$
都需要同时按住shift,而且数字键我们往往难以盲打,所以我一般直接使用I+Esc
、A+Esc
。%
:移动到与当前括号匹配的括号处。gj
、gk
:有时可视区域不够宽,而一行的字符有很多,导致了wrap。那么通过jk是无法直观的定位到同一物理行,却不在同一个可视行里的位置,此时需要gj
和gk
。f
、F
:通过上面的例子,我们知道,f
是find的意思,可以在一行内查找某个字符出现的位置,并直接跳转过去。比如f<
可以从当前光标开始向右,找到第一个<
,并移动过去。F是向左查找。;
:重复上一次的f
查找操作.
:重复上一次的修改操作,跟;
可以说是好基友,经常用来实现一些简单的重复操作,比录制宏要简单很多。经常有意识的使用这种简单重复,是vimer编辑思路进阶的分水岭。
高效修改
vim的另一个优势是高效修改。在vim下修改就要改掉传统鼠标流的思维方式,切忌提到修改就按i
。有很多高效的修改办法,而且这些办法往往是可重复的。下面举一些我常用的例子:
r
:替换模式,替换当前光标所在位置的一个字符。虽然你同样可以i
进入插入模式,然后删掉那个字符,再输入需要的字符,但这种操作是鼠标流思维方式。替换是一个可重复操作,多用没坏处。cw
:change word
可以删除从当前位置到一个单词的结尾,并进入插入模式。这种操作常用于修改一个变量。比如对于:int count=0;
希望把count
改成cnt
,那么当光标位于c
字符处的时候,按cw
可直接删除count
,并进入插入模式。然后直接继续输入cnt
即可。caw
:change a word
可以删除当前光标所在位置的单词。对于int count=0;
的例子,如果此时光标在count
中间某处,比如u
处,直接键入caw
可以达到同样的效果。所以caw
更强大一些。c$
、c^
:举一反三,可以猜到c$
是从当前位置删除到行尾,并进入插入模式。ci"
:change inside "
可以用于修改当前位置附近,在相同配对的"
中的内容。比如对于const char *str="hello world";
。当在双引号中间的任意位置键入ci"
可以直接清空字符串,并继续输入新的希望的字符串。ci(
、ci[
:举一反三change inside (
change inside [
。cit
:这个比较特殊,可以直接编辑匹配的xml标签中的内容!经常编写html的童鞋可以熟悉一下。yi"
:yank inside "
猜猜是啥意思?类似ci"
只是把编辑操作编程复制操作,因为y
是复制!是不是很强大。ya"
:yank around "
复制整个字符串,包括双引号。yw
、yaw
、daw
、d$
...:好了,这些可以"发明"出来了。o
、O
:向下向上增加空行u
、Ctrl+r
:undo和redo
上面的例子体现了vim组合的思想,很多命令可以通过组合得到不同的效果。
Linux 编辑 windos 文件特殊字符问题
在linux下,不可避免的会用VIM打开一些windows下编辑过的文本文件。
会发现文件的每行结尾都会有一个^M符号,这是因为 DOS下的编辑器和Linux编辑器对文件行末的回车符处理不一致。
^M字符的来历和作用:
在DOS/Windows里,文本文件的换行符为\r\n,而在*nix系统里则为\n,所以DOS/Windows里编辑过的文本文件到了*nix里,每一行都多了个^M。
所以^M只是一个换行符号,没有实际的用处,我们可以将它保留,也可以将它删除。
对于回车符的定义:
比较快捷的去除这些符号的方法有这么几种:用vim时,想高亮显示一个单词并查找的方发,将光标移动到所找单词.
1: shift + "*" 向下查找并高亮显示
2: shift + "#" 向上查找并高亮显示
3: "g" + "d" 高亮显示光标所属单词,"n" 查找!
一般指令模式
移动游标
按键 | 说明 |
---|---|
h 或向左方向键 | 游标向左移动一个字元 |
j 或向下方向键 | 游标向下移动一个字元 |
k 或向上方向键 | 游标向上移动一个字元 |
l 或向右方向键 | 游标向右移动一个字元 |
[ctrl]+[f] | 屏幕向下移动一页,相当于[Page Down](常用) |
[ctrl]+[b] | 屏幕向上移动一页,相当于[Page Up](常用) |
[ctrl]+[d] | 屏幕向下移动半页 |
[ctrl]+[u] | 屏幕向上移动半页 |
n+[Space] | n 表示数字,按下数字后再按空格键,游标会向右移动到这一行的第 n 个字元。 |
功能键[Home]或 0 | 游标移动到这一行的第一个字元处 |
功能键[End]或 $ | 游标移动到这一行的最后一个字元处 (常用) |
H | 游标移动到这个屏幕最上方那一行的第一个字元 |
M | 游标移动到这个屏幕中央那一行的第一个字元 |
L | 游标移动到这个屏幕最下方那一行的第一个字元 |
G | 游标移动到这个档案的最后一行 (常用) |
nG | n 为数字。游标移动到这个档案的第 n 行 |
gg | 游标移动到这个档案的第一行 (常用) |
n+[Enter] | n 为数字。游标向下移动 n 行 (常用) |
搜索与取代
按键 | 说明 |
---|---|
/word | 在当前游标所在位置往下寻找关键字为 word 的字符串 (常用) |
?word | 在当前游标所在位置往上寻找关键字为 word 的字符串 |
n | 这里的 n 是按键 n。代表重复前一个搜索动作 |
N | 这里的 N 是按键 N。功能与 n 相反,代表反向执行前一个搜索动作 |
:n1,n2s/word1/word2/g | n1 与 n2 都为数字,表示行数。可在第 n1 行与第 n2 行之间寻找 word1 字符串,并替换为 word2 (常用) |
:1,$s/word1/word2/g | 表示从第一行到最后一行,将 word1 字符串替换为 word2 (常用) |
:1,$s/word1/word2/gc | 表示从第一行到最后一行,也是将 word1 字符串替换为 word2,不同之处是在替换前显示提示字元,由用户确认是否最终替换 (常用) |
注意: 使用 /word 的同时,配合使用 n 或者 N,搜索可以变得很方便的啦 :)
删除、复制以及粘贴
按键 | 说明 |
---|---|
[Del] 或 x | 向后删除一个字元 (常用) |
X | 向前删除一个字元 (常用) |
nx | n 为数字,表示连续向后删除 n 个字元 |
dd | 删除游标所在的那一行 (常用) |
ndd | n 为数字,删除游标所在的那一行往下数 的 n 个行 (常用) |
d1G | 删除游标所在的那行到第一行的所有数据 |
dG | 删除游标所在的那行到最后一行的所有数据 |
d$ | 删除游标所在处到该行的最后一个字元 |
d0 | 是数字 0,删除游标所在处到该行的第一个字元 |
yy | 复制游标所在的那一行 (常用) |
nyy | n 为数字, 复制游标所在的那一行往下数 n 行 (常用) |
y1G | 复制游标所在行到第一行的所有数据 |
yG | 复制游标所在行到最后一行的所有数据 |
y0 | 复制游标所在的字元到该行行首的所有数据 |
y$ | 复制游标所在的字元到该行行尾的所有数据 |
p | 将已复制的数据粘贴在游标所在的那一行的下一行 (常用) |
P | 将已复制的数据粘贴在游标所在的那一行的上一行,原来游标所在的那一行会被推后一行 (常用) |
J | 将游标所在的行与下一行的数据合并为一行 |
u | 撤销前一个操作 (常用) |
[ctrl]+r | 重做上一个被撤销的操作 (常用) |
. | 这是小数点,表示重复前一个操作 (常用) |
注意: 最后三个按键乃是神器,熟悉后记得经常使用它们,会让你觉得使用 vim 是一件很快乐的事情哦 :)
一般指令模式切换到编辑模式
按键 | 说明 |
---|---|
:w | 将编辑的文件写入硬盘 (常用) |
:w! | 如果文件为只读状态,可以强制写入硬盘,是否写入成功,与你所拥有的文件权限有关 |
:q | 离开 vi (常用) |
:q! | 即使文件未保存,仍强行离开 vi |
:wq | 文件写入硬盘后(即保存)离开 vi (常用) |
:wq! | 文件强制写入硬盘后(即保存)离开 vi |
ZZ | 大写字母 Z,如果文件没有修改,则直接离开;如果文件被修改,则保存后离开 |
:w [filename] | 将当前文件另存为另一个文件,这个新文件的保存路径为当前路径 |
:r [filename] | 在当前文件中读入另一个文件的数据,插入到当前游标所在列的后面 |
:n1,n2 w [filename] | 将第 n1 行到第 n2 行的数据储存为新的文件 |
:! command | 暂时离开 vi 到指令列模式下执行 command 的显示结果 |
注意: ! 表示强制执行
vim 特有功能
区域选择
按键 | 说明 |
---|---|
v | 字符选择,移动游标,游标经过的地方会反白选择 |
V | 行选择,移动游标,游标经过的行会反白选择 |
[Ctrl]+v | 区块选择,移动游标以长方形方块的方式反白选择 |
y | 复制反白选择的地方 |
d | 删除反白选择的地方 |
p | 将之前复制的区块,粘贴在游标所在处 |
多文件编辑
按键 | 说明 |
---|---|
:n | 编辑下一个文件 |
:N | 编辑上一个文件 |
:files | 列出 vim 所打开的所有文件 |
注意:使用 vim a.txt b.txt … 指令,就能一次打开多个文件
多视窗
按键 | 说明 |
---|---|
:sp [filename] | 开启一个新视窗。如果有加 filename,表示是在新视窗开启一个新文件;否则,表示两个视窗为同一个文件的内容(即同步显示) |
[ctrl]+w+向下方向键 | 先按下[ctrl]不放,然后再按下 w 后放开所有按键,最后再按下向下方向键,游标就会移动到下方的视窗 |
[ctrl]+w+向上方向键 | 按键方法同上,游标会移动到上方的视窗 |
[ctrl]+w+q | 关闭当前游标所在的视窗 |
补齐
按键 | 说明 |
---|---|
[ctrl]+x -> [ctrl]+n | 依据目前正在编辑的文件内容作为关键字,予以补齐(语法依据副档名) |
[ctrl]+x -> [ctrl]+f | 依据当前目录下的文件名,予以补齐 |
[ctrl]+x -> [ctrl]+o | 以副档名作为语法关键字,予以补齐 |
环境设定参数
按键 | 说明 |
---|---|
:set nu | 设定行号 |
:set nonu | 取消行号 |
:set hlsearch | 搜索到的关键字反白显示 (默认) |
:set nohlsearch | 搜索到的关键字取消反白显示 |
:set autoindent | 自动缩排 (默认) |
:set noautoindent | 不自动缩排 |
:set backup | 自动存储备份档(备份档名为 filename~) |
:set ruler | 显示右下角状态说明 |
:set showmode | 显示左下角状态说明(比如 INSERT) |
:set backspace=(012) | 倒退键设置;2:可以删除任意值;0 或者 1,仅可删除刚刚输入的字符,无法删除原来就存在的字符 |
:set all | 显示所有环境参数设定值 |
:set | 显示与系统默认值不同的设定值 |
:syntax on | 开启语法着色 |
:syntax off | 关闭语法着色 |
:set bg=dark | 开启语法着色深色方案 |
:set bg=light | 开启语法着色浅色方案 (默认) |