mageekblog - Mot-clé - commandeLe blog personnel de Frédéric Hardy. Au menu, PHP, agilité, FreeBSD, cuisine et photographies.2021-12-02T08:20:54+01:00Frédéric Hardyurn:md5:26874ca5b8cd4cac8d08b0e68e64f63aDotclearCadeau de noël pour les utilisateurs de VIMurn:md5:9b146a8c866459da4e5a8b016333f0272010-12-23T13:45:00+01:002010-12-23T17:34:06+01:00mageekguyVimcommandeshellvim <p>J'ai souvent des commandes à exécuter lorsque je développe, comme par exemple :</p>
<blockquote><pre><code>#php symfony phpunit:unit path/to/test/file.php</code></pre></blockquote>
<p>Jusqu'à récemment, j'avais ajouté la ligne suivante à mon .vimrc pour ne pas avoir à sortir de <a href="http://www.vim.org/">VIM</a> pour exécuter ce type de commande :</p>
<blockquote><pre><code>nnoremap <F12> :!php symfony phpunit:unit % 2>&1 \| more<CR> </code></pre></blockquote>
<p>Ainsi, en appuyant sur la touche <code>F12</code> de mon clavier, je déclenchais l'exécution du fichier de tests en cours d'édition.</p>
<p>Cette solution fonctionne, mais à quelques inconvénients induit par le fait que le résultat de la commande n'est pas affiché dans une fenêtre de <a href="http://www.vim.org/">VIM</a> :</p>
<ol>
<li>Il n'est pas possible de conserver ou éditer les résultats de la commande.</li>
<li>Si plusieurs tests ne passent pas, la sortie de la commande peut être très longue.</li>
</ol>
<p>Bref, à l'usage, ce n'est pas le plus pratique.</p>
<p>La solution consiste donc à injecter le résultat de la commande dans un <q>buffer</q> afin de l'avoir dans une fenêtre et ainsi disposer de l'ensemble des commandes de <a href="http://www.vim.org">VIM</a> pour le manipuler.</p>
<p>Sur la base de cette <a href="http://vim.wikia.com/wiki/Display_output_of_shell_commands_in_new_window">astuce</a>, j'ai donc ajouté à mon <code>.vimrc</code> le code suivant :</p>
<blockquote><pre><code><buffer><silent><buffer><localleader><sid><cr><q-args>let s:_ = ''<br /><br />function! s:ExecuteInShell(command, bang)<br /> let _ = a:bang != '' ? s:_ : a:command == '' ? '' : join(map(split(a:command), 'expand(v:val)'))<br /><br /> if (_ != '')<br /> let s:_ = _<br /> let bufnr = bufnr('%')<br /> let winnr = bufwinnr('^' . _ . '$')<br /> silent! execute winnr < 0 ? 'new ' . fnameescape(_) : winnr . 'wincmd w'<br /> setlocal buftype=nowrite bufhidden=wipe nobuflisted noswapfile nowrap number<br /> silent! :%d<br /> let message = 'Execute ' . _ . '...'<br /> call append(0, message)<br /> echo message<br /> silent! redraw<br /> silent! execute 'silent! %!'. _<br /> silent! execute 'resize ' . line('$')<br /> silent! execute 'au BufUnload <buffer> execute bufwinnr(' . bufnr . ') . ''wincmd w'''<br /> silent! execute 'nnoremap <silent> <buffer> <LocalLeader>r :call <SID>ExecuteInShell(''' . _ . ''', '''')<CR>'<br /> silent! execute 'nnoremap <silent> <buffer> <LocalLeader>g :execute bufwinnr(' . bufnr . ') . ''wincmd w''<CR>'<br /> endif<br />endfunction<br /><br />command! -complete=shellcmd -nargs=* -bang Shell call s:ExecuteInShell(<q-args>, '<bang>')<br /></q-args></cr></sid></localleader></buffer></silent></buffer></code></pre></blockquote>
<p>La commande suivante me permet donc maintenant d'exécuter la commande <strong>de mon choix</strong> et d'en obtenir le résultat dans une fenêtre :</p>
<blockquote><pre><code>:Shell php symfony phpunit:unit %</code></pre></blockquote>
<p>Cerise sur le gâteau, s'il existe déjà une fenêtre de résultat pour cette commande, elle sera réutilisée, afin de ne pas multiplier inutilement les fenêtres de résultat.</p>
<p>Et enfin, il est possible d'exécuter à nouveau la commande à partir de la fenêtre de résultat en tapant <code><localleader>r</code> en mode normal, ou bien à l'aide de la commande <code>:Shell!</code>.</p>
<p>Et comme le code évolue rapidement, à tel point que je suis en train de me dire qu'en faire une extension serait intéressant, je vous conseille d'aller consulter mon <a href="https://svn.mageekbox.net/repositories/vim/trunk/.vimrc"><code>.vimrc</code></a>.</p>http://blog.mageekbox.net/?post/2010/12/23/Cadeau-de-no%C3%ABl-pour-les-utilisateurs-de-VIM#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/221