1
votes

Faire comprendre à vim les variables d'environnement de script tcl (commande 'gf')

J'utilise souvent gf dans vim pour ouvrir des fichiers sous le curseur. Souvent, ces chemins de fichiers utilisent des variables d'environnement, mais dans les fichiers de script .tcl, vim ne peut pas utiliser la variable d'environnement.

Cela fonctionne pour gf:

:set isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,=,{,},(,)
:set isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,=,{,},40-41

:set includeexpr=substitute(v:fname,'\$env(\([^)]\+\))','\$\1','')

Celles-ci ne fonctionnent PAS pour gf:

$env(tcl_lib)/myfile.tcl
$::env(tcl_lib)/myfile.tcl

Voici quelques-unes des choses que j'ai essayées:

$tcl_lib/myfile.tcl

Y a-t-il un moyen de faire vim comprendre la syntaxe des variables d'environnement dans les scripts tcl (spécifiquement pour la commande 'gf')?


4 commentaires

Pouvez-vous simplement ajouter $ tcl_lib à votre 'chemin' ? par exemple. setlocal path =., $ tcl_lib ,


@PeterRincker J'aurais besoin de supprimer le '$ env (tcl_lib) /' dans la source et la source serait alors cassée.


En théorie, vous pouvez laisser 'isfname' seul et ajouter simplement $ tcl_lib à 'path' . Si vous changez 'isfname' alors vous avez raison, vous devrez supprimer ou lire $ env (..) comme des structures.


@PeterRincker J'ai inversé le nom isf, mais je vois toujours le début '/' et regarde dans le répertoire racine au lieu de 'path'.


3 Réponses :


2
votes

Il existe quelques techniques:

Définissez 'chemin' & 'includeexpr'

En théorie, vous pouvez simplement ajouter $ tcl_lib au chemin. par exemple. set path =., $ tcl_lib , . Cependant, tout nom de fichier commençant par / échouera. Cela peut être résolu en supprimant le / de départ .

Ajouter à ~ / .vim / after / ftplugin / tcl.vim :

let l:includeexpr = "substitute(v:fname, '$\\%(::\\)\\=env(\\([^)]*\\))', '\\=expand(\"$\".submatch(1))', 'g')"

Lecture des variables d'environnement via 'includeexpr'

Peut utiliser une substitution pour développer les variables d'environnement

set path=.,$tcl_lib,,
let &l:includeexpr="substitute(v:fname, '^/', '', 'g')"


2 commentaires

Je pense que le second est très proche mais cela ne fonctionne pas encore tout à fait pour moi. Pouvez-vous expliquer un peu plus ce qu'il fait. Plus précisément le \% et le premier \ = pour que je puisse déboguer un peu plus? BTW, cela fonctionne : echo substitute ('$ :: env (tcl_lib) /myfile.tcl', '$ \% (:: \) \ = env (\ ([^) ‌] * \) ) ',' \ = expand ("$" ‌ .submatch (1)) ',' g ') C'est donc quelque chose avec les guillemets supplémentaires ou le let ou ...


La fuite était terminée. \ = exécutera une expression Vim comme remplacement (alias sous-remplacement-expression).



0
votes

L'ajout de moins de 2 lignes dans ~ / .vimrc fonctionnera pour moi.

set isfname+={,},(,),:
let &l:includeexpr = "substitute(v:fname,'$\\%(::\\)\\=env(\\([^)]*\\))','\\=expand(\"$\".submatch(1))', 'g')"


1 commentaires

Pouvez-vous modifier pour utiliser la mise en forme du code et donner plus d'explications dans votre réponse?



0
votes

Enfin, je suis revenu à cela et j'ai pu le résoudre d'une assez bonne manière. Ajoutez le fichier tcl.vim suivant à votre ~ / .vim / ftplugin et votre "gf" devrait fonctionner!

https://github.com/stephenmm/dotfiles/blob/master/vim/ftplugin/tcl.vim

" Add charecters to possible filename types so vim will recognize:
"    $::env(THIS)/as/a/file.tcl
set isfname+={,},(,),:

" Turn the string into something vim knows as a filename:
"    $::env(THIS)/as/a/file.tcl => ${THIS}/as/a/file.tcl
function! TclGfIncludeExpr(fname)
  if a:fname =~? '\$\(::\)\?env([^)]\+)'
    return substitute(a:fname, '\$\(::\)\?env(\([^)]\+\))', '${\2}', 'g')
  endif
  return a:fname
endfunction

" Tie the function to includeexpr
set includeexpr=TclGfIncludeExpr(v:fname)    


0 commentaires