Wie kann ich einen Textblock im visuellen Modus in einer Datei in Vim speichern?


75

Der Titel ist sehr beschreibend. Nur für den Fall, ich werde ein Beispiel geben:

START BLOCK1
something
END BLOCK1

START BLOCK2
something
somenthing...
END BLOCK2
  1. Ich wähle das BLOCK1im visuellen Modus
  2. Ich ziehe es durch Drücken y
  3. Wie kann ich den Ruck BLOCK1in einer anderen Datei speichern?

Antworten:


133

Wählen Sie den Text aus, den Sie speichern möchten, entweder im zeilenvisuellen oder im blockvisuellen Modus

:w new.txt

Das ist, was Sie eingeben, aber Sie werden nicht genau sehen , was oben ist. Wenn Sie drücken :, gelangen Sie zur Befehlszeile, die automatisch mit Auswahlinformationen gefüllt wird. Es wird ungefähr so ​​aussehen:

:'<,'>

Geben Sie einfach den Rest ( w new.txt) ein, um zu erhalten

:'<,'>w new.txt

... und drücken Sie die Eingabetaste.


18
Dies liefert nicht das erwartete Ergebnis, da nur vollständige Zeilen geschrieben werden, wobei die Start- und Endposition der Auswahl innerhalb der Zeile nicht berücksichtigt werden. Irgendeine Lösung dafür? Ansonsten möchte ich die Hauptfrage noch einmal stellen.
Dronus

2
@dronus - Ich verstehe nicht ganz, was du fragst. Dies tut, was das OP gefragt hat, nach meinem besten Verständnis der Frage.
Turm

6
Wenn Sie in einem nicht zeilenweisen visuellen Modus auswählen, werden :wweiterhin vollständige Zeilen ausgegeben, die vom ausgewählten Bereich berührt werden, jedoch nicht der genaue Bereich, der innerhalb von Zeilen beginnt oder endet. Wenn Sie beispielsweise eine schmale Spalte im Blockauswahlmodus oder einen Teil einer Zeile im visuellen Auswahlmodus auswählen, wird die vollständige Zeile von geschrieben :w, selbst wenn ydie richtigen Teile der Zeile kopiert werden.
Dronus

1
@dronus - Ah, okey. Ja das ist richtig. Obwohl ich nicht für andere sprechen kann, ist das erwartete Verhalten für mich.
Turm

17

Wenn der Block ausgewählt ist, können Sie :'<,'>w other-file, der nur den ausgewählten Block schreibt other-file. Das Schlagen :im visuellen Modus sollte '<,'>bereits für Sie in die Befehlszeile eingefügt werden, sodass Sie wirklich nur tippen müssen :w other-file.


3
Vim wählt immer ganze Zeilen für die Weiterleitung an einen externen Befehl aus. Sie können also den Unix / Cygwin-Befehl 'cut' verwenden, um das Rechteck der Spalten N bis M für jede Zeile in der Auswahl auszuwählen : :'<,'>w !cut -cN-M > new.txt. Überrascht, dass die am höchsten bewertete Antwort und die Leser die Frage nicht zu verstehen scheinen.
Mosh

7

Es gibt wahrscheinlich einen einfacheren Weg, dies zu tun, aber ich würde einen neuen Puffer (oder eine neue Registerkarte) erstellen und ihn dann einfügen p. Sie können einen neuen Puffer mit :newoder eine neue Registerkarte mit erstellen :tabnew. Sie können den Puffer / Tab wie gewohnt mit in eine Datei schreiben :w filename.


2
Stellen Sie sicher, dass Sie die zusätzliche Zeile oben löschen !! (Das Einfügen in einen leeren Puffer erzeugt eine zusätzliche Zeile oben oder bei Verwendung Punten.)
Eingeschränktes Sühnopfer

3

Wie bei @dronus in den Kommentaren erwähnt, werden die :w !pbcopyVorschläge nicht korrekt kopiert, da die gesamte Zeile kopiert wird. Wenn ich nur die URL in einer Zeile kopieren möchte, kann ich das nicht. Hier ist eine Zeile, die Sie Ihrer .vimrcDatei hinzufügen können, damit bei jedem Drücken von STRG-C die ausgewählte Zeile in Ihrem vim in die Zwischenablage kopiert wird:

map <C-c> y:e ~/clipsongzboard<CR>P:w !pbcopy<CR><CR>:bdelete!<CR>

