urxvt 中 vim 的 Alt 映射

urxvt 中 vim 的 Alt 映射

我的映射包含在使用 in 时Alt不起作用。他们工作得很好。此类映射的示例vimurxvtgvim

map <silent> <A-h> <C-w><

在插入模式下,当我键入 时Alt-h,仅h打印。我需要如何配置urxvt才能使包含的映射Alt在 vim 中工作?我正在使用Ubuntu。

哎呀,我在 urxvt 中将修饰符设置为 super。这就是为什么所有解决方案都不适合我。确保将修饰符设置为 Alt 以使建议的解决方案发挥作用。

答案1

当您<A-x>在 Vim 中进行映射时,当 x 是可打印字符(即不是光标或箭头键)时,它会告诉 Vim 期望该字符具有第 8 位/高位集(即在 ASCII 值上添加 128)。

在您的示例中,<A-h>意味着 Vim 将在您键入 è 时触发映射。 h 的 ASCII 值为 104(二进制 01101000),当您设置该数字的第 8 位时,您将得到 è 的 ASCII 值为 232(二进制 11101000)。

在 urxvt 和许多其他终端中发生的情况是,Alt 键设置为发送以 Escape 字符为前缀键入的字符,而不是“添加 128”。在这种情况下,Vim 种子<Esc>h而不是 è,因此不会触发映射。

这给您留下了两个选择:重新配置您的终端以使用 Alt 修饰符执行不同的操作或者<Esc>x除了 之外,还可以向 Vim 添加更多映射<A-x>

答案2

如果您需要输入非 ASCII 文本,请尝试将vimfrom中的映射更改<A-x><Esc>x

如果您仅输入 ASCII 文本,您可以尝试urxvt使用--meta8选项启动,并在vim set termencoding=latin1.

您还可以尝试其他解决方案:

http://vim.wikia.com/wiki/Get_Alt_key_to_work_in_terminal

答案3

我无耻地发帖u/jbaumy93 在 reddit 上给出的答案

这是我现在正在使用的,

~/.Xresources我是不是设置URxvt.meta8: true为当我设置它时编码被破坏。如果我使用set termencoding=latin,它会弄乱电力线字符。我决定使用Esc@graywh 发布的映射,并使用上面链接的答案来执行此操作。

还要确保修饰符设置为Alt中的那样urxvt。我一直在使用super作为修改器,但发布的解决方案都不起作用。

这是我的片段vimrc

nnoremap <silent> <A-h> <C-w><
nnoremap <silent> <A-k> <C-w>-
nnoremap <silent> <A-j> <C-w>+
nnoremap <silent> <A-l> <C-w>>
function! Altmap(char)
  if has('gui_running') | return ' <A-'.a:char.'> ' | else | return ' <Esc>'.a:char.' '|endif
endfunction
if $TERM == 'rxvt-unicode-256color'&&!has('gui_running')
  set ttimeoutlen=10
  augroup FastEscape
    autocmd!
    autocmd InsertEnter * set timeoutlen=400
    autocmd InsertLeave * set timeoutlen=2000
  augroup END
  execute 'nnoremap <silent>'.Altmap('h').'<C-w><'
  execute 'nnoremap <silent>'.Altmap('k').'<C-w>-'
  execute 'nnoremap <silent>'.Altmap('j').'<C-w>+'
  execute 'nnoremap <silent>'.Altmap('l').'<C-w>>'
endif

相关内容