Заключение в скобки с Vim - PullRequest
       44

Заключение в скобки с Vim

57 голосов
/ 10 ноября 2011

Есть ли способ заключить какой-нибудь текст в скобки (или фигурные скобки) в vim?

Другими словами, как бы вы это сделали?

Начальная строка:

It is sunny outside.

Конечная строка:

It is (sunny) outside.

На смешной нотеЯ просто нажал :w, чтобы задать этот вопрос.

Счастливого пути, SOCommunity!

Ответы [ 10 ]

62 голосов
/ 11 июля 2014

Для одного слова я использовал:

bcw()<Esc>P

То есть перейдите к началу слова, обрежьте слово и перейдите в режим вставки, введите скобки и выйдите из режима вставкии вставьте слово обратно.

Имейте в виду, что это перезапишет ваш регистр янки.

Вы, конечно, можете заменить bcw на любые нужные вам типы движения и выбора, например

5cc{<Enter>}<Esc>P
34 голосов
/ 10 ноября 2011

Surround.vim должен сделать свое дело. Если вы хотите повторить это с '.', См. здесь .

30 голосов
/ 28 августа 2014

Вот примеры использования round.vim . В обычном режиме vim наведите курсор на нужное слово (в данном случае солнечное) и введите:

ysiw

Затем введите )

Итак:

исходная строка:

It is sunny outside.

Конечная строка:

It is (sunny) outside.

Дополнительное пространство: Используйте открывающую скобку или скобку, например ysiw(, чтобы окружить скобками и пробелом между скобками и началом + концом слова)

Легче в визуальном режиме Войдите в визуальный режим, нажав v. Теперь, если вы введете S(, слово будет окружено пробелами. Однако если вы используете закрывающий ) вместо S), он не будет окружен пробелами.

Это относится ко всему окружению пары скобок, <> [] {} (), а не только к (). Поведение S< таково, что он ожидает вложение тега, поэтому только S> может окружать как <>.

Дополнительная информация:

Введите ysiw, а затем }, чтобы сделать то же самое для фигурных скобок

