
¿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, useRelNums
no 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 paste
un mal ejemplo), pero preferiría una solución real.
Gracias.
Respuesta1
puedes introducir variables globales con let g:use_rel_numbers
o let g:use_rel_numbers=1
. Creo que las variables locales serían mejores, let b:use_rel_numbers
por 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...