Vim
块选择模式
批量注释:
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居然还支持环视和固化分组的功能,强大,赞一个
关于环视的解释请参考Yurii的《精通正则表达式》 一书吧。
| vim | Perl | 意义 |
|---|---|---|
| /@= | (?= | 顺序环视 |
| /@! | (?! | 顺序否定环视 |
| /@ | (?> | 固化分组 |
| /%(atom/) | (?: | 非捕获型括号 |
和perl稍有不同的是,vim中的环视和固化分组的模式的位置与perl不同。例如,查找紧跟在 foo 之后的 bar,perl将模式写在环视的括号内,而vim将模式写在环视的元字符之前。
Perl的写法
/(?
编辑且跳转到对应的行
vim ./log.txt +12 # 打开并跳到12行