
Existe alguma maneira de ter uma variável de estado no VIM? Considerar:
" 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
Claro, useRelNums
é indefinido. Gostaria de manter esta variável definida entre as chamadas à NumberToogle()
função, ou seja, uma variável de estado. Como isso é feito? Tenho certeza de que poderia redirecionar alguma outra variável VIM como solução alternativa (como o estado de paste
para um mau exemplo), mas preferiria uma solução real.
Obrigado.
Responder1
você pode introduzir variáveis globais com let g:use_rel_numbers
ou let g:use_rel_numbers=1
. variáveis locais seriam melhores, eu acho - let b:use_rel_numbers
por exemplo e setlocal relativenumber
.
Responder2
Você pode usar as próprias configurações como variáveis de estado desejadas... elas são booleanas e exclusivas. ativar 'número', desativa 'número relativo' e vice-versa.
Então você poderia fazer:
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
Uma boa alternância de três estados. (triggle?) (troggle?) {encolher os ombros} sua chamada...
E... isso faz interface perfeitamente com os autocmds desejados, pois eles também afetam os booleanos de número/número relativo... taa daa!
Eu gosto de Triggle...