Wenn Sie Details dazu lesen möchten, können Sie dies in meinem Blog nachlesen

Es ist die gleiche Implementierung wie von @rmeador vorgeschlagen.


2

Ähnlich wie bei @ songz mache ich es lieber so mit ": new"

vmap <C-c> y:new ~/.vimbuf<CR>VGp:x<CR>:!pbcopy < ~/.vimbuf<CR><CR>

pbcopy ist meines Wissens nur unter OSX verfügbar. Es gibt ähnliche Programme unter Linux und anderen Systemen, aber sie haben unterschiedliche Namen und funktionieren unterschiedlich.
Josh Rumbut

Ja, es funktioniert nur, wenn pbcopy ausführbar ist :) Also überhaupt kein Schaden
chenkaie

0

Basierend auf der Variante von @ chenkaie funktioniert das gut für mich:

let mapleader = "," let g:mapleader = "," vmap <leader>y y:new ~/.vbuf<CR>VGp:x<CR> nmap <leader>p :r ~/.vbuf<CR>


0

Vim erhält die visuelle Auswahl und speichert in einer Datei:

function! Get_visual_selection()
    #Get the position of left start visual selection
    let [line_start, column_start] = getpos("'<")[1:2]
    #Get the position of right end visual selection
    let [line_end, column_end] = getpos("'>")[1:2]
    #gotta catch them all.
    let lines = getline(line_start, line_end)
    if len(lines) == 0
        return ''
    endif
    #edge cases and cleanup.
    let lines[-1] = lines[-1][: column_end - 2]
    let lines[0] = lines[0][column_start - 1:]
    return join(lines, "\n")
endfunction

function Save_visually_selected_text_to_file()
    let selected_text = Get_visual_selection()
    call writefile(split(selected_text, "\n"), "/tmp/something.txt")
endfunction

#the c-u does a union of all lines in visual selection.
#this goes in the vimrc
vnoremap <F10> :<c-u>call Save_visually_selected_text_to_file()<cr>

0

Zusätzlich zu der oben ausgewählten Antwort

  • Wenn Sie mit der Maus (1) auswählen,

  • und das Problem, nur ganze Zeilen zu kopieren, die im Kommentar von @dronus erwähnt werden, wenn nur teilweise Zeilen kopiert werden sollen (2):

(1) Bei meinem Debian-basierten DietPi (Raspberry PI) -System verhält sich vim etwas anders als in der oben beschriebenen bevorzugten Lösung, wenn Sie mit der Maus auf meinem Ubuntu 16.04-Arbeitsplatz 'VISUAL MODE' eingeben und auswählen. Dann

  • y, um es zu ziehen

aber wenn ich ':' als Befehl eingebe, wird es nicht mit dem angezeigt

'<,'>

wo ich einfach meine hinzufügen kann

w new.txt

Danach. Also habe ich es einfach selbst getippt und es hat funktioniert:

'<,'>w new.txt

und es kopiert den gesamten Inhalt der Zeile (n) in meine Datei 'new.txt', wohingegen '<' anscheinend 'ausgewählte Zeilen kopieren und'> 'in die referenzierte Datei des Schreibbefehls umleiten.

(2) Und zu dem Problem, einen Teil der Zeile (n) nicht einzufügen, wie in @dronus Kommentar erwähnt, hat diese Lösung (die ausgewählte, erste Alternative) für mich funktioniert:

Bearbeiten Sie die erste Datei und ziehen Sie den gewünschten Text. Öffnen Sie dann Ihre zweite Datei in vi (: e / path / to / other / file) und fügen Sie sie ein (indem Sie p eingeben). Speichern Sie es (wie oben ': w new.txt'.

Es wird dann nur der Teil der Zeilen kopiert, der mit der Maus oder 'y' mit den Cursorn markiert ist.

[BEARBEITEN] Auf meinem Ubuntu-System: Manchmal wird bei Auswahl per Maus NICHT 'VISUAL MODE' in vim eingegeben. Dann kann das normale Kopieren / Einfügen über das Kontextmenü ausgewählt werden ... Ich habe nicht den Grund gefunden, warum Ubuntu das Verhalten von einem "Client-Verhalten" in ein "Host" -Verhalten geändert hat (wobei Ubuntu das SSH-Bash-Fenster in " Klient')...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.