2009-12-27 6 views
1

Beaucoup de mes programmes sont des applications de type console, qui prennent un fichier de données, et impriment les résultats, soit à l'écran (plus souvent) ou dans un autre fichier. Depuis quelques jours, je fais une analyse qui nécessite beaucoup de peu de tentation avec un fichier de données d'entrée, juste pour obtenir quelques chiffres, je vais habituellement: modifier le fichier de données, démarrer le programme, obtenir le résultat, modifier le fichier de données , commencer le programme, obtenir le résultat ...Lire le résultat d'un fichier exe dans: vs in vim

Alors je me demandais, est-ce qu'il y a un moyen dans vim, tout en ayant ouvert le fichier d'entrée, pour définir une fonction qui ouvrirait une division verticale et chargerait le résultat du programme (pro12 .exe) dedans?

Comment on pourrait s'y prendre?

+0

Est-ce que pro12.exe prend en charge l'envoi de sortie vers STDOUT? accepter des données de STDIN? Ou, cela nécessite-t-il des entrées, des noms de fichier de sortie dans la ligne de commande? – zen

+0

Vous n'êtes pas sûr du premier (STD ...) - ce n'est pas un programme en C. Il ne nécessite aucun argument de ligne de commande. Le nom du fichier d'entrée est codé en dur, et tout ce qu'il fait est d'écrire quelque chose. – Rook

Répondre

0

La chose la plus facile à faire est probablement écrire un Makefile pour exécuter le programme (et rediriger la sortie vers un fichier), et :set l'option autoread sur Vim. Ensuite, vous pouvez créer une macro r en tapant qr:make<Enter>q et exécutez la macro avec @r. La macro provoquera l'invocation de Vim, qui exécutera le programme pour mettre à jour le fichier de données. L'option autoread s'assurera que vim actualise le fichier mis à jour sans vous demander d'abord.

0

En supposant que pro12.exe se trouve dans votre% PATH%, cela appellera votre application auxiliaire et vert-split-ouvrir un nom de fichier de sortie statique. Carte à la clé que vous aimez. QND: ne fonctionnera pas si les chemins relatifs (nomsBob) changent via cd. YMMV

fun! RunPro12() 
    bufdo if bufname(bufnr($)) == '/path/to/pro12.exe.output' | close | endif 
    silent exe '!pro12.exe' 
    vs /path/to/pro12.exe.output 
endfun 
map <f3> :call RunPro12()<cr> 
+0

Pas une mauvaise approche. Cependant, les divisions de vs continuent juste à s'ouvrir de cette façon.Avez-vous une idée sur la fermeture de tous les vs (bien juste l'ouvert) à chaque début de fonction? – Rook

+0

pour ainsi dire, comment ferais-tu pour fermer le courant vs en appuyant sur n'importe quelle touche (entrer par exemple)? – Rook

0

Je n'aime pas :bufdo solutions que cette commande salit toujours l'organisation Windows actuelle.

En temps normal, j'utiliserais lh#buffer#jump() qui saute à la fenêtre où le tampon nommé est ouvert s'il est déjà ouvert, ou ouvre la fenêtre autrement.

function! s:Run0() 
    call lh#buffer#jump('/path/to/pro12.exe.output', 'vsp') 
    silent exe '!ls' 
endfunction 

Compte tenu de la demande « de définir une fonction qui ouvrirait une division verticale », on pourrait simplement utiliser:

function! s:Run1() 
    let bn = bufnr('/path/to/pro12.exe.output') 
    if bn >= 0 
    exe 'bw '.bn 
    endif 
    silent exe '!pro12' 
    vsp /path/to/pro12.exe.output 
endfunction 
nnoremap µ :call <sid>Run1()<cr> 

La dernière chose. Si comme je le soupçonne Pro12 écrit stdout (la sortie standard, à savoir ~ la console), les deux dernières lignes de la fonction deviennent:

vsp /path/to/pro12.exe.output 
r!pro12 

Le « /path/to/pro12.exe.output » peut être remplacé par quelque chose d'unique. Typiquement, j'utiliserais un tampon scratch avec un nom unique ayant "résultat pro12" dedans.

PS: si la fonction (ce qui est important) que vous ajoutez un

nnoremap <buffer> q :bw<cr> 

vous serez en mesure de simplement quitter la fenêtre de sortie simplement en appuyant sur q, depuis la fenêtre de sortie.

Questions connexes