Vim:映射ctrl + pgup和ctrl + pgdn(CTRL + Page Up / Down)组合键

时间:2016-03-11 01:16:47

标签: linux vim terminal key-bindings xterm

我正在尝试将Vim命令映射到ctrl+pgupctrl+pgdn组合键。这些密钥的vim语法不起作用(即<PageUp><PageDown>,或<C-PageUp><C-PageDown>)。

由于默认的vim语法不起作用,我猜测终端没有发送Vim期待的ctrl+pgupctrl+pgdn的字符代码。如果这是真的,我不知道如何找出文字键码是什么。我在Arch Linux上使用xfce4-terminal。

这是我尝试过的:

  1. 通常的方法:

    map <C-PageUp> :bp<cr>
    
  2. 使用此答案的方法从命令行设置它:Why <C-PageUp> and <C-PageDown> not work in vim?

    :map <CTRL-V><CTRL-PAGEUP> :bp<cr>
    

    当我在命令行中输入上面的命令时,没有显示任何内容:

    map  :bp<cr>
    

    Vim说No mapping found

  3. 来自Vim wiki的这个方法:http://vim.wikia.com/wiki/Mapping_keys_in_Vim_-Tutorial(Part_2)#Key_notation

    set <PageUp>=<type Ctrl-V><type PageUp> "^[[5~
    map <C-PageUp> :bp<cr>
    
  4. 对该答案的修改:

    set <C-PageUp>=<type Ctrl-V><type Ctrl+PageUp> "^M
    map <C-PageUp> :bp<cr>
    
  5. 在意识到<type *>是用户命令后,我执行了这些命令,并使用vim粘贴输出。我用这个输出替换了<type *>

    set <PageUp>=^[[5~
    map <C-PageUp> :bp<cr>
    " Also:
    set <PageUp>=[[5~
    map <C-PageUp> :bp<cr>
    " Also:
    set <PageUp>=<^[[5~>
    map <C-PageUp> :bp<cr>
    " Also:
    set <PageUp>=<[[5~>
    map <C-PageUp> :bp<cr>
    " Also:
    set <C-PageUp>=^M
    map <C-PageUp> :bp<cr>
    " Also:
    set <C-PageUp>=<^M>
    map <C-PageUp> :bp<cr>
    
  6. 尝试5中的所有方法,但不先设置选项。 E.g:

    map <C-[[5~> :bp<cr>
    
  7. 此答案中的方法:https://groups.google.com/forum/#!topic/vim_use/j85-2xQkb7s

    map [5~ :bp<cr>
    
  8. 此答案中的方法:https://superuser.com/questions/322983/how-to-let-ctrl-page-down-switch-tabs-inside-vim-in-terminal-app

     map \033[5;5~ :bp<cr>
    
  9. 设置不同的术语选项:

     set term=xterm
     " Also:
     set term=xterm-256color
    

    我的$TERM环境变量设置为xterm

  10. 使用此答案提示的一些方法:https://superuser.com/questions/480215/how-to-map-pagedown-and-pageup-keys-to-function-normally

     map <Esc>[5~ :bp<cr>
     map <kpp> :bp<cr>
    
  11. 使用.vim/after/plugin/下的文件而非.vimrc
  12. 尝试上述所有内容
  13. 使用:MBEbp代替:bp尝试上述所有内容。
  14. 我还能尝试什么?

2 个答案:

答案 0 :(得分:6)

好吧,我明白了。我忽视了一些非常简单的事情,这通常适用于我。

ctrl pgup ctrl pgdn 已经是xfce4-terminal本身的键盘快捷键(用于切换终端标签) )。为了允许Vim使用这些组合键,终端本身不能使用它们。所以这是xfce4-terminal的一个问题,而不是Vim。

xfce4-terminal快捷方式可以通过此处描述的方法取消设置: https://unix.stackexchange.com/questions/159979/xfce4-terminal-disable-individual-shortcut

简而言之,就是这个过程:

  1. 打开~/.config/xfce4/terminal/accels.scm并取消注释/编辑这些行:

    (gtk_accel_path "<Actions>/terminal-window/next-tab" "")
    (gtk_accel_path "<Actions>/terminal-window/prev-tab" "")
    

    (您可以通过打开新窗口并点击菜单栏中的标签来验证此更改:上一个标签下一个标签项应该不再显示右侧的快捷方式。)

  2. 将此命令放入.vimrc

    map <C-PageUp> :bp<CR>
    map <C-PageDown> :bn<CR>
    

    请考虑使用nmap,将快捷方式限制为NORMAL模式。

答案 1 :(得分:0)

你可能最接近#2,但可能误解了指示。

Vim不知道关于控制页面等等,因为这些键没有传统的termcap符号,并且因为它们可能因终端而异。虽然vim有一些内置的termcap信息,但它不太可能有这些非传统的定义。

此外,尽管ncurses通过user-definable capabilities提供了这些键的定义,但vim不使用该信息(因为它仅使用 termcap 接口)。

Vim 可以 map结果的字符序列。但要做到这一点,你必须将角色变成vim。您的终端可能会发送以 escape 字符开头的字符序列,该字符通常以^[形式回显。输入特殊键时,您必须防止vim吃掉 escape 字符。通常的方法是首先按 control V (&#34;文字下一个&#34;字符),然后按特殊键。如果您看到^[回显,则表示正常。

并非所有终端都为修改后的密钥发送有趣(或不同 - 或任何内容)。例如,Offhand,PuTTY和Konsole在这方面的能力低于xterm或rxvt,通常只发送 nothing 。使密钥可见的副作用是查找终端是否发送了有用的东西。

进一步阅读: