Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
902 lines (736 sloc) 29.4 KB
" .vimrc
" Smylers's .vimrc
" 2000 Jun 1: for `Vim' 5.6
" This vimrc is divided into these sections:
" * Terminal Settings
" * User Interface
" * Text Formatting -- General
" * Text Formatting -- Specific File Formats
" * Search & Replace
" * Spelling
" * Keystrokes -- Moving Around
" * Keystrokes -- Formatting
" * Keystrokes -- Toggles
" * Keystrokes -- Insert Mode
" * Keystrokes -- For HTML Files
" * `SLRN' Behaviour
" * Functions Referred to Above
" This file contains no control codes and no `top bit set' characters above the
" normal Ascii range, and all lines contain a maximum of 79 characters. With a
" bit of luck, this should make it resilient to being uploaded, downloaded,
" e-mailed, posted, encoded, decoded, transmitted by morse code, or whatever.
" first clear any existing autocommands:
" * Ben's additions
colorscheme herald
filetype plugin indent on
let g:miniBufExplMapWindowNavVim = 1
let g:miniBufExplMapWindowNavArrows = 1
let g:miniBufExplMapCTabSwitchBufs = 1
let g:miniBufExplModSelTarget = 1
let g:dbext_default_SQLITE_bin = 'sqlite3'
map <silent> <m-p> :cp <cr>
map <silent> <m-n> :cn <cr>
let g:rails_default_file='config/database.yml'
set clipboard+=unnamed
set cf
set autowrite
set ruler
set nu!
"set guifont=Courier\ New\ 10
set guifont=ProggyCleanTT\ 12
"hiding toolbars:
set guioptions-=T
set guioptions-=m
set guioptions-=r
nmap <C-F11> :if &guioptions=~'m' \| set guioptions-=m \| else \| set guioptions+=m \| endif<CR>
nmap <C-F7> :if &guioptions=~'r' \| set guioptions-=r \| else \| set guioptions+=r \| endif<CR>
" enable eclipse style moving of lines
nmap <M-j> mz:m+<CR>`z==
nmap <M-k> mz:m-2<CR>`z==
imap <M-j> <Esc>:m+<CR>==gi
imap <M-k> <Esc>:m-2<CR>==gi
"vmap <M-j> :m'>+<CR>gv=`<my`>mzgv`yo`z
"vmap <M-k> :m'<-2<CR>gv=`>my`<mzgv`yo`z
"run NERDTree
"autocmd VimEnter * exe 'NERDTree' | wincmd l
" * Terminal Settings
" `XTerm', `RXVT', `Gnome Terminal', and `Konsole' all claim to be "xterm";
" `KVT' claims to be "xterm-color":
if &term =~ 'xterm'
" `Gnome Terminal' fortunately sets $COLORTERM; it needs <BkSpc> and <Del>
" fixing, and it has a bug which causes spurious "c"s to appear, which can be
" fixed by unsetting t_RV:
if $COLORTERM == 'gnome-terminal'
execute 'set t_kb=' . nr2char(8)
" [Char 8 is <Ctrl>+H.]
set t_RV=
" `XTerm', `Konsole', and `KVT' all also need <BkSpc> and <Del> fixing;
" there's no easy way of distinguishing these terminals from other things
" that claim to be "xterm", but `RXVT' sets $COLORTERM to "rxvt" and these
" don't:
elseif $COLORTERM == ''
execute 'set t_kb=' . nr2char(8)
" The above won't work if an `XTerm' or `KVT' is started from within a `Gnome
" Terminal' or an `RXVT': the $COLORTERM setting will propagate; it's always
" OK with `Konsole' which explicitly sets $COLORTERM to "".
" * User Interface
" have syntax highlighting in terminals which can display colours:
if has('syntax') && (&t_Co > 2)
syntax on
" have fifty lines of command-line (etc) history:
set history=256
" remember all of these between sessions, but only 10 search terms; also
" remember info for 10 files, but never any on removable disks, don't remember
" marks in files, don't rehighlight old search patterns, and only save up to
" 100 lines of registers; including @10 in there should restrict input buffer
" but it causes an error for me:
set viminfo=/10,'10,r/mnt/zip,r/mnt/floppy,f0,h,\"100
" have command-line completion <Tab> (for filenames, help topics, option names)
" first list the available options and complete the longest common part, then
" have further <Tab>s cycle through the possibilities:
set wildmode=list:longest,full
" use "[RO]" for "[readonly]" to save space in the message line:
set shortmess+=r
" display the current mode and partially-typed commands in the status line:
set showmode
set showcmd
" when using list, keep tabs at their full width and display `arrows':
execute 'set listchars+=tab:' . nr2char(187) . nr2char(183)
" (Character 187 is a right double-chevron, and 183 a mid-dot.)
" have the mouse enabled all the time:
set mouse=a
" don't have files trying to override this .vimrc:
set nomodeline
" * Text Formatting -- General
" don't make it look like there are line breaks where there aren't:
set nowrap
" use indents of 2 spaces, and have them copied down lines:
set shiftwidth=2
set shiftround
set expandtab
set autoindent
" normally don't automatically format `text' as it is typed, IE only do this
" with comments, at 79 characters:
"set formatoptions-=t
"set textwidth=79
" get rid of the default style of C comments, and define a style with two stars
" at the start of `middle' rows which (looks nicer and) avoids asterisks used
" for bullet lists being treated like C comments; then define a bullet list
" style for single stars (like already is for hyphens):
set comments-=s1:/*,mb:*,ex:*/
set comments+=s:/*,mb:**,ex:*/
set comments+=fb:*
" treat lines starting with a quote mark as comments (for `Vim' files, such as
" this very one!), and colons as well so that reformatting usenet messages from
" `Tin' users works OK:
set comments+=b:\"
set comments+=n::
" * Text Formatting -- Specific File Formats
" enable filetype detection:
filetype on
set nocompatible
" recognize anything in my .Postponed directory as a news article, and anything
" at all with a .txt extension as being human-language text [this clobbers the
" `help' filetype, but that doesn't seem to prevent help from working
" properly]:
augroup filetype
autocmd BufNewFile,BufRead */.Postponed/* set filetype=mail
autocmd BufNewFile,BufRead *.txt set filetype=human
augroup END
" in human-language files, automatically format everything at 72 chars:
" autocmd FileType mail,human set formatoptions+=t textwidth=72
" for C-like programming, have automatic indentation:
autocmd FileType c,cpp,slang set cindent
" for actual C (not C++) programming where comments have explicit end
" characters, if starting a new line in the middle of a comment automatically
" insert the comment leader characters:
autocmd FileType c set formatoptions+=ro
" for Perl programming, have things in braces indenting themselves:
autocmd FileType perl set smartindent
" for CSS, also have things in braces indented:
autocmd FileType css set smartindent
" for HTML, generally format text, but if a long line has been created leave it
" alone when editing:
autocmd FileType html set formatoptions+=tl
" for both CSS and HTML, use genuine tab characters for indentation, to make
" files a few bytes smaller:
" autocmd FileType html,css set noexpandtab tabstop=2
" in makefiles, don't expand tabs to spaces, since actual tab characters are
" needed, and have indentation at 8 chars to be sure that all indents are tabs
" (despite the mappings later):
autocmd FileType make set noexpandtab shiftwidth=8
" * Search & Replace
" make searches case-insensitive, unless they contain upper-case letters:
set ignorecase
set smartcase
" show the `best match so far' as search strings are typed:
set incsearch
" assume the /g flag on :s substitutions to replace all matches in a line:
set gdefault
" * Spelling
" define `Ispell' language and personal dictionary, used in several places
" below:
let IspellLang = 'british'
let PersonalDict = '~/.ispell_' . IspellLang
" try to avoid misspelling words in the first place -- have the insert mode
" <Ctrl>+N/<Ctrl>+P keys perform completion on partially-typed words by
" checking the Linux word list and the personal `Ispell' dictionary; sort out
" case sensibly (so that words at starts of sentences can still be completed
" with words that are in the dictionary all in lower case):
execute 'set dictionary+=' . PersonalDict
set dictionary+=/usr/dict/words
set complete=.,w,k
set infercase
" correct my common typos without me even noticing them:
abbreviate teh the
abbreviate spolier spoiler
abbreviate Comny Conmy
abbreviate atmoic atomic
" Spell checking operations are defined next. They are all set to normal mode
" keystrokes beginning \s but function keys are also mapped to the most common
" ones. The functions referred to are defined at the end of this .vimrc.
" \si ("spelling interactive") saves the current file then spell checks it
" interactively through `Ispell' and reloads the corrected version:
execute 'nnoremap \si :w<CR>:!ispell -x -d ' . IspellLang . ' %<CR>:e<CR><CR>'
" \sl ("spelling list") lists all spelling mistakes in the current buffer,
" but excludes any in news/mail headers or in ("> ") quoted text:
execute 'nnoremap \sl :w ! grep -v "^>" <Bar> grep -E -v "^[[:alpha:]-]+: " ' .
\ '<Bar> ispell -l -d ' . IspellLang . ' <Bar> sort <Bar> uniq<CR>'
" \sh ("spelling highlight") highlights (in red) all misspelt words in the
" current buffer, and also excluding the possessive forms of any valid words
" (EG "Lizzy's" won't be highlighted if "Lizzy" is in the dictionary); with
" mail and news messages it ignores headers and quoted text; for HTML it
" ignores tags and only checks words that will appear, and turns off other
" syntax highlighting to make the errors more apparent [function at end of
" file]:
nnoremap \sh :call HighlightSpellingErrors()<CR><CR>
nmap <F9> \sh
" \sc ("spelling clear") clears all highlighted misspellings; for HTML it
" restores regular syntax highlighting:
nnoremap \sc :if &ft == 'html' <Bar> sy on <Bar>
\ else <Bar> :sy clear SpellError <Bar> endif<CR>
nmap <F10> \sc
" \sa ("spelling add") adds the word at the cursor position to the personal
" dictionary (but for possessives adds the base word, so that when the cursor
" is on "Ceri's" only "Ceri" gets added to the dictionary), and stops
" highlighting that word as an error (if appropriate) [function at end of
" file]:
nnoremap \sa :call AddWordToDictionary()<CR><CR>
nmap <F8> \sa
" * Keystrokes -- Moving Around
" have the h and l cursor keys wrap between lines (like <Space> and <BkSpc> do
" by default), and ~ covert case over line breaks; also have the cursor keys
" wrap in insert mode:
set whichwrap=h,l,~,[,]
" page down with <Space> (like in `Lynx', `Mutt', `Pine', `Netscape Navigator',
" `SLRN', `Less', and `More'); page up with - (like in `Lynx', `Mutt', `Pine'),
" or <BkSpc> (like in `Netscape Navigator'):
noremap <Space> <PageDown>
noremap <BS> <PageUp>
noremap - <PageUp>
" [<Space> by default is like l, <BkSpc> like h, and - like k.]
" scroll the window (but leaving the cursor in the same place) by a couple of
" lines up/down with <Ins>/<Del> (like in `Lynx'):
noremap <Ins> 2<C-Y>
noremap <Del> 2<C-E>
" [<Ins> by default is like i, and <Del> like x.]
" use <F6> to cycle through split windows (and <Shift>+<F6> to cycle backwards,
" where possible):
nnoremap <F6> <C-W>w
nnoremap <S-F6> <C-W>W
" use <Ctrl>+N/<Ctrl>+P to cycle through files:
nnoremap <C-N> :next<CR>
nnoremap <C-P> :prev<CR>
" [<Ctrl>+N by default is like j, and <Ctrl>+P like k.]
" have % bounce between angled brackets, as well as t'other kinds:
set matchpairs+=<:>
" have <F1> prompt for a help topic, rather than displaying the introduction
" page, and have it do this from any mode:
nnoremap <F1> :help<Space>
vmap <F1> <C-C><F1>
omap <F1> <C-C><F1>
map! <F1> <C-C><F1>
" * Keystrokes -- Formatting
" have Q reformat the current paragraph (or selected text if there is any):
nnoremap Q gqap
vnoremap Q gq
" have the usual indentation keystrokes still work in visual mode:
vnoremap <C-T> >
vnoremap <C-D> <LT>
vmap <Tab> <C-T>
vmap <S-Tab> <C-D>
" have Y behave analogously to D and C rather than to dd and cc (which is
" already done by yy):
noremap Y y$
" * Keystrokes -- Toggles
" Keystrokes to toggle options are defined here. They are all set to normal
" mode keystrokes beginning \t but some function keys (which won't work in all
" terminals) are also mapped.
" have \tp ("toggle paste") toggle paste on/off and report the change, and
" where possible also have <F4> do this both in normal and insert mode:
nnoremap \tp :set invpaste paste?<CR>
nmap <F4> \tp
imap <F4> <C-O>\tp
set pastetoggle=<F4>
" have \tf ("toggle format") toggle the automatic insertion of line breaks
" during typing and report the change:
nnoremap \tf :if &fo =~ 't' <Bar> set fo-=t <Bar> else <Bar> set fo+=t <Bar>
\ endif <Bar> set fo?<CR>
nmap <F3> \tf
imap <F3> <C-O>\tf
" have \tl ("toggle list") toggle list on/off and report the change:
nnoremap \tl :set invlist list?<CR>
nmap <F2> \tl
" have \th ("toggle highlight") toggle highlighting of search matches, and
" report the change:
nnoremap \th :set invhls hls?<CR>
" * Keystrokes -- Insert Mode
" allow <BkSpc> to delete line breaks, beyond the start of the current
" insertion, and over indentations:
set backspace=eol,start,indent
" have <Tab> (and <Shift>+<Tab> where it works) change the level of
" indentation:
inoremap <Tab> <C-T>
inoremap <S-Tab> <C-D>
" [<Ctrl>+V <Tab> still inserts an actual tab character.]
" abbreviations:
iabbrev lfpg Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
iabbrev hse he/she
iabbrev sm Smylers
" * Keystrokes -- For HTML Files
" Some automatic HTML tag insertion operations are defined next. They are
" allset to normal mode keystrokes beginning \h. Insert mode function keys are
" also defined, for terminals where they work. The functions referred to are
" defined at the end of this .vimrc.
" \hc ("HTML close") inserts the tag needed to close the current HTML construct
" [function at end of file]:
nnoremap \hc :call InsertCloseTag()<CR>
imap <F8> <Space><BS><Esc>\hca
" \hp ("HTML previous") copies the previous (non-closing) HTML tag in full,
" including attributes; repeating this straight away removes that tag and
" copies the one before it [function at end of file]:
nnoremap \hp :call RepeatTag(0)<CR>
imap <F9> <Space><BS><Esc>\hpa
" \hn ("HTML next") does the same thing, but copies the next tag; so \hp and
" \hn can be used to cycle backwards and forwards through the tags in the file
" (like <Ctrl>+P and <Ctrl>+N do for insert mode completion):
nnoremap \hn :call RepeatTag(1)<CR>
imap <F10> <Space><BS><Esc>\hna
" there are other key mappings that it's useful to have for typing HTML
" character codes, but that are definitely not wanted in other files (unlike
" the above, which won't do any harm), so only map these when entering an HTML
" file and unmap them on leaving it:
autocmd BufEnter * if &filetype == "html" | call MapHTMLKeys() | endif
function! MapHTMLKeys(...)
" sets up various insert mode key mappings suitable for typing HTML, and
" automatically removes them when switching to a non-HTML buffer
" if no parameter, or a non-zero parameter, set up the mappings:
if a:0 == 0 || a:1 != 0
" require two backslashes to get one:
inoremap \\ \
" then use backslash followed by various symbols insert HTML characters:
inoremap \& &amp;
inoremap \< &lt;
inoremap \> &gt;
inoremap \. &middot;
" em dash -- have \- always insert an em dash, and also have _ do it if
" ever typed as a word on its own, but not in the middle of other words:
inoremap \- &#8212;
iabbrev _ &#8212;
" hard space with <Ctrl>+Space, and \<Space> for when that doesn't work:
inoremap \<Space> &nbsp;
imap <C-Space> \<Space>
" have the normal open and close single quote keys producing the character
" codes that will produce nice curved quotes (and apostophes) on both Unix
" and Windows:
inoremap ` &#8216;
inoremap ' &#8217;
" then provide the original functionality with preceding backslashes:
inoremap \` `
inoremap \' '
" curved double open and closed quotes (2 and " are the same key for me):
inoremap \2 &#8220;
inoremap \" &#8221;
" when switching to a non-HTML buffer, automatically undo these mappings:
autocmd! BufLeave * call MapHTMLKeys(0)
" parameter of zero, so want to unmap everything:
iunmap \\
iunmap \&
iunmap \<
iunmap \>
iunmap \-
iunabbrev _
iunmap \<Space>
iunmap <C-Space>
iunmap `
iunmap '
iunmap \`
iunmap \'
iunmap \2
iunmap \"
" once done, get rid of the autocmd that called this:
autocmd! BufLeave *
endif " test for mapping/unmapping
endfunction " MapHTMLKeys()
" * `SLRN' Behaviour
" when using `SLRN' to compose a new news article without a signature, the
" cursor will be at the end of the file, the blank line after the header, so
" duplicate this line ready to start typing on; when composing a new article
" with a signature, `SLRN' includes an appropriate blank line but places the
" cursor on the following one, so move it up one line [if re-editing a
" partially-composed article, `SLRN' places the cursor on the top line, so
" neither of these will apply]:
autocmd VimEnter .article if line('.') == line('$') | yank | put |
\ elseif line('.') != 1 | -
" when following up articles from people with long names and/or e-mail
" addresses, the `SLRN'-generated attribution line can have over 80 characters,
" which will then cause `SLRN' to complain when trying to post it(!), so if
" editing a followup for the first time, reformat the line (then put the cursor
" back):
autocmd VimEnter .followup if line('.') != 1 | normal gq${j
" * Functions Referred to Above
function! HighlightSpellingErrors()
" highlights spelling errors in the current window; used for the \sh operation
" defined above;
" requires the ispell, sort, and uniq commands to be in the path;
" requires the global variable IspellLang to be defined above, and to contain
" the preferred `Ispell' language;
" for mail/news messages, requires the grep command to be in the path;
" for HTML documents, saves the file to disk and requires the lynx command to
" be in the path
" by Smylers
" (inspired by Krishna Gadepalli and Neil Schemenauer's
" 2000 Jun 1: for `Vim' 5.6
" for HTML files, remove all current syntax highlighting (so that
" misspellings show up clearly), and note it's HTML for future reference:
if &filetype == 'html'
let HTML = 1
syntax clear
" for everything else, simply remove any previously-identified spelling
" errors (and corrections):
let HTML = 0
if hlexists('SpellError')
syntax clear SpellError
if hlexists('Normal')
syntax clear Normal
" form a command that has the text to be checked piping through standard
" output; for HTML files this involves saving the current file and processing
" it with `Lynx'; for everything else, use all the buffer except quoted text
" and mail/news headers:
let PipeCmd = '! lynx --dump --nolist % |'
let PipeCmd = 'write !'
if &filetype == 'mail'
let PipeCmd = PipeCmd . ' grep -v "^> " | grep -E -v "^[[:alpha:]-]+:" |'
" execute that command, then generate a unique list of misspelt words and
" store it in a temporary file:
let ErrorsFile = tempname()
execute PipeCmd . ' ispell -l -d '. g:IspellLang .
\ ' | sort | uniq > ' . ErrorsFile
" open that list of words in another window:
execute 'split ' . ErrorsFile
" for every word in that list ending with "'s", check if the root form
" without the "'s" is in the dictionary, and if so remove the word from the
" list:
global /'s$/ execute 'read ! echo ' . expand('<cword>') .
\ ' | ispell -l -d ' . g:IspellLang | delete
" (If the root form is in the dictionary, ispell -l will have no output so
" nothing will be read in, the cursor will remain in the same place and the
" :delete will delete the word from the list. If the root form is not in the
" dictionary, then ispell -l will output it and it will be read on to a new
" line; the delete command will then remove that misspelt root form, leaving
" the original possessive form in the list!)
" only do anything if there are some misspellings:
if strlen(getline('.')) > 0
" if (previously noted as) HTML, replace each non-alphanum char with a
" regexp that matches either that char or a &...; entity:
% substitute /\W/\\(&\\|\&\\(#\\d\\{2,4}\\|\w\\{2,8}\\);\\)/e
" turn each mistake into a `Vim' command to place it in the SpellError
" syntax highlighting group:
% substitute /^/syntax match SpellError !\\</
% substitute /$/\\>!/
" save and close that file (so switch back to the one being checked):
" make syntax highlighting case-sensitive, then execute all the match
" commands that have just been set up in that temporary file, delete it, and
" highlight all those words in red:
syntax case match
execute 'source ' . ErrorsFile
call delete(ErrorsFile)
highlight SpellError term=reverse ctermfg=DarkRed guifg=Red
" with HTML, don't mark any errors in e-mail addresses or URLs, and ignore
" anything marked in a fix-width font (as being computer code):
syntax case ignore
syntax match Normal !\<[[:alnum:]._-]\+@[[:alnum:]._-]\+\.\a\+\>!
syntax match Normal
\ !\<\(ht\|f\)tp://[-[:alnum:].]\+\a\(/[-_.[:alnum:]/#&=,]*\)\=\>!
syntax region Normal start=!<Pre>! end=!</Pre>!
syntax region Normal start=!<Code>! end=!</Code>!
syntax region Normal start=!<Kbd>! end=!</Kbd>!
endfunction " HighlightSpellingErrors()
function! AddWordToDictionary()
" adds the word under the cursor to the personal dictonary; used for the \sa
" operation defined above;
" requires the global variable PersonalDict to be defined above, and to contain
" the `Ispell' personal dictionary;
" by Smylers
" 2000 Apr 30: for `Vim' 5.6
" get the word under the cursor, including the apostrophe as a word character
" to allow for words like "won't", but then ignoring any apostrophes at the
" start or end of the word:
set iskeyword+='
let Word = substitute(expand('<cword>'), "^'\\+", '', '')
let Word = substitute(Word, "'\\+$", '', '')
set iskeyword-='
" override any SpellError highlighting that might exist for this word,
" `highlighting' it as normal text:
execute 'syntax match Normal #\<' . Word . '\>#'
" remove any final "'s" so that possessive forms don't end up in the
" dictionary, then add the word to the dictionary:
let Word = substitute(Word, "'s$", '', '')
execute '!echo "' . Word . '" >> ' . g:PersonalDict
endfunction " AddWordToDictionary()
function! InsertCloseTag()
" inserts the appropriate closing HTML tag; used for the \hc operation defined
" above;
" requires ignorecase to be set, or to type HTML tags in exactly the same case
" that I do;
" doesn't treat <P> as something that needs closing;
" clobbers register z and mark z
" by Smylers
" 2000 May 4
if &filetype == 'html'
" list of tags which shouldn't be closed:
let UnaryTags = ' Area Base Br DD DT HR Img Input LI Link Meta P Param '
" remember current position:
normal mz
" loop backwards looking for tags:
let Found = 0
while Found == 0
" find the previous <, then go forwards one character and grab the first
" character plus the entire word:
execute "normal ?\<LT>\<CR>l"
normal "zyl
let Tag = expand('<cword>')
" if this is a closing tag, skip back to its matching opening tag:
if @z == '/'
execute "normal ?\<LT>" . Tag . "\<CR>"
" if this is a unary tag, then position the cursor for the next
" iteration:
elseif match(UnaryTags, ' ' . Tag . ' ') > 0
normal h
" otherwise this is the tag that needs closing:
let Found = 1
endwhile " not yet found match
" create the closing tag and insert it:
let @z = '</' . Tag . '>'
normal `z
if col('.') == 1
normal "zP
normal "zp
else " filetype is not HTML
echohl ErrorMsg
echo 'The InsertCloseTag() function is only intended to be used in HTML ' .
\ 'files.'
echohl None
endif " check on filetype
endfunction " InsertCloseTag()
function! RepeatTag(Forward)
" repeats a (non-closing) HTML tag from elsewhere in the document; call
" repeatedly until the correct tag is inserted (like with insert mode <Ctrl>+P
" and <Ctrl>+N completion), with Forward determining whether to copy forwards
" or backwards through the file; used for the \hp and \hn operations defined
" above;
" requires preservation of marks i and j;
" clobbers register z
" by Smylers
" 2000 May 4: for `Vim' 5.6
if &filetype == 'html'
" if the cursor is where this function left it, then continue from there:
if line('.') == line("'i") && col('.') == col("'i")
" delete the tag inserted last time:
if col('.') == strlen(getline('.'))
normal dF<x
normal dF<x
if col('.') != 1
normal h
" note the cursor position, then jump to where the deleted tag was found:
normal mi`j
" otherwise, just store the cursor position (in mark i):
normal mi
if a:Forward
let SearchCmd = '/'
let SearchCmd = '?'
" find the next non-closing tag (in the appropriate direction), note where
" it is (in mark j) in case this function gets called again, then yank it
" and paste a copy at the original cursor position, and store the final
" cursor position (in mark i) for use next time round:
execute "normal " . SearchCmd . "<[^/>].\\{-}>\<CR>mj\"zyf>`i"
if col('.') == 1
normal "zP
normal "zp
normal mi
else " filetype is not HTML
echohl ErrorMsg
echo 'The RepeatTag() function is only intended to be used in HTML files.'
echohl None
endfunction " RepeatTag()
" end of Smylers's .vimrc
" FoldSearch-based folding.
" Copyright (C) 2005 Mauricio Fernandez <>
" Current version:
" Add this to your .vimrc and fold with :R. The default fold expression will
" work with Ruby scripts; you can specify where folds start with
" let b:foldsearchexpr = 'myexpression'
" e.g.
" let b:foldsearchexpr='\(^\s*\(\(private\|public\|protected\|class\)\s\)\)'
" or so for Java.
" One way to have this buffer-local variable set is
" au Filetype java let b:foldsearchexpr='\(^\s*\(\(private\|public\|protected\|class\)\s\)\)'
" It is possible to have comments above a method/class/etc be included in the
" fold, by setting b:foldsearchprefix. All the lines above the detected fold
" matching b:foldsearchprefix will be included in said fold.
" For instance, for Ruby code:
" let b:foldsearchprefix = '\v^\s*(#.*)?$'
" which can be automated with
" au Filetype ruby let b:foldsearchprefix='\v^\s*(#.*)?$'
" Changelog:
" 2005-12-12 1.1 use b:foldsearchprefix to prepend comments to a fold.
"{{{ set s:sid
map <SID>xx <SID>xx
let s:sid = maparg("<SID>xx")
unmap <SID>xx
let s:sid = substitute(s:sid, 'xx', '', '')
"{{{ FoldText
function! s:Num2S(num, len)
let filler = " "
let text = '' . a:num
return strpart(filler, 1, a:len - strlen(text)) . text
execute 'set foldtext=' . s:sid . 'MyNewFoldText()'
function! <SID>MyNewFoldText()
let linenum = v:foldstart
while linenum <= v:foldend
let line = getline(linenum)
if !exists("b:foldsearchprefix") || match(line, b:foldsearchprefix) == -1
let linenum = linenum + 1
if exists("b:foldsearchprefix") && match(line, b:foldsearchprefix) != -1
" all lines matched the prefix regexp
let line = getline(v:foldstart)
let sub = substitute(line, '/\*\|\*/\|{{{\d\=', '', 'g')
let diff = v:foldend - v:foldstart + 1
return '+ [' . s:Num2S(diff,4) . ']' . sub
"{{{~foldsearch adapted from t77: Fold on search result (Fs <pattern>)
"Fs pattern Fold search
"Vimtip put to good use by Ralph Amissah
"Modified by Mauricio Fernandez <>
function! Foldsearch(search)
setlocal fdm=manual
let origlineno = line(".")
normal zE
normal G$
let folded = 0 "flag to set when a fold is found
let flags = "w" "allow wrapping in the search
let line1 = 0 "set marker for beginning of fold
if a:search == ""
if exists("b:foldsearchexpr")
let searchre = b:foldsearchexpr
"Default value, suitable for Ruby scripts
let searchre = '\v(^\s*(def|class|module|attr_reader|attr_accessor|alias_method)\s' .
\ '|^\s*\w+attr_(reader|accessor)\s|^\s*[#%"0-9]{0,4}\s*\{(\{\{|!!))' .
\ '|^\s*[A-Z]\w+\s*\='
let b:foldsearchexpr = searchre
let searchre = a:search
while search(searchre, flags) > 0
let line2 = line(".")
while line2 - 1 >= line1 && line2 - 1 > 0 "sanity check
let prevline = getline(line2 - 1)
if exists("b:foldsearchprefix") && (match(prevline, b:foldsearchprefix) != -1)
let line2 = line2 - 1
if (line2 -1 >= line1)
execute ":" . line1 . "," . (line2-1) . "fold"
let folded = 1 "at least one fold has been found
let line1 = line2 "update marker
let flags = "W" "turn off wrapping
normal $G
let line2 = line(".")
if (line2 >= line1 && folded == 1)
execute ":". line1 . "," . line2 . "fold"
execute "normal " . origlineno . "G"
"{{{~folds Fold Patterns
" Command is executed as ':Fs pattern'"
command! -nargs=? -complete=command Fs call Foldsearch(<q-args>)
command! -nargs=? -complete=command Fold call Foldsearch(<q-args>)
"command! R Fs \(^\s*\(\(def\|class\|module\)\s\)\)\|^\s*[#%"0-9]\{0,4\}\s*{\({{\|!!\)
command! R Fs