" " vimconfig - project of powerful ViM 6.0 configuration files " " vimrc - main configuration file " ____________________________________________________________ " " Developed by Lubomir Host 'rajo' " Copyright (c) 2000-2003 Platon SDG, http://platon.sk/ " All rights reserved. " " See README file for more information about this software. " See COPYING file for license information. " " Download the latest version from " http://platon.sk/projects/vimconfig/ " " Please don't hesitate to correct my english :) " Send corrections to " " Lubomir Host 'rajo' " Version: $Platon: vimconfig/vimrc,v 1.92 2003/11/14 16:21:32 rajo Exp $ " Debian uses compressed helpfiles. We must inform vim that the main " helpfiles is compressed. Other helpfiles are stated in the tags-file. if !filereadable(expand("$VIMRUNTIME/doc/help.txt")) if filereadable(expand("$VIMRUNTIME/doc/help.txt.gz")) set helpfile=$VIMRUNTIME/doc/help.txt.gz endif endif " Settings {{{ " To be secure & Vi nocompatible :set secure nocompatible :if version < 600 : echo "Please update your vim to 6.0 version (version 6.1 already available!)" : finish :endif :if version >= 600 syntax enable filetype on filetype plugin on filetype indent on :endif function! Source(File) silent! execute "source " . a:File endfunction let VIMRC_EXTRA="~/.vim/local/vimrc" let GVIMRC_EXTRA="~/.vim/local/gvimrc" if executable("uname") && executable("awk") let machine = system("uname -n | awk 'BEGIN {ORS=\"\"} {print; }'") else let machine = $HOSTNAME endif let machine = tolower(machine) let user = $USER call Source(VIMRC_EXTRA.".pre") call Source(VIMRC_EXTRA."-".user.".pre") call Source(VIMRC_EXTRA."-".machine.".pre") call Source(VIMRC_EXTRA."-".machine."-".user.".pre") call Source(VIMRC_EXTRA."") call Source(VIMRC_EXTRA."-".user) call Source(VIMRC_EXTRA."-".machine) call Source(VIMRC_EXTRA."-".machine."-".user) " used for searching documentation (~/.vim/doc/FEATURES.txt) etc. set runtimepath+=~/.vim " Settings for C language {{{ let c_gnu=1 let c_comment_strings=1 let c_space_errors=1 " }}} " History and viminfo settings {{{ if has("cmdline_hist") set history=10000 endif if has("viminfo") if filewritable(expand("$HOME/.vim/viminfo")) == 1 || \ filewritable(expand("$HOME/.vim/")) == 2 set viminfo=!,%,'5000,\"10000,:10000,/10000,n~/.vim/viminfo else set viminfo= endif endif " Don't save backups of files. set nobackup set backupcopy=yes " }}} " Status line settings {{{ ":set ruler " Display a status-bar. set laststatus=2 if has("statusline") set statusline=%5*%{GetID()}%0*#%{winnr()}\ %<%f\ %3*%m%1*%r%0*\ %2*%y%4*%w%0*%=[%b\ 0x%B]\ \ %8l,%10([%c%V/%{strlen(getline(line('.')))}]%)\ %P endif " }}} " Settings for Calendar plugin {{{ if !exists("g:calendar_diary") let g:calendar_diary = "~/.vim/diary" endif " }}} " Settings for Explorer script {{{ if !exists("g:explDetailedHelp") let g:explDetailedHelp=1 endif if !exists("g:explDetailedList") let g:explDetailedList=1 endif if !exists("g:explDateFormat") let g:explDateFormat="%d %b %Y %H:%M" endif " }}} " Settings for gcc & make {{{ let g:cflags="-Wall -pedantic" let g:c_debug_flags="-ggdb -DDEBUG" let g:makeflags="" " }}} " Settings for AutoLastMod {{{ " Set this to 1 if you will automaticaly change date of modification of file. let g:autolastmod=1 " Modification is made on line like this variable (regular expression!): let g:autolastmodtext="^\\([ ]*Last modified: \\)" " }}} " Priority between files for file name completion (suffixes) {{{ " Do not give .h low priority in command-line filename completion. set suffixes-=.h set suffixes+=.aux set suffixes+=.bbl set suffixes+=.blg set suffixes+=.log set suffixes+=.eps set suffixes+=.ps set suffixes+=.pdf set wildignore+=*.dvi set wildignore+=*.pdf " }}} " The cursor is kept in the same column (if possible). This applies to the " commands: CTRL-D, CTRL-U, CTRL-B, CTRL-F, "G", "H", "M", "L", , and to the " commands "d", "<<" and ">>" with a linewise operator, with "%" with a count " and to buffer changing commands (CTRL-^, :bnext, :bNext, etc.). Also for an " Ex command that only has a line number, e.g., ":25" or ":+". set nostartofline " Automatically setting options in various files " WARNINNG: disable modeline if you are running vim version < 6.1.265 !! " These are security problems. See http://www.guninski.com/vim1.html " (reported by Georgi Guninski) " TODO: there is no way how to test vim patchlevel version, therefore we are " not able determine vim version < 6.1.265 set modeline " Available TAGS files set tags=./TAGS,./tags,tags " Don't add EOF at end of file set noendofline " Do case insensitive matching set noignorecase set showfulltag set ch=2 bs=2 set incsearch report=0 set showcmd showmatch showmode " Set title of the window to Platon's copyright set titleold= set titlestring=ViMconfig\ (c)\ 2000-2003\ Platon\ SDG set title " Indent of 1 tab with size of 4 spaces set tabstop=4 set shiftwidth=4 " Need more undolevels ?? " (default 100, 1000 for Unix, VMS, Win32 and OS/2) set undolevels=10000 " Use an indent of 4 spaces, with no tabs. This setting is recommended by PEAR " (PHP Extension and Application Repository) Conding Standarts. If you want " this setting uncomment the expandtab setting below. ":set expandtab " Settings for mouse (gvim under Xwindows) set nomousefocus mousehide " Cursor always in the middle of the screen set scrolloff=999 " Make window maximalized set winheight=100 " The screen will not be redrawn while executing macros, registers " and other commands that have not been typed. To force an updates use |:redraw|. set lazyredraw " time out on mapping after one second, time out on key codes after " a tenth of a second set timeout timeoutlen=1000 ttimeoutlen=100 " Customize display {{{ " lastline When included, as much as possible of the last line " in a window will be displayed. When not included, a " last line that doesn't fit is replaced with "@" lines. "uhex Show unprintable characters hexadecimal as " instead of using ^C and ~C. set display+=lastline set display+=uhex " }}} " Vim beeping go to the hell... {{{ " With very little patch Vim(gvim) doesn't beep! To dissable beeping patch " source and set ':set noerrorbells' (default). " Here is patch for version 6.0.193: " Note: file src/misc1.c was modified with theses patches: " 6.0.024 6.0.089 6.0.113 6.0.178 6.0.180 " but patch (probably) also work! " Patch: "*** vim60.193/src/misc1.c.orig Sat Feb 9 01:49:54 2002 "--- vim60.193/src/misc1.c Sat Feb 9 02:17:16 2002 "*************** "*** 2721,2727 **** " void " vim_beep() " { "! if (emsg_silent == 0) " { " if (p_vb) " { "--- 2721,2727 ---- " void " vim_beep() " { "! if (emsg_silent == 0 && p_eb) " { " if (p_vb) " { set noerrorbells set visualbell set t_vb= " }}} " Set this, if you will open all windows for files specified " on the commandline at vim startup. if !exists("g:open_all_win") let g:open_all_win=1 endif " Settings for folding long lines if !exists("g:fold_long_lines") let g:fold_long_lines=300 endif " }}} " Keybord mappings {{{ " " start of line "noremap i inoremap cnoremap " end of line noremap i inoremap " back one word inoremap " forward one word "inoremap " Switching between windows by pressing one time CTRL-X keys. noremap " Tip from http://vim.sourceforge.net/tips/tip.php?tip_id=173 noremap j_ noremap k_ " Make Insert-mode completion more convenient: imap set remap map :split imap :split " diakritika ":map :so ~/.vim/diakritika.vim ":imap :so ~/.vim/diakritika.vim " Open new window with file ~/.vimrc (ViM configuration file) map :split ~/.vimrc imap :split ~/.vimrc " Open new window with dir ~/.vim (ViM configuration dir) map :split ~/.vim imap :split ~/.vim " Safe delete line (don't add line to registers) ":imap "_ddi imap :call SafeLineDelete()i " Search for the current Visual selection. vmap S y/=escape(@",'/\') " Good pasting toggle {{{ " From Christopher Swingley " Whenever I want to paste something, I do: " ,f " i " " " ,f map ,f :set paste!:set paste? " }}} " Mappings for folding {{{ " Open one foldlevel of folds in whole file " Note: 'Z' works like 'z' but for all lines in file noremap Zo mzggvGzo'z noremap ZO zR noremap Zc mzggvGzc'z noremap ZC zM noremap Zd mzggvGzd'z noremap ZD mzggvGzD'z noremap Za mzggvGza'z noremap ZA mzggvGzA'z noremap Zx mzggvGzx'z noremap ZX mzggvGzX'z " }}} " }}} " Settings for IMAP input method (IMAP plugin) {{{ " set variable "b:input_method" to change input method let b:input_method = "latin2" " you may disable actions of IMAP plugin with variable b:disable_imap " 0 - enabled " 1 - disabled let b:disable_imap = 0 call Source("~/.vim/plugin/imaps.vim") " }}} " New commands {{{ command! -nargs=0 -range Indent ,call Indent() command! -nargs=0 -range FoldLongLines ,call FoldLongLines() command! -nargs=0 -range UnquoteMailBody ,call UnquoteMailBody() command! -nargs=0 CallProg call CallProg() command! -nargs=0 OpenAllWin call OpenAllWin() command! -nargs=* ReadFileAboveCursor call ReadFileAboveCursor() command! -nargs=* R call ReadFileAboveCursor() command! -nargs=0 DiacriticsOn call UseDiacritics() command! -nargs=0 DiacriticsOff let b:disable_imap=1 " }}} " Functions {{{ " Function ChangeFoldMethod() {{{ " Function for changing folding method. " if version >= 600 function! ChangeFoldMethod() abort let choice = confirm("Which folde method?", "&manual\n&indent\n&expr\nma&rker\n&syntax", 2) if choice == 1 set foldmethod=manual elseif choice == 2 set foldmethod=indent elseif choice == 3 set foldmethod=expr elseif choice == 4 set foldmethod=marker elseif choice == 5 set foldmethod=syntax else endif endfunction endif " ChangeFoldMethod() }}} " Function FoldLongLines() {{{ " if version >= 600 function! FoldLongLines() range abort let savelnum = line(".") let lnum = a:firstline let lend = a:lastline if lnum == lend " No visual area choosen --> whole file let lnum = line(".") let lend = line("$") " Go to the begin of the file exec "1go" endif while lnum <= lend " Skip closed folds if foldclosed(lnum) != -1 let lnum = foldclosedend(lnum) + 1 continue endif let dlzka = strlen(getline(".")) if dlzka >= g:fold_long_lines " Create fold for one line exec "normal zfl" endif let lnum = line(".") " Move one line down exec "normal j" if lnum == lend break endif endwhile " ...and go back exec "normal " . savelnum . "G" redraw! endfunction endif " FoldLongLines() }}} " Function AutoLastMod() {{{ " Provides atomatic change of date in files, if it is set via " modeline variable autolastmod to appropriate value. " function! AutoLastMod() if exists("g:autolastmod") if g:autolastmod < 0 return 0; elseif g:autolastmod == 1 call LastMod(g:autolastmodtext) endif endif endfunction " AutoLastMod() }}} " Function LastMod() {{{ " Automatic change date in *.html files. " function! LastMod(text, ...) mark d let line = "\\1" . strftime("%Y %b %d %X") " text of changed line let find = "g/" . a:text " regexpr to find line let matx = a:text . ".*" " ...if line was found exec find let curr_line = getline(".") if match(curr_line, matx) == 0 " call setline(line("."), line) call setline(line("."), substitute(getline("."), matx, line, "")) exec "'d" endif endfunction " LastMod() }}} " Function OpenAllWin() {{{ " Opens windows for all files in the command line. " Variable "opened" is used for testing, if window for file was already opened " or not. This is prevention for repeat window opening after ViM config file " reload. " function! OpenAllWin() " save Vim option to variable let s:save_split = &splitbelow set splitbelow let s:i = 1 if g:open_all_win == 1 while s:i < argc() if bufwinnr(argv(s:i)) == -1 " buffer doesn't exists or doesn't have window exec ":split " . argv(s:i) endif let s:i = s:i + 1 endwhile endif " restore Vim option from variable if s:save_split set splitbelow else set nosplitbelow endif endfunction " OpenAllWin() }}} " Function CallProg() {{{ function! CallProg() abort let choice = confirm("Call:", "&make\nm&ake in cwd\n" . \ "&compile\nc&ompile in cwd\n" . \ "&run\nr&un in cwd") if choice == 1 exec ":wall" exec "! cd %:p:h; pwd; make " . g:makeflags elseif choice == 2 exec ":wall" exec "! cd " . \ getcwd() . "; pwd; make " . g:makeflags elseif choice == 3 :call Compile(1) elseif choice == 4 :call Compile(0) elseif choice == 5 exec "! cd %:p:h; pwd; ./%:t:r" elseif choice == 6 exec "! cd " . getcwd() . "; pwd; ./%<" endif endfunction " CallProg() }}} " Function Compile() {{{ function! Compile(do_chdir) abort let cmd = "" let filename = "" let filename_ext = "" if a:do_chdir == 1 let cmd = "! cd %:p:h; pwd; " let filename = "%:t:r" let filename_ext = "%:t" else let cmd = "! cd " . getcwd() . "; pwd; " let filename = "%<" let filename_ext = "%" endif let choice = confirm("Call:", \ "&compile\n" . \ "compile and &debug\n" . \ "compile and &run\n" . \ "compile using first &line") if choice != 0 exec ":wall" endif if choice == 1 exec cmd . "gcc " . g:cflags . \ " -o " . filename . " " . filename_ext elseif choice == 2 exec cmd . "gcc " . g:cflags . " " . g:c_debug_flags . \ " -o " . filename . " " . filename_ext " && gdb " . filename elseif choice == 3 exec cmd . "gcc " . g:cflags . \ " -o " . filename . " " . filename_ext " && ./" . filename elseif choice == 4 exec cmd . "gcc " . g:cflags . \ " -o " . filename . " " . filename_ext . \ substitute(substitute(getline(2), "VIMGCC", "", "g"), "GCC", "", "g" ) endif endfunction " Compile() }}} " Function Indent() {{{ " Indents source code. function! Indent() range abort let savelnum = line(".") let lnum = a:firstline let lend = a:lastline if lnum == lend " No visual area choosen --> whole file let lnum = line(".") let lend = line("$") " Go to the begin of the file exec "1go" endif exec "normal " . lnum . "Gv" . lend . "G=" exec "normal " . savelnum . "G" endfunction " Indent() }}} " Function UnquoteMailBody() {{{ " function! UnquoteMailBody() range abort " Every backslash character must be escaped in function -- Nepto "exec "normal :%s/^\\([ ]*>[ ]*\\)*\\(\\|[^>].*\\)$/\\2/g" let savelnum = line(".") let lnum = a:firstline let lend = a:lastline if lnum == lend " No visual area choosen --> whole file let lnum = line(".") let lend = line("$") " Go to the begin of the file exec "1go" endif exec ":" . lnum . "," . lend . "s/^[ >]\\+//" exec "normal " . savelnum . "G" endfunction " UnquoteMailBody() }}} " Function SafeLineDelete() {{{ " function! SafeLineDelete() exec "normal \"_dd" endfunction " SafeLineDelete() }}} " Function GetID() {{{ " - used in statusline. " If you are root, function return "# " string --> it is showed at begin of " statusline " If you aren't root, function return empty string --> nothing is visible " Check for your name ID let g:get_id = $USER " If you are root, set to '#', else set to '' if g:get_id == "root" let g:get_id = "# " else let g:get_id = "" endif function! GetID() return g:get_id endfunction " GetID() }}} " Function ReadFileAboveCursor() {{{ " function! ReadFileAboveCursor(file, ...) let str = ":" . (v:lnum - 1) . "read " . a:file let idx = 1 while idx <= a:0 exec "let str = str . \" \" . a:" . idx let idx = idx + 1 endwhile exec str endfunction " ReadFileAboveCursor() }}} " Function RemoveAutogroup() {{{ " silent! function! RemoveAutogroup(group) silent exec "augroup! ". a:group endfunction " RemoveAutogroup() }}} " Function SmartBS() {{{ " " This function comes from Benji Fisher " http://vim.sourceforge.net/scripts/download.php?src_id=409 " (modified/patched by: Lubomir Host 'rajo' " Srinath Avadhanula ) silent function! SmartBS() let init = strpart(getline("."), 0, col(".")-1) if exists("g:smartBS_" . &filetype) silent exec "let matchtxt = matchstr(init, g:smartBS_" . &filetype . ")" echo "SmartBS(" . matchtxt . ")" if matchtxt != '' let bstxt = substitute(matchtxt, '.', "\", 'g') return bstxt else return "\" endif else return "\" endif endfunction " You can turn on smart backspacing in ftplugin by setting " g:smartBS_ variable and turning on mapping " inoremap =SmartBS() " " Example: TeX plugin " " set regular expresion for Smart backspacing " let g:smartBS_tex = '\(' . " \ "\\\\[\"^'=v]{\\S}" . '\|' . " \ "\\\\[\"^'=]\\S" . '\|' . " \ '\\v \S' . '\|' . " \ "\\\\[\"^'=v]{\\\\[iI]}" . '\|' . " \ '\\v \\[iI]' . '\|' . " \ '\\q \S' . '\|' . " \ '\\-' . " \ '\)' . "$" " " " map to function SmartBS() " inoremap =SmartBS() " }}} " Function UseDiacritics() {{{ function! UseDiacritics() let b:disable_imap=0 let g:available_methods = "&Tex-universal\n&tex-iso8859-2\n&iso8859-2\n&windows-1250\nunicode-&Html" let choice = confirm("Choose encoding:", g:available_methods, 0) if choice == 1 let b:input_method="tex-universal" elseif choice == 2 let b:input_method="tex-iso8859-2" elseif choice == 3 let b:input_method="iso8859-2" elseif choice == 4 let b:input_method="windows-1250" elseif choice == 5 let b:input_method="unicode-html" endif call Source("~/.vim/modules/diacritics.vim") endfunction " }}} " }}} " Autocomands {{{ if has("autocmd") " Autocomands for PlatonCopyright {{{ augroup PlatonCopyright autocmd! autocmd BufLeave * set titlestring= autocmd BufLeave * silent! call RemoveAutogroup("PlatonCopyright") autocmd WinEnter * set titlestring= autocmd WinEnter * silent! call RemoveAutogroup("PlatonCopyright") autocmd BufWrite * set titlestring= autocmd BufWrite * silent! call RemoveAutogroup("PlatonCopyright") autocmd CmdwinEnter * set titlestring= autocmd CmdwinEnter * silent! call RemoveAutogroup("PlatonCopyright") augroup END " }}} " Autocomands for GUIEnter {{{ augroup GUIEnter autocmd! if has("gui_win32") autocmd GUIEnter * simalt ~x endif augroup END " }}} " Autocomands for ~/.vimrc {{{ augroup VimConfig autocmd! " Reread configuration of ViM if file ~/.vimrc is saved autocmd BufWritePost ~/.vimrc so ~/.vimrc | exec "normal zv" autocmd BufWritePost vimrc so ~/.vimrc | exec "normal zv" augroup END " }}} " Autocommands for *.c, *.h, *.cc *.cpp {{{ augroup C autocmd! "formatovanie C-zdrojakov autocmd BufEnter *.c,*.h,*.cc,*.cpp map mfggvG$='f autocmd BufEnter *.c,*.h,*.cc,*.cpp imap mfggvG$='fi autocmd BufEnter *.c,*.h,*.cc,*.cpp map yii yyp3wdwi autocmd BufEnter *.c,*.h,*.cc,*.cpp map :call CallProg() autocmd BufRead,BufNewFile *.c,*.h,*.cc,*.cpp setlocal cindent autocmd BufRead,BufNewFile *.c,*.h,*.cc,*.cpp setlocal cinoptions=>4,e0,n0,f0,{0,}0,^0,:4,=4,p4,t4,c3,+4,(2s,u1s,)20,*30,g4,h4 autocmd BufRead,BufNewFile *.c,*.h,*.cc,*.cpp setlocal cinkeys=0{,0},:,0#,!,o,O,e augroup END " }}} " Autocommands for *.html *.cgi {{{ " Automatic updates date of last modification in HTML files. File must " contain line "^\([]*\)Last modified: ", " else will be date writtend on the current " line. augroup HtmlCgiPHP autocmd! " Appending right part of tag in HTML files. autocmd BufEnter *.html imap QQ 2Ff/pF QQ 2Ff/pF QQ 2Ff/pF QQ 2Ff/pF :call CallProg() autocmd BufRead,BufNewFile *.tcl setlocal autoindent augroup END " }}} " Autocomands for *.txt {{{ augroup Txt autocmd BufNewFile,BufRead *.txt setf txt augroup END " }}} " Autocomands for *.tt2 {{{ augroup Tt2 autocmd BufNewFile,BufRead *.tt2 setf tt2 augroup END " }}} " Autocomands for Makefile {{{ augroup Makefile autocmd! autocmd BufEnter [Mm]akefile* map :call CallProg() augroup END " }}} " Autocomands for GnuPG (gpg) {{{ " Transparent editing of gpg encrypted files. " By Wouter Hanegraaff , " enhanced by Lubomir Host 'rajo' " augroup GnuPG autocmd! " First make sure nothing is written to ~/.viminfo while editing " an encrypted file. " viminfo doesn't have local value, set global value instead autocmd BufReadPre,FileReadPre *.gpg,*.asc set viminfo= " We don't want a swap file, as it writes unencrypted data to disk autocmd BufReadPre,FileReadPre *.gpg,*.asc setlocal noswapfile " Switch to binary mode to read the encrypted file autocmd BufReadPre,FileReadPre *.gpg,*.asc setlocal bin autocmd BufReadPre,FileReadPre *.gpg,*.asc let ch_save = &ch | setlocal ch=2 autocmd BufReadPost,FileReadPost *.gpg,*.asc '[,']!gpg --decrypt -q -a 2>/dev/null " Switch to normal mode for editing autocmd BufReadPost,FileReadPost *.gpg,*.asc setlocal nobin autocmd BufReadPost,FileReadPost *.gpg,*.asc let &ch = ch_save | unlet ch_save autocmd BufReadPost,FileReadPost *.gpg,*.asc execute ":doautocmd BufReadPost " . expand("%:r") " Convert all text to encrypted text before writing autocmd BufWritePre,FileWritePre *.gpg,*.asc '[,']!gpg --encrypt --default-recipient-self -q -a " Undo the encryption so we are back in the normal text, directly " after the file has been written. autocmd BufWritePost,FileWritePost *.gpg,*.asc undo augroup END " }}} endif " if has("autocmd") " }}} Autocomands " Colors {{{ set background=dark hi StatusLine term=bold,reverse cterm=bold,reverse hi StatusLineNC term=reverse cterm=reverse hi User1 term=inverse,bold cterm=inverse,bold ctermfg=Red hi User2 term=bold cterm=bold ctermfg=Yellow hi User3 term=inverse,bold cterm=inverse,bold ctermfg=Blue hi User4 term=inverse,bold cterm=inverse,bold ctermfg=LightBlue hi User5 term=inverse,bold cterm=inverse,bold ctermfg=Red ctermbg=Green hi Folded term=standout cterm=bold ctermfg=Blue ctermbg=Black hi FoldColumn term=standout ctermfg=DarkBlue ctermbg=Black hi Comment term=bold ctermfg=DarkCyan " }}} call Source(VIMRC_EXTRA.".post") call Source(VIMRC_EXTRA."-".user.".post") call Source(VIMRC_EXTRA."-".machine.".post") call Source(VIMRC_EXTRA."-".machine."-".user.".post") if exists("g:open_all_win") if g:open_all_win == 1 " Open all windows only if we are not running (g)vimdiff if match(v:progname, "diff") < 0 call OpenAllWin() endif endif " turn g:open_all_win off after opening all windows " it prevents reopen windows after 2nd sourcing .vimrc let g:open_all_win = 0 endif " Modeline {{{ " vim:set ts=4: " vim600:fdm=marker fdl=0 fdc=3 vb t_vb=: " }}}