Vim: Führe das Skript aus, an dem ich gerade arbeite, in einem geteilten Bildschirm

15567
Adam Matan

Ich arbeite an einem kleinen Python-Skript, das häufig ausgeführt werden muss, um ein Debugging durchzuführen und es weiterzuentwickeln.

Kann ich den vim-Bildschirm aufteilen und mein Skript mit einem Tastendruck auf einer Seite ausführen?

14

9 Antworten auf die Frage

9
0x89

Vim unterstützt keine eingebettete Shell wie emacs oder kate (wenn Sie das meinen), siehe diese stackoverflow-Frage .

David Spillet hat Recht, Sie können Ihre Vim im Gnu-Bildschirm ausführen:

$ screen vim foo.txt 

Dies gibt Ihnen jedoch nur etwas, das einem Fenstermanager in einem Terminal ähnelt - SEHR nützlich, wenn Sie es über ssh oder auf einer Box ohne X verwenden, aber lokal können Sie genauso gut ein anderes Xterm öffnen und zwischen ihnen wechseln. *

Wenn Sie mit der Tatsache leben können, dass Sie die gerade bearbeitete Datei nicht sehen, während Sie sich die Ausgabe ansehen, ist der Tipp von Jack M gut, könnte jedoch kürzer sein:

:map ;e :w<cr>:!python %<cr> 

Aus demselben Grund habe ich dies in meinem ~/.vimrc:

au BufEnter * \if match( getline(1), '^\#!') == 0 | \ execute("let b:interpreter = getline(1)[2:]") | \endif  fun! CallInterpreter() if exists("b:interpreter") exec ("!".b:interpreter." %") endif endfun  map <F5> :call CallInterpreter()<CR> 

Dadurch wird jede Datei ausgeführt, die #!in der ersten Zeile ein Shebang ( ) enthält. Es verwendet den Interpreter, um die Datei auszuführen, sodass keine Ausführungsberechtigungen erforderlich sind.

* (Der Bildschirm verfügt über einige weitere sehr nützliche Funktionen, z. B. Kopieren und Einfügen aus der Ausgabe, Überwachen verborgener Fenster auf Aktivität / keine Aktivität, die Möglichkeit, die Sitzung von verschiedenen Terminals gleichzeitig zu verwenden, sich abmelden zu lassen und alle Programme zu verlassen Laufen - es ist ein mächtiges Werkzeug).

Dieser Autocommand hat für mich nicht funktioniert, bis ich die erste Zeile (mit dem \ if) auf dieselbe Zeile wie den au BufEnter gesetzt habe. Jason Axelson vor 13 Jahren 0
Vim unterstützt möglicherweise keine native Shell, aber ich wollte nur dieses interessante Shell-Plugin erwähnen: http://www.vim.org/scripts/script.php?script_id=2771 Mr Mikkél vor 10 Jahren 0
`: map; e: w:! python%will Zeug in meinem vim-Buffer zurücksenden, um "zu bestätigen" (?), dass der Befehl ausgeführt wurde. Wie bekomme ich es, den Befehl einfach lautlos auszuführen? `: map ... scheint nicht zu funktionieren. Johnny Utahh vor 8 Jahren 0
8
caleb

Fügen Sie diese Zeile zu Ihrem .vimrc hinzu:

command R !./% 

Und dann können Sie in Vim einfach ": R" eingeben, um das Skript auszuführen ( vim-run-current-file )

4
T.N.T.

The least verbose way (which requires your script to be executable) is probably:

 :!% 
2
Jack M.

Es ist vielleicht kein Split-Screen, aber das funktioniert ziemlich gut für mich:

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

Damit ;ewird die aktuelle Datei geschrieben und mit Python ausgeführt (es wird davon ausgegangen, dass sich Python auf Ihrem Computer befindet PATH).

2
jmetz

Das vim-Plugin von Bexec macht genau das, was Sie wollen. Tastenkombinationen enthalten.

1
R. Martinho Fernandes
0
Aymeric
map <F5> :w<CR>:exe ":!python " . getreg("%") . "" <CR> 

Ist was ich mit verwendet habe (F5 führt das aktuelle Skript aus).

Um aus vim eine leistungsfähige Python-IDE zu machen, empfehle ich dieses Tutorial:

0
Evan

Fügen Sie dieses kleine Snippet in Ihre .vimrc-Datei ein, um die aktuelle Datei mit einem Tastendruck (wie F5) auszuführen und das Ergebnis in einem neuen Teilfensterpuffer anzuzeigen.

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

Während Sie dies mit ctrl-zund bringen können, fgbedeutet dies immer noch, dass Sie den Kontext viel wechseln müssen.

Die Funktionsweise dieses Snippets besteht darin, zunächst die ausführbare Datei auf der Basis von zu erraten filetypeund sie dann mit der aktuellen Datei als Argument auszuführen.

Als Nächstes übernimmt eine praktische Dienstmethode die Ausgabe und speichert sie in einem neuen Puffer.

Es ist nicht perfekt, aber für allgemeine Workflows sehr schnell.

Hier ist der Ausschnitt, der unten kopiert wurde:

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """""""""""""""""""""""""" 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 
-1
David Spillett

Ich kenne vim nicht direkt, aber Sie können den Bildschirm auf diese Weise im Allgemeinen mit dem screenDienstprogramm aufteilen . ctrl+ a, S(Beachten Sie, dass eine Kapital S) wird die Anzeige geteilt und Sie können zwischen den beiden mit Schalter ctrl+ a, tab(wenn das Fenster leer ist, verwenden Sie ctrl+ a, nzu einem anderen geöffneten Fenster zu verschieben oder ctrl+ a, um ceine neue zu erstellen) .

Sie können die Anzeige auch in mehr als zwei teilen und die Größe der Aufteilungen mit ctrl-a ändern: Größe ändern. Ich verwende den Bildschirm auf diese Weise oft, und obwohl dies nicht die Single-Key-Lösung ist, nach der Sie fragen, kann dies sehr praktisch sein.

Bist du sicher, dass es für Vim funktioniert? Es scheint nicht in meinem vim zu antworten (ich benutze den Befehl slpit, um Dateien zu teilen). Adam Matan vor 14 Jahren 0
Dies sind GNU-Bildschirmbefehle, keine vim-Befehle. innaM vor 14 Jahren 0
Ja. Ich spreche davon, vim innerhalb des Bildschirms zu laufen. David Spillett vor 14 Jahren 0
Ein vim split ist etwas, das innerhalb des Bereichs des vim-Fensters (oder des Terminals, auf dem es läuft) passiert. hasen vor 14 Jahren 0