Tasten im Ersetzungsmodus in vim neu zuordnen

Tasten im Ersetzungsmodus in vim neu zuordnen

Ich versuche, meine Semikolon- und Doppelpunkttasten zu vertauschen.

Ich benutze diese Funktion

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 : ;

das funktioniert in allen Fällen außer im Ersetzungsmodus.

In der Dokumentation steht, dass inoremap den Ersetzungsmodus abdecken sollte, aber wenn ich im normalen Modus r eingebe, ersetze ich das aktuelle Zeichen durch ein Semikolon statt durch den Doppelpunkt, dem es zugeordnet werden sollte. Das ist ziemlich ärgerlich, wenn die Zuordnung überall sonst funktioniert.

Wie kann ich die Tastenneuzuordnung im Ersetzungsmodus aktivieren?

Antwort1

Ersetzungsmodusist die Variante des Einfügemodus, die die vorhandenen Zeichen durch den eingegebenen Text ersetzt. Der mit durchgeführte Einzelzeichenersatz rist nichtErsetzungsmodus, noch ist es ein spezieller Modus; daher :mapgelten die Befehle dort nicht. Ein guter Trick besteht darin, die gesamte Befehls- + Zeichenkombination neu zuzuordnen:

nnoremap r; r:
nnoremap r: r;

Alternativ können Sie auch :lmap; verwenden, vgl :help r.:

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

verwandte Informationen