Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Is there any way to have a state variable in VIM? Consider:

" 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
    let useRelNums=0
    set relativenumber

Of course, useRelNums is undefined. I would like to keep this variable defined between calls to the NumberToogle() function, i.e. a state variable. How is this done? I'm sure that I could repurpose some other VIM variable as a workaround (such as the state of paste for a bad example) but I would prefer a real solution.


share|improve this question
up vote 2 down vote accepted

you may introduce global variables with let g:use_rel_numbers or let g:use_rel_numbers=1. local variables would be better i think - let b:use_rel_numbers for example and setlocal relativenumber.

share|improve this answer

You can use the settings themselves as your desired state variables... they're boolean, and exclusive. turning on 'number', turns off 'relativenumber', and vice-versa.

So you could do:

function! ToggleNumbers()
    if &number
        set relativenumber       " was number, now relanum
    elseif &relativenumber
        set norelativenumber     " was relanum, now nothing
        set number               " was nothing, now number

A nice three-state toggle. (triggle?) (troggle?) {shrug} your call...

AND... this interfaces seamlessly with your desired autocmds since they affect the number/relativenumber booleans too... taa daa!

I like triggle...

share|improve this answer
@epsilon makes a good point, probably should be setlocal ... really. Uh... I was copying the variable scope style of the author...yeah... that's what I was doing... yeah... But the vim help states that number/relativenumber are local to the window anyways. doesn't hurt though, certainly helps convey the intent that they are PER windows/buffer/thingamabob. – lornix Jul 1 '12 at 14:15
Thanks, lornix. Using the current state of relativenumber won't help as the state is reset when entering / leaving Insert mode. That is why I am trying to do something more elaborate. – dotancohen Jul 1 '12 at 18:03

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.