केवल एक निश्चित निर्देशिका ट्री में फ़ाइलों के लिए विम विकल्प सेट करना?


15

एक प्रोग्रामिंग परियोजना है, जिस पर मैं काम करता हूं, जहां बाकी सभी 4 के टैब का उपयोग करते हैं, इसलिए मुझे यह set tabstop=4मेरे लिए सबसे सीधा लगता है ~/.vimrc। हालाँकि, मैं इस फ़ाइल को संपादित करने वाली प्रत्येक फ़ाइल को प्रभावित नहीं करूंगा - बस इस परियोजना के लिए - आइए प्रत्येक फ़ाइल को एक निश्चित निर्देशिका (और इसके उपनिर्देशिका) में कहें।

क्या कोई तरीका है जिससे मैं फ़ाइल की निर्देशिका उपसर्ग के आधार पर आसानी से सशर्त रूप से चर सेट कर सकता हूं?


जवाबों:


19

केंद्रीय विन्यास

यदि स्थानीय अपवादों को केंद्रीय रूप से कॉन्फ़िगर करना ठीक है, तो आप इस तरह के ऑटोकैमड्स को अपने में डाल सकते हैं ~/.vimrc:

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

दूसरी ओर, यदि आप प्रोजेक्ट के साथ संग्रहित विशिष्ट कॉन्फ़िगरेशन चाहते हैं (और इसे मॉडल के माध्यम से सभी फ़ाइलों में एम्बेड नहीं करना चाहते हैं ), तो आपके पास निम्नलिखित दो विकल्प हैं:

अंतर्निहित कार्यक्षमता के साथ स्थानीय कॉन्फ़िगरेशन

यदि आप हमेशा प्रोजेक्ट रूट निर्देशिका, बिल्ट-इन से विम शुरू करते हैं

:set exrc

.vimrcवर्तमान निर्देशिका से किसी फ़ाइल को पढ़ने में सक्षम बनाता है । आप :set ts=4 sw=4वहां कमांड्स रख सकते हैं ।

प्लगइन के माध्यम से स्थानीय विन्यास

अन्यथा, आपको एक प्लगइन की सहायता की आवश्यकता है; vim.org पर कई हैं; मैं लोकल आर्क प्लगइन की सिफारिश कर सकता हूं , जो स्थानीय फाइलपेट -विशिष्ट कॉन्फ़िगरेशन की भी अनुमति देता है।

ध्यान दें कि फ़ाइल सिस्टम से कॉन्फ़िगरेशन पढ़ने के सुरक्षा निहितार्थ हैं; आप चाहते हो सकता है :set secure


1
तीसरा समाधान (प्लगइन) उत्कृष्ट है, और बिल्कुल उसी तरह की चीज जिसे मैं ढूंढ रहा था। मैं विन्यास को केंद्र में रखने से बचने की कोशिश कर रहा हूं, इसलिए आप सही हैं कि पहला आदर्श नहीं है। व्यापक उत्तर के लिए धन्यवाद।
एंड्रयू फेरियर

महान! मैं लोकल आर्क प्लगइन का भी उपयोग करता हूं; यह वास्तव में उपयोगी है।
इंगो करकट

यदि कोई अन्य autocmdकाम नहीं कर रहा है, तो यह सुनिश्चित करें कि आपके रास्ते में कोई सिम्बलिंक नहीं है, यह सुनिश्चित करें - मुझे (ओएस एक्स 10.9 पर) काम करने से पहले मुझे कोई सहानुभूति नहीं के साथ पूरा रास्ता डालना था।
डोलन एंटेनुची

4

source(()) कमांड का उपयोग करके आप आगे कमांड पढ़ने के लिए विम कॉन्फ़िगर कर सकते हैं । ~/.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

आप इंडिकेशन का पता लगाने की कोशिश करके समस्या को अधिक सामान्य तरीके से हल करने के लिए विम के लिए एक प्लगइन का उपयोग कर सकते हैं।

मेरे लिए पसंद का प्लगइन है DetectIndent । मुझे प्लगइन के सभी कांटों का परीक्षण करने में कुछ समय लगा जो मेरी ज़रूरतों के अनुरूप है। मूल एक वास्तव में करीब था लेकिन इतना नहीं कि मैंने अपना कांटा बनाया ।

डिबगिंग के लिए यह :set verbose=1प्लगइन के साथ फिर से चलाने और चलाने में बहुत सहायक है:DetectIndent


मुझे लगता है कि आपने गलत सवाल पर यह जवाब दिया होगा? यह प्रासंगिक नहीं लगता है।
एंड्रयू फेरियर

@AndrewFerrier यह जवाब पूरी तरह से लागू है, यह समस्या के लिए अलग दृष्टिकोण प्रस्तुत करता है। विशिष्ट फ़ाइलों के लिए टैब आकार सेट करने के बजाय आप प्रत्येक फ़ाइल के लिए सही टैब आकार का पता लगाने के लिए एक प्लगइन का उपयोग कर सकते हैं।
ग्रोनोस्तज

@gronostaj मेरा प्रश्न वास्तव में टैब आकार सेट करने के बारे में नहीं था, यह प्रति-निर्देशिका-ट्री कॉन्फ़िगरेशन के बारे में था - टैब आकार केवल एक उदाहरण था। लेकिन मैं देख रहा हूं कि अब आपको क्या मिल रहा था, और यह एक उपयोगी टिप है। धन्यवाद।
एंड्रयू फेरियर

0

एक संभावित समाधान जिसका उल्लेख अभी तक नहीं किया गया है, वह एक स्तर ऊपर जाने और परियोजना-विशिष्ट शेल स्क्रिप्ट को लागू करने के लिए आपके विम वातावरण को आग लगाने के लिए है।

यह -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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.