Vim: áp dụng cài đặt trên các tệp trong thư mục


103

Làm cách nào để chỉ định cài đặt Vim cho tất cả các tệp trong thư mục hiện tại?

Giải pháp lý tưởng sẽ là nếu Vim tìm kiếm và đọc .vimrc trong thư mục hiện tại trước khi tìm kiếm ~ / .vimrc, và áp dụng các cài đặt ở đó cho toàn bộ cây.

Tôi đã thấy một plugin , nhưng điều này có nghĩa là các cài đặt được áp dụng không minh bạch vì chúng yêu cầu cài đặt plugin. Ngược lại, modeline là trong suốt vì bất kể lệnh gọi vimrc hoặc vim cụ thể của người dùng, cài đặt modeline sẽ được áp dụng cho tệp đó.

Những điều tôi đã thử là

  • đặt .vimrc trong thư mục làm việc
  • :so vimrc trong modeline.

Tôi cho rằng cả hai đều không hoạt động vì lý do bảo mật. Tôi không cần toàn bộ sức mạnh của một vimrc; bị ràng buộc với các cài đặt được chấp nhận bởi một modeline là đủ. Mục tiêu của tôi là giúp những người vimmers áp dụng các tiêu chuẩn mã hóa trong một dự án dễ dàng hơn.


Câu trả lời:


42

Tôi là người ủng hộ cách sử dụng plugin . Vì nhiều lý do:

  • Các mô hình đặc biệt hạn chế: chúng tôi không thể đặt các biến (điều chỉnh các plugin (ft) khác, chẳng hạn như "dấu ngoặc nhọn của đoạn mã for có ở dòng mới?") Hoặc gọi hàm từ chúng (tôi không giới hạn bản thân theo tiêu chuẩn mã hóa, tôi cũng đặt makefile để sử dụng tùy thuộc vào thư mục hiện tại)
  • KHÔ : với các mô hình, cài đặt cần được lặp lại trong mỗi tệp, nếu có quá nhiều thứ cần đặt hoặc điều chỉnh thay đổi, nó sẽ nhanh chóng trở nên khó bảo trì, hơn nữa, nó sẽ yêu cầu sử dụng plugin mở rộng mẫu ( mà bạn nên xem xét nếu bạn có một số rung động trong dự án của mình).
  • Không phải mọi người đều sử dụng vim để phát triển. Tôi không muốn bị làm phiền bởi cài đặt trình chỉnh sửa của người khác, tại sao tôi phải ký sinh vào của họ?
  • Sẽ dễ dàng hơn khi yêu cầu người hâm mộ cài đặt cùng một plugin, thay vì yêu cầu họ sao chép-dán và duy trì, các dòng giống nhau trong .vimrc của họ
  • Các cài đặt có thể được lưu với các tệp dự án khác (cvs / svn / git / anything)
  • Thật sự dễ dàng để có một tệp cấu hình cho mỗi dự án - với plugin, tôi có một tệp cấu hình chung cho các tiêu chuẩn mã hóa của dự án tổng thể và các tệp cấu hình cụ thể cho từng dự án con (tệp nào để sử dụng, tệp thực thi để gọi , ...)

Giải pháp của BTW, sth có thể được sử dụng để tạo nguồn cho một tệp cấu hình duy nhất. Điều này rất giống với cách tiếp cận plugin ngoại trừ .vimrc phải được ký sinh với các tùy chọn không toàn cục và nó không hỗ trợ nhiều tệp cấu hình được chia sẻ / dễ dàng.


Tôi nhận thấy bạn phải lưu một file mới trong đường dẫn trước khi nó sẽ thực hiện một cách chính xác các plugin
cmcginty

Thật. Họ plugin này chỉ định nghĩa một khuôn khổ. Bạn vẫn phải viết các định nghĩa cụ thể của dự án trong một tệp - khung sẽ tự động tạo nguồn.
Luc Hermitte

1
Xin lưu ý, Luc liên kết một plugin của riêng anh ấy. Điều này dường như hoạt động tốt hơn nhiều so với một liên kết trong câu hỏi. Cảm ơn.
dữ liệu

