Установка параметров vim только для файлов в определенном дереве каталогов?


15

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

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


Ответы:


19

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

Если вы можете централизованно настраивать локальные исключения, вы можете поместить такие 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.


1
Третье решение (плагин) отлично, и именно то, что я искал. Я стараюсь не ставить конфиг централизованно, поэтому вы правы, что первый не идеален. Спасибо за исчерпывающий ответ.
Эндрю Ферье

Большой! Я также использую плагин localrc; это действительно полезно.
Инго Каркат

В случае, если кто-то столкнется с проблемой autocmdнеработающего метода, убедитесь, что у вас нет символических ссылок на вашем пути - мне пришлось указать полный путь без символических ссылок, прежде чем он будет работать для меня (в OS X 10.9)
Долан Антенуччи

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


Я думаю, что вы, возможно, поставили этот ответ на неправильный вопрос? Это не кажется актуальным.
Эндрю Ферье

@AndrewFerrier Этот ответ отлично на месте, он просто представляет другое отношение к проблеме. Вместо установки размера вкладки для определенных файлов вы можете использовать плагин для определения правильного размера вкладки для каждого файла.
Гроностай

@gronostaj мой вопрос был не о настройке размеров вкладок, а о конфигурации дерева каталогов - размер вкладки был только примером. Но я вижу, что вы получили в настоящее время, и это полезный совет. Благодарю.
Эндрю Ферье

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.