Có thể tạo các lệnh tùy chỉnh bộ cài đặt trong các tập tin RC của tôi và gọi chúng từ một modeline không?


10

Gần đây tôi đã hỏi một câu hỏi trong đó tôi đã học được rằng không thể truyền bất cứ điều gì ngoại trừ các tham số vào :settrong mô hình vim. Tôi hiểu các mối quan tâm về bảo mật, nhưng tôi tự hỏi liệu không có cách nào khác xung quanh vấn đề này. Một câu hỏi gần đây về SO về việc thiết lập các lô tham số lớn để tuân thủ tiêu chuẩn mã hóa khiến tôi phải suy nghĩ, liệu có thể định nghĩa một "nhóm" những thứ trong tệp RC của tôi có thể bật hoặc tắt từ modeline không?

Xin lỗi mã giả, nhưng có cách nào để tạo một hàm được kích hoạt từ một tham số đã đặt không?

set_function! codestyle()
    if &1 == 'psr-2'
        set ts=4
        set sw=4
    endfi
    if &1 == 'drupal7'
        set ts=2
        set sw=2
        iab D8 Drupal 8
    endif
endset_function

Điều này sau đó có thể được kích hoạt bởi một modeline như

# vim: codestyle=psr-2

Điều này sẽ theo một số cách tương tự như khớp loại tệp, nhưng cho phép ghi đè thủ công. Nó cũng sẽ thiết lập môi trường theo các cách được xác định trước khác, tránh các vấn đề bảo mật khi có tệp chạy các lệnh tùy ý khác trong vim nhưng cho phép môi trường tùy chỉnh hơn. Có cách nào để làm việc này không?


Điều này sẽ yêu cầu xác định tùy chọn của riêng bạn cho set; AFAIK, điều này là không thể trong Vim ...
Martin Tournoij 17/03/2015

@Carpetsmoker Điều đó có nghĩa là câu trả lời cho câu hỏi này là vimscript không thể bao bọc hoặc mở rộng các hàm tích hợp?
Caleb

Câu trả lời:


10

Bạn có một vài lựa chọn.

  1. Đầu tiên: Bạn có thể viết loại bộ giải mã modeline của riêng bạn, tức là một plugin. Đây là một câu trả lời rất giống với câu tôi đưa ra cho câu hỏi khác của bạn.

    Thật vậy, chúng ta không thể thêm các tùy chọn vim mới (có thể được đặt bằng :set), nhưng chúng ta có thể thêm các biến mới. Và chúng ta không thể sử dụng các mô hình chuẩn để làm nhiều hơn là thiết lập các tùy chọn vim.

  2. Khả năng thứ hai: let-modeline có thể được khai thác thông qua tính năng gọi lại để gọi hàm này hay hàm khác. Bạn có thể có CodeStyle()chức năng của mình trong .vimrcplugin hoặc (tự động tải?), Sau đó có tệp của bạn chứa:

    # VIM: let b:codestyle='psr-2' b:ModeLine_CallBack='CodeStyle'
    

    Nhưng nếu nhu cầu của bạn là chính xác và nếu bạn thực sự không muốn các plugin như local_vimrc , thì hãy viết bộ giải mã giống như mô hình của riêng bạn.

  3. Thứ ba, và IMO, sự lựa chọn tốt hơn trong trường hợp đó sẽ là xác định một kiểu tệp mới và đặt 'ft'thành kiểu tệp này trong các mô hình với : # vim: set ft=php.psr2. Với phpkiểu tệp thông thường toàn cầu (tôi không chắc chắn về kiểu này) và psr2là kiểu tệp chuyên biệt sẽ tương ứng với kiểu mã hóa của bạn. Bạn sẽ phải xác định hai ftplugins: ftplugin / psr2.vim và ftplugin / drupal7.vim nơi bạn sẽ thực hiện cuộc gọi của mình :setlocal(và không :set).


6
Nâng cao cho tùy chọn 3. Tôi nghĩ rằng đây là cách tiếp cận phù hợp nhất về mặt ngữ nghĩa và phù hợp với Vim.
tommcdo 17/03/2015
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.