Vim; Ausführen einer anderen Anwendung durch: MyCommand

381
Kaveh Shahbazian

Ich möchte "go install" im aktuellen Verzeichnis (wo sich das aktuell geöffnete Dokument befindet) mit einem Befehl (Like: GoInstall) ausführen.

Wie kann ich das machen?

Hinweis: Ich möchte auch die Ausgabe dieses Befehls sehen.

Ich habe command Goin execute "go install"_gvimrc und _vimrc (ich bin unter Windows) hinzugefügt, aber es funktioniert nicht - sagt, es ist kein Editorbefehl - oder gibt E488 und ich bin nicht sicher, ob es im aktuellen Verzeichnis ausgeführt wird.

AKTUALISIEREN:

Nach einigen Schwierigkeiten, Vim besser kennenzulernen, und meistens durch googeln, endete diese _gvimrc-Datei, die (zumindest für mich) einwandfrei funktioniert. Es fügt drei Befehle Gon, Gob und Gäre zu laufen go install, go buildund go run current_file.gound zeigt das Ergebnis in einem anderen Dokument (Puffer) in Vim. Hoffe, es hilft jemandem, der ein Vim-Anfänger ist:

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> 

Hinweis: Sie müssen mindestens GOROOT und GOPATH env-vars auf Ihrem System einrichten.

0

1 Antwort auf die Frage

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 
Vielen Dank; Ich möchte das in _gvimrc haben. `!` ** hat funktioniert **, aber es führt den Befehl im Windows-Verzeichnis aus und zeigt keine Ausgabe: `C: \ Windows \ system32 \ cmd.exe / c" go install "Drücken Sie eine beliebige Taste, um dieses Fenster zu schließen ...` I lieber das Ergebnis in vim selbst sehen. Kaveh Shahbazian vor 11 Jahren 0
Sie müssen noch einen benutzerdefinierten Befehl definieren: `: command Goinstall! Go install`, wenn Sie`: make` nicht verwenden möchten. Ingo Karkat vor 11 Jahren 0
Ich tat und es hat funktioniert. Danke :) Mein Problem ist der Ausführungspfad. Kaveh Shahbazian vor 11 Jahren 0
Ich habe das zu meiner Antwort hinzugefügt. Ingo Karkat vor 11 Jahren 0
Vielen Dank; Es hat wirklich geholfen. Wenn ich nun Vim nicht verlassen möchte, wie kann ich die Ausgabe in Vim selbst sehen? Kaveh Shahbazian vor 11 Jahren 0
Dann ist ": make" der Weg zu gehen; Vim erfasst die Ausgabe, analysiert sie auf Fehler (siehe '' errorformat '') und zeigt sie in der Quickfix-Liste an. Aber ich frage mich, ob Sie das alles auf eigene Faust erfinden müssen. Versuchen Sie, nach einem "Go language compiler plugin" zu suchen. Ingo Karkat vor 11 Jahren 1
Go hat vim plugin in seiner Distribution, aber kein `vimfiles \ compiler \ go.vim`. Ich lerne, wie man vim-Skripte schreibt! Kaveh Shahbazian vor 11 Jahren 0