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

1

Есть ли способ иметь переменную состояния в 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для плохого примера), но я бы предпочел реальное решение.

Благодарю.

dotancohen
источник

Ответы:

2

Вы можете ввести глобальные переменные с помощью let g:use_rel_numbersили let g:use_rel_numbers=1. локальные переменные были бы лучше, я думаю - let b:use_rel_numbersнапример, и setlocal relativenumber.

epsilonhalbe
источник
1

Вы можете использовать сами настройки в качестве желаемых переменных состояния ... они являются логическими и эксклюзивными. включение «число», отключение «относительный номер», и наоборот.

Так что вы могли бы сделать:

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

Хороший трехсторонний тумблер. (triggle?) (troggle?) {пожимает плечами} ваш звонок ...

И ... это легко взаимодействует с желаемыми автоматическими командами, так как они также влияют на логические числа / относительные числа ... даааа!

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

lornix
источник
@epsilon делает хорошую мысль, вероятно, должно быть setlocal ...действительно. Э-э ... Я копировал стиль автора с переменной областью действия ... да ... это то, что я делал ... да ... Но справка vim утверждает, что число / относительное число в любом случае локально для окна. не повредит, хотя, безусловно, помогает передать намерение, что они являются окнами PER / буфер / thingamabob.
lornix
Спасибо, Лорникс. Использование текущего состояния relativenumberне поможет, так как состояние сбрасывается при входе / выходе из режима вставки. Вот почему я пытаюсь сделать что-то более сложное.
Dotancohen