특정 디렉토리 트리의 파일에 대해서만 vim 옵션을 설정 하시겠습니까?


15

다른 사람들이 4의 탭 크기를 사용하는 곳에서 작업하는 프로그래밍 프로젝트가 있으므로 set tabstop=4내에서 가장 간단합니다 ~/.vimrc. 그러나 나는 이것이 내가 편집하는 모든 파일에 영향을 미치지 않을 것입니다.이 프로젝트의 파일에만 해당됩니다. 특정 디렉토리 (및 하위 디렉토리)의 모든 파일을 말하십시오.

파일의 디렉토리 접두사를 기반으로 조건부로 변수를 쉽게 설정할 수있는 방법이 있습니까?


답변:


19

중앙 구성

로컬 예외를 중앙에서 구성해도 괜찮다면 이러한 autocmd를 다음에 넣을 수 있습니다 ~/.vimrc.

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

프로젝트에 저장된 특정 구성을 원하는 경우, 다른 한편으로는, (및하지를 통해 모든 파일이 포함하고자하는 모드 라인 , 다음 두 가지 옵션이 있습니다)

기능이 내장 된 로컬 구성

항상 프로젝트 루트 디렉토리에서 Vim을 시작하면 내장

:set exrc

.vimrc현재 디렉토리에서 파일을 읽을 수 있습니다 . :set ts=4 sw=4거기에 명령을 넣을 수 있습니다 .

플러그인을 통한 로컬 설정

그렇지 않으면 플러그인의 도움이 필요합니다. vim.org에는 몇 가지가 있습니다. 로컬 파일 유형별 구성을 허용 하는 localrc plugin도 추천 할 수 있습니다.

파일 시스템에서 구성을 읽는 것은 보안에 영향을 미칩니다. 당신은 할 수 있습니다 :set secure.


1
세 번째 솔루션 (플러그인)은 훌륭하고 정확하게 내가 찾던 것입니다. 구성을 중앙에 두는 것을 피하려고 노력하므로 첫 번째가 이상적이지 않은 것이 맞습니다. 포괄적 인 답변에 감사드립니다.
앤드류 페리 어

큰! 또한 localrc 플러그인을 사용합니다. 정말 유용합니다.
Ingo Karkat

다른 사람이 autocmd작동하지 않는 방법으로 문제가 발생하는 경우 경로에 심볼릭 링크가 없는지 확인하십시오-나에게 효과가 있기 전에 심볼릭 링크가없는 전체 경로를 넣어야했습니다 (OS X 10.9)
Dolan Antenucci

4

source(so) 명령을 사용하여 추가 명령을 읽도록 vim을 구성 할 수 있습니다 . 이것을 추가하십시오 ~/.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

맞습니다, 그것은 한계입니다
suspectus

1

Vim 용 플러그인을 사용하여 indention을 감지하여보다 일반적인 방식으로 문제점을 해결할 수 있습니다.

나를 위해 선택한 플러그인은 DetectIndent 입니다. 플러그인의 모든 포크를 테스트하여 내 요구에 맞는 것을 찾는 데 시간이 걸렸습니다. 원래 하나는 정말 가까웠지만 꽤 나 자신의 포크를 만들었습니다 .

디버깅을 :set verbose=1위해 플러그인을 다시 실행하고 실행하는 데 매우 유용합니다.:DetectIndent


나는 당신 이이 질문에 잘못된 질문에 답했을 것이라고 생각합니까? 관련이없는 것 같습니다.
Andrew Ferrier

@AndrewFerrier이 답변은 완벽하게 정해졌으며 문제에 대한 다른 태도를 나타냅니다. 특정 파일의 탭 크기를 설정하는 대신 플러그인을 사용하여 각 파일의 올바른 탭 크기를 감지 할 수 있습니다.
gronostaj 21:01에

@gronostaj 내 질문은 실제로 탭 크기 설정에 관한 것이 아니라 디렉토리 트리 구성에 관한 것입니다. 탭 크기는 단지 예일뿐입니다. 그러나 나는 당신이 지금 무엇을 얻고 있는지 알고 있으며 유용한 팁입니다. 감사.
Andrew Ferrier 21시 03 분

0

아직 언급되지 않은 한 가지 가능한 해결책은 한 단계 위로 올라가서 프로젝트 별 쉘 스크립트를 구현하여 vim 환경을 시작하는 것입니다.

이를 통해 -S명령 줄 옵션을 사용하여 vim 관련 설정을 전달할 수 있습니다 . 또한 터미널 또는 cscope 설정과 같은 환경의 다른 측면을 구성 할 수 있다는 장점이 있습니다.

예를 들어, foo파일의 vim 설정을로드하려는 C ++ 프로젝트가 있다고 가정 해 봅시다 ~/.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.