如何修复 Vim 中的 Ctrl + 箭头?

如何修复 Vim 中的 Ctrl + 箭头?

我正在使用 Putty、Suse box 和 Vim 7.2 组合进行编辑,我想将Ctrl+Arrow按键重新映射到特定任务。但由于某种原因,Vim 忽略快捷方式,进入插入模式,并插入字符D(for Ctrl+ ) 或字符C(for Ctrl+ )。

我的键盘/终端配置的哪一部分应该受到指责以及如何修复它?

答案1

通过在插入模式下键入+ , +arrow来准确找出终端为Ctrl+arrow发送的转义序列:这将逐字插入前导字符(如vim 中所示),然后是转义序列的其余部分。然后告诉 vim 这些转义序列,比如CtrlVCtrlESC^[

map <ESC>[5D <C-Left>
map <ESC>[5C <C-Right>
map! <ESC>[5D <C-Left>
map! <ESC>[5C <C-Right>

我记得 Putty 有一个默认设置应用程序光标键模式这很不方便(我忘了为什么),您可能需要先切换此设置。

请注意,虽然终端之间的转义序列有所不同,但冲突(即对应于不同终端中的不同键的转义序列)很少见,因此没有特别需要尝试仅在特定终端类型上应用映射。

答案2

你最好的选择可能是看看 PuTTY 的应用程序光标键模式配置。

默认序列ESC作为前缀发送,[后跟Apend 或Change 或其他使您进入插入模式的东西。

继吉尔斯之后添加

^V 转义的稍微更明确的版本可以通过 od(1) 看到。这是我在终端输入 ^Up、^Down、^Right、^Left:

$ od -a
0000000 esc   [   1   ;   5   A esc   [   1   ;   5   B esc   [   1   ;
0000020   5   C esc   [   1   ;   5   D

所以^[[1;5A当我按Ctrl+时我的终端会发送

答案3

我在这里找到了更好的解决方案: http://vim.wikia.com/wiki/Fix_arrow_keys_that_display_A_B_C_D_on_remote_shell

只需将此字符串放入您的.vimrc文件中即可:

:set term=cons25

更新

将此文件复制到您的/home,重命名.vimrc

/usr/share/vim/vim_VERSION_/vimrc_example.vim

答案4

当这个问题在 2010 年被问到时(并且当提供其他答案时,不迟于 2013 年),PuTTY 无法区分控制光标键的修饰符。它只会发送 VT100 风格的普通光标键和应用程序光标键。特别是,任何带有“”等文字的答案<ESC>[1;5A都没有解决OP的问题。

十多年后,PuTTY 提供了一个源自 xterm 的方案,如下提交所示:

commit 22911ccdcc37c7955bfc1c45a88d3762d1206da7                                 
Author: Simon Tatham <[email protected]>                                         
Date:   Mon Oct 18 20:00:25 2021 +0100                                          
                                                                                
    New config option for shifted arrow key handling.                           
                                                                                
    This commit introduces a new config option for how to handle shifted        
    arrow keys.                                                                 
                                                                                
    In the default mode (SHARROW_APPLICATION), we do what we've always          
    done: Ctrl flips the arrow keys between sending their most usual            
    escape sequences (ESC [ A ... ESC [ D) and sending the 'application         
    cursor keys' sequences (ESC O A ... ESC O D). Whichever of those modes      
    is currently configured, Ctrl+arrow sends the other one.                    
                                                                                
    In the new mode (SHARROW_BITMAP), application cursor key mode is            
    unaffected by any shift keys, but the default sequences acquire two         
    numeric arguments. The first argument is 1 (reflecting the fact that a      
    shifted arrow key still notionally moves just 1 character cell); the        
    second is the bitmap (1 for Shift) + (2 for Alt) + (4 for Ctrl),            
    offset by 1. (Except that if _none_ of those modifiers is pressed,          
    both numeric arguments are simply omitted.)                                 
                                                                                
    The new bitmap mode is what current xterm generates, and also what          
    Windows ConPTY seems to expect. If you start an ordinary Command            
    Prompt and launch into WSL, those are the sequences it will generate        
    for shifted arrow keys; conversely, if you run a Command Prompt within      
    a ConPTY, then these sequences for Ctrl+arrow will have the effect you      
    expect in cmd.exe command-line editing (going backward or forward a         
    word). For that reason, I enable this mode unconditionally when             
    launching Windows pterm.    

设置对话框条目位于 config.c 中:

    ctrl_radiobuttons(s, "Shift/Ctrl/Alt with the arrow keys", 'w', 2,          
                      HELPCTX(keyboard_sharrow),                                
                      conf_radiobutton_handler,                                 
                      I(CONF_sharrow_type),                                     
                      "Ctrl toggles app mode", I(SHARROW_APPLICATION),          
                      "xterm-style bitmap", I(SHARROW_BITMAP));   

该“位图”指的是该表XTerm 控制序列:

                    Code     Modifiers
                  ---------+---------------------------
                     2     | Shift
                     3     | Alt
                     4     | Shift + Alt
                     5     | Control
                     6     | Shift + Control
                     7     | Alt + Control
                     8     | Shift + Alt + Control
                     9     | Meta
                     10    | Meta + Shift
                     11    | Meta + Alt
                     12    | Meta + Alt + Shift
                     13    | Meta + Ctrl
                     14    | Meta + Ctrl + Shift
                     15    | Meta + Ctrl + Alt
                     16    | Meta + Ctrl + Alt + Shift
                  ---------+---------------------------

所以...根据开发人员的描述,适用于 xterm 的设置应该适用于 PuTTY。自 PuTTY 开发于 2000 年左右开始以来,这就是 xterm 的一个功能2002年,在 2021 年修复这个细节是“期待已久的”。

进一步阅读:

相关内容