当前位置 : 首页 » 文章分类 :  开发  »  VIM

VIM

VIM使用笔记

vim官网
https://www.vim.org/

简明 VIM 练级攻略(Learn Vim Progressively的翻译)
https://coolshell.cn/articles/5426.html

Learn Vim Progressively
http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/

Vim 简明教程
http://blog.decaywood.me/2016/09/15/vim/

vim简明教程–半小时从入门到精通
https://blog.csdn.net/qccz123456/article/details/52677930

vim 默认使用utf-8编码


概述

vi编辑器有3种模式:命令模式、输入模式、末行模式。

普通模式(Normal mode)
vi启动后默认进入的是命令模式,从这个模式使用命令可以切换到另外两种模式,同时无论在任何模式下只要按一下 esc 键或 Ctrl+[ 都可以返回命令模式。在命令模式中输入字母 i 就可以进入vi的输入模式编辑文件。在vim的Normal模式下,所有的键都是功能键。

插入模式(Insert mode)
在这个模式中我们可以编辑、修改、输入等编辑工作,在编辑器最后一行显示一个“–INSERT–”标志着vi进入了输入模式。当我们完成修改输入等操作的时候我们需要保存文件,这时我们需要先返回命令模式,在进入末行模式保存。

命令行模式(Command line mode)
在命令行模式中可以输入会被解释成并执行的文本。例如执行命令(:键),搜索(/和?键)或者过滤命令(!键)。在命令执行之后,Vim返回到命令行模式之前的模式,通常是普通模式。


普通模式(Normal mode)

剪切d/delete

用d命令删除的内容都会保存到剪切板,所以其实d命令是剪切命令

dd:删除光标所在行,并把删除的行存到剪贴板里
ndd:从当前行开始向下剪切n行,例如3dd就是从当前行开始向下剪切三行

dw:从光标处(包含光标下字符)剪切至下一个单词的开头(不包含开头字母),或者说从光标处剪切到当前单词末尾(若词尾有空格则包含空格)
de:从光标处(包含光标下字符)剪切至当前单词的末尾

daw:删除光标所在单词,包括单词前后的空白
diw:删除光标所在单词,不包括单词前后的空白

dp:剪切光标所在段落,不包括段落前后的空行,等于dip
dip:剪切光标所在段落,不包括段落前后的空行
dap:剪切光标所在段落,包括段落后的空行

d%:匹配括号剪切,当光标在{[()]}括号下且有匹配的括号时才能用

dl:剪切光标下的字符,等于x
d3l:从光标位置(包括光标位置)向右剪切3个字符

d$:从当前光标位置(包含光标下字符)剪切到行尾,等于大写D
D:从当前光标位置(包含光标下字符)剪切到行尾,等于d$
d^:从当前光标位置(不包含光标下字符)剪切到行首第一个非空字符位置
d0:从当前光标位置(不包含光标下字符)剪切到行首

dh:剪切光标前的单个字符(不包括光标下的字符)
d3h:从光标位置(不包括光标位置)向左剪切3个字符

d3B:从当前光标位置(不包括光标位置)反向剪切3个单词

dgg:从当前行(包括当前行)剪切到第一行,等于d1G
d1G:从当前行(包括当前行)剪切到第一行,等于dgg
dG:从当前行(包括当前行)剪切到最后一行
d5G:将当前行(包括当前行)至第5行(不包括它)剪切

dH:剪切从当前行至所显示屏幕顶行的全部行
dL:剪切从当前行至所显示屏幕底的全部行

dta:从当前光标位置(包括光标下字符)开始剪切直到遇到字符a(不包括字符a)

拷贝y/yank

yy:复制当前整行的内容到vi缓冲区
Y:大写,复制当前整行的内容到vi缓冲区
nyy:复制包括当前行在内的往下共n行,例如5yy就是复制5行

yw:从光标处(包含光标下字符)复制至下一个单词的开头(不包含开头字母),或者说从光标处复制到当前单词末尾(若词尾有空格则包含空格)
ye:从光标处(包含光标下字符)复制至当前单词的末尾
nyw:例如2yw就是复制两个单词

yaw:复制光标所在单词,包括单词前后的空白
yiw:复制光标所在单词,不包括单词前后的空白

yp:复制光标所在段落,不包括段落前后的空行,等于dip
yip:复制光标所在段落,不包括段落前后的空行
yap:复制光标所在段落,包括段落后的空行

y%:匹配括号复制,当光标在{[()]}括号下且有匹配的括号时才能用

yl:复制光标位置下的单个字符, ylp:复制光标下的单个字符并黏贴到光标后
y3l:从光标位置(包括光标位置)向右复制3个字符

y$:从当前光标位置(包含光标下字符)复制到行尾
y^:从当前光标位置(不包含光标下字符)复制到行首第一个非空字符位置
y0:从当前光标位置(不包含光标下字符)复制到行首

yh:复制光标前的单个字符(不包括光标下的字符), yhp:复制光标前的单个字符并黏贴到光标后
y3h:从光标位置(不包括光标位置)向左复制3个字符

y3B:从当前光标位置(不包括光标位置)反向复制3个单词

ygg:从当前行(包括当前行)复制到第一行,等于y1G
yG:从当前行(包括当前行)复制到最后一行
y1G:从当前行(包括当前行)复制到第一行,等于ygg
y5G:将当前行(包括当前行)至第5行(不包括它)复制

ggyG:复制全部,先gg到达第一行,再y复制,再G选择范围到最后一行

yH:复制从当前行至所显示屏幕顶行的全部行
yL:复制从当前行至所显示屏幕底的全部行

yta:从当前光标位置(包括光标下字符)开始复制直到遇到字符a(不包括字符a)

如果要复制第m行到第n行之间的内容,可以在末行模式中输入 m,ny 例如: 3,5y 复制第三行到第五行内容到缓存区。

更改c/change

c的意思是change,效果等于先d剪切再进入输入模式

cc:剪切当前行并进入插入模式
ncc:从当前行开始向下剪切n行后进入插入模式,例如3dd就是从当前行开始向下剪切三行后进入插入模式

cl:剪切光标所在字符并进入插入模式

cw,ce:剪切从光标所在位置(包括光标所在字符)到下一个单词词首的字符并进入插入模式

caw:剪切光标所在单词并进入插入模式

替换r/replace

比如现在就想修改一个字符,有没有更快的方法,别让我来回esc了,比如就想将vaid中的a改成o,这时可以使用替换
rx: 替换光标下的字符为x,不进入插入模式
R:r只是替换一个字符,输入R后可以一直在替换模式,直到按下esc退出为止

黏贴p/paste

p:小写p,粘贴到当前位置之后(下)
P:大写P,黏贴到当前位置之前(上)

单字符剪切x

x:剪切光标处的单个字符,等于dl
nx:例如3x剪切光标处向右的三个字符

撤销u

u:小写u,取消最近一次的操作,可以使用多次来恢复原有的操作
U:大写u,取消所有操作
Ctrl+R:可以恢复对使用u命令的操作


重复命令

.:英文点,可以重复上一次的命令
N<command>:重复某个命令N次,
例如
2dd:删除2行
3p:黏贴3次
100i重复 [Esc]:重复输入100次”重复 “,先在Normal模式下输入100表示重复次数,然后按i进入插入模式输入要重复的字符串,最后按Esc回到Normal模式使重复输入生效


大小写转换(gu/gU/~)

vim中大小写转化的命令是 gu 或者 gU
形象一点的解释就是小u意味着转为小写;大U意味着转为大写.
剩下的就是对这两个命令的限定(限定操作的行,字母,单词)等等

gggUG:整篇文章小写转化为大写
ggguG:整篇文章大写转化为小写
解释一下:ggguG分作三段gg gu G
gg=光标到文件第一个字符
gu=把选定范围全部小写
G=到文件结束

gUl:将当前光标下的字符设为大写
gul:将当前光标下的字符设为小写

guw, gue:将光标后(包括光标下字符)到单词词尾的字符转为小写
gu3w, gu3e:将光标后(包括光标下字符)到3个单词词尾的字符转为小写
gUw, gUe:将光标后(包括光标下字符)到单词词尾的字符转为大写
gU3w, gU3e:将光标后(包括光标下字符)到3个单词词尾的字符转为大写

guaw:将当前光标所在单词转为小写
gUaw:将当前光标所在单词转为大写

1gU:从光标所在行 往下一行都进行小写到大写的转换
10gU,则进行从当前行开始的11行小写到大写的转换
以此类推,就出现其他的大小写转换命令
gU0:从光标所在位置到行首,都变为大写
gU$:从光标所在位置到行尾,都变为大写
gUG:从光标所在位置到文章最后一个字符,都变为大写
gU1G:从光标所在位置到文章第一个字符,都变为大写

~:将光标下的字母改变大小写
3~:将光标位置开始的3个字母改变其大小写
g~~:改变当前行字母的大小写
U:将可视模式下选择的字母全改成大写字母
u:将可视模式下选择的字母全改成小写


区域选择

Text object selection
http://vimdoc.sourceforge.net/htmldoc/motion.html#object-select

<action>a<object><action>i<object>
a选择区域及前后的空白,i选择区域但不包含前后的空白
action可以是任何的命令,如 d (删除), y (拷贝), v (可以视模式选择)。
object 可能是: w 一个单词, W 一个以空格为分隔的单词, s 一个句字, p 一个段落。也可以是一个特别的字符:”、 ‘、 )、 }、 ]。

