Đặt tùy chọn vim chỉ cho các tệp trong cây thư mục nhất định?


15

Có một dự án lập trình tôi làm việc trong đó mọi người khác sử dụng tabize 4, vì vậy tôi thấy nó đơn giản nhất set tabstop=4trong tôi ~/.vimrc. Tuy nhiên, tôi không muốn điều này ảnh hưởng đến mọi tệp tôi chỉnh sửa - chỉ những tệp cho dự án này - giả sử mọi tệp trong một thư mục nhất định (và thư mục con của nó).

Có cách nào để tôi có thể dễ dàng thiết lập các biến dựa trên tiền tố thư mục của tệp không?


Câu trả lời:


19

Cấu hình trung tâm

Nếu bạn có thể định cấu hình các ngoại lệ cục bộ một cách tập trung, bạn có thể đặt các chế độ tự động như vậy vào ~/.vimrc:

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

Mặt khác, nếu bạn muốn cấu hình cụ thể được lưu trữ với dự án (và không muốn nhúng này trong tất cả các file thông qua modelines ), bạn đã sau hai lựa chọn:

Cấu hình cục bộ với chức năng tích hợp

Nếu bạn luôn khởi động Vim từ thư mục gốc của dự án, thì tích hợp sẵn

:set exrc

cho phép đọc một .vimrctập tin từ thư mục hiện tại. Bạn có thể đặt các :set ts=4 sw=4lệnh trong đó.

Cấu hình cục bộ thông qua plugin

Nếu không, bạn cần sự trợ giúp của một plugin; có một số trên vim.org; Tôi có thể đề xuất plugin localrc , thậm chí cho phép cấu hình cụ thể theo kiểu tệp cục bộ.

Lưu ý rằng đọc cấu hình từ hệ thống tệp có ý nghĩa bảo mật; bạn có thể muốn :set secure.


1
Giải pháp thứ ba (plugin) là tuyệt vời, và chính xác là thứ mà tôi đang tìm kiếm. Tôi đang cố gắng tránh đặt cấu hình tập trung, vì vậy bạn nói đúng là đầu tiên không lý tưởng. Cảm ơn cho một câu trả lời toàn diện.
Andrew Ferrier

Tuyệt quá! Tôi cũng sử dụng plugin localrc; nó thực sự hữu ích
Ingo Karkat

Trong trường hợp bất kỳ ai khác gặp phải vấn đề về autocmdphương pháp không hoạt động, hãy đảm bảo bạn không có bất kỳ liên kết tượng trưng nào trong đường dẫn của mình - Tôi phải đặt đường dẫn đầy đủ không có liên kết tượng trưng trước khi nó hoạt động với tôi (trên OS X 10.9)
Dolan Antenucci

4

Bạn có thể cấu hình vim để đọc thêm các lệnh bằng cách sử dụng lệnh source(so). Thêm phần này vào của bạn ~/.vimrc- nó tìm kiếm thư mục hiện tại và nếu không tìm thấy tệp .vimrc_proj thì tìm kiếm .vimrc_proj trong thư mục mẹ.

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

Sau đó thêm bất kỳ lệnh tùy chỉnh trong .vimrc_projtập tin cấu hình cho phù hợp với dự án của bạn.


Tôi nghĩ rằng nó chỉ hoạt động nếu tôi trong thư mục của dự án khi tôi mở tệp, phải không? Điều này không xử lý nơi thư mục hiện tại là một cái gì đó hoàn toàn khác nhau.
Andrew Ferrier

Đúng, đó là một hạn chế
suspectus

1

Bạn có thể sử dụng một plugin cho Vim để giải quyết vấn đề một cách tổng quát hơn bằng cách cố gắng phát hiện sự cố ý.

Plugin lựa chọn cho tôi là DetectInent . Phải mất một thời gian để tôi kiểm tra tất cả các nhánh của plugin để tìm một cái phù hợp với nhu cầu của tôi. Cái ban đầu rất gần nhưng không hoàn toàn nên tôi tự làm nĩa .

Để gỡ lỗi, rất hữu ích để :set verbose=1chạy lại plugin với:DetectIndent


Tôi nghĩ rằng bạn có thể đã đặt câu trả lời này vào câu hỏi sai? Nó không có vẻ liên quan.
Andrew Ferrier

@AndrewFerrier Câu trả lời này hoàn toàn đúng chỗ, nó chỉ thể hiện thái độ khác nhau đối với vấn đề. Thay vì đặt kích thước tab cho các tệp cụ thể, bạn có thể sử dụng plugin để phát hiện kích thước tab chính xác cho từng tệp.
gronostaj

@gronostaj câu hỏi của tôi không thực sự là về việc thiết lập kích thước tab, đó là về cấu hình trên mỗi thư mục cây - kích thước tab chỉ là một ví dụ. Nhưng tôi thấy những gì bạn đang nhận được bây giờ, và đó là một mẹo hữu ích. Cảm ơn.
Andrew Ferrier

0

Một giải pháp khả thi chưa được đề cập là đi lên một cấp trên và thực hiện các kịch bản shell dành riêng cho dự án để kích hoạt môi trường vim của bạn.

Điều này cho phép các cài đặt dành riêng cho vim được truyền bằng -Stùy chọn dòng lệnh. Ưu điểm là nó cũng cho phép cấu hình các khía cạnh khác của môi trường, chẳng hạn như cài đặt thiết bị đầu cuối hoặc cscope.

Ví dụ: giả sử tôi có một dự án C ++ được gọi foo, mà tôi muốn tải các cài đặt vim của tệp ~/.vim/projects/foo.vim. Tôi cũng muốn thiết lập một chỉ mục cscope và khởi chạy một cửa sổ đầu cuối nếu lệnh được gọi từ một số công cụ khởi động nhanh hoặc phím tắt trên màn hình. Để mở môi trường của tôi, tôi có đoạn script sau, được gọi là 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.