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

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

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

19
задан Andrew Ferrier
20.02.2023 1:48 Количество просмотров материала 2630
Распечатать страницу

4 ответа

конфигурации

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

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

17
отвечен Ingo Karkat 2023-02-21 09:36

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

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

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

4
отвечен suspectus 2023-02-21 11:53

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

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

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

1
отвечен ypid 2023-02-21 14:10

одно из возможных решений, которое еще не было упомянуто, - перейти на один уровень выше и реализовать специфичные для проекта сценарии оболочки для запуска вашей среды 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
0
отвечен Caetano Sauer 2023-02-21 16:27

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх