有很多人在讨论常见技巧,特别是“Vim+ctags 技巧”。
然而,我不是指那些新手会觉得很酷的常用快捷键。我指的是经验丰富的 Unix 用户(无论是开发者、管理员还是两者兼备等),他们认为自己知道一些我们中绝大部分人从未听说或梦想过的东西。这些不仅能够使他们的工作更轻松,而且还很炫酷和有技巧性。毕竟,Vim 是运行于全球最黑暗角落的操作系统之一,因此它应该有一些只有少数特权人士知道并愿意与我们分享的复杂技巧。
有很多人在讨论常见技巧,特别是“Vim+ctags 技巧”。
然而,我不是指那些新手会觉得很酷的常用快捷键。我指的是经验丰富的 Unix 用户(无论是开发者、管理员还是两者兼备等),他们认为自己知道一些我们中绝大部分人从未听说或梦想过的东西。这些不仅能够使他们的工作更轻松,而且还很炫酷和有技巧性。毕竟,Vim 是运行于全球最黑暗角落的操作系统之一,因此它应该有一些只有少数特权人士知道并愿意与我们分享的复杂技巧。
我不确定这是否算作“黑暗角落”(dark-corner-ish),不过我刚学会了它...
:g/match/y A
将包含"match"的所有行复制到寄存器"a
/@a
"中。(使用大写字母A
会使vim附加复制而不是替换之前的寄存器内容。) 最近我在制作Internet Explorer样式表时经常使用它。
:v/PATTERN/d
。解释::v
是 :g!
的缩写,:g
命令将任何ex命令应用于行。:y[ank]
和 :normal
也可以使用,但在这里最自然的做法就是 :d[elete]
。 - Pandu:g/match/normal "Ayy
命令 -- normal
关键字让你可以运行普通模式下的命令(这些命令可能更加熟悉)。 - Kimball Robinson想查看您的命令历史记录吗?
q:
然后浏览、编辑,最后执行命令。
有没有做过对两个文件进行类似修改,来回切换的情况?(比如源代码和头文件)
:set hidden
:map <TAB> :e#<CR>
然后在这些文件之间切换标签页。
Vim可以打开URL,例如:
vim http://stackoverflow.com/
需要参考页面源代码时非常好用。
宏可以调用其他宏,也可以调用自身。
例如:
qq0dwj@qq@q
...将会删除文件末尾之前每行的第一个单词。
这是一个相当简单的示例,但它展示了vim的一个非常强大的特性。
:normal! @a
将你的宏应用到所选区域的每一行。 - Nathan Long:perldo $_ = join ' ', reverse split
在每一行的末尾插入一个由8个随机字符(A-Z)组成的字符串:
:rubydo $_ += ' ' + (1..8).collect{('A'..'Z').to_a[rand 26]}.join
在这里,您一次只能处理一行文本,并且无法添加新行。
pydo
和 py3do
也可以用于 Python。 - Derecholuado
来运行Lua。 - adam_0^O和^I
向旧的/新的位置移动。当您通过搜索、移动命令等在文件中移动时,vim会记住这些“跳转”,因此您可以向后(^O - O代表旧的)和向前(^I - 键盘上紧挨着I的位置)重复这些跳转。在编写代码和执行大量搜索时,我发现它非常有用。
gi
返回到上次停止插入模式的位置。我经常编辑然后搜索某些东西。要返回到编辑位置,请按gi。
gf
将光标放在文件名上(例如包含头文件),按下gf即可打开文件。
gF
类似于gf,但识别格式“[文件名]:[行号]”。按gF将打开[文件名]并将光标设置为[行号]。
^P和^N
编辑时自动补全文本(^P - 上一个匹配项,^N - 下一个匹配项)。
^X^L
在编辑时完成相同的行(对于编程非常有用)。您编写代码,然后回想起您在文件中有相同的代码。只需按^X^L即可完成整行。
^X^F
自动补全文件名。您写入"/etc/pass"。嗯。您忘记了文件名。只需按下^X^F即可完成文件名。
^Z或:sh
临时进入shell。如果您需要快速bash:
^X^F
时,我最讨厌的是文件名包含 =
符号,在许多情况下会导致它做出糟糕的事情(如 ini 文件、makefiles 等)。我使用 se isfname-==
来解决这个问题。 - sehe输入==命令可以根据上一行调整当前行的缩进。
实际上,您可以使用一个等号和任何移动命令。={movement}
例如,您可以使用%移动命令在匹配的大括号之间移动。将光标定位于以下代码中的{处:
if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}
按下 = % 即可立即获得以下内容:
if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}
或者,您可以在代码块内使用=a{,而不是将光标定位在 { 字符上。
=}
或vaBaB=
,因为这样更加独立。另外,v}}:!astyle -bj
更符合我的代码风格,但是我可以通过简单的%!astyle -aj
将其转换成你的风格。 - sehegg=G
的功能非常方便。 - remmyggVG=
。 - Braden Best" insert range ip's
"
" ( O O )
" =======oOO=(_)==OOo======
:for i in range(1,255) | .put='10.0.0.'.i | endfor
这是一个很好的技巧,可以使用不同的编码重新打开当前文件:
:e ++enc=cp1250 %:p
当你需要处理遗留编码时,它会非常有用。支持的编码在一个表格中列出,位于encoding-values
下面(参见help
encoding-values
)。类似的事情也适用于++ff
,因此如果第一次错误地获取了Windows / Unix行结束符,则可以重新打开文件(参见help
ff
)。
imap jj <esc>