การตั้งค่าตัวเลือกที่เป็นกลุ่มสำหรับไฟล์ในแผนผังไดเร็กทอรีที่แน่นอนเท่านั้น?


15

มีฉันทำโครงงานการเขียนโปรแกรมในการที่คนอื่นใช้ tabsize 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
ทางออกที่สาม (ปลั๊กอิน) นั้นยอดเยี่ยมและเป็นสิ่งที่ฉันกำลังมองหา ฉันพยายามหลีกเลี่ยงการตั้งค่าส่วนกลางดังนั้นคุณพูดถูกว่าคนแรกไม่เหมาะ ขอบคุณสำหรับคำตอบที่ครอบคลุม
Andrew Ferrier

ที่ดี! ฉันยังใช้ปลั๊กอิน localrc; มันมีประโยชน์อย่างแท้จริง
Ingo Karkat

ในกรณีที่คนอื่นพบปัญหาautocmdวิธีการไม่ทำงานตรวจสอบให้แน่ใจว่าคุณไม่มี symlink ใด ๆ ในเส้นทางของคุณ - ฉันต้องใส่เส้นทางแบบเต็มโดยไม่มี symlinks ก่อนที่มันจะทำงานให้ฉัน (บน OS X 10.9)
Dolan Antenucci

4

คุณสามารถกำหนดค่า vim ให้อ่านคำสั่งเพิ่มเติมโดยใช้คำสั่ง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ไฟล์ปรับแต่งเพื่อให้เหมาะกับโครงการของคุณ


ฉันคิดว่าใช้งานได้เฉพาะเมื่อฉันอยู่ในไดเรกทอรีของโครงการเมื่อฉันเปิดไฟล์ใช่ไหม สิ่งนี้ไม่ได้จัดการที่ไดเรกทอรีปัจจุบันแตกต่างอย่างสิ้นเชิง
Andrew Ferrier

ถูกต้องนั่นเป็นข้อ จำกัด
สงสัย

1

คุณสามารถใช้ปลั๊กอินสำหรับ Vim เพื่อแก้ไขปัญหาในลักษณะทั่วไปโดยพยายามตรวจหาการเยื้อง

ปลั๊กอินของทางเลือกสำหรับฉันคือDetectIndent ฉันใช้เวลาในการทดสอบส้อมทั้งหมดของปลั๊กอินเพื่อค้นหาอันที่เหมาะกับความต้องการของฉัน เดิมอยู่ใกล้จริงๆ แต่ไม่มากดังนั้นฉันทำของฉันส้อมเอง

สำหรับการดีบักมันมีประโยชน์มาก:set verbose=1และเรียกใช้ปลั๊กอินอีกครั้งด้วย:DetectIndent


ฉันคิดว่าคุณอาจตอบคำถามนี้ผิดหรือเปล่า? ดูเหมือนจะไม่เกี่ยวข้อง
Andrew Ferrier

@AndrewFerrier คำตอบนี้อยู่ในสถานที่ที่สมบูรณ์แบบเพียงแค่นำเสนอทัศนคติที่แตกต่างกับปัญหา แทนที่จะตั้งค่าขนาดแท็บสำหรับไฟล์เฉพาะคุณสามารถใช้ปลั๊กอินเพื่อตรวจสอบขนาดแท็บที่ถูกต้องสำหรับแต่ละไฟล์
gronostaj

@ gronostaj คำถามของฉันไม่ได้เกี่ยวกับการตั้งค่าขนาดแท็บมันเป็นเรื่องเกี่ยวกับการกำหนดค่าต่อไดเรกทอรีต้นไม้ - ขนาดแท็บเป็นเพียงตัวอย่าง แต่ฉันเห็นสิ่งที่คุณได้รับตอนนี้และมันเป็นเคล็ดลับที่มีประโยชน์ ขอบคุณ
Andrew Ferrier

0

วิธีแก้ปัญหาที่เป็นไปได้ข้อหนึ่งซึ่งยังไม่ได้กล่าวถึงคือทำไปหนึ่งระดับด้านบนและใช้เชลล์สคริปต์เฉพาะโปรเจ็กต์เพื่อเริ่มสภาพแวดล้อมที่เป็นกลุ่มของคุณ

สิ่งนี้อนุญาตให้ส่งค่าติดตั้งเฉพาะ vim โดยใช้-Sอ็อพชันบรรทัดรับคำสั่ง ข้อดีคือช่วยให้สามารถกำหนดค่าด้านอื่น ๆ ของสภาพแวดล้อมเช่นการตั้งค่าเทอร์มินัลหรือ cscope

ตัวอย่างเช่นสมมติว่าผมมี ++ โครงการ C เรียกว่าซึ่งผมต้องการที่จะโหลดการตั้งค่าที่เป็นกลุ่มของไฟล์foo ~/.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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.