Variables de estado en VIM

Variables de estado en VIM

¿Hay alguna forma de tener una variable de estado en 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

Por supuesto, useRelNumsno está definido. Me gustaría mantener esta variable definida entre llamadas a la NumberToogle()función, es decir, una variable de estado. ¿Cómo se hace esto? Estoy seguro de que podría reutilizar alguna otra variable VIM como solución alternativa (como el estado de pasteun mal ejemplo), pero preferiría una solución real.

Gracias.

Respuesta1

puedes introducir variables globales con let g:use_rel_numberso let g:use_rel_numbers=1. Creo que las variables locales serían mejores, let b:use_rel_numberspor ejemplo y setlocal relativenumber.

Respuesta2

Puede usar las configuraciones mismas como las variables de estado que desee... son booleanas y exclusivas. Al activar 'número', se desactiva 'número relativo' y viceversa.

Entonces podrías hacer:

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

Un bonito cambio de tres estados. (¿triggle?) (¿troggle?) {encogimiento de hombros} tu llamada...

Y... esto interactúa perfectamente con los autocmds que desees, ya que también afectan los valores booleanos de número/número relativo... ¡taa daa!

Me gusta el triggle...

información relacionada