Mit welchen Vim-Befehlen können Wörter zitiert oder nicht zitiert werden?

204

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.

Eugene Yarmash
quelle
Eine Lösung hängt wirklich vom Kontext ab. Möchten Sie dies nur in einer Zeile oder in der gesamten Datei oder nur für eine einzelne Zeichenfolge in Anführungszeichen tun?
Lucas Oman
Für ein einzelnes Wort oder alle Wörter in einer Zeile. ZB beim Konvertieren eingefügter Wörter in Zeichenfolgenliterale.
Eugene Yarmash

Antworten:

251

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.

  • Zitieren Sie ein Wort mit einfachen Anführungszeichen
    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.

  • Deaktivieren Sie ein Wort, das in einfache Anführungszeichen eingeschlossen ist
    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.

  • Ändern Sie einfache Anführungszeichen in doppelte 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.
Jamessan
quelle
1
Diese funktionieren gut für mich. Ich habe nur gegoogelt, dass das Einfügen im Einfügemodus auch mit Strg + Op möglich ist.
Eugene Yarmash
1
In Kombination mit dem Aufnahmemodus (q) wirkt es wie ein Zauber für schnelle Jobs.
Bischof
Warum ciwund nicht nur cw? Ich finde das erste verwirrend und das zweite funktioniert gut.
Big McLargeHuge
17
@Koveras ciwfunktioniert unabhängig davon, wo sich Ihr Cursor im Wort befindet. cwFunktioniert nur, wenn sich Ihr Cursor am Wortanfang befindet. Siehe :help iw.
Jamessan
10
Wenn Sie die oberste Antwort entführen, um einen netten kleinen Trick zu geben: Wenn Sie mehrere Wörter haben, um das Einschließen eines einfachen Anführungszeichens in ein doppeltes Anführungszeichen zu ersetzen, werden Sie möglicherweise feststellen, dass die erste Lösung von @jamessan mit dem .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 :-))
autra
182

Zitieren Sie ein Wort mit einfachen Anführungszeichen

ciw'Ctrl+r"'

Es war einfacher für mich, es so zu machen

ciw '' Esc P
installero
quelle
8
Das scheint leider nicht zu erlauben. (wiederholen).
Wil Moore III
2
Ich bevorzuge dies, da ich es auf Terminals / Antworten mit VIM-Modus verwenden kann, da Strg + R normalerweise bereits für die Reverse-History-Suche verwendet wird.
Rock
3
@wilmoore Zeichne das Obige als Makro auf und spiele es dann erneut ab.
Christopher
30

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.

Geoff Reedy
quelle
Tolle Idee! Am Ende habe ich map <Leader>' gewi'<Esc>A'<Esc>meiner .vimrcDatei 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.
ILMostro_7
@Geoff, es funktioniert gut für einfache Anführungszeichen. aber für doppelte Anführungszeichen wird "" "" "" vor dem Wort
eingefügt
@RameshVel Möglicherweise hatten Sie einige Ihrer eigenen Makros, die sich auf die rechte Seite des Mappings auswirkten. Ich habe den Zuordnungsbefehl auf nnoremap aktualisiert, damit andere Zuordnungen nicht erweitert werden. Ich habe auch die Zuordnungen verbessert. Die vorherigen hatten Probleme, wenn sich der Cursor auf dem ersten Wort in einer Zeile befindet.
Geoff Reedy
Dies kann auch leicht für den visuellen Modus angepasst werden, um eine Auswahl mit Anführungszeichen zu umgeben, z :vnoremap <leader>q c""<esc>P.
Dominik
27

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 \vam Anfang des Musters einen (sehr magischen) Modifikator einfügen

:s/\v(\S+)/"\1"/
Matteo Riva
quelle
Mein kopierter Text hatte auch Kommas, also habe ich gerade zu diesem geändert:s/\v([a-Z]+)/"\1"/g
Tsukimi
22

Die Makrowege!

  1. Drücken Sie qund qfür die Aufnahme in das q-Register (wir verwenden "q" als Verknüpfung, um "Anführungszeichen" zu speichern).

  2. Drücken Sie shift+ und bbewegen Sie den Cursor vor das aktuelle Wort

  3. Drücken Sie iTyp '(einfache Anführungszeichen)

  4. Drücken Sie escdann und dann e, um zum Ende des Wortes zu gelangen

  5. Drücken Sie und adann 'erneut, um das Wort mit Anführungszeichen zu umgeben.

  6. Drücken Sie esc, um in den normalen Modus zu gelangen.

  7. Drücken qSie schließlich , um es in das qRegister aufzunehmen.

Wie benutzt man

  1. Bewegen Sie den Cursor auf ein gewünschtes Wort.
  2. Drücken Sie @q, um ein Wort mit Anführungszeichen zu umgeben.
  3. Drücken @@Sie, wenn Sie es in einem anderen Wort wiederholen möchten.

Sie können step 4mit allem ändern, was Sie möchten (eine Zeile, ein Wort, bis Sie ein Zeichen gefunden haben, usw.).

Machen Sie das aufgezeichnete Makro dauerhaft

  1. öffne .vimrc
  2. Gehe zum Ende der Datei
  3. Wechseln Sie in den Einfügemodus. Geben Sie dies ein, um es dauerhaft zu machen:
sei @ q = ' ctrl+ r ctrl+ rq'
  1. speichern und Beenden

  2. Öffnen Sie Ihre Dateien, gehen Sie zu einigen Wörtern

  3. Jetzt drücken @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.

Brain90
quelle
3
Ich muss sagen, dass mir diese Lösung gefällt. Kein Surround.vim erforderlich und einfaches Aufrufen und Erstellen der Makros. Auch leicht verwendbar für alles, was Sie sonst noch brauchen würden (für mich zitieren Sie zum Beispiel das aktuelle Wort bis zum Ende der Zeile, perfekt für Ansible). Um das Makro zu zeigen, gehen Sie wie folgt vor: "qp. Um es zu speichern, gehen Sie zu .vimrc und tun Sie: Lassen Sie @q = 'Makroinhalt' (nur der Vollständigkeit
halber
Ich mag das sehr. Sie können diese Makros auch verschachteln. Sie könnten also in Register j aufnehmen @q wund dann die nächsten nWörter mit Anführungszeichen umschließen, indem Sie with verwenden n@j.
versteckter-Benutzername
1
Ich habe einige Schritte hinzugefügt, um das Makro dauerhaft zu machen.
Brain90
1
Pedantisch, aber Wort und WORT unterscheiden sich in Vim. Umschalt + b = B, daher sollte Schritt 2 idealerweise auf "... vor dem aktuellen WORT" geändert werden. Wenn Sie jedoch den Wortanfang gemeint haben, müssen Sie die Umschalttaste nicht verwenden.
Ambareesh
Danke für den Punkt. Ich benutze Shift + B absichtlich, um mit WORD umzugehen. Das Makro sollte in Word oder WORD [0] ausgeführt werden. Eigentlich sollte sich Schritt 3 auch in Shift + e ändern. [0] stackoverflow.com/a/14390568/341959
Brain90
18

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-rund mehr über Textobjekte an:h text-objects

Quelle: http://vimcasts.org/episodes/pasting-from-insert-mode/

James Scriven
quelle
2
Hervorragender Tipp! Wenn jemand daraus ein Mapping machen möchte, ist die richtige Notation ciw'<C-R><C-O>"'<Esc>.
glitzert
Was macht <Cr> "genau?
CodeCrack
@CodeCrack Es ist STRG-R. STRG-R fügt den Inhalt des Registers am Cursor ein und bleibt im Einfügemodus.
Erwin Rooijakkers
Dies ist wie erwähnt wiederholbar. Wenn Sie es jedoch in einem Makro speichern, wird durch Wiederholen des Makros mit .der Inhalt des letzten tatsächlichen Aufrufs neu geschrieben.
Sbu
7

Für Benutzer von VSCodeVim können Sie dies tun

vwS"

  • Sie können durch "alles ersetzen, was Sie einwickeln möchten.
  • Sie können durch wjeden anderen Auswahloperator ersetzen
Janac Meena
quelle
2
Dies funktionierte auch gut für mich unter MacVIM, aber ich musste verwenden, um viwS'das Wort in einfache Anführungszeichen zu setzen. Mit Abstand am einfachsten.
Matt Grannary
Dies funktioniert nur, wenn Sie am Anfang des Wortes stehen. Wenn Sie es von überall innerhalb des Wortes tun viwS"
möchten
6

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 ".

Håvard S.
quelle
1
Die intuitivste "manuelle" Lösung für mich. Anstelle des zweiten Ersetzungsbefehls ( 'rund "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/TSuche in dieselbe Richtung bzw. in die entgegengesetzte Richtung wiederholt wird .
Endre Both
5

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 szu 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.


James Lawson
quelle
4

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

Ulad Kasach
quelle
2

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>
Falcucci
quelle
1
Es wäre für alle großartig, wenn Sie Ihre Antwort ausarbeiten könnten: wie man Zuordnungen hinzufügt, wie man sie aufruft usw. Danke.
Carles Alcolea
1
Ich würde sagen, dass Sie tun sollten, um zu zitieren, doppelt zu zitieren und nicht zu zitierenqw qd wq
nilon
Aus irgendeinem Grund gibt das doppelte Anführungszeichen am Ende ein zusätzliches Anführungszeichen wie "Wort" zurück.
Janicebaratheon
@ShuaiWang Vielleicht haben Sie Autopairs oder eine ähnliche Erweiterung installiert? Durch das Entfernen wurde dieser Fehler für mich behoben.
Nephilim
2

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

Lev
quelle
1

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.

Niko Riitala
quelle
0

Wie wäre es damit?

 :%s/\'/"/g
Ghostdog74
quelle
2
Dieser Befehl wirkt sich auf die gesamte Datei aus. Ich muss nur einzelne Wörter ändern.
Eugene Yarmash
4
Ohne das %funktioniert es nur in der aktuellen Zeile, es sei denn, Sie haben die gesamte Datei ausgewählt
Emily
0

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.

jeremysprofile
quelle
-1

Beispiel für eine Karte im visuellen Modus zum Hinzufügen einfacher Anführungszeichen um einen ausgewählten Textblock:

:vnoremap qq <Esc>`>a'<Esc>`<i'<Esc>
mrded
quelle