Vim

2024/7/15·1 views

块选择模式

批量注释:

Ctrl + v 进入块选择模式,然后移动光标选中你要注释的行,再按大写的I进入行首插入模式输入注释符号如 // 或 #,输入完毕之后,按两下ESC,Vim会自动将你选中的所有行首都加上注释,保存退出完成注释。

取消注释:

Ctrl + v 进入块选择模式,选中你要删除的行首的注释符号,注意// 要选中两个,选好之后按d即可删除注释,ESC保存退出。

替换

批量注释:

使用下面命令在指定的行首添加注释:

:起始行号,结束行号s/^/注释符/g

取消注释:

:起始行号,结束行号s/^注释符//g

例子:

在10 - 20行添加 // 注释

:10,20s#^#//#g

在10 - 20行删除 // 注释

:10,20s#^//##g

在10 - 20行添加 # 注释

:10,20s/^/#/g

在10 - 20行删除 # 注释

:10,20s/^/#/g

注意:替换方法的例子中正则的分割符使用的是相反的符号,如果匹配// 那么使用 #作分隔符这样不需要对/作转义处理,节省输入次数。

复制代码
:s/return/ret/g
:%s/return/ret/g

快速清空文件

复制代码
gg # 跳到行首
dG # 删除直到末尾

缩进

行首

复制代码
ctrl + v

按向下箭头选中行,按 > 或者 注意,每一种折叠方式不兼容,如不能即用expr又用marker方式,我主要轮流使用indent和marker方式进行折叠。

使用时,用:set fdm=marker 命令来设置成marker折叠方式(fdm是foldmethod的缩写)。
要使每次打开vim时折叠都生效,则在.vimrc文件中添加设置,如添加:set fdm=syntax,就像添加其它的初始化设置一样。

折叠命令

选取了折叠方式后,我们就可以对某些代码实施我们需要的折叠了,由于我使用indent和marker稍微多一些,故以它们的使用为例:
如果使用了indent方式,vim会自动的对大括号的中间部分进行折叠,我们可以直接使用这些现成的折叠成果。
在可折叠处(大括号中间):

复制代码
zc    折叠
zC    对所在范围内所有嵌套的折叠点进行折叠
zo    展开折叠
zO    对所在范围内所有嵌套的折叠点展开
[z    到当前打开的折叠的开始处。
]z    到当前打开的折叠的末尾处。
zj    向下移动。到达下一个折叠的开始处。关闭的折叠也被计入。
zk    向上移动到前一折叠的结束处。关闭的折叠也被计入。

当使用marker方式时,需要用标计来标识代码的折叠,系统默认是{{{}}},最好不要改动之:)
我们可以使用下面的命令来创建和删除折叠:

复制代码
zf     创建折叠,比如在marker方式下: zf56G,创建从当前行起到56行的代码折叠; 10zf或10zf+或zf10↓,创建从当前行起到后10行的代码折叠。 10zf-或zf10↑,创建从当前行起到之前10行的代码折叠。 在括号处zf%,创建从当前行起到对应的匹配的括号上去((),{},[],等)。
zd     删除 (delete) 在光标下的折叠。仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
zD     循环删除 (Delete) 光标下的折叠,即嵌套删除折叠。 仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
zE     除去 (Eliminate) 窗口里“所有”的折叠。 仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。

查看/修改十六进制或者二进制文件等

复制代码
hexdump a.txt
复制代码
xxd a.txt
复制代码
vim -b a.txt

xxd是linux的一个命令,vim可以通过”!”来调用外部命令,其功能就是进行十六进制的dump或者反之。

复制代码
:%!od 
:%!xxd
:%!xxd -r 16进制转为2进制

参考:http://blog.chinaunix.net/uid-29767867-id-4413135.html
推荐:https://blog.csdn.net/xxxxxx91116/article/details/8042312

执行shell脚本报错/usr/bin/env: ‘bash\r’: No such file or directory

主要原因是*.sh是在windows下编辑然后上传到linux系统里执行的。.sh文件的格式为dos格式。而linux只能执行格式为unix格式的脚本。

shell 复制代码
vim release.sh
:set ff # 查看fileformat 应该是dos
:set ff=unix # 设置为unix
:wq

统计关键词出现的次数

shell 复制代码
:%s/keyword/gn

参数说明:

  • % - 指明操作区间,%表示全文本;可以使用1,$或者行区间代替

  • s – substitute,表示替换

  • pattern - 要查找的字符串

  • // - 替代文本应该放在这里,两个斜杠中间没有任何字符表示无替代文本

  • g – Replace all occurences in the line. Without this argument, replacement occurs only for the first occurence - in each line.

  • n – Report the number of matches, and do not actually substitute. 这是核心功能,同时也说明为什么//之间可以添加任意字符。

