2015-12-23 1 views
0

j'ai indexé mon C++ codebase avec ctags, je peux ouvrir un fichier d'en-tête comme suit:VIM ouvert c fichier d'en-tête de ++ en division verticale en combinant trois commandes

:tag myfile.h 

(Peu importe où MYFILE.H est situé, tant qu'il est à l'intérieur du code de base indexé il correctement ouvert dans vim)

Quand je l'édition d'un C++ fichier, je peux obtenir le nom du fichier d'en-tête comme suit:

:e%<.h 

par exemple lors de la modification de myfile.cpp, l'exécution de cette commande affichera myfile.h sur la ligne de commande.

Un fichier peut être ouvert en division verticale, par l'émission:

:vs <myfile> 

Maintenant ce que je veux accomplir, est d'avoir une commande ou une fonction que je peux utiliser pour ouvrir un fichier d'en-tête du correspondant Fichier C++ que je suis en train d'éditer en split vertical. Par conséquent, fondamentalement, je veux combiner les 3 commandes ci-dessus comme si je serais en train de faire une pipe Unix, par exemple:

:vs tag | e%<.h 

" :vs  to open file in vertical split 
" :tag to find tag 
" :e%<.h to get header filename 

Il est évident que le tuyau Unix ne fonctionne pas sur vim, sinon j'ai essayé d'écrire une fonction à laquelle j'assigne le résultat d'une commande à une variable, par exemple

headerFileName = :e%<.h 

Ce qui est apparemment pas la bonne façon de le faire, je suis un peu perdu ici, donc j'espère que quelqu'un peut apporter une aide.

Répondre

3

Il existe plusieurs plugins qui le font déjà (sans avoir besoin d'une base de données BTW).

Par exemple, avec autre (alias a.vim), il vous suffit de taper :VS à partir du fichier d'en-tête ou le fichier source pour ouvrir l'autre dans une fenêtre partagée verticalement.

Notez que alternatif ont une option de dire où trouver l'autre fichier (même répertoire, substitute le nom du répertoire, ...)

Sinon, je soupçonne que vous cherchez expand() et :exe. Si vous écrivez une fonction, elle peut être

function! s:whatever() abort 
    let crt = expand('%:t:r') 
    vnew 
    exe 'tag '.crt.'.h' 
endfunction 
command! whatever call s:whatever()