Zustandsvariablen in VIM

Zustandsvariablen in VIM

Gibt es eine Möglichkeit, eine Statusvariable in VIM zu haben? Bedenken Sie:

" 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

Natürlich useRelNumsist undefiniert. Ich möchte diese Variable zwischen den Aufrufen der NumberToogle()Funktion definiert halten, also eine Statusvariable. Wie wird das gemacht? Ich bin sicher, dass ich als Workaround eine andere VIM-Variable verwenden könnte (wie etwa den Status von pastefür ein schlechtes Beispiel), aber ich würde eine echte Lösung bevorzugen.

Danke.

Antwort1

Sie können globale Variablen mit let g:use_rel_numbersoder einführen let g:use_rel_numbers=1. Lokale Variablen wären meiner Meinung nach besser – let b:use_rel_numberszum Beispiel und setlocal relativenumber.

Antwort2

Sie können die Einstellungen selbst als gewünschte Statusvariablen verwenden. Sie sind boolesch und exklusiv. Wenn Sie „Zahl“ aktivieren, wird „RelativeZahl“ deaktiviert und umgekehrt.

Sie könnten also Folgendes tun:

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

Ein schöner Dreizustandsschalter. (triggle?) (triggle?) {achselzucken} Ihre Entscheidung …

UND … dies lässt sich nahtlos mit Ihren gewünschten Autocmds verbinden, da sie auch die Booleschen Werte für „Zahl“/„RelativeZahl“ beeinflussen … taa, daa!

Ich mag Triggle ...

verwandte Informationen