@Author: Basil Guo @Date: Mar. 26, 2019 @Description: Vi/Vim 的命令以及基础使用
1. 基础
查看vimrc
读取顺序:在vim打开的文件中输入:version
或者vim --version
可以看到最后的读取顺序:
$ vim --version
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Oct 13 2020 15:49:09) # 版本信息
Included patches: 1-1453 # 补丁包,确切的版本号是8.0.1453
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Huge version with GTK3 GUI. Features included (+) or not (-): # 是否支持GUI,这里是支持。VIM特性集合分为Tiny、Small、Normal、Big以及Huge
... # 特性列表,+是支持,-是不支持,不同特性集合启用了不同的特性
system vimrc file: $VIM/vimrc # VIM的vimrc读取顺序
user vimrc file: $HOME/.vimrc
2nd user vimrc file: ~/.vim/vimrc
user exrc file: $HOME/.exrc
system gvimrc file: $VIM/gvimrc
user gvimrc file: $HOME/.gvimrc
2nd user gvimrc file: ~/.vim/gvimrc
defaults file: $VIMRUNTIME/defaults.vim
system menu file: $VIMRUNTIME/menu.vim
fall-back for $VIM: /usr/share/vim
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -Wdate-time -g -O2 -fdebug-prefix-map=/build/vim-EfP9JP/vim-8.0.1453=. -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: gcc -Wl,-E -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -ldl -L/usr/lib -llua5.2 -Wl,-E -fstack-protector-strong -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/perl/5.26/CORE -lperl -ldl -lm -lpthread -lcrypt -L/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu -lpython3.6m -lpthread -ldl -lutil -lm -L/usr/lib/x86_64-linux-gnu -ltcl8.6 -ldl -lz -lpthread -lm
相关帮助:
$ vim filename
:h :version
:h feature-list
:h +feature-list
:h hash-patch
VIM备忘录 VIM-cheat-sheet
- vim cheat sheet
- vim cheat sheet
- vim cheat sheet
- vim cheat sheet
vim小技巧:
- vim有三种模式:Normal、Command、Insert。
.
:重复上一条命令%
:括号之间配对mx
:m是标记,x是a-z之间的任意一个字母,后续返回到标记::x
,x是之前的标记。删除行会取消标记,重复使用字母将会取消原标记,添加新标记v
:可视模式,从当前光标开始选择V
:可视行模式,从当前行开始选择Ctrl+v
:可视块模式,从当前列开始选择
2.文件
2.1 打开文件
vim FILENAME [FILENAME2 ...]
:打开文件,如果不存在则创建文件,可以一次性打开多个,需要跳转则使用:next
跳转到下一个文件,:prev
跳转到上一个文件,使用:last
跳转到最后一个文件,:first
跳转到第一个文件vim FILENAME +LINE_NUM
,打开之后定位到这一行vim FILENAME +
:只有+,定位到文件末尾vim FILENAME +/PATTERN
: 打开文件,定位至第一次被PATTERN
匹配到的行的行首
2.2 关闭文件
2.2.1 末行模式关闭文件
:q
: 退出:qa
:退出打开的多个文件:wq
: 保存并退出:x
:保存并退出:q!
: 不保存并退出:w
: 保存:w!
: 强行保存:w !sudo tee %
:只读下保存修改后的文件ZZ
: 命令模式下保存并退出
2.3 分屏
vim -o FILENAME1 FILENAME2 [...]
水平分割显示vim -O FILENAME1 FILENAME2 [...]
垂直分割显示
分屏基于Ctrl+w
,w代表window,在此基础上,即按过Ctrl+w
之后松开,
-
s
:水平分割窗口 -
v
:垂直分割窗口 -
w
:按顺序切换窗口 -
h|j|k|l
:也可以使用ARROW方向键进行窗口切换 -
r
:reverse,互换窗口,只有两个的时候可用 -
c
:close,关闭窗口,但是不能关闭最后一个窗口 -
q
:quit,退出当前窗口,如果是最后一个窗口,则关闭vim,qa
关闭所有窗口 -
o
:other,关闭其它文件 -
:e .
:查看当前目录有哪些文件。需要先保存才能打开另一个文件。 -
:e <path/to/file>
:命令模式下打开新的文件 -
:n filename
:新建文件并切换。 -
:n
:打开多个文件时,打开下一个文件,不能循环 -
:bp
:打开多个文件时,打开上一个文件,可以循环 -
:bn
:打开多个文件时,打开下一个文件,可以循环 -
:r filename
:从另一个文件中读取其内容粘贴到当前光标下。 -
:w filename
:相当于另存为,不会切换文件。 -
:START,ENDw /path/to/file
:只另存某些行到一个新的文件。 -
:saveas <path/to/file>
:另存为 -
:sp [filename]
:上下分屏,不写文件名,分的是当前文件 -
:vsp [filename]
:左右分屏,同上。
不过VIM的分屏我觉着不好用,一般我都是使用tmux。
3. 基础使用
3.1 移动光标
3.1.1 逐字符
k
:↑,简记Koreaj
:↓,简记Japan,从地图上看,Japan在Korea南边,下边,所以j是向下,k是向上h
:←l
:→
3.1.2 逐单词
w
:下一个单词词首b
:上一个单词词首e
、E
:当前或下一个单词词尾
3.1.3 行内跳转
0
:行首^
:行第一个非空字符$
:行尾
3.1.4 行间跳转
gg
:第一行nG
:移到第n行,相当于:n
G
:移到最后一行:NUM
:命令模式下跳转到第NUM
行
3.1.5 段落跳转
{
:上一段}
:下一段%
:括号匹配
3.2 翻屏
-
Ctrl+f
: 向下翻屏 -
Ctrl+b
: 向上翻屏 -
Ctrl+d
: 向下翻半屏 -
Ctrl+u
: 向上翻半屏 -
Ctrl+E
:向下滚屏 -
Ctrl+Y
:向上滚屏
3.3 编辑命令
3.3.1 删除命令
-
x
: 删除光标所在处单个字符 -
#x
:删除光标及之后#
个字符 -
x
:删除光标下文字 -
s
: -
S
:清空一行,相当于^c
-
dd
:删除当前行 -
d$
:删除从光标位置到行尾,D
:删除至末尾 -
d^
:删除从光标位置到行首,d0
:删除至行首 -
dw
:删除一个单词包括后续空格,de
:删除一个单词,不包括后续空格 -
d
:命令跟跳转命令组合使用,#dw
,#de
,#db
,#
代表数字 -
dd
: 删除当前光标所在行 -
#dd
: 删除包括当前光标所在行在内的#行 -
:START,ENDd
:命令模式下删除从START
到END
的行,.
表示当前行,$
表示最后一行,+#
表示向下的#
行,-#
表示向上的#
行
3.3.2 粘贴命令
p
:如果删除或复制为整行内容,则粘贴至光标所在行的下方,如果非整行,则粘贴至所在字符后方P
:如果删除或复制为整行内容,则粘贴至光标所在行的上方,如果非整行,则粘贴至所在字符前方
3.3.3 复制命令
复制,y
,yank,用法同d
命令。VIM的文本缓冲区和系统剪切板不是同样的东西,其它程序Ctrl+C复制的内容,粘贴不用使用p
,需要进入编辑模式,然后鼠标右键。或者:set paste
y[w|b|h|j|k|l]
:复制yy
: 复制当前光标所在行#yy
: 复制包括当前光标所在行在内的#行:START,ENDy
:命令模式下复制从START
到END
的行,.
表示当前行,$
表示最后一行,+#
表示向下的#
行,-#
表示向上的#
行nyy
:复制当前行后多行p
:光标之后粘贴剪切板内容
3.3.4 修改
c
, change,用法同d
ce
cw
:从当前位置删除到单词末尾
3.3.5 替换
r
:只修改当前一个字符R
:一直替换当前光标之后的内容s
:Insert 模式,即新插入的字符会覆盖后续字符
3.3.6 撤销操作
u
:fix the last commands,可以和数字连用#u
U
:fix a whole lineCtrl+r
:redo
3.4 插入模式
从命令模式下进入插入模式:
i
:当前光标位置插入,10i*<ESC>
:重复插入10个*号。I
:行首插入,VISUAL-BLOCK模式下,选中多行,I
可以输入字符<ESC>
可以多行相同操作。a
:当前光标之后插入A
:行尾插入o
:下一行插入O
:上一行插入
3.5 可视化模式
v
: 按字符选取V
:按行选取Ctrl+v
:按矩形选取
搭配移动光标的字符进行使用
3.6 查找替换
3.6.1 查找
-
/PATTERN
-
?PATTERN
n
:向下查找N
:向上查找
-
*
:到下一个该单词处,相当于先查找,后n
-
#
:到上一个该单词处,相当于先查找,后N
3.6.2 替换
ADDR1,ADDR2s/PATTERN/string/gi
,末行模式下查找并替换:%s/old/new/g
:全局替换,%
表示替换整个全文,是1,$
的简写
可视区范围替换,需要先选中,:s/old/new/g
,替换当前范围所有匹配
确认替换:%s/old/new/gc
,就是多了一个confirm确认过程
y
:yesn
:noa
:allq
:quitl
:last
4. 高级话题
4.1 set
-
:set number
:显示行号,简写:set nu
-
:set nonumber
:不显示行号:set nonu
-
:set ignorecase
:忽略大小写,简写:set ic
-
:set noignorecase
:区分大小写,用处不多,:set noic
-
:set autoindent
:设置自动缩进,:set ai
-
:set noautoindent
:取消自动缩进,:set noai
-
:set hlsearch
:查找的文本高亮显示,:set hls
-
:set nohlsearch
:查找的文本不高亮显示 -
:syntax on
:语法着色 -
:syntax off
:语法不着色
永久有效需要在配置文件中进行配置
/etc/vimrc
:全局有效~/.vimrc
:当前用户有效
4.2 缩进
>
:可视化模式下,右侧缩进<
:可视化模式下,左侧缩进=
:可视化模式下,格式化代码
4.3 MISC
:! COMMAND
:跟Shell交互.
:重复上一次的命令%
:匹配大括号:help <command>
:查看某条命令的帮助