Tốt. Tôi không thể nói. Vì tôi đã sử dụng của tôi trong nhiều năm, tôi chưa bao giờ xem xét kỹ các triển khai khác. Đôi khi, tôi nhận được một báo cáo lỗi mà cuối cùng tôi đã tính đến. BTW, phiên bản của tôi được triển khai để được kích hoạt trước mu-template nhằm thiết lập các biến dành riêng cho dự án trước khi mở rộng các mẫu (khá hữu ích để tìm nạp thư mục gốc của dự án hiện tại và cắt nó khỏi tên đường dẫn đã mở rộng)
Luc Hermitte

1
@JasonMcCarrell Việc triển khai local_vimrc và Markus "embear" của Braun có hỗ trợ danh sách đen, danh sách trắng ... Nếu bạn chỉ cần chỉ định cách thụt lề được thực hiện, có thể plugin EditorConfig-vim sẽ là lựa chọn tốt hơn.
Luc Hermitte

91

Bạn có thể đặt một cái gì đó như thế này vào $VIM/vimrc

autocmd BufNewFile,BufRead /path/to/files/* set nowrap tabstop=4 shiftwidth=4

1
Đây là đệ quy, nhưng chỉ với *. Nếu bạn cố gắng giảm nó thành / path / to / files / hoặc / path / to / files, nó sẽ không hoạt động.
SystemParadox

Điều này thật tuyệt nếu dự án của bạn có một cây các tệp được viết bằng "noexpandtab" và một cây khác có tất cả các tệp "expandtab" (ví dụ: CodeIgniter). Bạn có thể đặt hành động thích hợp cho các tệp trong từng cây riêng lẻ với một tệp cấu hình.
user9645,

2
Thật kỳ lạ, điều này không hoạt động khi đường dẫn của tôi bao gồm một liên kết biểu tượng; Tôi phải đặt đường dẫn đầy đủ không có liên kết tượng trưng trước khi nó hoạt động.
Dolan Antenucci

Xem câu trả lời của joseph07 về việc sử dụng "vim đáng tin cậy" làm phương pháp thay thế, đảo ngược của phương pháp này (phân tán .vimrc so với tập trung).
Nathan Schulte

50

Tôi thực sự khuyên bạn không nên sử dụng set exrc

Ngay cả với set secure* nix, vim vẫn sẽ chạy các lệnh autocommand, shell, et al, nếu bạn sở hữu tệp. Vì vậy, nếu bạn định chỉnh sửa một tệp trong tarball đó, tôi đã gửi cho bạn một tệp .vimrcchứa:

autocmd BufEnter * :silent! !echo rm -rf ~/

có lẽ bạn sẽ ít thích thú hơn tôi.


6
Điều này cũng đúng với các plugin được tự động thực thi khi tải vim.
Luc Hermitte

31

Câu hỏi này đã cũ, nhưng nó có vẻ là một mối quan tâm khá tự nhiên và dai dẳng.

Giải pháp của tôi là khá đơn giản. Tôi đặt một .vimrctệp trong thư mục gốc của các dự án của tôi. Dòng đầu tiên của .vimrctệp thường là nguồn ~/.vimrc, sau đó thêm cấu hình cụ thể mà tôi muốn. Tôi bí danh tvim='vim -u .vimrc'và sử dụng tvimtrong thư mục dự án cá nhân của tôi. "tvim" cho "vim đáng tin cậy", có nghĩa là nếu tôi thực thi nó trong một thư mục có .vimrctệp và xảy ra sự cố, tôi không có trách nhiệm gì ngoài bản thân tôi, vì tôi đã nói rõ ràng là tôi tin tưởng nó. Ngoài ra, tôi giữ một nhóm trong số này được lưu trữ để đôi khi tôi có thể chỉ liên kết mềm nhóm tôi muốn cho một loại dự án cụ thể.


1
Cách tiếp cận này rất đơn giản và hoàn toàn phù hợp với nhu cầu của tôi.
Jinxed

Khi tôi thử điều này và source $HOME/.vimrctừ cục bộ của tôi .vimrc, Vim phàn nàn rằng nó không thể tìm thấy các plugin được cài đặt trên toàn hệ thống của tôi (mầm bệnh trong trường hợp này; execute pathogen#infect()lệnh trên cùng của tôi $HOME/.vimrckhông thành công Unknown function ...). Làm thế nào tôi có thể sửa lỗi này?
Nathan Schulte

20

Việc đặt .vimrc trong thư mục làm việc thực sự được hỗ trợ, chỉ bị tắt theo mặc định. Xem :h 'exrc':h startupđể biết chi tiết, cài đặt 'exrc'sẽ cho phép đọc .vimrctừ thư mục hiện tại.

Nó cũng được khuyến khích :set securekhi sử dụng điều này. Thao tác này sẽ khóa :autocmd, trình bao và ghi các lệnh .vimrctrong thư mục hiện tại.

Một điều khác có thể đáng xem xét là thiết lập một phiên ( :h session) với chế độ xem tiêu chuẩn và cài đặt cho dự án.

Tất cả những gì đã nói, tôi có thể sẽ sử dụng tùy chọn plugin do chính Luc Hermitte chi tiết.


6
Mời các bạn xem comment của một phen. Điều này có thể dẫn đến những tác động nghiêm trọng về bảo mật.
dữ liệu

11

Để giảm thiểu rủi ro bảo mật với BẤT KỲ tính năng "tự động chạy" nào cho BẤT KỲ ĐIỀU GÌ ngày nay, tôi có thể khuyên bạn sử dụng các tính năng hiện có của vim thay vì các plugin (hành lý di động) không?

Ví dụ.

Tệp vimrc của thư mục cục bộ của tôi có tên là "_gvimrc" (có chủ đích). Điều này làm giảm hy vọng cho những người như chúng ta khỏi việc tự vui với chi phí của chúng tôi. :-)

Trong tệp $ VIM / .vimrc của tôi, tôi đã chèn:

if filereadable("_gvimrc")
    source _gvimrc
endif

cuối cùng.

Tôi sử dụng "filereadable ()" over "fileexists ()" vì sau này có một số điều kỳ quặc khi bị tra tấn với việc mở nhiều (10+) tệp đồng thời, (không rõ tại sao).

Tất nhiên, bạn có thể đặt tên tệp duy nhất của riêng mình để ngăn chặn những kẻ gây sự cố tiềm ẩn hơn nữa. Chẳng hạn như "_mygvimrc", "_gobbledygook", v.v. Bạn chỉ cần xác định một tên đã được chuẩn hóa và đặt tên nó tương ứng trong $ VIM / .vimrc của bạn. Dựa vào nội bộ vi / vim để giải quyết các vấn đề về tính di động. NHƯNG, KHÔNG đặt tên nó là .vimrc (hoặc _vimrc) để ngăn việc tìm nguồn đệ quy trong trường hợp bạn đang chỉnh sửa tệp $ VIM / .vimrc bằng vim sau này.

Đã sử dụng tính năng này kể từ Windoze 98SE, qua Windork XP Pro, và bây giờ là Windorkier 7 (hơn 5 năm rồi). Tôi sẽ đánh dấu danh sách các tệp .txt trong Explorer và sau đó sử dụng "Chỉnh sửa với nhiều Vim", dẫn đến việc mở nhiều cửa sổ vim cùng một lúc. Đối với công việc của tôi, tôi làm điều này vài lần một ngày, hàng ngày. Tất cả các tệp được xử lý bằng những gì tôi đặt trong _gvimrc cục bộ của mình.


Ở đây, sự nghi ngờ về tính di động của plugin không có cơ sở vì các plugin local_vimrc này (ít nhất là của tôi) là có thể di động (nó từng được duy trì trên nhiều hệ điều hành khác nhau và thậm chí cả windows 95). Vấn đề về rủi ro bảo mật cũng được phóng đại: nếu chúng tôi làm theo cách này, chúng tôi sẽ không bao giờ cài đặt bất cứ thứ gì để giảm bớt công việc của chúng tôi.
Luc Hermitte

Tuy nhiên, theo như tôi liên quan, vấn đề thực sự đầu tiên là, với cách tiếp cận của bạn, bạn phải làm việc từ thư mục chính xác chứa tệp _gvimrc (một tên xấu vì nó có nghĩa là chứa các nội dung cụ thể của gvim). Nếu dự án của bạn được tạo từ một số thư mục, có thể yêu cầu cấu hình chung và những thư mục cụ thể (trong trường hợp có nhiều mô-đun), điều này sẽ nhanh chóng cho thấy những hạn chế của nó.
Luc Hermitte

Vấn đề thứ hai là bạn chỉ có thể làm việc trên một dự án tại thời điểm - nếu tôi muốn làm việc trên OTB, openjpeg và một dự án nhập cả hai thư viện, giải pháp này sẽ không cho phép tôi có cài đặt cụ thể cho từng ba dự án.
Luc Hermitte

Điều này cũng hoạt động để tải chuỗi liên kết một tệp cú pháp từ một thư mục cục bộ.
maharvey67,

2

Giả sử mọi người không thêm tệp vài ngày một lần, bạn có thể thêm một mô hình ở đầu mỗi tệp. Trên thực tế, nếu hệ thống kiểm soát phiên bản của bạn cho phép, bạn có thể thực thi một quy tắc nói rằng mỗi tệp phải có một mô hình khi nó được đăng ký.



2

Sử dụng "editorconfig"

Nếu các loại tiêu chuẩn mã hóa bạn muốn thực thi có liên quan đến kiểu thụt lề, kích thước tab, định dạng tệp và bộ ký tự, thì bạn có thể muốn xem xét "editorconfig" , là một tiêu chuẩn biên tập chéo để chỉ định loại cài đặt này trong một dự án cụ thể và yêu cầu tất cả các biên tập viên tuân theo cấu hình đó.

Đặc tả "editorconfig" cho phép các dự án yêu cầu các cài đặt khác nhau tùy thuộc vào phần mở rộng tệp hoặc tên trong dự án. (Vì vậy, bạn có thể có các tệp Makefiles sử dụng TAB, các tập lệnh Python của bạn sử dụng 4 dấu cách và các tập lệnh shell của bạn sử dụng 2 dấu cách để thụt lề.)

Bạn cần một trình cắm thêm để sử dụng "editorconfig" trong Vim. Trang web chính thức cung cấp một cái, nhưng cá nhân tôi khuyên bạn nên dùng sgur / vim-editorconfig , được viết bằng Vimscript thuần túy, vì vậy bạn không cần phải lo lắng về các phụ thuộc bên ngoài quá nhiều.

Vì "editorconfig" hướng đến khả năng tương thích với nhiều trình soạn thảo, nó khá hạn chế về những gì nó làm được, vì vậy nếu bạn muốn có khoảng trắng nhất quán, định dạng tệp (DOS so với Unix) và mã hóa (Unicode utf-8, v.v.), thì "editorconfig " Dành cho bạn.



0

Tôi đã xem xét các plugin đã tồn tại và không thực sự ưa thích bất kỳ plugin nào trong số đó, vì vậy tôi đã viết một chức năng đơn giản để hỗ trợ vim-fugitive . Ưu điểm của điều này là nó biết gốc của dự án luôn là gốc của kho lưu trữ và ngoài ra tôi có thể băm tệp để giữ bảng tin cậy. Chỉ cần đưa thông tin sau vào .vimrctệp của bạn .

function LoadRepoVimrc()
  let l:path = fugitive#repo().tree('.vimrc')
  if filereadable(l:path)
    let l:sha1 = fugitive#repo().git_chomp('hash-object',l:path)
    if !exists('g:SAFE_VIMRC') | let g:SAFE_VIMRC = {} | endif
    if has_key(g:SAFE_VIMRC,l:path) && g:SAFE_VIMRC[l:path] ==? l:sha1
      execute 'source '.fnameescape(l:path)
    elseif confirm("Trust ".l:path."?", "&Yes\n&No",2) == 1
      let g:SAFE_VIMRC[l:path] = l:sha1
      execute 'source '.fnameescape(l:path)
    else
      execute 'sandbox source '.fnameescape(l:path)
    endif
  endif
endfunction
autocmd User FugitiveBoot call LoadRepoVimrc()
set viminfo ^= !

Nếu !tùy chọn được đặt trên viminfocài đặt, thì SAFE_VIMRCtừ điển sẽ được giữ nguyên giữa các lần chạy (lưu ý ^thêm tùy chọn trước để nó không làm rối ntùy chọ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.