有很多人在讨论常见技巧,特别是“Vim+ctags 技巧”。
然而,我不是指那些新手会觉得很酷的常用快捷键。我指的是经验丰富的 Unix 用户(无论是开发者、管理员还是两者兼备等),他们认为自己知道一些我们中绝大部分人从未听说或梦想过的东西。这些不仅能够使他们的工作更轻松,而且还很炫酷和有技巧性。毕竟,Vim 是运行于全球最黑暗角落的操作系统之一,因此它应该有一些只有少数特权人士知道并愿意与我们分享的复杂技巧。
有很多人在讨论常见技巧,特别是“Vim+ctags 技巧”。
然而,我不是指那些新手会觉得很酷的常用快捷键。我指的是经验丰富的 Unix 用户(无论是开发者、管理员还是两者兼备等),他们认为自己知道一些我们中绝大部分人从未听说或梦想过的东西。这些不仅能够使他们的工作更轻松,而且还很炫酷和有技巧性。毕竟,Vim 是运行于全球最黑暗角落的操作系统之一,因此它应该有一些只有少数特权人士知道并愿意与我们分享的复杂技巧。
可能并不是99%的Vim用户都不知道的技巧,但它是我每天都使用的东西,任何Linux+Vim高级用户都必须掌握。
这是一个基本命令,但非常有用。
:w !sudo tee %
我经常忘记在编辑没有写入权限的文件前使用sudo,当我保存该文件时遇到权限错误时,我会直接执行vim命令以无需将其保存到临时文件并再次复制的方式来保存该文件。
显然,你必须在安装了sudo并拥有sudo权限的系统上才能这样做。
sudo vim
。相反,您应该将 EDITOR
导出为 vim 并运行 sudoedit
。 - Gerardo Marset最近我发现了一些非常酷的东西:
:earlier 15m
将文档恢复到15分钟前的状态。可以使用不同的参数来确定要回滚的时间量,这取决于撤消级别。可以通过相反的:later
命令撤销。
:later 8h
就可以结束今天的工作了吗? :P - Igor Popov:! [command]
用于在Vim中执行外部命令。
但是,在冒号后面加一个点,:.! [command]
,它将把命令的输出转储到当前窗口。也就是说: . !
。
例如:
:.! ls
我经常用这个功能来为我正在打字的文档添加当前日期:
:.! date
:.!date
命令外,另一个选择是在一行中输入 "date",然后运行 !$sh
(或者在命令后面加一个空行,然后运行 !jsh
)。这将把该行通过管道传递给 "sh" shell,并用命令输出进行替换。 - hlovdal:%!
实际上是 :{range}!
的一种特殊情况,它通过一个命令过滤一系列行(当范围为.
时表示当前行),并用输出替换这些行。我发现 :%!
在过滤整个缓冲区时非常有用。 - Nefrubyr!!
)来自动填充 :.!
吗?当你不想输入所有这些内容时,这非常方便。在 vim -u none
中也适用。 - Braden Bestde 想删除单词末尾的所有内容,只需按下“.”即可。
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向前和Ctrl+b向后。Ctrl+Y和Ctrl+E每次向下或向上滚动一行。
非常疯狂但非常有用的命令是zz -- 它滚动屏幕使得这一行出现在中间。这对于将你正在工作的代码放在你的注意力中心非常有用。类似的命令--zt和zb--将这一行变成屏幕上面或下面的一行,这不太有用。
% 查找并跳转到匹配的括号。
de -- 从光标删除到单词结尾(也可以使用dE
删除到下一个空格)
bde -- 从左到右删除当前单词
df[space] -- 删除直到包括下一个空格
dt. -- 删除直到下一个句点
dd -- 删除整行
ye (或 yE) -- 复制从此处到单词结尾的文本
ce - 剪切至单词结尾
bye -- 复制当前单词(让我想知道“hi”是什么意思!)
yy -- 复制当前行
cc -- 剪切当前行,您也可以使用S
。还有小写字母s
,它会剪切当前字符并切换到插入模式。
viwy 或 viwc。复制或更改当前单词。多次按w
以继续选择每个后续单词,使用b
向后移动
vi{ - 选择大括号内的所有文本。va{ - 选择包括{}在内的所有文本
vi(p - 高亮显示()内的所有内容,并用粘贴的文本替换
b和e按单词移动光标,类似于Ctrl+箭头键的操作方式。不过,单词的定义略有不同,因为多个连续的分隔符被视为一个单词。如果从单词中间开始,按b将始终将光标移到当前单词的开头,每次连续按b都会跳到下一个单词的开头。同样地,容易记住,e
将光标移到当前单词的末尾,每次连续按e都会跳到下一个单词的末尾。
与b/e类似,大写字母B和E只使用空格作为分隔符来按单词移动光标。
大写字母D(深呼吸)删除光标右侧的整行剩余部分,与普通编辑器中的Shift+End/Del相同(注意是2个按键--Shift+D--而不是3个)
在大多数Vim教程中很少见到的一点是,但它非常有用(至少对我来说),那就是使用
g;和g,
通过更改列表向前或向后移动。
让我展示如何使用它。有时候我需要复制粘贴一段代码或字符串,比如CSS文件中的十六进制颜色代码,所以我搜索、跳转(不关心匹配项在哪里)、复制它,然后跳回(g;)到我正在编辑代码的位置,最后进行粘贴。不需要创建标记。更简单了。
只是我的个人意见。
'.
将跳转到最后编辑的行,而\
.`将跳转到最后编辑的位置。 - aehlke<C-o>
/<C-i>
- 或者标记我的位置。 - Wayne Werner:%!xxd
将vim转化为十六进制编辑器。
:%!xxd -r
还原。
警告:如果您不使用二进制(-b)编辑,可能会损坏文件。 - 评论中的Josh Lee。
:%!xxd -r
,以将其还原回去。 - Andreas Grechgv
重新选择上次的可视化选区。
有时候你在.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
高亮的位置。非常有用于调试! - joeytwiddle:%TOhtml
创建当前文件的HTML渲染。
%
是不必要的,因为默认参数是当前缓冲区。:help TOhtml
- JDG