Dlaczego istnieje różnica między edycją w środku ”i (w Vimie?

5

Podczas wykonywania polecenia ci"Vim edytuje tekst wewnątrz następnego cytowanego ciągu w wierszu, nawet jeśli kursor znajduje się poza znakami cudzysłowu. Jednak po wykonaniu ci(tej czynności działa tylko wtedy, gdy kursor znajduje się w nawiasach.

Dlaczego? Czy ci(można sprawić, aby skoczył do pierwszego wystąpienia (tak jak ci"robi?

Przykładowy tekst (przy użyciu składni Erlanga), w którym gram:

    ?assertEqual({200, "OK"}, status(FirstResponse)),
%   ^
%   Here I'm expecting  ci(  to jump in to the parenthesis ( ci"  works)
Adam Lindberg
źródło
Mam nadzieję, że nie masz nic przeciwko, ale zredagowałem twoje pytanie tak, aby zawierało tylko odpowiedni wiersz kodu ukazujący problem.

Odpowiedzi:

5

Po krótkim spojrzeniu na dokumentację ( help v_aquote, help v_iquote) jestem skłonny powiedzieć, że jest to błąd ci", a nie brak ci(. Obserwowane ci(zachowanie jest zgodne z ci{i ci[.

To powiedziawszy, możesz uzyskać pożądane zachowanie ci(dzięki temu mapowaniu:

nnoremap ci( f(ci(

--- EDYTOWAĆ ---

--- (To pytanie zostało przeniesione do superużytkownika, którego nie jestem członkiem)

Następująca funkcja / mapowanie ma różne zachowanie w zależności od tego, czy (zostanie wykryty poprzedni . Rozwiązuje (a) (b)problem z moim oryginalnym mapowaniem (jak wskazano w komentarzach). Mimo to może nie być idealny ...

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>
Książę Gulasz
źródło
2
Ma to jedną wadę: gdy znajduje się w jednym nawiasie, polecenie przeskakuje do następnego: (|a) (b)gdzie |jest pozycja kursora. To w pewnym sensie psuje zachowanie ci(w tym konkretnym przypadku.
Adam Lindberg,
@Adam: bardzo dobry punkt, dzięki. Myślałem, że rozwiązaniem byłoby poszukiwanie nawiasu zamykającego do przodu:, f)ci(ale wtedy w twoim pierwotnym pytaniu zostaną wybrane niewłaściwe nawiasy. Wygląda na to, że konieczne jest bardziej złożone ogólne rozwiązanie.
@ Prince: Niestety. :-(
Adam Lindberg,
Oznaczę to jako zaakceptowane, ponieważ ma częściowe rozwiązanie, które może dla kogoś zadziałać. +1 za naukę f(.
Adam Lindberg,
Nie jestem pewien, dlaczego przeniesiono to do superużytkownika, ale zarejestrowałem się i zredagowałem swoją odpowiedź, aby uwzględnić pełniejsze rozwiązanie.
Prince Goulash,
4

Powodem jest to, że nawiasy klamrowe i nawiasy klamrowe są parami. Dlatego mogą się zagnieżdżać.

Pojedyncze i podwójne cudzysłowy na ogół nie mogą się zagnieżdżać (z wyjątkiem skryptów bash ze "$("something")"składnią, więc można znaleźć obiekt tekstowy, nawet jeśli kursor nie znajduje się w nim, ponieważ nie może być żadnego obiektu zewnętrznego.

Benoit
źródło
2
Chociaż przydatna byłaby właściwość, gdyby nie znaleziono zewnętrznego zasięgu, można wybrać następną w linii?
Adam Lindberg,
1

Myślę, że "to jedyne obiekty tekstowe, które działają w ten sposób, tj. Wybierz następny pasujący wzór w linii.

Pomoc może wyjaśnić, dlaczego:

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.

Najwyraźniej Vim próbuje znaleźć cytowany tekst, wyszukując od początku wiersza . Więc nie ma znaczenia, gdzie jesteś na linii. (Jednak wydaje się, że to nie działa, gdy kursor znajduje się za cytowanym tekstem)

Xavier T.
źródło
1
Nadal uważam, że jest to błąd, ci"ponieważ kursor nie zaczyna się od cytatu, więc przypadek podany w dokumentacji nie ma zastosowania.