VIM の状態変数

VIM の状態変数

VIM で状態変数を持つ方法はありますか? 次の点を考慮してください:

" Relative line numbers in Normal mode, absolute in Insert mode. Ctrl-N to toggle 
set relativenumber
autocmd InsertEnter * :set number
autocmd InsertLeave * :set relativenumber
inoremap <C-n> <C-o>:call NumberToggle()<cr>
nnoremap <C-n> :call NumberToggle()<cr>
function! NumberToggle()
  if(useRelNums != 1)
    let useRelNums=1
    set number
  else
    let useRelNums=0
    set relativenumber
  endif
endfunc

もちろん、 はuseRelNums未定義です。関数の呼び出し間でこの変数を定義されたままにしておきたいNumberToogle()、つまり状態変数にしたいのです。これはどのように行うのでしょうか? 回避策として他の VIM 変数 (悪い例として の状態などpaste) を再利用できることは確かですが、実際の解決策を希望します。

ありがとう。

答え1

let g:use_rel_numbersまたはを使用してグローバル変数を導入できますlet g:use_rel_numbers=1。ローカル変数の方が良いと思います -let b:use_rel_numbersたとえば、 およびsetlocal relativenumber

答え2

設定自体を希望の状態変数として使用できます。設定はブール型で排他的です。「number」をオンにすると「relativenumber」がオフになり、その逆も同様です。

つまり、次のようにすることができます:

function! ToggleNumbers()
    if &number
        set relativenumber       " was number, now relanum
    elseif &relativenumber
        set norelativenumber     " was relanum, now nothing
    else
        set number               " was nothing, now number
    endif
endfunction

素晴らしい 3 段階トグルです。(トリガー?) (トログル?) {肩をすくめる} お任せします...

さらに...これは、number/relativenumber ブール値にも影響するため、必要な autocmd とシームレスにインターフェイスします... やったー!

トリガールが好きです…

関連情報