Vim 学习笔记

Posted on 2020-10-02 in tricks

连续录入多个相同的字符( 参见 ):

50i- ESC
# 如果当前是 INSERT 模式,可以使用 CTRL + O 临时进入命令模式
CTRL+O 50i- ESC
# CTRL+O 用于临时进入命令模式
# 50 表示要重复的字数
# i 表示插入命令
# - 要插入的字符
# ESC 离开插入模式(其实是退出当前的临时命令)

在10行和112行之间插入4空格:

10,112 s/^/    /

删除空行以及只有空格的行:

:g/^\s*$/d

恢复删除操作:

vi对删除(d or x)或复制(y)有各自专用的 buffer,
删除buffer会自动保留最近的9个删除操作(行内删除除外)至buffer,9个删除自动按照1-9保存,最近一次删除保存在1;
可以使用 "1pu.u.u etc 命令查看各个删除的内容

复制buffer可保留26个命名(从a-z)复制内容,如果复制时未使用命名,自动使用a??
"d7yy
"a5dd
此处注意dd操作会分别保存在删除buffer 1中和复制buffer a 中

代码编辑操作

在 vi 中有些功能可以帮助程序员进行代码编辑,如缩进、搜索代码块

缩进设置:

:set autoindent             用于开启缩进功能
:set shiftwidth=4   用于设置缩进(量)
:set list           用于查看TAB与EOF,TAB 显示为 ^I,EOF 显示为 $

或者:

:set ai sw=4                省略格式

当处于编辑状态时可以使用以下快捷键快速调整缩进:

CTRL-T              增加一个缩进
CTRL-D              减少一个缩进
^ CTRL-D    (输入的^在CTRL-D会自动删除)当前行删除全部缩进,即当前行的缩进为0,但是此时输入回车后,下一行仍然会保留之前的缩进
0 CTRL-D    (输入的0在CTRL-D会自动删除)当前行删除全部缩进,即当前行的缩进为0,但是此时输入回车后,下一行缩进为0

当处于命令状态时可以使用以下命令调整缩进:

>>          增加缩进,5>> 增加5个缩进宽度 set shiftwidth=4 指定的
<<          减少缩进,5<< 减少5个缩进宽度

当处于命令状态时,可以使用 % 查看对应的 () [] {},如果光标没有在括号上,vi 会自动从光标位置向前查找当前行的括号,然后移动到对应的括号上去; 另一个有用的技巧是打开以下设置:

:set showmatch

与 % 不同的是,这个功能主要是用于编辑状态,当你输入 ) ] } 时,光标会短暂跳转到对应的括号,如果不存在对应的括号,会 beep,当然如果对应的括号不在当前屏幕,vi 会当没事一样

ex 编辑器介绍

vi 可以视为基于 ex 之上的可视化编辑器;ex 作为行编辑器,其命令的格式为 :[行号][命令]。

相对多数的 ex 命令而言,vi 本身也提供了对应的命令,而且一般来说 vi 的命令更加便捷, 但是如果涉及到多行操作命令,ex 命令仍然有其自身优势,比如全文寻找并/或替换词语等

行号地址说明

多行01 :3,18d 删除3至18行
多行02 :160,224m23 将160至224行移动到23行之后(类似 vi 的 delete 和 put)
多行03 :23,29co100 将23至29行复制到100行之后(类似 vi 的 yank 和 put)
符号01 :.,$d 将当前行至最尾行删除
符号02 :20,.m$ 将20行到当前行的内容移动到文件尾行之后
符号03 :%t$ 将所有行复制到文件尾行之行
重定义当前行 :100,+5p 错误的作法
重定义当前行 :100;+5p 正确的做法,打印100行到其后5行
重定义当前行 :/pattern/;+5p 打印下一个包含模式的行到其后5行

全局替换说明

:s/old/new/

对当前行第一次出现的 old 替换为 new

:s/old/new/g

对当前所有出现的 old 均替换为 new,此处未尾处的 g 选项影响本行中的每个模式, 注意不要与 :g 命令(全局搜索)搞混了, :g 命令影响文件(指定行号范围)中的每一行。

:50,100s/old/new/g

