Variáveis ​​de estado no VIM

Variáveis ​​de estado no VIM

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 pastepara um mau exemplo), mas preferiria uma solução real.

Obrigado.

Responder1

você pode introduzir variáveis ​​globais com let g:use_rel_numbersou let g:use_rel_numbers=1. variáveis ​​locais seriam melhores, eu acho - let b:use_rel_numberspor 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...

informação relacionada