8 votes

Comment faire passer le contenu du tampon de vim par la commande Shell et capturer la sortie dans une fenêtre divisée.

J'ai lu beaucoup de fils de discussion sur l'exécution des commandes Shell à partir de vim, beaucoup de documentation sur les commandes vim, .vimrc et tout cela, mais je n'arrive pas à comprendre le langage "ex" ou les mappings vim suffisamment bien pour faire ce que je veux, alors je pose cette question. Voilà :

J'ai un tampon ouvert dans vim (j'utilise la dernière version stable de MacVim sur Snow Leopard, mais pas en mode GUI) dont le contenu sera ensuite transmis à un outil en ligne de commande qui le traitera et me fournira un résultat. Ce que je veux, c'est être capable de :

  1. Appuyez sur une touche (ou une combinaison de touches, ou lancez une commande vi)
  2. Exécuter mon utilitaire de ligne de commande avec le contenu de mon tampon actuel (qui peut ne pas être sauvegardé dans le fichier) dans le pipeline
  3. Capturez sa sortie et affichez-la dans vim, de préférence dans une nouvelle fenêtre divisée (comme le fait :help).

Donc, en résumé : je peux exécuter

$ cat ~/myinput.txt | myScript > output.txt

Mais je veux faire quelque chose comme ça dans vim, en mettant la sortie dans une nouvelle fenêtre divisée si possible.

UPDATE :
Bien sûr, juste après avoir posté, j'ai trouvé d'autres informations sur le sujet. Je sais maintenant que je peux faire cela dans vim :

:%! myScript

Et il placera la sortie de myScript (avec le contenu de la mémoire tampon) dans ma mémoire tampon actuelle, en remplaçant tout ce que j'y ai en ce moment.

Existe-t-il donc un moyen de placer ces contenus dans une nouvelle fenêtre divisée, le buffer ? Merci !

7voto

Patrick Klug Points 5320

Je mettrais quelque chose comme ceci dans mon ~/.vimrc ou un fichier avec l'extension .vim dans ~/.vim/plugin/ :

command! FW call FilterToNewWindow('myscript')

function! FilterToNewWindow(script)
    let TempFile = tempname()
    let SaveModified = &modified
    exe 'w ' . TempFile
    let &modified = SaveModified
    exe 'split ' . TempFile
    exe '%! ' . a:script
endfunction

Alors vous pouvez simplement faire " :FW ".

Ce pourrait être une bonne idée de modifier la définition de la commande pour exiger un argument de nom de filtre script à passer à la fonction au lieu de le "coder en dur".

0voto

Tiberiu Ichim Points 191

La fonction de @Heptite, rendue plus générique :

function! FilterToNewWindow()
    let TempFile = tempname()
    let SaveModified = &modified
    exe 'w ' . TempFile
    exe '!chmod +x ' . TempFile
    let &modified = SaveModified
    exe ':e ' . TempFile
    exe '%! ' . @%
   exe 'w!'
endfunction

" bash execute contents of current buffer and filter it to a new window
command! FW call FilterToNewWindow()

```

0voto

user3304574 Points 1

Cette commande fera la moitié de ce que vous voulez.

map <Leader>r :!%:p<cr>

Le buffer actuel doit être un exécutable avec une ligne shebang pour que cela fonctionne.

0voto

Aryeh Leib Taurog Points 350

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X