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

14

Existe um projeto de programação no qual eu trabalho, onde todo mundo usa um tamanho de tabs de 4, então acho que é mais direto para set tabstop=4 no meu ~/.vimrc . No entanto, eu prefiro não ter isso afetar todos os arquivos que eu edito - apenas aqueles para este projeto - digamos que todos os arquivos em um determinado diretório (e seus subdiretórios).

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

    
por Andrew Ferrier 23.05.2013 / 12:05

4 respostas

17

Configuração Central

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

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

Por outro lado, se você quer a configuração específica armazenada com o projeto (e não quer embutir isto em todos os arquivos via modelines ), você tem as seguintes duas opções:

Configuração local com funcionalidade integrada

Se você sempre inicia o Vim a partir do diretório raiz do projeto, o built-in

:set exrc

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

Configuração local por meio do plug-in

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 configuração de leitura do sistema de arquivos tem implicações de segurança; você pode querer :set secure .

    
por 23.05.2013 / 12:54
4

Você pode configurar o vim para ler mais comandos usando o comando source (so). Adicione isto ao seu ~/.vimrc - ele procura no diretório atual e se o arquivo .vimrc_proj não encontrado lá procura por .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 todos os comandos personalizados em .vimrc_proj config files para atender aos seus projetos.

    
por 23.05.2013 / 12:43
1

Você pode usar um plugin para o Vim para resolver o problema de uma forma mais geral, tentando detectar o recuo.

O plugin de escolha para mim é DetectIndent . Demorei algum tempo para testar todos os garfos do plugin e encontrar um que atendesse às minhas necessidades. O original estava muito perto, mas não tão bem que fiz o meu garfo próprio .

Para depuração, é muito útil para :set verbose=1 e executar o plug-in novamente com :DetectIndent

    
por 25.05.2013 / 22:30
0

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

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

Por exemplo, digamos que eu tenha um projeto em C ++ chamado foo , para o qual eu quero carregar as configurações do vim do arquivo ~/.vim/projects/foo.vim . Eu também quero configurar um índice cscope e iniciar uma janela de terminal se o comando for invocado a partir de alguma ferramenta de inicialização rápida ou atalho na área de trabalho. Para abrir meu ambiente, eu 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
    
por 04.09.2014 / 13:26

Tags