wake-up-neo.com

Wie kann ich einen Textblock in einer Datei in Vim speichern?

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

START BLOCK1
something
END BLOCK1

START BLOCK2
something
somenthing...
END BLOCK2
  1. Ich wähle den BLOCK1 im visuellen Modus
  2. Ich ziehe es durch Drücken von y
  3. Wie kann ich den BLOCK1 in einer anderen Datei speichern?

Wählen Sie den zu speichernden Text entweder im visuellen Linien- oder Blockmodus aus und

:w new.txt

Das ist es, was Sie eingeben, aber Sie werden nicht wirklich siehe genau das, was oben steht. Wenn Sie : drücken, gelangen Sie zur Befehlszeile, die automatisch mit Auswahlinformationen gefüllt wird. Es sieht ungefähr so ​​aus:

:'<,'>

Tippe einfach den Rest ein (w new.txt), um zu bekommen

:'<,'>w new.txt

... und drücke Enter.

126
Rook

Wenn der Block ausgewählt ist, können Sie :'<,'>w other-file eingeben, der nur den ausgewählten Block in other-file schreibt. Wenn Sie : im visuellen Modus treffen, sollten Sie '<,'> bereits in die Befehlszeile einfügen, sodass Sie wirklich nur :w other-file eingeben müssen.

16
ephemient

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

5
rmeador

Wie bei @dronus in den Kommentaren erwähnt, werden die :w !pbcopy-Vorschläge nicht korrekt kopiert, da sie die gesamte Zeile kopieren. Wenn ich nur die URL in einer Zeile kopieren möchte, kann ich das nicht. Hier ist eine Zeile, die Sie Ihrer .vimrc-Datei hinzufügen können, so dass jedes Mal, wenn Sie STRG-C drücken, 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 auf meinem Blog nachlesen.

Es ist die gleiche Implementierung wie von @rmeador vorgeschlagen.

2
songz

Ähnlich wie bei der @ songz-Lösung mache ich es lieber mit ": new".

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

Zusätzlich zu ausgewählt Antwort oben,

  • wenn Sie mit der Maus wählen (1),

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

(1) Auf meinem Debian-basierten DietPi-System (Raspberry Pi) verhält sich vim ein wenig anders als in der oben beschriebenen bevorzugten Lösung, wenn Sie mit der Maus den 'VISUAL MODE' auf meiner Ubuntu 16.04-Workstation eingeben und auswählen. Dann

  • y es zu reißen

aber wenn ich ':' für den Befehl eingebe, wird er nicht mit dem Kommando 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 Inhalt der gesamten Zeile (n) in meine Datei 'new.txt', wohingegen '<' anscheinend 'ausgewählte Zeilen kopieren' und '>' in die Datei umleiten, auf die der Schreibbefehl verweist.

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

Bearbeiten Sie die erste Datei und ziehen Sie den gewünschten Text heraus. Ö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.

[EDIT] Auf meinem Ubuntu-System: Manchmal wird bei der Auswahl mit der Maus in vim NICHT der 'VISUAL MODE' aufgerufen. Dann kann das normale Kopieren/Einfügen über das Kontextmenü ausgewählt werden ... Ich habe den Grund nicht gefunden, warum Ubuntu sein Verhalten von einem "Client-Verhalten" zu einem "Host" geändert hat (mit Ubuntu, das das ssh-bash-Fenster auf meinem hostet). Klient')...

0
pedda

Holen Sie sich die visuelle Auswahl und speichern Sie sie 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
Eric Leschinski

Basierend auf @ chenkaies Variante 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
Jaime Asm