Які команди Vim можна використовувати для цитування / цитування слів?


204

Як я можу швидко процитувати / процитувати слова та змінити цитування (наприклад, від 'на ") до Vim? Я знаю про плагін surround.vim , але хотів би використовувати лише Vim.


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

Для одного слова або всіх слів у рядку. Наприклад, при перетворенні вставлених слів у літеральні рядки.
Євген Ярмаш

Відповіді:


251

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 - Замініть їх усі подвійними лапками.

1
Вони добре працюють для мене. Просто погляньте, що вставлення в режимі вставки також можливо за допомогою Ctrl + op.
Євген Ярмаш

1
Використовується в поєднанні з режимом запису (q), працює як шарм для швидких робіт.
єпископ

Чому ciwі не просто cw? Я вважаю перший заплутаним, а другий чудово працює.
Big 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
Я вважаю за краще це, оскільки можу використовувати його на терміналах / repls у режимі 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 в баш.
ILMostro_7

@Geoff, це чудово працює для одинарних цитат. але для подвійних лапок воно вказує на передній частині слова "" "" "
RameshVel

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

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

27

На додаток до інших команд, це додасть усі слова в рядку у подвійних лапках (відповідно до Вашого коментаря)

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

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

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

У моєму скопійованому тексті також були коми, тому я просто змінив це:s/\v([a-Z]+)/"\1"/g
цукімі

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. змінити режим вставки введіть це, щоб зробити його стійким:
нехай @ q = ' ctrl+ r ctrl+ rq'
  1. зберегти і кинути

  2. відкрийте свої файли, перейдіть до деяких слів

  3. тепер натисніть @q

якщо ви зробите це правильно, у ваших словах повинні з’явитися магічні речі.

Ви можете зробити ці дії для інших макросів, які вам сподобалися.


3
Слід сказати, що мені подобається це рішення. Немає необхідного оточуючого. Простого виклику та створення макросів. Також легко застосований для всього іншого, що вам знадобиться (для мене, наприклад, цитуйте поточне слово до кінця рядка, ідеально підходить для ansible). Щоб показати макрокоманду: "qp. Щоб зберегти його, перейдіть до .vimrc і зробіть: нехай @q = 'вміст макросу" (лише для повноти)
th3penguinwhisperer

Мені це дуже подобається. Можна також вкладати ці макроси. Таким чином, ви можете записати в регістр j, @q wа потім можете обернути наступні nслова лапками, використовуючи n@j.
приховано-ім’я користувача

1
Я додав кілька кроків, щоб зробити макрос стійким.
Мозок90

1
Педантичне, але слово і слово ВІМ різні. Shift + b = B, тому крок 2 в ідеалі слід змінити на "... перед поточним словом". Якщо ж ви мали на увазі початок слова, вам не потрібно використовувати Shift.
Амбарееш

Дякую за те, що. Я використовую shift + b цілеспрямовано, щоб мати справу з WORD. Макрос повинен працювати слово або 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 вставляє вміст регістра в курсор і залишається у режимі вставки.
Erwin Rooijakkers

Це повторюється, як ви згадували, але, зберігаючи в макросі, повторення макросу з .перепише вміст останнього фактичного виклику.
Сбу

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 обидва

5

Додавання цитат

Я почав використовувати цю швидку та брудну функцію у своєму .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. Дістаньте одиничні лапки: vaqs2. додати нові цитати: vwQ.



4

Якщо ви використовуєте плагін 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 для кращих прикладів


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
Для всіх було б чудово, якби ви могли розробити свою відповідь: як додати відображення, як викликати їх тощо. Дякую.
Carles Alcolea

1
Я б сказав, що цитувати, подвійну цитату і цитувати, що вам слід зробитиqw qd wq
nilon

чомусь подвійна цитата повертає додаткову цитату в кінці, наприклад, "слово" ".
janicebaratheon

@ShuaiWang, можливо, у вас встановлено автозапчастини чи якесь подібне розширення? Видалення цієї помилки для мене.
Нефілім

2

VIM для vscode робить це приголомшливо. Він заснований на одному vim-surround, якщо ви не використовуєте vscode.

Деякі приклади:

"тест" з курсором всередині лапок типу cs "', щоб закінчити" test "

"тест" з курсором всередині лапок типу ", щоб закінчити тест

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

тест за допомогою курсору на тестовому слові типу трион), щоб закінчити (тест)


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>

Для використання просто виділіть щось, натисніть клавішу управління l та введіть символ. Якщо це один із символів, про який знає функція, він надасть правильний символ, що закінчується. Якщо це не так, він буде використовувати один і той же символ для вставки з обох сторін.

Surround.vim може зробити більше, ніж просто це, але цього було достатньо для моїх потреб.


-1

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

:vnoremap qq <Esc>`>a'<Esc>`<i'<Esc>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.