Menetapkan opsi vim hanya untuk file di pohon direktori tertentu?


15

Ada proyek pemrograman yang saya kerjakan di mana orang lain menggunakan tabsize 4, jadi saya menemukannya paling mudah set tabstop=4di saya ~/.vimrc. Namun, saya lebih suka tidak memiliki ini mempengaruhi setiap file yang saya edit - hanya yang untuk proyek ini - katakanlah setiap file dalam direktori tertentu (dan subdirektori nya).

Apakah ada cara saya dapat dengan mudah mengatur variabel berdasarkan awalan direktori file?


Jawaban:


19

Konfigurasi pusat

Jika tidak apa-apa untuk mengkonfigurasi pengecualian lokal secara terpusat, Anda dapat memasukkan autocmds tersebut ke ~/.vimrc:

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

Di sisi lain, jika Anda ingin konfigurasi khusus disimpan dengan proyek (dan tidak ingin menanamkan ini di semua file melalui modelines ), Anda memiliki dua opsi berikut:

Konfigurasi lokal dengan fungsionalitas bawaan

Jika Anda selalu memulai Vim dari direktori root proyek, built-in

:set exrc

memungkinkan pembacaan .vimrcfile dari direktori saat ini. Anda dapat menempatkan :set ts=4 sw=4perintah di sana.

Konfigurasi lokal melalui plugin

Jika tidak, Anda memerlukan bantuan plugin; ada beberapa di vim.org; Saya dapat merekomendasikan plugin localrc , yang bahkan memungkinkan konfigurasi spesifik tipe file lokal.

Perhatikan bahwa membaca konfigurasi dari sistem file memiliki implikasi keamanan; Anda mungkin mau :set secure.


1
Solusi ketiga (plugin) sangat bagus, dan persis seperti apa yang saya cari. Saya mencoba untuk menghindari meletakkan konfigurasi secara terpusat, sehingga Anda benar bahwa yang pertama tidak ideal. Terima kasih atas jawaban yang komprehensif.
Andrew Ferrier

Bagus! Saya juga menggunakan plugin localrc; ini sangat berguna.
Ingo Karkat

Jika ada orang lain yang mengalami masalah dengan autocmdmetode yang tidak berfungsi, pastikan Anda tidak memiliki symlink di path Anda - saya harus meletakkan path lengkap tanpa symlink sebelum itu bekerja untuk saya (pada OS X 10.9)
Dolan Antenucci

4

Anda dapat mengkonfigurasi vim untuk membaca perintah lebih lanjut menggunakan perintah source(so). Tambahkan ini ke ~/.vimrc- Anda mencari direktori saat ini dan jika file .vimrc_proj tidak ditemukan di sana mencari .vimrc_proj di direktori induk.

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

Kemudian tambahkan perintah khusus dalam .vimrc_projfile konfigurasi yang sesuai dengan proyek Anda.


Saya pikir itu hanya berfungsi jika saya berada di direktori proyek ketika saya membuka file, kan? Ini tidak menangani di mana direktori saat ini adalah sesuatu yang sangat berbeda.
Andrew Ferrier

Benar, itu adalah batasan
tersangka

1

Anda dapat menggunakan plugin untuk Vim untuk menyelesaikan masalah dengan cara yang lebih umum dengan mencoba mendeteksi indentasi.

Plugin pilihan bagi saya adalah DetectIndent . Butuh beberapa waktu bagi saya untuk menguji semua garpu plugin untuk menemukan yang sesuai dengan kebutuhan saya. Yang asli sangat dekat tetapi tidak begitu saya membuat garpu sendiri .

Untuk debugging, sangat membantu untuk :set verbose=1menjalankan plugin lagi:DetectIndent


Saya pikir Anda mungkin telah meletakkan jawaban ini pada pertanyaan yang salah? Tampaknya tidak relevan.
Andrew Ferrier

@AndrewFerrier Jawaban ini benar-benar ada, itu hanya menyajikan sikap yang berbeda terhadap masalah. Alih-alih mengatur ukuran tab untuk file tertentu, Anda dapat menggunakan plugin untuk mendeteksi ukuran tab yang benar untuk setiap file.
gronostaj

@ gronostaj pertanyaan saya sebenarnya bukan tentang pengaturan ukuran tab, ini tentang konfigurasi per-direktori-pohon - ukuran tab hanyalah sebuah contoh. Tapi saya mengerti apa yang Anda dapatkan sekarang, dan ini adalah tip yang berguna. Terima kasih.
Andrew Ferrier

0

Salah satu solusi yang mungkin belum disebutkan adalah naik satu tingkat di atas dan mengimplementasikan skrip shell khusus proyek untuk menjalankan lingkungan vim Anda.

Ini memungkinkan pengaturan khusus vim untuk dilewatkan menggunakan -Sopsi baris perintah. Keuntungannya adalah ia juga memungkinkan mengkonfigurasi aspek lingkungan lainnya, seperti pengaturan terminal atau cscope.

Sebagai contoh, katakanlah saya memiliki proyek C ++ yang disebut foo, di mana saya ingin memuat pengaturan vim file ~/.vim/projects/foo.vim. Saya juga ingin mengatur indeks cscope dan meluncurkan jendela terminal jika perintah dipanggil dari beberapa alat peluncuran cepat atau pintasan desktop. Untuk membuka lingkungan saya, saya memiliki skrip berikut, yang disebut 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.