一些引申出的应用:

(1) :k,ls/pattern//gn
统计k行到l行出现pattern的次数
(2) :%s/pattern//gn
统计在当前编辑文本出现的次数
(3) cat file|greg –i pattern |wc –l
统计在文件中出现的行数

正则表达式

毋庸多言,在vim中正则表达式得到了十分广泛的应用。最常用的 / 和 :s 命令中,正则表达式都是不可或缺的。下面对vim中的正则表达式的一些难点进行说明

关于magic

vim中有个magic的设定,设定方法为:

复制代码
:set magic             " 设置magic
:set nomagic           " 取消magic
:h magic               " 查看帮助

vim毕竟是个编辑器,正则表达式中包含的大量元字符如果原封不动地引用(像perl那样),势必会给不懂正则表达式的人造成麻烦,比如 /foo(1) 命令,大多数人都用它来查找foo(1)这个字符串,但如果按照正则表达式来解释,被查找的对象就成了 foo1 了。

于是,vim就规定,正则表达式的元字符必须用反斜杠进行转义才行,如上面的例子,如果确实要用正则表达式,就应当写成 /foo/(1/) 。但是,像 . * 这种极其常用的元字符,都加上反斜杠就太麻烦了。而且,众口难调,有些人喜欢用正则表达式,有些人不喜欢用……

为了解决这个问题,vim设置了 magic 这个东西。简单地说, magic就是设置哪些元字符要加反斜杠哪些不用加的。简单来说:

  • magic (/m):除了 $ . * ^ 之外其他元字符都要加反斜杠。

  • nomagic (/M):除了 $ ^ 之外其他元字符都要加反斜杠。

这个设置也可以在正则表达式中通过 /m /M 开关临时切换。 /m 后面的正则表达式会按照 magic 处理,/M 后面的正则表达式按照 nomagic 处理,而忽略实际的magic设置。

例如:

复制代码
//m.*          # 查找任意字符串
//M.*          # 查找字符串 .* (点号后面跟个星号)

另外还有更强大的 /v 和 /V。

  • /v (即 very magic 之意):任何元字符都不用加反斜杠

  • /V (即 very nomagic 之意):任何元字符都必须加反斜杠

例如:

复制代码
//v(a.c){3}$   # 查找行尾的abcaccadc
//m(a.c){3}$   # 查找行尾的(abc){3}
//M(a.c){3}$   # 查找行尾的(a.c){3}
//V(a.c){3}$   # 查找任意位置的(a.c){3}$

默认设置是 magic,vim也推荐大家都使用magic的设置,在有特殊需要时,直接通过 /v/m/M/V 即可。

本文下面使用的元字符都是 magic 模式下的。

量词

vim的量词与perl相比一点也不逊色。

vim Perl 意义
* * 0个或多个(匹配优先)
/+ + 1个或多个(匹配优先)
/? 或 /= ? 0个或1个(匹配优先),/?不能在 ? 命令(逆向查找)中使用
/{n,m} {n,m} n个到m个(匹配优先)
/{n,} {n,} 最少n个(匹配优先)
/{,m} {,m} 最多m个(匹配优先)
/{n} {n} 恰好n个
/{-n,m} {n,m}? n个到m个(忽略优先)
/{-} *? 0个或多个(忽略优先)
/{-1,} +? 1个或多个(忽略优先)
/{-,1} ?? 0个或1个(忽略优先)

从上表中可见,vim的忽略优先量词不像perl的 *? +? ?? 那样,而是统一使用 /{- 实现的。这大概跟忽略优先量词不常用有关吧。

环视和固化分组

vim居然还支持环视和固化分组的功能,强大,赞一个 :D 关于环视的解释请参考Yurii的《精通正则表达式》 一书吧。

vim Perl 意义
/@= (?= 顺序环视
/@! (?! 顺序否定环视
/@ (?> 固化分组
/%(atom/) (?: 非捕获型括号

和perl稍有不同的是,vim中的环视和固化分组的模式的位置与perl不同。例如,查找紧跟在 foo 之后的 bar,perl将模式写在环视的括号内,而vim将模式写在环视的元字符之前。

Perl的写法

复制代码
/(?

编辑且跳转到对应的行

复制代码
vim ./log.txt +12 # 打开并跳到12行
快来和小猫聊天吧~