2009-06-04 5 views
87

Wie führe ich eine Datei aus, die ich in Vi (m) bearbeite und bekomme die Ausgabe in einem geteilten Fenster (wie in SciTE)?Wie führe ich die Datei aus, die ich bearbeite in Vi (m)

Natürlich kann ich es so aus:

:!scriptname 

Aber ist es posible Schreiben Skriptnamen zu vermeiden und wie die Ausgabe in Split-Fenster statt nur unten auf dem Bildschirm zu bekommen?

+19

:!% Lässt Sie vermeiden, 'Skriptname' zu schreiben. Die folgenden Lösungen sind besser, aber ich dachte, ich würde das erwähnen, falls Sie sich entscheiden:% ist gut genug. – overthink

+10

Ein weiterer Hinweis: Sie können% (anstelle von%) verwenden, um auf den absoluten Pfad der aktuellen Datei zu verweisen. Dies kann notwendig sein, wenn Ihr aktuelles Verzeichnis irgendwo anders ist. – andy

+4

zum Ausführen von Ruby-Skripts:! Ruby% macht den Trick –

Antwort

103

Es gibt den Befehl make. Es führt den Befehl aus, der in der makeprg Option festgelegt wird. Verwenden Sie % als Platzhalter für den aktuellen Dateinamen. Zum Beispiel, wenn Sie ein Python-Skript bearbeiten:

:set makeprg=python\ % 

Ja, Sie müssen den Raum zu entkommen. Danach können Sie einfach laufen:

:make 

Wenn Sie möchten, können Sie die autowrite Option gesetzt und es wird die makeprg vor dem Ausführen automatisch speichern:

:set autowrite 

Dies löst das Ausführen Teil. Ich kenne keine Möglichkeit, diese Ausgabe in ein geteiltes Fenster zu bringen, das keine Umleitung zur Datei beinhaltet.

+5

Tatsächlich bringt Ihre Lösung die Ausgabe in ein geteiltes Fenster. Verwenden Sie ': copen', um die" Fehlerliste "zu öffnen, die durch Ausführen von': make'.in einem eigenen Fenster erzeugt wird. Um die Ausgabe korrekt formatieren zu können, ist es leider notwendig, die Option "Fehlerformat" zu deaktivieren. Andernfalls wird angenommen, dass die Ausgabe das Format gcc hat, das ausgegeben wird. –

+2

Sie sind verdammt sicher über "Finagling" -Fehlerformat. Es sieht wie ein Perl-Code aus, den ich gesehen habe ... –

+1

Diese Einrichtung ist für 'make' von Projekt von vim verfügbar (gibt vim die IDE-ähnliche Fähigkeit). Brian Carper's Lösung (': lasst f = expandieren ("% ") | vnew | execute '.! Ruby"'. F. '"'') Obwohl es kryptisch aussieht, funktioniert genau so, wie vom Autor der Frage gestellt. – AjayKumarBasuthkar

28

Um auf den Dateinamen des aktuellen Puffers zuzugreifen, verwenden Sie %. Um es in eine Variable zu bekommen, können Sie die expand() Funktion verwenden. Um ein neues Fenster mit einem neuen Puffer zu öffnen, verwenden Sie :new oder :vnew. Um die Ausgabe eines Befehls in den aktuellen Puffer zu leiten, verwenden Sie . Dass sie alle zusammen:

:let f=expand("%")|vnew|execute '.!ruby "' . f . '"' 

offensichtlich ruby mit dem, was zu ersetzen befehlen Sie wollen. Ich habe execute verwendet, so dass ich den Dateinamen mit Anführungszeichen umgeben konnte, also funktioniert es, wenn der Dateiname Leerzeichen enthält.

+0

Kennen Sie einen benutzerdefinierten Befehl aus Ihrer Lösung? – Rn2dy

+2

@baboonWorksFine Verwenden Sie ': command! R let f = expandieren ("%") | vnew | execute '.! Ruby "'. F. '"' 'Um' 'R' 'einfach zu verwenden, um seinen Befehl auszuführen – xorpaul

+0

Wäre es möglich, diesen Lauf auszuführen? sogar mit Skripten, die während der Ausführung Benutzereingaben erfordern? – Ilias95

