Vim Script: Kann eine benutzerdefinierte Bewegung nicht wiederholbar gemacht werden?

503
Steve Vermeulen

Ich versuche, eine benutzerdefinierte Ruckfunktion zu schreiben, kann aber nicht herausfinden, wie sie nicht wiederholbar ist (wie das normale Ruckeln). Ich habe etwas Ähnliches wie folgt:

function! s:YankMotion(type)  if a:type ==# 'line' normal! `[V`]y elseif a:type ==# 'char' normal! `[v`]y else echom "Unexpected selection type" return endif endfunction  nnoremap y :set opfunc=<sid>YankMotion<cr>g@ 

Das Problem ist, dass, wenn Sie eine Operation cwausführen, die wiederholbar ist (z. B. ), dann etwas reißen und dann die Wiederholung wiederholen ., würden Sie erwarten, cwdass sie ausgelöst wird.

Kann man das beheben?

2
Was Sie tun, ist kein normaler Ruck mehr: Es ist jetzt ein normaler Modusbefehl und ist daher mit `.` wiederholbar. romainl vor 11 Jahren 0
Richtig, es ist als Standard sinnvoll, aber in diesem Fall möchte ich dieses Verhalten nicht. Steve Vermeulen vor 11 Jahren 0

1 Antwort auf die Frage

2
Ingo Karkat

Vim wiederholt den g@Befehl. Leider gibt es keine Möglichkeit, dies zu umgehen, und da Sie auch nicht auf den internen Befehlsverlauf zugreifen können, ist es nicht möglich, den zuvor ausgegebenen Befehl wiederherzustellen. (Sie können für benutzerdefinierte Zuordnungen, die sich auf repeat.vim verlassen, etwas zusammen hacken, aber für integrierte Befehle ist dies nicht möglich.)

Die einzige Problemumgehung, die ich mir vorstellen kann, besteht darin, das Mapping zu ändern, um den normalen yBefehl zu verwenden, und anschließend alles auslösen, was zu Ihrem "benutzerdefinierten Ruck" gehört, z . B. über :autocmdon CursorMoved,CursorHold.