VIM超快速导航

109

我在使用其他编辑器时,唯一想念的就是用鼠标找到我的位置。我可以用眼睛看到文件上的特定区域,然后用鼠标移动并单击,我就到了那里。但是,在 VIM 中,我必须 jjjjjkkkkkkjjjjhhhh……差不多到了 hhhhh,哦,糟糕,我错过了三个字符,lll。

我正在学习如何做书签,并找到了一个很棒的书签插件,我可以使用 <f3> 创建标记并将它们删除,然后使用该插件导航到它们,但是当关闭文件后,这些标记就会被遗忘。

你们所有人如何超级导航文件?我知道我也可以使用 5j7k4j5h 等方式进行导航,但一定有一个插件可以读取我的眼睛并将光标放在我真正需要的位置吧……

我还学会了使用 /% 搜索特定术语。这确实有帮助,但整个文档中所有匹配的字符都会被突出显示。


众多优秀的回答,既然我们还在这个话题上,我想我可以尝试一些类似于nG(跳转到行号)f%(查找我要查找的第一个字符,或者像某人建议的那样使用w向前移动到下一个单词)。 - Helmut Granda
reddit vim 群组中热议的是为 Vim 导航制作的快速参考备忘单。 - Raos
使用 :noh 命令来禁用匹配模式的高亮显示。 - Skippy le Grand Gourou
11个回答

196

尝试使用$ vimtutor,它会教你开始所需的一切。

hjkl只是冰山一角,很少使用,至少在我的情况下。

wWEeBbgegE都允许逐字移动:

  • w and e go forward, W and E take whitespace and punctuation into account

    " here the * marks the default location of the cursor
    " and each letter shows where you jump when you hit the key.
    
    Latin: Lorem ipsum dolor sit amet.
                       *   e   e    e
                       *   E   E     E
    *    w w     w     w     w   w   w
    *      W     W     W     W   W   W
    
  • b and ge go backward, B and gE take whitespace and punctuation into account

    Latin: Lorem ipsum dolor sit amet.
    b    b b     b     *
    B      B     B     *
         ge    ge    ge*
        ge
         gE    gE    gE*
    

fFtT用于在当前行上查找特定字符,;,用于重复该动作,在相同方向上使用;,在相反方向上使用,

  • fm jumps ON the next m forward, F goes backward

    Latin: Lorem ipsum dolor sit amet.
    *          fm    ;            ;
               ;     Fm          *
    
  • tm jumps BEFORE the next m forward, T goes backward

    Latin: Lorem ipsum dolor sit amet.
    *         tm    ;            ;
              ;     Tm           *
    

/? 用于从当前光标位置跳转到模式的第一个匹配项:

  • /pattern goes forward

    Latin: Lorem ipsum dolor sit amet.
    *            /ips
    
  • ?pattern goes backward

    Latin: Lorem ipsum dolor sit amet.
    ?Lat             *
    

0$ 用于跳转到行首和行尾。

    (whitespace)Latin: Lorem ipsum dolor sit amet.(whitespace)
    0                  *                                     $

^g_用于跳转到行的第一个和最后一个可打印字符。

    (whitespace)Latin: Lorem ipsum dolor sit amet.(whitespace)
                ^      *                         g_

单个或组合使用 ()[]{} 可以逐句、逐段或逐代码块移动。

<C-b><C-f> 可以向上或向下滚动一屏。

<C-u><C-d> 可以向上或向下滚动半屏。

HML 分别将光标移动到视口的顶部、中部和底部。

ztzzzb 将光标所在行移到视口的顶部、中部和底部。

还有其他操作。

:help motion.txt 会让你大开眼界。


23
我通常不这样做,但这条评论只是想告诉你,这是一个很棒的回答! - j-i-l
2
由于某些原因,我以前从未使用过H、M或L,这是很好的技巧! - Chris
添加]}[{}(2个按键)可以跳转到作用域的结尾或开头(例如由{...}定义的作用域)。 - Matthew Woo
3
这还没有真正回答 OP 对于“如何像使用鼠标一样跳转到正在查看的行”的问题。我知道并经常使用您提到的所有快捷键,但与使用鼠标指向跳转大距离相比,仍然不够高效。 - Penghe Geng
1
是的,H、M、L很容易记住:高、中、低 ;) @Chris - nils petersohn

26

除了vim的运动命令外,我发现一个名为EasyMotion的vim插件对于导航非常有用,如果您熟悉vimperator或pentadactyl,则EasyMotion可以将提示模式带回到vim中。这里是一个动画演示,这里是视频教程。希望对您有所帮助。


Easymotion的优点在于只需3个按键就可以在屏幕上任意跳转。 - Xavier T.
+1:EasyMotion 真的是 Vim 移动的喷气背包。(顺便说一句,PreciseJump 也是。实际上,EasyMotion 是 PreciseJump 的一个分支) - Dmitry Frank
2
EasyMotion的作者在演示中如何得到这个超级棒的状态行? - Cyrille
1
“超级棒的状态栏”是一个名为“Powerline”的插件。它可以在这里找到:http://www.vim.org/scripts/script.php?script_id=3881 - DEzra
你能否更新动画演示的URL?它已经不能使用了。 - brauliobo
显示剩余4条评论