例如
daw:删除光标所在单词,包括单词前后的空白
yaw:复制光标所在单词,包括单词前后的空白
vaw:选中光标所在单词,包括单词前后的空白
vap:选中光标所在段落,包括段落后的空白

diw:删除光标所在单词,不包括单词前后的空白
yiw:复制光标所在单词,不包括单词前后的空白
viw:选中光标所在单词,不包括单词前后的空白
vip:选中光标所在段落,不包括段落前后的空白


进入插入模式

i插入(光标前i/行首I)

i:在光标前插入
I:大写i,在当前行首插入

a插入(光标后a/行尾A)

a:在光标后插入
A:大写a,在当前行尾插入

o插入(行前O/行后o)

o:小写字母o,在当前行后插入一个新行并进入插入模式
O:大写字母O,在当前行前插入一个新行并进入插入模式


可视化选择v

自由选择v

v:按v开始可视化选择
用hjkl或方向键、0或$、或其他光标移动方法来移动光标
对选中区域进行操作:例如x删除、d剪切、y拷贝、c修改、r替换、u改小写、U改大小

快速选中一个单词:光标移动到单词的开头,按 v 按e
快速选中并复制粘贴替换一个单词:光标移动到单词A的开头,按 v 按 e 按 y 复制单词A,光标移动到单词B的开头,按 v 按 e 按 p 黏贴并替换单词B

