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')?
3 Réponses :
Il existe quelques techniques:
'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')"
'includeexpr'
Peut utiliser une substitution pour développer les variables d'environnement
set path=.,$tcl_lib,, let &l:includeexpr="substitute(v:fname, '^/', '', 'g')"
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).
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')"
Pouvez-vous modifier pour utiliser la mise en forme du code et donner plus d'explications dans votre réponse?
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)
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'.