2012-12-23 30 views
7

Tôi cần một cách đơn giản (hoặc phức tạp) để tìm ra chế độ người dùng đang ở. Tôi cần biết liệu người dùng có ở chế độ Bình thường, Chèn, Trực quan, Thay thế, Thay đổi, v.v.Vim: Cách phát hiện chế độ mà người dùng ở trong trạng thái nào?

Tôi biết mode() chức năng, tuy nhiên tôi không thể tìm ra cách để làm cho nó đầu ra một chuỗi đầy đủ thay vì chỉ một ký tự.

Kế hoạch của tôi là tạo một chức năng tự động thay đổi màu nền và màu nền trước của dòng trạng thái tùy thuộc vào chuỗi trả về mode(). Về cơ bản một chức năng với một loạt các ifs và elseifs mà sẽ làm điều đó cho tôi. Có một lỗ hổng với cách tiếp cận này mặc dù, tôi không thể biết màu sắc thiết lập chủ đề theo mặc định cho điều đó.

Vì vậy, về cơ bản, tôi cần một số lời khuyên/giúp đỡ về cách làm cho một chức năng nào sau đây:.

  • Knows chế độ mà người sử dụng đang ở Phần còn lại của các chức năng phản ứng khác nhau mỗi lần thay đổi này.
  • Đặt một số biến với các giá trị fgbg phản ánh những gì chủ đề hiện tại đã đặt cho chúng.
  • Thay đổi nền trước và nền của dòng trạng thái tùy thuộc vào các giá trị này.

Tôi đã thử làm điều đó, nhưng đó là một cách rất thô lỗ khi thực hiện nó và nó không hoạt động chút nào. Nó chỉ thiết lập màu sắc một lần và sau đó nó không phản ứng mỗi khi nó thay đổi.

Cảm ơn sự giúp đỡ của bạn! :)

EDIT:

Khá chắc chắn những gì tôi đã cố gắng trước đó không làm việc được điều này:

function! StatuslineModeColor() 
    let s:StatuslineMode=mode() 
    if s:StatuslineMode == 'n' 
     hi Statusline ctermbg=blue guibg=blue 
    elseif s:StatuslineMode == 'i' 
     hi Statusline ctermbg=red guibg=red 
    endif 
endfunc 

Và trong statusline tôi đặt như sau:

let &stl.='%{StatuslineModeColor()}' 

EDIT 2:

Tôi đã tìm ra rằng về cơ bản những gì tôi cần làm là tìm cách lấy bất kỳ màu nào s chủ đề đã được sử dụng trước đây. Đó là nếu tôi sử dụng giải pháp này: http://www.reddit.com/r/vim/comments/gexi6/a_smarter_statusline_code_in_comments/c1n2oo5

Tuy nhiên giải pháp này không lý tưởng trong tiêu chuẩn của tôi, vì nó không sạch sẽ hoặc sạch sẽ vì nó có thể gây ra nhiều lộn xộn. :/

+0

@romainl Xong, quên thêm điều đó. :) Nó không phải là chức năng chính xác tôi đã sử dụng trước đây, nhưng nó khá gần. – greduan

+0

@romainl Tôi dường như đã tìm thấy một phiên bản Reddit tốt về điều này: http://www.reddit.com/r/vim/comments/gexi6/a_smarter_statusline_code_in_comments/c1n2oo5 Chỉ có vấn đề với điều này là nó không lấy các giá trị từ bản thân chủ đề, những gì có thể là một cách tốt để làm điều đó? – greduan

+0

1. Bạn cần 'mode()' để xuất chuỗi đầy đủ? 2. Biến script-local làm gì trong hàm của bạn? Nó phải là một địa phương ('l:' hoặc không có gì thay cho 's:'). – ZyX

Trả lời

2

Cập nhật tháng 10 2016: Kể từ đó dotfiles tôi đã chuyển sang https://gitlab.com/greduan/dotfiles, vì vậy các URL mới cho tập tin là: https://gitlab.com/greduan/dotfiles/blob/76e16dd8a04501db29989824af512c453550591d/vim/after/plugin/statusline.vim

Tất cả các đường đều giống nhau.


Vì không ai đã đưa ra một câu trả lời tôi đã thực hiện giải pháp của riêng mình, bạn có thể tìm thấy nó ở đây: https://github.com/Greduan/dotfiles/blob/76e16dd8a04501db29989824af512c453550591d/vim/after/plugin/statusline.vim#L3-L42

Về cơ bản nó như sau:

Lines 3 to 23 định nghĩa một biến toàn cầu với một từ điển chứa tất cả các chế độ khác nhau, dịch nó thành một văn bản có thể đọc được.Vì vậy, n viết tắt thường được dịch sang Normal, i-Insert, vv

Lines 25 to 42 xác định các chức năng mà sẽ thay đổi màu sắc của statusline. Hiện tại, nó chỉ hỗ trợ Solarized và chỉ khi phiên bản của bạn có số này fork/pull request. Nếu bạn đáp ứng các yêu cầu này, bạn sẽ nhận được một nền màu đỏ khi bạn đang ở chế độ chèn và nền màu xanh lục khi ở bất kỳ loại chế độ trực quan nào, phần còn lại của các chế độ sẽ giống như bình thường.

lines 118 to 119 đặt hàm đã xác định trong dòng trạng thái và cũng xuất ra chế độ hiện tại ở định dạng văn bản bằng biến toàn cục được xác định từ các dòng 3 to 23.

Tôi tin rằng đây là giải pháp sạch hơn nhiều so với bình thường được sử dụng (lệnh tự động và nội dung như tôi đã thấy). Về cơ bản, lỗ hổng duy nhất với nó là không có cách nào để biết các biến của chủ đề, nhưng bạn có thể làm ví dụ hi! link StatusLine Error, điều này sẽ làm cho dòng trạng thái có cùng cú pháp làm nổi bật như lỗi của chủ đề của bạn.

Hy vọng điều này sẽ hữu ích!

+0

Tham chiếu git repo đã bị xóa. – Von

+0

@Von cảm ơn bạn, tôi đã thêm ghi chú để trả lời. :) – greduan

Các vấn đề liên quan