
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 とシームレスにインターフェイスします... やったー!
トリガールが好きです…