Приложение в круглых скобках с Vim

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

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

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

It is sunny outside.

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

It is (sunny) outside.

На забавную заметку я просто нажал :w, чтобы отправить этот вопрос.

Счастливый vim-ing, SOCommunity!

+56
09 нояб. '11 в 20:06
источник поделиться
10 ответов

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

+33
09 нояб. '11 в 20:09
источник

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

bcw()<Esc>P

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

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

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

5cc{<Enter>}<Esc>P
+62
11 июл. '14 в 14:46
источник

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

ysiw

Тогда наберите )

Так:

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

It is sunny outside.

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

It is (sunny) outside.

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

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

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

Больше:

Введите ysiw а затем } чтобы сделать то же самое для curlies

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

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

  • cs'( чтобы перейти от' окружения к()

  • ds(. to [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 всю строку в скобки с помощью 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.

+29
28 авг. '14 в 17:49
источник
+6
09 нояб. '11 в 20:10
источник

Вы можете определить простое сопоставление для этой вещи sort'a. Это должно сделать это. В нормальном режиме типа z окружает слово в скобках.

:nnoremap <leader>z viw<esc>a)<esc>hbi(<esc>lel
+6
09 нояб. '11 в 21:56
источник

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

Например:

:s/sunny/(&)/

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

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

+3
09 нояб. '11 в 20:10
источник

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

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

hello world

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

ESC ^i[ ESC $a] ESC

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

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

ESC bi[ ESC ea] ESC

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

+1
19 июл. '14 в 0:20
источник

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

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

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

До изменения:

word

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

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

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

\enquote{word}
+1
13 авг. '18 в 4:05
источник

Я знаю, что это старый вопрос, но такое сложное решение, как это, здесь еще не упоминалось, и я уверен, что оно может кому-то помочь. В моем файле .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
11 сент. '18 в 18:46
источник

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

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

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

0
23 дек. '13 в 17:16
источник

Посмотрите другие вопросы по меткам или Задайте вопрос