1

verwende ich einen etwas aufdringlichen Mechanismus durch Karten:

map ;e :w<CR>:exe ":!python " . getreg("%") . "" <CR> 

macht es nur, damit ich nicht speichern, dann gehen. Geh einfach.

+1

Wenn Sie die Autowrite-Option einstellen, können Sie Folgendes ausführen: make und it ... auto speichert vorher. –

4

Für Shell-Skript ich verwendet habe,

:set makeprg=% 

:make 
+3

was ist los mit '! % '? – ErichBSchulz

19

Vim hat ! ("bang") Befehl, der direkt von VIM Fenster Kommando-Shell ausführt. Außerdem erlaubt es das Starten einer Folge von Befehlen, die mit pipe und read stdout verbunden sind.

Zum Beispiel:

! node % 

entspricht Fenster der Eingabeaufforderung zu öffnen und starten Befehle:

cd my_current_directory 
node my_current_file 

Siehe "Vim tips: Working with external commands" für weitere Einzelheiten.

9

Ich habe eine Abkürzung für das in meinem vimrc:

nmap <F6> :w<CR>:silent !chmod 755 %<CR>:silent !./% > .tmp.xyz<CR> 
    \ :tabnew<CR>:r .tmp.xyz<CR>:silent !rm .tmp.xyz<CR>:redraw!<CR> 

Dieser den aktuellen Puffer schreibt, macht die aktuelle Datei ausführbar (nur UNIX), führt sie (nur UNIX) und leitet die Ausgabe in .tmp .xyz, erstellt dann eine neue Registerkarte, liest die Datei und löscht sie dann.

Brechen it down:

:w<CR>        write current buffer 
:silent !chmod 755 %<CR>   make file executable 
:silent !./% > .tmp.xyz<CR>  execute file, redirect output 
:tabnew<CR>      new tab 
:r .tmp.xyz<CR>     read file in new tab 
:silent !rm .tmp.xyz<CR>   remove file 
:redraw!<CR>      in terminal mode, vim get scrambled 
            this fixes it 
+1

Ich mochte Ihre Lösung sehr, und nach einer Weile der Verwendung, fühlte ich, dass es verbessert werden könnte. Also hier ist meine Meinung: ': w : leise! Chmod + x%: p : leise!%: P 2> & 1 | tee ~/.vim/Ausgabe : Split ~/.vim/Ausgabe : Neuzeichnen! '- dies leitet sowohl das stdout als auch stderr in die temporäre Datei um, und bevor es das tut, druckt es alles auf stdout, wenn also ein Skript lange braucht, um zu laufen, sehen Sie es tatsächlich. Außerdem ist es verzeichnisunabhängig (Ich habe Fehler beim Öffnen von Dateien nach ihrem absoluten Pfad erhalten). Skripts werden jedoch nicht interaktiv ausgeführt, und ich habe keine Möglichkeit gefunden, dies zu tun. –

+1

fyi - auf @Cyrils Lösung musste ich dem Rohrsymbol entkommen: | -> \ | – mpettis

1

Sie vim Plugin bexec verwenden können. Nach meinem Wissen ist die neueste Version 0.5.

Dann:

$ mkdir -p ~/.vim/plugin 
$ mv bexec-0.5.vba ~/.vim/plugin 
$ vim ~/.vim/plugin/bexec-0.5.vba 

Innen vim selbst, während die .vba Datei bearbeiten tun:

:so % 

Einige Ausgang angezeigt werden lassen Sie wissen, dass bexec.vim auch geschrieben wurde als Dokumentation, etc ..

