Impostare le opzioni vim solo per i file in un determinato albero di directory?


15

C'è un progetto di programmazione su cui lavoro dove tutti gli altri usano un tabsize di 4, quindi lo trovo più semplice set tabstop=4nel mio ~/.vimrc. Tuttavia, preferirei non avere questo effetto su tutti i file che modifico - solo quelli per questo progetto - diciamo ogni file in una determinata directory (e le sue sottodirectory).

Esiste un modo in cui posso facilmente impostare in modo condizionale le variabili in base al prefisso della directory del file?


Risposte:


19

Configurazione centrale

Se va bene configurare centralmente le eccezioni locali, puoi inserire tali autocmds nel tuo ~/.vimrc:

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

D'altra parte, se si desidera archiviare la configurazione specifica con il progetto (e non si desidera incorporarla in tutti i file tramite modeline ), sono disponibili le due opzioni seguenti:

Configurazione locale con funzionalità integrata

Se avvii sempre Vim dalla directory principale del progetto, quella integrata

:set exrc

abilita la lettura di un .vimrcfile dalla directory corrente. Puoi inserire i :set ts=4 sw=4comandi lì dentro.

Configurazione locale tramite plug-in

Altrimenti, hai bisogno dell'aiuto di un plugin; ce ne sono diversi su vim.org; Posso consigliare il plugin localrc , che consente anche la configurazione specifica del tipo di file locale.

Si noti che la lettura della configurazione dal file system ha implicazioni per la sicurezza; potresti volerlo :set secure.


1
La terza soluzione (il plugin) è eccellente, ed è esattamente il tipo di cosa che stavo cercando. Sto cercando di evitare di mettere la configurazione centralmente, quindi hai ragione che il primo non è l'ideale. Grazie per una risposta esaustiva.
Andrew Ferrier,

Grande! Uso anche il plugin localrc; è veramente utile.
Ingo Karkat,

Nel caso in cui qualcun altro incontri un problema con il autocmdmetodo che non funziona, assicurati di non avere alcun collegamento simbolico nel tuo percorso: ho dovuto inserire il percorso completo senza collegamenti simbolici prima che funzionasse per me (su OS X 10.9)
Dolan Antenucci,

4

Puoi configurare vim per leggere ulteriori comandi usando il sourcecomando (so). Aggiungilo al tuo ~/.vimrc- cerca nella directory corrente e se il file .vimrc_proj non trovato lì cerca .vimrc_proj nella directory padre.

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

Quindi aggiungi eventuali comandi personalizzati nei .vimrc_projfile di configurazione per adattarli ai tuoi progetti.


Penso che funzioni solo se mi trovo nella directory del progetto quando apro il file, giusto? Questo non gestisce dove la directory corrente è qualcosa di completamente diverso.
Andrew Ferrier,

Corretto, questa è una limitazione
suspectus,

1

È possibile utilizzare un plug-in per Vim per risolvere il problema in modo più generale, provando a rilevare il rientro.

Il plugin di scelta per me è DetectIndent . Mi ci è voluto del tempo per testare tutte le forcelle del plugin per trovarne una adatta alle mie esigenze. Quello originale era molto vicino ma non proprio così ho fatto la mia forchetta .

Per il debug è molto utile :set verbose=1ed eseguire nuovamente il plugin con:DetectIndent


Penso che potresti aver posto questa risposta alla domanda sbagliata? Non sembra rilevante.
Andrew Ferrier,

@AndrewFerrier Questa risposta è perfettamente a posto, presenta solo una diversa attitudine al problema. Invece di impostare la dimensione della scheda per file specifici è possibile utilizzare un plug-in per rilevare la dimensione della scheda corretta per ciascun file.
gronostaj,

@gronostaj la mia domanda non riguardava davvero l'impostazione delle dimensioni delle schede, si trattava della configurazione dell'albero per directory - la dimensione delle schede era solo un esempio. Ma vedo cosa stavi ottenendo adesso, ed è un suggerimento utile. Grazie.
Andrew Ferrier,

0

Una possibile soluzione che non è stata ancora menzionata è quella di passare al livello superiore e implementare script shell specifici del progetto per accendere il tuo ambiente VIM.

Ciò consente di passare le impostazioni specifiche di VIM utilizzando l' -Sopzione della riga di comando. Il vantaggio è che consente anche di configurare altri aspetti dell'ambiente, come le impostazioni del terminale o di cscope.

Ad esempio, supponiamo che abbia un progetto C ++ chiamato foo, per il quale voglio caricare le impostazioni vim del file ~/.vim/projects/foo.vim. Voglio anche impostare un indice cscope e avviare una finestra terminale se il comando viene invocato da uno strumento di avvio rapido o da un collegamento sul desktop. Per aprire il mio ambiente, ho il seguente script, chiamato 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.