GVIM:制作<S-Up>, <S-Down> 在屏幕行中移动



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

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

。一切都很好。

选择模式下除外。在使用 <S-Right> 时,<S-Left>按预期工作,<S-Up><S-Down>仍然在逻辑行方面移动。在 http://vim.wikia.com 我发现了以下有关其他映射的建议:

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

后两个映射现在允许当我在插入模式下按 <S-Down> 开始选择时,我会从上一个位置到下一个屏幕行中的相同位置获得选择。但是当我已经有一个选择(已经处于选择模式)时,按<S-Down>向下移动一行但丢失选择。

我希望实现这一目标,有必要为选择模式(snoremap)进行特定的映射,但无法弄清楚如何做到这一点。


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

对于选择模式,如果这确实是你的意思,这些映射将起作用:

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用户的普通民众会避开选择模式,因为它与Vim的方式背道而驰。

视觉

模式功能强大得多,因为除了替换文本外,您还可以将其拉入寄存器,使其大写或小写,更改视觉选择的范围等。看看:h vim-modes.

这是我自己想出来的:

进行<Up><Down>移动到上一个/下一个屏幕行。(在插入模式下,<C-O>切换到一个命令的正常模式。在正常模式下,gj 和 gk 是"按屏幕行移动"命令。

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

在插入模式下<S-Up><S-Down>相同,进入选择模式。(在正常模式下,v 进入可视模式,gj 和 gk 也在可视模式下工作。在可视模式下,<C-G>进入选择模式。

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

选择模式下的<S-Up><S-Down>相同。(在选择模式下,<C-O>切换到一个命令的可视模式。

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

最新更新