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.
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.
Odpowiedzi:
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.
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.
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.
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.ciw
nie tylko cw
? Pierwszy jest mylący, a drugi działa dobrze.
ciw
działa niezależnie od tego, gdzie znajduje się kursor w słowie. cw
działa tylko wtedy, gdy kursor znajduje się na początku słowa. Zobaczyć :help iw
.
.
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 :-))
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
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.
map <Leader>' gewi'<Esc>A'<Esc>
do mojego .vimrc
pliku, 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.
:vnoremap <leader>q c""<esc>P
.
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"/
:s/\v([a-Z]+)/"\1"/g
Makro sposoby!
naciśnij qi, qaby zapisać w rejestrze q (używamy „q” jako skrótu do zapamiętania „cudzysłowów”).
naciśnij shift+ bprzesuń kursor na przód bieżącego słowa
ityp prasy '(pojedyncze cytaty)
naciśnij, esca następnie naciśnij, eaby przejść do końca słowa
naciśnij, aa następnie naciśnij 'ponownie, aby otoczyć słowo cudzysłowami.
naciśnij, escaby przejść do trybu normalnego.
na koniec naciśnij, qaby zarejestrować w q
rejestrze.
Jak używać
Możesz zmieniać step 4
cokolwiek lubisz {wiersz, słowo, dopóki nie znajdziesz znaku itp.}.
Ustaw utrwalone makro
niech @ q = „ ctrl+ r ctrl+ rq”
Zapisz i wyjdź
otwórz swoje pliki, przejdź do kilku słów
@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ś.
@q w
a następnie możesz zawinąć następne n
słowa w cudzysłów, używając przy pomocy n@j
.
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-r
i więcej o obiektach tekstowych na stronie:h text-objects
Źródło: http://vimcasts.org/episodes/pasting-from-insert-mode/
ciw'<C-R><C-O>"'<Esc>
.
.
spowoduje przepisanie zawartości ostatniego rzeczywistego wywołania.
Dla użytkowników VSCodeVim możesz to zrobić
vwS"
"
co chcesz owinąć.w
dowolnym innym operatorem wyboruviwS'
który zawija słowo w pojedyncze cudzysłowy. Zdecydowanie najłatwiejszy.
viwS"
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 ”.
'r
i "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/T
wyszukiwanie odpowiednio w tym samym lub przeciwnym kierunku.
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, s
aby 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: vaqs
2. dodawać nowe cytaty: vwQ
.
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
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>
qw
qd
wq
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)
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.
co powiesz na to?
:%s/\'/"/g
%
tego będzie działał tylko w bieżącym wierszu, chyba że wybierzesz cały plik
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.