首页 > 解决方案 > Vim:重新映射除视觉之外的所有模式

问题描述

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

: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

标签: vim

解决方案


有没有办法:'vremap指定所有其他模式?

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

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

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! 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')

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

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


推荐阅读