Définir les options vim uniquement pour les fichiers d'une certaine arborescence de répertoires?

15

Il y a un projet de programmation sur lequel je travaille où tout le monde utilise une taille de tabulation de 4, donc je le trouve le plus simple set tabstop=4dans mon ~/.vimrc. Cependant, je préfère que cela n'affecte pas tous les fichiers que je modifie - uniquement ceux de ce projet - disons chaque fichier dans un certain répertoire (et ses sous-répertoires).

Existe-t-il un moyen de définir facilement des variables de manière conditionnelle en fonction du préfixe de répertoire du fichier?

Andrew Ferrier
la source
stackoverflow.com/questions/1889602/multiple-vim-configurations
Ciro Santilli 19 改造 中心 法轮功 六四 事件

Réponses:

19

Configuration centrale

Si vous pouvez configurer les exceptions locales de manière centralisée, vous pouvez placer ces autocmds dans votre ~/.vimrc:

:autocmd BufRead,BufNewFile /path/to/dir/* setlocal ts=4 sw=4

D'un autre côté, si vous voulez que la configuration spécifique soit stockée avec le projet (et que vous ne voulez pas l'intégrer dans tous les fichiers via des modelines ), vous avez les deux options suivantes:

Configuration locale avec fonctionnalité intégrée

Si vous démarrez toujours Vim à partir du répertoire racine du projet, le

:set exrc

permet la lecture d'un .vimrcfichier depuis le répertoire courant. Vous pouvez y placer les :set ts=4 sw=4commandes.

Configuration locale via le plugin

Sinon, vous avez besoin de l'aide d'un plugin; il y en a plusieurs sur vim.org; Je peux recommander le plugin localrc , qui permet même une configuration locale spécifique au type de fichier .

Notez que la lecture de la configuration à partir du système de fichiers a des implications de sécurité; vous voudrez peut-être :set secure.

Ingo Karkat
la source
1
La troisième solution (le plugin) est excellente, et exactement le genre de chose que je cherchais. J'essaie d'éviter de mettre la configuration au centre, vous avez donc raison que la première n'est pas idéale. Merci pour une réponse complète.
Andrew Ferrier
Génial! J'utilise également le plugin localrc; c'est vraiment utile.
Ingo Karkat
Dans le cas où quelqu'un d'autre rencontrerait un problème de autocmdméthode qui ne fonctionne pas, assurez-vous que vous n'avez pas de lien symbolique sur votre chemin - j'ai dû mettre le chemin complet sans lien symbolique avant qu'il ne fonctionne pour moi (sur OS X 10.9)
Dolan Antenucci du
4

Vous pouvez configurer vim pour lire d'autres commandes à l'aide de la commande source(so). Ajoutez ceci à votre ~/.vimrc- il recherche le répertoire courant et si le fichier .vimrc_proj est introuvable, il recherche .vimrc_proj dans le répertoire parent.

if filereadable(".vimrc_proj")
    so .vimrc_proj
else
    if filereadable("../.vimrc_proj")
         so .vimrc_proj
    endif
endif

Ajoutez ensuite toutes les commandes personnalisées dans les .vimrc_projfichiers de configuration en fonction de vos projets.

suspect
la source
Je pense que cela ne fonctionne que si je suis dans le répertoire du projet lorsque j'ouvre le fichier, non? Cela ne gère pas où le répertoire actuel est quelque chose de complètement différent.
Andrew Ferrier
C'est exact, c'est une limitation
suspectus
1

Vous pouvez utiliser un plugin pour Vim pour résoudre le problème d'une manière plus générale en essayant de détecter l'indentation.

Le plugin de choix pour moi est DetectIndent . Il m'a fallu un certain temps pour tester toutes les fourches du plugin pour en trouver une qui correspond à mes besoins. L'original était vraiment proche mais pas tout à fait donc j'ai fait ma propre fourche .

Pour le débogage, il est très utile de :set verbose=1relancer le plugin avec:DetectIndent

ypid
la source
Je pense que vous avez peut-être mis cette réponse sur la mauvaise question? Cela ne semble pas pertinent.
Andrew Ferrier
@AndrewFerrier Cette réponse est parfaitement en place, elle présente simplement une attitude différente face au problème. Au lieu de définir la taille de l'onglet pour des fichiers spécifiques, vous pouvez utiliser un plugin pour détecter la taille d'onglet correcte pour chaque fichier.
gronostaj
@gronostaj ma question ne portait pas vraiment sur la définition des tailles d'onglets, mais sur la configuration par arborescence de répertoires - la taille des onglets n'était qu'un exemple. Mais je vois où vous vouliez en venir, et c'est un conseil utile. Merci.
Andrew Ferrier
0

Une solution possible qui n'a pas encore été mentionnée est d'aller un niveau au-dessus et d'implémenter des scripts shell spécifiques au projet pour lancer votre environnement vim.

Cela permet aux paramètres spécifiques à vim d'être passés à l'aide de l' -Soption de ligne de commande. L'avantage est qu'il permet également de configurer d'autres aspects de l'environnement, tels que les paramètres du terminal ou du cscope.

Par exemple, disons que j'ai un projet C ++ appelé foo, pour lequel je veux charger les paramètres vim du fichier ~/.vim/projects/foo.vim. Je veux également configurer un index cscope et lancer une fenêtre de terminal si la commande est invoquée à partir d'un outil de lancement rapide ou d'un raccourci sur le bureau. Pour ouvrir mon environnement, j'ai le script suivant, appelé vim-foo:

#!/bin/bash

# Script to setup the VIM development environment of my "foo" project
# Includes building ctags and cscope databases.

VIM_CONFIG=$HOME/.vim/projects/foo.vim
BASE_DIR=$HOME/work/foo

function setup_cscope()
{
    CSCOPE_FILES=$BASE_DIR/cscope.files

    created_files=false

    # check if global cscope.files exist
    if [ ! -f $CSCOPE_FILES ]; then
        echo "Creating cscope.files"
        find $BASE_DIR/src -name '*.cpp' -o -name '*.h' >> $CSCOPE_FILES
        created_files=true
    fi

    # create cscope database
    if [ $created_files ] || \ 
        [ ! -f $BASE_DIR/cscope.in.out ] || \
        [ ! -f $BASE_DIR/cscope.po.out ] || \
        [ ! -f $BASE_DIR/cscope.out ]; then
            echo "Creating cscope database"
            cscope -b -q -i $CSCOPE_FILES
            for f in in.out po.out out; do
                mv cscope.$f $BASE_DIR/
            done
    fi

    export CSCOPE_DB=$BASE_DIR/cscope.out
}

# setup everything and finally launch vim
setup_cscope
cd $BASE_DIR
if [[ $TERM == "rxvt-unicode" ]]; then
    vim -S $VIM_CONFIG
else
    urxvt -e vim -S $VIM_CONFIG
fi
Caetano Sauer
la source