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

16

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?

Adam Matan
quelle

Antworten:

8

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 )

caleb
quelle
10

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).

0x89
quelle
Dieser autocommand funktionierte nicht für mich, bis ich die erste Zeile (mit dem \ if) in dieselbe Zeile wie das au BufEnter stellte, aber ich entfernte das \
Jason Axelson
Vim unterstützt eine Shell möglicherweise nicht von Haus aus, aber ich wollte nur dieses interessante Shell-Plugin erwähnen: vim.org/scripts/script.php?script_id=2771
Mr Mikkél
: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.
Johnny Utahh
5

Der am wenigsten ausführliche Weg (für den Ihr Skript ausführbar sein muss) ist wahrscheinlich:

 :!%
TNT
quelle
Damit dies funktionierte, musste ich es :!./%so ändern, dass das Skript im aktuellen Verzeichnis gefunden wurde.
Paul Wintz
Ich bin kein Experte, aber es !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.
Paul Wintz
2

Es ist vielleicht kein geteilter Bildschirm, aber das funktioniert für mich ziemlich gut:

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

Hiermit ;eschreiben Sie die aktuelle Datei aus und führen sie mit Python aus (es wird davon ausgegangen, dass sich Python auf Ihrem Computer befindet PATH).

Jack M.
quelle
2

Das Bexec Vim Plugin macht genau das, was Sie wollen. Tastaturkürzel enthalten.

jmetz
quelle
0

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-zvim tun, fgmüssen aber den Kontext häufig wechseln.

Die Funktionsweise dieses Snippets besteht darin, zuerst die ausführbare Datei anhand der zu erraten filetypeund 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
Evan
quelle
-1

Ich kenne vim nicht direkt, aber Sie können den Bildschirm in der Regel mit dem screenDienstprogramm 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.

David Spillett
quelle
Sind Sie sicher, dass es für Vim funktioniert? Es scheint in meinem vim nicht zu reagieren (ich verwende den Befehl slpit, um zwischen Dateien aufzuteilen).
Adam Matan
Dies sind GNU-Bildschirmbefehle, keine vim-Befehle.
INNAM
Ja. Ich spreche über das Ausführen von vim auf dem Bildschirm.
David Spillett
Eine Vim-Aufteilung geschieht im Bereich des Vim-Fensters (oder des Terminals, in dem es ausgeführt wird).
Hasen