按行选择Shift+v

V:大写v,或shift+v,开始按行选择
上下移动光标进行选择
对选中区域进行操作:例如x删除、d剪切、y拷贝

按列选择Ctrl+v(Ctrl+q)

ctrl+v:开始列选择
在 Windows 版本的 Vim 中,键组合 ctrl-v通常被映射为文本粘贴,所以 Window 版的 Vim 的纵向编辑模式由 ctrl-q启动
用hjkl或方向键、0或$、或其他光标移动方法来移动光标
对选中区域进行操作:例如x删除、d剪切、y拷贝

按区域选择a/i

vaw:选中光标所在单词,包括单词前后的空白
viw:选中光标所在单词,不包括单词前后的空白

vap:选中光标所在段落,包括段落后的空白
vip:选中光标所在段落,不包括段落前后的空白

在所有行的选中区域前/后插入(I/A)

可以按行选择,选择多行后,按I在所有行首插入,A在所有行尾插入
也可以按列选择,选择好多行的指定列块范围后,按I在所有行的选中区域前插入,A在所有行的选中区域后插入

把所有选中行串接为一行J

J:大写j,可视化选择多行后,按J把所有的行连接起来变为一行


移动光标

Vim中如何快速进行光标移动?
https://harttle.land/2015/11/07/vim-cursor.html

