有很多问题让人们谈论常见的技巧,特别是" Vim + ctags提示和技巧 ".
但是,我没有提到Vim的新手会觉得很酷的常用快捷方式.我说的是一个经验丰富的Unix用户(他们是开发人员,管理员,两者等),他们认为他们知道我们99%的人从未听过或梦到过的东西.有些东西不仅让他们的工作变得更轻松,而且还很酷,而且很酷.毕竟,Vim居住在世界上最黑暗角落最丰富的操作系统中,因此它应该只有少数特权知道并希望与我们分享的错综复杂.
可能不是99%的Vim用户不知道的,但这是我每天使用的东西,任何Linux + Vim poweruser都必须知道.
基本命令,但非常有用.
:w !sudo tee %
在编辑我没有写入权限的文件之前,我经常忘记sudo.当我来保存该文件并获得权限错误时,我只发出该vim命令以保存文件而无需将其保存到临时文件,然后再将其复制回来.
你显然必须在安装了sudo的系统上并拥有sudo权限.
我刚刚发现的一些我认为非常酷的东西:
:earlier 15m
将文档还原为15分钟前的状态.可以针对您想要回滚的时间量采用各种参数,并且取决于undolevels.可以用相反的命令反转:later
:! [command]
当你在Vim时执行外部命令.
但是在冒号后添加一个点 :.! [command]
,它会将命令的输出转储到当前窗口中.那是: . !
例如:
:.! ls
我使用这个很多东西,例如将当前日期添加到我正在键入的文档中:
:.! date
不完全晦涩,但有几个"删除"命令非常有用,比如..
diw
删除当前单词
di(
删除当前的parens
di"
删除引号之间的文本
其他人可以找到 :help text-objects
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
,大写B
并E
使用空格作为分隔符逐字移动光标.
大写D(深呼吸)删除光标右侧的其余行,与正常编辑器中的Shift + End/Del相同(注意2个按键 - Shift + D - 而不是3个)
我在大多数Vim教程中很少找到的,但它对于我来说是非常有用的(至少对我而言)是
g; and g,
通过变更清单移动(前进,后退).
让我展示一下我是如何使用它的.有时我需要复制并粘贴一段代码或字符串,比如CSS文件中的十六进制颜色代码,所以我搜索,跳转(不关心匹配的位置),复制它然后跳回(g;)到哪里我正在编辑代码以最终粘贴它.无需创建标记.简单.
只是我的2cents.
:%!xxd
将vim变为十六进制编辑器.
:%!xxd -r
还原.
警告:如果不使用二进制文件(-b)进行编辑,则可能会损坏文件. - Josh Lee在评论中.
gv
重新选择最后的视觉选择.
有时,.vimrc中的设置将被插件或自动命令覆盖.要调试它,一个有用的技巧是使用:verbose命令和:set.例如,要找出cindent设置/取消设置的位置:
:verbose set cindent?
这将输出如下内容:
cindent Last set from /usr/share/vim/vim71/indent/c.vim
这也适用于地图和高光.(感谢joeytwiddle指出这一点.)例如:
:verbose nmap U n ULast 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
:%TOhtml
创建当前文件的html呈现.
不确定这是否算作暗角,但我只是刚刚学会了......
:g/match/y A
将所有包含"匹配"的行拉入(复制)到"a
/ @a
register中.(大写字母A
使得vim 附加了 yankings而不是替换之前的寄存器内容.)我最近在制作Internet Explorer样式表时使用了很多.
想看看你的:命令历史?
q:
然后浏览,编辑,最后执行命令.
是否对两个文件进行了类似的更改并在它们之间来回切换?(说,源文件和头文件?)
:set hidden :map:e#
然后在这些文件之间来回切换.
例如,Vim将打开一个URL
vim http://stackoverflow.com/
当你需要提取页面的来源以供参考时很好.
宏可以调用其他宏,也可以调用自己.
例如:
qq0dwj@qq@q
...将从每行删除第一个单词,直到文件结尾.
这是一个非常简单的例子,但它展示了vim的一个非常强大的功能
假设你编译了Perl和/或Ruby支持,:rubydo
并且:perldo
将在一个范围内的每一行(默认为整个缓冲区)上运行Ruby或Perl一行,并$_
绑定到当前行的文本(减去换行符).操作$_
将改变该行的文本.
您可以使用它来执行某些易于使用脚本语言执行的操作,但使用Vim内置函数则不那么明显.例如,要反转一行中单词的顺序:
:perldo $_ = join ' ', reverse split
要在每行的末尾插入一个8个字符(AZ)的随机字符串:
:rubydo $_ += ' ' + (1..8).collect{('A'..'Z').to_a[rand 26]}.join
您一次只能在一行上执行操作,并且无法添加换行符.
^ 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
这是一个很好的技巧,用不同的编码重新打开当前文件:
:e ++enc=cp1250 %:p
在必须使用旧编码时很有用.支持的编码列在encoding-values
(见help
encoding-values
)下的表格中.类似的东西也适用++ff
,所以如果你第一次弄错了,你可以用Windows/Unix行结束重新打开文件(参见参考资料help
ff
).
" insert range ip's " " ( O O ) " =======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 {而不是将自己定位在{character.
imap jj
让我们看看一些非常小的IDE编辑器进行列转换.
:%s/\(.*\)^I\(.*\)/\2^I\1/
说明
\(
并且\)
是如何记住正则表达式中的东西.而且\1
,\2
等是如何检索记住的东西.
>>> \(.*\)^I\(.*\)
记住所有内容后跟^I
(tab)后跟一切.
>>> \2^I\1
用"你记得的第二个东西"替换上面的东西,接着是"你记得的第一个东西" - 基本上做一个转置.
这不是一个黑暗的秘密,但我喜欢将以下映射放入我的.vimrc文件中,因此我可以随时点击" - "(减号)打开文件浏览器以显示与我刚编辑的文件相邻的文件.在文件资源管理器中,我可以点击另一个" - "来向上移动一个目录,提供复杂目录结构的无缝浏览(就像现在的MVC框架所使用的那样):
map - :Explore
这些对某些人也有用.我喜欢滚动屏幕并同时前进光标:
mapj map k
标签导航 - 我喜欢标签,我需要在它们之间轻松移动:
map:tabnext map :tabprevious
仅在Mac OS X上:类似Safari的选项卡导航:
map:tabnext map :tabprevious
我喜欢使用'sudo bash',我的系统管理员讨厌这个.他锁定了'sudo',所以它只能用于一些命令(ls,chmod,chown,vi等),但我能够使用vim来获得root shell:
bash$ sudo vi +'silent !bash' +q Password: ****** root#
通常,我喜欢在编辑时更改当前目录 - 所以我必须更少地指定路径.
cd %:h
我在项目工作时经常使用很多窗口,有时我需要调整它们的大小.这是我使用的:
map ++ map - -
这些映射允许增加和减小当前窗口的大小.这很简单,但速度很快.
:r!
将外部命令的输出粘贴到缓冲区中.
做一些数学运算并直接在文本中得到结果:
:r! echo $((3 + 5 + 8))
获取编写Makefile时要编译的文件列表:
:r! ls *.c
不要查看您在维基百科上阅读的那个事实,将其直接粘贴到您正在编写的文档中:
:r! lynx -dump http://en.wikipedia.org/wiki/Whatever
不是一个不起眼的功能,但非常有用,节省时间.
如果要保存打开的缓冲区,选项卡,标记和其他设置的会话,可以发出以下命令:
mksession session.vim
您可以使用以下方式打开会话:
vim -S session.vim
将F5映射到ROT13缓冲区:
mapggg?G``
您可以将它用作老板键:).
我今天刚刚通过NSFAQ找到了这个:
注释代码块.
按CTRL-V进入Blockwise Visual模式.
标记您要评论的块.
点击I(大写字母I)并在该行的开头输入您的注释字符串.(// for C++)
按ESC键,所有选中的行将//前置于行的前面.
我使用vim进行任何文本编辑,所以我经常使用复制和粘贴.问题是vim默认情况下经常会通过粘贴扭曲导入的文本.阻止这种情况的方法是使用
:set paste
在粘贴数据之前.这将使它免于搞乱.
请注意,您必须发出:set nopaste
以恢复自动缩进的问题.粘贴预格式化文本的其他方法是剪贴板寄存器(*
和+
),:r!cat
(您必须使用^ D结束粘贴的片段).
打开高对比度配色方案有时也很有帮助.这可以通过以下方式完成
:color blue
我注意到它在我使用的vim的所有版本上都不起作用,但它在大多数情况下都有效.
这是不明显的事情.如果你的$ 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切换选项卡:
inoremapvnoremap noremap gt noremap gT
在插入模式下,Ctrl-n将根据打开缓冲区中的所有单词自动完成您键入的任何单词.如果有多个匹配,它将为您提供可以使用ctrl-n和ctrl-p循环的可能单词列表.
想要IDE吗?
:make
将在当前目录中运行makefile,解析编译器输出,然后可以使用:cn
并:cp
逐步执行编译器错误打开每个文件并寻找有问题的行号.
:syntax on
打开vim的语法高亮显示.
gg=G
更正整个文件的缩进.我
在Eclipse中错过了我的信任,但刚刚发现vim很好地处理它.
我经常想要突出显示特定的单词/函数名称,但不想搜索它的下一个实例:
map m* *#
能够在基于客户端/服务器的模式下运行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
sudo的变化写:
进入.vimrc
cmap w!! w !sudo tee % >/dev/null
重新加载vim之后你可以做"sudo save"
:w!!
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
当我进入快速错误修复时,我发现它非常有用.
当你想要跨文件的两个不同副本区分文件而不会弄脏小指(从project1的根目录)时,%也很好:
:vert diffs /project2/root/%
我将Vim用于一切.当我编辑电子邮件时,我使用:
gqap
(或gwap
)
广泛地容易和正确地逐段重新格式化,即使使用引号字符.为了实现这个功能,我还添加:
-c 'set fo=tcrq' -c 'set tw=76'
从外部调用编辑器的命令.一个值得注意的补充是在fo(formatoptions)参数中添加' a '.这将在您键入和导航内容时自动重新格式化段落,但可能会干扰或导致消息中包含的错误或奇怪格式的问题.
: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窗口中显示编译错误/警告,并可以轻松导航到相应的行号.
从十六进制值(插入模式)输入一个字符:
x[type the hexadecimal byte]
把它放在你的.vimrc中,以获得一个漂亮打印xml的命令:
function FormatXml() %s:\(\S\)\(<[^/]\)\|\(>\)\(\):\1\3\r\2\4:g set filetype=xml normal gg=G endfunction command FormatXml :call FormatXml()
我确信有人会发布这个,但是这里有.
随便采取任何构建系统; 制作,mvn,蚂蚁,等等.在项目目录的根目录中,创建一直使用的命令文件,如下所示:
mvn install
mvn clean install
...等等
要进行构建,将光标放在该行上并键入!! sh.即过滤那条线; 将它写入shell并替换为结果.
构建日志替换了行,准备滚动,搜索等等.
查看完日志后,键入u以撤消,然后返回到命令文件.
========================================================== 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
由于延迟和缺乏颜色(我喜欢配色方案:)我不喜欢在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错误列表中方便地显示.
set colorcolumn=+1
或者set cc=+1
对于vim 7.3