Tóm tắt
Có một số cách để làm điều này, trong đó hầu hết đã được đề xuất, nhưng tôi nghĩ tôi sẽ tóm tắt chúng với hai cách bổ sung:
- Per-directory vimrc - có nhược điểm là Vim phải được khởi động trong đúng thư mục: nếu dự án của bạn đang ở trong đó
~/project1bạn đã ~/project1/.vim.customvà đang làm cd ~ ; vim project1/file.cthì sẽ không tìm thấy cài đặt tùy chỉnh.
- Modelines - rất hiệu quả, nhưng có nhược điểm là cần thêm chúng vào tất cả các tệp (và nhớ thêm chúng vào các tệp mới)
- Lệnh tự động cụ thể của thư mục - điều này rất hiệu quả
- Quét tiêu đề cụ thể trong tệp (xem bên dưới) - đây là tiêu đề tôi đã sử dụng nhiều nhất trước đây khi làm việc cho các công ty khác nhau hoặc trong các dự án có tên rõ ràng
- Vimrc trên mỗi thư mục được chọn khi tệp được mở (xem bên dưới). Một cái khác khá dễ thực hiện, đặc biệt nếu mã dự án của bạn ở cùng một nơi.
Quét tiêu đề
Trong nhiều tổ chức, có một tiêu đề tiêu chuẩn (với thông báo bản quyền và tên dự án, v.v.) ở đầu mỗi tệp nguồn. Nếu đúng như vậy, bạn có thể yêu cầu Vim tự động quét (ví dụ) 10 dòng đầu tiên của tệp tìm kiếm từ khóa. Nếu nó tìm thấy nó, nó có thể thay đổi cài đặt của bạn. Tôi đã sửa đổi điều này để làm cho nó đơn giản hơn so với biểu mẫu tôi sử dụng (thực hiện nhiều thứ khác), nhưng hãy tạo một ~/.vim/after/filetype.vim(nếu bạn chưa có) và thêm một cái gì đó như sau:
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
Bất cứ khi nào một tệp thuộc bất kỳ loại nào được mở và loại tệp được đặt ( au FileType *dòng), ConfigureFiletypeshàm sẽ được gọi. Điều này kiểm tra xem loại tệp có trong danh sách các loại tệp được liên kết với nhóm hiện tại (GROUPNAME) hay không, trong trường hợp này là 'c', 'cpp', 'vhdl' hoặc 'c.doxygen'. Nếu có, nó gọi CheckForGROUPNAMECode (), nó đọc 10 dòng đầu tiên của tệp và nếu chúng chứa GROUPNAME, nó sẽ thực hiện một số tùy chỉnh. Cũng như thiết lập các thẻ mở rộng hoặc bất cứ thứ gì, thao tác này cũng thay đổi thanh trạng thái để hiển thị tên nhóm một cách rõ ràng để bạn biết nó đã hoạt động trong nháy mắt.
Kiểm tra cấu hình khi mở
Giống như gợi ý của JS Bangs, có một tệp cấu hình tùy chỉnh có thể hữu ích. Tuy nhiên, thay vì tải nó trong vimrc, hãy xem xét một cái gì đó như thế này, điều này sẽ kiểm tra khi tệp .c được mở cho .vim.custom trong cùng thư mục với tệp .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