23

在vim中有无数种移动方法,这是它的一个非常强大的特点。我经常使用{},它们可以向上或向下移动到下一个空白行。对于来回移动到匹配括号(任何类型)位置,%很有用。WB可根据“单词”向前或向后移动。

值得一提的是,建议查看Vim手册中的移动部分。


4
另外值得一提的是,分别使用Ctrl+U和Ctrl+D可以向上或向下翻页。 - Nick

12

vim支持鼠标! 请尝试以下方法(在您的.vimrc文件中):

set mouse=a

顺便提一下:作为一个屏幕用户,我发现我也需要

set ttymouse=xterm2

要使此方法起作用。


6
了解,不过我仍将继续寻找完美的快速导航方法,无需使用鼠标。 - Helmut Granda

9

个人而言,我更喜欢使用:

"/<chars><enter>" to quickly move to somewhere   ( extremely fast! trust me! )
":<number>" to go to some line, 
"ctrl + f/b" to forward/back
"g;" to move to the last editing place.
"w/b" to move by word
"jklh" to move your cursor to the exact position

6
除了 {, }, (, ), <number>cb, <number>cB, <number>cW 以及 % 外,我还使用以下导航技巧:
  • ciwdiwciWdiW 等等)可以快速编辑或删除光标下的单词(包括非空格字符)
  • ci(ci"ca(ca" 等等)可以快速编辑圆括号、引号内的内容(包括圆括号和引号)。同样适用于 d 命令。
  • 大写字母标记可全局设置(跨文件)并持久化保存(当缓冲区关闭时)。例如,mA 将创建全局标记 A,可以通过 'A 命令(或 `A 命令)调用。
  • gf 可快速跳转到光标下的文件
  • ftFT)可移动到字符左侧或右侧(使用 ; 可重复执行)。这些命令对于 dc 命令尤其有用(使用 . 可重复执行)。
  • ^] 可移动到标签处,^T 可返回。

还有很多其他的移动方式 :)

更多信息请参阅:http://www.thegeekstuff.com/2009/03/8-essential-vim-editor-navigation-fundamentals/

P.S. 对于 Rails 用户来说,rails-vim 插件非常有用,您可能也想试试。


5

通过选项relativenumber (:help relativenumber - 包含在Vim 7.3中),您可以使用[count]k[count]j移动到您所在的行,并使用像ftweb一样的移动在当前行中移动,如@romainl所解释的。


很棒的选择。比easymotion更快。 - Penghe Geng

5
我只有这些图表!
▼/▶ Cursor   ▽/▷ Target

┌───────────── 0      
│  ┌────────── ^      $ ──────────────┐
│  │  ┌─────── Fo     fe ────────┐    │
│  │  │┌────── To     te ───────┐│    │
│  │  ││ ┌──── ge     w ───┐    ││    │
│  │  ││ │ ┌── b      e ─┐ │    ││    │ 
│  │  ││ │ │  ┌h      l┐ │ │    ││    │
▽  ▽  ▽▽ ▽ ▽  ▽▼      ▼▽ ▽ ▽    ▽▽    ▽
   echo "A cheatsheet from quickref.me"

                 - SCREEN 1 START
   ┌─┬─────────▷ #!/usr/bin/python
   │ │     ┌───▷     
   │ │     │     print("Hello")
   │ │     { } ▶ print("Vim")
   │ │       │   print("!")
   │ │       └─▷    
   │ │ ┌───┬───▷ print("Welcome")
G gg H M L k j ▶ print("to")
│        │   └─▷ print("quickref.me")
│        │       print("/vim")
│        │     
│        └─────▷ 
│                - SCREEN 1 END
└──────────────▷ print("SCREEN 2")

1
我不知道“ge”(因此也不知道“gE”),谢谢!可以在末尾添加空格以显示“g_”,并且可能需要一些大写字母(“B”,“W”,“E”)。另外,“-”和“+”(或“<CR>”)也很有用! - DZet

3

这个网站是学习vim编辑器主要导航命令的好地方。vim的一些强大和快速功能来自于动作与移动的结合,例如cw -> 改变单词,d10j -> 删除下面10行等。此外,这篇文章这篇文章也很有趣。


2

您可以使用:set nohlsearch关闭搜索字符的高亮显示。

我也经常使用ctags进行导航。


你可能会在那里找到其他有用的东西。https://github.com/richoH/dotfiles/blob/master/vimrc - richo
谢谢你的提示,我正在查看你的vimrc文件,并发现了你设置的注释,当你在编写电子邮件或文档时达到80个字符时,会突出显示该行。为什么你要在VIM中编写电子邮件呢?我可以理解你为个人使用而编写文档,但不确定是否适用于电子邮件。 - Helmut Granda
我使用mutt + vim来阅读和撰写绝大部分的电子邮件。我还使用it's all text插件在vim中编写许多网页内容。我为电子邮件打开了自动换行功能,但对于链接等内容,如果我没有正确格式化或嵌套引用过长,提醒可能会很有用。 - richo

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