Highlight readonly buffers.
authorIain Patterson <me@iain.cx>
Thu, 18 Jun 2009 10:31:49 +0000 (11:31 +0100)
committerIain Patterson <me@iain.cx>
Fri, 26 Jun 2009 12:09:11 +0000 (13:09 +0100)
Abstract colours of the statusline and show a red statusline when trying
to edit a buffer with &ro set.

.vimrc

diff --git a/.vimrc b/.vimrc
index 5f81697..96f8a1f 100644 (file)
--- a/.vimrc
+++ b/.vimrc
@@ -434,7 +434,36 @@ call Mapping("q", ":call Cycle_Quickfix()<CR>:<CR>")
 " updated as a side-effect.
 call Mapping("s", ":filetype detect<CR>:<CR>")
 
+fun! <SID>Iain_Colour(colour)
+  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
+
 " 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)
   " Get current status.
   call Iain_Vars()
@@ -443,43 +472,40 @@ fun! Highlight_StatusLine(flag)
   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 s:colour = "darkblue"
-  let s:termcolour = ""
-  let s:term88colour = "17"
-  let s:term256colour = "17"
+  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 s:colour = "darkred"
-        let s:term88colour = "32"
-        let s:term256colour = "88"
+        let l:colour = l:warningcolour
       else
-        let s:colour = "darkmagenta"
-        let s:term88colour = "33"
-        let s:term256colour = "90"
+        let l:colour = l:editingcolour
       endif
     endif
   else
     if b:iainstatus =~# "I"
       " Regular insert mode.
-      let s:colour = "darkmagenta"
-      let s:term88colour = "33"
-      let s:term256colour = "90"
+      let l:colour = l:editingcolour
     endif
   endif
 
-  if &t_Co == 88
-    let s:termcolour = s:term88colour
-  elseif &t_Co == 256
-    let s:termcolour = s:term256colour
-  else
-    let s:termcolour = s:colour
+  " Override again if readonly.
+  if l:colour != l:normalcolour
+    if getbufvar("", "&ro")
+      let l:colour = l:readonlycolour
+    endif
   endif
 
-  exec "highlight StatusLine guifg=white guibg=" . s:colour . " ctermbg=white ctermfg=" . s:termcolour
+  let l:termcolour = <SID>Iain_Colour(l:colour)
+
+  exec "highlight StatusLine guifg=white guibg=" . l:colour . " ctermbg=white ctermfg=" . l:termcolour
 endfun
 
 call Highlight_StatusLine("")