您妈妈从未告诉过您的 Vim 的黑暗角落是什么?

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

但是,我没有提到 Vim 新手会觉得很酷的常用快捷方式。我说的是一个经验丰富的 Unix 用户(他们是开发人员,管理员,两者都有),他认为他们知道我们 99%的人从未听说过或梦想过的东西。不仅使他们的工作更轻松,而且还使他们变得酷而骇人 。毕竟, Vim驻留在世界上最黑角的 OS 中,因此它应该具有只有少数特权者知道并希望与我们共享的复杂性。

答案

可能不是 99%的 Vim 用户所不知道的,但这是我每天都在使用的东西,任何 Linux + Vim 高级用户都必须知道。

基本命令,但非常有用。

:w !sudo tee %

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

您显然必须在安装了 sudo 的系统上并且具有 sudo 权限。

我最近发现的一些东西我认为很酷:

:earlier 15m

将文档还原到 15 分钟前的状态。对于您要回滚的时间,可以接受各种参数,并且取决于撤消级别。可以用相反的命令反转:later

:! [command]在 Vim 中, :! [command]执行外部命令。

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

例如:

:.! ls

我经常将其用于将当前日期添加到我输入的文档中:

:.! date

并不是很模糊,但是有几个 “删除” 命令非常有用,例如。

  • diw删除当前字
  • di(在当前括号内删除
  • di"删除引号之间的文本

其他可以在:help text-objects

de通过按删除直到单词末尾的所有内容。随心所欲。

ci(xyz [Esc] - 这很奇怪。这里的 “i” 并不表示插入模式,而是表示括号内的内容。因此,此序列会剪切您所在括号内的文本并将其替换为 “xyz”。它也可以在方括号和数字括号内使用 - 只需相应地执行 ci [或 ci {。自然地,您可以执行 di(如果您只想删除所有文本而不输入任何内容。您也可以使用a代替i如果您还想删除括号,而不仅仅是删除括号内的文本。

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

ciw-剪切当前单词。除(w代替( )外,该程序与上一个相同。

C-剪掉其余的行并切换到插入模式。

ZZ-保存和关闭当前文件(比 Ctrl-F4 更快以关闭当前标签!)

ddp-将当前行向下移动一行

xp-将当前角色向右移动一个位置

ü - 大写的,所以viwU upercases 字

- 开关的情况下,所以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 ,大写字母BE仅使用空格作为分隔符,逐字移动光标。

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

我在大多数 Vim 教程中很少找到的一个,但是它(至少对我来说)是非常有用的(至少对我来说)。

g; and g,

在更改列表中移动(向前,向后)。

让我展示一下如何使用它。有时我需要复制一段代码或字符串,例如将十六进制颜色代码粘贴到 CSS 文件中,因此我搜索,跳转(不关心匹配项在哪里),将其复制然后跳回到(g;)到哪里我正在编辑代码以最终将其粘贴。无需创建标记。更简单

就是我的 2 美分。

:%!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  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

:%TOhtml

创建当前文件的 html 呈现。