
Есть ли способ иметь переменную состояния в 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
Хороший переключатель с тремя состояниями. (триггер?) (троггер?) {пожимает плечами} ваш вызов...
И... это прекрасно взаимодействует с вашими желаемыми автокомандами, поскольку они также влияют на логические значения number/relativenumber... таа-даа!
Мне нравится триггл...