繁体   English   中英

Vim:重新映射除视觉以外的所有模式

[英]Vim: remap on every mode except visual

在可视模式下我正在做一个键映射:

:vnoremap Ó b

但是,对于所有其他模式,我需要另一个映射。 有没有办法做类似的事情:

:'vremap

指定所有其他模式? 目前我正在做一些非常冗长的事情,比如:

"Simulate option-shift arrow keys to highlight chunks of text
:vnoremap Ó bv
:vnoremap Ò el
:vnoremap Ô j
:vnoremap  k

:nnoremap Ó <Esc>vb
:nnoremap Ò <Esc>vel
:nnoremap Ô <Esc>vj
:nnoremap  <Esc>vk

:inoremap Ó <Esc>lvb
:inoremap Ò <Esc>lve
:inoremap Ô <Esc>vj
:inoremap  <Esc>vk

有没有办法做类似:'vremap来指定所有其他模式?

正如@Celz 指出的那样,“所有模式”都没有 map 命令。 然而,有几种方法可以避免为多种模式多次定义相同的映射。

这个答案中,作者说明了如何使用 for 循环到 map 同时到多个模式:

for map_command in ['nnoremap', 'inoremap']
  execute map_command . ' <silent> Ó <Esc>vb'
  execute map_command . ' <silent> Ò <Esc>vel'
  execute map_command . ' <silent> Ô <Esc>vj'
  execute map_command . ' <silent>  <Esc>vk'
endfor

这个答案中,包装器 function 用于实现相同目的:

function! MapBoth(keys, rhs)
    execute 'nnoremap' a:keys a:rhs
    execute 'inoremap' a:keys a:rhs
endfunction

call MapBoth('Ó', '<Esc>lvb')
call MapBoth('Ò', '<Esc>lve')
call MapBoth('Ô', '<Esc>vj')
call MapBoth('', '<Esc>vk')

使用这些解决方案,您只需定义一次映射。

免责声明:我没有尝试过上述解决方案,但如果它们不适合您,请告诉我们。

查看文档:h map ,您会发现以下内容:

:no[remap]  {lhs} {rhs}     |mapmode-nvo|   *:no*  *:noremap* *:nor*
:nn[oremap] {lhs} {rhs}     |mapmode-n| *:nn*  *:nnoremap*
:vn[oremap] {lhs} {rhs}     |mapmode-v| *:vn*  *:vnoremap*
:xn[oremap] {lhs} {rhs}     |mapmode-x| *:xn*  *:xnoremap*
:snor[emap] {lhs} {rhs}     |mapmode-s| *:snor* *:snore* *:snoremap*
:ono[remap] {lhs} {rhs}     |mapmode-o| *:ono* *:onoremap*
:no[remap]! {lhs} {rhs}     |mapmode-ic|    *:no!* *:noremap!*
:ino[remap] {lhs} {rhs}     |mapmode-i| *:ino* *:inor* *:inoremap*
:ln[oremap] {lhs} {rhs}     |mapmode-l| *:ln*  *:lnoremap*
:cno[remap] {lhs} {rhs}     |mapmode-c| *:cno* *:cnor* *:cnoremap*
:tno[remap] {lhs} {rhs}     |mapmode-t| *:tno* *:tnoremap*

您正在寻找的东西似乎没有选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM