Vim; Выполнение другого приложения: MyCommand

320
Kaveh Shahbazian

Я хочу выполнить «go install» в текущем каталоге (где находится открытый документ) с помощью команды (например, GoInstall).

Как я могу это сделать?

Примечание: я хочу увидеть вывод этой команды тоже.

Я добавил command Goin execute "go install"в _gvimrc и _vimrc (я на Windows), но он не работает - говорит, что это не команда редактора - или дает E488, и я не уверен, что он выполняется в текущем каталоге.

ОБНОВИТЬ:

После некоторых попыток лучше узнать Vim и, в основном, путем поиска в Google, я получил файл _gvimrc, который отлично работает (по крайней мере, для меня). Это добавляет три команды Гон, Гоб и Гор бежать go install, go buildи go run current_file.goи показывает результат в другом документе (буфер) в Vim. Надеюсь, что это поможет кому-то еще, кто является новичком 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> 

Примечание. В вашей системе необходимо настроить как минимум GVOOT и GOPATH env-vars.

0

1 ответ на вопрос

3
Ingo Karkat

:execute is for built-in Ex commands, you want the :! command to execute an external command:

:!go install 

It appears that the 'makeprg' option would be beneficial here, too. Compilation is such a frequent task that vi / Vim have a trigger mechanism built-in. If you

:set makeprg=go 

you can trigger the build with :make install.


To change to the current directory, either use

:cd %:h 

or (to always to this automatically):

:set autochdir 
Спасибо; Я хочу иметь это в _gvimrc. `!` ** работал **, но он выполняет команду в каталоге Windows и не выводит никаких данных: `C: \ Windows \ system32 \ cmd.exe / c" go install "Нажмите любую клавишу, чтобы закрыть это окно ...` I предпочитаю видеть результат в самой vim. Kaveh Shahbazian 11 лет назад 0
Вам все еще нужно определить пользовательскую команду: `: command Goinstall! Go install`, если вы не хотите использовать`: make`. Ingo Karkat 11 лет назад 0
Я сделал, и это сработало. Спасибо :) Моя проблема - путь выполнения. Kaveh Shahbazian 11 лет назад 0
Я добавил это к своему ответу. Ingo Karkat 11 лет назад 0
Спасибо; Это действительно помогло. Теперь, если я не хочу выходить из Vim, как я могу увидеть результат в самом Vim? Kaveh Shahbazian 11 лет назад 0
Тогда `: make` - это путь; Vim захватит вывод, проанализирует его на наличие ошибок (см. «Errorformat») и может показать его в списке быстрых исправлений. Но мне интересно, нужно ли вам все это придумывать самостоятельно, попробуйте поискать в Google «Плагин компилятора языка Go». Ingo Karkat 11 лет назад 1
Go имеет в своем дистрибутиве плагин vim, но не `vimfiles \ compiler \ go.vim`, поэтому: я учусь писать скрипты vim! Kaveh Shahbazian 11 лет назад 0