Ich arbeite an einem kleinen Python-Skript, das häufig ausgeführt werden muss, um Fehler zu beheben und weiterzuentwickeln.
Kann ich den VIM-Bildschirm aufteilen und mein Skript an einem Teil mit einem Tastendruck ausführen?
Ich arbeite an einem kleinen Python-Skript, das häufig ausgeführt werden muss, um Fehler zu beheben und weiterzuentwickeln.
Kann ich den VIM-Bildschirm aufteilen und mein Skript an einem Teil mit einem Tastendruck ausführen?
Antworten:
Fügen Sie diese Zeile zu Ihrer .vimrc hinzu:
command R !./%
Und dann können Sie einfach ": R" in Vim eingeben, um das Skript auszuführen ( vim-run-current-file )
Vim unterstützt keine eingebettete Shell wie Emacs oder Kate (wenn Sie das meinen). Lesen Sie diese Frage zum Stapelüberlauf .
David Spillet hat recht, du kannst dein vim in gnu screen ausführen:
$ screen vim foo.txt
Aber das gibt Ihnen nur etwas, das an einen Windowmanager in einem Terminal erinnert - SEHR nützlich, wenn es über ssh oder auf einer Box ohne X verwendet wird, aber lokal können Sie genauso gut ein anderes xterm öffnen und zwischen diesen wechseln. *
Wie auch immer, wenn Sie damit leben können, dass Sie die Datei, die Sie bearbeiten, nicht sehen, während Sie sich die Ausgabe ansehen, die sie erzeugt, ist Jack Ms Tipp gut, könnte aber kürzer sein:
:map ;e :w<cr>:!python %<cr>
Aus dem gleichen 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. Die Datei wird mit dem Interpreter ausgeführt, sodass keine Ausführungsberechtigungen erforderlich sind.
* (Der Bildschirm verfügt über einige weitere sehr nützliche Funktionen wie Kopieren und Einfügen aus der Ausgabe, Überwachen von verborgenen Fenstern auf Aktivität / Nichtaktivität, gleichzeitige Nutzung der Sitzung von verschiedenen Terminals aus und Abmelden aller Programme Laufen - es ist ein mächtiges Werkzeug).
:map ;e :w<cr>:!python %<cr>
will Sachen in meinen vim-Puffer schreiben, um zu "bestätigen" (?), dass der Befehl ausgeführt wurde. Wie kann ich den Befehl einfach im Hintergrund ausführen? :map <silent> ...
scheint nicht zu funktionieren.
Der am wenigsten ausführliche Weg (für den Ihr Skript ausführbar sein muss) ist wahrscheinlich:
:!%
:!./%
so ändern, dass das Skript im aktuellen Verzeichnis gefunden wurde.
!
sieht so aus, als ob der vim anweist, das Folgende als Bash-Befehl auszuführen, damit Sie es tun können !echo "Hello"
. Das %
wird erweitert, um der Name der aktuellen Datei zu sein.
Es ist vielleicht kein geteilter Bildschirm, aber das funktioniert für mich ziemlich gut:
map ;e :w<CR>:exe ":!python " . getreg("%") . "" <CR>
Hiermit ;e
schreiben Sie die aktuelle Datei aus und führen sie mit Python aus (es wird davon ausgegangen, dass sich Python auf Ihrem Computer befindet PATH
).
Es gibt eine ähnliche StackOverflow-Frage .
map <F5> :w<CR>:exe ":!python " . getreg("%") . "" <CR>
Ist das, was ich mit bitte verwendet habe (F5 führt das aktuelle Skript aus).
Um vim in eine leistungsstarke Python-IDE zu verwandeln, empfehle ich dieses Tutorial:
Fügen Sie dieses kleine Snippet in Ihre .vimrc-Datei ein, um die aktuelle Datei mit einem Tastendruck (ähnlich F5
) auszuführen und das Ergebnis in einem neuen Pufferspeicher für geteilte Fenster anzuzeigen.
:!
ist in Ordnung, aber Sie müssen zu Ihrem Terminal wechseln, um das Ergebnis zu sehen.
Sie können dies zwar mit ctrl-z
vim tun, fg
müssen aber den Kontext häufig wechseln.
Die Funktionsweise dieses Snippets besteht darin, zuerst die ausführbare Datei anhand der zu erraten filetype
und sie dann mit der aktuellen Datei als Argument auszuführen.
Als nächstes verwendet eine praktische Dienstprogrammmethode die Ausgabe und legt sie in einem neuen Puffer ab.
Es ist nicht perfekt, aber sehr schnell für gängige Workflows.
Hier ist das unten kopierte Snippet:
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""" 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
Ich kenne vim nicht direkt, aber Sie können den Bildschirm in der Regel mit dem screen
Dienstprogramm auf diese Weise teilen . ctrl+ a, S(Beachten Sie , dass eine Kapital S) wird aufgeteilt , um die Anzeige 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 Teile aufteilen und die Größe der Teilungen mit Strg-a: Größe ändern. Ich benutze den Bildschirm so oft, und obwohl es nicht die Ein-Tasten-Lösung ist, nach der Sie fragen, kann dies sehr praktisch sein.