2009-06-04 9 views
87

Jak wykonać plik, który edytuję w Vi (m) i uzyskać dane wyjściowe w podzielonym oknie (jak w SciTE)?Jak wykonać plik, który edytuję w Vi (m)

Oczywiście mogę wykonać to tak:

:!scriptname 

Ale jest to posible uniknąć pisania nazwę skryptu i jak uzyskać wyjście w podzielonym oknie zamiast tylko dolnej części ekranu?

+19

:!% Pozwoli Ci uniknąć pisania "scriptname". Poniższe rozwiązania są lepsze, ale pomyślałem, że wspomnę o tym na wszelki wypadek:!% Jest wystarczająco dobre. – overthink

+10

Kolejna uwaga, możesz użyć%: p (zamiast tylko%), aby odnieść się do bezwzględnej ścieżki bieżącego pliku. Może to być konieczne, jeśli bieżący katalog znajduje się w innym miejscu. – andy

+4

uruchamiać skrypty ruby:! Ruby% zrobi sztuczkę –

Odpowiedz

103

Istnieje polecenie make. Uruchamia zestaw poleceń w opcji makeprg. Użyj % jako symbolu zastępczego dla bieżącej nazwy pliku. Na przykład, jeśli edytujesz skrypt python:

:set makeprg=python\ % 

Tak, musisz uciec z tego miejsca. Po tym można po prostu uruchomić:

:make 

Jeśli chcesz, możesz ustawić opcję autowrite i będzie zapisywać automatycznie przed uruchomieniem makeprg:

:set autowrite 

To rozwiązuje wykonać część. Nie wiem, w jaki sposób można uzyskać to wyjście w podzielonym oknie, które nie wiąże się z przekierowaniem do pliku.

+5

W rzeczywistości twoje rozwiązanie przenosi wyjście do podzielonego okna. Użyj ': copen', aby otworzyć" listę błędów "utworzoną przez uruchomienie': make' w swoim własnym oknie. Niestety, aby dane wyjściowe były poprawnie sformatowane, konieczne jest pewne finalizowanie opcji 'errorformat'. W przeciwnym razie wyjście będzie uznawane za format gcc. –

+2

Jesteś cholernie pewien "format oceny". Wygląda jak jakiś kod perla, który widziałem ... –

+1

