你母亲从未告诉过你的Vim的黑暗角落是什么? [关闭]

问题描述 投票:783回答:70

人们谈论常见的伎俩有很多问题,特别是“Vim+ctags tips and tricks”。

但是,我没有提到Vim的新手会觉得很酷的常用快捷方式。我说的是一个经验丰富的Unix用户(他们是开发人员,管理员,两者等),他们认为他们知道我们99%的人从未听过或梦到过的东西。有些东西不仅让他们的工作变得更轻松,而且还很酷,而且很酷。毕竟,Vim居住在世界上最黑暗角落最丰富的操作系统中,因此它应该只有少数特权知道并希望与我们分享的错综复杂。

unix vim editor vi
70个回答
766
投票

可能不是99%的Vim用户不知道的,但这是我每天使用的东西,任何Linux + Vim poweruser都必须知道。

基本命令,但非常有用。

:w !sudo tee %

在编辑我没有写入权限的文件之前,我经常忘记sudo。当我来保存该文件并获得权限错误时,我只发出该vim命令以保存文件而无需将其保存到临时文件,然后再将其复制回来。

你显然必须在安装了sudo的系统上并拥有sudo权限。


98
投票

不确定这是否算作暗角,但我只是刚刚学会了......

:g/match/y A

将所有包含“匹配”的行拉入(复制)到"a / @a注册表中。 (作为A的大写字母使得vim附加了yankings而不是替换之前的寄存器内容。)我最近在制作Internet Explorer样式表时使用了很多东西。


97
投票

:%TOhtml

创建当前文件的html呈现。


89
投票

想看看你的:命令历史?

q:

然后浏览,编辑,最后执行命令。

是否对两个文件进行了类似的更改并在它们之间来回切换? (说,源文件和头文件?)

:set hidden
:map <TAB> :e#<CR>

然后在这些文件之间来回切换。


79
投票

例如,Vim将打开一个URL

vim http://stackoverflow.com/

当你需要提取页面的来源以供参考时很好。


68
投票

宏可以调用其他宏,也可以调用自己。

例如:

qq0dwj@qq@q

...将从每行删除第一个单词,直到文件结尾。

这是一个非常简单的例子,但它展示了vim的一个非常强大的功能


55
投票

假设您编译了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

您一次只能在一行上执行操作,并且无法添加换行符。


54
投票

^ 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。如果你需要快速抨击:

  • 按^ Z(将vi放入后台)返回原始shell并按fg返回vim返回
  • 按:sh转到子shell并按^ D /退出返回vi

47
投票

这是一个很好的技巧,用不同的编码重新打开当前文件:

:e ++enc=cp1250 %:p

在必须使用旧编码时很有用。支持的编码列在encoding-values下的表格中(参见help encoding-values)。类似的东西也适用于++ff,因此如果你第一次弄错了,你可以用Windows / Unix行结束重新打开文件(参见help ff)。


47
投票
" insert range ip's
"
"          ( O O )
" =======oOO=(_)==OOo======

:for i in range(1,255) | .put='10.0.0.'.i | endfor

46
投票

键入==将根据上面的行更正当前行的缩进。

实际上,您可以执行一个=符号后跟任何移动命令。 = {}运动

例如,您可以使用在匹配大括号之间移动的%移动。将光标定位在{以下代码中:

if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}

并按=%立即得到这个:

if (thisA == that) {
    //not indented
    if (some == other) {
        x = y;
    }
}

