![Warum gibt es in Vim einen Unterschied zwischen der Bearbeitung innerhalb von " und (?](https://rvso.com/image/1288688/Warum%20gibt%20es%20in%20Vim%20einen%20Unterschied%20zwischen%20der%20Bearbeitung%20innerhalb%20von%20%22%20und%20(%3F.png)
Bei der Ausführung des Befehls ci"
bearbeitet Vim den Text innerhalb der nächsten in Anführungszeichen gesetzten Zeichenfolge in der Zeile, selbst wenn sich der Cursor außerhalb der Anführungszeichen befindet. Dies ci(
funktioniert jedoch nur, wenn sich der Cursor innerhalb der Klammern befindet.
Warum? Kann ci(
man so vorgehen, dass man zum ersten Vorkommen von „ (
as ci"
does“ springt?
Beispieltext(mit Erlang-Syntax), wo ich herumspiele:
?assertEqual({200, "OK"}, status(FirstResponse)),
% ^
% Here I'm expecting ci( to jump in to the parenthesis ( ci" works)
Antwort1
Nach einem kurzen Blick auf die Dokumentation ( help v_aquote
, help v_iquote
) neige ich dazu zu sagen, dass es sich hier eher um einen Fehler in ci"
als um einen Mangel in handelt ci(
. Das beobachtete ci(
Verhalten ist konsistent mit ci{
und ci[
.
ci(
Das heißt, Sie können das gewünschte Verhalten mit dieser Zuordnung erzielen :
nnoremap ci( f(ci(
--- BEARBEITEN ---
--- (Diese Frage wurde zum Superuser migriert, dessen Mitglied ich nicht bin)
Die folgende Funktion/Zuordnung verhält sich unterschiedlich, je nachdem, ob ein vorangehender Wert (
erkannt wird. Sie löst das (a) (b)
Problem mit meiner ursprünglichen Zuordnung (wie in den Kommentaren erwähnt). Es ist jedoch möglicherweise immer noch nicht perfekt ...
function New_cib()
if search("(","bn") == line(".")
sil exe "normal! f)ci("
sil exe "normal! l"
startinsert
else
sil exe "normal! f(ci("
sil exe "normal! l"
startinsert
endif
endfunction
nnoremap ci( :call New_cib()<CR>
nnoremap cib :call New_cib()<CR>
Antwort2
Der Grund ist: Klammern, spitze Klammern und geschweifte Klammern kommen paarweise vor und können daher verschachtelt werden.
Einfache und doppelte Anführungszeichen können grundsätzlich nicht verschachtelt werden (außer in Bash-Skripten mit "$("something")"
Syntax); daher ist es zulässig, ein Textobjekt zu finden, auch wenn sich der Cursor nicht darin befindet, da sich kein externes Objekt befinden kann.
Antwort3
Ich glaube, "
das sind die einzigen Textobjekte, die so funktionieren, d. h. das nächste passende Muster in der Zeile auswählen.
Die Hilfe könnte erklären, warum:
a" *v_aquote* *aquote*
a' *v_a'* *a'*
a` *v_a`* *a`*
"a quoted string". Selects the text from the previous
quote until the next quote. The 'quoteescape' option
is used to skip escaped quotes.
Only works within one line.
When the cursor starts on a quote, Vim will figure out
which quote pairs form a string by searching from the
start of the line.
Any trailing white space is included, unless there is
none, then leading white space is included.
When used in Visual mode it is made characterwise.
Repeating this object in Visual mode another string is
included. A count is currently not used.
Offenbar versucht Vim, den zitierten Text herauszufinden, indemSuche ab Zeilenanfang. Es spielt also keine Rolle, wo Sie sich in der Zeile befinden. (Allerdings scheint es nicht zu funktionieren, wenn sich Ihr Cursor hinter dem zitierten Text befindet.)