Jakich poleceń Vima można używać do cytowania / cofania cudzysłowów?

204

Jak mogę szybko cytować / cofać cytowanie słów i zmieniać cytowanie (np. Z 'na ") w Vimie? Wiem o wtyczce surround.vim , ale chciałbym użyć tylko Vima.

Eugene Yarmash
źródło
Rozwiązanie naprawdę zależy od kontekstu. Czy chcesz to zrobić w jednym wierszu, w całym pliku, czy tylko dla pojedynczego cudzysłowu?
Lucas Oman
Dla pojedynczego słowa lub wszystkich słów w linii. Np. Podczas konwertowania wklejonych słów na literały łańcuchowe.
Eugene Yarmash

Odpowiedzi:

251

surround.vim będzie twoją najłatwiejszą odpowiedzią. Jeśli naprawdę nie chcesz go używać, oto kilka przykładów tego, co możesz zrobić. Niekoniecznie najbardziej wydajny, ale właśnie dlatego napisano surround.vim.

  • Cytuj słowo, używając pojedynczych cudzysłowów
    ciw'Ctrl+r"'
    • ciw - Usuń słowo, na którym znajduje się kursor, i zakończ tryb wstawiania.
    • ' - dodaj pierwszy cytat.
    • Ctrl+r"- Wstaw zawartość "rejestru, czyli ostatni szarpnięcie / usuń.
    • ' - dodaj cytat końcowy.

  • Cytuj słowo zawarte w pojedynczych cudzysłowach
    di'hPl2x
    • di' - Usuń słowo ujęte w pojedyncze cudzysłowy.
    • hP - Przesuń kursor w lewo o jedno miejsce (nad cytatem otwierającym) i umieść właśnie usunięty tekst przed cytatem.
    • l - Przesuń kursor w prawo o jedno miejsce (nad cytatem otwierającym).
    • 2x - Usuń dwa cytaty.

  • Zmień pojedyncze cudzysłowy na podwójne
    va':s/\%V'\%V/"/g
    • va' - Wybierz wizualnie cytowane słowo i cytaty.
    • :s/ - Rozpocznij wymianę.
    • \%V'\%V - Dopasowuj tylko pojedyncze cudzysłowy znajdujące się w obrębie wizualnie wybranego regionu.
    • /"/g - Zastąp je wszystkie podwójnymi cudzysłowami.
jamessan
źródło
1
Te działają dla mnie dobrze. Po prostu przejrzałem, że wklejanie w trybie wstawiania jest również możliwe przy pomocy Ctrl + op.
Eugene Yarmash
1
Używany w połączeniu z trybem nagrywania (q), działa jak urok dla szybkich zadań.
biskup
Dlaczego ciwnie tylko cw? Pierwszy jest mylący, a drugi działa dobrze.
Big McLargeHuge
18
@Koveras ciwdziała niezależnie od tego, gdzie znajduje się kursor w słowie. cwdziała tylko wtedy, gdy kursor znajduje się na początku słowa. Zobaczyć :help iw.
jamessan,
10
Przechwytywanie najwyższej odpowiedzi w celu uzyskania miłej sztuczki: jeśli masz kilka słów, aby zamienić pojedynczy cytat w cudzysłów, możesz zauważyć, że pierwsze rozwiązanie @jamessan nie działa z .poleceniem. Aby to zadziałało, użyj ciw' Ctrl+r Ctrl+p". Następnie .będzie zachowywał się tak, jak chcesz dla następującego słowa: zamiast zapamiętywać zawartość rejestru, zapamięta, że ​​chcesz, aby wszystko, co jest teraz w rejestrze (trochę trudne do wyjaśnienia, ale jeśli spróbujesz obu, stanie się oczywiste :-))
autra
182

Cytuj słowo, używając pojedynczych cudzysłowów

ciw'Ctrl+r"'

Łatwiej było mi to zrobić w ten sposób

ciw '' Esc P
installero
źródło
8
Niestety nie wydaje się to dozwolone. (powtarzać).
Wil Moore III
2
Wolę to, ponieważ mogę go używać na terminalach / replikach w trybie vim, ponieważ Ctrl + r jest zwykle używany do wyszukiwania wstecznej historii.
krock,
3
@wilmoore Nagraj powyższe jako makro, a następnie powtórz.
Christopher
30

Oto mapowanie, które może pomóc:

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

Jeśli nie zmieniłeś zmiennej mapleader, aktywuj mapowanie za pomocą \q" \q'lub \qd. Dodają podwójny cudzysłów wokół słowa pod kursorem, pojedynczy cudzysłów wokół słowa pod kursorem, usuwają odpowiednio wszelkie cudzysłowy wokół słowa pod kursorem.

Geoff Reedy
źródło
Świetny pomysł! Skończyło się na tym, że dodałem map <Leader>' gewi'<Esc>A'<Esc>do mojego .vimrcpliku, aby wstawić komentarze pojedynczego cudzysłowu od bieżącej pozycji do końca wiersza; co pomogło mi podczas konwersji niektórych skryptów MSDOS na bash.
ILMostro_7,
@ Gooff, działa dobrze w przypadku pojedynczych cytatów. ale w przypadku podwójnych cudzysłowów wstawia „” „” „przed słowem
RameshVel,
@RameshVel Możliwe, że masz własne makra, które wpłynęły na prawą stronę mapowania. Zaktualizowałem polecenie mapowania do nnoremap, aby inne mapowania nie były rozwijane. Poprawiłem także mapowania. Poprzednie miały problemy, gdy kursor znajdował się na pierwszym słowie w linii.
Geoff Reedy
Można to również łatwo dostosować do trybu wizualnego, aby otaczać wybór cudzysłowami, np :vnoremap <leader>q c""<esc>P.
Dominik
27

Oprócz innych poleceń spowoduje to umieszczenie wszystkich słów w wierszu w podwójnych cudzysłowach (zgodnie z komentarzem)

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

lub jeśli chcesz zmniejszyć liczbę odwrotnych ukośników, możesz umieścić \v(bardzo magiczny) modyfikator na początku wzoru

:s/\v(\S+)/"\1"/
Matteo Riva
źródło
Mój skopiowany tekst zawierał przecinki, więc właśnie zmieniłem to:s/\v([a-Z]+)/"\1"/g
tsukimi,
22

Makro sposoby!

  1. naciśnij qi, qaby zapisać w rejestrze q (używamy „q” jako skrótu do zapamiętania „cudzysłowów”).

  2. naciśnij shift+ bprzesuń kursor na przód bieżącego słowa

  3. ityp prasy '(pojedyncze cytaty)

  4. naciśnij, esca następnie naciśnij, eaby przejść do końca słowa

  5. naciśnij, aa następnie naciśnij 'ponownie, aby otoczyć słowo cudzysłowami.

  6. naciśnij, escaby przejść do trybu normalnego.

  7. na koniec naciśnij, qaby zarejestrować w qrejestrze.

Jak używać

  1. Przesuń kursor do żądanego słowa.
  2. Naciśnij, @qaby otoczyć słowo cudzysłowami.
  3. Naciśnij, @@jeśli chcesz powtórzyć w innym słowie.

Możesz zmieniać step 4cokolwiek lubisz {wiersz, słowo, dopóki nie znajdziesz znaku itp.}.

Ustaw utrwalone makro

  1. otwórz .vimrc
  2. idź na koniec pliku
  3. zmień na tryb wstawiania. wpisz to, aby było trwałe:
niech @ q = „ ctrl+ r ctrl+ rq”
  1. Zapisz i wyjdź

  2. otwórz swoje pliki, przejdź do kilku słów

  3. teraz naciśnij @q

jeśli zrobisz to poprawnie, magiczne rzeczy powinny pojawić się w twoich słowach.

Możesz wykonać te czynności dla innych makr, które kochałeś.

Mózg 90
źródło
3
Muszę powiedzieć, że podoba mi się to rozwiązanie. Brak konieczności surround.vim i łatwe wywoływanie i tworzenie makr. Łatwo nadaje się również do wszystkiego, czego potrzebujesz (dla mnie na przykład zacytuj bieżące słowo do końca wiersza, idealne dla ansible). Aby wyświetlić makro, wykonaj: „qp. Aby go zapisać, przejdź do .vimrc i wykonaj: let @q = 'zawartość makra' (tylko dla kompletności)
th3penguinwhisperer
Lubię to bardzo. Możesz zagnieżdżać również te makra. Możesz więc zarejestrować w rejestrze j, @q wa następnie możesz zawinąć następne nsłowa w cudzysłów, używając przy pomocy n@j.
ukryta nazwa użytkownika
1
Dodałem kilka kroków, aby makro pozostało trwałe.
Brain90
1
Pedantyczny, ale słowo i WORD różnią się w Vimie. Shift + b = B, więc krok 2 powinien być idealnie zmieniony na „... przód bieżącego WORD”. Jeśli jednak miałeś na myśli początek słowa, nie musisz używać Shift.
Ambareesh
Dzięki za punkt. Celowo używam shift + b, aby radzić sobie z WORD. Makro powinno działać w słowie lub WORD [0]. W rzeczywistości krok 3 powinien również zmienić na shift + e. [0] stackoverflow.com/a/14390568/341959
Brain90
18

Zawijanie pojedynczych cudzysłowów (na przykład) ciw'<C-r>"'<esc>działa, ale funkcja powtarzania nie działa. Próbować:

ciw'<C-r><C-o>"'<esc>

To powoduje, że zawartość rejestru domyślnego jest „dosłownie”. Teraz możesz nacisnąć .dowolne słowo, aby zawinąć je w cudzysłów. Aby dowiedzieć się więcej, zobacz :h[elp] i_ctrl-ri więcej o obiektach tekstowych na stronie:h text-objects

Źródło: http://vimcasts.org/episodes/pasting-from-insert-mode/

James Scriven
źródło
2
Doskonała wskazówka! Jeśli ktoś chce zrobić z tego mapowanie, właściwym jest zapis ciw'<C-R><C-O>"'<Esc>.
wtapia się
Czego <CR>”dokładnie zrobić?
CodeCrack
@CodeCrack To jest CTRL-R. CTRL-R wstawia zawartość rejestru do kursora i pozostaje w trybie wstawiania.
Erwin Rooijakkers
Jest to powtarzalne, jak wspomniałeś, ale w przypadku przechowywania w makrze powtórzenie makra .spowoduje przepisanie zawartości ostatniego rzeczywistego wywołania.
Sbu
7

Dla użytkowników VSCodeVim możesz to zrobić

vwS"

  • Możesz zastąpić to, "co chcesz owinąć.
  • Możesz zastąpić wdowolnym innym operatorem wyboru
Janac Meena
źródło
2
Działa to również dla mnie dobrze w MacVIM-ie, ale musiałem użyć, viwS'który zawija słowo w pojedyncze cudzysłowy. Zdecydowanie najłatwiejszy.
Matt Grannary
działa to tylko wtedy, gdy jesteś na początku słowa. Jeśli chcesz to zrobić z dowolnego miejsca na świecie, możesz:viwS"
geoyws
6

Nie znam żadnego wbudowanego polecenia vim do tego, ale r"f'r"zmiana z „na” i r'f"r'zmiana z „na” działa, jeśli stoisz na pierwszym „lub”. Polecenie to r'zastępuje dowolny znak pod kursorem „, i f"przenosi Cię do następnego ”.

Håvard S.
źródło
1
Najbardziej intuicyjne dla mnie „ręczne” rozwiązanie. Zamiast drugiego polecenia zamiany ( 'ri "r) możesz po prostu wpisać .I, jeśli chcesz zmienić więcej cudzysłowów, ;i ,przejść do następnego lub poprzedniego, ponieważ powtarzają one ostatnie f/F/t/Twyszukiwanie odpowiednio w tym samym lub przeciwnym kierunku.
Endre Zarówno
5

Dodawanie cytatów

Zacząłem używać tej szybkiej i brudnej funkcji w moim .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

Więc teraz wybieram wizualnie, co chcę (zwykle poprzez viw- wizualnie wybieram słowo wewnętrzne ) w cudzysłowach i naciskam, Qaby wstawić podwójne cudzysłowy, lub naciskając qpojedyncze cudzysłowy.

Usuwanie cytatów

vnoremap s <esc>:call StripWrap()<cr>

function! StripWrap()
  normal `>x`<x
endfunction

Używam vim-textobj-quotes , aby vim traktował cytaty jako obiekty tekstowe. Oznacza to, że mogę to zrobić vaq(wizualnie wybieraj wokół cytatów . Znajduje najbliższe cytaty i wizualnie je wybiera. (Jest to opcjonalne, możesz po prostu zrobić coś takiego f"vww). Następnie naciskam, saby usunąć cytaty z zaznaczenia.

Zmiana cytatów

POCAŁUNEK. I usunąć cudzysłowy następnie dodać cytaty . Na przykład, aby zastąpić pojedyncze cudzysłowy w cudzysłowy, chciałbym wykonać czynności: 1. Zdejmij apostrofów: vaqs2. dodawać nowe cytaty: vwQ.


James Lawson
źródło
4

Jeśli korzystasz z wtyczki vim https://github.com/tpope/vim-surround (lub używasz wtyczki VSCode Vim, która jest fabrycznie zainstalowana z vim-surround), jest to całkiem wygodne!

Dodaj

ysiw' // surround in word `'`

upuszczać

ds' // drop surround `'`

zmiana

cs'" // change surround from `'` to `"`

Działa nawet w przypadku tagów HTML!

cst<em> // change surround from current tag to `<em>`

sprawdź readme na github, aby uzyskać lepsze przykłady

Ulad Kasach
źródło
2

Oto kilka prostych mapowań, których można użyć do zacytowania i cofnięcia słowa:

" '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>
falcucci
źródło
1
Byłoby wspaniale dla wszystkich, gdybyś mógł opracować swoją odpowiedź: jak dodawać mapowania, jak je wywoływać itp. Dzięki.
Carles Alcolea,
1
Powiedziałbym to, aby cytować, podwójnie cytować i nie cytować, powinieneś to zrobićqw qd wq
nilon
z jakiegoś powodu podwójny cytat zwraca dodatkowy cytat na końcu jak „słowo”.
janicebaratheon
@ShuaiWang może masz zainstalowane automatyczne pary lub podobne rozszerzenie? Usunięcie tego naprawiło ten błąd dla mnie.
Nephilim
2

VIM dla vscode robi to niesamowicie. Opiera się na jednym vim-surround, jeśli nie używasz vscode.

Kilka przykładów:

„test” z kursorem w cudzysłowie wpisz cs „”, aby zakończyć się na „test”

„test” z kursorem w cudzysłowie wpisz ds ”, aby zakończyć test

„test” z kursorem wewnątrz cudzysłowów wpisz cs „t i wpisz 123>, aby zakończyć się testem <123>

test z kursorem na słowie testowym typu ysaw), aby zakończyć się na (test)

Lew
źródło
1

Używam nnoremap w moim .vimrc

Aby zacytować jedno słowo:

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

Aby usunąć cudzysłowy (działa również na podwójne cudzysłowy):

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

Reguła do zapamiętania: „sq” = pojedynczy cytat.

Niko Riitala
źródło
0

co powiesz na to?

 :%s/\'/"/g
ghostdog74
źródło
2
To polecenie działa na całym pliku. Muszę tylko zmienić pojedyncze słowa.
Eugene Yarmash
4
Bez %tego będzie działał tylko w bieżącym wierszu, chyba że wybierzesz cały plik
Emily
0

Napisałem skrypt, który to robi:

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>

Aby użyć, po prostu zaznacz coś, naciśnij klawisz kontrolny l, a następnie wpisz znak. Jeśli jest to jeden ze znaków, o których funkcja wie, dostarczy prawidłowego znaku kończącego. Jeśli nie, użyje tego samego znaku do wstawienia po obu stronach.

Surround.vim potrafi więcej niż tylko to, ale to wystarczyło na moje potrzeby.

jeremysprofile
źródło
-1

Przykład mapy trybu wizualnego, aby dodać pojedyncze cudzysłowy wokół wybranego bloku tekstu:

:vnoremap qq <Esc>`>a'<Esc>`<i'<Esc>
mrded
źródło