行内移动

0:数字零,到行头
^:到本行第一个非空字符的位置(所谓空字符就是空格,tab,换行,回车等)
$:到本行行尾
g_:到本行最后一个非空字符的位置。

fa:到本行下一个为a的字符处,你也可以 f# 到下一个为 # 的字符
Fa:到本行上一个为a的字符处,a可换为其他字符
ta:到本行下一个字符a的前一个字符处,a同样可换为其他字符
Ta:到本行上一个字符a的后一个字符处,a同样可换为其他字符
3fa:到本行光标后第3个a处

上下左右hjkl

hjkl:使用hjkl代替箭头移动光标,h左,j下,k上,l右
hjkl命令前都可以加数字前缀,比如
2j:向下移动2行
2h:向左移动2个字符

按行移动(g/G)

gg:到第1行
G:到最后一行
NG:到第N行,例如30G到第30行
:N:到第N行,例如:30到第30行

按单词移(w/e/b/ge)

w:移动光标到下一个单词的词首。
e:移动光标到当前单词末尾,如果当前光标位置就是词尾则移动到下一个单词的词尾。
b:移动光标到当前单词词首,如果当前光标位置就是词首则移动到上一个单词的词首。
ge:移动光标到上一个单词的词尾。

3w:移动到向后第3个单词的词首(相当于按3次w)。

W:移动光标到下一个单词(以空白分隔)的开头。
E:移动光标到下一个单词(以空白分隔)的结尾。

小写的w,e,b认为单词由字母、数字和下划线组成,即程序变量
大写的W,E,B以空白(空格、回车、table)来分隔单词,一次可以移动的更远。

相对屏幕移动

Ctrl+f:向下翻页
Ctrl+b:向上翻页

Ctrl+e:逐行向下滚动
Ctrl+y:逐行向上滚动

H:移动到屏幕的首行
L:移动到屏幕的尾行
M:移动到屏幕的中间

zt:置顶当前行,通常用来查看完整的下文,比如函数、类的定义。
zz:将当前行移到屏幕中部
zb:将当前行移到屏幕底部

匹配括号%

