Festlegen von VIM-Optionen nur für Dateien in einem bestimmten Verzeichnisbaum?

15

Es ist ein Programmier Projekt arbeite ich an , wo alle anderen eine tabsize von 4 verwendet, so dass ich es am einfachsten finden set tabstop=4in meinem ~/.vimrc. Ich würde es jedoch vorziehen, nicht jede Datei, die ich bearbeite, zu beeinflussen - nur die für dieses Projekt - sagen wir, jede Datei in einem bestimmten Verzeichnis (und seinen Unterverzeichnissen).

Gibt es eine Möglichkeit, Variablen basierend auf dem Verzeichnispräfix der Datei einfach bedingt festzulegen?

Andrew Ferrier
quelle

Antworten:

19

Zentrale Konfiguration

Wenn es in Ordnung ist, die lokalen Ausnahmen zentral zu konfigurieren, können Sie solche autocmds in Folgendes einfügen ~/.vimrc:

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

Wenn Sie andererseits die spezifische Konfiguration im Projekt speichern möchten (und diese nicht über Modelines in alle Dateien einbetten möchten ), haben Sie die folgenden zwei Optionen:

Lokale Konfiguration mit integrierter Funktionalität

Wenn Sie Vim immer über das Projektstammverzeichnis starten, wird das eingebaute

:set exrc

ermöglicht das Lesen einer .vimrcDatei aus dem aktuellen Verzeichnis. Sie können die :set ts=4 sw=4Befehle dort platzieren.

Lokale Konfiguration über Plugin

Andernfalls benötigen Sie die Hilfe eines Plugins. es gibt mehrere auf vim.org; Ich kann das localrc-Plugin empfehlen , das sogar die Konfiguration lokaler Dateitypen ermöglicht.

Beachten Sie, dass das Lesen der Konfiguration aus dem Dateisystem Auswirkungen auf die Sicherheit hat. Sie möchten vielleicht :set secure.

Ingo Karkat
quelle
1
Die dritte Lösung (das Plugin) ist exzellent und genau das, wonach ich gesucht habe. Ich versuche zu vermeiden, die Konfiguration zentral zu platzieren, damit Sie recht haben, dass die erste nicht ideal ist. Vielen Dank für eine umfassende Antwort.
Andrew Ferrier
Groß! Ich benutze auch das localrc Plugin; es ist wirklich nützlich.
Ingo Karkat
Falls jemand anderes auf ein Problem mit der autocmdnicht funktionierenden Methode stößt, vergewissern Sie sich, dass Sie keine Symlinks in Ihrem Pfad haben. Ich musste den vollständigen Pfad ohne Symlinks angeben, bevor dies für mich funktionieren würde (unter OS X 10.9).
Dolan Antenucci
4

Sie können vim so konfigurieren, dass weitere Befehle mit dem sourceBefehl (so) gelesen werden . Fügen Sie dies zu Ihrem hinzu ~/.vimrc- es durchsucht das aktuelle Verzeichnis und wenn die .vimrc_proj-Datei nicht gefunden wird, sucht es im übergeordneten Verzeichnis nach .vimrc_proj.

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

Fügen Sie dann benutzerdefinierte Befehle in .vimrc_projKonfigurationsdateien hinzu, die Ihren Projekten entsprechen.

Verdächtiger
quelle
Ich denke, das funktioniert nur, wenn ich mich beim Öffnen der Datei im Projektverzeichnis befinde, oder? Dies behandelt nicht, wo das aktuelle Verzeichnis etwas völlig anderes ist.
Andrew Ferrier
Richtig, das ist eine Einschränkung
suspectus
1

Sie können ein Plugin für Vim verwenden, um das Problem allgemeiner zu lösen, indem Sie versuchen, den Einzug zu erkennen.

Das Plugin der Wahl ist für mich DetectIndent . Es dauerte einige Zeit, bis ich alle Forks des Plugins getestet hatte, um eines zu finden, das meinen Anforderungen entspricht. Das Original war sehr nah dran, aber nicht ganz so, dass ich meine eigene Gabel gemacht habe .

Für das Debuggen ist es sehr hilfreich, :set verbose=1das Plugin erneut mit auszuführen:DetectIndent

ypid
quelle
Ich denke, Sie haben diese Antwort möglicherweise auf die falsche Frage gestellt? Es scheint nicht relevant zu sein.
Andrew Ferrier
@ AndrewFerrier Diese Antwort ist perfekt, sie zeigt nur eine andere Einstellung zum Problem. Anstatt die Tabulatorgröße für bestimmte Dateien festzulegen, können Sie ein Plugin verwenden, um die korrekte Tabulatorgröße für jede Datei zu ermitteln.
Gronostaj
@gronostaj Bei meiner Frage ging es nicht wirklich um das Festlegen der Registerkartengröße, sondern um die Konfiguration pro Verzeichnisbaum - die Registerkartengröße war nur ein Beispiel. Aber ich verstehe, worauf du jetzt hinaus willst, und es ist ein nützlicher Tipp. Vielen Dank.
Andrew Ferrier
0

Eine mögliche Lösung, die noch nicht erwähnt wurde, besteht darin, eine Ebene höher zu gehen und projektspezifische Shell-Skripte zu implementieren, um Ihre vim-Umgebung zu starten.

Dadurch können vim-spezifische Einstellungen mithilfe der -SBefehlszeilenoption übergeben werden. Dies bietet den Vorteil, dass auch andere Aspekte der Umgebung konfiguriert werden können, z. B. die Terminal- oder Cscope-Einstellungen.

Angenommen, ich habe ein C ++ - Projekt mit dem Namen foo, für das ich die vim-Einstellungen der Datei laden möchte ~/.vim/projects/foo.vim. Ich möchte auch einen cscope-Index einrichten und ein Terminalfenster starten, wenn der Befehl über ein Schnellstart-Tool oder eine Desktop-Verknüpfung aufgerufen wird. Um meine Umgebung zu öffnen, habe ich das folgende Skript mit dem Namen 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
quelle