Bật và tắt lệnh `match`
Tôi thấy cài đặt hữu ích này tạo thành bài đăng này , làm nổi bật các khoảng trắng ở cuối:
highlight ExtraWhitespace ctermbg=grey guibg=grey
noremap <F10> :match ExtraWhitespace /\s\+$/<CR>
Điều này hoạt động khi tôi nhấn vào F10 nhưng tôi cũng muốn phần đánh dấu biến mất khi tôi nhấn vào F10 một lần nữa. Việc nhập liệu :matchhoạt động nhưng tôi tự hỏi liệu điều này có thể được thực hiện từ chính sơ đồ bàn phím này hay không. Tôi đã thử đặt !sau matchnhưng điều đó không được phép.
Trả lời
Bạn có thể nhận được Danh sách tất cả các kết quả phù hợp đã được xác định trước đó cho cửa sổ hiện tại với getmatches()hàm. Bằng cách sử dụng một <expr>ánh xạ, bạn có thể đặt động một ánh xạ dựa trên kích thước của Danh sách được trả về bởi getmatches()một biểu thức điều kiện.
Biểu thức điều kiện trong Vimscript (thường được gọi là biểu thức bậc ba trong các ngôn ngữ khác) có dạng sau:
a ? b : c
ở đâu a, bvà clà các biểu thức. Nếu được ađánh giá là true, thì biểu thức điều kiện nói chung sẽ đánh giá là b, nếu không, nó sẽ đánh giá là c.
Biểu thức sau sẽ đánh giá ':match<CR>'xem độ dài của Danh sách được trả về getmatches()lớn hơn 0 hay không, nếu không, nó sẽ đánh giá là ':match ExtraWhitespace /\s\+$/<CR>'.
len(getmatches()) > 0 ? ':match<CR>' : ':match ExtraWhitespace /\s\+$/<CR>'
Sử dụng một <expr>ánh xạ cho phép bạn đánh giá một biểu thức để xác định chức năng của ánh xạ, thay vì một giá trị tĩnh. Kết quả của biểu thức phải là một biểu diễn chuỗi của các lệnh Ex mong muốn.
Vì vậy, đặt biểu thức điều kiện của chúng ta cùng với <expr>ánh xạ của chúng ta , chúng ta có thể làm như sau:
noremap <expr> <F10> len(getmatches()) > 0 ? ':match<CR>' : ':match ExtraWhitespace /\s\+$/<CR>'
Trợ giúp liên quan:
:h :map-<expr>
:h getmatches()