Как я могу быстро цитировать / отменять кавычки и изменять цитаты (например, с '
на "
) в Vim? Я знаю о плагине Surround.vim , но я хотел бы использовать только Vim.
Как я могу быстро цитировать / отменять кавычки и изменять цитаты (например, с '
на "
) в Vim? Я знаю о плагине Surround.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
и не просто cw
? Первый путает, второй работает нормально.
ciw
работает независимо от того, где находится ваш курсор в слове. cw
работает только если курсор находится в начале слова. См :help iw
.
.
командой. Чтобы заставить это работать, используйте ciw' Ctrl+r Ctrl+p"
. Тогда он .
будет вести себя так, как вы хотите, для следующего слова: вместо запоминания содержимого регистра, он будет помнить, что вы хотите, чтобы все, что есть в реестре прямо сейчас (довольно сложно объяснить, но если вы попробуете оба, это станет очевидным :-))
Процитируй слово, используя одинарные кавычки
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
. Они добавляют двойные кавычки вокруг слова под курсором, одинарные кавычки вокруг слова под курсором, удаляют любые кавычки вокруг слова под курсором соответственно.
map <Leader>' gewi'<Esc>A'<Esc>
в свой .vimrc
файл, чтобы вставить одинарные кавычки из текущей позиции в конец строки; который помог мне при конвертации некоторых скриптов MSDOS в bash.
:vnoremap <leader>q c""<esc>P
.
В дополнение к другим командам все слова в строке будут заключены в двойные кавычки (согласно вашему комментарию)
:s/\(\S\+\)/"\1"/
или если вы хотите уменьшить количество обратных слешей, вы можете поместить \v
(очень магический) модификатор в начале паттерна
:s/\v(\S+)/"\1"/
:s/\v([a-Z]+)/"\1"/g
Макро способы!
нажмите qи qдля записи в регистр q (мы используем «q» в качестве ярлыка для запоминания «кавычек»).
нажмите shift+ bпереместите курсор в начало текущего слова
iтип печати '(одинарные кавычки)
нажмите, escзатем нажмите, eчтобы перейти к концу слова
нажмите, aзатем нажмите еще 'раз, чтобы заключить слово в кавычки.
нажмите, escчтобы войти в нормальный режим.
наконец нажмите, qчтобы записать его в q
реестр.
Как пользоваться
Вы можете изменить step 4
что угодно: {строку, слово, пока не найдете какой-либо символ и т. Д.}.
Сделать записанный макрос постоянным
let @ q = ' ctrl+ r ctrl+ rq'
сохранить и выйти
откройте ваши файлы, перейдите к некоторым словам
@q
если вы делаете это правильно, магические вещи должны появляться в ваших словах.
Вы можете сделать это для других макросов, которые вы любили.
@q w
а затем вы можете заключить следующие n
слова в кавычки, используя с n@j
.
Например, перенос в одинарные кавычки 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/
ciw'<C-R><C-O>"'<Esc>
.
.
перезапишет содержимое последнего фактического вызова.
Для пользователей VSCodeVim вы можете сделать
vwS"
"
на то, что хотите обернуть.w
любой другой оператор выбораviwS'
который заключает слово в одинарные кавычки. Безусловно самый простой.
viwS"
Я не знаю какой-либо встроенной команды vim для этого, но использование r"f'r"
перехода из «в» и r'f"r'
из «в» работает, если вы стоите на первом «или». Команда r'
заменяет любой символ, находящийся под вашим курсором, на «, и f"
двигает вас вперед к следующему ".
'r
и "r
) вы можете просто ввести « .
И», если хотите изменить больше кавычек, ;
и ,
перенести вас к следующей или предыдущей, поскольку они повторяют последний f/F/t/T
поиск в том же направлении или в противоположном, соответственно.
Добавление цитат
Я начал использовать эту быструю и грязную функцию в моем .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
.
Если вы используете плагин 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 для лучших примеров
Вот несколько простых сопоставлений, которые можно использовать для цитирования и кавычки слова:
" '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>
qw
qd
wq
VIM для VScode делает это потрясающе. Он основан на одном vim-Surround, если вы не используете vscode.
Некоторые примеры:
«test» с курсором внутри кавычек типа cs », заканчивающийся« test »
"test" с курсором внутри кавычек типа ds ", чтобы закончить тестом
"test" с курсором внутри кавычек наберите cs "t и введите 123>, чтобы завершить тест <123>
тест с курсором на слово (тип теста ysaw), чтобы закончить с (test)
Я использую nnoremap в моем .vimrc
Чтобы выделить слово одним словом
nnoremap sq :silent! normal mpea'<Esc>bi'<Esc>`pl
Чтобы удалить кавычки (также работает с двойными кавычками):
nnoremap qs :silent! normal mpeld bhd `ph<CR>
Правило помнить: 'sq' = одинарная кавычка.
как насчет этого?
:%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 может сделать больше, чем просто это, но этого было достаточно для моих нужд.