gvim:make <s-up>,<s-down>在屏幕行中移动</s-down> </s-up>

时间:2013-09-07 22:05:10

标签: vim selection word-wrap keymapping

我选择使用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's CUA。由于它仅对附带的键盘映射^ C,^ X,^ V非常有用,因此它意味着与提供这些映射的mswin.vim结合使用。我的问题是通过尝试补充这些映射来实现的,这样选择模式也可以按照预期对包装文本起作用。

2 个答案:

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

可视模式功能更强大,因为除了替换文本之外,您还可以将其拉入寄存器,使其大写或小写,更改视觉选择的范围等。查看{{ 1}}。

答案 1 :(得分:0)

以下是我自己提出的建议:

<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