Czy ustawiasz opcje vima tylko dla plików w określonym drzewie katalogów?

15

Jest projekt programistyczny, nad którym pracuję, gdzie wszyscy inni używają tabsize 4, więc uważam to za najprostsze set tabstop=4w moim ~/.vimrc. Wolałbym jednak, aby nie miało to wpływu na każdy plik, który edytuję - tylko te dla tego projektu - powiedzmy każdy plik w określonym katalogu (i jego podkatalogach).

Czy istnieje sposób, w jaki mogę łatwo warunkowo ustawić zmienne na podstawie prefiksu katalogu w pliku?

Andrew Ferrier
źródło
stackoverflow.com/questions/1889602/multiple-vim-configurations
Ciro Santilli 事件 改造 中心 法轮功 六四 事件

Odpowiedzi:

19

Centralna konfiguracja

Jeśli centralne skonfigurowanie lokalnych wyjątków jest w porządku, możesz umieścić takie autocmds w ~/.vimrc:

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

Z drugiej strony, jeśli chcesz, aby konkretna konfiguracja była przechowywana w projekcie (i nie chcesz osadzać jej we wszystkich plikach za pomocą modelin ), masz dwie następujące opcje:

Lokalna konfiguracja z wbudowanymi funkcjami

Jeśli zawsze uruchamiasz Vima z katalogu głównego projektu, wbudowane

:set exrc

umożliwia odczyt .vimrcpliku z bieżącego katalogu. Możesz tam umieścić :set ts=4 sw=4polecenia.

Lokalna konfiguracja poprzez wtyczkę

W przeciwnym razie potrzebujesz pomocy wtyczki; jest ich kilka na vim.org; Mogę polecić wtyczkę localrc , która pozwala nawet na konfigurację specyficzną dla lokalnego typu pliku.

Pamiętaj, że odczyt konfiguracji z systemu plików ma wpływ na bezpieczeństwo; możesz chcieć :set secure.

Ingo Karkat
źródło
1
Trzecie rozwiązanie (wtyczka) jest doskonałe i dokładnie tego szukałem. Staram się unikać centralnego konfigurowania konfiguracji, więc masz rację, że pierwsza nie jest idealna. Dzięki za wyczerpującą odpowiedź.
Andrew Ferrier
Świetny! Używam również wtyczki localrc; to jest naprawdę przydatne.
Ingo Karkat
Na wypadek, gdyby ktoś napotkał problem z autocmdniedziałającą metodą, upewnij się, że nie masz żadnych dowiązań symbolicznych na swojej ścieżce - musiałem podać pełną ścieżkę bez żadnych dowiązań symbolicznych, zanim zadziała dla mnie (w OS X 10.9)
Dolan Antenucci
4

Możesz skonfigurować vima do odczytywania kolejnych poleceń za pomocą polecenia source(so). Dodaj to do swojego ~/.vimrc- przeszukuje bieżący katalog, a jeśli nie znaleziono pliku .vimrc_proj, szuka .vimrc_proj w katalogu nadrzędnym.

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

Następnie dodaj dowolne niestandardowe polecenia w .vimrc_projplikach konfiguracyjnych do swoich projektów.

podejrzenie
źródło
Myślę, że to działa tylko wtedy, gdy jestem w katalogu projektu, kiedy otwieram plik, prawda? Nie obsługuje to sytuacji, w której bieżący katalog jest czymś zupełnie innym.
Andrew Ferrier
Zgadza się, to jest ograniczenie
podejrzenie
1

Możesz użyć wtyczki dla Vima, aby rozwiązać problem w bardziej ogólny sposób, próbując wykryć wcięcie.

Dla mnie wtyczką jest DetectIndent . Zajęło mi trochę czasu przetestowanie wszystkich rozwidleń wtyczki, aby znaleźć taki, który odpowiada moim potrzebom. Oryginalny był bardzo blisko, ale nie całkiem, więc zrobiłem własny widelec .

Do debugowania bardzo pomocne jest :set verbose=1ponowne uruchomienie wtyczki:DetectIndent

ypid
źródło
Myślę, że mogłeś postawić tę odpowiedź na niewłaściwe pytanie? To nie wydaje się istotne.
Andrew Ferrier
@AndrewFerrier Ta odpowiedź jest doskonale na miejscu, przedstawia jedynie inne podejście do problemu. Zamiast ustawiać rozmiar tabulatora dla określonych plików, możesz użyć wtyczki do wykrycia prawidłowego rozmiaru tabulatora dla każdego pliku.
gronostaj
@gronostaj moje pytanie tak naprawdę nie dotyczyło ustawiania rozmiarów tabulatorów, dotyczyło konfiguracji drzewa katalogów dla poszczególnych katalogów - rozmiar tabulatorów był tylko przykładem. Ale widzę, o co ci chodziło i jest to przydatna wskazówka. Dzięki.
Andrew Ferrier,
0

Jednym z możliwych rozwiązań, o którym jeszcze nie wspomniano, jest przejście o jeden poziom wyżej i zaimplementowanie skryptów powłoki specyficznych dla projektu, aby uruchomić środowisko vim.

Umożliwia to przekazywanie ustawień specyficznych dla vima przy użyciu opcji -Swiersza poleceń. Zaletą jest to, że pozwala również konfigurować inne aspekty środowiska, takie jak ustawienia terminala lub cscope.

Na przykład, powiedzmy, że mam projekt C ++ foo, dla którego chcę załadować ustawienia pliku vim ~/.vim/projects/foo.vim. Chcę również skonfigurować indeks cscope i uruchomić okno terminala, jeśli polecenie zostanie wywołane z jakiegoś narzędzia szybkiego uruchamiania lub skrótu na pulpicie. Aby otworzyć moje środowisko, mam następujący skrypt o nazwie 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
źródło