14

Есть программный проект, над которым я работаю, где все остальные используют размер табуляции 4, поэтому мне set tabstop=4 в моем ~/.vimrc . Тем не менее, я бы предпочел, чтобы это не влияло на каждый файл, который я редактирую - только файлы для этого проекта - скажем, каждый файл в определенном каталоге (и его подкаталогах).

Есть ли способ, которым я могу легко установить переменные на основе префикса каталога файла?

4 ответа4

17

Центральная конфигурация

Если вы можете централизованно настроить локальные исключения, вы можете поместить такие autocmds в ваш ~/.vimrc:

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

С другой стороны, если вы хотите, чтобы конкретная конфигурация сохранялась вместе с проектом (и не хотите встраивать ее во все файлы с помощью modelines), у вас есть следующие две опции:

Локальный конфиг со встроенным функционалом

Если вы всегда запускаете Vim из корневого каталога проекта, встроенный

:set exrc

включает чтение файла .vimrc из текущего каталога. Вы можете поместить туда команды :set ts=4 sw=4 .

Локальный конфиг через плагин

В противном случае вам нужна помощь плагина; на vim.org их несколько; Я могу порекомендовать плагин localrc, который разрешает даже локальную настройку файлового типа .

Обратите внимание, что чтение конфигурации из файловой системы имеет последствия для безопасности; Вы можете захотеть :set secure .

4

Вы можете настроить vim для чтения других команд, используя команду source (so). Добавьте это к вашему ~/.vimrc - он ищет текущий каталог, и если файл .vimrc_proj не найден, он ищет .vimrc_proj в родительском каталоге.

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

Затем добавьте любые пользовательские команды в конфигурационные файлы .vimrc_proj в соответствии с вашими проектами.

1

Вы можете использовать плагин для Vim, чтобы решить проблему в более общем виде, пытаясь обнаружить отступ.

Выбранный мной плагин - DetectIndent. Мне потребовалось некоторое время, чтобы протестировать все вилки плагина, чтобы найти тот, который соответствует моим потребностям. Оригинальный был очень близко, но не совсем, поэтому я сделал свою собственную вилку.

Для отладки очень полезно :set verbose=1 и снова запустить плагин с помощью :DetectIndent

0

Одним из возможных решений, которое еще не было упомянуто, является переход на один уровень выше и реализация сценариев оболочки для конкретного проекта для запуска среды vim.

Это позволяет передавать специфичные для vim параметры с помощью параметра командной строки -S . Преимущество заключается в том, что он также позволяет настраивать другие аспекты среды, такие как настройки терминала или cscope.

Например, допустим, у меня есть проект на C++ под названием foo , для которого я хочу загрузить настройки vim файла ~/.vim/projects/foo.vim . Я также хочу настроить индекс cscope и запустить окно терминала, если команда вызывается из какого-либо инструмента быстрого запуска или ярлыка на рабочем столе. Чтобы открыть мою среду, у меня есть следующий скрипт, который называется 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .