Check for broken KRB5CCNAME.
[profile.git] / .vimrc
diff --git a/.vimrc b/.vimrc
index b63d1ba..e0a31a9 100644 (file)
--- a/.vimrc
+++ b/.vimrc
@@ -167,13 +167,13 @@ endfun "}}}2
 
 " Set up our variables.
 fun! Iain_Vars() "{{{2
-  call Prep_Var("b:iainlist", 0)
+  call Prep_Var("w:iainlist", 0)
   call Prep_Var("b:iainhex", 0)
   call Prep_Var("b:iainverbose", 0)
   " Window Flags: (F)ocused, (I)nsert mode, Cursor (H)old.
   call Prep_Var("b:iainstatus", "'Fih'")
-  call Prep_Var("g:iainextracolumnsnumber", 0)
-  call Prep_Var("g:iainextracolumnslist", 0)
+  call Prep_Var("g:iainextracolumnsnumber", "''")
+  call Prep_Var("g:iainextracolumnslist", "''")
   if has("signs")
     call Prep_Var("g:marksigns", 0)
     call Prep_Var("g:firstsign", 100)
@@ -184,11 +184,11 @@ endfun "}}}2
 " Show space, underscore or dollar sign depending on list mode.
 fun! Show_List() "{{{2
   call Iain_Vars()
-  if b:iainlist == 0
+  if w:iainlist == 0
     " No list.
     return " "
   elseif <SID>Has_Unicode()
-    if b:iainlist == 1
+    if w:iainlist == 1
       " Just tabs.
       return "»"
     else
@@ -196,7 +196,7 @@ fun! Show_List() "{{{2
       return "¶"
     endif
   else
-    if b:iainlist == 1
+    if w:iainlist == 1
       return "_"
     else
       return "\$"
@@ -252,8 +252,8 @@ endfun "}}}2
 " Show the status line.
 fun! Show_StatusLine() "{{{2
   call Iain_Vars()
-  let l:sl1='%2n\:\ %<%f\ [%{Show_List()}%{Show_Case()}%{Show_Tabstop()}%{Show_Paste()}%Y%M%R]\ '
-  let l:sl3='L:%4.6l/%-4.6L\ C:%3.6c\ \|\ %P'
+  let l:sl1='%2n\:\ %<%1*%f%0*\ [%{Show_List()}%{Show_Case()}%{Show_Tabstop()}%{Show_Paste()}%Y%M%R]\ '
+  let l:sl3='L:%1*%4.6l%0*/%-4.6L\ C:%1*%3.6c%0*\ \|\ %P'
   let l:hexformat='%b'
   if b:iainhex
     let l:hexformat='0\x%02B'
@@ -309,10 +309,20 @@ endfun "}}}2
 
 " Set extra columns depending on window status.
 fun! Extra_Columns(extra, var, ...) "{{{2
-  if v:version < "700"
+  " Vim 6 doesn't have winnr("$").  Determine which windows are open
+  " ourselves by using :windo to incremement a counter.  As Vim 5 
+  " doesn't have :windo we require Vim 6 for this.
+  if v:version < "600"
     return ""
   endif
 
+  " Remember which window we're in.
+  let l:winnr = winnr()
+  let l:num_windows = 0
+  windo let l:num_windows = l:num_windows + 1
+  " Switch back to the window we were in.
+  exe l:winnr . "wincmd w"
+
   call Iain_Vars()
 
   if a:0 == 0
@@ -321,28 +331,34 @@ fun! Extra_Columns(extra, var, ...) "{{{2
     let l:condition = a:1
   endif
 
+  let l:n = 0
   let l:i = 1
-  let l:num_windows = 0
-  while l:i <= winnr("$")
+  let l:windows = ""
+  while l:n < l:num_windows
+    " If window w exists then getwinvar(w, "&modified") will be 0 or 1.
+    if getwinvar(l:i, "&modified") =~ '^\d'
+      let l:n = l:n + 1
+
     let l:val = 0
     exe "if getwinvar(" . l:i . ", '" . a:var . "') " . l:condition . " | let l:val = 1 | endif"
     if l:val
-      let l:num_windows = l:num_windows + 1
+        exe "let l:windows = '" . l:windows . ":" . l:i . "'"
+      endif
     endif
     let l:i = l:i + 1
   endwhile
 
   let l:extra = "g:iainextracolumns" . a:extra
   exe "let l:val = " . l:extra
+  exe "let " . l:extra . " = '" . l:windows . "'"
 
