X-Git-Url: http://git.iain.cx/?p=profile.git;a=blobdiff_plain;f=.vimrc;h=48a2cf2530cfd0f2dd8d3b56d1071c6337067af2;hp=9e004de420e9fb0b8b10fa50e090586ed2a4d4f1;hb=9b031e4cfec3afab6531b784af528a3eb083b8e2;hpb=bcbfee8ff8bf115ace00870560f1a2240d612413 diff --git a/.vimrc b/.vimrc index 9e004de..48a2cf2 100644 --- a/.vimrc +++ b/.vimrc @@ -58,9 +58,8 @@ se smartcase " Look for ctags in home directory first. se tags=~/.tags,./tags,tags -" Use - and = to create underlines. -map - yyp:s/./-/g:let @/='': -map = yyp:s/./=/g:let @/='': +" Don't timeout waiting to interpet, eg, OA as an escape code. +se ttimeoutlen=100 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Handle options only available in Vim 5 and above. @@ -68,11 +67,23 @@ map = yyp:s/./=/g:let @/='': if version >= "500" version 5.0 +" Tell Vim we use dark backgrounds in our terminals. +if ! has("gui_running") + se bg=dark +endif + +" Enable tab-completion prompting for commands. +se wildmenu +" Don't list object files when globbing files to load. +se wildignore+=*.o,*.obj +" So there's no need to assign them low priority. +se suffixes-=*.o,*.obj + " Vim 5 hardcodes the size of numbers column to 8. let numberwidth=8 " Save sessions in UNIX format with / as file separator. This is -" cross-platoform. +" cross-platform. se ssop+=unix,slash " Nuke any pre-existing autocommands. @@ -90,8 +101,14 @@ se t_WS=[8;%p1%d;%p2%dt " Highlight search results. se hlsearch -" Syntax highlighting. -syn on +" Syntax highlighting. New versions will use syn enable instead. +if version < 600 + syn on +endif + +" Use a discernably different colour to highlight the cursor which shows +" matching brackets. Our regular cursor is green so use blue instead of cyan. +hi MatchParen ctermbg=blue " Catch typos. command! W :w @@ -109,6 +126,10 @@ fun! Iain_Vars() if ! exists("b:iainverbose") let b:iainverbose = 0 endif + if ! exists("b:iainstatus") + " Window Flags: (F)ocused, (I)nsert mode, Cursor (H)old. + let b:iainstatus = "Fih" + endif endfun " Helper for status line. @@ -184,40 +205,63 @@ au BufLeave * if &ft == "make" | call MakeMode_unmap() | endif " Entering Make mode. fun! MakeMode_map() - set list + call Iain_Vars() + let b:iainlist=1 + call Cycle_List() + set ts=8 set noexpandtab endfun " Leaving Make mode. fun! MakeMode_unmap() - set nolist + call Cycle_List() + set ts=2 set expandtab endfun " Show the status line for the first time. call Show_StatusLine() -" Change to ts=2 with Q2. -map Q2 :se ts=2: -" Change to ts=4 with Q4. -map Q4 :se ts=4: -" Change to ts=8 with Q8. -map Q8 :se ts=8: -" Change to ts=16 with Q6. -map Q6 :se ts=16: -" Change to ts=32 with Q3. -map Q3 :se ts=32: -" Toggle paste mode with Qp. -map Qp :se paste!: -" Swap case-sensitivity with Qc. -map Qc :call Invert_Case(): -" Change number mode with Qn. -map Qn :se number!: -" Expand or shrink window size with Q> and Q<. For use after toggling number. -map Q> :exe 'se columns+=' . numberwidth: -map Q< :exe 'se columns-=' . numberwidth: -" Clear search pattern with Q/. -map Q/ :let @/="": +" Function to create mappings with either a hardcoded \ or . +fun! Mapping(keysequence,mapping) + if version >= "600" + exec "map \\" . a:keysequence . " " . a:mapping + else + exec "map " . a:keysequence . " " . a:mapping + endif +endfun + +" Use - and = to create underlines. +call Mapping("-", "yyp:s/./-/g:let @/='':") +call Mapping("=", "yyp:s/./=/g:let @/='':") + +" Change to ts=2 with \2. +call Mapping("2", ":se ts=2:") +" Change to ts=4 with \4. +call Mapping("4", ":se ts=4:") +" Change to ts=8 with \8. +call Mapping("8", ":se ts=8:") +" Change to ts=16 with \6. +call Mapping("6", ":se ts=16:") +" Change to ts=32 with \3. +call Mapping("3", ":se ts=32:") +" Toggle paste mode with \p. +call Mapping("p", ":se paste!:") +" Swap case-sensitivity with \c. +call Mapping("c", ":call Invert_Case():") +" Change number mode with \n. +call Mapping("n", ":se number!:") +" Expand or shrink window size with \> and \<. For use after toggling number. +call Mapping(">", ":exe 'se columns+=' . numberwidth:") +call Mapping("<", ":exe 'se columns-=' . numberwidth:") +" Clear search pattern with \/. +call Mapping("/", ":let @/=\"\":") + +" Forget the Ex mode mapping. +map Q + +" Vim tip 99: What's the highlighting group under the cursor? +call Mapping("h", ":echo \"hi<\" . synIDattr(synID(line(\".\"),col(\".\"),1),\"name\") . '> trans<' . synIDattr(synID(line(\".\"),col(\".\"),0),\"name\") . \"> lo<\" . synIDattr(synIDtrans(synID(line(\".\"),col(\".\"),1)),\"name\") . \">\"") endif @@ -227,6 +271,9 @@ endif if version >= "600" version 6.0 +" Remember quickfix state. +let g:quickfixing=0 + " Set indenting by filetype. filetype indent on @@ -235,11 +282,16 @@ syn enable " Nice GUI colour. if has("gui_running") - se guifont=Bitstream\ Vera\ Sans\ Mono\ 10 + se guifont=DejaVu\ Sans\ Mono\ 10 colo darkblue +elseif &t_Co > 16 + try + colo iain + catch + endtry endif if has("win32") - se guifont=Bitstream_Vera_Sans_Mono:h10:cANSI + se guifont=DejaVu_Sans_Mono:h10:cANSI endif " Ignore whitespace when diffing. @@ -250,11 +302,12 @@ if &diff let &columns = 164 endif -" Status bar matches the colour. -highlight StatusLine guifg=white guibg=blue ctermbg=white ctermfg=blue +" Remember that we are opening the quickfix window. +au BufWinEnter quickfix let g:quickfixing=1 +au BufUnload * if &ft == "qf" | let g:quickfixing=0 | endif -" Numbers in blue. -highlight LineNr term=underline cterm=bold guifg=blue ctermfg=blue +" Allow in-place editing of crontabs. +au FileType crontab set backupcopy=yes " Make * and # work the way you expect in visual mode. vnoremap * y/\V=substitute(escape(@@,"/\\"),"\n","\\\\n","ge") @@ -293,23 +346,79 @@ fun! Cycle_VerboseStatusLine() call Show_StatusLine() endfun -" We use Q for various commands. Unmap it. -" Vim 5 won't let us unmap this as it treats Q as an ambiguous mapping (because -" Qx also exists. With Vim 5 you are rewarded with Ex mode if you don't type -" the Qx sequence quickly enough. Vim 6 allows us to forget the Ex mapping. -map Q - -" Swap hex/decimal statusline with Qx -map Qx :call Cycle_HexStatusLine(): -" Change statusline verbosity with Qv -map Qv :call Cycle_VerboseStatusLine(): -" Cycle list styles with Ql. -map Ql :call Cycle_List(): -" Toggle tags with Qt. -map Qt :Tlist -" Change foldmethod with Qf. -map Qf :se foldenable!: +" Toggle quickfix window. +fun! Cycle_Quickfix() + if g:quickfixing == 1 + cclose + let g:quickfixing=0 + else + copen + endif +endfun + +" Swap hex/decimal statusline with \x. +call Mapping("x", ":call Cycle_HexStatusLine():") +" Change statusline verbosity with \v. +call Mapping("v", ":call Cycle_VerboseStatusLine():") +" Cycle list styles with \l. +call Mapping("l", ":call Cycle_List():") +" Toggle tags with \t. +call Mapping("t", ":Tlist") +" Change foldmethod with \f. +call Mapping("f", ":se foldenable!:") +" Toggle quickfix window with \q. +call Mapping("q", ":call Cycle_Quickfix():") +" Rerun filetype detection with \s. The s is for syntax, as this will be +" updated as a side-effect. +call Mapping("s", ":filetype detect:") + +" Change status bar colour when various things happen. +fun! Highlight_StatusLine(flag) + " 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, "") + + " Default colour. + let s:colour = "darkblue" + let s:termcolour = "" + let s:term88colour = "17" + let s:term256colour = "17" + " 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 = "darkmagenta" + else + let s:colour = "darkred" + endif + let s:term88colour = "32" + let s:term256colour = "88" + endif + else + if b:iainstatus =~# "I" + " Regular insert mode. + let s:colour = "darkred" + let s:term88colour = "32" + let s:term256colour = "88" + 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 + endif + + exec "highlight StatusLine guifg=white guibg=" . s:colour . " ctermbg=white ctermfg=" . s:termcolour +endfun + +call Highlight_StatusLine("") endif """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" @@ -318,6 +427,13 @@ endif if version >= "700" version 7.0 +au CursorHoldI * call Highlight_StatusLine("H") +au CursorMovedI * call Highlight_StatusLine("h") +au FocusGained * call Highlight_StatusLine("F") +au FocusLost * call Highlight_StatusLine("f") +au InsertEnter * call Highlight_StatusLine("I") +au InsertLeave * call Highlight_StatusLine("i") + " Make diffs vertical by default. se diffopt+=vertical