Vim seçeneklerini yalnızca belirli bir dizin ağacındaki dosyalar için mi ayarlıyorsunuz?


15

Ben o en basit bulmak o kadar herkes, 4 kişilik bir tabsize kullandığı yere bir programlama projesi ben iş var set tabstop=4skinTenimde ~/.vimrc. Ancak, bu düzenlediğim her dosyayı etkilemeyi tercih etmemeyi tercih ediyorum - sadece bu proje için olanlar - diyelim ki belirli bir dizindeki (ve alt dizinlerindeki) her dosya.

Dosyanın dizin önekine göre değişkenleri kolayca koşullu olarak ayarlayabileceğim bir yol var mı?


Yanıtlar:


19

Merkezi konfigürasyon

O merkezi yerel istisnalarını yapılandırmak için sorun olmazsa aşağıdaki konularda bu tür autocmds koyabilirsiniz ~/.vimrc:

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

Öte yandan, belirli yapılandırmanın proje ile depolanmasını istiyorsanız (ve bunu model dosyaları aracılığıyla tüm dosyalara gömmek istemiyorsanız ), aşağıdaki iki seçeneğiniz vardır:

Yerleşik işlevselliğe sahip yerel yapılandırma

Vim'i her zaman proje kök dizininden başlatırsanız, yerleşik

:set exrc

.vimrcgeçerli dizinden bir dosyanın okunmasını sağlar . Yerleştirebilirsiniz:set ts=4 sw=4Komutları .

Eklenti aracılığıyla yerel yapılandırma

Aksi takdirde, bir eklentinin yardımına ihtiyacınız vardır; vim.org'da birkaç tane var; Ben tavsiye edebilir localrc eklentisi , hatta yerel filetype özgü konfigürasyon sağlayan.

Dosya sisteminden yapılan yapılandırmanın okunmasının güvenlikle ilgili sonuçları olduğunu unutmayın; isteyebilirsiniz :set secure.


1
Üçüncü çözüm (eklenti) mükemmel ve tam olarak aradığım şey. Yapılandırmayı merkezi olarak yerleştirmekten kaçınmaya çalışıyorum, bu yüzden ilkinin ideal olmadığı konusunda haklısınız. Kapsamlı bir cevap için teşekkürler.
Andrew Ferrier

Harika! Ayrıca localrc eklentisini kullanıyorum; gerçekten kullanışlı.
Ingo Karkat

Başka birinin autocmdçalışmadığı bir yöntemle ilgili bir sorunla karşılaşması durumunda, yolunuzda herhangi bir sembolik bağlantınızın olmadığından emin olun.
Dolan Antenucci

4

Vim'i source(so) komutunu kullanarak diğer komutları okuyacak şekilde yapılandırabilirsiniz . Bunu kendinize ekleyin ~/.vimrc- geçerli dizinde arama yapar ve .vimrc_proj dosyası bulunmazsa, üst dizinde .vimrc_proj dosyasını arar.

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

Ardından, .vimrc_projyapılandırma dosyalarına projelerinize uyacak şekilde özel komutlar ekleyin .


Sadece dosyayı açtığımda projenin dizinindeysem işe yaradığını düşünüyorum, değil mi? Bu, geçerli dizinin tamamen farklı bir şey olduğu yerleri ele almaz.
Andrew Ferrier

Doğru, bu bir sınırlama
şüpheli

1

Girintiyi tespit etmeye çalışarak sorunu daha genel bir şekilde çözmek için Vim için bir eklenti kullanabilirsiniz.

Benim için tercih edilen eklenti DetectIndent . Benim eklentinin tüm çatalları test etmek benim için biraz zaman aldı benim ihtiyaçlarına uygun bir tane bulmak için. Orijinali gerçekten yakındı ama tam olarak o kadar değil kendi çatalımı yaptım .

Hata ayıklama :set verbose=1için eklentiyi tekrar çalıştırmak ve çalıştırmak çok yararlıdır.:DetectIndent


Sanırım bu cevabı yanlış soruya vermiş olabilirsiniz? Alakalı görünmüyor.
Andrew Ferrier

@AndrewFerrier Bu cevap mükemmel bir şekilde yerinde, sadece soruna farklı bir tutum sergiliyor. Belirli dosyalar için sekme boyutunu ayarlamak yerine, her dosya için doğru sekme boyutunu algılamak için bir eklenti kullanabilirsiniz.
gronostaj

@gronostaj sorum gerçekten sekme boyutlarını ayarlamakla ilgili değildi, dizin başına ağaç yapılandırmasıyla ilgiliydi - sekme boyutu sadece bir örnektir. Ama şu anda ne elde ettiğinizi görüyorum ve bu yararlı bir ipucu. Teşekkürler.
Andrew Ferrier

0

Henüz bahsedilmeyen olası bir çözüm, bir seviye yukarı çıkmak ve vim ortamınızı ateşlemek için projeye özgü kabuk komut dosyaları uygulamaktır.

Bu, vim'e özgü ayarların -Skomut satırı seçeneği kullanılarak geçirilmesine izin verir . Avantajı, terminal veya cscope ayarları gibi ortamın diğer yönlerinin yapılandırılmasına da izin vermesidir.

Örneğin foo, dosyanın vim ayarlarını yüklemek istediğim bir C ++ projem olduğunu varsayalım ~/.vim/projects/foo.vim. Ayrıca komut bir hızlı başlatma aracından veya masaüstü kısayolundan çağrılırsa bir cscope dizini ayarlamak ve bir terminal penceresi başlatmak istiyorum. Ortamımı açmak için şu komut dosyasına sahibim 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.