我选择使用 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