Можно добавить еще несколько примеров:

  • введите cs(' - [c] изменить [s] окружения от (до '

  • cs'( для перехода от окружения к ()

  • ds(. до [d] elete ( [s] в целом

Еще больше:

А почему бы не процитировать оставшуюся часть страницы Tpope, чтобы спасти нас от перехода по ссылке?

// начинаем цитату:

Проще всего объяснить с помощью примеров.

Нажмите cs"' внутри

"Привет, мир!" изменить его на

'Hello world!'

-

Теперь нажмите cs'<q>, чтобы изменить его на

<q>Hello world!</q>

-

Чтобы пройти полный круг, нажмите cst", чтобы получить

"Hello world!"

-

Чтобы полностью удалить разделители, нажмите ds".

Hello world!

-

Теперь, установив курсор на «Hello», нажмите ysiw] (iw - текстовый объект).

[Hello] world!

Давайте сделаем эти скобки и добавим немного пробела (используйте} вместо {без пробелов): cs]{

{ Hello } world!

-

Теперь заключите всю строку в скобки с помощью yssb или yss).

({ Hello } world!)

-

Вернуться к исходному тексту: ds{ds)

Hello world!

-

Подчеркните привет: ysiw<em>

<em>Hello</em> world!

-

Наконец, давайте попробуем визуальный режим. Нажмите заглавную V (для аналогии визуальный режим), а затем S<p class="important">.

<p class="important">
  <em>Hello</em> world!
</p>

Этот плагин очень мощный для редактирования HTML и XML, ниша, которая в настоящее время кажется недостаточно заполненной на земле Vim. (В отличие от вставки HTML / XML, для которой доступно множество плагинов). Добавление, изменение и удаление пар тегов одновременно очень просто.

Команда . будет работать с ds, cs и yss, если вы установите repeat.vim .

6 голосов
/ 10 ноября 2011

Вы можете определить простое отображение для такого рода вещей. Это должно сделать это. В обычном режиме введите z, чтобы заключить слово в скобки.

:nnoremap <leader>z viw<esc>a)<esc>hbi(<esc>lel
6 голосов
/ 10 ноября 2011
3 голосов
/ 10 ноября 2011

Почему бы не использовать :s// ( поиск и замена )?

Например:

:s/sunny/(&)/

Вы, вероятно, имеете в виду что-то еще, но я не могу сказать по вашему вопросу, что это такое.

(& - сокращение для сопоставленного текста)

1 голос
/ 11 сентября 2018

Я знаю, что это старый вопрос, но такое сложное решение, как это, здесь еще не упоминалось, и я уверен, что оно может кому-то помочь. В моем файле .vimrc есть такая строка:

xnoremap <silent> ( <ESC>:let p = &paste<CR>:set paste<CR>:let a = line2byte(line('.')) + col('.')<CR>gvc()<ESC>:if getregtype() ==# 'V'<CR>call setreg('"', substitute(@", '\n$', '', ''), 'c')<CR>endif<CR>P:exe "goto ".a<CR>:exe "let &paste=".p<CR>

Достаточно выделить текст в визуальном режиме и нажать (. Это отображение работает также для визуального и блочного визуального режима.

Как это работает?

<ESC> выйдет из визуального режима

:let p = &paste<CR>:set paste<CR>...:exe "let &paste=".p<CR> обеспечит выполнение макроса в режиме вставки (поскольку автоматические отступы и аналогичные улучшения могут включать некоторые лишние пробелы, которые нам не нужны), а состояние вставки после макроса останется таким же, как до запуска макроса

:let a = line2byte(line('.')) + col('.')<CR> найдет текущее байтовое смещение (на основе 1)

gv повторно выберет ранее выбранный текст

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

()<ESC> вставит желаемые скобки и выйдет из режима вставки

:if getregtype()==#'V'<CR>call setreg('"',substitute(@",'\n$','',''),'c')<CR>endif<CR> удалит завершающий \n из безымянного (") регистра и изменит его тип на символьный, но только если он был аналогичным образом ранее (чтобы можно было вставить из реестра в скобках)

P вставит ранее замененный текст в скобки

:exe "goto ".a<CR> вернет курсор на предыдущую позицию (goto использует смещение на основе 0, поэтому нам не нужно увеличивать ранее записанную позицию на единицу из-за вставленной левой круглой скобки)

1 голос
/ 13 августа 2018

Вы можете использовать следующие команды:

cw(<C-r><C-o>")<ESC>

Преимущество состоит в том, что вы можете использовать команду точки для повторения этого действия для разных слов.Это работает и для пользовательских корпусов, например:

Перед изменением:

word

, затем используйте команду:

cw\enquote{<C-r><C-o>"}<ESC>

Окончательный результат:

\enquote{word}
1 голос
/ 19 июля 2014

Я предпочитаю не использовать никакие плагины и хочу, чтобы все было ограничено моими точечными файлами для простоты переносимости. Самый простой способ, который я могу придумать, - это просто записать его и воспроизвести. Если вы планируете использовать его чаще между сеансами, вы можете также сопоставить ключ в вашем .vimrc, но мне это не нужно (и я действительно плохо разбираюсь, какое нажатие клавиши сопоставлять).

Предполагая, что у вас есть начальный уровень понимания vim, допустим, у меня есть строка (для простоты), которую я хочу заключить в квадратные скобки. например,

hello world

Перейти в нормальный режим. q1 чтобы начать запись. Теперь сделайте следующее

ESC ^i[ ESC $a] ESC

Это оставит текущую строку в скобках. Теперь вы можете выбрать любую строку и нажать @1, чтобы повторить ее.

Если, например, вы хотите, чтобы текущее слово было перефразировано, просто запишите и воспроизведите следующий рецепт:

ESC bi[ ESC ea] ESC

Вы, конечно, можете попытаться оптимизировать работу с нажатиями клавиш, но пока это мне подходит.

0 голосов
/ 23 декабря 2013

Для чего-то подобного, вероятно, лучше поиграть с диапазонами и группами, чем использовать внешние плагины:

:%s~\v(\w{5}) ~(\1) ~g

вышеупомянутый поиск 5-буквенного слова с пробелом группирует совпадение с помощью ()и заменяет его окружающими скобками вокруг сгруппированного совпадения.

...