Як я можу швидко процитувати / процитувати слова та змінити цитування (наприклад, від '
на "
) до Vim? Я знаю про плагін surround.vim , але хотів би використовувати лише Vim.
Як я можу швидко процитувати / процитувати слова та змінити цитування (наприклад, від '
на "
) до Vim? Я знаю про плагін surround.vim , але хотів би використовувати лише Vim.
Відповіді:
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
- Замініть їх усі подвійними лапками.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 в баш.
: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
все, що завгодно {рядок, слово, поки не знайдете деякий символ тощо.
Зробіть записаний макрос стійким
нехай @ 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
щоб зняти цитати з вибору.
Зміна котирувань
KISS. Я видаляю лапки, потім додаю лапки . Наприклад, щоб замінити одиничні лапки подвійні лапки, я б виконати дії: 1. Дістаньте одиничні лапки: vaqs
2. додати нові цитати: vwQ
.
Якщо ви використовуєте плагін vim https://github.com/tpope/vim-surround (або використовуєте плагін VSCode Vim, який постачається з попередньо встановленим vim-surround), його досить зручно!
додати
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.
Деякі приклади:
"тест" з курсором всередині лапок типу cs "', щоб закінчити" test "
"тест" з курсором всередині лапок типу ", щоб закінчити тест
"test" з курсором всередині лапок введіть cs "t і введіть 123>, щоб закінчити тест <123>
тест за допомогою курсору на тестовому слові типу трион), щоб закінчити (тест)
Я використовую 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>
Для використання просто виділіть щось, натисніть клавішу управління l та введіть символ. Якщо це один із символів, про який знає функція, він надасть правильний символ, що закінчується. Якщо це не так, він буде використовувати один і той же символ для вставки з обох сторін.
Surround.vim може зробити більше, ніж просто це, але цього було достатньо для моїх потреб.