Встановлення параметрів vim лише для файлів у певному дереві каталогів?


15

Є проект програмування, над яким я працюю, де всі інші користуються вкладкою 4, тому я вважаю, що це найпростіше set tabstop=4в моєму ~/.vimrc. Однак я б краще не впливав на кожен файл, який я редагую - лише на цей проект - скажімо, кожен файл у певній папці (та його підкаталогах).

Чи є спосіб я легко умовно встановити змінні на основі префікса каталогу файлу?


Відповіді:


19

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

Якщо добре налаштувати локальні винятки централізовано, ви можете вставити такі autocmds у свій ~/.vimrc:

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

З іншого боку, якщо ви хочете, щоб певна конфігурація зберігалася в проекті (і ви не хочете вставляти це у всі файли за допомогою моделей ), у вас є наступні два варіанти:

Локальна конфігурація із вбудованою функціональністю

Якщо Ви завжди запускаєте Vim з кореневого каталогу проекту, вбудованого

:set exrc

дозволяє читати .vimrcфайл із поточного каталогу. Ви можете розмістити :set ts=4 sw=4команди там.

Локальна конфігурація через плагін

В іншому випадку вам потрібна допомога плагіна; на vim.org їх декілька; Я можу порекомендувати плагін localrc , який навіть дозволяє конфігурацію локальних файлів.

Зауважте, що конфігурація читання з файлової системи має наслідки для безпеки; ви можете захотіти :set secure.


1
Третє рішення (плагін) - відмінне, і саме те, що я шукав. Я намагаюся уникати розміщення конфігурації центрально, тож ти маєш рацію, що перший не є ідеальним. Дякую за вичерпну відповідь.
Ендрю Фер’є

Чудово! Я також використовую плагін localrc; це справді корисно.
Інго Каркат

У випадку, якщо хтось інший зіткнеться з проблемою autocmdметоду, який не працює, переконайтеся, що у вас немає жодних символьних посилань на вашому шляху - я повинен був поставити повний шлях без символьних посилань, перш ніж він буде працювати для мене (на OS X 10.9)
Dolan Antenucci

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

@gronostaj моє запитання насправді не стосувалося встановлення розмірів вкладок, а про конфігурацію дерева в каталозі - розмір вкладки був лише прикладом. Але я бачу, що ви зараз отримували, і це корисна порада. Спасибі.
Ендрю Фер'є

0

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

Це дозволяє передавати налаштування, характерні для vim, використовуючи параметр -Sкомандного рядка. Перевага полягає в тому, що він також дозволяє налаштувати інші аспекти середовища, наприклад, налаштування терміналу чи кскопа.

Наприклад, скажімо, у мене є проект 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.