Nun können Sie es testen, indem Sie Ihre (was auch immer Sprache Skript, das ein #! Interpreter ordnungsgemäß funktioniert) in öffnen vim und

:Bexec 

Hinweis laufen: Ich habe die Spaltung wollte vertikal sein, anstatt horizontal, also tat ich:

$ grep -i -n split ~/.vim/plugin/bexec.vim | grep -i hor 
102: let bexec_splitdir = "hor" " hor|ver 
261:  exec {"ver":"vsp", "hor":"sp"}[g:bexec_splitdir] 

und änderte den Wert von "hor" zu "ver" ..

Ich weiß, es ist eine alte Frage, aber ich hoffe, das kann jemand da draußen helfen. Ich habe in der gleichen Ausgabe läuft während Coursera des Startup Technik Kurs nehmen, wo Professor Palaji Emacs verwendet und ich Emacs nicht mögen ..

+0

Sie sollten präferenzbezogene Einstellungen in Ihrer lokalen .vimrc ändern. bexec bietet "let bexec_splitdir = 'hor'" Einstellung, die dies tun kann, ohne den Plugin-Code zu ändern. –

0

Basierend auf @SethKriticos und @Cyril Antworten, die ich jetzt gehen Sie wie folgt:

function! Setup_ExecNDisplay() 
    execute "w" 
    execute "silent !chmod +x %:p" 
    let n=expand('%:t') 
    execute "silent !%:p 2>&1 | tee ~/.vim/output_".n 
    " I prefer vsplit 
    "execute "split ~/.vim/output_".n 
    execute "vsplit ~/.vim/output_".n 
    execute "redraw!" 
    set autoread 
endfunction 

function! ExecNDisplay() 
    execute "w" 
    let n=expand('%:t') 
    execute "silent !%:p 2>&1 | tee ~/.vim/output_".n 
    " I use set autoread 
    "execute "1 . 'wincmd e'" 
endfunction 

:nmap <F9> :call Setup_ExecNDisplay()<CR> 
:nmap <F2> :call ExecNDisplay()<CR> 

Verwenden Sie F9, um das neue Fenster einzurichten und F2, um Ihr Skript und T-Stück zu Ihrer Ausgabedatei auszuführen.

Ich fügte auch den Namen der Ausgabedatei den Skriptnamen hinzu, so dass Sie dies für mehrere Skripts gleichzeitig verwenden können.

0

@xorpaul

ich für dieses Skript war auf der Suche (Python/Windows) schon seit geraumer Zeit. Da es keine "Tee" in Windows habe ich es zu:

function! Setup_ExecNDisplay() 
    execute "w" 
    let n=expand('%:t') 
    execute "silent ! python % > d:\\temp\\output_".n ." 2>&1" 
    execute "vsplit d:\\temp\\output_".n 
    execute "redraw!" 
    set autoread 
endfunction 

function! ExecNDisplay() 
    execute "w" 
    let n=expand('%:t') 
    execute "silent ! python % > d:\\temp\\output_".n . " 2>&1" 
endfunction 

:nmap <F9> :call Setup_ExecNDisplay()<CR> 
:nmap <F2> :call ExecNDisplay()<CR> 

thx

0

In Ihrem .vimrc können Sie diese Funktion

function! s:ExecuteInShell(command) 
    let command = join(map(split(a:command), 'expand(v:val)')) 
    let winnr = bufwinnr('^' . command . '$') 
    silent! execute ':w' 
    silent! execute winnr < 0 ? 'vnew ' . fnameescape(command) : winnr . 'wincmd w' 
    setlocal buftype=nowrite bufhidden=wipe nobuflisted noswapfile nowrap number 
    silent! execute 'silent %!'. command 
    silent! redraw 
    silent! execute 'au BufUnload <buffer> execute bufwinnr(' . bufnr('#') . ') . ''wincmd w''' 
    silent! execute 'nnoremap <silent> <buffer> <LocalLeader>r :call <SID>ExecuteInShell(''' . command . ''')<CR>' 
    silent! execute 'wincmd w' 
    " echo 'Shell command ' . command . ' executed.' 
endfunction 
command! -complete=shellcmd -nargs=+ Shell call s:ExecuteInShell(<q-args>) 
cabbrev shell Shell 

Danach Einfügen in vim Fahrbefehl :shell python ~/p.py als Beispiel. Und Sie erhalten die Ausgabe im geteilten Fenster. + Nach Änderungen in p.py als Beispiel werden Sie den gleichen Befehl erneut ausführen, diese Funktion wird kein neues Fenster erneut erstellen, es wird das Ergebnis im vorherigen (gleichen) geteilten Fenster anzeigen.

+0

Das ist großartig, danke! Wie können Sie es ändern, um es erneut auszuführen, wenn der Puffer erneut geschrieben wird? – elzi

Verwandte Themen