TextMate a une fonctionnalité intéressante qui vous permet d'exécuter un script à partir du contexte actuel et vous montre la sortie dans une fenêtre séparée. Cela vous permet d'écrire et de tester du code lors de vos déplacements. Je suis presque certain qu'il existe une fonctionnalité similaire avec MacVim/gVIM, mais je ne suis pas sûr de ce que c'est. Actuellement, j'enregistre mes tampons sur le disque, puis accède à la ligne de commande et exécute le script à cet égard. Comment puis-je améliorer ce flux de travail avec vim?
Vous pouvez le faire dans vim en utilisant le !
commande. Par exemple, pour compter le nombre de mots dans le fichier actuel, vous pouvez faire:
:! wc %
Le% est remplacé par le nom de fichier actuel. Pour exécuter un script, vous pouvez appeler l'interpréteur sur le fichier - par exemple si vous écrivez un script Perl:
:! Perl %
tutoriel vim: Mappage des clés dans Vim
Vous pouvez mapper des clés pour que Perl exécute le script actuel comme suggéré par jts ci-dessus.
map <C-p> :w<CR>:!Perl %<CR>
mappera Ctrl + P pour écrire le fichier et l'exécutera par Perl
imap <C-p> <Esc>:w<CR>:!Perl %<CR>
vous permet d'appeler la même chose en mode insertion.
Vous devriez avoir le fichier .vimrc (_vimrc pour Windows) dans votre dossier vim/home. Il contient des instructions sur le comportement de vim.
map <C-p> :w<CR>:!Perl %<CR>
est juste une instruction pour mapper Ctrl + p sur:
a) écrire le fichier actuel :w
b) exécuter la commande (Perl) en utilisant% (fichier actuellement ouvert) comme paramètre :!Perl %
<CR>
après chaque commande signifie "retour chariot": une instruction pour exécuter une commande spécifique. imap fait la même chose que map mais écoute Ctrl + p en mode insertion.
Vous pouvez l'exécuter directement depuis vim:
:!./script.sh
enregistrez le fichier et appelez le script à l'aide d'un interprète
par exemple.:
:!python %
On dirait que vous cherchez !
:
:!{cmd}
Exécuter{cmd}
avec le Shell.
Vous pouvez utiliser %
pour désigner le nom de fichier actuel, si vous devez le transmettre au script:
!proofread-script %
Vous pouvez aussi utiliser !
avec une plage, pour utiliser la commande comme filtre:
!{motion}{filter} " from normal mode
:{range}!{filter} " from command mode
(Dans le premier cas, comme avec de nombreuses autres commandes, lorsque vous tapez le mouvement, il vous passera en mode commande, convertissant le mouvement en une plage, par exemple :.,.+2!
)
Et enfin, si vous n'avez pas vraiment besoin de transmettre l'entrée de votre fichier, mais que vous voulez la sortie dans votre fichier, c'est essentiellement un filtre trivial, et le moyen le plus rapide de le faire est !!{cmd}
. Cela remplacera la ligne actuelle par la sortie de la commande.
Mettez ce petit extrait dans votre .vimrc pour exécuter le fichier en cours avec une seule touche (comme F5
) et afficher le résultat dans un nouveau tampon de volet divisé.
:!
est correct mais vous devez basculer sur votre terminal pour voir le résultat.
Bien que vous puissiez le faire avec ctrl-z
et ramenez vim avec fg
cela signifie toujours que vous devez beaucoup changer de contexte.
La façon dont cela extrait fonctionne consiste à deviner d'abord l'exécutable basé sur filetype
, puis à l'exécuter avec le fichier actuel comme argument.
Ensuite, une méthode utilitaire pratique prend la sortie et la sauvegarde dans un nouveau tampon.
Ce n'est pas parfait, mais vraiment rapide pour les flux de travail courants.
Voici l'extrait copié ci-dessous:
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""" RUN CURRENT FILE """""""""""""""""""""""""""""
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Execute current file
nnoremap <F5> :call ExecuteFile()<CR>
" Will attempt to execute the current file based on the `&filetype`
" You need to manually map the filetypes you use most commonly to the
" correct Shell command.
function! ExecuteFile()
let filetype_to_command = {
\ 'javascript': 'node',
\ 'coffee': 'coffee',
\ 'python': 'python',
\ 'html': 'open',
\ 'sh': 'sh'
\ }
let cmd = get(filetype_to_command, &filetype, &filetype)
call RunShellCommand(cmd." %s")
endfunction
" Enter any Shell command and have the output appear in a new buffer
" For example, to Word count the current file:
"
" :Shell wc %s
"
" Thanks to: http://vim.wikia.com/wiki/Display_output_of_Shell_commands_in_new_window
command! -complete=shellcmd -nargs=+ Shell call RunShellCommand(<q-args>)
function! RunShellCommand(cmdline)
echo a:cmdline
let expanded_cmdline = a:cmdline
for part in split(a:cmdline, ' ')
if part[0] =~ '\v[%#<]'
let expanded_part = fnameescape(expand(part))
let expanded_cmdline = substitute(expanded_cmdline, part, expanded_part, '')
endif
endfor
botright new
setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap
call setline(1, 'You entered: ' . a:cmdline)
call setline(2, 'Expanded Form: ' .expanded_cmdline)
call setline(3,substitute(getline(2),'.','=','g'))
execute '$read !'. expanded_cmdline
setlocal nomodifiable
1
endfunction
Pour exécuter le script exécutable actuel, utilisez
:!./%
! exécute une commande Shell,% est le nom de fichier actuel et ./ ajoute le répertoire courant devant.
Eh bien, cela dépend de votre système d'exploitation - en fait, je ne l'ai pas testé sur M $ Window $ - mais Conque est l'un des meilleurs plugins là-bas: http://code.google.com/p/conque/ =
En fait, ça peut être mieux, mais ça marche. Vous pouvez incorporer une fenêtre Shell dans une "fenêtre" vim.