VIM中如何在行之间移动

3
假设我有一个N行的文件。我在第X行,想要快速移动到屏幕上可见的第Y行。如果输入:Y<cr>,可以实现该目的,但是当Y>99时,需要输入的内容比较多。另外一种方法是输入abs(Y-X)[kj](向上或向下移动abs(Y-X)行),但对于较大的X和Y,计算这个差值并不容易。
是否有一种方法可以利用X和Y都在屏幕上可见的事实,快速移动到X和Y之间的某一行呢?
6个回答

8

您可以使用:set relativenumber命令来实现Y-X计算(仅适用于Vim版本7.3以上)。


е“ҰпјҢеҸҰеӨ–дҪ еҸҜд»ҘдҪҝз”ЁYGд»Јжӣҝ:Y<CR>пјҢиҝҷж ·е°‘жү“дёӨдёӘй”®гҖӮ - dmedvinsky
这正是我想要的! - pbp
@dmedvinsky,哦,这个不错。应该看看7.3有什么新功能。 - shabunc
...或者 Ygg。有些人觉得这样更容易(但我不是这种情况)。 - sidyll
@dmedvinsky:这要看情况。在所有键盘布局中,冒号并不会被移位。 - Benoit

3

您可以使用HML来快速跳转到屏幕的顶部、中部和底部。


1
而且,通过使用计数器H和L,可以从顶部或底部计算行数。 - sidyll

2
也许你可以使用 HML
这些按键可以跳转光标以显示行:
H    "Home" top of screen
M    "Middle" middle of screen
L    "Last" last line of screen

有了行数,它们就会偏移:例如4L会跳到倒数第三行(1LL是一样的)。

个人而言,我经常使用m命令来标记一个需要导航的行。从当前位置开始,按下mq将该位置标记为标签q;然后导航到另一行,再按下ma将该位置标记为标签a;之后,我可以按下'q跳转到位置q,按下'a跳转到位置a。(qa是任意的,我主要使用它们是因为它们在QWERTY键盘上的位置。)

一旦你有了这些标记,就可以用它们来执行命令。要删除从当前位置到标记为q的行的内容,只需使用:d'q

还有一种变体,其中使用反引号而不是单引号。这会带您到放置标记的行的确切位置;单引号使用行的开头。

这些标记甚至适用于ex(命令行)命令。要将搜索和替换限制为特定的一组行,我使用标签be分别标记起始行和结束行,然后执行以下搜索和替换:

:'b,'es/foo/bar/g

2

在代码中穿行时,我发现使用文本对象非常容易。我几乎不再使用jk / JK进行大跳跃。相反,我使用{}浏览空白行。

因为在任何一个屏幕上通常只有那么多的空白分隔符(它们很容易被视觉识别和计数),我发现:

3}j

比如假设:

     27j

更常见地让我到达预定的行。

更重要的是,许多“括号”编程语言在函数开头有一个左花括号。这些可以使用[[]]到达。所以有时只需要执行以下操作:

2[[}

(意思是:转到前一个函数的开始,在第一个连续的行块后)


当团队成员使用插入大量不必要空格的编辑器时,这会带来一些麻烦; { 不会停在(或计算)仅由某些空格组成的行。为此,autocmd BufWritePre *.{cpp,etc} %s/\s\+$//e 来拯救! - dash-tom-bang
@dash-tom-bang:这总是让我着迷:编辑器到底做了什么?!我得出的结论是,唯一遇到这个问题的“编辑器”无疑是坐在键盘后面的人:) - 但也许你知道我不知道的秘密? - sehe
如果你在其他一些自动缩进的编辑器中,在一个空行上按下 <enter> 键,通常会在该行保留缩进。另一方面,Vim 会删除该空格。PEBCAK 解释了一些问题,但并不是全部。:) 我无法告诉你哪些编辑器会这样做,因为这里的人们使用各种不同的免费和非免费工具。 - dash-tom-bang

0

我使用的VIM版本在按J或K之前可以让你立即估算要移动的行数。

15K向上移动15行


这就是我所说的“abs(Y-X)[kj]”的意思。 - pbp
@pbp,不,实际上,当你使用vim一段时间后,你不再计算绝对行数,而是尝试获取你需要跳转的大致行数。 - shabunc

0

你成为更强大的Vim用户后,一眼就能数出更多的代码行数。

也许有一些聪明的技巧,但我只是输入类似于17k/23j之类的东西。

此外,在你想要跳转的字符串上搜索某个单词也很有用。

另外,zz(居中显示)在这种情况下有时也很有帮助。


是的,我也可以估计差异,但我认为可能有更好的方法 :) - pbp
@pbp,我想估计是这里最好的选择。在我们没有脑波插件之前))) - shabunc

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