programing

명령 또는 로컬 vimrc 파일을 사용하여 여러 vim 구성간에 전환하는 방법은 무엇입니까?

nasanasas 2020. 10. 7. 07:43
반응형

명령 또는 로컬 vimrc 파일을 사용하여 여러 vim 구성간에 전환하는 방법은 무엇입니까?


저는 여러 그룹에서 작업하며 각 그룹에는 C에서 고유 한 탭 / 들여 쓰기 / 간격 표준이 있습니다.

파일을 편집 할 때 각각에 대해 선택 가능한 개별 VIM 구성을 갖는 방법이 있습니까?

  • set group=1구성을 선택하는 것과 같은 작업 을합니다.
  • 작업 디렉토리에있는 로컬 .vimrc는 구성을 자동으로 설정하는 데 사용됩니다.

요약하자면

이를 수행하는 몇 가지 방법이 있으며 그 중 대부분이 제안되었지만 두 가지 추가 방법으로 요약 할 것이라고 생각했습니다.

  • vimrc에 디렉토리 당 - 빔이 올바른 디렉토리에서 시작해야한다는 단점이있다 : 프로젝트가있는 경우 ~/project1와 당신이 ~/project1/.vim.custom하고 할 cd ~ ; vim project1/file.c사용자 지정 설정을 찾을 수 없습니다.
  • Modelines-매우 효과적이지만 모든 파일에 추가해야한다는 단점이 있습니다 (새 파일에 추가해야 함).
  • 디렉토리 특정 자동 명령-이것은 매우 효과적입니다.
  • 파일에서 특정 헤더를 검색합니다 (아래 참조)-이것은 과거에 다른 회사에서 일하거나 명확하게 이름이 지정된 프로젝트에서 가장 많이 사용한 헤더입니다.
  • 파일이 열릴 때 확인되는 디렉토리 별 vimrc입니다 (아래 참조). 특히 프로젝트 코드가 모두 한곳에있는 경우 구현하기 쉬운 또 다른 방법입니다.

헤더 스캔

많은 조직에서 모든 소스 파일의 맨 위에 표준 헤더 (저작권 고지 및 프로젝트 이름 등)가 있습니다. 이 경우 Vim이 파일의 첫 10 줄을 자동으로 스캔하여 키워드를 찾을 수 있습니다. 찾으면 설정을 변경할 수 있습니다. 내가 사용하는 양식 (다른 많은 작업을 수행함)보다 간단하게 만들기 위해 이것을 수정했지만 ~/.vim/after/filetype.vim아직없는 경우 다음과 같이 추가합니다.

au FileType * call <SID>ConfigureFiletypes(expand("<amatch>"))

" List of file types to customise
let s:GROUPNAMETypes = ['c', 'cpp', 'vhdl', 'c.doxygen']

func! <SID>CheckForGROUPNAMECode()
    " Check if any of the first ten lines contain "GROUPNAME".

    " Read the first ten lines into a variable
    let header = getline(1)
    for i in range(2, 10)
        let header = header . getline(i)
    endfor

    if header =~ '\<GROUPNAME\>'
        " Change the status line to make it clear which
        " group we're using
        setlocal statusline=%<%f\ (GROUPNAME)\ %h%m%r%=%-14.(%l,%c%V%)\ %P
        " Do other customisation here
        setlocal et
        " etc
    endif
endfunc

func! <SID>ConfigureFiletypes(filetype)
    if index(s:GROUPNAMETypes, a:filetype) != -1
        call <SID>CheckForGROUPNAMECode()
    endif
endfunc

모든 유형의 파일이 열리고 파일 유형이 설정 ( au FileType *행) 될 때마다 ConfigureFiletypes함수가 호출됩니다. 파일 형식이 현재 그룹 (GROUPNAME)과 연결된 파일 형식 목록에 있는지 확인합니다 (이 경우 'c', 'cpp', 'vhdl'또는 'c.doxygen'). 그렇다면 CheckForGROUPNAMECode ()를 호출하여 파일의 처음 10 줄을 읽고 GROUPNAME을 포함하면 일부 사용자 지정을 수행합니다. 확장 탭 등을 설정하는 것 외에도 그룹 이름이 명확하게 표시되도록 상태 표시 줄이 변경되어 한 눈에 작동하는지 알 수 있습니다.

열 때 구성 확인

JS Bangs의 제안과 마찬가지로 사용자 지정 구성 파일이 있으면 유용 할 수 있습니다. 그러나 vimrc에서로드하는 대신 .c 파일과 동일한 디렉토리에있는 .vim.custom에 대해 .c 파일이 열릴 때 확인하는 다음과 같은 것을 고려하십시오.