-  if l:num_windows == l:val
+  if l:windows == l:val
     return ""
   endif
-  exe "let " . l:extra . " = " . l:num_windows
 
-  if l:num_windows == 0
+  if l:windows == ""
     return "-"
-  elseif l:val == 0
+  elseif l:val == ""
     return "+"
   endif
 endfun "}}}2
@@ -371,7 +387,7 @@ au Mode BufLeave * if &ft == "make" | call MakeMode_unmap() | endif
 " Entering Make mode.
 fun! MakeMode_map() "{{{2
   call Iain_Vars()
-  let b:iainlist=1
+  let w:iainlist=1
   call Cycle_List()
   set ts=8
   set noexpandtab
@@ -482,6 +498,85 @@ fun! Startup_Resize() "{{{2
   endif
 endfun "}}}2
 
+" Change status bar colour when various things happen.
+" Flags: H/h: Cursor held/moved.
+"        F/f: Focus gained/lost.
+"        I/i: Insert mode entered/left.
+fun! Highlight_StatusLine(flag) "{{{2
+  " Get current status.
+  call Iain_Vars()
+
+  " Change the status based on the flag.  XXX: Does Vim let us to do flags?
+  let l:ic = &ic
+  set ic
+  let b:iainstatus = substitute(b:iainstatus, a:flag, a:flag, "")
+  let &ic = l:ic
+
+  let l:normalcolour = "darkblue"
+  let l:editingcolour = "darkmagenta"
+  let l:warningcolour = "darkred"
+  let l:readonlycolour = "red"
+
+  " Default colour.
+  let l:colour = l:normalcolour
+  " Maybe override depending on status.
+  if b:iainstatus =~# "H"
+    if b:iainstatus =~# "I"
+      " Held in insert mode.  Add extra highlight if we don't have focus.
+      if b:iainstatus =~# "f"
+        let l:colour = l:warningcolour
+      else
+        let l:colour = l:editingcolour
+      endif
+    endif
+  else
+    if b:iainstatus =~# "I"
+      " Regular insert mode.
+      let l:colour = l:editingcolour
+    endif
+  endif
+
+  " Override again if readonly.
+  if l:colour != l:normalcolour
+    if getbufvar("", "&ro")
+      let l:colour = l:readonlycolour
+    endif
+  endif
+
+  let l:termcolour = Iain_Colour(l:colour)
+
+  exec "highlight StatusLine gui=none term=none cterm=none guifg=white guibg=" . l:colour . " ctermfg=white ctermbg=" . l:termcolour
+  exec "highlight User1 gui=bold term=bold cterm=bold guifg=white guibg=" . l:colour . " ctermfg=white ctermbg=" . l:termcolour
+endfun "}}}2
+
+fun! Iain_Colour(colour) "{{{2
+  if &t_Co == 88
+    if a:colour == "darkblue"
+      return 17
+    elseif a:colour == "darkmagenta"
+      return 33
+    elseif a:colour == "darkred"
+      return 32
+    elseif a:colour == "red"
+      return 64
+    endif
+  elseif &t_Co == 256
+    if a:colour == "darkblue"
+      return 17
+    elseif a:colour == "darkmagenta"
+      return 90
+    elseif a:colour == "darkred"
+      return 88
+    elseif a:colour == "red"
+      return 196
+    endif
+  else
+    return a:colour
+  endif
+endfun "}}}2
+
+au StatusLine VimEnter * call Highlight_StatusLine("")
+
 " Show numbers by default.
 au Display VimEnter * if ! Uncluttered_Buffer() | call Number(0) | endif
 
@@ -510,20 +605,14 @@ syn enable
 
 " Set colours.
 if has("gui_running")
-  try
-    if has("win32")
-      se guifont=DejaVu_Sans_Mono:h10:cANSI
-    else
-      se guifont=DejaVu\ Sans\ Mono\ 10
-    endif
-  catch
-  endtry
+  if has("win32")
+    silent se guifont=DejaVu_Sans_Mono:h10:cANSI
+  else
+    silent se guifont=DejaVu\ Sans\ Mono\ 10
+  endif
 endif
 if has("gui_running") || &t_Co > 16
-  try
-    colo iain
-  catch
-  endtry
+  silent colo iain
 endif
 
 " Ignore whitespace when diffing.
@@ -647,12 +736,13 @@ fun! <SID>Cycle_Signs(resize) "{{{2
       sign define MarkDash text=’ texthl=MarkSign
       sign define MarkDot text=• texthl=MarkDot
       sign define MarkQuote text=” texthl=MarkSign
