您妈妈从未告诉过您的Vim的黑暗角落是什么?[关闭]


799

人们谈论常见的技巧有很多问题,特别是“ Vim + ctags技巧和窍门 ”。

但是,我没有提到Vim新手会觉得很酷的常用快捷方式。我说的是经验丰富的Unix用户(他们是开发人员,管理员,两者都是),他认为他们知道我们99%的人从未听说过或梦想过的东西。不仅使他们的工作更轻松,而且还使COOL和hackish变得如此。毕竟,Vim驻留在世界上最黑角的OS中,因此它应该具有只有少数特权者知道并希望与我们共享的复杂性。


10
:性别拆分窗口并打开集成文件资源管理器(水平拆分)
user3218088 2014年

2
这个问题似乎是很有建设性的-通过查看赞成投票的数量...,投票决定重新开放-也许会有更酷的答案出现-如果有用的话可以予以赞成-因此为SOF赋予了更多价值。通过投票订购答案,我在短短5分钟内学到了很多很酷的东西...在这里真的很有价值,为什么要关闭一些有价值的东西呢?这怎么不是建设性的?
jhegedus

7
荒谬的是,这个问题已经解决。谈论法制。
鳞翅目

2
我认为这个问题非常有建设性,但在Quora中更合适。
Diogo Melo

2
为什么有2票(截至目前)删除该问题?这可能有什么好处?
Akavall

Answers:


781

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

基本命令,但非常有用。

:w !sudo tee %

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

您显然必须在安装了sudo的系统上并且具有sudo权限。


116
可以说,这甚至比以root用户运行vim 还要!已投票!
Arafangion

27
对于菜鸟来说,Tee到底是做什么的?有人介意为我解析此命令吗?
AndyL'3

41
cmap w!w!sudo tee%
jm666 2011年

58
你不应该跑步sudo vim。相反,您应该导出EDITOR为vim并运行sudoedit
Gerardo Marset 2011年

8
@maximus:vim用当前缓冲区/文件的名称替换%。
migu

617

我最近发现的一些东西我认为很酷:

:earlier 15m

将文档还原到15分钟前的状态。可以采用各种参数来决定要回滚的时间,并且取决于撤消级别。可以用相反的命令反转:later


6
@skinp:如果您撤消然后从撤消状态进行进一步更改,则会丢失该重做历史记录。这使您可以返回到撤消堆栈中不再存在的状态。
–'ethemient

39
g +和g-在时间上前进和后退也非常有用。这比撤消/重做堆栈强大得多,因为在撤消之后执行某些操作时不会丢失历史记录。
Etienne PIERRE,2009年

9
如果您在撤消后进行更改,则不会丢失重做历史记录。只是不容易访问。有一些插件可以帮助您直观地看到这一点,例如Gundo.vim
Ehtesh Choudhury 2011-11-29

559
哇,所以我现在可以:later 8h做,今天已经完成了?:P
伊戈尔·波波夫

7
您的命令假设一个人将在vim上花费至少15分钟!
e2-e4

411

:! [command] 在Vim中执行外部命令。

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

例如:

:.! ls

我经常将其用于将当前日期添加到要输入的文档中:

:.! date

74
这与:r!非常相似。据我所知,唯一的区别是:r!打开一个新行,:。!覆盖当前行。
2009年

6
一种替代方法:.!date是在行上写上“日期”,然后运行!$sh(或者在命令后跟空白行并运行!jsh)。这会将行通过管道传递到“ sh” shell,并替换为命令的输出。
hlovdal

43
:.!实际上是的特殊情况:{range}!,它.通过命令过滤一行范围(当范围为时的当前行),并用输出替换这些行。我发现:%!对过滤整个缓冲区很有用。
Nefrubyr

2
@sundar:sed当您可以使用类似的内置ed/ ex命令时,为什么要将一行传递到?尝试跑步:.s/old/new/g;-)
jabirali 2010年

4
还要注意“!” 类似于“ y”,“ d”,“ c”等。即,您可以执行以下操作:!!,number !!,!motion(例如,!Gshell_command <cr>从当前行替换为文件(“ G”)的末尾) shell_command的输出)。
2013年

