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

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

但是,我并不是指那些Vim的新用户会觉得很酷的常用快捷键。 我正在谈论一个经验丰富的Unix用户(不pipe他们是开发人员,pipe理员,还是其他人),他们认为他们知道99%的我们从来没有听说过或者梦想过的东西。 这不仅使他们的工作更容易,而且是冷酷和黑客 。 毕竟, Vim居住在世界上最黑暗的angular落的操作系统,因此它应该有复杂的,只有less数特权知道,并希望与我们分享。

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

基本的命令,但非常有用。

:w !sudo tee % 

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

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

我刚刚发现的一些东西我觉得很酷:

 :earlier 15m 

将文档恢复到15分钟前的状态。 对于你想要回滚的时间量可以采取各种各样的论据,并依赖于不足。 可以用相反的命令反转:later

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

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

例如:

 :.! ls 

我使用了很多东西,比如将当前date添加到我input的文档中:

 :.! date 

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

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

还有一些可以在:help text-objects

de按住删除一切,直到单词结尾。 在你心中的渴望。

ci(xyz [Esc]) – 这是一个奇怪的,在这里,'i'不是指插入模式,而是括号里面的内容。 “xyz”,它也可以用在方括号和括号内 – 只要做ci [或ci {相应的,当然,你可以做di(如果你只是想删除所有文本而不input任何内容)。如果你想删除括号,而不仅仅是文本。

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

ciw – 剪切当前的单词。 这个和以前一样工作,除了(w代替)。

C – 切断线路的其余部分并切换到插入模式。

ZZ – 保存并closures当前文件(快于Ctrl-F4closures当前标签!)

ddp – 将当前行移动一行

xp – 将当前字符向右移动一个位置

ü – 大写,所以viwU upercases单​​词

– 开关的情况下,所以viw~会反向整个单词的shell

Ctrl + u / Ctrl + d向上或向下滚动页面的半屏幕。 这似乎比通常的全屏幕分页更有用,因为它更容易查看两个屏幕之间的关系。 对于那些仍然希望一次滚动整个屏幕的人来说,Ctrl + f为Forward,Ctrl + b为Backward。 Ctrl + Y和Ctrl + E一次向下或向上滚动一行。

疯狂但非常有用的命令是zz – 它滚动屏幕使这条线出现在中间。 这对于将您正在处理的代码放在关注的中心非常有用。 兄弟姐妹命令 – zt和zb – 使这一行在屏幕上的顶部或底部不太有用。

find并跳转到匹配的括号。

从光标删除到词的结尾(您也可以删除,直到下一个空格)

bde – 删除当前的词,从左到右分隔符

df [空格] – 删除直到包括下一个空格

DT。 – 删除,直到下一个点

dd – 删除这整行

你(或者你) – 把文本从这里拖到词尾

切 – 贯穿整个词的结尾

再见 – 复制当前字词(让我想知道“嗨”是什么!)

yy – 复制当前行

cc – 剪切当前行,你也可以做S代替。 还有降低电stream字符和切换到插入模式的下限。

viwy或viwc 。 抽出或改变当前的单词。 多次命中w以继续select每个后续单词,使用b向后移动

vi { – select括号内的所有文字。 va { – select包括{}的所有文本

vi(p – 突出显示()中的所有内容,并用粘贴的文本replace

b和e逐词移动光标,类似于Ctrl +箭头通常的做法 。 单词的定义有一点不同,因为连续的几个delmiters被视为一个单词。 如果从一个单词的中间开始,按b将始终让您到当前单词的开头,并且每个连续的b将跳转到下一个单词的开头。 同样,易于记住, e将光标移动到当前的结尾,以及每个后续的单词。

b / e类似,大写字母BE仅使用空格作为分隔符逐词移动光标。

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

在大多数Vim教程中我都很less见到它,但是这对我来说是非常有用的(至less对我来说)是

g; and g,

通过更改列表(向前,向后)移动。

让我来说明一下如何使用它。 有时我需要复制和粘贴一段代码或string,在CSS文件中说一个hex颜色代码,所以我search,跳(不关心匹配的地方),复制它,然后跳回(g;)到哪里我正在编辑代码来最终粘贴它。 不需要创build标记。 简单。

只是我的2cents。

 :%!xxd 

把vim变成一个hex编辑器。

 :%!xxd -r 

还原。

警告:如果不用二进制(-b)编辑,可能会损坏文件。 – 乔希李在评论。

 gv 

重新select最后的视觉select。

有时,.vimrc中的设置将被插件或自动命令覆盖。 要debugging这个有用的技巧是使用:verbose命令与:set。 例如,要弄清楚哪里的cindent有set / unset:

 :verbose set cindent? 

这将输出像这样的东西:

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

这也适用于地图和亮点。 (感谢joeytwiddle指出了这一点。)例如:

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

不知道这是否算黑暗angular落,但我只是刚刚学会了…

 :g/match/y A 

将所有包含“匹配”的行拷贝到"a / @a寄存器中(大写为A使得vim 追加了 yankings而不是replace之前的寄存器内容)。我最近在制作Internet Explorer样式表时使用了它。

:%TOhtml

创build当前文件的html呈现。

想看看你的:命令历史?

 q: 

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

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

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

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

Vim将打开一个URL,例如

 vim http://stackoverflow.com/ 

很好,当你需要拉起页面的来源作为参考。

macros可以调用其他的macros,也可以调用它自己。

例如:

 qq0dwj@qq@q 

…将从每行删除第一个单词直到文件结束。

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

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

你可以用它来做一些脚本语言很容易做的事情,但是使用Vim buildins并不是那么明显。 例如,要颠倒一行中单词的顺序:

 :perldo $_ = join ' ', reverse split 

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

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

您一次只能在一行上操作,不能添加换行符。

^ O和^我

转到更旧/更新的位置。 当你在文件中移动时(通过search,移动命令等等),vim会重播这些“跳转”,所以你可以向后重复这些跳转(^ O – O旧)和前进(^ I – 就在我的键盘旁边)。 在编写代码和执行大量search时,我发现它非常有用。

GI

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

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

 :e ++enc=cp1250 %:p 

当您必须使用传统编码时很有用。 支持的编码在encoding-values (见help encoding-values )。 类似的东西也适用于++ff ,所以如果你第一次遇到错误的话,你可以重新打开Windows / Unix下的文件(参见ff )。

 " insert range ip's " " ( OO ) " =======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 {而不是将自己置于{字符上。

 imap jj <esc> 

让我们看看一些漂亮的IDE编辑器做列转置。

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

说明

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

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

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

 >>> \2^I\1 

把上面的东西换成“你记得的第二件东西”,然后是“你记得的第一件东西” – 本质上是做一个转置。

不完全是一个黑暗的秘密,但我喜欢把下面的映射到我的.vimrc文件,所以我可以随时打“ – ”(减号)打开文件资源pipe理器显示文件毗邻我刚刚编辑 。 在文件资源pipe理器中,我可以打另一个“ – ”向上移动一个目录,为复杂的目录结构提供无缝浏览(如现在使用的MVC框架):

 map - :Explore<cr> 

这些对于某些人来说也是有用的。 我喜欢滚动屏幕并同时前进光标:

 map <cj> j<ce> map <ck> k<cy> 

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

 map <cl> :tabnext<enter> map <ch> :tabprevious<enter> 

仅在Mac OS X上:类似Safari的标签导航:

 map <SD-Right> :tabnext<cr> map <SD-Left> :tabprevious<cr> 

通常,我喜欢在编辑时更改当前目录 – 所以我必须指定较less的path。

 cd %:h 

我喜欢用'sudo bash',而我的系统pipe理员讨厌这个。 他locking了“sudo”,所以它只能用于一些命令(ls,chmod,chown,vi等),但是我可以使用vim来获取root shell:

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

I often use many windows when I work on a project and sometimes I need to resize them. Here's what I use:

 map + <CW>+ map - <CW>- 

These mappings allow to increase and decrease the size of the current window. It's quite simple but it's fast.

 :r! <command> 

pastes the output of an external command into the buffer.

Do some math and get the result directly in the text:

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

Get the list of files to compile when writing a Makefile:

 :r! ls *.c 

Don't look up that fact you read on wikipedia, have it directly pasted into the document you are writing:

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

I just found this one today via NSFAQ :

Comment blocks of code.

Enter Blockwise Visual mode by hitting CTRL-V.

Mark the block you wish to comment.

Hit I (capital I) and enter your comment string at the beginning of the line. (// for C++)

Hit ESC and all lines selected will have // prepended to the front of the line.

Not an obscure feature, but very useful and time saving.

If you want to save a session of your open buffers, tabs, markers and other settings, you can issue the following:

 mksession session.vim 

You can open your session using:

 vim -S session.vim 

Map F5 to quickly ROT13 your buffer:

 map <F5> ggg?G`` 

You can use it as a boss key :).

I use vim for just about any text editing I do, so I often times use copy and paste. The problem is that vim by default will often times distort imported text via paste. The way to stop this is to use

 :set paste 

before pasting in your data. This will keep it from messing up.

Note that you will have to issue :set nopaste to recover auto-indentation. Alternative ways of pasting pre-formatted text are the clipboard registers ( * and + ), and :r!cat (you will have to end the pasted fragment with ^D).

It is also sometimes helpful to turn on a high contrast color scheme. This can be done with

 :color blue 

I've noticed that it does not work on all the versions of vim I use but it does on most.