Definir opções do vim apenas para arquivos em uma determinada árvore de diretórios?


15

Há um projeto de programação em que trabalho, onde todo mundo usa uma tabsize de 4, então acho isso mais direto set tabstop=4no meu ~/.vimrc. No entanto, prefiro que isso não afete todos os arquivos editados - apenas os deste projeto - digamos que todos os arquivos em um determinado diretório (e seus subdiretórios).

Existe uma maneira de eu facilmente definir variáveis ​​condicionalmente com base no prefixo de diretório do arquivo?


Respostas:


19

Configuração central

Se não há problema em configurar as exceções locais centralmente, você pode colocar esses autocmds no seu ~/.vimrc:

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

Por outro lado, se você deseja que a configuração específica seja armazenada com o projeto (e não deseja incorporar isso em todos os arquivos via modelines ), você tem as duas opções a seguir:

Configuração local com funcionalidade incorporada

Se você sempre iniciar o Vim a partir do diretório raiz do projeto, o

:set exrc

permite a leitura de um .vimrcarquivo do diretório atual. Você pode colocar os :set ts=4 sw=4comandos lá.

Configuração local através do plugin

Caso contrário, você precisa da ajuda de um plugin; existem vários no vim.org; Posso recomendar o plug-in localrc , que permite até a configuração específica do tipo de arquivo local.

Observe que a leitura da configuração do sistema de arquivos tem implicações de segurança; você pode querer :set secure.


1
A terceira solução (o plugin) é excelente, e exatamente o tipo de coisa que eu estava procurando. Estou tentando evitar colocar a configuração centralmente, então você está certo que o primeiro não é o ideal. Obrigado por uma resposta abrangente.
Andrew Ferrier 23/05

Ótimo! Eu também uso o plugin localrc; é realmente útil.
Ingo Karkat 23/05

Caso alguém encontre um problema com o autocmdmétodo que não está funcionando, verifique se não há links simbólicos no caminho - tive que colocar o caminho completo sem links simbólicos antes que funcionasse para mim (no OS X 10.9)
Dolan Antenucci

4

Você pode configurar o vim para ler outros comandos usando o sourcecomando (so). Adicione isso ao seu ~/.vimrc- ele pesquisará o diretório atual e, se o arquivo .vimrc_proj não encontrado, pesquisará .vimrc_proj no diretório pai.

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

Em seguida, adicione qualquer comando personalizado nos .vimrc_projarquivos de configuração para se adequar aos seus projetos.


Eu acho que só funciona se eu estiver no diretório do projeto quando abro o arquivo, certo? Isso não controla onde o diretório atual é algo completamente diferente.
Andrew Ferrier

Correta, que é uma limitação
suspectus

1

Você pode usar um plug-in para o Vim para resolver o problema de uma maneira mais geral, tentando detectar o recuo.

O plugin de minha escolha é o DetectIndent . Demorou algum tempo para eu testar todos os garfos do plug-in para encontrar um que atendesse às minhas necessidades. O original estava muito próximo, mas não exatamente, então eu fiz meu próprio garfo .

Para depuração, é muito útil :set verbose=1executar o plugin novamente com:DetectIndent


Eu acho que você pode ter colocado esta resposta na pergunta errada? Não parece relevante.
Andrew Ferrier

@AndrewFerrier Esta resposta está perfeitamente correta, apenas apresenta uma atitude diferente em relação ao problema. Em vez de definir o tamanho da guia para arquivos específicos, você pode usar um plug-in para detectar o tamanho correto da guia para cada arquivo.
Gronostaj

@gronostaj minha pergunta não era sobre definir tamanhos de guias, era sobre configuração por árvore de diretório - o tamanho da guia era apenas um exemplo. Mas vejo o que você estava recebendo agora e é uma dica útil. Obrigado.
Andrew Ferrier

0

Uma solução possível que ainda não foi mencionada é subir um nível acima e implementar scripts de shell específicos do projeto para iniciar o seu ambiente vim.

Isso permite que configurações específicas do vim sejam aprovadas usando a -Sopção de linha de comando. A vantagem é que ele também permite configurar outros aspectos do ambiente, como as configurações do terminal ou do cscope.

Por exemplo, digamos que eu tenha um projeto C ++ chamado foo, para o qual desejo carregar as configurações do vim do arquivo ~/.vim/projects/foo.vim. Também quero configurar um índice cscope e iniciar uma janela de terminal se o comando for chamado de alguma ferramenta de inicialização rápida ou atalho na área de trabalho. Para abrir meu ambiente, tenho o seguinte script, chamado 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.