¿Establecer opciones de vim solo para archivos en un determinado árbol de directorios?


15

Hay un proyecto de programación en el que trabajo donde todos los demás usan un tamaño de tablatura de 4, por lo que me resulta más sencillo set tabstop=4en mi ~/.vimrc. Sin embargo, prefiero que esto no afecte a todos los archivos que edito, solo aquellos para este proyecto, digamos que todos los archivos en un determinado directorio (y sus subdirectorios).

¿Hay alguna manera de que pueda establecer fácilmente condicionalmente variables basadas en el prefijo de directorio del archivo?


Respuestas:


19

Configuración central

Si está bien configurar las excepciones locales de forma centralizada, puede poner tales autocmds en su ~/.vimrc:

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

Por otro lado, si desea que la configuración específica se almacene con el proyecto (y no desea incrustar esto en todos los archivos a través de modelines ), tiene las dos opciones siguientes:

Configuración local con funcionalidad incorporada

Si siempre inicia Vim desde el directorio raíz del proyecto, el incorporado

:set exrc

permite la lectura de un .vimrcarchivo desde el directorio actual. Puede colocar los :set ts=4 sw=4comandos allí.

Configuración local a través del complemento

De lo contrario, necesita la ayuda de un complemento; hay varios en vim.org; Puedo recomendar el complemento localrc , que incluso permite la configuración específica de tipo de archivo local.

Tenga en cuenta que leer la configuración del sistema de archivos tiene implicaciones de seguridad; es posible que desee :set secure.


1
La tercera solución (el complemento) es excelente, y exactamente el tipo de cosas que estaba buscando. Estoy tratando de evitar poner la configuración centralmente, así que tienes razón en que la primera no es la ideal. Gracias por una respuesta integral.
Andrew Ferrier

¡Excelente! También uso el complemento localrc; Es realmente útil.
Ingo Karkat

En caso de que alguien más se encuentre con un problema de que el autocmdmétodo no funciona, asegúrese de no tener enlaces simbólicos en su ruta; tuve que poner la ruta completa sin enlaces simbólicos antes de que funcionara para mí (en OS X 10.9)
Dolan Antenucci

4

Puede configurar vim para leer más comandos utilizando el sourcecomando (so). Agregue esto a su ~/.vimrc: busca en el directorio actual y si no se encuentra el archivo .vimrc_proj allí, busca .vimrc_proj en el directorio principal.

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

Luego agregue cualquier comando personalizado en los .vimrc_projarchivos de configuración para adaptarse a sus proyectos.


Creo que eso solo funciona si estoy en el directorio del proyecto cuando abro el archivo, ¿verdad? Esto no maneja donde el directorio actual es algo completamente diferente.
Andrew Ferrier

Correcto, eso es una limitación
sospechoso

1

Puede usar un complemento para Vim para resolver el problema de una manera más general al tratar de detectar la sangría.

El complemento de elección para mí es DetectIndent . Me llevó un tiempo probar todas las horquillas del complemento para encontrar uno que se adaptara a mis necesidades. El original estaba muy cerca, pero no del todo, así que hice mi propio tenedor .

Para la depuración es muy útil :set verbose=1volver a ejecutar el complemento con:DetectIndent


Creo que puede haber puesto esta respuesta en la pregunta incorrecta? No parece relevante.
Andrew Ferrier

@AndrewFerrier Esta respuesta está perfectamente en su lugar, solo presenta una actitud diferente al problema. En lugar de establecer el tamaño de pestaña para archivos específicos, puede usar un complemento para detectar el tamaño de pestaña correcto para cada archivo.
gronostaj

@gronostaj mi pregunta no era realmente sobre la configuración de tamaños de pestaña, sino sobre la configuración por árbol de directorios: el tamaño de la pestaña era solo un ejemplo. Pero veo a qué te referías ahora, y es un consejo útil. Gracias.
Andrew Ferrier

0

Una posible solución que aún no se mencionó es ir un nivel más arriba e implementar scripts de shell específicos del proyecto para iniciar su entorno vim.

Esto permite pasar configuraciones específicas de vim mediante la -Sopción de línea de comandos. La ventaja es que también permite configurar otros aspectos del entorno, como la configuración del terminal o cscope.

Por ejemplo, supongamos que tengo un proyecto de C ++ llamado foo, para el que quiero cargar la configuración de vim del archivo ~/.vim/projects/foo.vim. También quiero configurar un índice cscope e iniciar una ventana de terminal si se invoca el comando desde alguna herramienta de inicio rápido o acceso directo de escritorio. Para abrir mi entorno, tengo el siguiente script, llamado 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.