Vim; Esecuzione di un'altra applicazione da: MyCommand


0

Voglio eseguire "go install" nella directory corrente (dove risiede il documento attualmente aperto) con un comando (Like: GoInstall).

Come lo posso fare?

Nota: voglio vedere anche l'output di quel comando.

ho aggiunto command Goin execute "go install" a _gvimrc e _vimrc (sono su Windows), ma non funziona - dice che non è un comando di editor - o dà E488 e non sono sicuro che venga eseguito nella directory corrente.

AGGIORNARE:

Dopo essermi sforzato di conoscere meglio Vim e soprattutto con googling ho finito con questo file _gvimrc che funziona perfettamente (almeno per me). Aggiunge tre comandi Gon, Gob e Gor per correre go install, go build e go run current_file.go e mostra il risultato in un altro documento (buffer) in Vim. Spero che aiuti qualcun altro che è un principiante Vim:

set guifont=Lucida_Console:h11
colorscheme dejavu
set tabstop=4

filetype plugin on
filetype plugin indent on
syntax on

" causes vim opens maximized in windows (@least)
au GUIEnter * simalt ~x

set autochdir
set number

" this made my vim life (as a begginer at least) much happier!
" thanks to @ http://vim.wikia.com/wiki/Display_output_of_shell_commands_in_new_window bottom of the page
function! s:ExecuteInShell(command, bang)
    let _ = a:bang != '' ? s:_ : a:command == '' ? '' : join(map(split(a:command), 'expand(v:val)'))

    if (_ != '')
        let s:_ = _
        let bufnr = bufnr('%')
        let winnr = bufwinnr('^' . _ . '$')
        silent! execute  winnr < 0 ? 'belowright new ' . fnameescape(_) : winnr . 'wincmd w'
        setlocal buftype=nowrite bufhidden=wipe nobuflisted noswapfile wrap number
        silent! :%d
        let message = 'Execute ' . _ . '...'
        call append(0, message)
        echo message
        silent! 2d | resize 1 | redraw
        silent! execute 'silent! %!'. _
        silent! execute 'resize ' . line('$')
        silent! execute 'syntax on'
        silent! execute 'autocmd BufUnload <buffer> execute bufwinnr(' . bufnr . ') . ''wincmd w'''
        silent! execute 'autocmd BufEnter <buffer> execute ''resize '' .  line(''$'')'
        silent! execute 'nnoremap <silent> <buffer> <CR> :call <SID>ExecuteInShell(''' . _ . ''', '''')<CR>'
        silent! execute 'nnoremap <silent> <buffer> <LocalLeader>r :call <SID>ExecuteInShell(''' . _ . ''', '''')<CR>'
        silent! execute 'nnoremap <silent> <buffer> <LocalLeader>g :execute bufwinnr(' . bufnr . ') . ''wincmd w''<CR>'
        nnoremap <silent> <buffer> <C-W>_ :execute 'resize ' . line('$')<CR>
        silent! syntax on
    endif
endfunction

command! -complete=shellcmd -nargs=* -bang Shell call s:ExecuteInShell(<q-args>, '<bang>')
cabbrev shell Shell

command! -complete=shellcmd -nargs=* -bang Gor call s:ExecuteInShell('go run %', '<bang>')
command! -complete=shellcmd -nargs=* -bang Gon call s:ExecuteInShell('go install', '<bang>')
command! -complete=shellcmd -nargs=* -bang Gob call s:ExecuteInShell('go build', '<bang>')

:map <F5> :Gor<CR>
:map <F6> :Gob<CR>
:map <F7> :Gon<CR>

Nota: è necessario configurare almeno GOROOT e GOPATH env-vars sul sistema.

Risposte:


3

:execute è per comandi Ex incorporati, vuoi il :! comando per eseguire un esterno comando:

:!go install

Sembra che il 'makeprg' l'opzione sarebbe utile anche qui. La compilazione è un'attività così frequente che vi / Vim ha un meccanismo di trigger integrato. Se tu

:set makeprg=go

puoi attivare la build con :make install.


Per passare alla directory corrente, utilizzare

:cd %:h

o (per sempre a questo automaticamente):

:set autochdir

Grazie; Voglio avere questo in _gvimrc. ! lavorato ma esegue il comando nella directory di Windows e non mostra output: C:\Windows\system32\cmd.exe /c "go install" Hit any key to close this window... Preferisco vedere il risultato in vim stesso.
Kaveh Shahbazian

Devi ancora definire un comando personalizzato: :command Goinstall !go install se non vuoi usare :make.
Ingo Karkat

Ho fatto e ha funzionato. Grazie :) Il mio problema è il percorso di esecuzione.
Kaveh Shahbazian

L'ho aggiunto alla mia risposta.
Ingo Karkat

1
Poi :make è la strada da percorrere; Vim catturerà l'output, lo analizzerà per gli errori (vedi 'errorformat' ), e può mostrarlo nell'elenco delle correzioni rapide. Ma mi chiedo se è necessario inventare tutto da solo, provare googling per un "plug-in compilatore di lingua Go".
Ingo Karkat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.