Làm cách nào để chuyển đổi giữa nhiều cấu hình vim bằng lệnh hoặc các tệp vimrc cục bộ?


85

Tôi làm việc trong nhiều nhóm, mỗi nhóm có các tiêu chuẩn tab / thụt lề / giãn cách riêng trong C.

Có cách nào để có các cấu hình VIM có thể lựa chọn riêng biệt cho từng cấu hình như vậy không, khi tôi chỉnh sửa tệp:

  • Tôi làm điều gì đó như set group=1chọn một cấu hình
  • .vimrc cục bộ nằm trong thư mục làm việc được sử dụng để đặt cấu hình tự động


Xem thêm câu hỏi Chuyển đổi giữa hai cấu hình vim khác nhau trên superuser.
Hotschke

Câu trả lời:


40

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

66

Tôi có cái này trong $HOME/.vimrc:

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

Điều này cho phép tôi đặt một .vim.customtệp trong mọi thư mục để tải các lệnh và tùy chọn cụ thể cho thư mục đó. Nếu bạn đang làm việc trên nhiều dự án có cấu trúc thư mục sâu, bạn có thể cần một thứ gì đó phức tạp hơn (ví dụ: đi lên cây thư mục cho đến khi .vim.customtìm thấy a), nhưng ý tưởng cơ bản giống nhau sẽ hoạt động.

CẬP NHẬT:

Bây giờ tôi làm điều gì đó như thế này để đọc một .vimtệp từ cùng thư mục với tệp tôi đang chỉnh sửa, bất kể thư mục hiện tại là gì.

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

1
Điều này thật tuyệt vời, tôi chưa bao giờ thấy điều này!
Jim Mitchener

1
Đây là một giải pháp tuyệt vời cho các dự án sống trong repo!
bradreaves

2
Các 'exrc'tùy chọn đã cho phép làm điều gì đó rất tương tự như sau. Nó sẽ tải một .vimrc/ .exrc/ .gvimrctrong thư mục làm việc hiện tại.
jamessan 12/1213

Nhận xét về exrcphải là câu trả lời đúng. Mọi thứ khác có vẻ khó hiểu và phức tạp.
silvenon

Sử dụng exrcrất hay, nhưng tôi đánh giá cao việc lấy đúng tệp ngay cả khi tôi không ở trong cùng thư mục làm việc với tệp tôi đang chỉnh sửa.
JSB ձոգչ

34

Bạn cũng có thể đặt các lệnh tự động trong .vimrcđó đặt các tùy chọn cụ thể trên cơ sở từng đường dẫn.

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

Điều này thật tuyệt khi bạn không kiểm soát được kho lưu trữ, do đó bạn không thể đưa các tệp ".vim.custom" vào đó. Tôi thích rằng nó giữ cho kho lưu trữ sạch sẽ. Cảm ơn. Tuyên bố từ chối trách nhiệm: nếu đường dẫn tiếp tục thay đổi theo cách không thân thiện với khuôn mẫu, thì phiên bản ".vim.custom" có thể đẹp hơn giả sử người ta có thể sửa đổi kho lưu trữ.
lpapp

17

Plugin hoạt động đúng: http://www.vim.org/scripts/script.php?script_id=441

“Plugin này tìm kiếm các tệp vimrc cục bộ trong cây hệ thống tệp của tệp hiện đang mở. Theo mặc định, nó tìm kiếm tất cả các tệp ".lvimrc" từ thư mục của tệp cho đến thư mục gốc và tải chúng theo thứ tự ngược lại. Tên tệp và số lượng tệp đã tải có thể tùy chỉnh thông qua các biến toàn cầu ”.


3
Và phiên bản github cũng hỗ trợ tải với mầm bệnh :-)
Graza

Một plugin tương tự khác là localrc.vim; nó cũng cho phép cài đặt loại tệp cụ thể cho mỗi thư mục; Tôi thấy nó không thể thiếu. vim.org/scripts/script.php?script_id=3393
Ingo Karkat,

12

Giả sử các nhà phát triển đồng nghiệp của bạn sẽ không phàn nàn về điều đó, bạn luôn có thể thêm cài đặt vim vào mỗi tệp trong phần nhận xét.

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

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

2
Tôi chỉ e hèm dev giác ngộ trên hầu hết các đội bóng của tôi, để không ai phải bận tâm. Đây là một giải pháp thực sự gọn gàng cho mỗi tệp.
bradreaves

1
Tôi thích thêm chúng ở dưới cùng để chúng không phô trương, nhưng tôi đoán đó là vấn đề về phong cách.
nyuszika7h

