当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《你母亲从未告诉过你的Vim的黑暗角落是什么?》经验,为你挑选了47个好方法。

有很多问题让人们谈论常见的技巧,特别是" Vim + ctags提示和技巧 ".

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



1> skinp..:

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

基本命令,但非常有用.

:w !sudo tee %

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

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


可以说,甚至比以root身份运行vim更好*!Upvoted!
你永远不应该运行`sudo vim`.相反,你应该将`EDITOR`导出为vim并运行`sudoedit`.
cmap w !! w!sudo tee%
对于一个菜鸟,三通究竟做了什么?有人会介意为我解析这个命令吗?
@maximus:vim将%替换为当前缓冲区/文件的名称.
这是我最喜欢的vi voodo,放下手.
更好的是首先使用sudoedit.否则,我会使用":w!sudo dd of =%",因为这样就不会用你要保存的文件轰炸你了.
T恤在您的输出中创建T形接头.例如,您可以输出到屏幕和文件.最好搜索SO或谷歌以获得更详细的答案.或者问一个问题!
@tsukimi哇,感谢http://commandlinefu.com的链接; 多棒的网站!
很棒的命令,自从我从Slackware转移到Ubuntu以来,我已经失去了这次发生在我身上的次数.
要映射x !! sudo写和退出使用:`cmap x !! w!sudo tee% :q!`
我是初学vim用户,即使我知道这个命令,我认为这是一个常见命令.它是[commandlinefu]上的最高评级命令(http://www.commandlinefu.com/commands/browse/sort-by-votes )

2> Chad Birch..:

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

:earlier 15m

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


哇,所以现在我可以做':晚8h',我今天完成了?:P
同样非常有用的是g +和g-以及时前进和后退.这比undo/redo堆栈强大得多,因为在撤消后执行某些操作时不会丢失历史记录.
如果在撤消后进行更改,则不会丢失重做历史记录.它只是不容易访问.有一些插件可以帮助您将其可视化,例如Gundo.vim
你的命令假设一个人将在*vim*中花费至少15分钟!
@skinp:如果撤消然后从撤消状态进行进一步更改,则会丢失该重做历史记录.这使您可以返回到不再位于撤消堆栈中的状态.

3> Jeffrey Knig..:

:! [command] 当你在Vim时执行外部命令.

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

例如:

:.! ls

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

:.! date


这非常类似于:r!据我所知,唯一的区别是:r!打开一个新行,:.!覆盖当前行.
`:.!`实际上是`:{range}!`的特殊情况,它通过命令过滤一系列行(范围为`.`时的当前行)并用输出替换这些行.我发现`:%!`对于过滤整个缓冲区很有用.
`:.!date`的替代方法是在一行上写"date"然后运行`!$ sh`(或者用命令后面跟一个空行并运行`!jsh`).这会将该行传递给"sh"shell并替换为该命令的输出.
还要注意'!' 就像'y','d','c'等等.即你可以这样做:!!,数字!!,!运动(例如!Gshell_command 从当前行替换为文件末尾('G')输出shell_command).
@sundar:为什么你可以使用类似的内置`ed` /`ex`命令将一行传递给`sed`?尝试运行`:.s/old/new/g` ;-)
你知道吗,你可以双击(`!!`)自动填写`:.!`?当你不想输入所有内容时非常方便.它甚至可以在`vim -u none`中使用

4> dbr..:

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

diw 删除当前单词