对50到100行所有的 old 替换为 new。

:1,$s/old/new/g
:%s/old/new/g

以上二条命令作用一样,对文件中所有出现的 old 替换为 new。

:%s/old/new/gc

以上命令需要对每个替换进行确认,通过人工检查防止不符合要求的替换。

:g/pattern/s/old/new/g

以上可称为上下文替换操作,即通过第一个 :g/pattern/ 命令找到所有符合模式要求的行, 然后对以上找到的行执行 s/old/new/g,即对所找到的行中,进行 old 到 new 的替换。

如果搜索模式与替换内容一样可以省略替换内容,如以下二个写法作用一样

:g/old/s/old/new/g
:g/old/s//new/g

此时要注意的是,其实以上的写法与以下的写法效果也是一样的

:%s/old/new/g

而这种写法是最简化的,

另外请注意,:g 命令也可以结合 :d :m :t 等 ex 命令使用,换而言之,:g 命令相当于是一个行号范围。

窗口操作

在 vim 中支持多窗口,可以打开多个窗口编辑,方便大多个文件中相互复制内容或相互参考内容

使用命令行打开多个窗口:

vim -o file1 file2          小写o以纵向方式打开二个窗口
vim -O5 file1 file2         大写O以水平方式打开五个窗口

在 vim 内开窗口:

:split filename             纵向开窗口,如果不录入 filename ,会打开当前编辑的同一文件(buffer)
:vsplit filename            水平开窗口,如果不录入 filename ,会打开当前编辑的同一文件(buffer)
:new                        纵向开窗口(空文件)
CTRL-W s                    纵向开窗口(当前同一文件)
CTRL-W v                    水平开窗口(当前同一文件)
CTRL-W n                    纵向开窗口(空文件)

切换窗口:

CTRL-W h
CTRL-W j
CTRL-W k
CTRL-W l                    以上命令与 h j k l 的移动方面一致
CTRL-W w                    以从上到下从左到右的方式循环切换窗口
CTRL-W t                    移动到左上角窗口
CTRL-W b                    移动到右下角窗口
CTRL-W p                    回到上一个(最近访问过的)窗口

移动窗口(不改动布局):

CTRL-W r                    将当前窗口与右或下窗口交换位置,当右或下没窗口时与第一个交换
CTRL-W R                    将当前窗口与左或上窗口交换位置,当左或上没窗口时与最后一个窗口交换
CTRL-W x                    将当前窗口与右或下窗口交换位置,当右或下没窗口时,与前一个窗口交换位置
3CTRL-W x                   将当前窗口与右或下第3个窗口交换位置

移动窗口(改动布局):

CTRL-W K                    将当前窗口移至最上方(全宽)
CTRL-W J                    将当前窗口移至最下方(全宽)
CTRL-W H                    将当前窗口移至最左边(全高)
CTRL-W L                    将当前窗口移至最右边(全高)
CTRL-W T                    将当前窗口移至一个新标签页

调整窗口大小:

CTRL-W =                    将所有窗口调整为一样大小
:resize n                   设置窗口高度(行),如果不指定 n,则为可能的最大高度
:resize +n                  增加窗口高度 n 行
:resize -n                  减少窗口高度 n 行
:vertical resize n          设置窗口宽度(列),如果不指定 n,则为可能的最大宽度
:vertical resize +n         增加窗口宽度 n 列
:verticla resize -n         减少窗口宽度 n 列

BUFFERS操作:

:windo cmd                  对当前标签页的所有buffer(窗口)执行cmd操作
:windo %s/oldcontent/newcontent/g
:bufdo cmd                  对所有标签页的所有buffer(窗口)执行cmd操作

标签页操作:

:tabnew filename            新建一个标签页,如果不指定filename,即打一个空文档
:tabclose                   关闭当前标签页
:tabonly                    关闭其它标签页

关闭或退出窗口:

CTRL-W q 或 :quit            退出窗口
CTRL-W c 或 :close           关闭窗口
CTRL-W o 或 :only            关闭其它窗口
:hide [cmd]                 退出窗口并隐藏buffer
以上命令其它均要考虑buffer,但是暂时还没有使用buffer的高级用途,待以后吧 TODO