Mac OS X终端中的Vim:逐字移动光标

时间:2011-03-17 21:40:52

标签: macos vim

我已按照Is there any way in the OS X Terminal to move the cursor word by word?中的指导进行操作,现在在终端我可以逐字移动光标。

然而,在Vim中,我只能逐字逐句地向后移动。无论我将{033f设置为option+cursor-right还是shift+cursor-right,我都无法一字一句地前进。我想出的唯一解决方法是进入正常模式,然后点击<w>移动到下一个单词。关于如何解决这个问题的任何想法?感谢。

3 个答案:

答案 0 :(得分:11)

w不是解决方法。这是逐字移动的主要方式(另请参阅:WbBeE)。你想要的是一种解决方法,它根本无法帮助你学习Vim。

答案 1 :(得分:1)

有些人可能会争辩说,使用VIM native keyboard shortcuts移动并不是一种解决方法,但对我而言,它确实非常不方便且非常低效。特别是您需要在insert模式和normal模式之间切换以转移到下一个单词的部分。

这就是我在SuperUser上提出基于this answer的解决方案的原因。我们的想法是直接在VIM中映射Terminal.app提供的输入。 SU上的答案显示了要放置在vimrc文件中以使Home / End键按预期工作的内容。

我在下面的调整版中包含Option+arrow(或Alt+arrow)字词导航。我试图模仿终端的行为尽可能接近我的行动。因此,按Option+RightAlt+Right)会将插入符号移到单词后面的下一个字符(而不是单词的最后一个字符,即VIM w本机行为)。

let tp=$TERM_PROGRAM
if tp == 'Apple_Terminal'
  :" map Mac OS X Terminal.app

  " map Home/End:
  :map <ESC>[H <Home>
  :map <ESC>[F <End>
  " small 'o' letter in <C-o> means no exit from the insert mode
  :imap <ESC>[H <C-o><Home>
  :imap <ESC>[F <C-o><End>
  :cmap <ESC>[H <Home>
  :cmap <ESC>[F <End>

  " map Option+Left/Option+Right:
  " for this to work you must have the bindings in Settings > Keyboard set
  " as follows:
  " 'option cursor left' to '\033b'
  " 'option cursor right' to '\033f'
  :map <ESC>f el
  :imap <ESC>b <C-o>b
  :imap <ESC>f <C-o>el
  :cmap <ESC>f el
endif

作为一个小但重要的奖励,您可以在不退出insert模式的情况下获得Home / End导航。在10.8.5上进行了测试。

答案 2 :(得分:1)

让我为你澄清一些事情。 Bash(在终端内运行的shell程序)具有您习惯的行为。 (使用Alt + f按字向前移动,Alt + b按字向后移动。)这最初与Emacs一样。您可以使用命令

set -o vi

切换到vim行为。在此模式下,您可以使用Esc切换到普通模式,并像在vim中一样移动;然后按i返回插入模式。

所以不要惊讶Vim没有像Emacs那样行事。 vim背后的全部力量都在这些简单的动作背后。