Как заменить текст между кавычками в vi

106

Скажем, у меня есть эта строка кода:

$query = "SELECT * FROM table";

Есть ли в vi / vim команда, которая может мгновенно удалить все, что находится между кавычками, и поместить курсор между ними, чтобы я мог начать печатать?

Никола
источник

Ответы:

182

Использование ci", что означает: изменить то, что находится внутри двойных кавычек.

Вы также можете аналогичным образом манипулировать другими текстовыми объектами, например:

  • ci' - изменить внутри одинарных кавычек
  • ciw - изменить внутри слова
  • ci( - заменить внутри скобок
  • dit - удалить внутри тега HTML и т. д.

Подробнее о различных текстовых объектах vim здесь .

Евгений Ярмаш
источник
2
Кажется, работает только vim, но НЕ vi. (Не уверен)
Иван Чау
Для меня это работает только в текущей строке, а не в любом месте документа.
И, наконец,
какая команда тогда будет делать это в обратном порядке? Это если вы хотите заменить текст в кавычках за курсором.
dtburgess
1
@dtburgess: Есть один способ F"ci".
Евгений Ярмаш
ci 'и ci "работает нормально, но ci (не работает для меня. У кого-нибудь есть идеи, почему?"
Врам Варданян
24

Вы можете выбрать между кавычками, а затем удалить ( d), изменить ( c) и т. Д., Используя

vi"

Точно так же вы можете заменить фигурные скобки, скобки, элементы XML и т. Д. Таким образом:

vi(
vi{
vit

или просто изменить / удалить сделайте соответствующие di" и ci"т. д. Замена aна iбудет охватывать окружающие элементы (например, вы помечаете или изменяете скобки и содержимое)

Брайан Агнью
источник
5

Я сделал плагин vim-textobj-quotes: https://github.com/beloglazov/vim-textobj-quotes

Он предоставляет текстовые объекты для ближайших пар цитат любого типа и поддерживает кавычки, занимающие несколько строк. Использование только iqилиaq позволяет вам работать с содержимым одинарных ('), двойных (") или обратных (`) кавычек, которые в данный момент окружают курсор, находятся перед курсором или позади него (в указанном порядке предпочтения) Другими словами, он прыгает вперед или назад, когда это необходимо, чтобы добраться до кавычек.

Это легче понять, посмотрев на примеры (курсор отмечен значком |):

  1. Перед foo '1, |2, 3' bar:; после нажатияdiq :foo '|' bar
  2. Перед: foo| '1, 2, 3' bar :; после нажатияdiq :foo '|' bar
  3. Перед: foo '1, 2, 3' |bar :; после нажатияdiq :foo '|' bar
  4. Перед: foo '1, |2, 3' bar :; после нажатияdaq :foo | bar
  5. Перед: foo| '1, 2, 3' bar :; после нажатияdaq :foo | bar
  6. Перед foo '1, 2, 3' |bar:; после нажатияdaq :foo | bar

Приведенные выше примеры даны для одинарных кавычек, плагин точно так же работает для двойных (") и обратных (`) кавычек.

Вы также можете использовать любые другие операторы: ciq, diq, yiq, viqи т.д.

Пожалуйста, посмотрите на страницу github, указанную выше, для получения более подробной информации.

Антон Белоглазов
источник
3

Уже внутри цитат вы можете сделать

di"

Прочтите как удалить внутри "

Сэм Мирный
источник
6
Курсор не обязательно должен находиться в строке, заключенной в двойные кавычки, поскольку по умолчанию команда изменяет первую такую ​​строку в строке
Евгений Ярмаш
1
Спасибо, это очень хорошо знать! Просто показывает, что мне следует читать немного внимательнее. :)
Sam Peacey
3

В дополнение к ответу Брайана вы также можете p(вставить) и y(выдернуть) новое значение, поэтому, если вы хотите заменить значение внутри кавычек другим значением, вы можете сделать yi"выбор, который вы хотите скопировать, vi"чтобы выбрать область которое вы хотите заменить, а затем просто pправильно заменить значение.

Улиссес Каон
источник
0

Выбранный ответ подходит ТОЛЬКО для ViM, но НЕ для vi. Вопрос неточен еще и потому, что автор не упомянул начальную позицию курсора. Если мы предположим, что курсор находится внутри двойных кавычек, то для vi ответ будет:

T"ct"

Куда:

T "- вернуться сразу после символа"

c - изменить команду

t "- укажите конечную позицию для команды c, где она должна прекратить стирание символов, другими словами диапазон для изменения

user1337
источник