%:匹配括号移动,包括 (, {, [
注:你需要把光标先移到括号上

匹配单词#*

*:匹配光标当前所在的单词,移动光标到下一个匹配的单词
#:匹配光标当前所在的单词,移动光标到上一个匹配的单词

/向后查找

/pattern:向后查找pattern,回车后光标到达匹配处,按n到下一个,按N到上一个。

/\Cpattern/pattern \C:区分大小写查找pattern
/\cpattern/pattern \c:不区分大小写查找pattern

?向前查找

?pattern:向前搜索pattern,回车后光标到达匹配处,按n到更前一个,按N到后一个,和/向后搜索后的操作正相反


命令模式(Command line mode)

:help command:h command:显示相关命令的帮助
例如 :h d, :h daw 会打开vim doc网页,可搜索任何可能的组合命令
http://vimdoc.sourceforge.net/

保存和退出

:e:放弃所有修改,从上次保存文件开始再编辑(重新载入文件,包含被其它编辑器修改过的)

跳转到指定行

:N:到第N行,例如:30到第30行
:$:到最后一行


分屏

创建分屏
:split:sp:创建水平分屏
:vsplit:vsp:创建垂直分屏

切换分屏
ctrl+w+<dir>:dir就是方向,可以是 hjkl 或是 ←↓↑→ 中的一个,其用来切换分屏

关闭分屏
ctrl+w+c:关闭当前分屏


显示行号

:set number:set nu:显示行号
:set nonumber:set nonu:不显示行号

搜索大小写敏感设置

:set ic:set ignorecase (ic是ignore case) 忽略大小写
:set noic:set noignorecase 不忽略大小写
:set ignorecase smartcase,如果模式全是小写,就是大小写不敏感的;如果模式里至少有一个大写字母,查找就成了大小写敏感的。可以这样理解,你不必键入大写字母,也能查找到含有大写字母的词,所以,你若键入大写字母,必然是因为你要大小写敏感的匹配。聪明!

bomb乱码<feff>

在vim中,当set bomb打开时,并且fileencoding是utf-8或ucs-2或ucs-4时,BOMB标识会被写到文件开头。
可以用set bomb?查看bomb选项是否被打开,用set nobomb关闭bomb选项。
gcc不能识别bomb,编译时会报错,所以程序源文件中应该将bomb标识删掉。

set ff
fileformat[ff] (Vim 才有)
这是写入档案时置放行结束符EOL(end of line) 的形式
dos 是以 0x0D0A 来断行。
unix/linux 是以 0x0A 来断行。
mac 是以 0x0D 来断行。
unix LF only (each line ends with an LF character).
dos CRLF (each line ends with two characters, CR then LF).
mac CR only (each line ends with a CR character)

即,unix/linux使用 换行符;而dos/windows使用 回车+换行
dos格式读取unix格式文件没有问题。unix读取dos格式文件,会出现^M。它会使某些脚本执行出错,会让你看起来不爽。vim本身是会自动判断文件格式的。


插入模式(Insert mode)

自动提示
在 Insert 模式下,你可以输入一个词的开头,然后按 ctrl+p或是ctrl+n,自动补齐功能就出现了

在插入模式下,可以使用bash快捷键加快编辑速度

熟悉 Bash 快捷键来提高效率
https://harttle.land/2015/11/09/bash-shortcuts.html


vim键盘图


vim键盘图

.vimrc配置

在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号、语法高亮度显示、智能缩进等功能的。
为了更好的在vim下进行工作,需要手动设置一个配置文件:~/.vimrc
在启动vim时,当前用户根目录下的.vimrc文件会被自动读取,该文件可以包含一些设置甚至脚本

vim打开vimrc文件:vim ~/.vimrc

"双引号开始的行为注释行,下同
"去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限
set nocompatible
"显示行号
set number
"检测文件的类型
filetype on
"记录历史的行数
set history=1000
"背景使用黑色
set background=dark
"语法高亮度显示
syntax on
"下面两行在进行编写代码时,在格式对起上很有用;
"第一行,vim使用自动对起,也就是把当前行的对起格式应用到下一行;
"第二行,依据上面的对起格式,智能的选择对起方式,对于类似C语言编
"写上很有用
set autoindent
set smartindent
"第一行设置tab键为4个空格,第二行设置当行之间交错时使用4个空格
set tabstop=4
set shiftwidth=4
"设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号
set showmatch
"去除vim的GUI版本中的toolbar
set guioptions=T
"当vim进行编辑时,如果命令错误,会发出一个响声,该设置去掉响声
set vb t_vb=
"在编辑过程中,在右下角显示光标位置的状态行
set ruler
"默认情况下,寻找匹配是高亮度显示的,该设置关闭高亮显示
set nohls
"查询时非常方便,如要查找book单词,当输入到/b时,会自动找到第一
"个b开头的单词,当输入到/bo时,会自动找到第一个bo开头的单词,依
"次类推,进行查找时,使用此设置会快速找到答案,当你找要匹配的单词
"时,别忘记回车
set incsearch
"修改一个文件后,自动进行备份,备份的文件名为原文件名加"~"后缀
if has("vms") "注意双引号要用半角的引号" "
set nobackup
else
set backup
endif

我常用的~/.vimrc配置

set nocompatible
set number
filetype on
set history=1000
set background=dark
syntax on

"set autoindent
"set smartindent

set tabstop=4
set shiftwidth=4
set showmatch
set guioptions=T
set ruler
set incsearch

langsim/vim-pretty (同事开源的vim改进版)
https://github.com/langsim/vim-pretty


上一篇 Spring-Cache

下一篇 SLF4J