或者,您可以在代码块中执行= a {而不是将自己定位在{character。


602
投票

我刚刚发现的一些我认为非常酷的东西:

:earlier 15m

将文档还原为15分钟前的状态。可以针对您想要回滚的时间量采用各种参数,并且取决于undolevels。可以用相反的命令:later反转


41
投票
imap jj <esc>

37
投票

让我们看看一些非常小的IDE编辑器进行列转换。

:%s/\(.*\)^I\(.*\)/\2^I\1/

说明

\(\)是如何记住正则表达式的东西。而\1\2等是如何找回记住的东西。

>>> \(.*\)^I\(.*\)

记住一切依次是^I(tab),然后是一切。

>>> \2^I\1

用“你记得的第二个东西”替换上面的东西,接着是“你记得的第一个东西” - 基本上做一个转置。


30
投票

这不是一个黑暗的秘密,但我喜欢将以下映射放入我的.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>

27
投票

我喜欢使用'sudo bash',我的系统管理员讨厌这个。他锁定了'sudo',所以它只能用于一些命令(ls,chmod,chown,vi等),但我能够使用vim来获得root shell:

bash$ sudo vi +'silent !bash' +q
Password: ******
root#

26
投票

通常,我喜欢在编辑时更改当前目录 - 所以我必须更少地指定路径。

cd %:h

24
投票

我在项目工作时经常使用很多窗口,有时我需要调整它们的大小。这是我使用的:

map + <C-W>+
map - <C-W>-

这些映射允许增加和减小当前窗口的大小。这很简单,但速度很快。


22
投票

不是一个不起眼的功能,但非常有用,节省时间。

如果要保存打开的缓冲区,选项卡,标记和其他设置的会话,可以发出以下命令:

mksession session.vim

您可以使用以下方式打开会话:

vim -S session.vim

21
投票
:r! <command>

将外部命令的输出粘贴到缓冲区中。

做一些数学运算并直接在文本中得到结果:

:r! echo $((3 + 5 + 8))

获取编写Makefile时要编译的文件列表:

:r! ls *.c

不要查看您在维基百科上阅读的那个事实,将其直接粘贴到您正在编写的文档中:

:r! lynx -dump http://en.wikipedia.org/wiki/Whatever

21
投票

将F5映射到ROT13缓冲区:

map <F5> ggg?G``

您可以将它用作老板键:)。


19
投票

我今天刚刚通过NSFAQ找到了这个:

注释代码块。

按CTRL-V进入Blockwise Visual模式。

标记您要评论的块。

点击I(大写字母I)并在该行的开头输入您的注释字符串。 (// for C ++)

按ESC键,所有选中的行将//前置于行的前面。


401
投票

当你在Vim时,:! [command]执行一个外部命令。

但是在冒号后添加一个点,:.! [command],它会将命令的输出转储到当前窗口。那是: . !

例如:

:.! ls

我使用这个很多东西,例如将当前日期添加到我正在键入的文档中:

:.! date

17
投票

我使用vim进行任何文本编辑,所以我经常使用复制和粘贴。问题是vim默认情况下经常会通过粘贴扭曲导入的文本。阻止这种情况的方法是使用

:set paste

在粘贴数据之前。这将使它免于搞乱。

请注意,您必须发出:set nopaste才能恢复自动缩进。粘贴预格式化文本的其他方法是剪贴板寄存器(*+)和:r!cat(您必须使用^ D结束粘贴的片段)。

打开高对比度配色方案有时也很有帮助。这可以通过以下方式完成

:color blue

我注意到它在我使用的vim的所有版本上都不起作用,但它在大多数情况下都有效。


308
投票

不完全晦涩,但有几个“删除”命令非常有用,比如..

  • diw删除当前单词
  • di(删除当前的parens
  • di"删除引号之间的文本

其他人可以在:help text-objects找到


235
投票

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,资本BE仅使用空格作为分隔符逐字移动光标。

大写D(深呼吸)删除光标右侧的其余行,与正常编辑器中的Shift + End / Del相同(注意2个按键 - Shift + D - 而不是3个)


199
投票

我在大多数Vim教程中很少找到的,但它对于我来说是非常有用的(至少对我而言)是

g; and g,

通过变更清单移动(前进,后退)。

让我展示一下我是如何使用它的。有时我需要复制并粘贴一段代码或字符串,比如CSS文件中的十六进制颜色代码,所以我搜索,跳转(不关心匹配的位置),复制它然后跳回(g;)到哪里我正在编辑代码以最终粘贴它。无需创建标记。简单。

只是我的2cents。


184
投票
:%!xxd

将vim变为十六进制编辑器。

:%!xxd -r

还原。

警告:如果不使用二进制文件(-b)进行编辑,则可能会损坏文件。 - Josh Lee在评论中。


121
投票
gv

重新选择最后的视觉选择。


118
投票

有时,.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
© www.soinside.com 2019 - 2024. All rights reserved.