Как я могу быстро указать/исключить слова и изменить цитирование (например, от '
до "
) в Vim? Я знаю о плагине surround.vim, но я бы хотел использовать только Vim.
Какие команды Vim можно использовать для цитирования/недоказучения слов?
Ответ 1
surround.vim будет вашим самым легким ответом. Если вы действительно настроены против использования этого, вот несколько примеров того, что вы можете сделать. Не обязательно самый эффективный, но то, что было написано surround.vim.
- Введите слово, используя одинарные кавычки
ciw'Ctrl+r"'
-
ciw
- Удалить слово, в котором находится курсор, и закончить в режиме вставки. -
'
- добавьте первую цитату. -
Ctrl+r"
- Вставьте содержимое регистра"
, также как последний yank/delete. -
'
- добавьте заключительную цитату.
-
- Неподтвердить слово, заключенное в одинарные кавычки
di'hPl2x
-
di'
- Удалить слово, заключенное одинарными кавычками. -
hP
- Переместите курсор влево на одно место (поверх вводной цитаты) и поместите только что удаленный текст перед цитатой. -
l
- Переместите курсор вправо на одно место (поверх вводной цитаты). -
2x
- Удалить две кавычки.
-
- Изменить одиночные кавычки на двойные кавычки
va':s/\%V'\%V/"/g
-
va'
- Визуально выберите цитированное слово и кавычки. -
:s/
- Запустите замену. -
\%V'\%V
- Используйте только одиночные кавычки, которые находятся в области, выбранной визуально. -
/"/g
- Замените их двойными кавычками.
-
Ответ 2
Введите слово, используя одинарные кавычки
ciw'Ctrl+r"'
Мне было легче сделать это таким образом
ciw '' Esc P
Ответ 3
Вот какое отображение, которое могло бы помочь:
:nnoremap <Leader>q" ciw""<Esc>P
:nnoremap <Leader>q' ciw''<Esc>P
:nnoremap <Leader>qd daW"=substitute(@@,"'\\\|\"","","g")<CR>P
Если вы не изменили переменную mapleader, активируйте отображение с помощью \q"
\q'
или \qd
. Они добавляют двойную кавычку вокруг слова под курсором, одинарная кавычка вокруг слова под курсором, удаляют любые кавычки вокруг слова под курсором соответственно.
Ответ 4
В дополнение к другим командам это будет охватывать все слова в строке в двойных кавычках (в соответствии с вашим комментарием)
:s/\(\S\+\)/"\1"/
или если вы хотите уменьшить количество обратных косых черт, вы можете поместить модификатор \v
(очень магия) в начале шаблона
:s/\v(\S+)/"\1"/
Ответ 5
Для обертывания в одинарные кавычки (например) ciw'<C-r>"'<esc>
работает, но repeat не будет работать. Попробуйте:
ciw'<C-r><C-o>"'<esc>
Это помещает содержимое регистра по умолчанию "в буквальном смысле". Теперь вы можете нажать .
на любое слово, чтобы обернуть его в кавычки. Чтобы узнать больше, см. :h[elp] i_ctrl-r
и многое другое о текстовых объектах в :h text-objects
Источник: http://vimcasts.org/episodes/pasting-from-insert-mode/
Ответ 6
Макрос путь
-
нажмите q и q для записи в регистр q (мы используем "q" в качестве ярлыка для запоминания "кавычек").
-
нажмите shift + b, чтобы переместить курсор в начало текущего слова
-
нажмите i введите ' (одинарные кавычки)
-
нажмите esc, затем нажмите e, чтобы перейти к концу слова
-
нажмите a, затем снова нажмите ', чтобы заключить слово в кавычки.
-
наконец нажмите q, чтобы записать его в регистр
q
.
Как это использовать :
- Переместите курсор на нужное слово.
- Нажмите @ q, чтобы заключить слово в кавычки.
- Нажмите @ @, если хотите повторить это в другое слово.
Вы можете изменить step 4
на что угодно: {строка, слово, пока не найдете какой-либо символ и т.д.}. Поместите его в vim variables
и .vimrc
чтобы повторить ваше счастье.
Ответ 7
Я не знаю никакой встроенной команды vim для этого, но с помощью r"f'r"
для изменения от "до" и r'f"r'
для перехода с "на" работает, если вы стоите на первом "или". Команда r'
заменяет любой символ под вашим курсором на ', а f"
перемещает вас вперед к следующему ".
Ответ 8
Добавление котировок
Я начал использовать эту быструю и грязную функцию в своем .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. удалите одинарные кавычки: vaqs
, 2. добавьте новые кавычки: vwQ
.
- http://vim.wikia.com/wiki/Wrap_a_visual_selection_in_an_HTML_tag код здесь был изменен и использован как часть моего ответа
- https://github.com/beloglazov/vim-textobj-quotes vim-text-obj-quotes
Ответ 9
Вот некоторые простые сопоставления, которые можно использовать для цитирования и без комментариев слова:
" '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>
Ответ 10
Для пользователей VSCodeVim вы можете сделать
vwS"
- Вы можете заменить
"
чем угодно, что бы вы хотели обернуть. - Вы можете заменить
w
любым другим оператором выбора
Ответ 11
Я использую nnoremap в своем .vimrc
Для одинарной цитаты слово:
nnoremap sq :silent! normal mpea'<Esc>bi'<Esc>`pl
Чтобы удалить кавычки (работает также с двойными кавычками):
nnoremap qs :silent! normal mpeld bhd `ph<CR>
Правило для запоминания: 'sq' = одинарная кавычка.
Ответ 12
VIM для VScode делает это потрясающе. Он основан на одном vim-Surround, если вы не используете vscode.
Некоторые примеры:
"test" с курсором внутри кавычек типа cs ", заканчивающийся" test "
"test" с курсором внутри кавычек типа ds ", чтобы закончить тестом
"test" с курсором внутри кавычек наберите cs "t и введите 123>, чтобы завершить тест <123>
тест с курсором на слове (тип теста ysaw), чтобы закончить с (test)
Ответ 13
как насчет этого?
:%s/\'/"/g
Ответ 14
Я написал скрипт, который делает это:
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 может сделать больше, чем просто это, но этого было достаточно для моих нужд.
Ответ 15
Пример карты визуального режима для добавления одинарных кавычек вокруг выделенного блока текста:
:vnoremap qq <Esc>'>a'<Esc>'<i'<Esc>