312

并不完全晦涩难懂,但是有几个非常有用的“删除”命令,例如:

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

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


8
dab“删除arounb括号”,daB用于大括号,t用于xml类型标签,与常规命令的组合如预期的那样cib / yaB / dit / vat等
sjh 2009年

15
@Masi:yi(va(p仅删除括号
Don Reba

42
这可能是我留在Vim的最大原因。该命令及其等效的“ change”命令:ciw,ci(,ci)以及dt <space>和ct <space>
thomasrutter

4
@thomasrutter:为什么不使用dW / cW而不是dt <space>?

9
@Masi:随着插件环绕:DS(

237

de通过按删除直到单词末尾的所有内容。随心所欲。

ci(xyz [Esc] -这很奇怪。在这里,'i'并不意味着插入模式,而是意味着在括号内。因此,此序列会剪切您所站在的括号内的文本,并将其替换为“XYZ”它也可以在方图括号-只是做CI [或C {相应当然,你可以做二(如果你只是想删除不用输入任何内容的所有文字你也可以做。a而不是i你还要删除括号,而不仅仅是删除括号内的文本。

ci“ -剪切当前引号中的文本

ciw-剪切当前单词。这项工作与上一个类似,(只是用代替了w

C-剪断其余部分,并切换到插入模式。

ZZ-保存和关闭当前文件(比Ctrl-F4更快以关闭当前选项卡!)

ddp-将当前行向下移动一行

xp-将当前角色向右移动一个位置

U-大写,因此viwU单词大写

〜-切换大小写,所以viw~将整个单词的大小写都反转

Ctrl + u / Ctrl + d向上或向下滚动页面半屏。这似乎比通常的全屏分页更为有用,因为它使查看两个屏幕之间的关系更加容易。对于仍然希望一次滚动整个屏幕的用户,Ctrl + f表示前进,Ctrl + b表示后退。Ctrl + Y和Ctrl + E一次向下或向上滚动一行。

疯狂但非常有用的命令是zz-滚动屏幕使该行显示在中间。这非常适合将您正在处理的代码放在您关注的中心。同级命令-zt和zb-使此行成为sreen上的顶部或底部,这不太有用。

查找并跳转到匹配的括号。

de-从光标删除到单词的末尾(您也dE可以删除直到下一个空格)

bde-从左到右分隔符删除当前单词

df [space] -删除直到并包括下一个空格

dt。-删除直到下一个点

dd-删除整行

ye(或yE) -从此处将文本拖到单词的末尾

ce-切出单词的结尾

再见 -复制当前单词(让我怀疑“ hi”的作用!)

yy-复制当前行

cc-剪切当前行,也可以执行此操作S。还有一个下盖s,它可以减少当前字符并切换到插入模式。

viwy或viwc。拉动或更改当前单词。w多次点击以保持选择每个后续单词,用于b向后移动

vi { -选择花括号中的所有文本。va {-选择包括{}的所有文本

vi(p-突出显示()内的所有内容并替换为粘贴的文本

b和e逐字移动光标,类似于Ctrl + Arrows通常的操作。但是,单词的定义有些不同,因为几个连续的分隔符被视为一个单词。如果您从一个单词的中间开始,按b总是可以将您带到当前单词的开头,而每个连续的b都将跳到下一个单词的开头。同样,并且易于记忆,e将光标移动到当前单词及其后的每个单词的末尾。

类似于b/ e,大写BE仅使用空格作为定界符逐字移动光标。

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


15
如果在函数或类定义的开头使用zt,zt非常有用。
尼克·刘易斯,2009年

9
vity并且vitc可以缩短到yitcit分别。
内森·费尔曼

33
您所说的“切割”就是“变更”。例如:C一直更改到行尾。Vim相当于“ cut”的是“ delete”,是用d / D完成的。更改和删除之间的主要区别在于,删除使您进入正常模式,但更改使您进入一种插入模式(尽管您仍处于更改命令中,因为使用可以重复整个更改,因此很方便.)。
Laurence Gonsalves

11
我以为这是很多人不知道的事情清单。yy很常见,我会想到的。
Almo

19
bye在单词的第一个字符时不起作用。yiw总是如此。
Andrea Francia

204

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

g; and g,

在更改列表中移动(向前,向后)。

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

就是我的2美分。


29
同样,'.将转到最后编辑的行,`.并将转到最后编辑的位置
aehlke 2010年

8
Ctrl-O和Ctrl-I(选项卡)的工作原理类似,但不同。它们在“跳转列表”中来回移动,您可以通过:jumps或:ju进行查看。有关更多信息,请执行:help跳转列表
Kimball Robinson 2010年

17
您可以通过执行:changes
Kimball Robinson

热档很有用。我一直使用<C-o>/ <C-i>来标记我的位置。
韦恩·沃纳

187
:%!xxd

使vim成为十六进制编辑器。

:%!xxd -r

还原。

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


9
以及如何将其还原?
基督教徒

40
:!xxd -r //要从HEX还原
Naga Kiran

21
我实际上认为是:%!xxd -r将其恢复
原状

@JoshLee:如果小心不要遍历换行符,不使用-b选项是否安全?我问是因为有时我想进行十六进制更改,但是我不想关闭并重新打开文件。
dotancohen

4
@dotancohen:如果您不想关闭/重新打开文件,可以执行:set binary
Bambu 2014年


119

有时,.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

8
出色的提示-正是我今天要寻找的。
Artem Russakovskii 09年

优秀的小费人!您如何了解这些令人讨厌的事情?
2011年

1
:verbose也可以在之前nmap lhighlight Normal查找上一次定义l键盘映射或高Normal光的位置时使用。对于调试非常有用!
joeytwiddle 2014年

@joeytwiddle谢谢!我将该信息添加到了答案中。
劳伦斯·贡萨尔维斯

当您开始创建自定义映射时,这将节省您很多时间,这可能是其中最有用的(IMO)之一!
SidOfc


98

不知道这是否算是黑角,但我才刚刚学到……

:g/match/y A

会将包含“匹配”的所有行拉入(复制)到"a/ @a寄存器中。(大写字母A使vim 附加字母,而不是替换以前的寄存器内容。)最近,在制作Internet Explorer样式表时,我经常使用它。


计数,计数,因为我还没有看到这个:)

好一个。从来没有听说过...可能有用:P
skinp

5
您可以使用:g!查找与模式不匹配的行,例如:g!/ set / normal dd(删除所有不包含set的行)
tsukimi 2012年

3
有时候,最好按照tsukimi所说的去做,只过滤掉与您的模式不匹配的行。但是,该命令的缩写形式::v/PATTERN/d说明::v是的缩写:g!,该:g命令将所有ex命令应用于行。:y[ank]是可行的:normal,但是在这里最自然的事情就是公正:d[elete]
pandubear

您也可以做:g/match/normal "Ayy- normal关键字让您告诉它运行普通模式命令(您可能更熟悉)。
金博尔·罗宾逊,

93

想看看您的:command历史吗?

q:

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

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

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

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


131
我一直q:无意中击中……
Josh Lee 2009年

11
或者,从ex编辑器(:)中,您可以执行CTRL-f弹出命令历史记录窗口。
杰森·唐

6
@jleedev我也是。我几乎讨厌这个命令,只是因为我不小心使用了太多命令。
bradlis7 2010年

9
q /和q?可以用来为您的搜索模式做类似的事情。
bpw1621 2011年

5
在:或/(或在命令模式下的任何时间)后按<Cf>将会弹出相同的历史记录菜单。因此,您可以重新映射q:如果您不小心将其击中了很多,仍然可以访问这种出色的模式。
idbrii 2011年

82

Vim将打开一个URL,例如

vim http://stackoverflow.com/

不错,当您需要提取页面源以供参考时。


2
对我来说,它并没有打开源。相反,它显然是使用elink将渲染的页面转储到缓冲区中,然后将其打开。
伊万·武西卡(IvanVučica)2010年

执行此命令时出错
Dzung Nguyen 2012年

5
末尾使用斜杠效果更好。整洁的把戏!
Thomas

@Vdt:如果您发布错误,它将很有用。如果是这样的话:“ 错误(netrw)wget和fetch命令都不可用”,您显然需要使PATH环境变量中的这些工具之一可用。
Isaac Nequittepas

当人们将链接发送到粘贴服务而忘记选择语法突出显示时,我发现这一功能特别有用,我通常只需要在附加“&raw”之后在vim中打开链接。
Dettorer 2014年

68

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

例如:

qq0dwj@qq@q

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

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


2
我不知道宏可以重演。凉。注意:qx开始记录到寄存器x中(他将qq用于寄存器q)。0移动到行的开头。dw删除一个字。j向下移动一行。@q将再次运行宏(定义循环)。但是您忘了以最后的“ q”结束录制,然后实际上通过键入@q运行宏。
Kimball Robinson'4

2
我认为这是有意的,作为嵌套和递归的宏。
Yktula

7
qqqqqifuu<Esc>h@qq@q
杰拉尔多·马塞特

6
完成此操作的另一种方法是在寄存器a中记录一个宏,该宏会对单行进行一些转换,然后逐行用V突出显示一堆行,然后键入:normal! @a以将您的宏应用于所选内容中的每一行。
内森·朗

我发现此帖子在谷歌搜索递归VIM宏。除了杀死VIM进程外,我找不到停止宏的方法。
dotancohen

55

假设您已经编译了Perl和/或Ruby支持,:rubydo并且:perldo将在范围内的每一行上运行Ruby或Perl单行代码(默认为整个缓冲区),并$_绑定到当前行的文本(减去换行符)。操纵$_将更改该行的文本。

您可以使用它来执行某些容易用脚本语言完成的事情,但是使用Vim内置函数则不太明显。例如,反转一行中单词的顺序:

:perldo $_ = join ' ', reverse split

在每行末尾插入8个字符(AZ)的随机字符串:

:rubydo $_ += ' ' + (1..8).collect{('A'..'Z').to_a[rand 26]}.join

您只能一次执行一行,并且不能添加换行符。


如果我只希望Perldo在指定的行上运行该怎么办?或选定的几行?
Sujoy

5
您可以像其他任何命令一样给它一个范围。例如:1,5perldo将仅在1-5行上运行。
布赖恩·卡珀

你能做$ _ + ='\ nNEWLINE !!!' 在当前行之后换行?
格雷格,

遗憾的是,它只是在行尾添加了时髦的控制字符。然后,您可以使用Vim搜索/替换将所有这些控制字符更改为真实的换行符。
布赖恩·卡珀

3
同样,pydopy3do Python的工作,如果你有需要的支持编译。
Derecho

54

^ 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” Hmm。您忘记了文件名。只需按^ X ^ F即可完成文件名

^ Z或:sh

临时移动到外壳。如果您需要快速扑打:

  • 按^ Z(将vi置于背景中)返回到原始shell,然后按fg返回到vim
  • 按:sh转到sub shell,然后按^ D / exit返回vi

^X^F我烦恼的是,文件名中包含=符号,使它在许多场合(ini文件,makefile等)都会变坏。我se isfname-==
通常

3
+1内置的自动完成功能只是坐在那里等待被发现。
joeytwiddle 2014年

48
" insert range ip's
"
"          ( O O )
" =======oOO=(_)==OOo======

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

2
我看不出这有什么好处(看起来像个玩笑的答案)。有人可以启发我吗?
瑞安·爱德华兹

2
打开vim,然后执行“:for for range(1,255)| .put = '10 .0.0。'。i | endfor”
codygman 2012年

2
@RyanEdwards可能会填充/ etc / hosts
Ruslan

26
这是一个了不起的答案。不是有关创建IP地址的内容,而是表示VIM可以用于命令中的循环的内容
dotancohen 2014年

4
不使用前模式:i10.0.0.1<Esc>Y254p$<C-v>}g<C-a>
BlackCap

47

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

:e ++enc=cp1250 %:p

当您必须使用旧式编码时很有用。支持的编码在encoding-values(请参阅参考资料help encoding-values)下的表格中列出。类似的事情也适用于++ff,因此,如果您第一次遇到错误,可以使用Windows / Unix行尾重新打开文件(请参阅参考资料help ff)。


从来不需要使用这种东西,但是我们一定会增加我的窍门……

很好的提示,谢谢。对于奖励积分,请添加常见有效编码的列表。
2009年

2
我今天已经用过了,但是我认为不需要指定“%:p”; 只需打开文件,:e ++ enc = cp1250就足够了。I
IvanVučica09年

:set encoding = cp1250是否会有相同的效果?
laz

1
`:E + B%”是同样可用于在二进制模式重新打开(不换行的改写(munging))
直觉

47

键入==将基于上面的行更正当前行的缩进。

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

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

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

然后按=%立即获得此信息:

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

或者,您可以在代码块内执行= a {,而不是将自己放在{字符上。


嗯,我对缩进一无所知。
Ehtesh Choudhury

通常,不需要完全放在牙套上。经常想想我只是=}或者vaBaB=因为它不那么依赖。另外,v}}:!astyle -bj可以更好地匹配我的代码样式,但我可以通过简单的方法将其重新设置为您的样式%!astyle -aj
sehe 2012年

7
gg=G粘贴时非常整洁。
kyrias


@kyrias哦,我一直在做ggVG=
Braden Best

42
imap jj <esc>

7
那么您将如何键入jj?:P
hasen

6
您多久输入一次jj?至少用英语?
ojblass

50
我将大写锁定重新映射为esc,因为这是否则无用的键。我的映射虽然是OS范围的,所以它具有不必担心意外击中它的额外好处。唯一的缺点是它容易让人感到震惊。:)
Alex

7
@Alex:绝对,死锁是死亡。“等等,wtf?哦,那是ZZ?。。废话。”
直觉

5
@ojblass:不知道有多少人曾经权MATLAB代码在Vim的,但iijj通常用于计数器变量,因为ij保留用于复数。
brianmearns 2012年

37

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

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

说明

\(以及\)如何记住正则表达式中的内容。而且\1\2等是如何检索记住的东西。

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

记住所有内容,然后是^I(tab),然后是所有内容。

>>> \2^I\1

将上面的内容替换为“您记得的第二件事”,然后替换为“您记得的第一件事”-本质上是进行转置。


4
彼此之间切换一对制表符分隔的列(分隔符是任意的,都是正则表达式)。
混乱

39
这只是一个正则表达式;许多IDE都进行了正则表达式的搜索和替换。
rlbond

7
@rlbond-归结为IDE中的regex引擎有多好。Vim的正则表达式非常强大。其他人..有时候没有那么多。
rom09年9

3
*将是贪婪的,因此此正则表达式假定您只有两列。如果您希望它不贪婪,请使用{-}而不是*(有关{}乘数的更多信息,请参见:help non-greedy)
Kimball Robinson 2010年

4
这实际上是一个非常简单的正则表达式,只是转义了组括号而使它看起来很复杂。
mk12 2012年

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>

您也可以使用:Explore
RomanPlášil'09 -10-1

嗨,罗马,这正是此映射的作用,但是将其分配给“热键”。:)
KKovacs

27

我喜欢使用“ sudo bash”,而我的系统管理员对此非常讨厌。他锁定了“ sudo”,因此只能与少数命令(ls,chmod,chown,vi等)一起使用,但是无论如何我都能够使用vim来获得root shell:

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

9
FWIW,sudoedit(或sudo -e)编辑特权文件,但以普通用户身份运行编辑器。
RJHunter

12
是的...我也很讨厌你;)你应该只非常需要一个root shell,除非你已经习惯以root身份运行太多命令,这意味着你的权限被搞砸了。
我们都是莫妮卡

5
为什么您的系统管理员甚至给您root?:D
d33tah 2014年

26

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

cd %:h

这是做什么的?并与autchdir一起使用吗?
伦纳德

2
我想它会暂时覆盖autochdir(直到再次切换缓冲区)。基本上,它将目录更改为当前文件的根目录。它给了我比autochdir更多的手动控制。
风铃草

1
:set autochdir //这也提供相同的功能,它将当前目录更改为缓冲区中的文件目录
Naga Kiran

25

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

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

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


16
还有Ctrl-W =,它使窗口的宽度相等。
比尔·林奇

2
别忘了,您可以在数字前加上数字以在Vim中多次执行操作。因此,将当前窗口高度扩展8行:8 <CW> +
joeytwiddle'1

23

这不是一个晦涩的功能,但非常有用且省时。

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

mksession session.vim

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

vim -S session.vim

5
您也可以:so session.vim在vim内部。
TankorSmash 2012年

22
:r! <command>

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

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

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

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

:r! ls *.c

不要查找您在Wikipedia上阅读的事实,而是将其直接粘贴到您正在编写的文档中:

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

14
在插入模式下,^ R = 3 + 5 + 8将使您以较少的击键次数将表达式的值(3 + 5 + 8)插入文本。
Sudhanshu 2010年

如何将结果/输出输出到与当前缓冲区不同的缓冲区?
2011年


21

映射F5以快速ROT13您的缓冲区:

map <F5> ggg?G``

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


14
我不知道你在写什么 ...但是,可以肯定的是,当我的老板看到我写ROT13混杂消息时,他会更加好奇:)
sehe 2012年

或欺骗您的朋友:nmap i ggg?G`` 。或恶魔般的:nmap i ggg?G``i
romeovs 2014年

1
@romeovs第二个是无限循环,请使用nnoremap
阿米特·戈德

19

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

注释代码块。

通过按CTRL-V进入“逐块可视化”模式。

标记您要评论的块。

点击I(大写I)并在行首输入您的注释字符串。(//对于C ++)

按ESC,所有选定的行都将// //放在行的前面。


我添加了#以注释掉ruby中的代码块。我如何撤消它。
Neeraj Singh 2009年

3
你可以只按Ctrl + V再次,标志着//年代和命中X设置为‘取消注释’

6
我为此使用NERDCommenter。
ZyX

1
已注释掉的代码可能是您可能在代码中添加的最差注释类型之一。很棒的块插入有更好的用途。
Braden Best

1
@Pie因为注释掉的代码是无效代码。无效代码无济于事,并且会造成混乱。您认为自己保留了以后可能想带回来的代码,但是总有更好的方法。您可以使用撤消历史记录,可以复制文件,也可以使用git(具有内置功能(git checkout)的git )。至于块插入的更好用途,没有任何固定的条件。只要您有多行要在同一位置插入相同字符序列的位置,就可以使用它。
Braden Best,

17

我几乎使用vim进行任何文本编辑,因此我经常使用复制和粘贴。问题在于,默认情况下,vim经常会通过粘贴使导入的文本变形。阻止这种情况的方法是使用

:set paste

在粘贴数据之前。这样可以避免混乱。

请注意,您将必须发出:set nopaste恢复自动缩进的命令。粘贴预格式化文本的替代方法是剪贴板寄存器(*+),以及:r!cat(您将不得不以^ D结尾粘贴的片段)。

有时打开高对比度配色方案也很有帮助。这可以用

:color blue

我注意到它不适用于我使用的所有版本的vim,但大多数情况下都适用。


10
之所以发生“失真”,是因为您启用了某种形式的自动缩进。使用set pastepastetoggle选项或为该选项指定键是解决此问题的一种常用方法,但是可以达到相同的效果,set mouse=a因为Vim知道看到的大量文本是由鼠标触发的粘贴。
jamessan

1
如果已经安装了gvim,您通常可以直接通过*寄存器从vim直接使用X剪贴板(尽管这取决于您的发行版编译vim的选项)。例如"*p从X xlipboard粘贴。(它也可以在终端vim中运行,只是如果它们是分开的,您可能需要gvim软件包)
kyrias 2013年

2
记录的@kyrias *PRIMARY(“中间单击”)寄存器。该剪贴板+
拉登最好的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.