![Почему существует разница между редактированием внутри " и ( в Vim?](https://rvso.com/image/1288688/%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83%20%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82%20%D1%80%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC%20%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B8%20%22%20%D0%B8%20(%20%D0%B2%20Vim%3F.png)
При выполнении команды ci"
Vim отредактирует текст внутри следующей строки в кавычках на строке, даже если курсор находится за пределами кавычек. Однако при выполнении ci(
это работает только в том случае, если курсор находится внутри скобок.
Почему? Можно ci(
сделать так, чтобы переход к первому вхождению (
as ci"
does?
Образец текста(используя синтаксис Erlang), где я экспериментирую:
?assertEqual({200, "OK"}, status(FirstResponse)),
% ^
% Here I'm expecting ci( to jump in to the parenthesis ( ci" works)
решение1
После беглого просмотра документации ( help v_aquote
, help v_iquote
) я склонен утверждать, что это ошибка в ci"
, а не недостаток в ci(
. Наблюдаемое ci(
поведение согласуется с ci{
и ci[
.
Тем не менее, вы можете получить желаемое поведение ci(
с помощью этого сопоставления:
nnoremap ci( f(ci(
--- РЕДАКТИРОВАТЬ ---
--- (Этот вопрос был перенесен в раздел суперпользователя, членом которого я не являюсь)
Следующая функция/отображение ведет себя по-разному в зависимости от того, (
обнаружено ли предыдущее. Это решает (a) (b)
проблему с моим исходным отображением (как указано в комментариях). Хотя оно все еще может быть не идеальным...
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>
решение2
Причина в том, что скобки, угловые скобки и фигурные скобки идут парами. Поэтому они могут вкладываться друг в друга.
Одинарные и двойные кавычки, как правило, не могут быть вложенными (за исключением скриптов bash с "$("something")"
синтаксисом, поэтому разрешается находить текстовый объект, даже если курсор не находится внутри него, поскольку не может быть никаких внешних объектов).
решение3
Я думаю, "
это единственные текстовые объекты, которые работают таким образом, т.е. выбирают следующий совпадающий шаблон в строке.
Помощь может объяснить почему:
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.
Видимо Vim пытается найти цитируемый текстпоиск с начала строки. Поэтому не имеет значения, где вы находитесь на строке. (Однако, похоже, это не работает, когда ваш курсор находится после цитируемого текста)