Tôi đang làm việc trên một plugin cho phép người dùng tạo toán tử tùy chỉnh. Các toán tử sẽ áp dụng biểu thức VimL cho đối tượng chuyển động hoặc văn bản mà toán tử di chuyển qua.
Giữ một giao diện người dùng sạch sẽ
Tôi nghĩ rằng giao diện sạch nhất để xác định các toán tử tùy chỉnh sẽ là sử dụng một lệnh. Tôi đã xác định một lệnh :MapExpress
sẽ được gọi như thế này:
:MapExpress cd '/* ' . v:val . ' */'
Điều này sẽ tạo ra một toán tử chế độ Bình thường và ánh xạ chế độ Trực quan để cd
bao quanh chuyển động hoặc lựa chọn trong các dấu phân cách nhận xét kiểu C.
Tất nhiên, đây là một vấn đề. Bạn không thể gọi một lệnh được xác định trong một plugin từ .vimrc
tệp của bạn .
Cách giải quyết ít hơn thỏa mãn
Tôi đã đưa ra một vài cách giải quyết mà tôi không hoàn toàn hài lòng.
Người dùng sử dụng autocmd VimEnter *
để gọi lệnh
Trong khi điều này sẽ làm việc, nó thêm rất nhiều "chi phí tinh thần". Tôi đoán rằng rất nhiều người dùng Vim không nắm vững cách thức autocmd
hoạt động.
Người dùng tạo một tệp trong ~/.vim/after/plugin/
đó gọi lệnh
Một lần nữa, điều này sẽ hoạt động, nhưng có một nhược điểm là phần cấu hình này bị tắt trong tệp riêng của nó, dễ bị mất và bị lãng quên.
Tôi di chuyển các định nghĩa lệnh vào thư mục của plugin autoload/
và người dùng gọi một số phương thức kích hoạt tệp sẽ được tải và do đó các lệnh được xác định
Điều này sẽ trông như thế này:
call express#init()
MapExpress cd '/* ' . v:val . ' */'
Hơi tốt hơn một chút, nhưng điều này sẽ gây nhầm lẫn về việc liệu express#init()
phương thức này có cần thiết để plugin hoạt động hay không.
Các lựa chọn thay thế cho việc sử dụng lệnh
Tôi cũng đã xem xét một số lựa chọn thay thế cho việc sử dụng một lệnh để xác định toán tử, nhưng mỗi lệnh có một số cảnh báo.
Người dùng gọi một hàm để xác định các toán tử
Điều này sẽ trông giống như thế này:
call express#operator('cd', '"/* ".v:val." */"')
Điều này không phải là khủng khiếp, nhưng nó có nhược điểm là yêu cầu một biểu thức trích dẫn. Điều đó có thể gây phiền nhiễu khi bạn muốn sử dụng dấu ngoặc kép trong biểu thức của bạn.
Người dùng sử dụng <expr>
bản đồ
Như thế này:
nmap <expr> cd express#nmap('"/* ".v:val." */"')
xmap <expr> cd express#xmap('"/* ".v:val." */"')
Điều này có cùng yêu cầu biểu thức trích dẫn tẻ nhạt và cũng vi phạm DRY trừ khi bạn đưa ra một biến (không lý tưởng).
Được rồi, vậy thì sao?
Dưới đây là tất cả các ý tưởng của tôi và tại sao tôi không thích bất kỳ ý tưởng nào trong số đó. Có phải tôi đang quá cầu kỳ? Có một số giải pháp tốt hơn mà tôi chưa từng nghĩ đến?
<q-args>
thực sự hoạt động. Cảm ơn
call express#initMapCommands()
nào? Bất cứ điều gì đòi hỏi trích dẫn thêm, mặc dù, là một ý tưởng siêu xấu.