
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 useRelNums
ist 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 paste
fü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_numbers
oder einführen let g:use_rel_numbers=1
. Lokale Variablen wären meiner Meinung nach besser – let b:use_rel_numbers
zum 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 ...