人们谈论常见的技巧有很多问题,特别是“ Vim + ctags技巧和窍门 ”。
但是,我没有提到Vim新手会觉得很酷的常用快捷方式。我说的是经验丰富的Unix用户(他们是开发人员,管理员,两者都是),他认为他们知道我们99%的人从未听说过或梦想过的东西。不仅使他们的工作更轻松,而且还使COOL和hackish变得如此。毕竟,Vim驻留在世界上最黑角的OS中,因此它应该具有只有少数特权者知道并希望与我们共享的复杂性。
人们谈论常见的技巧有很多问题,特别是“ Vim + ctags技巧和窍门 ”。
但是,我没有提到Vim新手会觉得很酷的常用快捷方式。我说的是经验丰富的Unix用户(他们是开发人员,管理员,两者都是),他认为他们知道我们99%的人从未听说过或梦想过的东西。不仅使他们的工作更轻松,而且还使COOL和hackish变得如此。毕竟,Vim驻留在世界上最黑角的OS中,因此它应该具有只有少数特权者知道并希望与我们共享的复杂性。
Answers:
可能不是99%的Vim用户都不知道的,但这是我每天都在使用的东西,任何Linux + Vim高级用户都必须知道。
基本命令,但非常有用。
:w !sudo tee %
我经常忘记在编辑没有写权限的文件之前使用sudo。当我来保存该文件并获得权限错误时,我只是发出该vim命令即可保存文件,而无需将其保存到临时文件中,然后再次将其复制回去。
您显然必须在安装了sudo的系统上并且具有sudo权限。
sudo vim
。相反,您应该导出EDITOR
为vim并运行sudoedit
。
我最近发现的一些东西我认为很酷:
:earlier 15m
将文档还原到15分钟前的状态。可以采用各种参数来决定要回滚的时间,并且取决于撤消级别。可以用相反的命令反转:later
:later 8h
做,今天已经完成了?:P
:! [command]
在Vim中执行外部命令。
但是,在冒号后面添加一个点 :.! [command]
,它将把命令的输出转储到当前窗口中。那是: . !
例如:
:.! ls
我经常将其用于将当前日期添加到要输入的文档中:
:.! date
:.!date
是在行上写上“日期”,然后运行!$sh
(或者在命令后跟空白行并运行!jsh
)。这会将行通过管道传递到“ sh” shell,并替换为命令的输出。
:.!
实际上是的特殊情况:{range}!
,它.
通过命令过滤一行范围(当范围为时的当前行),并用输出替换这些行。我发现:%!
对过滤整个缓冲区很有用。
sed
当您可以使用类似的内置ed
/ ex
命令时,为什么要将一行传递到?尝试跑步:.s/old/new/g
;-)
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
,大写B
并E
仅使用空格作为定界符逐字移动光标。
大写D(深呼吸)删除光标右侧的其余行,与普通编辑器中的Shift + End / Del相同(注意2个按键-Shift + D-而不是3)
vity
并且vitc
可以缩短到yit
与cit
分别。
.
)。
bye
在单词的第一个字符时不起作用。yiw
总是如此。
我在大多数Vim教程中很少找到的一种,但它(至少对我而言)是非常有用的(至少对我而言)。
g; and g,
在更改列表中移动(向前,向后)。
让我展示一下如何使用它。有时候,我需要复制一段代码或字符串,例如将十六进制颜色代码粘贴到CSS文件中,因此我搜索,跳转(不关心匹配项在哪里),将其复制然后跳回到(g;)到哪里我正在编辑代码以最终将其粘贴。无需创建标记。更简单
就是我的2美分。
'.
将转到最后编辑的行,`.
并将转到最后编辑的位置
<C-o>
/ <C-i>
来标记我的位置。
:%!xxd
使vim成为十六进制编辑器。
:%!xxd -r
还原。
警告:如果不使用二进制文件(-b)进行编辑,则可能会损坏文件。–评论中的Josh Lee。
:%!xxd -r
将其恢复
有时,.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
:verbose
也可以在之前nmap l
或highlight Normal
查找上一次定义l
键盘映射或高Normal
光的位置时使用。对于调试非常有用!
不知道这是否算是黑角,但我才刚刚学到……
:g/match/y A
会将包含“匹配”的所有行拉入(复制)到"a
/ @a
寄存器中。(大写字母A
使vim 附加字母,而不是替换以前的寄存器内容。)最近,在制作Internet Explorer样式表时,我经常使用它。
:v/PATTERN/d
说明::v
是的缩写:g!
,该:g
命令将所有ex命令应用于行。:y[ank]
是可行的:normal
,但是在这里最自然的事情就是公正:d[elete]
。
:g/match/normal "Ayy
- normal
关键字让您告诉它运行普通模式命令(您可能更熟悉)。
想看看您的:command历史吗?
q:
然后浏览,编辑并最终执行命令。
是否曾经对两个文件进行过类似的更改并在它们之间来回切换?(例如,源文件和头文件?)
:set hidden
:map <TAB> :e#<CR>
然后在这些文件之间来回切换。
q:
无意中击中……
Vim将打开一个URL,例如
vim http://stackoverflow.com/
不错,当您需要提取页面源以供参考时。
宏可以调用其他宏,也可以调用自身。
例如:
qq0dwj@qq@q
...将删除每一行的第一个单词,直到文件结尾。
这是一个非常简单的示例,但它展示了vim的强大功能
qqqqqifuu<Esc>h@qq@q
:normal! @a
以将您的宏应用于所选内容中的每一行。
假设您已经编译了Perl和/或Ruby支持,:rubydo
并且:perldo
将在范围内的每一行上运行Ruby或Perl单行代码(默认为整个缓冲区),并$_
绑定到当前行的文本(减去换行符)。操纵$_
将更改该行的文本。
您可以使用它来执行某些容易用脚本语言完成的事情,但是使用Vim内置函数则不太明显。例如,反转一行中单词的顺序:
:perldo $_ = join ' ', reverse split
在每行末尾插入8个字符(AZ)的随机字符串:
:rubydo $_ += ' ' + (1..8).collect{('A'..'Z').to_a[rand 26]}.join
您只能一次执行一行,并且不能添加换行符。
pydo
和py3do
Python的工作,如果你有需要的支持编译。
^ 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
临时移动到外壳。如果您需要快速扑打:
^X^F
我烦恼的是,文件名中包含=
符号,使它在许多场合(ini文件,makefile等)都会变坏。我se isfname-==
" insert range ip's
"
" ( O O )
" =======oOO=(_)==OOo======
:for i in range(1,255) | .put='10.0.0.'.i | endfor
i10.0.0.1<Esc>Y254p$<C-v>}g<C-a>
这是一个很好的技巧,可以使用不同的编码重新打开当前文件:
:e ++enc=cp1250 %:p
当您必须使用旧式编码时很有用。支持的编码在encoding-values
(请参阅参考资料help
encoding-values
)下的表格中列出。类似的事情也适用于++ff
,因此,如果您第一次遇到错误,可以使用Windows / Unix行尾重新打开文件(请参阅参考资料help
ff
)。
键入==将基于上面的行更正当前行的缩进。
实际上,您可以先执行一个=符号,然后再执行任何移动命令。= {运动}
例如,您可以使用在匹配的括号之间移动的%移动。在以下代码中将光标置于{上:
if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}
然后按=%立即获得此信息:
if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}
或者,您可以在代码块内执行= a {,而不是将自己放在{字符上。
=}
或者vaBaB=
因为它不那么依赖。另外,v}}:!astyle -bj
可以更好地匹配我的代码样式,但我可以通过简单的方法将其重新设置为您的样式%!astyle -aj
gg=G
粘贴时非常整洁。
ggVG=
。
让我们看看一些非常小的IDE编辑器进行列转置。
:%s/\(.*\)^I\(.*\)/\2^I\1/
说明
\(
以及\)
如何记住正则表达式中的内容。而且\1
,\2
等是如何检索记住的东西。
>>> \(.*\)^I\(.*\)
记住所有内容,然后是^I
(tab),然后是所有内容。
>>> \2^I\1
将上面的内容替换为“您记得的第二件事”,然后替换为“您记得的第一件事”-本质上是进行转置。
这并不是一个秘密,但我喜欢将以下映射放入我的.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>
我喜欢使用“ sudo bash”,而我的系统管理员对此非常讨厌。他锁定了“ sudo”,因此只能与少数命令(ls,chmod,chown,vi等)一起使用,但是无论如何我都能够使用vim来获得root shell:
bash$ sudo vi +'silent !bash' +q
Password: ******
root#
通常,我喜欢在编辑时更改当前目录-因此我必须减少指定路径。
cd %:h
在项目上工作时,我经常使用许多窗口,有时需要调整它们的大小。这是我使用的:
map + <C-W>+
map - <C-W>-
这些映射允许增加和减小当前窗口的大小。这很简单,但速度很快。
这不是一个晦涩的功能,但非常有用且省时。
如果要保存打开缓冲区,选项卡,标记和其他设置的会话,则可以发出以下命令:
mksession session.vim
您可以使用以下方式打开会话:
vim -S session.vim
:so session.vim
在vim内部。
:r! <command>
将外部命令的输出粘贴到缓冲区中。
做一些数学运算并直接在文本中获得结果:
:r! echo $((3 + 5 + 8))
获取编写Makefile时要编译的文件列表:
:r! ls *.c
不要查找您在Wikipedia上阅读的事实,而是将其直接粘贴到您正在编写的文档中:
:r! lynx -dump http://en.wikipedia.org/wiki/Whatever
映射F5以快速ROT13您的缓冲区:
map <F5> ggg?G``
您可以将其用作老板键:)。
nmap i ggg?G``
。或恶魔般的:nmap i ggg?G``i
!
我今天才通过NSFAQ找到了这个:
注释代码块。
通过按CTRL-V进入“逐块可视化”模式。
标记您要评论的块。
点击I(大写I)并在行首输入您的注释字符串。(//对于C ++)
按ESC,所有选定的行都将// //放在行的前面。
git checkout
)的git )。至于块插入的更好用途,没有任何固定的条件。只要您有多行要在同一位置插入相同字符序列的位置,就可以使用它。
我几乎使用vim进行任何文本编辑,因此我经常使用复制和粘贴。问题在于,默认情况下,vim经常会通过粘贴使导入的文本变形。阻止这种情况的方法是使用
:set paste
在粘贴数据之前。这样可以避免混乱。
请注意,您将必须发出:set nopaste
恢复自动缩进的命令。粘贴预格式化文本的替代方法是剪贴板寄存器(*
和+
),以及:r!cat
(您将不得不以^ D结尾粘贴的片段)。
有时打开高对比度配色方案也很有帮助。这可以用
:color blue
我注意到它不适用于我使用的所有版本的vim,但大多数情况下都适用。
set paste
该pastetoggle
选项或为该选项指定键是解决此问题的一种常用方法,但是可以达到相同的效果,set mouse=a
因为Vim知道看到的大量文本是由鼠标触发的粘贴。
"*p
从X xlipboard粘贴。(它也可以在终端vim中运行,只是如果它们是分开的,您可能需要gvim软件包)
*
是PRIMARY
(“中间单击”)寄存器。该剪贴板是+