Thay đổi hình dạng con trỏ trong chế độ chờ toán tử


9

Con trỏ của tôi trong Gvim:

Con trỏ của tôi trong Gvim

Con trỏ của tôi trong Gvim sau khi nhấn d:

Con trỏ của tôi trong Gvim sau khi nhấn <code> d </ code>

Có cách nào để tôi có thể thay đổi con trỏ trong terminal Vim khi ở chế độ chờ toán tử không? Nó không phải trông giống hệt như ảnh chụp màn hình.

Điều này được thực hiện bởi o:hor50-Cursortrong guicursorGvim. Ba tùy chọn duy nhất tôi thấy cho Vim là:

t_SI    start insert mode (bar cursor shape)        *t_SI* *'t_SI'*
t_SR    start replace mode (underline cursor shape) *t_SR* *'t_SR'*
t_EI    end insert or replace mode (block cursor shape) *t_EI* *'t_EI'*
    |termcap-cursor-shape|

Nhưng không có gì về chế độ chờ xử lý của nhà điều hành ...


2
Tôi không nghĩ rằng nó có thể (có thể sử dụng một bản vá mã nguồn ..). Những gì tôi làm là nhìn vào phía dưới bên phải của cửa sổ Vim để kiểm tra các chữ cái được giới thiệu một phần, hiển thị ở đó (với showcmdcài đặt bật). Tôi cũng vô hiệu hóa tất cả thời gian chờ và esckeystùy chọn (điều này giúp Vim luôn linh hoạt nhưng cho phép tôi suy nghĩ về những gì tôi muốn làm trong chế độ chờ xử lý chẳng hạn).
VanLaser

1
@VanLaser Vâng, nhưng tôi thích con trỏ ;-)
Martin Tournoij

Hehe, tôi có thể hiểu điều đó :)
VanLaser

Tôi biết C / C ++, cung cấp $ bounty và tôi có thể thử triển khai nó trong mã nguồn Vim, nếu có thể: D
VanLaser

Bạn có thể sử dụng vi.stackexchange.com/a/11437/10337 để phát hiện chế độ chờ toán tử và lặp lại một lối thoát ansi để thay đổi con trỏ.
laktak

Câu trả lời:


3

Điều này cập nhật con trỏ khi vào / thoát chế độ chờ toán tử.

Mặc dù đó là một chút của một giải pháp hacky, tôi không nghĩ rằng nó có bất kỳ vấn đề hiệu suất.

" This is esentially:
"   exec 'silent !printf "\e[" . a:t . ' q'
"   redraw!
" but without the screen flash
function! s:setCursor(t)
    " Save existing values.
    let [l:title, l:t_ts, l:t_fs, l:titlestring] = [&title, &t_ts, &t_fs, &titlestring]

    try
        let &titleold = ''
        let &t_ts = "\e[0;0"
        let &t_fs = "\e[" . a:t . ' q'
        set title
        set titlestring=H
        redraw!
    finally
        let [&title, &t_ts, &t_fs, &titlestring] = [l:title, l:t_ts, l:t_fs, l:titlestring]
    endtry
endfunction

let s:prevmode = ''
function! DetectPendingMode(timer)
    let l:mode = mode(1)
    if l:mode is# s:prevmode
        return
    endif

    if l:mode is# 'no'
        call <SID>setCursor(4)
    elseif s:prevmode is# 'no'
        call <SID>setCursor(2)
    endif
    let s:prevmode = l:mode
endfunction

call timer_start(250, 'DetectPendingMode', {'repeat': -1})

Bạn có thể cần thay đổi kiểu của con trỏ SetCursor()thành kiểu bạn thích:

0: blinking block.
1: blinking block.
2: steady block.
3: blinking underline.
4: steady underline.
5: blinking bar (xterm).
6: steady bar (xterm).
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.