5

Tôi đã tạo một công cụ nguồn mở chỉ cho mục đích này. Quên tiêu đề, quét, cấu hình và các tệp vimrc cục bộ.

Hãy thử bơi.


Bơi

swimlà một công cụ nhanh chóng để chuyển đổi các tệp vimrc và tạo bí danh tiện lợi. Đây là danh sách sử dụng ngắn. Xem repo Github để biết gif hướng dẫn và hướng dẫn tải xuống:


Sử dụng

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

Đọc thêm

https://github.com/dawsonbotsford/swim


4

Sau khi thử plugin localvimrc do người đăng trước đề xuất, tôi rất thích có quyền kiểm soát không tương lai cho mỗi dự án đối với cài đặt vim.

Nó yêu cầu xác nhận trước khi tải tệp .lvimrc theo mặc định nhưng có một cài đặt để tự động tải tệp .lvimrc. Một số có thể coi đây là một lỗ hổng bảo mật, nhưng nó hoạt động như quảng cáo.

Tôi đã chọn .gitignore các tệp .lvimrc. Ngoài ra, bạn có thể kiểm tra chúng dưới dạng một dạng cài đặt được chia sẻ (mở rộng tab / không gian, các tab, các cài đặt dành riêng cho dự án khác).


1
Tập lệnh này thật tuyệt vời: github.com/MarcWeber/vim-addon-local-vimrc . 1) Bây giờ nó chỉ hỏi một lần và đánh dấu tệp băm là OK. 2) Nó chuyển cây thư mục từ gốc sang dir hiện tại, tìm nguồn cung cấp các tệp có mức độ ưu tiên cao hơn cuối cùng.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功 Ngày

Tại sao lại thêm .lvimrctệp vào .gitignore? Vấn đề là tất cả những người sử dụng vim và đã cài đặt plugin đều có cùng cài đặt.
nyuszika7h

2
@ nyuszika7h một số cài đặt phải được thực thi, trong khi những cài đặt khác hoàn toàn mang tính cá nhân. Đối với các thiết lập đó phải được áp dụng cho mọi người, EditorConfig thậm chí còn tốt hơn vì nó là biên tập viên thuyết bất khả tri: github.com/editorconfig/editorconfig-vim
Ciro Santilli郝海东冠状病六四事件法轮功

1

Như đã đề cập bởi tạ việc sử dụng plug-in đó là lựa chọn tốt nhất mà tôi đã thấy và sử dụng. jerseyboy nhận xét rằng tiện ích khuyến nghị yêu cầu xác nhận trước khi tải (tức là sau khi mở mọi tệp). Để tránh điều này, chỉ cần thiết lập .vimrcdanh sách các .lvimrctệp cục bộ tại chính của bạn :

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


1

Đây là một biến thể của jamessan's

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

Tôi sẽ thường xuyên khởi chạy vi mà không có tệp cụ thể mà tôi đang chuyển đến để điều này cho phép tải cấu hình có điều kiện dựa trên thư mục làm việc hiện tại. Nhược điểm là cấu hình không được áp dụng dựa trên tệp mà nằm ngoài thư mục làm việc.


Chính xác những gì tôi đang tìm kiếm. Như một ví dụ về việc sử dụng: Tôi đặt mã này trong ~/.vimrc, thay đổi /src/mobilevào thư mục dự án Symfony của tôi (trong trường hợp của tôi nó là /www/symfony) và sửa đổi .vim.mobileđể .vim.symfonysau đó đặt mới vimrc cấu hình bên trong ~/.vim.symfonytập tin
jmarceli

1

Tôi làm việc trong nhiều nhóm, mỗi nhóm có các tiêu chuẩn tab / thụt lề / giãn cách riêng trong C.

Tôi làm việc với tất cả các loại mã nguồn mở, tất cả cùng một lúc. Không thực tế khi tạo .vimrccác tệp riêng biệt và định cấu hình lại các tiêu chuẩn định dạng. Hơn một thập kỷ trước, cuối cùng tôi đã cảm thấy mệt mỏi với việc xử lý cấu hình trình soạn thảo và đã viết một chương trình được gọi autotabđể xử lý nó.

Khi autotabđược thiết lập với Vim được đề xuất, mỗi lần bạn tải một tệp vào Vim, tệp đó autotabsẽ được gọi ra và đầu ra cài đặt Vim autotabđược chuyển đến một :setlệnh.

autotabđọc vài ngàn dòng từ tập tin, phân tích chúng và xác định các thiết lập cho expandtab, tabstopshiftwidthcác thông số.

