【问题标题】:gvim: make <S-Up>, <S-Down> move in screen linesgvim: 使 <S-Up>, <S-Down> 在屏幕行中移动
【发布时间】:2013-09-07 22:05:09
【问题描述】:

我选择使用 gvim 作为我的主要文本编辑器,但仍然希望它的行为更像我习惯的其他可视化编辑器。一方面是当我启用换行 (set linebreak) 并在插入模式下使用箭头键 &lt;Up&gt;&lt;Down&gt; 时,我想将光标移动到上一个/下一个 屏幕 行,不是逻辑行。这可以使用映射来实现:

inoremap <Up>   <C-O>gk
inoremap <Down> <C-O>gj

...一切都很好。

除了,在选择模式下。在使用&lt;S-Right&gt; 时,&lt;S-Left&gt; 按预期工作,&lt;S-Up&gt;&lt;S-Down&gt; 仍然按照逻辑行移动。在http://vim.wikia.com 上,我发现了以下关于其他映射的建议:

noremap  <S-Up>     vgk
noremap  <S-Down>   vgj
inoremap <S-Up>     <C-O>vgk
inoremap <S-Down>   <C-O>vgj

后两种映射现在使我开始在插入模式下按&lt;S-Down&gt; 进行选择时,我可以从前一个位置选择一个到下一个屏幕行中的相同位置。但是当我已经有一个选择(已经处于选择模式)时,按&lt;S-Down&gt; 会向下移动一行但会丢失选择。

我希望实现这一点,需要为选择模式 (snoremap) 提供特定映射,但无法弄清楚如何做到这一点。


由于与 glts 讨论了选择模式是否无用,因此可能需要一些背景信息:选择模式似乎是 vim 试图提供类似于 MS Windows 上大多数其他可视化编辑器中的选择行为的东西, Mac OS,甚至 Linux,这反过来又受到IBM's CUA 的启发。由于它仅对随附的键盘映射 ^C、^X、^V 真正有用,因此它应与提供这些映射的mswin.vim 结合使用。我的问题是试图补充这些映射,以便选择模式也可以按预期工作于包装文本。

【问题讨论】:

  • 理论上,这个问题属于超级用户。然而,关于 stackexchange 的大多数 vim 问题似乎都在 stackoverflow 上——这也是我把我的问题放在这里的原因。
  • 在 Vim 中,选择模式称为 Visual 模式。 (Vim 确实有其他称为“选择模式”的东西,但您可以立即忘记它,因为它在实践中几乎没有用。)您可以使用 :xnoremap 进行可视模式映射。
  • @glts 是否有任何理由使用 xnoremap 而不是 vnoremap?
  • @FDinoff 最不意外的原则? :xnoremap 专门用于可视模式,:vnoremap 用于可视模式和选择模式,这几乎不合适。 :h mapmode-x 有潜在混淆的警告。
  • 亲爱的@glts,我很确定我的意思是 Select 模式。 :-)

标签: vim selection word-wrap keymapping


【解决方案1】:

对于选择模式,如果真的是你的意思,那么这些映射会起作用:

vnoremap <S-Up>   gk
vnoremap <S-Down> gj
imap     <S-Up>   <Esc>gh<S-Up>
imap     <S-Down> <Esc><Right>gh<S-Down>
nmap     <S-Up>   gh<S-Up>
nmap     <S-Down> gh<S-Down>

注意gh 命令(选择模式)而不是v(可视模式)。

但请注意 - 这是我的一个假设 - Vim 用户的一般民众会避开 Select 模式,因为它与 Vim 方式背道而驰。

视觉模式更强大,因为除了替换文本之外,您还可以将其拉入寄存器,将其设置为大写或小写,更改视觉选择的范围等。看看@987654324 @。

【讨论】:

  • 非常感谢,glts!我不确定我是否已了解所有细节,但您的解决方案有效。发布问题后,我想出了自己的解决方案,请参阅我自己的答案。如果您有时间,我会对您的 cmets 感兴趣,了解您和我的方法的相对优点。
  • 关于“认真的用户”,我可以向你保证,我是很认真的。 :) 但我必须指出(在 SO 和其他地方的 cmets 中)我在 vim 专家中发现了一种令人不安的趋势:他们似乎认为只有 一种方法 可以正确使用编辑器,而一切否则被误导。虽然这可能会让人深感,但我会敦促 vim 专家不要直言不讳,因为坦率地说,这有点居高临下,而且完全是错误的。我可以调整 UI 以适应其他地方形成的习惯,并且仍然使用 vim 的强大功能,在这种情况下,只需使用更适合的可视模式即可。
  • @A.Donda 当然,每个人都做最适合他们的事情。有些人喜欢使用操作符进行编辑,而另一些人在可视模式下也这样做,因为他们更喜欢可视模式的视觉反馈。这两种方法当然都很好!然而,在选择模式的情况下,我坚持我的说法:选择模式与可视模式相比,只有只有个缺点和没有个优点;视觉模式可以和选择模式做同样的事情,而且很多
  • 在几乎所有其他编辑器中(好吧,除了 vi、Emacs、joe),我通过鼠标或使用 Shift-箭头键进行选择。 AFAIK 这被称为符合 CUA 的行为。 vim 上对应的模式是选择模式,而不是可视模式。 – 我的手已经练习了大约 20 年的这些动作,而且我每天都在其他地方使用它们,例如: MATLAB 的内置编辑器,或者 Chrome 中 Gmail 的撰写窗口。当然视觉模式更强大,但大多数时候我并不需要这种力量。为什么我总是要切换?
  • @A.Donda 好的,这很公平。我对选择模式如此漠视,以至于我什至不知道您可以将它与 Ctrl-C、Ctrl-X、Ctrl-V 一起使用……谢谢!
【解决方案2】:

这是我自己想出来的:

使&lt;Up&gt;&lt;Down&gt; 移动到上一个/下一个屏幕行。 (在插入模式下,&lt;C-O&gt; 为一个命令切换到正常模式。在正常模式下,gj 和 gk 是“按屏幕行移动”命令。)

inoremap <Up>       <C-O>gk
inoremap <Down>     <C-O>gj

&lt;S-Up&gt;&lt;S-Down&gt; 在插入模式下相同,进入选择模式。 (在普通模式下,v进入视觉模式。gj和gk也在视觉模式下工作。在视觉模式下,&lt;C-G&gt;进入选择模式。)

inoremap <S-Up>     <C-O>vgk<C-G>
inoremap <S-Down>   <C-O>vgj<C-G>

&lt;S-Up&gt;&lt;S-Down&gt; 在选择模式下相同。 (在选择模式下,&lt;C-O&gt; 会为一个命令切换到可视模式。)

snoremap <S-Up>     <C-O>gk
snoremap <S-Down>   <C-O>gj

【讨论】:

  • 现在我明白了!在这里学到了一些新东西,我不知道你可以在选择模式下使用&lt;C-O&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 2012-12-09
  • 1970-01-01
相关资源
最近更新 更多