Wie kann ich in Vim schnell Wörter zitieren / nicht zitieren und Zitate (z. B. von '
nach "
) ändern ? Ich kenne das Surround.vim- Plugin, möchte aber nur Vim verwenden.
Wie kann ich in Vim schnell Wörter zitieren / nicht zitieren und Zitate (z. B. von '
nach "
) ändern ? Ich kenne das Surround.vim- Plugin, möchte aber nur Vim verwenden.
Antworten:
Surround.vim wird Ihre einfachste Antwort sein. Wenn Sie wirklich dagegen sind, finden Sie hier einige Beispiele dafür, was Sie tun können. Nicht unbedingt das effizienteste, aber deshalb wurde Surround.vim geschrieben.
ciw'Ctrl+r"'
ciw
- Löschen Sie das Wort, auf dem sich der Cursor befindet, und gelangen Sie in den Einfügemodus.'
- Fügen Sie das erste Zitat hinzu.Ctrl+r"
- Fügen Sie den Inhalt des "
Registers ein, auch bekannt als das letzte Ziehen / Löschen.'
- Fügen Sie das Schlusszitat hinzu.
di'hPl2x
di'
- Löschen Sie das in einfache Anführungszeichen eingeschlossene Wort.hP
- Bewegen Sie den Cursor um eine Stelle nach links (über dem Eröffnungszitat) und setzen Sie den gerade gelöschten Text vor das Zitat.l
- Bewegen Sie den Cursor um eine Stelle nach rechts (über dem Eröffnungszitat).2x
- Löschen Sie die beiden Anführungszeichen.
va':s/\%V'\%V/"/g
va'
- Wählen Sie das zitierte Wort und die Anführungszeichen visuell aus.:s/
- Starten Sie einen Ersatz.\%V'\%V
- Stimmen Sie nur mit einfachen Anführungszeichen überein, die sich innerhalb des visuell ausgewählten Bereichs befinden./"/g
- Ersetzen Sie sie alle durch doppelte Anführungszeichen.ciw
und nicht nur cw
? Ich finde das erste verwirrend und das zweite funktioniert gut.
ciw
funktioniert unabhängig davon, wo sich Ihr Cursor im Wort befindet. cw
Funktioniert nur, wenn sich Ihr Cursor am Wortanfang befindet. Siehe :help iw
.
.
Befehl nicht funktioniert . Verwenden Sie, damit es funktioniert ciw' Ctrl+r Ctrl+p"
. Dann .
verhält es sich so, wie Sie es für das folgende Wort wollen: Anstatt sich an den Inhalt des Registers zu erinnern, wird es sich daran erinnern, dass Sie alles wollen, was sich gerade im Register befindet (schwer zu erklären, aber wenn Sie beides versuchen, wird es offensichtlich :-))
Zitieren Sie ein Wort mit einfachen Anführungszeichen
ciw'Ctrl+r"'
Es war einfacher für mich, es so zu machen
ciw '' Esc P
Hier sind einige Zuordnungen, die helfen könnten:
:nnoremap <Leader>q" ciw""<Esc>P
:nnoremap <Leader>q' ciw''<Esc>P
:nnoremap <Leader>qd daW"=substitute(@@,"'\\\|\"","","g")<CR>P
Wenn Sie die Mapleader-Variable nicht geändert haben, aktivieren Sie das Mapping mit \q"
\q'
oder \qd
. Sie fügen ein doppeltes Anführungszeichen um das Wort unter dem Cursor, ein einfaches Anführungszeichen um das Wort unter dem Cursor und löschen alle Anführungszeichen um das Wort unter dem Cursor.
map <Leader>' gewi'<Esc>A'<Esc>
meiner .vimrc
Datei hinzugefügt , um einfache Anführungszeichen von der aktuellen Position bis zum Ende der Zeile einzufügen. Das hat mir beim Konvertieren einiger MSDOS-Skripte in Bash geholfen.
:vnoremap <leader>q c""<esc>P
.
Zusätzlich zu den anderen Befehlen werden alle Wörter in einer Zeile in doppelte Anführungszeichen gesetzt (gemäß Ihrem Kommentar).
:s/\(\S\+\)/"\1"/
Wenn Sie die Anzahl der Backslashes reduzieren möchten, können Sie \v
am Anfang des Musters einen (sehr magischen) Modifikator einfügen
:s/\v(\S+)/"\1"/
:s/\v([a-Z]+)/"\1"/g
Die Makrowege!
Drücken Sie qund qfür die Aufnahme in das q-Register (wir verwenden "q" als Verknüpfung, um "Anführungszeichen" zu speichern).
Drücken Sie shift+ und bbewegen Sie den Cursor vor das aktuelle Wort
Drücken Sie iTyp '(einfache Anführungszeichen)
Drücken Sie escdann und dann e, um zum Ende des Wortes zu gelangen
Drücken Sie und adann 'erneut, um das Wort mit Anführungszeichen zu umgeben.
Drücken Sie esc, um in den normalen Modus zu gelangen.
Drücken qSie schließlich , um es in das q
Register aufzunehmen.
Wie benutzt man
Sie können step 4
mit allem ändern, was Sie möchten (eine Zeile, ein Wort, bis Sie ein Zeichen gefunden haben, usw.).
Machen Sie das aufgezeichnete Makro dauerhaft
sei @ q = ' ctrl+ r ctrl+ rq'
speichern und Beenden
Öffnen Sie Ihre Dateien, gehen Sie zu einigen Wörtern
@q
Wenn Sie es richtig machen, sollten magische Dinge in Ihren Worten erscheinen.
Sie können diese Schritte für andere Makros ausführen, die Sie geliebt haben.
@q w
und dann die nächsten n
Wörter mit Anführungszeichen umschließen, indem Sie with verwenden n@j
.
Das Umschließen in einfache Anführungszeichen (zum Beispiel) ciw'<C-r>"'<esc>
funktioniert, aber das Wiederholen funktioniert nicht. Versuchen:
ciw'<C-r><C-o>"'<esc>
Dies setzt den Inhalt des Standardregisters "wörtlich". Jetzt können Sie .
auf ein beliebiges Wort drücken , um es in Anführungszeichen zu setzen. Um mehr zu erfahren sehen :h[elp] i_ctrl-r
und mehr über Textobjekte an:h text-objects
Quelle: http://vimcasts.org/episodes/pasting-from-insert-mode/
ciw'<C-R><C-O>"'<Esc>
.
.
der Inhalt des letzten tatsächlichen Aufrufs neu geschrieben.
Für Benutzer von VSCodeVim können Sie dies tun
vwS"
"
alles ersetzen, was Sie einwickeln möchten.w
jeden anderen Auswahloperator ersetzenviwS'
das Wort in einfache Anführungszeichen zu setzen. Mit Abstand am einfachsten.
viwS"
Ich kenne keinen eingebauten vim-Befehl dafür, aber r"f'r"
das Ändern von 'nach "und r'f"r'
von' nach 'funktioniert, wenn Sie auf dem ersten oder' stehen. Der Befehl r'
ersetzt jedes Zeichen unter Ihrem Cursor durch ','. und f"
bringt dich weiter zum nächsten ".
'r
und "r
) können Sie einfach .
Und eingeben, wenn Sie weitere Anführungszeichen ändern möchten, ;
und ,
Sie zum nächsten oder vorherigen führen, während die letzte f/F/t/T
Suche in dieselbe Richtung bzw. in die entgegengesetzte Richtung wiederholt wird .
Zitate hinzufügen
Ich begann diese schnelle und schmutzige Funktion in meinem .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
Jetzt wähle ich visuell aus, was ich will (normalerweise über viw
- visuell innerhalb eines Wortes auswählen ) in Anführungszeichen und drücke Qfür doppelte Anführungszeichen oder drückeq für einfache Anführungszeichen.
Zitate entfernen
vnoremap s <esc>:call StripWrap()<cr>
function! StripWrap()
normal `>x`<x
endfunction
Ich verwende vim-textobj-Anführungszeichen, damit vim Anführungszeichen als Textobjekte behandelt. Dies bedeutet, dass ich dies tun kann vaq
(visuell um Anführungszeichen herum auswählen . Dies findet die nächsten Anführungszeichen und wählt sie visuell aus. (Dies ist optional, Sie können einfach so etwas tun f"vww
). Dann drücke ich, um s
zu entfernen die Anführungszeichen aus der Auswahl zu entfernen.
Zitate ändern
KUSS. Ich entferne Anführungszeichen und füge dann Anführungszeichen hinzu . Um beispielsweise einfache Anführungszeichen durch doppelte Anführungszeichen zu ersetzen, würde ich die folgenden Schritte ausführen: 1. einfache Anführungszeichen entfernen : vaqs
, 2. neue Anführungszeichen hinzufügen : vwQ
.
Wenn Sie das vim-Plugin https://github.com/tpope/vim-surround verwenden (oder das VSCode Vim-Plugin verwenden, auf dem Vim-Surround vorinstalliert ist), ist es ziemlich praktisch!
hinzufügen
ysiw' // surround in word `'`
fallen
ds' // drop surround `'`
Veränderung
cs'" // change surround from `'` to `"`
Es funktioniert sogar für HTML-Tags!
cst<em> // change surround from current tag to `<em>`
Weitere Beispiele finden Sie in der Readme-Datei auf Github
Hier sind einige einfache Zuordnungen, mit denen Sie ein Wort zitieren und nicht zitieren können:
" '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 für vscode macht es unglaublich. Es basiert auf einem Vim-Surround, wenn Sie keinen vscode verwenden.
Einige Beispiele:
"test" mit Cursor in Anführungszeichen geben Sie cs "'ein, um" test "zu erhalten
"test" mit dem Cursor in Anführungszeichen geben Sie ds "ein, um mit test zu enden
"test" mit dem Cursor in Anführungszeichen geben Sie cs "t ein und geben Sie 123> ein, um den Test <123> zu erhalten
Test mit Cursor auf Wort Test Typ ysaw), um mit (Test) zu enden
Ich verwende nnoremap in meiner .vimrc
Um ein Wort einfach zu zitieren:
nnoremap sq :silent! normal mpea'<Esc>bi'<Esc>`pl
So entfernen Sie Anführungszeichen (funktioniert auch bei doppelten Anführungszeichen):
nnoremap qs :silent! normal mpeld bhd `ph<CR>
Zu beachtende Regel: 'sq' = einfaches Anführungszeichen.
Wie wäre es damit?
:%s/\'/"/g
%
funktioniert es nur in der aktuellen Zeile, es sei denn, Sie haben die gesamte Datei ausgewählt
Ich habe ein Skript geschrieben, das dies tut:
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>
Markieren Sie zur Verwendung einfach etwas, drücken Sie die Strg-Taste l und geben Sie ein Zeichen ein. Wenn es sich um eines der Zeichen handelt, die der Funktion bekannt sind, wird das richtige Abschlusszeichen bereitgestellt. Wenn dies nicht der Fall ist, wird auf beiden Seiten dasselbe Zeichen zum Einfügen verwendet.
Surround.vim kann mehr als nur das, aber das war ausreichend für meine Bedürfnisse.