在 Vim 正常模式下使用 g 键

84
在Vim的普通模式下,g前缀被用于多个命令。有些命令可以使光标移动到文档中的某个位置,而其他命令则涉及文件编码和交换大/小写字母。
  • ga - 显示字符编码
  • 10gg - 移动到第10行
  • gg - 移动到第1行
  • gH - 进入行选择模式
  • gr{char} - 用{char}虚拟替换N个字符
这些命令之间存在什么联系?

7
“g”和“z”扩展了普通命令集。 - Benoit
3
我一直将gz都视为@Benoit所说的:“定义了g{C}是因为它是一个常用的命令,但其他字符已经被绑定。”许多以g*开头的命令都有“跳转(go to)”或“全局(global)”的助记符,但不是所有都有。与与折叠无关的g*命令不同,z*命令更难记忆。我甚至在我的一个插件中个人定义了一组gd映射,可以记为“全局差异(global diff)”:“查看给定修订所做的所有更改”。还有一组“跳转”的映射:gu-“跳转到用户”-“查看用户所做的更改”,等等。 - ZyX
2
前往第10行的命令是 10gg10G (或 :10<cr>)。 - Keith Thompson
2个回答

66

g 命令没有更紧密的联系了:它是一个混合物。它是一个简单的前缀,未绑定的键越来越少,所以不常用的映射找到了 g 的良好位置。


1
我注意到在Vim的帮助中有一些命令具有助记符。例如,gaget ascii - Natan Yellin
3
是的。幸运的是,g 下的一些命令是“跳转到”或“获取”某些内容,但是太多命令没有好的记忆提示符。 - mike3996
4
@SauceMcBoss:我也在找同样的东西。你可以在Vim文档中找到它。 - James MacAdie

17

简单来说,你在谈论两件不同的事情。在某些情况下,g是“全局”(例如,对于范围命令),对于行移动,g表示转到。

VIM命令通常缩短以便快速使用。

:help global可能会有所帮助。

顺便说一句:对于行导航,我一直使用:<lineno>语法。


3
:<lineno> 会产生垃圾命令行历史记录,并且输入难度较大(例如使用 <S-;>1<CR> 需要四次按键,加上两到三个额外的手指移动(在 dvorak 键盘上),输入数字所需的力量不计入其中;而 1gg 需要三次按键和一个手指移动)。您可以定义某些映射来消除命令行历史记录中的垃圾信息(例如,在命令行模式下将 <CR> 映射为执行命令后清除历史记录),但是无法减少输入时需要付出的努力。 - ZyX
哦,好吧,试着用一个数字替换<lineno>,你就会明白我想说什么了^^ :D。最终只是关乎你如何开始的问题。从普通的vi开始,即使在快乐地使用VIM十年以上后,一些VIM内在机制仍然完全不清楚。 - BigMike
“噢,好吧,试着用数字替换<lineno>,你就会明白我想说什么了。”上面的代码是“<S-;>1<CR>”。我知道这种方法,通常在类似于“execute linenumber”的表达式中看到它。 - ZyX
这只是你学习方式的问题。两种方法都有其优缺点。最终只要我们对它们感到舒适,就是好的。请原谅我的糟糕英语。 - BigMike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接