人们谈论常见的伎俩有很多问题,特别是“Vim+ctags tips and tricks”。
但是,我没有提到Vim的新手会觉得很酷的常用快捷方式。我说的是一个经验丰富的Unix用户(他们是开发人员,管理员,两者等),他们认为他们知道我们99%的人从未听过或梦到过的东西。有些东西不仅让他们的工作变得更轻松,而且还很酷,而且很酷。毕竟,Vim居住在世界上最黑暗角落最丰富的操作系统中,因此它应该只有少数特权知道并希望与我们分享的错综复杂。
可能不是99%的Vim用户不知道的,但这是我每天使用的东西,任何Linux + Vim poweruser都必须知道。
基本命令,但非常有用。
:w !sudo tee %
在编辑我没有写入权限的文件之前,我经常忘记sudo。当我来保存该文件并获得权限错误时,我只发出该vim命令以保存文件而无需将其保存到临时文件,然后再将其复制回来。
你显然必须在安装了sudo的系统上并拥有sudo权限。
不确定这是否算作暗角,但我只是刚刚学会了......
:g/match/y A
将所有包含“匹配”的行拉入(复制)到"a
/ @a
注册表中。 (作为A
的大写字母使得vim附加了yankings而不是替换之前的寄存器内容。)我最近在制作Internet Explorer样式表时使用了很多东西。
:%TOhtml
创建当前文件的html呈现。
想看看你的:命令历史?
q:
然后浏览,编辑,最后执行命令。
是否对两个文件进行了类似的更改并在它们之间来回切换? (说,源文件和头文件?)
:set hidden
:map <TAB> :e#<CR>
然后在这些文件之间来回切换。
例如,Vim将打开一个URL
vim http://stackoverflow.com/
当你需要提取页面的来源以供参考时很好。
宏可以调用其他宏,也可以调用自己。
例如:
qq0dwj@qq@q
...将从每行删除第一个单词,直到文件结尾。
这是一个非常简单的例子,但它展示了vim的一个非常强大的功能
假设您编译了Perl和/或Ruby支持,:rubydo
和:perldo
将在一个范围内的每一行(默认为整个缓冲区)上运行Ruby或Perl一行,并将$_
绑定到当前行的文本(减去新队)。操纵$_
将改变该行的文本。
您可以使用它来执行某些易于使用脚本语言执行的操作,但使用Vim内置函数则不那么明显。例如,要反转一行中单词的顺序:
:perldo $_ = join ' ', reverse split
要在每行的末尾插入一个8个字符(A-Z)的随机字符串:
:rubydo $_ += ' ' + (1..8).collect{('A'..'Z').to_a[rand 26]}.join
您一次只能在一行上执行操作,并且无法添加换行符。
^ O和^ I
转到较旧/较新的位置。当您浏览文件时(通过搜索,移动命令等),vim将这些“跳跃”重新加入,这样您就可以向后重复这些跳转(旧的^ O - O)并向前跳转(^ I - 在键盘上我旁边)。我发现在编写代码和执行大量搜索时非常有用。
给
转到最后停止插入模式的位置。我发现自己经常编辑,然后搜索一些东西。要返回编辑位置,请按gi。
GF
将光标放在文件名上(例如包含头文件),按gf键打开文件
中gF
类似于gf,但识别格式“[文件名]:[行号]”。按gF将打开[文件名]并将光标设置为[行号]。
^ P和^ N.
编辑时自动完成文本(^ P - 上一个匹配和^ N下一个匹配)
^ X ^大号
编辑完成到同一行(对编程很有用)。你编写代码,然后你还记得你在文件中的某个地方有相同的代码。只需按^ X ^ L即可完成整行
^ X ^ F
完整的文件名。你写“/ etc / pass”嗯。你忘了文件名。只需按^ X ^ F即可完成文件名
^ Z或:sh
临时移动到shell。如果你需要快速抨击:
这是一个很好的技巧,用不同的编码重新打开当前文件:
:e ++enc=cp1250 %:p
在必须使用旧编码时很有用。支持的编码列在encoding-values
下的表格中(参见help
encoding-values
)。类似的东西也适用于++ff
,因此如果你第一次弄错了,你可以用Windows / Unix行结束重新打开文件(参见help
ff
)。
" insert range ip's
"
" ( O O )
" =======oOO=(_)==OOo======
:for i in range(1,255) | .put='10.0.0.'.i | endfor
键入==将根据上面的行更正当前行的缩进。
实际上,您可以执行一个=符号后跟任何移动命令。 = {}运动
例如,您可以使用在匹配大括号之间移动的%移动。将光标定位在{以下代码中:
if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}
并按=%立即得到这个:
if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}
或者,您可以在代码块中执行= a {而不是将自己定位在{character。
我刚刚发现的一些我认为非常酷的东西:
:earlier 15m
将文档还原为15分钟前的状态。可以针对您想要回滚的时间量采用各种参数,并且取决于undolevels。可以用相反的命令:later
反转
imap jj <esc>
让我们看看一些非常小的IDE编辑器进行列转换。
:%s/\(.*\)^I\(.*\)/\2^I\1/
说明
\(
和\)
是如何记住正则表达式的东西。而\1
,\2
等是如何找回记住的东西。
>>> \(.*\)^I\(.*\)
记住一切依次是^I
(tab),然后是一切。
>>> \2^I\1
用“你记得的第二个东西”替换上面的东西,接着是“你记得的第一个东西” - 基本上做一个转置。
这不是一个黑暗的秘密,但我喜欢将以下映射放入我的.vimrc文件中,因此我可以随时点击“ - ”(减号)打开文件浏览器以显示与我刚编辑的文件相邻的文件。在文件资源管理器中,我可以点击另一个“ - ”来移动一个目录,提供复杂目录结构的无缝浏览(就像现在的MVC框架所使用的那样):
map - :Explore<cr>
这些也可能对某些人有用。我喜欢滚动屏幕并同时前进光标:
map <c-j> j<c-e>
map <c-k> k<c-y>
标签导航 - 我喜欢标签,我需要在它们之间轻松移动:
map <c-l> :tabnext<enter>
map <c-h> :tabprevious<enter>
仅在Mac OS X上:类似Safari的选项卡导航:
map <S-D-Right> :tabnext<cr>
map <S-D-Left> :tabprevious<cr>
我喜欢使用'sudo bash',我的系统管理员讨厌这个。他锁定了'sudo',所以它只能用于一些命令(ls,chmod,chown,vi等),但我能够使用vim来获得root shell:
bash$ sudo vi +'silent !bash' +q
Password: ******
root#
通常,我喜欢在编辑时更改当前目录 - 所以我必须更少地指定路径。
cd %:h
我在项目工作时经常使用很多窗口,有时我需要调整它们的大小。这是我使用的:
map + <C-W>+
map - <C-W>-
这些映射允许增加和减小当前窗口的大小。这很简单,但速度很快。
不是一个不起眼的功能,但非常有用,节省时间。
如果要保存打开的缓冲区,选项卡,标记和其他设置的会话,可以发出以下命令:
mksession session.vim
您可以使用以下方式打开会话:
vim -S session.vim
:r! <command>
将外部命令的输出粘贴到缓冲区中。
做一些数学运算并直接在文本中得到结果:
:r! echo $((3 + 5 + 8))
获取编写Makefile时要编译的文件列表:
:r! ls *.c
不要查看您在维基百科上阅读的那个事实,将其直接粘贴到您正在编写的文档中:
:r! lynx -dump http://en.wikipedia.org/wiki/Whatever
将F5映射到ROT13缓冲区:
map <F5> ggg?G``
您可以将它用作老板键:)。
我今天刚刚通过NSFAQ找到了这个:
注释代码块。
按CTRL-V进入Blockwise Visual模式。
标记您要评论的块。
点击I(大写字母I)并在该行的开头输入您的注释字符串。 (// for C ++)
按ESC键,所有选中的行将//前置于行的前面。
当你在Vim时,:! [command]
执行一个外部命令。
但是在冒号后添加一个点,:.! [command]
,它会将命令的输出转储到当前窗口。那是: . !
例如:
:.! ls
我使用这个很多东西,例如将当前日期添加到我正在键入的文档中:
:.! date
我使用vim进行任何文本编辑,所以我经常使用复制和粘贴。问题是vim默认情况下经常会通过粘贴扭曲导入的文本。阻止这种情况的方法是使用
:set paste
在粘贴数据之前。这将使它免于搞乱。
请注意,您必须发出:set nopaste
才能恢复自动缩进。粘贴预格式化文本的其他方法是剪贴板寄存器(*
和+
)和:r!cat
(您必须使用^ D结束粘贴的片段)。
打开高对比度配色方案有时也很有帮助。这可以通过以下方式完成
:color blue
我注意到它在我使用的vim的所有版本上都不起作用,但它在大多数情况下都有效。
de按下删除所有内容直到单词结尾。按照你的心愿。
ci(xyz [Esc] - 这是一个奇怪的。这里,'i'并不意味着插入模式。相反,它意味着在括号内。所以这个序列切割你所代表的括号内的文本并替换为“xyz”。它也适用于方形和图形括号 - 只需做ci [或ci {相应地。当然,你可以做di(如果你只是想删除所有文本而不输入任何东西。你也可以做a
而不是i
如果你想删除括号而不只是删除它们内的文本。
ci“ - 用当前引号剪切文本
ciw - 削减当前的词。除了(
被w
取代之外,这与前一个一样。
C - 剪切线的其余部分并切换到插入模式。
ZZ - 保存并关闭当前文件(比Ctrl-F4更快地关闭当前标签!)
ddp - 将当前行向下移动一行
xp - 将当前字符向右移动一个位置
U - 大写,所以viwU
说出了这个词
〜 - 切换情况,所以viw~
将反转整个单词的大小写
Ctrl + u / Ctrl + d向上或向下滚动页面半屏。这似乎比通常的全屏分页更有用,因为它可以更容易地看到两个屏幕的关系。对于那些仍然想要一次滚动整个屏幕的人来说,Ctrl + f代表Forward,Ctrl + b代表Backward。 Ctrl + Y和Ctrl + E一次向下或向上滚动一行。
疯狂但非常有用的命令是zz - 它滚动屏幕使这条线出现在中间。这非常适合将您正在处理的代码放在注意力的中心。兄弟姐妹命令 - zt和zb - 使这条线在sreen的顶部或底部,这不是很有用。
%找到并跳转到匹配的括号。
de - 从光标删除到单词的结尾(你也可以删除dE
直到下一个空格)
bde - 从左到右分隔符删除当前单词
df [space] - 删除直到包括下一个空格
DT。 - 删除到下一个点
dd - 删除整行
ye(或yE) - 将文字从这里拉到文字末尾
ce - 切断这个词的结尾
再见 - 复制当前的单词(让我想知道“嗨”是什么!)
yy - 复制当前行
cc - 削减当前行,你也可以改为S
。还有更低的上限s
,它削减当前字符并切换到插入模式。
viwy或viwc。猛拉或更改当前单词。多次击中w
以继续选择每个后续单词,使用b
向后移动
vi { - 选择图括号中的所有文本。 va { - 选择包括{}的所有文本
vi(p - 突出显示()中的所有内容并替换为粘贴的文本
b和e逐字移动光标,类似于Ctrl + Arrows通常的操作方式。虽然单词的定义有点不同,因为几个连续的delmiters被视为一个单词。如果从单词的中间开始,按b将始终将您带到当前单词的开头,并且每个连续的b将跳转到下一个单词的开头。同样,并且易于记忆,e
将光标移动到当前和每个后续单词的末尾。
类似于b
/ e
,资本B
和E
仅使用空格作为分隔符逐字移动光标。
大写D(深呼吸)删除光标右侧的其余行,与正常编辑器中的Shift + End / Del相同(注意2个按键 - Shift + D - 而不是3个)
我在大多数Vim教程中很少找到的,但它对于我来说是非常有用的(至少对我而言)是
g; and g,
通过变更清单移动(前进,后退)。
让我展示一下我是如何使用它的。有时我需要复制并粘贴一段代码或字符串,比如CSS文件中的十六进制颜色代码,所以我搜索,跳转(不关心匹配的位置),复制它然后跳回(g;)到哪里我正在编辑代码以最终粘贴它。无需创建标记。简单。
只是我的2cents。
:%!xxd
将vim变为十六进制编辑器。
:%!xxd -r
还原。
警告:如果不使用二进制文件(-b)进行编辑,则可能会损坏文件。 - Josh Lee在评论中。
gv
重新选择最后的视觉选择。
有时,.vimrc中的设置将被插件或自动命令覆盖。要调试它,一个有用的技巧是使用:verbose命令和:set。例如,要找出cindent设置/取消设置的位置:
:verbose set cindent?
这将输出如下内容:
cindent
Last set from /usr/share/vim/vim71/indent/c.vim
这也适用于地图和高光。 (感谢joeytwiddle指出这一点。)例如:
:verbose nmap U
n U <C-R>
Last set from ~/.vimrc
:verbose highlight Normal
Normal xxx guifg=#dddddd guibg=#111111 font=Inconsolata Medium 14
Last set from ~/src/vim-holodark/colors/holodark.vim