X-Git-Url: http://git.iain.cx/?p=profile.git;a=blobdiff_plain;f=.vimrc;h=5f81697233c7784cdb46f4750251a35de88a59fc;hp=24b65306a43f66eeeabbfbe31c4a05490a482bd4;hb=cb8fd4bb449e44110ca681bdab168009cf9e229b;hpb=d21f4c46453b0765408eedb7885441379ace0889 diff --git a/.vimrc b/.vimrc index 24b6530..5f81697 100644 --- a/.vimrc +++ b/.vimrc @@ -1,6 +1,4 @@ """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" $Id$ -"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Multi-version vimrc compatible with version 4 and above. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" @@ -61,18 +59,10 @@ se tags=~/.tags,./tags,tags " Don't timeout waiting to interpet, eg, OA as an escape code. se ttimeoutlen=100 -" 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 @/='':") +" Use ^B to search backward when completing. +inoremap +" Use ^L to show matching completions but don't select one. +inoremap """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Handle options only available in Vim 5 and above. @@ -85,11 +75,15 @@ if ! has("gui_running") se bg=dark endif -" Vim 5 hardcodes the size of numbers column to 8. -let numberwidth=8 +" 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 " Save sessions in UNIX format with / as file separator. This is -" cross-platoform. +" cross-platform. se ssop+=unix,slash " Nuke any pre-existing autocommands. @@ -107,8 +101,13 @@ se t_WS=[8;%p1%d;%p2%dt " Highlight search results. se hlsearch -" Syntax highlighting. -syn on +" Set graphical window title. +se titlestring=%{Show_TitleString()} + +" 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. @@ -134,6 +133,9 @@ fun! Iain_Vars() " Window Flags: (F)ocused, (I)nsert mode, Cursor (H)old. let b:iainstatus = "Fih" endif + if ! exists("g:iainextracolumns") + let g:iainextracolumns = 0 + endif endfun " Helper for status line. @@ -178,21 +180,31 @@ fun! Show_Paste() endif endfun +" Show the window title. +fun! Show_TitleString() + if bufname("") == "" + let l:ts1='Vim' + else + let l:ts1=printf("%2d: %s", bufnr(""), expand('%t')) + endif + return printf("%s (%s) %s", l:ts1, getcwd(), v:servername) +endfun + " Show the status line. fun! Show_StatusLine() call Iain_Vars() - let sl1='%2n\:\ %<%f\ [%{Show_List()}%{Show_Case()}%{Show_Tabstop()}%{Show_Paste()}%Y%M%R]\ %=' - let sl3='L:%4.6l/%-4.6L\ C:%3.6c\ \|\ %P' - let hexformat='%b' + 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:hexformat='%b' if b:iainhex - let hexformat='0\x%02B' + let l:hexformat='0\x%02B' endif if b:iainverbose - let sl2=hexformat . '\ \|\ P:%4.6o\ ' + let l:sl2=l:hexformat . '\ \|\ P:%4.6o\ ' else - let sl2='' + let l:sl2='' endif - exec "set statusline=" . sl1 . sl2 . sl3 + exec "set statusline=" . l:sl1 . l:sl2 . l:sl3 endfun " Toggle case-sensitivity. @@ -200,6 +212,49 @@ fun! Invert_Case() let &ic = ! &ic endfun +" Grow or shrink the window size. +fun! Resize_Columns(op) + " XXX: This won't work inside screen. + " We should really detect whether it would work rather than assume it won't. + if &term =~ '^screen' + return + endif + + " Vim 5 hardcodes the size of numbers column to 8. + if version >= "700" + let l:numberwidth = &numberwidth + else + let l:numberwidth = 8 + endif + + exec "se columns" . a:op . "=" . l:numberwidth +endfun + +" Toggle number display. +fun! Number() + call Iain_Vars() + let &number = ! &number + + if version >= "700" + let l:i = 0 + let l:num_numbers = 0 + while l:i <= winnr("$") + if getwinvar(l:i, "&number") == 1 + let l:num_numbers = l:num_numbers + 1 + endif + let l:i = l:i + 1 + endwhile + + if l:num_numbers == 0 + let g:iainextracolumns = 0 + call Resize_Columns("-") + elseif g:iainextracolumns == 0 + let g:iainextracolumns = 1 + call Resize_Columns("+") + endif + endif +endfun + " Restore window size. au VimLeave * if exists("oldcols") | let &columns=oldcols | endif @@ -209,19 +264,36 @@ 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() +" 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. @@ -237,16 +309,19 @@ 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:") +call Mapping("n", ":call Number():") +" Expand or shrink window size with \> and \<. +call Mapping(">", ":call Resize_Columns('+'):") +call Mapping("<", ":call Resize_Columns('-'):") " 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 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" @@ -268,10 +343,18 @@ syn enable if has("gui_running") se guifont=DejaVu\ Sans\ Mono\ 10 colo darkblue + hi LineNr guibg=#303030 +elseif &t_Co > 16 + try + colo iain + catch + endtry endif if has("win32") se guifont=DejaVu_Sans_Mono:h10:cANSI endif +hi! link TabLineSel StatusLine +hi! link TabLine StatusLineNC " Ignore whitespace when diffing. se diffopt=filler,iwhite @@ -281,13 +364,13 @@ if &diff let &columns = 164 endif -" Numbers in blue. -highlight LineNr term=underline cterm=bold guifg=blue 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 +" 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") vnoremap # y?\V=substitute(escape(@@,"?\\"),"\n","\\\\n","ge") @@ -370,19 +453,21 @@ fun! Highlight_StatusLine(flag) 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" + let s:term88colour = "32" + let s:term256colour = "88" + else + let s:colour = "darkmagenta" + let s:term88colour = "33" + let s:term256colour = "90" 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" + let s:colour = "darkmagenta" + let s:term88colour = "33" + let s:term256colour = "90" endif endif @@ -406,6 +491,77 @@ endif if version >= "700" version 7.0 +" Helper to show tab name. +fun! TabName(label, gui) + let l:label = a:label + if l:label == "" + let l:label = "No Name" + if a:gui + let l:label = "[" . l:label . "]" + endif + else + let l:label = fnamemodify(l:label, ":t") + if strlen(l:label) >= 18 + let l:label = l:label[0:17] . ".." + endif + endif + return l:label +endfun + +" Find out if any buffer was modified. +fun! TabModified(buflist) + let l:i = 0 + while i < len(a:buflist) + if getbufvar(a:buflist[l:i], "&modified") == 1 + return "+" + endif + let l:i = l:i + 1 + endwhile + return "" +endfun + +" Tab line. +fun! Show_TabLine() + let l:s = "%#TabLineFill#Tabs:" + + let l:i = 0 + while l:i < tabpagenr("$") + let l:i = l:i + 1 + " Get the label. + let l:buflist = tabpagebuflist(l:i) + let l:winnr = tabpagewinnr(l:i) + let l:n = tabpagewinnr(l:i, "$") + let l:label = TabName(bufname(l:buflist[l:winnr - 1]), 0) + let l:modified = TabModified(l:buflist) + + " Choose highlighting. + if l:i == tabpagenr() + let l:s .= "%#TabLineSel#[" . l:n . l:modified . " " . l:label . "]" + else + let l:s .= "%#TabLine# " . l:n . l:modified . " " . l:label . " " + endif + endwhile + + " Padding. + let l:s .= "%#TabLine#%T" + return l:s +endfun + +" Per tab label for the GUI. +fun! Show_GUITabLine() + let l:buflist = tabpagebuflist(v:lnum) + let l:winnr = tabpagewinnr(v:lnum) + let l:s = tabpagewinnr(v:lnum, "$") + let l:label = TabName(bufname(l:buflist[l:winnr - 1]), 1) + let l:modified = TabModified(l:buflist) + + let l:s .= l:modified . " " . l:label + return l:s +endfun + +se tabline=%!Show_TabLine() +se guitablabel=%!Show_GUITabLine() + au CursorHoldI * call Highlight_StatusLine("H") au CursorMovedI * call Highlight_StatusLine("h") au FocusGained * call Highlight_StatusLine("F") @@ -413,6 +569,9 @@ au FocusLost * call Highlight_StatusLine("f") au InsertEnter * call Highlight_StatusLine("I") au InsertLeave * call Highlight_StatusLine("i") +" Limit the size of the popup menu when completing. +se pumheight=20 + " Make diffs vertical by default. se diffopt+=vertical @@ -420,5 +579,17 @@ se diffopt+=vertical se numberwidth=5 " Add "previous tab" mapping as gb. -map gb :tabPrev +map gb :tabprevious: + +" Transparency. +if has("gui_macvim") + se transparency=15 +endif + +" Yet more GUI options. Add tabs. +se go+=e + +" Perforce. +let g:p4EnableMenu=1 +let g:p4Presets='P4CONFIG' endif