
Ich versuche, ein kleines Makro zu schreiben, um ein ; an das Ende der aktuellen Zeile anzuhängen (A;) und dann zur Cursorposition zurückzukehren, von der ich vor der Ausführung des Makros gesprungen bin.
Co und Ci sind nicht das, was ich brauche, ebenso wenig wie '' und ``, die auf Bearbeitungspunkte wirken. Gibt es keine Möglichkeit, dies zu tun, ohne einen Marker zu setzen?
Antwort1
Wenn es für Sie ok ist, statt eines winzigen Makros eine winzige Funktion zu erstellen, würde ich Folgendes vorschlagen:
function! AppendString(string)
if getline('.') !~ a:string.'$'
let original_cursor_position = getpos('.')
exec("s/$/".a:string."/")
call setpos('.', original_cursor_position)
endif
endfunction
Die Cursorposition wird mithilfe von ermittelt getpos()
und später mit wiederhergestellt setpos()
.
Diese Funktion kann jeden beliebigen String anhängen. Sie prüft auch, ob die Zeile am Ende bereits den gewünschten String enthält. In diesem Fall passiert nichts.
Sie können Tastaturbelegungen definieren, die diese Funktion verwenden und für verschiedene Sprachen nützlich sind:
" in ftplugin/cpp.vim
nnoremap <silent> <LocalLeader>; :call AppendString(";")<CR>
oder
" in ftplugin/python.vim
nnoremap <silent> <LocalLeader>: :call AppendString(":")<CR>
Antwort2
setpos()
Wenn Sie „low-level “ anstelle von verwenden :substitute
(was andere unerwünschte Nebenwirkungen hat, wie z. B. das Hinzufügen des Musters zum Suchverlauf), wird die Cursorposition automatisch beibehalten:
:nnoremap <silent> <leader>; :call setline('.', getline('.') . ';')<CR>
Antwort3
Das Verhalten von `` und was als „Sprünge“ betrachtet wird, wird im Dokument klar erklärt.
Aus :help jump-motions
:
Ein „Sprung“ ist einer der folgenden Befehle: „'“, „`“, „G“, „/“, „?“, „n“, „N“, „%“, „(“, „)“, „[[“, „]]“, „{“, „}“, „:s“, „:tag“, „L“, „M“, „H“ und die Befehle, die mit der Bearbeitung einer neuen Datei beginnen. Wenn Sie den Cursor mit einem dieser Befehle „springen“ lassen, wird die Position des Cursors vor dem Sprung gespeichert. Sie können mit den Befehlen „''“ und „``“ zu dieser Position zurückkehren, sofern die Zeile, die diese Position enthält, nicht geändert oder gelöscht wurde.
A
ist offensichtlich nicht in der Liste, also funktioniert "tick-tick-back", wie Gary Bernhardt es nennt, nicht "so wie es ist". Es ist trotzdem ein guter Ansatz, aber Sie müssen das Backtick-Zeichen explizit setzenVordu tustA;
nnoremap <key> m`A;<Esc>``
Antwort4
Am Ende habe ich eine winzige Funktion geschrieben, eine weniger flexible, aber kompaktere Version als die, die Sie gerade gepostet haben.
Tastenkombination:
nnoremap <leader>; :call AppendSC()<CR>
Funktion:
fun! AppendSC()
let pos = getpos('.')
s/.*/&;/
call setpos('.', pos)
endf