Переназначить клавиши в режиме замены в vim

Переназначить клавиши в режиме замены в vim

Я пытаюсь поменять местами клавиши точки с запятой и двоеточия.

Я использую эту функцию

func! FUNC_Remap(lhs, rhs)
    " Function which remaps keys in all modes
    "
    ":echom 'inoremap '.a:lhs.' '.a:rhs
    "http://vim.wikia.com/wiki/Mapping_keys_in_Vim_-_Tutorial_(Part_1)
    "  CHAR MODE    ~
    " <Space>   Normal, Visual, Select and Operator-pending
    "n  Normal
    "v  Visual and Select
    "s  Select
    "x  Visual
    "o  Operator-pending
    "!  Insert and Command-line
    "i  Insert
    "l  ":lmap" mappings for Insert, Command-line and Lang-Arg
    "c  Command-line
    "--------------
    " Normal Mode
    :exec 'noremap '.a:lhs.' '.a:rhs
    " Visual and Select Mode
    :exec 'vnoremap '.a:lhs.' '.a:rhs
    " Display select mode map
    :exec 'snoremap '.a:lhs.' '.a:rhs
    " Display visual mode maps
    :exec 'xnoremap '.a:lhs.' '.a:rhs
    " Operator Pending Mode
    :exec 'onoremap '.a:lhs.' '.a:rhs
    " Insert and Replace Mode
    :exec 'inoremap '.a:lhs.' '.a:rhs
    " Language Mode
    :exec 'lnoremap '.a:lhs.' '.a:rhs
    " Command Line Mode
    :exec 'cnoremap '.a:lhs.' '.a:rhs
endfu
command! -nargs=* CMDREMAP call FUNC_Remap(<f-args>)

func! FUNC_Swap(lhs, rhs)
    :call FUNC_Remap(a:lhs, a:rhs)
    :call FUNC_Remap(a:rhs, a:lhs)
endfu
command! -nargs=* CMDSWAP call FUNC_Swap(<f-args>)    

:CMDSWAP : ;

который работает во всех случаях, кроме режима замены.

Читая документацию, я говорю, что inoremap должен покрывать режим замены, но когда я набираю r; в обычном режиме я заменяю текущий символ точкой с запятой вместо двоеточия, к которому он должен был быть сопоставлен. Это довольно раздражает, когда везде в другом месте сопоставление работает.

Как сделать так, чтобы переназначение клавиш работало в режиме замены?

решение1

Заменить режимэто вариант режима вставки, который заменяет существующие символы напечатанным текстом. Замена одного символа, выполненная с помощью, rнезаменить режим, и это не специальный режим; поэтому :mapкоманды там не применяются. Хороший трюк — переназначить всю комбинацию команда + символ:

nnoremap r; r:
nnoremap r: r;

В качестве альтернативы вы можете использовать :lmap; cp. :help r:

      |:lmap| mappings apply to {char}.  The CTRL-^ command
      in Insert mode can be used to switch this on/off

Связанный контент