Ta funkcja jest dostępna dla "make" projektu z vim (daje vim możliwości IDE jak). Rozwiązanie Briana Carpera (': let f = expand ("% ") | vnew | wykonaj '.! Ruby' '. F.'" '') Choć wygląda tajemniczo, działa dokładnie tak, jak zadał to pytanie autorowi pytania. – AjayKumarBasuthkar

28

Aby uzyskać dostęp do nazwy bieżącego bufora, należy użyć %. Aby pobrać go do zmiennej, możesz użyć funkcji expand(). Aby otworzyć nowe okno z nowym buforem, użyj :new lub :vnew. Aby przesłać dane wyjściowe z polecenia do bieżącego bufora, użyj :.!. Wprowadzenie go wszyscy razem:

:let f=expand("%")|vnew|execute '.!ruby "' . f . '"' 

oczywiście zastępując ruby z polecenia cokolwiek chcesz. Użyłem execute, więc mogłem otoczyć nazwę pliku cudzysłowem, więc zadziała, jeśli nazwa pliku zawiera spacje.

+0

Czy wiesz, że masz niestandardowe polecenia z rozwiązania? – Rn2dy

+2

@baboonWorksFine Użyj ': command! R let f = expand ("%") | vnew | wykonaj '.! Ruby "'. F. '"' ', Aby móc po prostu użyć ': R', aby wykonać jego polecenie – xorpaul

+0

Czy to możliwe, aby ten przebieg nawet przy skryptach, które wymagają wprowadzania danych przez użytkownika podczas wykonywania? – Ilias95

1

używam nieco bardziej inwazyjny mechanizm poprzez map:

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

Podobnie czyni go tak nie mam zapisać, a następnie przejść. Po prostu idź.

+1

Po ustawieniu opcji autowrite można uruchomić: make i to ... auto zapisuje wcześniej. –

4

Dla scenariusza Shell Użyłem

:set makeprg=% 

:make 
+3

co jest nie tak z '! % "? – ErichBSchulz

19

Vim ma ! ("bang") polecenie, które wykonuje polecenie powłoki bezpośrednio z okna Vima. Ponadto pozwala uruchamiać sekwencję poleceń połączonych z potokiem i czytać standardowe wyjście.

Na przykład:

! node % 

jest równoznaczne z otwarciem okna wiersza polecenia i uruchomienie polecenia:

cd my_current_directory 
node my_current_file 

Zobacz "Vim tips: Working with external commands" szczegóły.

9

mam skrót do tego w moim vimrc:

nmap <F6> :w<CR>:silent !chmod 755 %<CR>:silent !./% > .tmp.xyz<CR> 
    \ :tabnew<CR>:r .tmp.xyz<CR>:silent !rm .tmp.xyz<CR>:redraw!<CR> 

To pisze bieżący bufor sprawia, że ​​bieżący plik wykonywalny (tylko Unix), wykonuje go (tylko Unix) i przekierowuje dane wyjściowe do .tmp .xyz, a następnie tworzy nową kartę, odczytuje plik, a następnie usuwa go.

złamanie go:

:w<CR>        write current buffer 
:silent !chmod 755 %<CR>   make file executable 
:silent !./% > .tmp.xyz<CR>  execute file, redirect output 
:tabnew<CR>      new tab 
:r .tmp.xyz<CR>     read file in new tab 
:silent !rm .tmp.xyz<CR>   remove file 
:redraw!<CR>      in terminal mode, vim get scrambled 
            this fixes it 
+1

Bardzo spodobało mi się twoje rozwiązanie, a po pewnym czasie korzystania z niego, czułem, że można go poprawić. Oto moje zdanie: ': w : cichy! Chmod + x%: p : cichy!%: P 2> & 1 | tee ~/.vim/output : split ~/.vim/output : przerysuj! '- przekierowuje stdout i stderr do pliku tymczasowego, a przed wykonaniem tego, wypisuje wszystko na standardowe wyjście, więc jeśli skrypt długo się uruchamia, faktycznie działa. Ponadto jest niezależny od katalogów (podczas otwierania plików według ich bezwzględnej ścieżki pojawiały się błędy). Jednak nie uruchamia skryptów interaktywnie i nie znalazłem sposobu, aby to zrobić. –

+1

fyi - w sprawie rozwiązania @ Cyryl, musiałem uciec symbol rury: | -> \ | – mpettis

1

Można użyć vim jest plugin bexec. Według mojej wiedzy najnowsza wersja to 0,5.

Następnie:

$ mkdir -p ~/.vim/plugin 
$ mv bexec-0.5.vba ~/.vim/plugin 
$ vim ~/.vim/plugin/bexec-0.5.vba 

Wewnątrz samej vim podczas edycji pliku .vba zrobić:

:so % 

Niektóre wyjście pokaże się z powiadomieniem, że bexec.vim został napisany, a także jako dokumentacja, itp.

Teraz możesz przetestować go, otwierając (niezależnie od skryptu językowego, który ma poprawnie działający interpreter #!) vim i uruchomić

:Bexec 

Uwaga: Chciałem być podział pionowy zamiast poziomego, tak zrobiłem:

$ grep -i -n split ~/.vim/plugin/bexec.vim | grep -i hor 
102: let bexec_splitdir = "hor" " hor|ver 
261:  exec {"ver":"vsp", "hor":"sp"}[g:bexec_splitdir] 

i zmienił wartość z "Hor" do "ver" ..

Wiem, że to stare pytanie, ale mam nadzieję, że to może pomóc komuś tam. I zostały uruchomione w tym samym numerze, biorąc kurs Inżynieria Uruchomienie Coursera gdzie profesor Palaji używa Emacsa i nie lubię Emacs ..

+0

Powinieneś zmienić ustawienia związane z preferencjami w swoim lokalnym .vimrc. bexec oferuje ustawienie "let bexec_splitdir =" hor '", które może to zrobić bez modyfikowania kodu wtyczki. –

0

podstawie @SethKriticos i odpowiedzi @Cyril Teraz używam następujący:

function! Setup_ExecNDisplay() 
    execute "w" 
    execute "silent !chmod +x %:p" 
    let n=expand('%:t') 
    execute "silent !%:p 2>&1 | tee ~/.vim/output_".n 
    " I prefer vsplit 
    "execute "split ~/.vim/output_".n 
    execute "vsplit ~/.vim/output_".n 
    execute "redraw!" 
    set autoread 
endfunction 

function! ExecNDisplay() 
    execute "w" 
    let n=expand('%:t') 
    execute "silent !%:p 2>&1 | tee ~/.vim/output_".n 
    " I use set autoread 
    "execute "1 . 'wincmd e'" 
endfunction 

:nmap <F9> :call Setup_ExecNDisplay()<CR> 
:nmap <F2> :call ExecNDisplay()<CR> 

Użyj F9, aby ustawić nowe okno, a F2, aby wykonać skrypt i trójnik do pliku wyjściowego.

Dodałem również nazwę skryptu do nazwy pliku wyjściowego, aby można było użyć tego dla wielu skryptów w tym samym czasie.

0

@xorpaul

Szukałem tego skryptu (python/systemu Windows) już od jakiegoś czasu. Jak nie ma "tee" w Windows zmieniłem go na adres:

function! Setup_ExecNDisplay() 
    execute "w" 
    let n=expand('%:t') 
    execute "silent ! python % > d:\\temp\\output_".n ." 2>&1" 
    execute "vsplit d:\\temp\\output_".n 
    execute "redraw!" 
    set autoread 
endfunction 

function! ExecNDisplay() 
    execute "w" 
    let n=expand('%:t') 
    execute "silent ! python % > d:\\temp\\output_".n . " 2>&1" 
endfunction 

:nmap <F9> :call Setup_ExecNDisplay()<CR> 
:nmap <F2> :call ExecNDisplay()<CR> 

thx

0

w twojej .vimrc można wkleić tę funkcję

function! s:ExecuteInShell(command) 
    let command = join(map(split(a:command), 'expand(v:val)')) 
    let winnr = bufwinnr('^' . command . '$') 
    silent! execute ':w' 
    silent! execute winnr < 0 ? 'vnew ' . fnameescape(command) : winnr . 'wincmd w' 
    setlocal buftype=nowrite bufhidden=wipe nobuflisted noswapfile nowrap number 
    silent! execute 'silent %!'. command 
    silent! redraw 
    silent! execute 'au BufUnload <buffer> execute bufwinnr(' . bufnr('#') . ') . ''wincmd w''' 
    silent! execute 'nnoremap <silent> <buffer> <LocalLeader>r :call <SID>ExecuteInShell(''' . command . ''')<CR>' 
    silent! execute 'wincmd w' 
    " echo 'Shell command ' . command . ' executed.' 
endfunction 
command! -complete=shellcmd -nargs=+ Shell call s:ExecuteInShell(<q-args>) 
cabbrev shell Shell 

Po tym, w polecenia :shell python ~/p.pyvim metę jako przykład. Otrzymasz wyjście w podzielonym oknie. + Po wprowadzeniu zmian w p.py jako przykładzie, ponownie uruchomisz to samo polecenie, funkcja ta nie utworzy ponownie nowego okna, wyświetli wynik w poprzednim (tym samym) podzielonym oknie.

+0

To jest niesamowite, dziękuję! Jak możesz go zmienić, aby ponownie się uruchamiał po ponownym zapisaniu bufora? – elzi