你母亲从未告诉过你的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
类似,大写字母B
和E
仅使用空格作为分隔符逐词移动光标。
大写字母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.