Какие команды Vim можно использовать для кавычек / кавычек?


204

Как я могу быстро цитировать / отменять кавычки и изменять цитаты (например, с 'на ") в Vim? Я знаю о плагине Surround.vim , но я хотел бы использовать только Vim.


Решение действительно зависит от контекста. Вы хотите сделать это только в одной строке, или во всем файле, или только для одной строки в кавычках?
Лукас Оман

Для одного слова или всех слов в строке. Например, при преобразовании вставленных слов в строковые литералы.
Евгений Ярмаш

Ответы:


253

Surround.vim будет вашим самым простым ответом. Если вы действительно настроены против его использования, вот несколько примеров того, что вы можете сделать. Не обязательно самый эффективный, но именно поэтому был написан surround.vim.

  • Процитируй слово, используя одинарные кавычки
    ciw'Ctrl+r"'
    • ciw - Удалите слово, на котором находится курсор, и попадайте в режим вставки.
    • ' Добавить первую цитату.
    • Ctrl+r"- Вставить содержимое "реестра, иначе последний янк / удалить.
    • ' - добавить заключительную цитату.

  • Укажите слово, заключенное в одинарные кавычки
    di'hPl2x
    • di' - Удалить слово, заключенное в одинарные кавычки.
    • hP - Переместите курсор влево на одно место (поверх вводной цитаты) и поместите только что удаленный текст перед цитатой.
    • l - Переместите курсор вправо на одно место (поверх открывающей кавычки).
    • 2x - Удалить две цитаты.

  • Заменить одинарные кавычки на двойные
    va':s/\%V'\%V/"/g
    • va' - Визуально выберите цитируемое слово и кавычки.
    • :s/ - Начать замену.
    • \%V'\%V - Подбирайте только одинарные кавычки, которые находятся внутри визуально выбранного региона.
    • /"/g - Замените их все в двойных кавычках.

1
Это хорошо работает для меня. Просто гуглил, что вставка в режиме вставки также возможна с помощью Ctrl + op.
Евгений Ярмаш

1
Используется в сочетании с режимом записи (q), работает как брелок для быстрых заданий.
епископ

Почему ciwи не просто cw? Первый путает, второй работает нормально.
Большое McLargeHuge

18
@Koveras ciwработает независимо от того, где находится ваш курсор в слове. cwработает только если курсор находится в начале слова. См :help iw.
jamessan

10
Перехватив верхний ответ, вы получите небольшую хитрость: если у вас есть несколько слов для замены заключающих в одинарные кавычки двойных кавычек, вы можете заметить, что первое решение @jamessan не работает с .командой. Чтобы заставить это работать, используйте ciw' Ctrl+r Ctrl+p". Тогда он .будет вести себя так, как вы хотите, для следующего слова: вместо запоминания содержимого регистра, он будет помнить, что вы хотите, чтобы все, что есть в реестре прямо сейчас (довольно сложно объяснить, но если вы попробуете оба, это станет очевидным :-))
Autra

182

Процитируй слово, используя одинарные кавычки

ciw'Ctrl+r"'

Мне было проще сделать это таким образом

ciw '' Esc P

8
К сожалению, это не позволяет. (повторение).
Уил Мур III

2
Я предпочитаю это, поскольку я могу использовать его на терминалах / реплах с режимом vim, поскольку Ctrl + r обычно уже используется для поиска в обратном журнале.
Крок

3
@wilmoore Запишите выше, как макрос, а затем повторите.
Кристофер

30

Вот несколько карт, которые могут помочь:

:nnoremap <Leader>q" ciw""<Esc>P
:nnoremap <Leader>q' ciw''<Esc>P
:nnoremap <Leader>qd daW"=substitute(@@,"'\\\|\"","","g")<CR>P

Если вы не изменили переменную mapleader, активируйте отображение с помощью \q" \q'или \qd. Они добавляют двойные кавычки вокруг слова под курсором, одинарные кавычки вокруг слова под курсором, удаляют любые кавычки вокруг слова под курсором соответственно.


Отличная идея! Я закончил тем, что добавил map <Leader>' gewi'<Esc>A'<Esc>в свой .vimrcфайл, чтобы вставить одинарные кавычки из текущей позиции в конец строки; который помог мне при конвертации некоторых скриптов MSDOS в bash.
ILMostro_7

@ Goff, он отлично работает для одинарных кавычек. но для двойных кавычек он вставляет "" "" "` перед словом
RameshVel

@RameshVel Возможно, у вас есть некоторые собственные макросы, которые влияют на правую часть отображения. Я обновил команду отображения для nnoremap, чтобы другие отображения не были расширены. Я также улучшил сопоставления. Предыдущие были проблемы, когда курсор находится на первом слове в строке.
Джефф Риди

Это также может быть легко адаптировано для визуального режима, чтобы окружать выбор кавычками, например :vnoremap <leader>q c""<esc>P.
Доминик

27

В дополнение к другим командам все слова в строке будут заключены в двойные кавычки (согласно вашему комментарию)

:s/\(\S\+\)/"\1"/

или если вы хотите уменьшить количество обратных слешей, вы можете поместить \v(очень магический) модификатор в начале паттерна

:s/\v(\S+)/"\1"/

В моем скопированном тексте также были запятые, поэтому я просто перешел на это:s/\v([a-Z]+)/"\1"/g
tsukimi

22

Макро способы!

  1. нажмите qи qдля записи в регистр q (мы используем «q» в качестве ярлыка для запоминания «кавычек»).

  2. нажмите shift+ bпереместите курсор в начало текущего слова

  3. iтип печати '(одинарные кавычки)

  4. нажмите, escзатем нажмите, eчтобы перейти к концу слова

  5. нажмите, aзатем нажмите еще 'раз, чтобы заключить слово в кавычки.

  6. нажмите, escчтобы войти в нормальный режим.

  7. наконец нажмите, qчтобы записать его в qреестр.

Как пользоваться

  1. Переместите курсор на нужное слово.
  2. Нажмите, @qчтобы заключить слово в кавычки.
  3. Нажмите, @@если хотите, повторите это в другом слове.

Вы можете изменить step 4что угодно: {строку, слово, пока не найдете какой-либо символ и т. Д.}.

Сделать записанный макрос постоянным

  1. открыть .vimrc
  2. перейти в конец файла
  3. перейти в режим вставки. введите это, чтобы сделать это постоянным:
let @ q = ' ctrl+ r ctrl+ rq'
  1. сохранить и выйти

  2. откройте ваши файлы, перейдите к некоторым словам

  3. теперь нажмите @q

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

Вы можете сделать это для других макросов, которые вы любили.


3
Должен сказать, мне нравится это решение. Не требуется Surround.vim и простой вызов и создание макросов. Также легко может использоваться для всего, что вам понадобится (для меня, например, процитировать текущее слово до конца строки, идеально подходит для ansible). Чтобы показать макрос, выполните: "qp. Чтобы сохранить его, перейдите в .vimrc и сделайте: let @q = 'содержимое макроса' (только для полноты)
th3penguinwhisperer

Мне это очень нравится. Вы можете также вложить эти макросы. Таким образом, вы можете записать в регистр j, @q wа затем вы можете заключить следующие nслова в кавычки, используя с n@j.
скрытое имя пользователя

1
Я добавил несколько шагов, чтобы сделать макрос постоянным.
Brain90

1
Педантичный, но слово и слово различны в Vim. Shift + b = B, поэтому в идеале шаг 2 должен быть изменен на «... перед текущим словом». Однако, если вы имели в виду начало слова, вам не нужно использовать Shift.
Амбариш

Спасибо за это. Я использую shift + b специально для работы с WORD. Макрос должен выполняться в слове или слове [0]. На самом деле шаг 3 также должен измениться на shift + e. [0] stackoverflow.com/a/14390568/341959
Brain90

18

Например, перенос в одинарные кавычки ciw'<C-r>"'<esc>работает, но повтор не сработает. Пытаться:

ciw'<C-r><C-o>"'<esc>

Это помещает содержимое регистра по умолчанию "буквально". Теперь вы можете нажать .на любое слово, чтобы заключить его в кавычки. Чтобы узнать больше см. :h[elp] i_ctrl-rИ больше о текстовых объектах на:h text-objects

Источник: http://vimcasts.org/episodes/pasting-from-insert-mode/


2
Отличный совет! Если кто-то хочет составить карту из этого, правильная запись ciw'<C-R><C-O>"'<Esc>.
GLTS

Что именно <Cr> "делает?
CodeCrack

@CodeCrack Это CTRL-R. CTRL-R вставляет содержимое регистра по курсору и остается в режиме вставки.
Эрвин Ройяккерс

Это повторяется, как вы упомянули, но при сохранении в макросе повторение макроса с .перезапишет содержимое последнего фактического вызова.
СБУ

7

Для пользователей VSCodeVim вы можете сделать

vwS"

  • Вы можете заменить "на то, что хотите обернуть.
  • Вы можете заменить wлюбой другой оператор выбора

2
Это также хорошо работало для меня на MacVIM, но мне пришлось использовать, viwS'который заключает слово в одинарные кавычки. Безусловно самый простой.
Мэтт Граннэри

это работает, только если вы находитесь в начале слова. Если вы хотите сделать это из любого места в слове, вы можете сделать:viwS"
geoyws

6

Я не знаю какой-либо встроенной команды vim для этого, но использование r"f'r"перехода из «в» и r'f"r'из «в» работает, если вы стоите на первом «или». Команда r'заменяет любой символ, находящийся под вашим курсором, на «, и f"двигает вас вперед к следующему ".


1
Самое интуитивное «ручное» решение для меня. Вместо второй команды замены ( 'rи "r) вы можете просто ввести « .И», если хотите изменить больше кавычек, ;и ,перенести вас к следующей или предыдущей, поскольку они повторяют последний f/F/t/Tпоиск в том же направлении или в противоположном, соответственно.
Endre Both

6

Добавление цитат

Я начал использовать эту быструю и грязную функцию в моем .vimrc:

vnoremap q <esc>:call QuickWrap("'")<cr>
vnoremap Q <esc>:call QuickWrap('"')<cr>

function! QuickWrap(wrapper)
  let l:w = a:wrapper
  let l:inside_or_around = (&selection == 'exclusive') ? ('i') : ('a')
  normal `>
  execute "normal " . inside_or_around . escape(w, '\')
  normal `<
  execute "normal i" . escape(w, '\')
  normal `<
endfunction

Итак, теперь я визуально выбираю все, что хочу (обычно с помощью viw- визуально выбираю внутри слова ) в кавычках и нажимаю Qдля двойных кавычек или нажимаю qдля одинарных кавычек.

Удаление цитат

vnoremap s <esc>:call StripWrap()<cr>

function! StripWrap()
  normal `>x`<x
endfunction

Я использую vim-textobj-quotes, чтобы vim рассматривал цитаты как текстовые объекты. Это означает, что я могу сделать vaq(визуально выбирать вокруг кавычек . Это находит ближайшие кавычки и визуально выбирает их. (Это необязательно, вы можете просто сделать что-то вроде f"vww). Затем я нажимаю, sчтобы удалить цитаты из выбора.

Изменение цитаты

ПОЦЕЛУЙ. Я удаляю цитаты, затем добавляю цитаты . Например, чтобы заменить одиночные кавычки двойные кавычки, я бы выполнить действия: 1. Достаньте одиночные кавычки: vaqs2. добавить новые цитаты: vwQ.



4

Если вы используете плагин vim https://github.com/tpope/vim-surround (или используете плагин VSCode Vim, который поставляется с предустановленным vim -round), это довольно удобно!

Добавить

ysiw' // surround in word `'`

падение

ds' // drop surround `'`

изменение

cs'" // change surround from `'` to `"`

Это даже работает для тегов HTML!

cst<em> // change surround from current tag to `<em>`

проверьте readme на github для лучших примеров


2

Вот несколько простых сопоставлений, которые можно использовать для цитирования и кавычки слова:

" 'quote' a word
nnoremap qw :silent! normal mpea'<Esc>bi'<Esc>`pl
" double "quote" a word
nnoremap qd :silent! normal mpea"<Esc>bi"<Esc>`pl
" remove quotes from a word
nnoremap wq :silent! normal mpeld bhd `ph<CR>

1
Было бы хорошо для всех, если бы вы могли разработать свой ответ: как добавить сопоставления, как их назвать и т. Д. Спасибо.
Карлес

1
Я бы сказал, что для цитирования, двойных кавычек и кавычек, которые вы должны сделатьqw qd wq
Нилон

по какой-то причине двойная кавычка возвращает дополнительную кавычку в конце, например, «слово».
janicebaratheon

@ShuaiWang, возможно, у вас есть автопары или какое-то подобное расширение? Удаление исправило эту ошибку для меня.
Нефилим

2

VIM для VScode делает это потрясающе. Он основан на одном vim-Surround, если вы не используете vscode.

Некоторые примеры:

«test» с курсором внутри кавычек типа cs », заканчивающийся« test »

"test" с курсором внутри кавычек типа ds ", чтобы закончить тестом

"test" с курсором внутри кавычек наберите cs "t и введите 123>, чтобы завершить тест <123>

тест с курсором на слово (тип теста ysaw), чтобы закончить с (test)


1

Я использую nnoremap в моем .vimrc

Чтобы выделить слово одним словом

nnoremap sq :silent! normal mpea'<Esc>bi'<Esc>`pl

Чтобы удалить кавычки (также работает с двойными кавычками):

nnoremap qs :silent! normal mpeld bhd `ph<CR>

Правило помнить: 'sq' = одинарная кавычка.


0

как насчет этого?

 :%s/\'/"/g

2
Эта команда работает со всем файлом. Мне просто нужно поменять отдельные слова.
Евгений Ярмаш

4
Без этого %он будет работать только с текущей строкой, если вы не выбрали весь файл
Эмили

0

Я написал скрипт, который делает это:

function! WrapSelect (front)
    "puts characters around the selected text.
    let l:front = a:front
    if (a:front == '[')
        let l:back = ']'
    elseif (a:front == '(')
        let l:back = ')'
    elseif (a:front == '{')
        let l:back = '}'
    elseif (a:front == '<')
        let l:back = '>'
    elseif (a:front =~ " ")
        let l:split = split(a:front)
        let l:back = l:split[1]
        let l:front = l:split[0]
    else
        let l:back = a:front
    endif
    "execute: concat all these strings. '.' means "concat without spaces"
    "norm means "run in normal mode and also be able to use \<C-x> characters"
    "gv means "get the previous visual selection back up"
    "c means "cut visual selection and go to insert mode"
    "\<C-R> means "insert the contents of a register. in this case, the
    "default register"
    execute 'norm! gvc' . l:front. "\<C-R>\""  . l:back
endfunction
vnoremap <C-l> :<C-u>call WrapSelect(input('Wrapping? Give both (space separated) or just the first one: '))<cr>

Чтобы использовать, просто выделите что-то, нажмите control l, а затем введите символ. Если это один из символов, о которых знает функция, он предоставит правильный завершающий символ. Если это не так, он будет использовать один и тот же символ для вставки с обеих сторон.

Surround.vim может сделать больше, чем просто это, но этого было достаточно для моих нужд.


-1

Пример карты визуального режима для добавления одинарных кавычек вокруг выделенного блока текста:

:vnoremap qq <Esc>`>a'<Esc>`<i'<Esc>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.