webentwicklung-frage-antwort-db.com.de

Aktuelle Zeile in Bash von vim aus ausführen

Diese Frage ist ähnlich wie Vim: Aktuelle Datei ausführen? aber anstatt die aktuelle Datei auszuführen, möchte ich nur die aktuelle Zeile ausführen. 

Ist das möglich?

Update: Idealerweise suche ich nach Lösungen, die Nebenwirkungen in der äußeren Hülle haben können. __ Angenommen, ich habe die folgende Zeile:

alias foo=bar

Wenn Sie nach dem Ausführen des Befehls in vim eine Shell mit :sh starten, ist der Alias ​​foo verfügbar. Wenn Sie jedoch vim mit :q beenden, ist der Alias ​​nicht mehr verfügbar.

51
merlin2011

Sicher, Sie können jeden Inhalt der aktuellen Datei in das Standardprogramm eines anderen Programms "schreiben":

:.w !bash

Hier bezieht sich . (der Teil vor w) auf den Zeilenbereich, den Sie schreiben, und . ist nur die aktuelle Zeile. Dann verwenden Sie !bash, um diese Zeilen in Bash zu schreiben.

87
Daan Bakker

Ich mache so etwas immer mit:

:exec '!'.getline('.')

Sie können sogar eine Zuordnung in Ihrer .vimrc erstellen:

nmap <F6> :exec '!'.getline('.')

Daans Antwort funktioniert auch, ich gab ihm eine positive Stellungnahme.

28
cforbish

bewegen Sie den Cursor in diese Zeile und drücken Sie im normalen Modus:

!!bash<cr>
13
Kent

Dies könnte ein Kommentar sein, wenn ich einen Kommentar abgeben kann.

Bezüglich der Weiterleitung/Pipe-Zeilen des aktuellen Puffers in vim an einen externen Befehl.... Inspirieren durch Daan Bakkers große Antwort. Ich schrieb, ich antworte hier ( Https://stackoverflow.com/a/40002312/3625404 ) zu einer Frage zum Python-Skript (laufender Puffer).

Neben dem Ausführen des gesamten Puffers wird demonstriert, wie ein Zeilenbereich über einen externen Befehl ausgeführt wird .. Um Zeit zu sparen, kopiere ich ihn einfach unten.

#####################

In vim können Sie einfach einen beliebigen Bereich Ihres aktuellen Puffers auf einen externen Befehl umleiten (sei es bash, python oder ein eigenes Python-Skript).

# redirect whole buffer to python
:%w !python

angenommen, Ihr aktueller Puffer enthält zwei Zeilen wie folgt:

import numpy as np
print np.arange(12).reshape(3,4)

dann wird :%w !python es ausführen, sei es gespeichert oder nicht. und drucken Sie etwas wie unten auf Ihrem Terminal aus, 

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

Natürlich könnten Sie etwas Beständiges machen, z. B. einige Keymaps.

nnoremap <F8> :.w !python<CR>
vnoremap <F8> :w !python<CR>

erste Zeile für den aktuellen Lauf, zweite visuelle Auswahl für einen Lauf über Python-Interpreter.

#!! be careful, in vim ':w!python' and ':.w !python' are very different, the
first write (create or overwrite) a file named 'python' with contents of
current buffer, the second redirect the selected cmdline range (here dot .,
which mean current line) to external command (here 'python').

für den Cmdline-Bereich siehe 

:h cmdline-ranges

nicht unter einem, was den normalen Befehl betrifft, nicht cmdline.

:h command-range

inspiriert von https://stackoverflow.com/a/19883963/3625404

4
qeatzy

Betrachten Sie den folgenden Befehl, der auf einem Terminal ausgeführt wird.

seq 0 10 | xargs printf "%02x "

Erwartete Ausgabe ist

00 01 02 03 04 05 06 07 08 09 0a

Angenommen, Sie haben diesen Befehl in eine Datei geschrieben. Um diesen Befehl auszuführen, holen Sie diese entsprechende Ausgabe wieder in diese Datei. Sie können diese Zuordnung in Ihre .vimrc-Datei einfügen.

nmap <leader>E :exec 'r!'.getline('.')<CR>

Beachten Sie, dass Sie zur Ausführung der oben genannten Zeile diese schreiben müssen, indem Sie Escape-Zeichen für '%' hinzufügen.

seq 0 10 | xargs printf "\%02x "

Gehen Sie diese Zeile in Ihre Datei und drücken Sie <leader>E. In meinem Fall ist <leader>, zugeordnet, daher drücke ich ,E

0
Rohan Ghige

Wenn ich in vi/vim einen Befehl für eine Zeile mit diesem Text habe "

ls -la

Positionieren Sie den Cursor an einer beliebigen Stelle in der Zeile und machen Sie ":. !!" und drücken Sie die Eingabetaste.

Das heißt: Colon Dot Bang Bang Rückkehr

Dadurch wird der Text in dieser Zeile in der aktuellen Shell in vi/vim ausgeführt und die Ausgabe in die Textdatei eingefügt.

Ich denke, das ist, was Sie gefragt haben? es ist wie magie.

0
Brux

Fügen Sie diese Zuordnung Ihrer .vimrc-Datei hinzu.

nmap <leader>E yyp:.!csh<CR>

Erläuterung:

  1. yy Yank-Stromleitung
  2. p Fügen Sie die eingerückte Zeile darunter ein (und der Cursor springt zu dieser nächsten Zeile)
  3. :.!csh<CR> Führen Sie diese neu eingefügte Zeile (mit csh) aus. Die Ausgabe dieser Zeile ersetzt diese aktuelle Zeile, daher wurde die Zeile vor dem Ausführen gerissen und darunter eingefügt.
0
Rohan Ghige