当vim进入可视模式时运行命令

Sau*_*ier 8 vim triggers

我使用一个小脚本来触发插入模式,以便更改行号颜色:

function! CursorLineNrColorInsert(mode)
    " Insert mode: blue
    if a:mode == "i"
        highlight CursorLineNr ctermfg=4
        highlight CursorLineNr guifg=#268bd2

    " Replace mode: red
    elseif a:mode == "r"
        highlight CursorLineNr ctermfg=1
        highlight CursorLineNr guifg=#dc322f

    else
        highlight CursorLineNr ctermfg=0
        highlight CursorLineNr guifg=#073642

    endif
endfunction

autocmd InsertEnter * call CursorLineNrColorInsert(v:insertmode)
autocmd InsertLeave * highlight CursorLineNr ctermfg=0
autocmd InsertLeave * highlight CursorLineNr guifg=#073642
Run Code Online (Sandbox Code Playgroud)

当我进入任何插入模式并在正常模式下恢复为原始颜色时,这非常正常并且会立即更改我的行号.

我想对视觉模式做同样的事情:

function! CursorLineNrColorVisual(mode)
    " Visual mode: orange
    if mode()=~#"^[vV\<C-v>]"
        highlight CursorLineNr ctermfg=9
        highlight CursorLineNr guifg=#cb4b16

    else
        highlight CursorLineNr ctermfg=0
        highlight CursorLineNr guifg=#073642

    endif
endfunction

autocmd CursorMoved * call CursorLineNrColorVisual(mode())
Run Code Online (Sandbox Code Playgroud)

基本上它可以工作,但不会立即触发功能CursorMoved.一旦激活任何视觉模式,我怎么能CursorLineNrColorVisual() 立即开火?

Sau*_*ier 8

花了一些时间后,:help我结束了以下设置:

" Colorize line numbers in insert and visual modes
" ------------------------------------------------
function! SetCursorLineNrColorInsert(mode)
    " Insert mode: blue
    if a:mode == "i"
        highlight CursorLineNr ctermfg=4 guifg=#268bd2

    " Replace mode: red
    elseif a:mode == "r"
        highlight CursorLineNr ctermfg=1 guifg=#dc322f

    endif
endfunction


function! SetCursorLineNrColorVisual()
    set updatetime=0

    " Visual mode: orange
    highlight CursorLineNr cterm=none ctermfg=9 guifg=#cb4b16
endfunction


function! ResetCursorLineNrColor()
    set updatetime=4000
    highlight CursorLineNr cterm=none ctermfg=0 guifg=#073642
endfunction


vnoremap <silent> <expr> <SID>SetCursorLineNrColorVisual SetCursorLineNrColorVisual()
nnoremap <silent> <script> v v<SID>SetCursorLineNrColorVisual
nnoremap <silent> <script> V V<SID>SetCursorLineNrColorVisual
nnoremap <silent> <script> <C-v> <C-v><SID>SetCursorLineNrColorVisual


augroup CursorLineNrColorSwap
    autocmd!
    autocmd InsertEnter * call SetCursorLineNrColorInsert(v:insertmode)
    autocmd InsertLeave * call ResetCursorLineNrColor()
    autocmd CursorHold * call ResetCursorLineNrColor()
augroup END
Run Code Online (Sandbox Code Playgroud)

为了在离开可视模式后恢复行号的颜色,我必须执行以下步骤:

  1. 重新映射相关的键绑定以调用"输入 - 视觉功能"
  2. 在进入可视化模式的功能设置updatetime=0CursorHold活动
  3. 称之为"离开视觉功能" autocmd CursorHold
  4. 虽然离开可视模式功能重置updatetime=4000CursorHold事件

  • 在尝试这个之后进行了一些小的观察:1.我建议在`SetCursorLineNrColorVisual`函数的最后一行添加一个`return''`,以防止光标在进入可视模式时跳过当前行的开头.2.如果按照我的建议添加"return"调用,那么在颜色更新之前需要按下一个键.这有点hacky,但是在每个`nnoremap`行的末尾你可以添加`<left> <right>`.颜色更新,因为它像输入一样,并且因为它再次向右移动光标,你甚至不应该注意到. (2认同)

Ing*_*kat 5

正如 romainl 所指出的,没有进入/退出可视模式的事件。我会这样做:

function! CursorLineNrColorVisual()
    ...
    return ''   " Return nothing to make the map-expr a no-op.
endfunction
vnoremap <expr> <SID>CursorLineNrColorVisual CursorLineNrColorVisual()
nnoremap <script> v v<SID>CursorLineNrColorVisual
nnoremap <script> V V<SID>CursorLineNrColorVisual
nnoremap <script> <C-v> <C-v><SID>CursorLineNrColorVisual
Run Code Online (Sandbox Code Playgroud)

或者,您可以尝试将表达式 ( %{CursorLineNrColorVisual}) 放入'statusline'; 这经常被评估。