di( 删除当前的parens

di" 删除引号之间的文本

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


这可能是我和Vim待在一起的最大原因.那及其等效的"更改"命令:ciw,ci(,ci",以及dt 和ct
@Masi:yi(va(p只删除括号
@Masi:使用环绕插件:ds(.
dab"删除arounb括号",daB代表大括号,t代表xml类型标签,与普通命令的组合是预期的cib/yaB/dit/vat等
@thomasrutter:为什么不用dW/cW而不是dt

5> 小智..:

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个)


你称之为"切"的所有东西都是"改变".例如:C改变直到行结束.Vim相当于"cut"是"删除",用d/D完成.更改和删除之间的主要区别在于删除会使您处于正常模式,但更改会使您进入一种插入模式(尽管您仍然使用更改命令,因为整个更改可以使用`.`重复) .
当你在这个词的第一个字符时,`bye`不起作用.`yiw`总是这样.
如果在函数或类定义的开头使用它,**zt**非常有用.
我认为这是一份很少有人知道的事情清单.yy很常见,我想.
`vity`和`vitc`可分别缩写为`yit`和`cit`.
回顾这个答案,运算符和运动/对象命令的随机组合列表几乎不是vim的"黑暗角落".如果你认为这些是单独的命令,那么你做错了.c,d,y和v是运算符.e,w,t,f是动作.i(,ip,iw,i",和a相同而不是i是对象.(这些都是vim实际提供的子集 - 我只是提到了这个答案中出现的那些)将运算符与一个动作或一个物体(或自我,除了v)来创建一个命令.从我列出的那个,你可以制作超过50个命令.
我认为大多数这些都不是暗角,每个vim用户都应该知道这些基本命令.

6> Xavier Guard..:

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

g; and g,

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

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

只是我的2cents.


类似地,`'.`将转到最后编辑的行,而```.`将转到最后编辑的位置
您可以通过执行以下操作列出更改列表:更改
Ctrl-O和Ctrl-I(选项卡)的工作方式类似,但不一样.它们在"跳转列表"中前后移动,您可以通过以下操作查看:跳转或:ju有关更多信息,请执行以下操作:help jumplist

7> Bill Lynch..:
:%!xxd

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

:%!xxd -r

还原.

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


:!xxd -r //从HEX恢复
我实际上认为它是`:%!xxd -r`将其还原
你怎么还原它呢?
@dotancohen:如果你不想关闭/重新打开文件,你可以这样做:设置二进制文件

8> AaronS..:
gv

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



9> Laurence Gon..:

有时,.vimrc中的设置将被插件或自动命令覆盖.要调试它,一个有用的技巧是使用:verbose命令和:set.例如,要找出cindent设置/取消设置的位置:

:verbose set cindent?

这将输出如下内容:

cindent
    Last set from /usr/share/vim/vim71/indent/c.vim

这也适用于地图和高光.(感谢joeytwiddle指出这一点.)例如:

:verbose nmap U
n  U             
        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


优秀的提示 - 正是我今天所寻找的.

10> N 1.1..:

:%TOhtml

创建当前文件的html呈现.



11> sjh..:

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

:g/match/y A

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


你可以使用:g!查找与模式ex:g!/ set/normal dd不匹配的行(删除所有不包含set的行)
有时最好做tsukimi所说的,只过滤掉与你的模式不符的线条.该命令的缩写版本:`:v/PATTERN/d`说明:`:v`是`:g!`的缩写,`:g`命令将任何ex命令应用于行.`:y [ank]`有效,``normal`也是如此,但这里最自然的事情就是`:d [elete]`.

12> MikeyB..:

想看看你的:命令历史?

q:

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

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

:set hidden
:map  :e#

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


我一直偶然打出`q:`......
或者,从ex编辑器(:),您可以执行CTRL-f以弹出命令历史记录窗口.
q /和q?可以用来为你的搜索模式做类似的事情.
@jleedev我也是.我几乎讨厌这个命令,只是因为我意外地使用它太多了.
在:或/(或您处于命令模式下的任何时间)之后按将显示相同的历史记录菜单.所以你可以重新映射q:如果你不小心碰到了它,仍然可以访问这个很棒的模式.

13> Cercerilla..:

例如,Vim将打开一个URL

vim http://stackoverflow.com/

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


最后使用斜杠更好地工作.干净的把戏!
对我而言,它没有打开源头; 相反,它显然使用elinks将渲染的页面转储到缓冲区,然后打开它.

14> spence91..:

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

例如:

qq0dwj@qq@q

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

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


`qqqqqifuu H + QQ @ q`
另一种实现此目的的方法是在寄存器a中记录一个宏,对一行进行一些转换,然后用V线条突出显示一串行并输入`:normal!@ a`将您的宏应用于您选择的每一行.
我不知道宏可以重复自己.凉.注意:qx开始记录到寄存器x(他使用qq作为寄存器q).0移动到行的开头.dw删除了一个单词.j向下移动一条线.@q将再次运行宏(定义一个循环).但是你忘了用最后的"q"结束录音,然后输入@q实际运行宏.
我认为这是有意的,作为嵌套和递归宏.

15> Brian Carper..:

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

您可以使用它来执行某些易于使用脚本语言执行的操作,但使用Vim内置函数则不那么明显.例如,要反转一行中单词的顺序:

:perldo $_ = join ' ', reverse split

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

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

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


您可以像任何其他命令一样给它一个范围.例如:1,5perldo只能在1-5行上运行.
类似地,如果你有编译所需的支持,`pydo`和`py3do`适用于python.

16> dimba..:

^ O和^ I

转到较旧/较新的位置.当您浏览文件时(通过搜索,移动命令等),vim将这些"跳跃"重新加入,这样您就可以向后重复这些跳转(旧的^ O - O)并向前跳转(^ I - 在键盘上我旁边).我发现在编写代码和执行大量搜索时非常有用.

GI

转到最后停止插入模式的位置.我发现自己经常编辑,然后搜索一些东西.要返回编辑位置,请按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


+1内置自动完成功能只是坐在那里等待被发现.

17> zoul..:

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

:e ++enc=cp1250 %:p

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


我今天用过这个,但我想我不需要指定"%:p"; 只是打开文件并且:e ++ enc = cp1250就足够了.一世

18> SergioAraujo..:
" insert range ip's
"
"          ( O O )
" =======oOO=(_)==OOo======

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


这是一个很棒的答案.不是关于创建IP地址,而是暗示**VIM可以用于命令中的循环**.
没有ex模式:`i10.0.0.1 Y254p $ } g `
我不知道这有什么好处(除了看起来像个笑话答案).别人可以开导我吗?
@RyanEdwards可能填写/ etc/hosts

19> Kimball Robi..:

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

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

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

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

并按=%立即得到这个:

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

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


粘贴东西时,`gg = G`非常整洁.

20> Trumpi..:
imap jj 


我重新将重新锁定到esc,因为它是一个无用的密钥.我的映射虽然是OS操作系统,但它还有一个额外的好处,就是不必担心意外碰到它.唯一的缺点是人们对人们不屑一顾.:)
你怎么打字jj呢?:P
@Alex:绝对是,死锁是死亡."等等,wtf?哦,那是ZZ?......废话."
你多久输入一次jj?至少用英语?
@ojblass:不确定有多少人在Vim中使用matlab代码,但是`ii`和`jj`通常用于计数器变量,因为`i`和`j`是为复数保留的.
我用jk退出:)
我不能没有jj映射.我用j j键入我的jjs
`jk` - 一旦你去jk,你就不用别的了.我有`Shift + Space`来切换插入模式,系统范围的上限到esc,`jj`和内置`C- [`.但是`jk`击败了他们.我在vim wikia中读过它,但忽略了它,因为我无法写jk!从那时起已经有一段时间了,从来没有必要从字面上写jk.它应该是一个vim默认:) imap jk vmap jk (退出视觉模式!)

21> chaos..:

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

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

说明

\(并且\)是如何记住正则表达式中的东西.而且\1,\2等是如何检索记住的东西.

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

记住所有内容后跟^I(tab)后跟一切.

>>> \2^I\1

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


这只是一个正则表达式; 大量的IDE都有正则表达式搜索和替换.
@rlbond - 归结为IDE中的正则表达式引擎有多好.Vim的正则表达非常强大; 别人..有时候不是那么多.
将一对制表符分隔的列(任意分隔符,它们都是正则表达式)相互切换.
这实际上是一个非常简单的正则表达式,它只是逃避组括号使它看起来很复杂.
*将是贪婪的,所以这个正则表达式假设你只有两列.如果你想要它是非常的,请使用{ - }代替*(参见:帮助非贪婪获取有关{}乘数的更多信息)
顺便说一下,^ I意味着是一个标签.
@intuited - 当然.但我从来没有发现这就是我想要的一切.:)

22> 小智..:

这不是一个黑暗的秘密,但我喜欢将以下映射放入我的.vimrc文件中,因此我可以随时点击" - "(减号)打开文件浏览器以显示与我刚编辑的文件相邻的文件.在文件资源管理器中,我可以点击另一个" - "来向上移动一个目录,提供复杂目录结构的无缝浏览(就像现在的MVC框架所使用的那样):

map - :Explore

这些对某些人也有用.我喜欢滚动屏幕并同时前进光标:

map  j
map  k

标签导航 - 我喜欢标签,我需要在它们之间轻松移动:

map  :tabnext
map  :tabprevious

仅在Mac OS X上:类似Safari的选项卡导航:

map  :tabnext
map  :tabprevious



23> too much php..:

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

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


是啊...我也讨厌你;)你应该只需要一个非常简单的root shell,除非你已经养成了以root身份运行太多命令的习惯,这意味着你的权限都被搞砸了.
FWIW,sudoedit(或sudo -e)编辑特权文件,但以普通用户身份运行编辑器.
为什么你的系统管理员甚至会给你root?:d
@OP:那很狡猾.:)

24> rampion..:

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

cd %:h


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

25> Taurus Olson..:

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

map + +
map - -

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


还有Ctrl-W =,这使得窗口宽度相等.
不要忘记您可以在Vim中添加数字以多次执行操作.所以要将当前窗口高度扩展8行:8 +

26> Roberto Bonv..:
:r! 

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

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

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

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

:r! ls *.c

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

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


在插入模式下,^ R = 3 + 5 + 8将允许您在文本中插入表达式(3 + 5 + 8)的值,并减少击键次数.

27> mohi666..:

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

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

mksession session.vim

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

vim -S session.vim


你也可以在vim里面`:so session.vim`.

28> jqno..:

将F5映射到ROT13缓冲区:

map  ggg?G``

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


我不知道_what_你在写......但是当他看到我写ROT13混乱时,老板会更好奇:)

29> Grant Limber..:

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

注释代码块.

按CTRL-V进入Blockwise Visual模式.

标记您要评论的块.

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

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


我使用NERDCommenter.
您可以再次点击ctrl + v,标记//并点击x以"取消注释"

30> 小智..:

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

:set paste

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

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

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

:color blue

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


"失真"正在发生,因为您启用了某种形式的自动缩进.使用`set paste`或指定`pastetoggle`选项的键是解决此问题的常用方法,但使用`set mouse = a`可以实现相同的效果,因为Vim知道它看到的文本泛滥是由鼠标触发的粘贴.
@kyrias作为记录,`*`是`PRIMARY`("中键单击")寄存器.*clipboard*是`+`

31> viraptor..:

这是不明显的事情.如果你的$ HOME中有很多自定义插件/扩展,你需要在su/sudo/...中工作,那么这可能很有用.

在你的〜/ .bashrc中:

export VIMINIT=":so $HOME/.vimrc"

在你的〜/ .vimrc中:

if $HOME=='/root'
        if $USER=='root'
                if isdirectory('/home/your_typical_username')
                        let rtuser = 'your_typical_username'
                elseif isdirectory('/home/your_other_username')
                        let rtuser = 'your_other_username'
                endif
        else
                let rtuser = $USER
        endif
        let &runtimepath = substitute(&runtimepath, $HOME, '/home/'.rtuser, 'g')
endif

if ! isdirectory(expand('~/vimtmp'))
   call mkdir(expand('~/vimtmp'))
endif
if isdirectory(expand('~/vimtmp'))
   set directory=~/vimtmp
else
   set directory=.,/var/tmp,/tmp
endif

另外,我使用一些映射来简化编辑 - 使ctrl + s像escape一样工作,ctrl + h/l切换选项卡:

inoremap  
vnoremap  
noremap  gt
noremap  gT



32> Niki Yoshiuc..:

在插入模式下,Ctrl-n将根据打开缓冲区中的所有单词自动完成您键入的任何单词.如果有多个匹配,它将为您提供可以使用ctrl-n和ctrl-p循环的可能单词列表.



33> caskey..:

想要IDE吗?

:make将在当前目录中运行makefile,解析编译器输出,然后可以使用:cn:cp逐步执行编译器错误打开每个文件并寻找有问题的行号.

:syntax on 打开vim的语法高亮显示.



34> daltonb..:
gg=G

更正整个文件的缩进.我在Eclipse中错过了我的信任,但刚刚发现vim很好地处理它.


`=%`也应该这样做.

35> Scotty Allen..:

我经常想要突出显示特定的单词/函数名称,但不想搜索它的下一个实例:

map m* *#



36> mohi666..:

能够在基于客户端/服务器的模式下运行Vim.

例如,假设您正在处理一个项目,该项目在会话文件session.vim上保存了大量缓冲区,选项卡和其他信息.

您可以通过发出以下命令来打开会话并创建服务器:

vim --servername SAMPLESERVER -S session.vim

请注意,如果要创建服务器,则可以打开常规文本文件,而不必是会话.

现在,假设您在另一个终端并需要打开另一个文件.如果您通过发布以下内容定期打开:

vim new_file.txt

您的文件将在单独的Vim缓冲区中打开,这很难与会话中的文件进行交互.要在服务器上的新选项卡中打开new_file.txt,请使用以下命令:

vim --servername SAMPLESERVER --remote-tab-silent new_file.txt

如果没有服务器正在运行,则此文件将像常规文件一样打开.

由于每次要运行它们时都提供这些标记非常繁琐,因此可以创建单独的别名来创建客户端和服务器.

我将以下内容放在我的bashrc文件中:

alias vims='vim --servername SAMPLESERVER'
alias vimc='vim --servername SAMPLESERVER --remote-tab-silent'

您可以在以下网址找到更多相关信息:http://vimdoc.sourceforge.net/htmldoc/remote.html



37> jm666..:

sudo的变化写:

进入.vimrc

cmap w!! w !sudo tee % >/dev/null

重新加载vim之后你可以做"sudo save"

:w!!



38> michael..:

HOWTO:在Bash中使用Vim时自动完成Ctags.对于使用Vim和Ctags的其他人,我为Bash写了一个小的自动完成函数.将以下内容添加到〜/ .bash_completion文件中(如果它不存在则创建它):

感谢fashionpants的许多修复和改进.

_vim_ctags() {
    local cur prev

    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    case "${prev}" in
        -t)
            # Avoid the complaint message when no tags file exists
            if [ ! -r ./tags ]
            then
                return
            fi

            # Escape slashes to avoid confusing awk
            cur=${cur////\\/}

            COMPREPLY=( $(compgen -W "`awk -vORS=" "  "/^${cur}/ { print \\$1 }" tags`" ) )
            ;;
        *)
            _filedir_xspec
            ;;
    esac
}

# Files matching this pattern are excluded
excludelist='*.@(o|O|so|SO|so.!(conf)|SO.!(CONF)|a|A|rpm|RPM|deb|DEB|gif|GIF|jp?(e)g|JP?(E)G|mp3|MP3|mp?(e)g|MP?(E)G|avi|AVI|asf|ASF|ogg|OGG|class|CLASS)'

complete -F _vim_ctags -f -X "${excludelist}" vi vim gvim rvim view rview rgvim rgview gview

重新启动Bash会话(或创建新会话)后,您可以键入:

码:

~$ vim -t MyC

它将以与文件和目录相同的方式自动完成标记:

码:

MyClass MyClassFactory
~$ vim -t MyC

当我进入快速错误修复时,我发现它非常有用.



39> Ben..:

当你想要跨文件的两个不同副本区分文件而不会弄脏小指(从project1的根目录)时,%也很好:

:vert diffs /project2/root/%



40> Gary Chamber..:

我将Vim用于一切.当我编辑电子邮件时,我使用:

gqap(或gwap)

广泛地容易和正确地逐段重新格式化,即使使用引号字符.为了实现这个功能,我还添加:

-c 'set fo=tcrq' -c 'set tw=76'

从外部调用编辑器的命令.一个值得注意的补充是在fo(formatoptions)参数中添加' a '.这将在您键入和导航内容时自动重新格式化段落,但可能会干扰或导致消息中包含的错误或奇怪格式的问题.



41> Naga Kiran..:

:setlocal autoread

自动重新加载当前缓冲区.在查看日志文件时特别有用,它几乎可以在vim中的unix中提供"尾部"程序的功能.

从vim中检查编译错误.设置makeprg变量取决于perl所说的语言

:setlocal makeprg = perl\-c \%

对于PHP

set makeprg = php\-l \%
set errorformat =%m\in \%f\on\line \%l

发出":make"运行相关的makeprg并在quickfix窗口中显示编译错误/警告,并可以轻松导航到相应的行号.



42> Luper Rouch..:

从十六进制值(插入模式)输入一个字符:

x[type the hexadecimal byte]


如果您正在使用可怕的mswin.vim(或者您自己映射),那么它只是.

43> Trumpi..:

把它放在你的.vimrc中,以获得一个漂亮打印xml的命令:

function FormatXml()
    %s:\(\S\)\(<[^/]\)\|\(>\)\(


在linuxes(通常安装xmllint)我通常只做:%!xmllint - 为此.

44> Brad Cox..:

我确信有人会发布这个,但是这里有.

随便采取任何构建系统; 制作,mvn,蚂蚁,等等.在项目目录的根目录中,创建一直使用的命令文件,如下所示:

mvn install
mvn clean install
...等等

要进行构建,将光标放在该行上并键入!! sh.即过滤那条线; 将它写入shell并替换为结果.

构建日志替换了行,准备滚动,搜索等等.

查看完日志后,键入u以撤消,然后返回到命令文件.


为什么不将`makeprg`设置为您用于构建的正确工具(如果它尚未设置),然后使用`:make`?`:copen`将显示构建的输出,并允许您跳转到任何警告/错误.

45> SergioAraujo..:
==========================================================
In normal mode
==========================================================
gf ................ open file under cursor in same window --> see :h path
Ctrl-w f .......... open file under cursor in new window
Ctrl-w q .......... close current window
Ctrl-w 6 .......... open alternate file --> see :h #
gi ................ init insert mode in last insertion position
'0 ................ place the cursor where it was when the file was last edited



46> Roman Plášil..:

由于延迟和缺乏颜色(我喜欢配色方案:)我不喜欢在PuTTY中的远程机器上编程.所以我开发了这个技巧来解决这个问题.我在Windows上使用它.

你会需要

1x gVim

远程和本地计算机上的1x rsync

1x SSH私钥验证到远程计算机,因此您无需键入密码

1x 选美

1x PuTTY

设置远程机器

配置rsync以使您的工作目录可访问.我使用SSH隧道,只允许来自隧道的连接:

address = 127.0.0.1
hosts allow = 127.0.0.1
port = 40000
use chroot = false
[bledge_ce]
    path = /home/xplasil/divine/bledge_ce
    read only = false

然后启动rsyncd:rsync --daemon --config = rsyncd.conf

设置本地计算机

从Cygwin安装rsync.启动Pageant并加载远程计算机的私钥.如果您正在使用SSH调整,请启动PuTTY以创建隧道.在工作目录中创建一个批处理文件push.bat,它将使用rsync将更改的文件上载到远程计算机:

rsync --blocking-io *.cc *.h SConstruct rsync://localhost:40001/bledge_ce

SConstruct是scons的构建文件.修改文件列表以满足您的需要.如果不使用SSH调整,请将localhost替换为远程计算机的名称.

配置Vim 现在很容易.我们将使用quickfix功能(:make和错误列表),但编译将在远程计算机上运行.所以我们需要设置makeprg:

set makeprg=push\ &&\ plink\ -batch\ xplasil@anna.fi.muni.cz\ \"cd\ /home/xplasil/divine/bledge_ce\ &&\ scons\ -j\ 2\"

这将首先启动push.bat任务以上载文件,然后使用SSH(PuTTY套件中的Plink)在远程计算机上执行命令.该命令首先将目录更改为工作目录,然后开始构建(我使用scons).

构建结果将在您的本地gVim错误列表中方便地显示.



47> quabug..:

set colorcolumn=+1或者set cc=+1对于vim 7.3


`colorcolumn`允许您指定突出显示的列(这是确保您的行不会太长的理想选择).在原始答案中,`set cc = + 1`突出显示`textwidth`之后的列.有关更多信息,请参阅[文档](http://vimdoc.sourceforge.net/htmldoc/options.html#%27colorcolumn%27).
@LucM如果你试过它为什么没有*你*提供解释?
推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有