2010-07-02 7 views
34

TextMate verfügt über eine nette Funktion, mit der Sie ein Skript aus dem aktuellen Kontext ausführen und die Ausgabe in einem separaten Fenster anzeigen können. Auf diese Weise können Sie unterwegs Code schreiben und testen. Ich bin mir fast sicher, dass es ein ähnliches Feature mit MacVim/gVIM gibt, aber ich bin mir nicht sicher, was es ist. Momentan speichere ich meine Puffer auf der Festplatte, gehe dann zur Befehlszeile und führe das Skript in dieser Hinsicht aus. Wie verbessere ich diesen Workflow mit vim?Führen Sie ein Skript direkt in vim/mvim/gvim aus

+0

, was Sie das Skript zu tun, führen Sie versuchen, Sie schreiben, oder ein Skript auf dem Zeug ausführen Sie schreiben ? – falstro

+0

führen Sie ein Skript aus, das ich schreibe. Wenn das Skript "puts 'hallo world'" sagt, möchte ich nur die Welt in macvim/gvim sehen. – randombits

+1

Wenn Sie ein Ruby-Skript schreiben, können Sie einfach ':! ruby% ', um das Skript auszuführen, das Sie gerade schreiben. – rampion

Antwort

61

Sie können dies in vim mit dem Befehl ! tun. Zum Beispiel der Anzahl der Worte in der aktuellen Datei zählen können Sie tun:

:! wc % 

Das% vom aktuellen Dateinamen ersetzt wird. Um ein Skript laufen Sie den Interpreter auf die Datei nennen könnte - zum Beispiel, wenn Sie ein Perl-Skript schreiben:

:! perl % 
+2