au BufNewFile,BufRead *.c call CheckForCustomConfiguration()

function! CheckForCustomConfiguration()
    " Check for .vim.custom in the directory containing the newly opened file
    let custom_config_file = expand('%:p:h') . '/.vim.custom'
    if filereadable(custom_config_file)
        exe 'source' custom_config_file
    endif
endfunction

나는 이것을 가지고있다 $HOME/.vimrc:

if filereadable(".vim.custom")
    so .vim.custom
endif

이를 통해 .vim.custom모든 디렉토리에 파일 을 넣어 해당 디렉토리에 특정한 명령과 옵션을로드 할 수 있습니다. 디렉토리 구조가 깊은 여러 프로젝트에서 작업하는 경우 더 정교한 것이 필요할 수 있지만 (예 : a .vim.custom가 발견 될 때까지 디렉토리 트리 위로 이동 ) 동일한 기본 아이디어가 작동합니다.

최신 정보:

이제 .vim현재 디렉토리가 무엇이든 상관없이 편집중인 파일과 동일한 디렉토리에서 파일 을 읽기 위해 이와 같은 작업을 수행합니다 .

let b:thisdir=expand("%:p:h")
let b:vim=b:thisdir."/.vim"
if (filereadable(b:vim))
    execute "source ".b:vim
endif

You can also put autocommands in your .vimrc which set specific options on a per-path basis.

au BufRead,BufNewFile /path/to/project1/* setl sw=4 et
au BufRead,BufNewFile /path/to/project2/* setl sw=3 noet

Plugin doing the right thing: http://www.vim.org/scripts/script.php?script_id=441

“This plugin searches for local vimrc files in the filesystem tree of the currently opened file. By default it searches for all ".lvimrc" files from the file's directory up to the root directory and loads them in reverse order. The filename and amount of loaded files is customizable through global variables.”


Assuming your fellow developers won't complain about it, you can always add vim settings to each file in the comments.

/*
 * vim:ts=4:sw=4:expandtab:...
 */

int main(int argc, char **argv)
{
    ...

I created an open-sourced tool for just this purpose. Forget the headers, scanning, configurations, and local vimrc files.

Try swim.


Swim

swim is a quick tool for switching vimrc files and creating convenient aliases. Here's a short usage list. See the Github repo for a walkthrough gif and download instructions:


Usage

swim add ~/dotfiles/myVimrc favorite    #Add new swim alias
swim ls                                 #Show available swim aliases
swim add https://raw.githubusercontent.com/dawsonbotsford/swim/master/exampleVimrcs/vimrcWikia.vim example
swim with favorite         #Set alias favorite as primary .vimrc
swim with main             #Set alias main as primary .vimrc


Read More

https://github.com/dawsonbotsford/swim


After trying out the localvimrc plugin suggested by the previous poster, I very much like having non-futzy per-project control over vim settings.

It does ask confirmation before loading a .lvimrc file by default but there is a setting to automatically load .lvimrc files. Some might see this as a security hole, but it works as advertised.

I chose to .gitignore the .lvimrc files. Alternatively you can check them in as a form of shared settings (tab/space expansion, tabstops, other project-specific settings).


As mentioned by sledge the usage of that plug-in is the best option I have seen and use. jerseyboy commented that the utility recommended ask for confirmation before loading (ie. after opening every file). To avoid this just set at your main .vimrc the list of local .lvimrc files:

let g:localvimrc_whitelist='/development/kernel/.lvimrc'


Here's a variation on jamessan's

function! ConditionalLoad()
    let cwd = getcwd()
    if getcwd() =~ $HOME . "/src/mobile"
        so $HOME/.vim.mobile
    endif
endfunction
autocmd VimEnter * call ConditionalLoad()

I will frequently launch vi without a specific file that I'm jumping to so this enables loading config conditionally based on the current working directory. Downside is that the config isn't applied based on file but off of working directory.


Looking for mostly the same issue I also found the Sauce plug-in: http://www.vim.org/scripts/script.php?script_id=3992

It claims:

Sauce is a lightweight manager for multiple vimrc files, which can be used to load different settings for different environments. In short, you can maintain lots of different vim settings files and only load the one(s) you need when you need them.

I find it particularly interesting that it keeps it configuration all in its data directory instead of expecting the user to sprinkle dotfiles across the filesystem. This though often rather a metter of personal taste.

I have yet to test it though.

참고URL : https://stackoverflow.com/questions/1889602/how-to-switch-between-multiple-vim-configurations-with-a-command-or-local-vimrc

반응형