在操作员待定模式下更改光标形状


9

我在Gvim中的光标:

我在Gvim中的光标

按下后,我在Gvim中的光标d

按<code> d </ code>后,我在Gvim中的光标

在操作员挂起模式下,有什么方法可以在终端Vim中更改光标?它不必看起来完全像截图一样。

这是由Gvim 的o:hor50-Cursorin 完成的guicursor。我为Vim看到的唯一三个选项是:

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|

但是关于操作员挂起模式的一切...


2
我认为这是不可能的(可以使用源代码补丁..)。我要做的是查看Vim窗口的右下角,以查看部分显示的命令字母,这些字母显示在该位置(showcmd启用设置)。我还禁用了所有超时和esckeys选项(这使Vim保持活泼,但允许我考虑要在op-pending模式下执行的操作)。
VanLaser

1
@VanLaser是的,但我喜欢光标;-)
Martin Tournoij

呵呵,我可以理解:)
VanLaser

我知道C / C ++,提供$赏金,如果可能的话,我可能会尝试在Vim源代码中实现它:D
VanLaser

您可以使用vi.stackexchange.com/a/11437/10337来检测操作员挂起模式并回显ansi转义以更改光标。
laktak

Answers:


3

进入/退出操作员挂起模式时,这将更新光标。

虽然这有点棘手,但我认为它没有任何性能问题。

" 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})

您可能需要将光标样式更改为SetCursor()您喜欢的样式:

0: blinking block.
1: blinking block.
2: steady block.
3: blinking underline.
4: steady underline.
5: blinking bar (xterm).
6: steady bar (xterm).
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.