Fandom

Vim Tips Wiki

Not So Quick generic option toggling

Redirected from VimTip925

1,624pages on
this wiki
Add New Page
Talk0 Share

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Tip 925 Printable Monobook Previous Next

created May 9, 2005 · complexity intermediate · author Eric Arnold · version 6.0


This allows "toggling" of more complex operations, like switching off "diffthis". It also reduces the number of key mappings used overall by placing the operations under a key activated command window menu. It is quick to use (mapped key + one more keystroke), even if it isn't as quick to write. I stuck it in my plugin directory as "ToggleOptions.vim".

This was inspired by VimTip920.

" ToggleOptions.vim
" vim6:fdm=marker:foldenable:ts=4:sw=4
" Author: Eric Arnold
" Created: Mon May 09, 05/09/2005 05:04:17
map <Leader>o :ToggleOptions<CR>
command! ToggleOptions call ToggleOptionsMenu()

function! ToggleOptionsMenu()
  let l:char = s:Char_menu( "{w}rap, {W}rapscan, {l}ist, {b}inary, {m}odifiable, {d}iff, {v}irtualedit, uhe{x}" )
  if l:char ==# 'w'
    set wrap!
    set wrap?
  elseif l:char ==# 'W'
    set wrapscan!
    set wrapscan?
  elseif l:char ==# 'b'
    set binary!
    set binary?
  elseif l:char ==# 'l'
    set list!
    set list?
  elseif l:char ==# 'm'
    if &modifiable && !&readonly
      set nomodifiable
      set readonly
    else
      set modifiable
      set noreadonly
    endif
    set readonly?
    set modifiable?
  elseif l:char ==# 'v'
    if &virtualedit == 'all'
      set virtualedit=block
    else
      set virtualedit=all
    endif
    set virtualedit?
  elseif l:char ==# 'd'
    if &diff
      set nodiff foldcolumn=0
    else
      diffthis
    endif
    set diff?
  elseif l:char ==# 'x'
    if &display =~ 'uhex'
      set display-=uhex
    else
      set display+=uhex
    endif
    set display?
  endif
endfunction

function! s:Char_menu( stuff, ... )
  let l:stuff = a:stuff
  let l:match_col = 0
  let l:hi = "None"
  echohl Question
  while l:match_col >= 0
    let l:match_col = match( l:stuff, '^\(\w\+\|\W\+\|{\|}\)' )
    let l:tok = strpart( l:stuff, 0, l:match_col + 1 )
    let l:stuff = strpart( l:stuff, l:match_col + 1 )
    if l:tok == '{'
      echohl warningmsg " Error
      let l:hi = "standout"
    elseif l:tok == '}'
      echohl Directory " Statusline " Question
      let l:hi = "standout"
    elseif l:tok != ''
      if l:tok =~ '\w\+' && l:hi == "whitespace"
        echohl Directory " Statusline " Question
        let l:hi = "text"
      elseif l:tok =~ '[ ]\+'
        let l:hi = "whitespace"
        echohl None
      endif
      echon l:tok
    endif
  endwhile
  echohl None
  echon "\r"
  return nr2char( getchar() )
endfunction

CommentsEdit

I added it as a script.


Also on Fandom

Random Wiki