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