Переменные состояния в VIM

Переменные состояния в VIM

Есть ли способ иметь переменную состояния в 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... таа-даа!

Мне нравится триггл...

Связанный контент