10

行番号の色を変更するために、小さなスクリプトを使用して挿入モードをトリガーします。

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

これは非常にうまく機能し、挿入モードに入るとすぐに行番号が変更され、通常モードでは元の色に戻ります。

ビジュアルモードでも同じことをしたいと思います。

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())

基本的には機能しますが、関数がでトリガーされるため、すぐには機能しませんCursorMoved。ビジュアルモードをアクティブにするとすぐCursorLineNrColorVisual() 発砲するにはどうすればよいですか?

4

3 に答える 3

10

しばらく時間を費やした後: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

ビジュアル モードを終了した後に行番号の色を復元するには、次の手順を実行する必要がありました。

  1. 「enter-visual-function」を呼び出すために、関連するキー バインディングを再マップします。
  2. ビジュアルモードに入ると、イベントの関数が設定updatetime=0されますCursorHold
  3. によって「leave-visual-function」を呼び出しますautocmd CursorHold
  4. ビジュアルモードを終了すると、イベントの関数がリセットさupdatetime=4000れますCursorHold
于 2013-03-23T12:54:18.367 に答える
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

%{CursorLineNrColorVisual}または、式 ( ) を'statusline';に入れてみることもできます。これはかなり頻繁に評価されます。

于 2013-03-22T07:44:19.493 に答える