Vim: uruchom skrypt, nad którym pracuję, na podzielonym ekranie

16

Pracuję nad małym skryptem Pythona, który wymaga częstego wykonywania w celu debugowania i dalszego rozwoju.

Czy mogę podzielić ekran vima i wykonać skrypt z jednej strony jednym naciśnięciem klawisza?

Adam Matan
źródło

Odpowiedzi:

9

Dodaj tę linię do swojego .vimrc:

command R !./%

A potem możesz po prostu wpisać „: R” w Vimie, aby uruchomić skrypt ( vim-run-current-file )

kaleb
źródło
10

Vim nie obsługuje i nigdy nie będzie obsługiwał wbudowanej powłoki, takiej jak emacs lub kate (jeśli masz na myśli to), zobacz to pytanie dotyczące przepełnienia stosu .

David Spillet ma rację, możesz uruchomić vima na ekranie GNU:

$ screen vim foo.txt

Ale to da ci tylko coś przypominającego menedżera okien w terminalu - BARDZO przydatne, gdy użyjesz go przez ssh lub na pudełku bez X, ale lokalnie możesz równie dobrze otworzyć inny xterm i przełączać się między nimi. *

W każdym razie, jeśli możesz żyć z faktem, że nie zobaczysz edytowanego pliku, patrząc na produkowany przez niego wynik, wskazówka Jacka M jest dobra, ale może być krótsza:

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

W tym samym celu mam to w moim ~/.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>

Spowoduje to uruchomienie dowolnego pliku, który ma shebang ( #!) w pierwszym wierszu. Używa interpretera do uruchomienia pliku, więc nie musi mieć uprawnień do wykonywania.

* (ekran ma inne bardzo fajne funkcje, takie jak kopiowanie i wklejanie z wyjścia, monitorowanie ukrytych okien pod kątem aktywności / braku aktywności, możliwość korzystania z sesji z różnych terminali w tym samym czasie, możliwość wylogowania, pozostawiając wszystkie programy bieganie - to potężne narzędzie).

0x89
źródło
Ta komenda automatyczna nie działała dla mnie, dopóki nie umieściłem pierwszego wiersza (z \ if) w tym samym wierszu co au BufEnter, ale usunąłem \
Jason Axelson
Vim może nie obsługiwać powłoki natywnie, ale chciałem tylko wspomnieć o tej interesującej wtyczce powłoki: vim.org/scripts/script.php?script_id=2771
Pan Mikkél
:map ;e :w<cr>:!python %<cr>chce wysłać echo do mojego bufora vima, aby „potwierdzić” (?), że polecenie zostało uruchomione. Jak sprawić, by po prostu cicho wykonywał polecenie? :map <silent> ...nie wydaje się działać.
Johnny Utahh
5

Najmniej szczegółowy sposób (który wymaga wykonania skryptu) to prawdopodobnie:

 :!%
TNT
źródło
Aby to zadziałało, musiałem go zmodyfikować, aby :!./%skrypt znalazł się w bieżącym katalogu.
Paul Wintz
I nie jestem ekspertem, ale wygląda na to, że !vim nakazuje vim wykonać cokolwiek, co następuje jako polecenie bash, więc możesz to zrobić !echo "Hello". %Rozpręża się nazwa bieżącego pliku.
Paul Wintz
2

To może nie być podzielony ekran, ale działa mi to całkiem dobrze:

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

To mapuje, ;eaby zapisać bieżący plik i wykonać go za pomocą Pythona (zakłada, że ​​Python jest na twoim PATH).

Jack M.
źródło
2

Bexec vim plugin robi dokładnie to, co chcesz. W zestawie skróty klawiaturowe.

jmetz
źródło
0

Umieść ten mały fragment w swoim .vimrc, aby wykonać bieżący plik jednym naciśnięciem klawisza (jak F5) i wyświetlić wynik w nowym buforze podzielonego panelu.

:! jest w porządku, ale musisz przełączyć się na terminal, aby zobaczyć wynik.

Chociaż możesz to zrobić za pomocą ctrl-zi przywrócić z fgnim vima , nadal musisz dużo zmieniać kontekst.

Sposób działania tego fragmentu polega na zgadywaniu pliku wykonywalnego na podstawie, filetypea następnie uruchamianiu go z bieżącym plikiem jako argumentem.

Następnie przydatna metoda narzędzia pobiera dane wyjściowe i zrzuca je do nowego bufora.

Nie jest idealny, ale naprawdę szybki w przypadku typowych przepływów pracy.

Oto fragment skopiowany poniżej:

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""" 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
źródło
-1

Nie wiem bezpośrednio o vimie, ale ogólnie możesz podzielić ekran w ten sposób za pomocą screennarzędzia. ctrl+ a, S(uwaga, to wielka litera S) podzieli ekran i możesz przełączać się między nimi za pomocą ctrl+ a, tab(jeśli okno jest puste, użyj ctrl+ a, naby przejść do innego otwartego okna lub ctrl+ a, caby utworzyć nowe) .

Możesz podzielić ekran na więcej niż dwa i zmienić rozmiar podziałów za pomocą ctrl-a,: resize. Często używam ekranu w ten sposób i chociaż nie jest to rozwiązanie jednoklawiszowe, o które prosisz, może być bardzo wygodne.

David Spillett
źródło
Jesteś pewien, że to działa dla Vima? Wygląda na to, że nie reaguje w moim vimie (używam polecenia slpit do dzielenia plików).
Adam Matan,
Są to komendy GNU screen, a nie vim.
innaM
Tak. Mówię o uruchomieniu vima na ekranie.
David Spillett,
podział vim to coś, co dzieje się w dziedzinie okna vim (lub terminalu, w którym działa).
hasen