Nó tìm ra liệu tệp có sử dụng các tab cứng hay chỉ là khoảng trắng để thụt lề và nó tìm ra kích thước thụt lề. Nếu tệp được thụt lề với các tab, nó sẽ tính ra kích thước tab phù hợp, dựa trên việc hiển thị mẫu tệp bằng cách sử dụng các kích thước tab khác nhau và đánh giá nó theo các kinh nghiệm như căn chỉnh dòng của các phần tử bên trong.

Nó hoạt động tốt đến mức tôi đã ngừng điều chỉnh thuật toán nhiều năm trước. Nếu nó bị nhầm lẫn, hầu như luôn luôn là do tệp có vấn đề về định dạng, chẳng hạn như việc sử dụng nhiều quy ước cùng một lúc.

Nó cũng là loại tệp "bất khả tri" và hoạt động tốt với nhiều loại ngôn ngữ khác nhau. Tôi sử dụng nó không chỉ trên C, mà còn sử dụng shell script, Lisp, Makefiles, HTML và những gì có bạn.

Lưu ý rằng nó không xử lý các tham số định dạng khác có thể dành riêng cho dự án, chẳng hạn như trong tệp C, cho dù casecác nhãn trong một switchcâu lệnh có được thụt lề hay không, hoặc liệu danh sách đối số hàm được bao bọc chỉ đơn giản là thụt lề hay căn chỉnh cho mở ngoặc đơn của danh sách đối số. Vim có cài đặt cho những thứ đó, và do đó, chương trình có thể được mở rộng một cách hợp lý để phân tích kiểu và xuất các thông số đó.


0

Tìm kiếm hầu hết các vấn đề tương tự, tôi cũng tìm thấy trình cắm Sauce: http://www.vim.org/scripts/script.php?script_id=3992

Nó tuyên bố:

Sauce là một trình quản lý nhẹ cho nhiều tệp vimrc, có thể được sử dụng để tải các cài đặt khác nhau cho các môi trường khác nhau. Tóm lại, bạn có thể duy trì nhiều tệp cài đặt vim khác nhau và chỉ tải (các) tệp bạn cần khi bạn cần.

Tôi thấy điều đặc biệt thú vị là nó giữ cấu hình tất cả trong thư mục dữ liệu của nó thay vì mong đợi người dùng rải các tệp dotfiles trên toàn hệ thống tệp. Mặc dù điều này thường là một thước đo của sở thích cá nhân.

Tôi vẫn chưa thử nghiệm nó.


0

Bạn có thể sử dụng kho để chuyển đổi cấu hình (bất kỳ tệp dotf nào, không chỉ .vimrc)

Cài đặt stow:

$ apt install stow

Tạo nhiều thư mục cho mỗi cấu hình:

~$ ls -d ~/dotfiles/vim*
vim-all vim-webdev vim-go

Đặt các khác nhau .vimrctrong chúng:

$ find ~/dotfiles -name .vimrc
/home/username/vim-golang/.vimrc
/home/username/vim-webdev/.vimrc
/home/username/vim-all/.vimrc

Bây giờ bạn có thể khởi tạo cấu hình vim-golang bằng lệnh này (nên chạy bên trong thư mục dotfiles):

~$ cd ~/dotfiles

dotfiles$ stow -v vim-golang
LINK: .vimrc => dotfiles/vim-golang/.vimrc

Bây giờ nó được liên kết:

$ cd ~ && ls -l .vimrc 
.vimrc -> dotfiles/vim-golang/.vimrc

Nếu bạn cần chuyển đổi cấu hình, chỉ cần thực hiện lại stow:

~$ cd dotfiles

dotfiles$ stow -v -D vim-golang
UNLINK: .vimrc

dotfiles$ stow -v vim-webdev
LINK: .vimrc => dotfiles/vim-webdev/.vimrc

$ cd ~ && ls -l .vimrc 
.vimrc -> dotfiles/vim-webdev/.vimrc

Đọc thêm về nó ở đây: Quản lý dotfiles với GNU stow

Ưu điểm : khá đơn giản, không có phụ thuộc plugin vim, có thể được sử dụng để quản lý tất cả các tệp dotfiles, không chỉ .vimrc.

Nhược điểm : các cấu hình độc lập với nhau, bạn cần quản lý / cập nhật từng cấu hình riêng biệt (nếu bạn không chuyển đổi / cập nhật, bạn cấu hình quá thường xuyên - đó sẽ không phải là vấn đề).

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.