+      sign define MarkCaret text=ʌ texthl=MarkDot
     else
       sign define MarkDash text=' texthl=MarkSign
       sign define MarkDot text=* texthl=MarkDot
       sign define MarkQuote text=" texthl=MarkSign
+      sign define MarkCaret text=^ texthl=MarkDot
     endif
-    sign define MarkCaret text=^ texthl=MarkDot
     sign define MarkLess text=< texthl=MarkSign
     sign define MarkGreater text=> texthl=MarkSign
     sign define MarkLeft text=( texthl=MarkSign
@@ -775,13 +865,13 @@ fun! Cycle_List() "{{{2
     endif
   endif
   call Iain_Vars()
-  let b:iainlist = b:iainlist + 1
-  if b:iainlist > 2
-    let b:iainlist = 0
+  let w:iainlist = w:iainlist + 1
+  if w:iainlist > 2
+    let w:iainlist = 0
   endif
-  if b:iainlist == 0
+  if w:iainlist == 0
     setlocal nolist
-  elseif b:iainlist == 1
+  elseif w:iainlist == 1
     exec "setlocal lcs=" . basic
     setlocal list
   else
@@ -789,7 +879,7 @@ fun! Cycle_List() "{{{2
     setlocal list
   endif
 
-  call Resize_Columns(Extra_Columns("list", "&lcs", " =~# 'eol'"), 1)
+  call Resize_Columns(Extra_Columns("list", "iainlist", " == 2"), 1)
 endfun "}}}2
 
 " Cycle between hex and decimal display of toolbar stuff.
@@ -834,82 +924,6 @@ call Mapping("S", ":filetype detect<CR>:<CR>")
 " Toggle marks with \m.
 call Mapping("m", ":call <SID>Cycle_Signs(1)<CR>:<CR>")
 
-fun! <SID>Iain_Colour(colour) "{{{2
-  if &t_Co == 88
-    if a:colour == "darkblue"
-      return 17
-    elseif a:colour == "darkmagenta"
-      return 33
-    elseif a:colour == "darkred"
-      return 32
-    elseif a:colour == "red"
-      return 64
-    endif
-  elseif &t_Co == 256
-    if a:colour == "darkblue"
-      return 17
-    elseif a:colour == "darkmagenta"
-      return 90
-    elseif a:colour == "darkred"
-      return 88
-    elseif a:colour == "red"
-      return 196
-    endif
-  else
-    return a:colour
-  endif
-endfun "}}}2
-
-" Change status bar colour when various things happen.
-" Flags: H/h: Cursor held/moved.
-"        F/f: Focus gained/lost.
-"        I/i: Insert mode entered/left.
-fun! Highlight_StatusLine(flag) "{{{2
-  " Get current status.
-  call Iain_Vars()
-
-  " Change the status based on the flag.  XXX: Does Vim let us to do flags?
-  let re = "[" . tolower(a:flag) . toupper(a:flag) . "]"
-  let b:iainstatus = substitute(b:iainstatus, re, a:flag, "")
-
-  let l:normalcolour = "darkblue"
-  let l:editingcolour = "darkmagenta"
-  let l:warningcolour = "darkred"
-  let l:readonlycolour = "red"
-
-  " Default colour.
-  let l:colour = l:normalcolour
-  " Maybe override depending on status.
-  if b:iainstatus =~# "H"
-    if b:iainstatus =~# "I"
-      " Held in insert mode.  Add extra highlight if we don't have focus.
-      if b:iainstatus =~# "f"
-        let l:colour = l:warningcolour
-      else
-        let l:colour = l:editingcolour
-      endif
-    endif
-  else
-    if b:iainstatus =~# "I"
-      " Regular insert mode.
-      let l:colour = l:editingcolour
-    endif
-  endif
-
-  " Override again if readonly.
-  if l:colour != l:normalcolour
-    if getbufvar("", "&ro")
-      let l:colour = l:readonlycolour
-    endif
-  endif
-
-  let l:termcolour = <SID>Iain_Colour(l:colour)
-
-  exec "highlight StatusLine gui=bold term=bold cterm=bold guifg=white guibg=" . l:colour . " ctermfg=white ctermbg=" . l:termcolour
-endfun "}}}2
-
-au Display VimEnter * call Highlight_StatusLine("")
-
 " Show signs by default.
 au Display VimEnter * call <SID>Cycle_Signs(0)
 endif "}}}1