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

StackOverflow https://stackoverflow.com/questions/2147875

  •  23-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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 - Замените их все двойными кавычками.

Другие советы

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

ciw'Ctrl+r"'

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

ciw '' Esc P

Вот некоторые сопоставления, которые могли бы помочь:

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

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

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

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

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

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

Заключить в одинарные кавычки (например) 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/

Способ макросов

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

  2. Пресса сдвиг + b переместить курсор перед текущим словом

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

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

  5. Пресса a затем нажмите ' снова окружить слово кавычками.

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

Как это использовать :

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

Вы можете изменить step 4 с чем угодно, что вам нравится {строка, слово, пока не найден какой-нибудь символ и т.д.}.Поместите это в vim variables и .vimrc чтобы повторить твое счастье.

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

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

vwS"

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

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

Я начал использовать эту быструю и грязную функцию в своем .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-цитаты таким образом, vim обрабатывает кавычки как текстовые объекты.Это означает, что я могу сделать vaq (визуально выберите вокруг кавычек.Это позволяет найти ближайшие котировки и визуально выделить их.(Это необязательно, вы можете просто сделать что-то вроде f"vww).Затем я нажимаю s Для Стриптиз цитаты из подборки.

Изменение Котировок

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


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

" '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>

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

Заключать слово в одинарные кавычки:

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

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

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

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

VIM для vscode делает это потрясающе.Это основано на одном vim-объемный если вы не используете vscode.

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

"test" с курсором внутри кавычек введите cs"', чтобы в итоге получилось "test"

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

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

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

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

 :%s/\'/"/g

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

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 может делать больше, чем просто это, но этого было достаточно для моих нужд.

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

:vnoremap qq <Esc>`>a'<Esc>`<i'<Esc>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top