web-dev-qa-db-fra.com

Exécuter un script directement dans vim / mvim / gvim

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?

38
randombits

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 %
69
jts

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.

16
camelotus

Vous pouvez l'exécuter directement depuis vim:

:!./script.sh

6
Amardeep AC9MF

enregistrez le fichier et appelez le script à l'aide d'un interprète

par exemple.:

:!python %
6
Nikolaus Gradwohl

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.

4
Cascabel

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
3
Evan

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.

2
Maxim

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.

0
Zsolt Botykai