本文记录了一些常用的 vim 的快捷键以及一些配置 vimrc 的方法
在普通模式下
进入写入模式
i :光标停在当前字符
I :光标停在当前行首
a :光标停在当前字符的下一个字符
A :光标停在当前行尾
o :在当前字符的下一行创建一空行并将光标停在行首
O :在当前字符的上一行创建一空行并将光标停在行首
文本操作
u :撤销一次更改
s :删除当前字符并进入写入模式
yy :复制当前行
dd :剪切当前行,可用来当作删除功能
p :粘贴到光标所在行的下一行
P :粘贴到光标所在行的上一行
x :删除当前光标下的字符
Ctrl+r :恢复更改
c :删除并进入写入模式
gg :定位到文件第一行行首
G :定位到文件最后一行行首
0 :定位到行首
^ :定位到行首
$ :定位到行尾
文件操作
:w :保存文件所作更改
:q :当文件已保存或未更改时,此命令可直接退出文件
:q! :强制退出,不管是否保存文件
:wq :保存退出文件
光标移动
h :向左移动一个字符
l :向右移动一个字符
j :向下移动一行
k :向上移动一行
w :移动到下一个单词开头
b :移动到上一个单词开头
在写入模式下
Esc :进入普通模式
方向键 :光标移动
以上属于基础键位命令,下面在家目录下新建一个 .vim文件夹,在文件夹中新建一个 vimrc 文件,开始进行配置(一些其它的常用命令会在这里提到)
在 vim 的配置中,是允许用户自定义键位的,格式如下:(map、noremap等的区别)
noremap a b
这个语句的意思是,将 a 映射到 b,意思是用户按下 a 键后,vim 会认为用户 按了 b 键
在 vimrc 中,以 " 开头的为注释行
在 vimrc 中加入下面一条语句:
map S :w< CR >
这条语句的意思是将 S 映射为了 :w,即在普通模式下按下 S 相当于按下了 :w 然后回车( < CR > 表示回车),就起到了保存文件的效果 (当然,读者可以自行改为 Ctrl+s,一般保存文件都是这个组合键,注意区分大小写,格式为:
map < C-s > :w< CR >)
以下命令可以取消 s 键的命令:( s 键是删除当前字符并进入写入模式,我并不希望有这个命令)
map s < nop >
nop :no operation
值得提醒的是,当修改过配置文件后都应该退出重新进入配置文件,更改才会生效,但 vim 中还有一个重新加载配置文件的命令,在普通模式下输入 :source $MYVIMRC 然后回车,当然,这样的命令也可以设定一个快捷键
下面给出一些基本的设置:
" 设置 LEADER 键为空格,LEADER 键类似于 Windows 键,默认为 /
let mapleader=" "
" Q 退出
map Q :q< CR >
" R 重新加载配置文件
map R :source $MYVIMRC< CR >
" H 向左移动五个字符
noremap H 5h
" J 向下移动五行
noremap J 5j
" K 向上移动五行
noremap K 5k
" L 向右移动五个字符
noremap L 5l
" 代码高亮
syntax on
" 显示按下的指令
set showcmd
" 显示行号
set number
" 显示当前行行号,其它行的行号都是以当前行为基准从 1 开始增加(即相对行号)
set relativenumber
" 在当前光标所在行显示下划线
set cursorline
" 在普通模式下输入 : 后可以输入指令,按下tab可补全
set wildmenu
" 搜索结果高亮
set hlsearch
" 搜索过程也高亮
set incsearch
" 忽略大小写搜索
set ignorecase
" 智能大小写
set smartcase
vim 的编辑操作
一个指令包含一个操作和一个动作
所谓操作就是一些文本编辑操作,比如 d–剪切,y–复制等等,动作就是指出你想做什么
比如要删除光标所在字符的左边三个字符可以按下指令:d3l,在这条指令中,d 表示操作,删除,3l 表示一个动作,即向右三个,值得注意的是,在普通模式下直接按下 3l 的话光标会往右移动三个字符,这其实也算是一条指令,而两个相同的操作一起按的话表示对这一行操作,比如 dd ,删除一行,d3d,删除三行
c 指令,change,更改并进入写入模式,cw 更改(删除)一个单词并进入写入模式,但这个指令是将光标所在字符的后面删除,即如果有一个单词 motion,此时光标在 t 处,按下 cw 的话会删除 tion 并进入写入模式,更好地指令是 **ciw **,change in word,可以改变整个单词,不管光标在哪
i 指令,在什么中,配合 c 指令不仅能改变单词,假设有一个文本 “Hello World!”,现在想把引号中的词全部改变并进入写入模式,可以输入如下指令:ci",这个指令表示 change in ",更改引号内文本,当然引号可以改成其它成对出现的符号,在实际使用中是非常常用的,当然,不仅仅可以配合 c 指令,其它的指令也是一样的,比如 yi",表示复制双引号之间的文本
f 指令,find,它会将光标定位到当前行的第一个指定字符上,比如文本
Hello vim,光标停留在 H 上,此时按下指令 fv,它会自动将光标定位到字符 v上,也可以配合 c 指令来更改,比如光标还是在 H 上,此时按下指令 cfv,会一直删除到字符 v (包括)的位置并进入写入模式
vim 搜索操作
在普通模式下按 / + 搜索内容 回车即可在文件内搜索文本,可按 n 和 N 切换
vim 可视模式
可视模式的作用类似于在一个有鼠标支持的文本文件中使用鼠标选中一部分文本,然后对它们进行操作在 vim 中进入可视模式就可以做到这一点
在普通模式下按 v 即可进入可视模式,且左下角会有显示 visual,此时在移动光标可以选中一些文本,此时可以对它们整体进行你在普通模式下可进行的操作,比如进入可视模式之后选中一块文本,按下 d 即可删除这写文本
在普通模式下按下 V 即可进入可视行模式,此时选中的文本都是以行为单位的,同时,可以选中几行文本然后按下 :normal,后面输入一条普通模式下的指令,那么它会帮你在每一行都执行相同的指令,比如我想在选中的文本开头加上一行 My-Vim,可先进入可视行模式选中文本,然后输入下列指令::normal IMy-Vim,I 表示从行首进入写入模式,然后输入了 My-Vim,即可达到效果
在普通模式下按下 Ctrl-v 即可进入可视块模式,此时移动光标可以选中一块文本,执行指令可对选中的一块文本执行
在可视模式中,按两下 **< Esc >**即可退出可视模式进入普通模式
vim 分屏操作
在普通模式下输入 :split 可以上下分屏,同时光标会在上面的屏幕,:vsplit可以左右分屏,光标会停留在左边,使光标停在右边的指令是 :set splitright,然后再输入分屏指令,但是这样太麻烦了,可以修改键位:map sl :set splitright< CR >:vsplit< CR > ,设置完成后,在普通模式下按 sl即可分屏并且使光标停留在右边屏幕。同理可设置其他几个方向:
" 向右分屏
map sl :set splitright< CR >:vsplit< CR >
" 向左分屏
map sh :set nosplitright< CR >:vsplit< CR >
" 向上分屏
map sk :set nosplitbelow< CR >:split< CR >
" 向下分屏
map sj :set splitbelow< CR >:split< CR >
分屏之后可以使用指令来打开新的文件,**:e ** + 文件路径,可以打开一个新文件,并且使用 < Ctrl-w > + 方向键在两个文件之间切换光标,三个键也太麻烦了,可以通过改键来方便移动:
" 光标向左边文件移动
map < LEADER >h < C-w >h
" 光标向右边文件移动
map < LEADER >l < C-w >l
" 光标向上边文件移动
map < LEADER >k < C-w >k
" 光标向下边文件移动
map < LEADER >j < C-w >j
< LEADER > 在上面 map 成了空格键,这样按起来就很方便了
分屏解决了之后还要考虑每个屏幕的大小,可以使用指令 :res +5 来增加当前屏幕的上下宽度 5,:vertical resize +5 增加当前屏幕的左右宽度5,同样可以自定义快捷键:
" 方向键 上 使上下屏幕增加 5 个宽度
map < Up > :res +5
" 方向键 下 使上下屏幕减少 5 个宽度
map < Down > :res -5
" 方向键 右 使左右屏幕增加 5 个宽度
map < Right > :vertical resize+5
" 方向键 左 使左右屏幕减少 5 个宽度
map < Left > :vertical resize-5
注意:设置完这些快捷键之后在普通模式下就不能使用方向键来移动光标了,只能使用 hjkl,读者可按照自己偏好来设置
vim 标签
如果你想在 vim 中再打开一个文件,除了可以使用分屏命令之外,还可以使用标签命令,并且使用标签打开的文件是占满整个屏幕的,在普通模式下输入指令 :tabe 回车即可打开一个新标签,默认光标会定位在新文件,使用指令 :-tabnext 回车可使光标向左边移动一个标签页,:+tabnext 回车可使光标向右移动一个标签页:
" 增加新标签页
map tu :tabe< CR >
" 左右移动标签页
map th :-tabnext< CR >
map tl :+tabnext< CR >