屏幕会话中的控制台 vim:重新映射 Ctrl-Shift-Left、Ctrl-Shift-Right 以不删除行

屏幕会话中的控制台 vim:重新映射 Ctrl-Shift-Left、Ctrl-Shift-Right 以不删除行

我有我的 gvim 设置,这样我就可以使用 Ctrl-Shift-Right、Ctrl-Shift-Left 等按单词选择(是的,我知道这是一个坏习惯,但它对我有用......)。

不幸的是,这些组合键在屏幕会话中的控制台 vim 中使用时会删除文本。我相信这是因为两个组合键在终端上生成代码Esc[1;6D和,它们分别被解释为“删除接下来的 6 行”或“更改下一行”。Esc[1;6C

有没有办法阻止屏幕或控制台 vim 解释这些组合键?

更新:我的.screenrc的内容:

sessionname daku
startup_message off
hardstatus on
hardstatus alwayslastline
hardstatus string "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a "

答案1

显然,Vim 没有键序列的绑定␛[1;6D,但有一个以 , 开头的其他键序列的绑定␛[1,可能␛[1~(通常由Home键发送)。添加重新映射到您的.vimrc声明中,这␛[1;6D实际上是Ctrl++Shift等等Left。我认为以下应该可以解决问题:

noremap <ESC>[1;6D <C-S-Left>
noremap! <ESC>[1;6D <C-S-Left>
noremap <ESC>[1;6C <C-S-Right>
noremap! <ESC>[1;6C <C-S-Right>

这是我的.vimrc

function Allmap(mapping)
  execute 'map' a:mapping
  execute 'map!' a:mapping
endfunction
function Allnoremap(mapping)
  execute 'noremap' a:mapping
  execute 'noremap!' a:mapping
endfunction
call Allmap('<ESC>[6D <C-S-Left>')
call Allmap('<ESC>[6C <C-S-Right>')
call Allnoremap('<C-S-Left> <C-Left>')
call Allnoremap('<C-S-Right> <C-Right>')

答案2

这就是我现在的情况.vimrc

if ! has("gui_running")
  noremap  <ESC>[1;6D <C-S-Left>
  inoremap <ESC>[1;6D <C-S-Left>
  noremap  <ESC>[1;6C <C-S-Right>
  inoremap <ESC>[1;6C <C-S-Right>
endif

答案3

将绑定从 ~/.vimrc 移至 ~/.gvimrc。

相关内容