Speichern Sie auch das Skript, bevor Sie es ausführen: ': w | Python% '([Mehrfachkommandos] (http: //unix.stackexchange.com/questions/144568/how-do-ich-schreibe-ein-Befehl-in-vim-to-run-multiple-Befehle)) Und um das letzte ':' Befehl zu wiederholen: – Dominik

+3

Und um [das letzte zu wiederholen : 'command] (http://vim.wikia.com/wiki/Repeat_last_colon_command): * Geben Sie' @@ 'oder ein * Geben Sie': 'ein und verwenden Sie den Cursor aufwärts @jts: Vielleicht fügen Sie das hinzu . – Dominik

+0

Wenn Sie eine Datei bearbeiten, für die * execute * -Berechtigungen bereits festgelegt sind, wird ':! ./% 'verwendet die * shebang * -Zeile, um zu bestimmen, wie die Datei ausgeführt und ausgeführt wird. –

4

Es klingt wie Sie für ! suchen:

:!{cmd} Execute {cmd} mit die Muschel.

Sie können % verwenden Sie den aktuellen Dateinamen zu bezeichnen, wenn Sie es an das Skript übergeben müssen:

!proofread-script % 

Sie auch ! mit einem Bereich verwenden können, den Befehl als Filter zu verwenden:

!{motion}{filter} " from normal mode 
:{range}!{filter} " from command mode 

(im ersten Fall, wie bei vielen anderen Befehlen, wenn Sie die Bewegung geben, es wird Sie in dem Befehlsmodus übergeben, um die Bewegung in eine Reihe Umwandlung, zB :.,.+2!)

Und schließlich, wenn Sie nicht wirklich die Eingabe aus Ihrer Datei übergeben müssen, aber die Ausgabe in Ihrer Datei, das ist im Wesentlichen ein trivialer Filter, und der schnellste Weg, es zu tun ist . Dadurch wird die aktuelle Zeile durch die Ausgabe des Befehls ersetzt.

5

Man könnte es laufen rechts von vim:

:!./script.sh

6

die Datei speichern und das Skript aufrufen unter Verwendung eines Interpreters

zB .:

:!python % 
+0

Das ist nett, aber wie kann ich es in einem separaten Fenster laufen lassen? – qed

0

Nun, es auf Ihrem hängt OS - eigentlich habe ich es nicht auf M $ Window $ getestet - aber Conque ist eines der besten Plugins dort: http://code.google.com/p/conque/

Eigentlich kann es besser sein, aber funktioniert. Sie können ein Shell-Fenster in ein vim "Fenster" einbetten.

+0

Dies ist natürlich nicht vorrätig, garantiert aber wahrscheinlich nicht die downvotes - es ist ein nettes Plugin, sobald es läuft, und kann VIm in eine Art Skript-IDE verwandeln, was eine logische Art zu interpretieren ist die Operation. – ruffin

16

vim Tutorial: Mapping keys in Vim

Sie können Tasten zuordnen, so perl aktuelle Skript ausgeführt wird, wie oben von JTS vorgeschlagen.

map <C-p> :w<CR>:!perl %<CR> 

wird Ctrl + P Map-Datei zu schreiben, und führen Sie es durch Perl

imap <C-p> <Esc>:w<CR>:!perl %<CR> 

können Sie den gleichen Anruf im Einfügemodus.

Sie sollten die Datei .vimrc (_vimrc für Windows) in Ihrem vim/home-Ordner haben. Es gibt Anweisungen, wie sich vim verhalten soll.

map <C-p> :w<CR>:!perl %<CR> nur Anweisung Ctrl + p zur Karte zu:

a) die Datei als Parameter :!perl %

:w

b) Startbefehl (Perl) mit% (derzeit offene Datei) Schreibstrom

<CR> nach jedem Befehl steht für "Wagenrücklauf": eine Anweisung zum Ausführen bestimmter Befehle. imap macht dasselbe wie map, hört aber Strg + p im Einfügemodus.

+2

Ihre Antwort ist sehr gut. Kannst du die Teile weiter erklären, um sie vollständiger zu machen und der Gemeinschaft zu nützen? – Bichoy

+2

Ich hoffe, ich habe die Antwort nicht verwirrender als es war – camelotus

3

Setzen Sie this small snippet in Ihre .vimrc, um die aktuelle Datei mit einem Tastendruck (wie F5) auszuführen und das Ergebnis in einem neuen geteilten Fensterpuffer anzuzeigen.

ist in Ordnung, aber Sie müssen zu Ihrem Terminal wechseln, um das Ergebnis zu sehen.

Während Sie das mit ctrl-z tun können und vim zurück mit fg bringen, bedeutet es immer noch, dass Sie den Kontext viel wechseln müssen.

Die Art und Weise, wie snippet funktioniert, ist zunächst durch Erraten der ausführbaren Datei basierend auf filetype und dann mit der aktuellen Datei als Argument ausgeführt.

Als nächstes nimmt eine handy utility method die Ausgabe und dumps es in einen neuen Puffer.

Es ist nicht perfekt, aber sehr schnell für allgemeine Arbeitsabläufe.

Hier ist das Snippet unten kopiert:

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 
"""""""""""""""""""""""""" RUN CURRENT FILE """"""""""""""""""""""""""""" 
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 
" Execute current file 
nnoremap <F5> :call ExecuteFile()<CR> 

" Will attempt to execute the current file based on the `&filetype` 
" You need to manually map the filetypes you use most commonly to the 
" correct shell command. 
function! ExecuteFile() 
    let filetype_to_command = { 
    \ 'javascript': 'node', 
    \ 'coffee': 'coffee', 
    \ 'python': 'python', 
    \ 'html': 'open', 
    \ 'sh': 'sh' 
    \ } 
    let cmd = get(filetype_to_command, &filetype, &filetype) 
    call RunShellCommand(cmd." %s") 
endfunction 

" Enter any shell command and have the output appear in a new buffer 
" For example, to word count the current file: 
" 
" :Shell wc %s 
" 
" Thanks to: http://vim.wikia.com/wiki/Display_output_of_shell_commands_in_new_window 
command! -complete=shellcmd -nargs=+ Shell call RunShellCommand(<q-args>) 
function! RunShellCommand(cmdline) 
    echo a:cmdline 
    let expanded_cmdline = a:cmdline 
    for part in split(a:cmdline, ' ') 
    if part[0] =~ '\v[%#<]' 
     let expanded_part = fnameescape(expand(part)) 
     let expanded_cmdline = substitute(expanded_cmdline, part, expanded_part, '') 
    endif 
    endfor 
    botright new 
    setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap 
    call setline(1, 'You entered: ' . a:cmdline) 
    call setline(2, 'Expanded Form: ' .expanded_cmdline) 
    call setline(3,substitute(getline(2),'.','=','g')) 
    execute '$read !'. expanded_cmdline 
    setlocal nomodifiable 
    1 
endfunction 
+0

Vielen Dank für diese Antwort. Es macht es einfach, bash scripting aus Vim zu lernen. Ich habe die Zeile 511 geändert: '\ 'sh': 'sh'' in dem [Snippet, auf den Sie verwiesen haben] (https://github.com/emorikawa/dotfiles/blob/44b25821891a6873dab10364728bc7df99450b7c/vim/vimrc#L496-L542) nach' \ 'sh': 'bash' '. Ich habe versucht, über die hier-Zeichenfolge "<<<" zu lernen und die erwarteten Ergebnisse nicht zu bekommen. Es stellte sich heraus, dass bash und nicht sh den here-String '<<<' unterstützt, also habe ich die Shell für sh-Skripte geändert. – DMfll

2

Alle Vorschläge hier lediglich :!{cmd} % zur Schau gestellt, die den Shell cmd aktuellen Puffer übergeben wird. Aber es gibt eine andere Option :write !{cmd} Zum Beispiel ist der Effekt des Befehls :write !sh, dass jede Zeile des aktuellen Puffers in der Shell ausgeführt wird.
Es ist oft nützlich, wenn Sie zum Beispiel ein paar Zeilen zum Puffer hinzugefügt haben und das Ausführungsergebnis sofort sehen möchten, ohne vorher den Puffer zu speichern.
Auch ist es möglich, eine Reihe, anstatt ganze Inhalt des Puffers auszuführen:
:[range]write !{cmd}