diff options
| author | Adam Stankiewicz <sheerun@sher.pl> | 2013-09-13 17:28:18 +0200 | 
|---|---|---|
| committer | Adam Stankiewicz <sheerun@sher.pl> | 2013-09-13 17:28:18 +0200 | 
| commit | 303837b5be695ea56a45c9e508abf3dbaefa7ca0 (patch) | |
| tree | 1aa2b6583bcdd6531ec958a124929789c2dea40a /ftplugin/latex-suite | |
| parent | 3e9a36e388dc9850747c7ba8e1e247245dc0eec1 (diff) | |
| download | vim-polyglot-303837b5be695ea56a45c9e508abf3dbaefa7ca0.tar.gz vim-polyglot-303837b5be695ea56a45c9e508abf3dbaefa7ca0.zip | |
Add latex support
Diffstat (limited to 'ftplugin/latex-suite')
21 files changed, 8672 insertions, 0 deletions
| diff --git a/ftplugin/latex-suite/bibtex.vim b/ftplugin/latex-suite/bibtex.vim new file mode 100644 index 00000000..2cc81995 --- /dev/null +++ b/ftplugin/latex-suite/bibtex.vim @@ -0,0 +1,265 @@ +"============================================================================= +" 	       File: bibtex.vim +"      Function: BibT +"        Author: Alan G Isaac <aisaac@american.edu> +"                modified by Srinath Avadhanula for latex-suite. +"       License: Vim Charityware license. +"============================================================================= + +" Fields: +" Define what field type each letter denotes {{{ +"  +let s:w_standsfor = 'address' +let s:a_standsfor = 'author' +let s:b_standsfor = 'booktitle' +let s:c_standsfor = 'chapter' +let s:d_standsfor = 'edition' +let s:e_standsfor = 'editor' +let s:h_standsfor = 'howpublished' +let s:i_standsfor = 'institution' +let s:k_standsfor = 'isbn' +let s:j_standsfor = 'journal' +let s:m_standsfor = 'month' +let s:n_standsfor = 'number' +let s:o_standsfor = 'organization' +let s:p_standsfor = 'pages' +let s:q_standsfor = 'publisher' +let s:r_standsfor = 'school' +let s:s_standsfor = 'series' +let s:t_standsfor = 'title' +let s:u_standsfor = 'type' +let s:v_standsfor = 'volume' +let s:y_standsfor = 'year' +let s:z_standsfor = 'note' + +" }}} +" Define the fields required for the various entry types {{{ +"  +" s:{type}_required defines the required fields +" s:{type}_optional1 defines common optional fields +" s:{type}_optional2 defines uncommmon optional fields +" s:{type}_retval defines the first line of the formatted bib entry. +" +let s:key='<+key+>' + +let s:{'article'}_required="atjy" +let s:{'article'}_optional1="vnpm" +let s:{'article'}_optional2="z" " z is note +let s:{'article'}_retval = '@ARTICLE{' . s:key . ','."\n" + +let s:{'book'}_required="aetqy" " requires author *or* editor +let s:{'book'}_optional1="wd" +let s:{'book'}_optional2="vnsmz" " w is address, d is edition +let s:{'book'}_extras="k" " isbn +let s:{'book'}_retval = '@BOOK{' . s:key . ','."\n" + +let s:{'booklet'}_required="t" +let s:{'booklet'}_optional1="ahy" +let s:{'booklet'}_optional2="wmz" " w is address +let s:{'booklet'}_retval = '@BOOKLET{' . s:key . ','."\n" + +let s:{'inbook'}_required="aetcpqy" +let s:{'inbook'}_optional1="w" " w is address +let s:{'inbook'}_optional2="vnsudmz" " d is edition +let s:{'inbook'}_extras="k" " isbn +let s:{'inbook'}_retval = '@INBOOK{' . s:key . ','."\n" + +let s:{'incollection'}_required="atbqy" " b is booktitle +let s:{'incollection'}_optional1="cpw" " w is address, c is chapter +let s:{'incollection'}_optional2="evnsudmz" " d is edition +let s:{'incollection'}_extras="k" " isbn +let s:{'incollection'}_retval = '@INCOLLECTION{' . s:key . ','."\n" + +let s:{'inproceedings'}_required="atby" " b is booktitle +let s:{'inproceedings'}_optional1="epwoq" " w is address, q is publisher +let s:{'inproceedings'}_optional2="vnsmz" +let s:{'inproceedings'}_extras="k" " isbn +let s:{'inproceedings'}_retval = '@INPROCEEDINGS{' . s:key . ','."\n" + +let s:{'conference'}_required="atby" " b is booktitle +let s:{'conference'}_optional1="epwoq" " w is address, q is publisher +let s:{'conference'}_optional2="vnsmz" +let s:{'conference'}_extras="k" " isbn +let s:{'conference'}_retval = '@CONFERENCE{' . s:key . ','."\n" + +let s:{'manual'}_required="t" +let s:{'manual'}_optional1="ow" +let s:{'manual'}_optional2="admyz" " w is address +let s:{'manual'}_retval = '@MANUAL{' . s:key . ','."\n" + +let s:{'msthesis'}_required="atry" " r is school +let s:{'msthesis'}_optional1="w" " w is address +let s:{'msthesis'}_optional2="umz" " u is type, w is address +let s:{'msthesis'}_retval = '@MASTERSTHESIS{' . s:key . ','."\n" + +let s:{'misc'}_required="" +let s:{'misc'}_optional1="ath" +let s:{'misc'}_optional2="myz" +let s:{'misc'}_retval = '@MISC{' . s:key . ','."\n" + +let s:{'phdthesis'}_required="atry" " r is school +let s:{'phdthesis'}_optional1="w" " w is address +let s:{'phdthesis'}_optional2="umz" " u is type +let s:{'phdthesis'}_retval = '@PHDTHESIS{' . s:key . ','."\n" + +let s:{'proceedings'}_required="ty" +let s:{'proceedings'}_optional1="ewo" " w is address +let s:{'proceedings'}_optional2="vnsmqz" " q is publisher +let s:{'proceedings'}_retval = '@PROCEEDINGS{' . s:key . ','."\n" + +let s:{'techreport'}_required="atiy" +let s:{'techreport'}_optional1="unw" " u is type, w is address +let s:{'techreport'}_optional2="mz" +let s:{'techreport'}_retval = '@TECHREPORT{' . s:key . ','."\n" + +let s:{'unpublished'}_required="atz" +let s:{'unpublished'}_optional1="y" +let s:{'unpublished'}_optional2="m" +let s:{'unpublished'}_retval = '@UNPUBLISHED{' . s:key . ','."\n" + +" }}} + +if exists('s:done') +	finish +endif +let s:done = 1 + +call IMAP ('BBB', "\<C-r>=BibT('', '', 0)\<CR>", 'bib') +call IMAP ('BBL', "\<C-r>=BibT('', 'o', 0)\<CR>", 'bib') +call IMAP ('BBH', "\<C-r>=BibT('', 'O', 0)\<CR>", 'bib') +call IMAP ('BBX', "\<C-r>=BibT('', 'Ox', 0)\<CR>", 'bib') + +" BibT: function to generate a formatted bibtex entry {{{ +" three sample usages: +"   :call BibT()                    will request type choice +"   :call BibT("article")           preferred, provides most common fields +"   :call BibT("article","ox")      more optional fields (o) and extras (x) +" +" Input Arguments: +" type: is one of the types listed above. (this should be a complete name, not +"       the acronym). +" options: a string containing 0 or more of the letters 'oOx' +"          where +"          o: include a bib entry with first set of options +"          O: include a bib entry with extended options +"          x: incude bib entry with extra options +" prompt: whether the fields are asked to be filled on the command prompt or +"         whether place-holders are used. when prompt == 1, then comman line +"         questions are used. +" +" Returns: +" a string containing a formatted bib entry +function BibT(type, options, prompt) +	if a:type != '' +		let choosetype = a:type +	else +		let types =  +			\ 'article'."\n". +			\ 'booklet'."\n". +			\ 'book'."\n". +			\ 'conference'."\n". +			\ 'inbook'."\n". +			\ 'incollection'."\n". +			\ 'inproceedings'."\n". +			\ 'manual'."\n". +			\ 'msthesis'."\n". +			\ 'misc'."\n". +			\ 'phdthesis'."\n". +			\ 'proceedings'."\n". +			\ 'techreport'."\n". +			\ 'unpublished' +		let choosetype = Tex_ChooseFromPrompt( +					\ "Choose the type of bibliographic entry: \n" .  +					\ Tex_CreatePrompt(types, 3, "\n") . +					\ "\nEnter number or filename :",  +					\ types, "\n") +		if choosetype == '' +			let choosetype = 'article' +		endif +		if types !~ '^\|\n'.choosetype.'$\|\n' +			echomsg 'Please choose only one of the given types' +			return +		endif +	endif +	if a:options != '' +		let options = a:options +	else +		let options = "" +	endif + +	let fields = '' +	let extras="" +	let retval = "" + +	" define fields +	let fields = s:{choosetype}_required +	if options =~ 'o' && exists('s:'.choosetype.'_optional1') +		let fields = fields . s:{choosetype}_optional1 +	endif +	if options =~ "O" && exists('s:'.choosetype.'_optional2') +		if options !~ 'o'&& exists('s:'.choosetype.'_optional1')  +			let fields = fields . s:{choosetype}_optional1 +		endif +		let fields = fields . s:{choosetype}_optional2 +	endif +	if options =~ "x" && exists('s:'.choosetype.'_extras') +		let fields = fields . extras +	endif +	if exists('g:Bib_'.choosetype.'_options') +		let fields = fields . g:Bib_{choosetype}_options +	endif + +	let retval = s:{choosetype}_retval +	 +	let i = 0 +	while i < strlen(fields) +		let field = strpart(fields, i, 1) + +		if exists('s:'.field.'_standsfor') +			let field_name = s:{field}_standsfor +			let retval = retval.field_name." = {<++>},\n" +		endif + +		let i = i + 1 +	endwhile +	 +	" If the user wants even more fine-tuning... +	if Tex_GetVarValue('Bib_'.choosetype.'_extrafields') != '' + +		let extrafields = Tex_GetVarValue('Bib_'.choosetype.'_extrafields') +		 +		let i = 1 +		while 1 +			let field_name = Tex_Strntok(extrafields, "\n", i) +			if field_name == '' +				break +			endif + +			let retval = retval.field_name." = {<++>},\n" + +			let i = i + 1 +		endwhile + +	endif + +	let retval = retval.'otherinfo = {<++>}'."\n" +	let retval = retval."}<++>"."\n" + +	return IMAP_PutTextWithMovement(retval) +endfunction + +" }}} +function! s:Input(prompt, ask) " {{{ +	if a:ask == 1 +		let retval = input(a:prompt) +		if retval == '' +			return "<++>" +		endif +	else +		return "<++>" +	endif +endfunction  + +" }}} + +" vim:fdm=marker:ff=unix:noet:ts=4:sw=4 diff --git a/ftplugin/latex-suite/brackets.vim b/ftplugin/latex-suite/brackets.vim new file mode 100644 index 00000000..e1d69ae7 --- /dev/null +++ b/ftplugin/latex-suite/brackets.vim @@ -0,0 +1,144 @@ +" ============================================================================== +" History: This was originally part of auctex.vim by Carl Mueller. +"          Srinath Avadhanula incorporated it into latex-suite with +"          significant modifications. +"          Parts of this file may be copyrighted by others as noted. +" Description: +" 	This ftplugin provides the following maps: +" . <M-b> encloses the previous character in \mathbf{} +" . <M-c> is polymorphic as follows: +"     Insert mode: +"     1. If the previous character is a letter or number, then capitalize it and +"        enclose it in \mathcal{} +"     2. otherwise insert \cite{} +"     Visual Mode: +"     1. Enclose selection in \mathcal{} +" . <M-l> is also polymorphic as follows: +"     If the character before typing <M-l> is one of '([{|<q', then do the +"     following: +"       1. (<M-l>       \left(\right +"               similarly for [, | +"          {<M-l>       \left\{\right\} +"       2. <<M-l>       \langle\rangle +"       3. q<M-l>       \lefteqn{} +"     otherwise insert  \label{} +" . <M-i> inserts \item commands at the current cursor location depending on +"       the surrounding environment. For example, inside itemize, it will +"       insert a simple \item, but within a description, it will insert +"       \item[<+label+>] etc. +"  +" These functions make it extremeley easy to do all the \left \right stuff in +" latex. +" ==============================================================================  + +" Avoid reinclusion. +if exists('b:did_brackets') +	finish +endif +let b:did_brackets = 1 + +" define the funtions only once. +if exists('*Tex_MathBF') +	finish +endif + +" Tex_MathBF: encloses te previous letter/number in \mathbf{} {{{ +" Description:  +function! Tex_MathBF() +	return "\<Left>\\mathbf{\<Right>}" +endfunction " }}} +" Tex_MathCal: enclose the previous letter/number in \mathcal {{{ +" Description: +" 	if the last character is not a letter/number, then insert \cite{} +function! Tex_MathCal() +	let line = getline(line(".")) +	let char = line[col(".")-2] + +	if char =~ '[a-zA-Z0-9]' +		return "\<BS>".'\mathcal{'.toupper(char).'}' +	else +		return IMAP_PutTextWithMovement('\cite{<++>}<++>') +	endif +endfunction +" }}} +" Tex_LeftRight: maps <M-l> in insert mode. {{{ +" Description: +" This is a polymorphic function, which maps the behaviour of <M-l> in the +" following way: +" If the character before typing <M-l> is one of '([{|<q', then do the +" following: +" 	1. (<M-l>		\left(<++>\right<++> +" 	    	similarly for [, | +" 	   {<M-l>		\left\{<++>\right\}<++> +" 	2. <<M-l>		\langle<++>\rangle<++> +" 	3. q<M-l>		\lefteqn{<++>}<++> +" otherwise insert  \label{<++>}<++> +function! Tex_LeftRight() +	let line = getline(line(".")) +	let char = line[col(".")-2] +	let previous = line[col(".")-3] + +	let matchedbrackets = '()[]{}||' +	if char =~ '(\|\[\|{\||' +		let add = '' +		if char =~ '{' +			let add = "\\" +		endif +		let rhs = matchstr(matchedbrackets, char.'\zs.\ze') +		return "\<BS>".IMAP_PutTextWithMovement('\left'.add.char.'<++>\right'.add.rhs.'<++>') +	elseif char == '<' +		return "\<BS>".IMAP_PutTextWithMovement('\langle <++>\rangle<++>') +	elseif char == 'q' +		return "\<BS>".IMAP_PutTextWithMovement('\lefteqn{<++>}<++>') +	else +		return IMAP_PutTextWithMovement('\label{<++>}<++>') +	endif +endfunction " }}} +" Tex_PutLeftRight: maps <M-l> in normal mode {{{ +" Description: +" Put \left...\right in front of the matched brackets. +function! Tex_PutLeftRight() +	let previous = getline(line("."))[col(".") - 2] +	let char = getline(line("."))[col(".") - 1] +	if previous == '\' +		if char == '{' +			exe "normal ileft\\\<Esc>l%iright\\\<Esc>l%" +		elseif char == '}' +			exe "normal iright\\\<Esc>l%ileft\\\<Esc>l%" +		endif +	elseif char =~ '\[\|(' +		exe "normal i\\left\<Esc>l%i\\right\<Esc>l%" +	elseif char =~ '\]\|)' +		exe "normal i\\right\<Esc>l%i\\left\<Esc>l%" +	endif +endfunction " }}} + +" Provide <plug>'d mapping for easy user customization. {{{ +inoremap <silent> <Plug>Tex_MathBF      <C-r>=Tex_MathBF()<CR> +inoremap <silent> <Plug>Tex_MathCal     <C-r>=Tex_MathCal()<CR> +inoremap <silent> <Plug>Tex_LeftRight   <C-r>=Tex_LeftRight()<CR> +vnoremap <silent> <Plug>Tex_MathBF		<C-C>`>a}<Esc>`<i\mathbf{<Esc> +vnoremap <silent> <Plug>Tex_MathCal		<C-C>`>a}<Esc>`<i\mathcal{<Esc> +nnoremap <silent> <Plug>Tex_LeftRight	:call Tex_PutLeftRight()<CR> + +" }}} +" Tex_SetBracketingMaps: create mappings for the current buffer {{{ +function! <SID>Tex_SetBracketingMaps() + +	call Tex_MakeMap('<M-b>', '<Plug>Tex_MathBF', 'i', '<buffer> <silent>') +	call Tex_MakeMap('<M-c>', '<Plug>Tex_MathCal', 'i', '<buffer> <silent>') +	call Tex_MakeMap('<M-l>', '<Plug>Tex_LeftRight', 'i', '<buffer> <silent>') +	call Tex_MakeMap('<M-b>', '<Plug>Tex_MathBF', 'v', '<buffer> <silent>') +	call Tex_MakeMap('<M-c>', '<Plug>Tex_MathCal', 'v', '<buffer> <silent>') +	call Tex_MakeMap('<M-l>', '<Plug>Tex_LeftRight', 'n', '<buffer> <silent>') + +endfunction +" }}} + +augroup LatexSuite +	au LatexSuite User LatexSuiteFileType  +		\ call Tex_Debug('brackets.vim: Catching LatexSuiteFileType event', 'brak') |  +		\ call <SID>Tex_SetBracketingMaps() +augroup END + +" vim:fdm=marker diff --git a/ftplugin/latex-suite/compiler.vim b/ftplugin/latex-suite/compiler.vim new file mode 100644 index 00000000..28213fab --- /dev/null +++ b/ftplugin/latex-suite/compiler.vim @@ -0,0 +1,874 @@ +"============================================================================= +"        File: compiler.vim +"      Author: Srinath Avadhanula +"     Created: Tue Apr 23 05:00 PM 2002 PST +" +"  Description: functions for compiling/viewing/searching latex documents +"============================================================================= + +" Tex_SetTeXCompilerTarget: sets the 'target' for the next call to Tex_RunLaTeX() {{{ +function! Tex_SetTeXCompilerTarget(type, target) +	call Tex_Debug("+Tex_SetTeXCompilerTarget: setting target to [".a:target."] for ".a:type."r", "comp") + +	if a:target == '' +		let target = Tex_GetVarValue('Tex_DefaultTargetFormat') +		let target = input('Enter the target format for '.a:type.'r: ', target) +	else +		let target = a:target +	endif +	if target == '' +		let target = 'dvi' +	endif + +	let targetRule = Tex_GetVarValue('Tex_'.a:type.'Rule_'.target) + +	if targetRule != '' +		if a:type == 'Compile' +			let &l:makeprg = escape(targetRule, Tex_GetVarValue('Tex_EscapeChars')) +		elseif a:type == 'View' +			let s:viewer = targetRule +		endif +		let s:target = target + +	elseif Tex_GetVarValue('Tex_'.a:type.'RuleComplete_'.target) != '' +		let s:target = target + +	elseif a:type == 'View' && has('macunix') +		" On the mac, we can have empty view rules, so do not complain when +		" both Tex_ViewRule_target and Tex_ViewRuleComplete_target are +		" empty. On other platforms, we will complain... see below. +		let s:target = target + +	else +		let s:origdir = fnameescape(getcwd()) +		exe 'cd '.fnameescape(expand('%:p:h')) +		if !Tex_GetVarValue('Tex_UseMakefile') || (glob('makefile*') == '' && glob('Makefile*') == '') +			if has('gui_running') +				call confirm( +					\'No '.a:type.' rule defined for target '.target."\n". +					\'Please specify a rule in $VIMRUNTIME/ftplugin/tex/texrc'."\n". +					\'     :help Tex_'.a:type.'Rule_format'."\n". +					\'for more information', +					\"&ok", 1, 'Warning') +			else +				call input( +					\'No '.a:type.' rule defined for target '.target."\n". +					\'Please specify a rule in $VIMRUNTIME/ftplugin/tex/texrc'."\n". +					\'     :help Tex_'.a:type.'Rule_format'."\n". +					\'for more information' +					\) +			endif +		else +			echomsg 'Assuming target is for makefile' +			let s:target = target +		endif +		exe 'cd '.s:origdir +	endif +endfunction + +function! SetTeXTarget(...) +	if a:0 < 1 +		let target = Tex_GetVarValue('Tex_DefaultTargetFormat') +		let target = input('Enter the target format for compiler and viewer: ', target) +	else +		let target = a:1 +	endif +	if target == '' +		let target = 'dvi' +	endif + +	call Tex_SetTeXCompilerTarget('Compile', target) +	call Tex_SetTeXCompilerTarget('View', target) +endfunction + +com! -nargs=1 TCTarget :call Tex_SetTeXCompilerTarget('Compile', <f-args>) +com! -nargs=1 TVTarget :call Tex_SetTeXCompilerTarget('View', <f-args>) +com! -nargs=? TTarget :call SetTeXTarget(<f-args>) + +" }}} +" Tex_CompileLatex: compiles the present file. {{{ +" Description: +function! Tex_CompileLatex() +	if &ft != 'tex' +		echo "calling Tex_RunLaTeX from a non-tex file" +		return +	end + +	" close any preview windows left open. +	pclose! + +	let s:origdir = fnameescape(getcwd()) + +	" Find the main file corresponding to this file. Always cd to the +	" directory containing the file to avoid problems with the directory +	" containing spaces. +	" Latex on linux seems to be unable to handle file names with spaces at +	" all! Therefore for the moment, do not attempt to handle spaces in the +	" file name. +	if exists('b:fragmentFile') +		let mainfname = expand('%:p:t') +		call Tex_CD(expand('%:p:h')) +	else +		let mainfname = Tex_GetMainFileName(':p:t') +		call Tex_CD(Tex_GetMainFileName(':p:h')) +	end + +	call Tex_Debug('Tex_CompileLatex: getting mainfname = ['.mainfname.'] from Tex_GetMainFileName', 'comp') + +	" if a makefile exists and the user wants to use it, then use that +	" irrespective of whether *.latexmain exists or not. mainfname is still +	" extracted from *.latexmain (if possible) log file name depends on the +	" main file which will be compiled. +	if Tex_GetVarValue('Tex_UseMakefile') && (glob('makefile') != '' || glob('Makefile') != '') +		let _makeprg = &l:makeprg +		call Tex_Debug("Tex_CompileLatex: using the makefile in the current directory", "comp") +		let &l:makeprg = 'make $*' +		if exists('s:target') +			call Tex_Debug('Tex_CompileLatex: execing [make! '.s:target.']', 'comp') +			exec 'make! '.s:target +		else +			call Tex_Debug('Tex_CompileLatex: execing [make!]', 'comp') +			exec 'make!' +		endif +		let &l:makeprg = _makeprg +	else +		" If &makeprg has something like "$*.ps", it means that it wants the +		" file-name without the extension... Therefore remove it. +		if &makeprg =~ '\$\*\.\w\+' +			let mainfname = fnamemodify(mainfname, ':r') +		endif +		call Tex_Debug('Tex_CompileLatex: execing [make! '.mainfname.']', 'comp') +		exec 'make! '.mainfname +	endif +	redraw! + +	exe 'cd '.s:origdir +endfunction " }}} +" Tex_RunLaTeX: compilation function {{{ +" this function runs the latex command on the currently open file. often times +" the file being currently edited is only a fragment being \input'ed into some +" master tex file. in this case, make a file called mainfile.latexmain in the +" directory containig the file. in other words, if the current file is +" ~/thesis/chapter.tex +" so that doing "latex chapter.tex" doesnt make sense, then make a file called +" main.tex.latexmain +" in the ~/thesis directory. this will then run "latex main.tex" when +" Tex_RunLaTeX() is called. +function! Tex_RunLaTeX() +	call Tex_Debug('+Tex_RunLaTeX, b:fragmentFile = '.exists('b:fragmentFile'), 'comp') + +	let dir = expand("%:p:h").'/' +	let s:origdir = fnameescape(getcwd()) +	call Tex_CD(expand("%:p:h")) + +	let initTarget = s:target + +	" first get the dependency chain of this format. +	call Tex_Debug("Tex_RunLaTeX: compiling to target [".s:target."]", "comp") + +	if Tex_GetVarValue('Tex_FormatDependency_'.s:target) != '' +		let dependency = Tex_GetVarValue('Tex_FormatDependency_'.s:target) +		if dependency !~ ','.s:target.'$' +			let dependency = dependency.','.s:target +		endif +	else +		let dependency = s:target +	endif + +	call Tex_Debug('Tex_RunLaTeX: getting dependency chain = ['.dependency.']', 'comp') + +	" now compile to the final target format via each dependency. +	let i = 1 +	while Tex_Strntok(dependency, ',', i) != '' +		let s:target = Tex_Strntok(dependency, ',', i) + +		call Tex_SetTeXCompilerTarget('Compile', s:target) +		call Tex_Debug('Tex_RunLaTeX: setting target to '.s:target, 'comp') + +		if Tex_GetVarValue('Tex_MultipleCompileFormats') =~ '\<'.s:target.'\>' +			call Tex_Debug("Tex_RunLaTeX: compiling file multiple times via Tex_CompileMultipleTimes", "comp") +			call Tex_CompileMultipleTimes() +		else +			call Tex_Debug("Tex_RunLaTeX: compiling file once via Tex_CompileLatex", "comp") +			call Tex_CompileLatex() +		endif + +		let errlist = Tex_GetErrorList() +		call Tex_Debug("Tex_RunLaTeX: errlist = [".errlist."]", "comp") + +		" If there are any errors, then break from the rest of the steps +		if errlist =~  '\v(error|warning)' +			call Tex_Debug('Tex_RunLaTeX: There were errors in compiling, breaking chain...', 'comp') +			break +		endif + +		let i = i + 1 +	endwhile + +	let s:target = initTarget +	let s:origwinnum = winnr() +	call Tex_SetupErrorWindow() + +	exe 'cd '.s:origdir +	call Tex_Debug("-Tex_RunLaTeX", "comp") +endfunction + +" }}} +" Tex_ViewLaTeX: opens viewer {{{ +" Description: opens the DVI viewer for the file being currently edited. +" Again, if the current file is a \input in a master file, see text above +" Tex_RunLaTeX() to see how to set this information. +function! Tex_ViewLaTeX() +	if &ft != 'tex' +		echo "calling Tex_ViewLaTeX from a non-tex file" +		return +	end + +	let s:origdir = fnameescape(getcwd()) + +	" If b:fragmentFile is set, it means this file was compiled as a fragment +	" using Tex_PartCompile, which means that we want to ignore any +	" *.latexmain or makefile's. +	if !exists('b:fragmentFile') +		" cd to the location of the file to avoid having to deal with spaces +		" in the directory name. +		let mainfname = Tex_GetMainFileName(':p:t:r') +		call Tex_CD(Tex_GetMainFileName(':p:h')) +	else +		let mainfname = expand("%:p:t:r") +		call Tex_CD(expand("%:p:h")) +	endif + +	if Tex_GetVarValue('Tex_ViewRuleComplete_'.s:target) != '' + +		let execString = Tex_GetVarValue('Tex_ViewRuleComplete_'.s:target) +		let execString = substitute(execString, '{v:servername}', v:servername, 'g') + +	elseif has('win32') +		" unfortunately, yap does not allow the specification of an external +		" editor from the command line. that would have really helped ensure +		" that this particular vim and yap are connected. +		let execString = 'start '.s:viewer.' "$*.'.s:target.'"' + +	elseif (has('macunix') && Tex_GetVarValue('Tex_TreatMacViewerAsUNIX') != 1) + +		if strlen(s:viewer) +			let appOpt = '-a ' +		else +			let appOpt = '' +		endif +		let execString = 'open '.appOpt.s:viewer.' $*.'.s:target + +	else +		" taken from Dimitri Antoniou's tip on vim.sf.net (tip #225). +		" slight change to actually use the current servername instead of +		" hardcoding it as xdvi. +		" Using an option for specifying the editor in the command line +		" because that seems to not work on older bash'es. +		if s:target == 'dvi' + +			if Tex_GetVarValue('Tex_UseEditorSettingInDVIViewer') == 1 && +						\ v:servername != '' && +						\ s:viewer =~ '^ *xdvik\?\( \|$\)' + +				let execString = s:viewer.' -editor "gvim --servername '.v:servername. +							\ ' --remote-silent +\%l \%f" $*.dvi' + +			elseif Tex_GetVarValue('Tex_UseEditorSettingInDVIViewer') == 1 && +						\ s:viewer =~ '^ *kdvi\( \|$\)' + +				let execString = s:viewer.' --unique $*.dvi' + +			else + +				let execString = s:viewer.' $*.dvi' + +			endif + +		else + +			let execString = s:viewer.' $*.'.s:target + +		endif + +		if( Tex_GetVarValue('Tex_ExecuteUNIXViewerInForeground') != 1 ) +			let execString = execString.' &' +		endif + +	end + +	let execString = substitute(execString, '\V$*', mainfname, 'g') +	call Tex_Debug("Tex_ViewLaTeX: execString = ".execString, "comp") + +	exec 'silent! !'.execString + +	if !has('gui_running') +		redraw! +	endif + +	exe 'cd '.s:origdir +endfunction + +" }}} +" Tex_ForwardSearchLaTeX: searches for current location in dvi file. {{{ +" Description: if the DVI viewer is compatible, then take the viewer to that +"              position in the dvi file. see docs for Tex_RunLaTeX() to set a +"              master file if this is an \input'ed file. +" Tip: With YAP on Windows, it is possible to do forward and inverse searches +"      on DVI files. to do forward search, you'll have to compile the file +"      with the --src-specials option. then set the following as the command +"      line in the 'view/options/inverse search' dialog box: +"           gvim --servername LATEX --remote-silent +%l "%f" +"      For inverse search, if you are reading this, then just pressing \ls +"      will work. +function! Tex_ForwardSearchLaTeX() +	if &ft != 'tex' +		echo "calling Tex_ForwardSeachLaTeX from a non-tex file" +		return +	end + +	if Tex_GetVarValue('Tex_ViewRule_'.s:target) == '' +		return +	endif +	let viewer = Tex_GetVarValue('Tex_ViewRule_'.s:target) + +	let s:origdir = fnameescape(getcwd()) + +	let mainfname = Tex_GetMainFileName(':t') +	let mainfnameRoot = fnamemodify(Tex_GetMainFileName(), ':t:r') +	let mainfnameFull = Tex_GetMainFileName(':p:r') +	" cd to the location of the file to avoid problems with directory name +	" containing spaces. +	call Tex_CD(Tex_GetMainFileName(':p:h')) + +	" inverse search tips taken from Dimitri Antoniou's tip and Benji Fisher's +	" tips on vim.sf.net (vim.sf.net tip #225) +	if (has('win32') && (viewer =~? '^ *yap\( \|$\)')) + +		let execString = 'silent! !start '. viewer.' -s '.line('.').expand('%').' '.mainfnameRoot + + +	elseif (has('macunix') && (viewer =~ '^ *\(Skim\|PDFView\|TeXniscope\)\( \|$\)')) +		" We're on a Mac using a traditional Mac viewer + +		if viewer =~ '^ *Skim' + +				let execString = 'silent! !/Applications/Skim.app/Contents/SharedSupport/displayline '. +					\ line('.').' "'.mainfnameFull.'.'.s:target.'" "'.expand("%:p").'"' + +		elseif viewer =~ '^ *PDFView' + +				let execString = 'silent! !/Applications/PDFView.app/Contents/MacOS/gotoline.sh '. +					\ line('.').' "'.mainfnameFull.'.'.s:target.'" "'.expand("%:p").'"' + +		elseif viewer =~ '^ *TeXniscope' + +				let execString = 'silent! !/Applications/TeXniscope.app/Contents/Resources/forward-search.sh '. +					\ line('.').' "'.expand("%:p").'" "'.mainfnameFull.'.'.s:target.'"' + +		endif + +	else +		" We're either UNIX or Mac and using a UNIX-type viewer + +		" Check for the special DVI viewers first +		if viewer =~ '^ *\(xdvi\|xdvik\|kdvi\|okular\)\( \|$\)' + +			if Tex_GetVarValue('Tex_UseEditorSettingInDVIViewer') == 1 && +						\ exists('v:servername') && +						\ viewer =~ '^ *xdvik\?\( \|$\)' + +				let execString = 'silent! !'.viewer.' -name xdvi -sourceposition "'.line('.').' '.expand("%").'"'. +							\ ' -editor "gvim --servername '.v:servername.' --remote-silent +\%l \%f" '. +							\ mainfnameRoot.'.dvi' + +			elseif viewer =~ '^ *kdvi' + +				let execString = 'silent! !'.viewer.' --unique file:'.mainfnameRoot.'.dvi\#src:'.line('.').expand("%") + +			elseif viewer =~ '^ *xdvik\?\( \|$\)' + +				let execString = 'silent! !'.viewer.' -name xdvi -sourceposition "'.line('.').' '.expand("%").'" '.mainfnameRoot.'.dvi' + +			elseif viewer =~ '^ *okular' + +				let execString = 'silent! !'.viewer.' --unique '.mainfnameRoot.'.'.s:target.'\#src:'.line('.').expand("%:p") + +			endif + +		else +			" We must be using a generic UNIX viewer +			" syntax is: viewer TARGET_FILE LINE_NUMBER SOURCE_FILE + +			let execString = 'silent! !'.viewer.' "'.mainfnameRoot.'.'.s:target.'" '.line('.').' "'.expand('%').'"' + +		endif + +		" See if we should add &. On Mac (at least in MacVim), it seems +		" like this should NOT be added... +		if( Tex_GetVarValue('Tex_ExecuteUNIXViewerInForeground') != 1 ) +			let execString = execString.' &' +		endif + +	endif + +	call Tex_Debug("Tex_ForwardSearchLaTeX: execString = ".execString, "comp") +	execute execString +	if !has('gui_running') +		redraw! +	endif + +	exe 'cd '.s:origdir +endfunction + +" }}} + +" ============================================================================== +" Functions for compiling parts of a file. +" ============================================================================== +" Tex_PartCompile: compiles selected fragment {{{ +" Description: creates a temporary file from the selected fragment of text +"       prepending the preamble and \end{document} and then asks Tex_RunLaTeX() to +"       compile it. +function! Tex_PartCompile() range +	call Tex_Debug('+Tex_PartCompile', 'comp') + +	" Get a temporary file in the same directory as the file from which +	" fragment is being extracted. This is to enable the use of relative path +	" names in the fragment. +	let tmpfile = Tex_GetTempName(expand('%:p:h')) + +	" Remember all the temp files and for each temp file created, remember +	" where the temp file came from. +	let s:Tex_NumTempFiles = (exists('s:Tex_NumTempFiles') ? s:Tex_NumTempFiles + 1 : 1) +	let s:Tex_TempFiles = (exists('s:Tex_TempFiles') ? s:Tex_TempFiles : '') +		\ . tmpfile."\n" +	let s:Tex_TempFile_{s:Tex_NumTempFiles} = tmpfile +	" TODO: For a function Tex_RestoreFragment which restores a temp file to +	"       its original location. +	let s:Tex_TempFileOrig_{s:Tex_NumTempFiles} = expand('%:p') +	let s:Tex_TempFileRange_{s:Tex_NumTempFiles} = a:firstline.','.a:lastline + +	" Set up an autocmd to clean up the temp files when Vim exits. +	if Tex_GetVarValue('Tex_RemoveTempFiles') +		augroup RemoveTmpFiles +			au! +			au VimLeave * :call Tex_RemoveTempFiles() +		augroup END +	endif + +	" If mainfile exists open it in tiny window and extract preamble there, +	" otherwise do it from current file +	let mainfile = Tex_GetMainFileName(":p") +	exe 'bot 1 split '.escape(mainfile, ' ') +	exe '1,/\s*\\begin{document}/w '.tmpfile +	wincmd q + +	exe a:firstline.','.a:lastline."w! >> ".tmpfile + +	" edit the temporary file +	exec 'drop '.tmpfile + +	" append the \end{document} line. +	$ put ='\end{document}' +	w + +	" set this as a fragment file. +	let b:fragmentFile = 1 + +	silent! call Tex_RunLaTeX() +endfunction " }}} +" Tex_RemoveTempFiles: cleans up temporary files created during part compilation {{{ +" Description: During part compilation, temporary files containing the +"              visually selected text are created. These files need to be +"              removed when Vim exits to avoid "file leakage". +function! Tex_RemoveTempFiles() +	if !exists('s:Tex_NumTempFiles') || !Tex_GetVarValue('Tex_RemoveTempFiles') +		return +	endif +	let i = 1 +	while i <= s:Tex_NumTempFiles +		let tmpfile = s:Tex_TempFile_{i} +		" Remove the tmp file and all other associated files such as the +		" .log files etc. +		call Tex_DeleteFile(fnamemodify(tmpfile, ':p:r').'.*') +		let i = i + 1 +	endwhile +endfunction " }}} + +" ============================================================================== +" Compiling a file multiple times to resolve references/citations etc. +" ============================================================================== +" Tex_CompileMultipleTimes: The main function {{{ +" Description: compiles a file multiple times to get cross-references right. +function! Tex_CompileMultipleTimes() +	" Just extract the root without any extension because we want to construct +	" the log file names etc from it. +	let s:origdir = fnameescape(getcwd()) +	let mainFileName_root = Tex_GetMainFileName(':p:t:r') +	call Tex_CD(Tex_GetMainFileName(':p:h')) + +	" First ignore undefined references and the +	" "rerun to get cross-references right" message from +	" the compiler output. +	let origlevel = Tex_GetVarValue('Tex_IgnoreLevel') +	let origpats = Tex_GetVarValue('Tex_IgnoredWarnings') + +	let g:Tex_IgnoredWarnings = g:Tex_IgnoredWarnings."\n" +		\ . 'Reference %.%# undefined'."\n" +		\ . 'Rerun to get cross-references right' +	TCLevel 1000 + +	let idxFileName = mainFileName_root.'.idx' +	let auxFileName = mainFileName_root.'.aux' + +	let runCount = 0 +	let needToRerun = 1 +	while needToRerun == 1 && runCount < 5 +		" assume we need to run only once. +		let needToRerun = 0 + +		let idxlinesBefore = Tex_CatFile(idxFileName) +		let auxlinesBefore = Tex_GetAuxFile(auxFileName) + +		" first run latex. +		echomsg "latex run number : ".(runCount+1) +		call Tex_Debug("Tex_CompileMultipleTimes: latex run number : ".(runCount+1), "comp") +		silent! call Tex_CompileLatex() + +		" If there are errors in any latex compilation step, immediately +		" return. For now, do not bother with warnings because those might go +		" away after compiling again or after bibtex is run etc. +		let errlist = Tex_GetErrorList() +		call Tex_Debug("Tex_CompileMultipleTimes: errors = [".errlist."]", "comp") + +		if errlist =~ 'error' +			let g:Tex_IgnoredWarnings = origpats +			exec 'TCLevel '.origlevel + +			return +		endif + +		let idxlinesAfter = Tex_CatFile(idxFileName) + +		" If .idx file changed, then run makeindex to generate the new .ind +		" file and remember to rerun latex. +		if runCount == 0 && glob(idxFileName) != '' && idxlinesBefore != idxlinesAfter +			echomsg "Running makeindex..." +			let temp_mp = &mp | let &mp = Tex_GetVarValue('Tex_MakeIndexFlavor') +			exec 'silent! make '.mainFileName_root +			let &mp = temp_mp + +			let needToRerun = 1 +		endif + +		" The first time we see if we need to run bibtex and if the .bbl file +		" changes, we will rerun latex. +		if runCount == 0 && Tex_IsPresentInFile('\\bibdata', mainFileName_root.'.aux') +			let bibFileName = mainFileName_root.'.bbl' + +			let biblinesBefore = Tex_CatFile(bibFileName) + +			echomsg "Running '".Tex_GetVarValue('Tex_BibtexFlavor')."' ..." +			let temp_mp = &mp | let &mp = Tex_GetVarValue('Tex_BibtexFlavor') +			exec 'silent! make '.mainFileName_root +			let &mp = temp_mp + +			let biblinesAfter = Tex_CatFile(bibFileName) + +			" If the .bbl file changed after running bibtex, we need to +			" latex again. +			if biblinesAfter != biblinesBefore +				echomsg 'Need to rerun because bibliography file changed...' +				call Tex_Debug('Tex_CompileMultipleTimes: Need to rerun because bibliography file changed...', 'comp') +				let needToRerun = 1 +			endif +		endif + +		" check if latex asks us to rerun +		let auxlinesAfter = Tex_GetAuxFile(auxFileName) +		if auxlinesAfter != auxlinesBefore +			echomsg "Need to rerun because the AUX file changed..." +			call Tex_Debug("Tex_CompileMultipleTimes: Need to rerun to get cross-references right...", 'comp') +			let needToRerun = 1 +		endif + +		let runCount = runCount + 1 +	endwhile + +	redraw! +	call Tex_Debug("Tex_CompileMultipleTimes: Ran latex ".runCount." time(s)", "comp") +	echomsg "Ran latex ".runCount." time(s)" + +	let g:Tex_IgnoredWarnings = origpats +	exec 'TCLevel '.origlevel +	" After all compiler calls are done, reparse the .log file for +	" errors/warnings to handle the situation where the clist might have been +	" emptied because of bibtex/makeindex being run as the last step. +	exec 'silent! cfile '.mainFileName_root.'.log' + +	exe 'cd '.s:origdir +endfunction " }}} +" Tex_GetAuxFile: get the contents of the AUX file {{{ +" Description: get the contents of the AUX file recursively including any +" @\input'ted AUX files. +function! Tex_GetAuxFile(auxFile) +	if !filereadable(a:auxFile) +		return '' +	endif + +	let auxContents = Tex_CatFile(a:auxFile) +	let pattern = '@\input{\(.\{-}\)}' + +	let auxContents = substitute(auxContents, pattern, '\=Tex_GetAuxFile(submatch(1))', 'g') + +	return auxContents +endfunction " }}} + +" ============================================================================== +" Helper functions for +" . viewing the log file in preview mode. +" . syncing the display between the quickfix window and preview window +" . going to the correct line _and column_ number from from the quick fix +"   window. +" ============================================================================== +" Tex_SetupErrorWindow: sets up the cwindow and preview of the .log file {{{ +" Description: +function! Tex_SetupErrorWindow() +	let mainfname = Tex_GetMainFileName() + +	let winnum = winnr() + +	" close the quickfix window before trying to open it again, otherwise +	" whether or not we end up in the quickfix window after the :cwindow +	" command is not fixed. +	cclose +	cwindow +	" create log file name from mainfname +	let mfnlog = fnamemodify(mainfname, ":t:r").'.log' +	call Tex_Debug('Tex_SetupErrorWindow: mfnlog = '.mfnlog, 'comp') +	" if we moved to a different window, then it means we had some errors. +	if winnum != winnr() +		if Tex_GetVarValue('Tex_ShowErrorContext') +			call Tex_UpdatePreviewWindow(mfnlog) +			exe 'nnoremap <buffer> <silent> j j:call Tex_UpdatePreviewWindow("'.mfnlog.'")<CR>' +			exe 'nnoremap <buffer> <silent> k k:call Tex_UpdatePreviewWindow("'.mfnlog.'")<CR>' +			exe 'nnoremap <buffer> <silent> <up> <up>:call Tex_UpdatePreviewWindow("'.mfnlog.'")<CR>' +			exe 'nnoremap <buffer> <silent> <down> <down>:call Tex_UpdatePreviewWindow("'.mfnlog.'")<CR>' +		endif +		exe 'nnoremap <buffer> <silent> <enter> :call Tex_GotoErrorLocation("'.mfnlog.'")<CR>' + +		setlocal nowrap + +		" resize the window to just fit in with the number of lines. +		exec ( line('$') < 4 ? line('$') : 4 ).' wincmd _' +        if Tex_GetVarValue('Tex_GotoError') == 1 +	        call Tex_GotoErrorLocation(mfnlog) +        else +			exec s:origwinnum.' wincmd w' +        endif +	endif + +endfunction " }}} +" Tex_PositionPreviewWindow: positions the preview window correctly. {{{ +" Description: +"   The purpose of this function is to count the number of times an error +"   occurs on the same line. or in other words, if the current line is +"   something like |10 error|, then we want to count the number of +"   lines in the quickfix window before this line which also contain lines +"   like |10 error|. +" +function! Tex_PositionPreviewWindow(filename) + +	if getline('.') !~ '|\d\+ \(error\|warning\)|' +		if !search('|\d\+ \(error\|warning\)|') +			call Tex_Debug("not finding error pattern anywhere in quickfix window :".bufname(bufnr('%')), +						\ 'comp') +			pclose! +			return +		endif +	endif + +	" extract the error pattern (something like 'file.tex|10 error|') on the +	" current line. +	let errpat = matchstr(getline('.'), '^\f*|\d\+ \(error\|warning\)|\ze') +	let errfile = matchstr(getline('.'), '^\f*\ze|\d\+ \(error\|warning\)|') +	" extract the line number from the error pattern. +	let linenum = matchstr(getline('.'), '|\zs\d\+\ze \(error\|warning\)|') + +	" if we are on an error, then count the number of lines before this in the +	" quickfix window with an error on the same line. +	if errpat =~ 'error|$' +		" our location in the quick fix window. +		let errline = line('.') + +		" goto the beginning of the quickfix window and begin counting the lines +		" which show an error on the same line. +		0 +		let numrep = 0 +		while 1 +			" if we are on the same kind of error line, then means we have another +			" line containing the same error pattern. +			if getline('.') =~ errpat +				let numrep = numrep + 1 +				normal! 0 +			endif +			" if we have reached the original location in the quick fix window, +			" then break. +			if line('.') == errline +				break +			else +				" otherwise, search for the next line which contains the same +				" error pattern again. goto the end of the current line so we +				" dont count this line again. +				normal! $ +				call search(errpat, 'W') +			endif +		endwhile +	else +		let numrep = 1 +	endif + +	if getline('.') =~ '|\d\+ warning|' +		let searchpat = escape(matchstr(getline('.'), '|\d\+ warning|\s*\zs.*'), '\ ') +	else +		let searchpat = 'l\.'.linenum +	endif + +	" We first need to be in the scope of the correct file in the .log file. +	" This is important for example, when a.tex and b.tex both have errors on +	" line 9 of the file and we want to go to the error of b.tex. Merely +	" searching forward from the beginning of the log file for l.9 will always +	" land us on the error in a.tex. +	if errfile != '' +		exec 'silent! bot pedit +/(\\(\\f\\|\\[\\|\]\\|\\s\\)*'.errfile.'/ '.a:filename +	else +		exec 'bot pedit +0 '.a:filename +	endif +	" Goto the preview window +	" TODO: This is not robust enough. Check that a wincmd j actually takes +	" us to the preview window. +	wincmd j +	" now search forward from this position in the preview window for the +	" numrep^th error of the current line in the quickfix window. +	while numrep > 0 +		call search(searchpat, 'W') +		let numrep = numrep - 1 +	endwhile +	normal! z. + +endfunction " }}} +" Tex_UpdatePreviewWindow: updates the view of the log file {{{ +" Description: +"       This function should be called when focus is in a quickfix window. +"       It opens the log file in a preview window and makes it display that +"       part of the log file which corresponds to the error which the user is +"       currently on in the quickfix window. Control returns to the quickfix +"       window when the function returns. +" +function! Tex_UpdatePreviewWindow(filename) +	call Tex_PositionPreviewWindow(a:filename) + +	if &previewwindow +		6 wincmd _ +		wincmd p +	endif +endfunction " }}} +" Tex_GotoErrorLocation: goes to the correct location of error in the tex file {{{ +" Description: +"   This function should be called when focus is in a quickfix window. This +"   function will first open the preview window of the log file (if it is not +"   already open), position the display of the preview to coincide with the +"   current error under the cursor and then take the user to the file in +"   which this error has occured. +" +"   The position is both the correct line number and the column number. +function! Tex_GotoErrorLocation(filename) + +	" first use vim's functionality to take us to the location of the error +	" accurate to the line (not column). This lets us go to the correct file +	" without applying any logic. +	exec "normal! \<enter>" +	" If the log file is not found, then going to the correct line number is +	" all we can do. +	if glob(a:filename) == '' +		return +	endif + +	let winnum = winnr() +	" then come back to the quickfix window +	wincmd w + +	" find out where in the file we had the error. +	let linenum = matchstr(getline('.'), '|\zs\d\+\ze \(warning\|error\)|') +	call Tex_PositionPreviewWindow(a:filename) + +	if getline('.') =~ 'l.\d\+' + +		let brokenline = matchstr(getline('.'), 'l.'.linenum.' \zs.*\ze') +		" If the line is of the form +		"   l.10 ...and then there was some error +		" it means (most probably) that only part of the erroneous line is +		" shown. In this case, finding the length of the broken line is not +		" correct.  Instead goto the beginning of the line and search forward +		" for the part which is displayed and then go to its end. +		if brokenline =~ '^\M...' +			let partline = matchstr(brokenline, '^\M...\m\zs.*') +			let normcmd = "0/\\V".escape(partline, "\\")."/e+1\<CR>" +		else +			let column = strlen(brokenline) + 1 +			let normcmd = column.'|' +		endif + +	elseif getline('.') =~ 'LaTeX Warning: \(Citation\|Reference\) `.*' + +		let ref = matchstr(getline('.'), "LaTeX Warning: \\(Citation\\|Reference\\) `\\zs[^']\\+\\ze'") +		let normcmd = '0/'.ref."\<CR>" + +	else + +		let normcmd = '0' + +	endif + +	" go back to the window where we came from. +	exec winnum.' wincmd w' +	exec 'silent! '.linenum.' | normal! '.normcmd + +	if !Tex_GetVarValue('Tex_ShowErrorContext') +		pclose! +	endif +endfunction " }}} +" Tex_SetCompilerMaps: sets maps for compiling/viewing/searching {{{ +" Description: +function! <SID>Tex_SetCompilerMaps() +	if exists('b:Tex_doneCompilerMaps') +		return +	endif +	let s:ml = '<Leader>' + +	nnoremap <buffer> <Plug>Tex_Compile :call Tex_RunLaTeX()<cr> +	vnoremap <buffer> <Plug>Tex_Compile :call Tex_PartCompile()<cr> +	nnoremap <buffer> <Plug>Tex_View :call Tex_ViewLaTeX()<cr> +	nnoremap <buffer> <Plug>Tex_ForwardSearch :call Tex_ForwardSearchLaTeX()<cr> + +	call Tex_MakeMap(s:ml."ll", "<Plug>Tex_Compile", 'n', '<buffer>') +	call Tex_MakeMap(s:ml."ll", "<Plug>Tex_Compile", 'v', '<buffer>') +	call Tex_MakeMap(s:ml."lv", "<Plug>Tex_View", 'n', '<buffer>') +	call Tex_MakeMap(s:ml."ls", "<Plug>Tex_ForwardSearch", 'n', '<buffer>') +endfunction +" }}} + +augroup LatexSuite +	au LatexSuite User LatexSuiteFileType +		\ call Tex_Debug('compiler.vim: Catching LatexSuiteFileType event', 'comp') | +		\ call <SID>Tex_SetCompilerMaps() +augroup END + +command! -nargs=0 -range=% TPartCompile :<line1>, <line2> silent! call Tex_PartCompile() +" Setting b:fragmentFile = 1 makes Tex_CompileLatex consider the present file +" the _main_ file irrespective of the presence of a .latexmain file. +command! -nargs=0 TCompileThis let b:fragmentFile = 1 +command! -nargs=0 TCompileMainFile let b:fragmentFile = 0 + +" vim:fdm=marker:ff=unix:noet:ts=4:sw=4 diff --git a/ftplugin/latex-suite/custommacros.vim b/ftplugin/latex-suite/custommacros.vim new file mode 100644 index 00000000..a8482abb --- /dev/null +++ b/ftplugin/latex-suite/custommacros.vim @@ -0,0 +1,255 @@ +"============================================================================= +" 	     File: custommacros.vim +"      Author: Mikolaj Machowski +" 	  Version: 1.0  +"     Created: Tue Apr 23 05:00 PM 2002 PST +"  +"  Description: functions for processing custom macros in the +"               latex-suite/macros directory +"============================================================================= + +let s:path = expand('<sfile>:p:h') + +" Set path to macros dir dependent on OS {{{ +if has("unix") || has("macunix") +	let s:macrodirpath = $HOME."/.vim/ftplugin/latex-suite/macros/" +elseif has("win32") +	if exists("$HOME") +		let s:macrodirpath = $HOME."/vimfiles/ftplugin/latex-suite/macros/" +	else +		let s:macrodirpath = $VIM."/vimfiles/ftplugin/latex-suite/macros/" +	endif +endif + +" }}} +" SetCustomMacrosMenu: sets up the menu for Macros {{{ +function! <SID>SetCustomMacrosMenu() +	let flist = Tex_FindInRtp('', 'macros') +	exe 'amenu '.g:Tex_MacrosMenuLocation.'&New :call <SID>NewMacro("FFFromMMMenu")<CR>' +	exe 'amenu '.g:Tex_MacrosMenuLocation.'&Redraw :call RedrawMacro()<CR>' + +	let i = 1 +	while 1 +		let fname = Tex_Strntok(flist, ',', i) +		if fname == '' +			break +		endif +		exe "amenu ".g:Tex_MacrosMenuLocation."&Delete.&".i.":<tab>".fname." :call <SID>DeleteMacro('".fname."')<CR>" +		exe "amenu ".g:Tex_MacrosMenuLocation."&Edit.&".i.":<tab>".fname."   :call <SID>EditMacro('".fname."')<CR>" +		exe "imenu ".g:Tex_MacrosMenuLocation."&".i.":<tab>".fname." <C-r>=<SID>ReadMacro('".fname."')<CR>" +		exe "nmenu ".g:Tex_MacrosMenuLocation."&".i.":<tab>".fname." i<C-r>=<SID>ReadMacro('".fname."')<CR>" +		let i = i + 1 +	endwhile +endfunction  + +if g:Tex_Menus +	call <SID>SetCustomMacrosMenu() +endif + +" }}} +" NewMacro: opens new file in macros directory {{{ +function! <SID>NewMacro(...) +	" Allow for calling :TMacroNew without argument or from menu and prompt +	" for name. +	if a:0 > 0 +		let newmacroname = a:1 +	else +		let newmacroname = input("Name of new macro: ") +		if newmacroname == '' +			return +		endif +	endif + +	if newmacroname == "FFFromMMMenu" +		" Check if NewMacro was called from menu and prompt for insert macro +		" name +		let newmacroname = input("Name of new macro: ") +		if newmacroname == '' +			return +		endif +	elseif Tex_FindInRtp(newmacroname, 'macros') != '' +		" If macro with this name already exists, prompt for another name. +		exe "echomsg 'Macro ".newmacroname." already exists. Try another name.'" +		let newmacroname = input("Name of new macro: ") +		if newmacroname == '' +			return +		endif +	endif +	exec 'split '.Tex_EscapeSpaces(s:macrodirpath.newmacroname) +	setlocal filetype=tex +endfunction + +" }}} +" RedrawMacro: refreshes macro menu {{{ +function! RedrawMacro() +	aunmenu TeX-Suite.Macros +	call <SID>SetCustomMacrosMenu() +endfunction + +" }}} +" ChooseMacro: choose a macro file {{{ +" " Description:  +function! s:ChooseMacro(ask) +	let filelist = Tex_FindInRtp('', 'macros') +	let filename = Tex_ChooseFromPrompt( +				\ a:ask."\n" .  +				\ Tex_CreatePrompt(filelist, 2, ',') . +				\ "\nEnter number or filename :", +				\ filelist, ',') +endfunction  + +" }}} +" DeleteMacro: deletes macro file {{{ +function! <SID>DeleteMacro(...) +	if a:0 > 0 +		let filename = a:1 +	else +		let filename = s:ChooseMacro('Choose a macro file for deletion :') +	endif + +	if !filereadable(s:macrodirpath.filename) +	" When file is not in local directory decline to remove it. +		call confirm('This file is not in your local directory: '.filename."\n". +					\ 'It will not be deleted.' , '&OK', 1) + +	else +		let ch = confirm('Really delete '.filename.' ?', "&Yes\n&No", 2) +		if ch == 1 +			call delete(s:macrodirpath.filename) +		endif +		call RedrawMacro() +	endif +endfunction + +" }}} +" EditMacro: edits macro file {{{ +function! <SID>EditMacro(...) +	if a:0 > 0 +		let filename = a:1 +	else +		let filename = s:ChooseMacro('Choose a macro file for insertion:') +	endif + +	if filereadable(s:macrodirpath.filename) +		" If file exists in local directory open it.  +		exec 'split '.Tex_EscapeSpaces(s:macrodirpath.filename) +	else +		" But if file doesn't exist in local dir it probably is in user +		" restricted area. Instead opening try to copy it to local dir. +		" Pity VimL doesn't have mkdir() function :) +		let ch = confirm("You are trying to edit file which is probably read-only.\n". +					\ "It will be copied to your local LaTeX-Suite macros directory\n". +					\ "and you will be operating on local copy with suffix -local.\n". +					\ "It will succeed only if ftplugin/latex-suite/macros dir exists.\n". +					\ "Do you agree?", "&Yes\n&No", 1) +		if ch == 1 +			" But there is possibility we already created local modification. +			" Check it and offer opening this file. +			if filereadable(s:macrodirpath.filename.'-local') +				let ch = confirm('Local version of '.filename." already exists.\n". +					\ 'Do you want to open it or overwrite with original version?', +					\ "&Open\nOver&write\n&Cancel", 1) +				if ch == 1 +					exec 'split '.Tex_EscapeSpaces(s:macrodirpath.filename.'-local') +				elseif ch == 2 +					new +					exe '0read '.Tex_FindInRtp(filename, 'macros') +					" This is possible macro was edited before, wipe it out. +					if bufexists(s:macrodirpath.filename.'-local') +						exe 'bwipe '.s:macrodirpath.filename.'-local' +					endif +					exe 'write! '.s:macrodirpath.filename.'-local' +				else +					return +				endif +			else +			" If file doesn't exist, open new file, read in system macro and +			" save it in local macro dir with suffix -local +				new +				exe '0read '.Tex_FindInRtp(filename, 'macros') +				exe 'write '.s:macrodirpath.filename.'-local' +			endif +		endif +		 +	endif +	setlocal filetype=tex +endfunction + +" }}} +" ReadMacro: reads in a macro from a macro file.  {{{ +"            allowing for placement via placeholders. +function! <SID>ReadMacro(...) + +	if a:0 > 0 +		let filename = a:1 +	else +		let filelist = Tex_FindInRtp('', 'macros') +		let filename =  +					\ Tex_ChooseFromPrompt("Choose a macro file:\n" .  +					\ Tex_CreatePrompt(filelist, 2, ',') .  +					\ "\nEnter number or name of file :",  +					\ filelist, ',') +	endif + +	let fname = Tex_FindInRtp(filename, 'macros', ':p') + +	let markerString = '<---- Latex Suite End Macro ---->' +	let _a = @a +	silent! call append(line('.'), markerString) +	silent! exec "read ".fname +	silent! exec "normal! V/^".markerString."$/-1\<CR>\"ax" +	" This is kind of tricky: At this stage, we are one line after the one we +	" started from with the marker text on it. We need to +	" 1. remove the marker and the line. +	" 2. get focus to the previous line. +	" 3. not remove anything from the previous line. +	silent! exec "normal! $v0k$\"_x" + +	call Tex_CleanSearchHistory() + +	let @a = substitute(@a, '['."\n\r\t ".']*$', '', '') +	let textWithMovement = IMAP_PutTextWithMovement(@a) +	let @a = _a + +	return textWithMovement + +endfunction + +" }}} +" commands for macros {{{ +com! -nargs=? TMacroNew :call <SID>NewMacro(<f-args>) + +" This macros had to have 2 versions: +if v:version >= 602  +	com! -complete=custom,Tex_CompleteMacroName -nargs=? TMacro +				\ :let s:retVal = <SID>ReadMacro(<f-args>) <bar> normal! i<C-r>=s:retVal<CR> +	com! -complete=custom,Tex_CompleteMacroName -nargs=? TMacroEdit +				\ :call <SID>EditMacro(<f-args>) +	com! -complete=custom,Tex_CompleteMacroName -nargs=? TMacroDelete +				\ :call <SID>DeleteMacro(<f-args>) + +	" Tex_CompleteMacroName: for completing names in TMacro... commands {{{ +	"	Description: get list of macro names with Tex_FindInRtp(), remove full path +	"	and return list of names separated with newlines. +	" +	function! Tex_CompleteMacroName(A,P,L) +		" Get name of macros from all runtimepath directories +		let macronames = Tex_FindInRtp('', 'macros') +		" Separate names with \n not , +		let macronames = substitute(macronames,',','\n','g') +		return macronames +	endfunction + +	" }}} + +else +	com! -nargs=? TMacro +		\	:let s:retVal = <SID>ReadMacro(<f-args>) <bar> normal! i<C-r>=s:retVal<CR> +	com! -nargs=? TMacroEdit   :call <SID>EditMacro(<f-args>) +	com! -nargs=? TMacroDelete :call <SID>DeleteMacro(<f-args>) + +endif + +" }}} + +" vim:fdm=marker:ff=unix:noet:ts=4:sw=4 diff --git a/ftplugin/latex-suite/diacritics.vim b/ftplugin/latex-suite/diacritics.vim new file mode 100644 index 00000000..616d30ab --- /dev/null +++ b/ftplugin/latex-suite/diacritics.vim @@ -0,0 +1,124 @@ +"============================================================================= +" 	     File: diacritics.vim +"      Author: Lubomir Host +"     Created: Tue Apr 23 07:00 PM 2002 PST +"  +"  Description: shortcuts for all diacritics.  +"============================================================================= + +if !g:Tex_Diacritics +	finish +endif + +" \'{a} {{{ +call IMAP ('=a', "\\\'{a}", 'tex') +call IMAP ('=b', "\\'{b}", 'tex') +call IMAP ('=c', "\\'{c}", 'tex') +call IMAP ('=d', "\\'{d}", 'tex') +call IMAP ('=e', "\\'{e}", 'tex') +call IMAP ('=f', "\\'{f}", 'tex') +call IMAP ('=g', "\\'{g}", 'tex') +call IMAP ('=h', "\\'{h}", 'tex') +call IMAP ('=i', "\\'{\i}", 'tex') +call IMAP ('=j', "\\'{j}", 'tex') +call IMAP ('=k', "\\'{k}", 'tex') +call IMAP ('=l', "\\'{l}", 'tex') +call IMAP ('=m', "\\'{m}", 'tex') +call IMAP ('=n', "\\'{n}", 'tex') +call IMAP ('=o', "\\'{o}", 'tex') +call IMAP ('=p', "\\'{p}", 'tex') +call IMAP ('=q', "\\'{q}", 'tex') +call IMAP ('=r', "\\'{r}", 'tex') +call IMAP ('=s', "\\'{s}", 'tex') +call IMAP ('=t', "\\'{t}", 'tex') +call IMAP ('=u', "\\'{u}", 'tex') +call IMAP ('=v', "\\'{v}", 'tex') +call IMAP ('=w', "\\'{w}", 'tex') +call IMAP ('=x', "\\'{x}", 'tex') +call IMAP ('=y', "\\'{y}", 'tex') +call IMAP ('=z', "\\'{z}", 'tex') +call IMAP ('=A', "\\'{A}", 'tex') +call IMAP ('=B', "\\'{B}", 'tex') +call IMAP ('=C', "\\'{C}", 'tex') +call IMAP ('=D', "\\'{D}", 'tex') +call IMAP ('=E', "\\'{E}", 'tex') +call IMAP ('=F', "\\'{F}", 'tex') +call IMAP ('=G', "\\'{G}", 'tex') +call IMAP ('=H', "\\'{H}", 'tex') +call IMAP ('=I', "\\'{\I}", 'tex') +call IMAP ('=J', "\\'{J}", 'tex') +call IMAP ('=K', "\\'{K}", 'tex') +call IMAP ('=L', "\\'{L}", 'tex') +call IMAP ('=M', "\\'{M}", 'tex') +call IMAP ('=N', "\\'{N}", 'tex') +call IMAP ('=O', "\\'{O}", 'tex') +call IMAP ('=P', "\\'{P}", 'tex') +call IMAP ('=Q', "\\'{Q}", 'tex') +call IMAP ('=R', "\\'{R}", 'tex') +call IMAP ('=S', "\\'{S}", 'tex') +call IMAP ('=T', "\\'{T}", 'tex') +call IMAP ('=U', "\\'{U}", 'tex') +call IMAP ('=V', "\\'{V}", 'tex') +call IMAP ('=W', "\\'{W}", 'tex') +call IMAP ('=X', "\\'{X}", 'tex') +call IMAP ('=Y', "\\'{Y}", 'tex') +call IMAP ('=Z', "\\'{Z}", 'tex') +" }}} +" \v{a} {{{ +call IMAP ('+a', "\\v{a}", 'tex') +call IMAP ('+b', "\\v{b}", 'tex') +call IMAP ('+c', "\\v{c}", 'tex') +call IMAP ('+d', "\\v{d}", 'tex') +call IMAP ('+e', "\\v{e}", 'tex') +call IMAP ('+f', "\\v{f}", 'tex') +call IMAP ('+g', "\\v{g}", 'tex') +call IMAP ('+h', "\\v{h}", 'tex') +call IMAP ('+i', "\\v{\i}", 'tex') +call IMAP ('+j', "\\v{j}", 'tex') +call IMAP ('+k', "\\v{k}", 'tex') +call IMAP ('+l', "\\q l", 'tex') +call IMAP ('+m', "\\v{m}", 'tex') +call IMAP ('+n', "\\v{n}", 'tex') +call IMAP ('+o', "\\v{o}", 'tex') +call IMAP ('+p', "\\v{p}", 'tex') +call IMAP ('+q', "\\v{q}", 'tex') +call IMAP ('+r', "\\v{r}", 'tex') +call IMAP ('+s', "\\v{s}", 'tex') +call IMAP ('+t', "\\q t", 'tex') +call IMAP ('+u', "\\v{u}", 'tex') +call IMAP ('+v', "\\v{v}", 'tex') +call IMAP ('+w', "\\v{w}", 'tex') +call IMAP ('+x', "\\v{x}", 'tex') +call IMAP ('+y', "\\v{y}", 'tex') +call IMAP ('+z', "\\v{z}", 'tex') +call IMAP ('+A', "\\v{A}", 'tex') +call IMAP ('+B', "\\v{B}", 'tex') +call IMAP ('+C', "\\v{C}", 'tex') +call IMAP ('+D', "\\v{D}", 'tex') +call IMAP ('+E', "\\v{E}", 'tex') +call IMAP ('+F', "\\v{F}", 'tex') +call IMAP ('+G', "\\v{G}", 'tex') +call IMAP ('+H', "\\v{H}", 'tex') +call IMAP ('+I', "\\v{\I}", 'tex') +call IMAP ('+J', "\\v{J}", 'tex') +call IMAP ('+K', "\\v{K}", 'tex') +call IMAP ('+L', "\\v{L}", 'tex') +call IMAP ('+M', "\\v{M}", 'tex') +call IMAP ('+N', "\\v{N}", 'tex') +call IMAP ('+O', "\\v{O}", 'tex') +call IMAP ('+P', "\\v{P}", 'tex') +call IMAP ('+Q', "\\v{Q}", 'tex') +call IMAP ('+R', "\\v{R}", 'tex') +call IMAP ('+S', "\\v{S}", 'tex') +call IMAP ('+T', "\\v{T}", 'tex') +call IMAP ('+U', "\\v{U}", 'tex') +call IMAP ('+V', "\\v{V}", 'tex') +call IMAP ('+W', "\\v{W}", 'tex') +call IMAP ('+X', "\\v{X}", 'tex') +call IMAP ('+Y', "\\v{Y}", 'tex') +call IMAP ('+Z', "\\v{Z}", 'tex') +" }}} +call IMAP ('+}', "\\\"{a}", 'tex') +call IMAP ('+:', "\\^{o}", 'tex') + +" vim:fdm=marker:ff=unix:noet:ts=4:sw=4 diff --git a/ftplugin/latex-suite/elementmacros.vim b/ftplugin/latex-suite/elementmacros.vim new file mode 100644 index 00000000..132291a7 --- /dev/null +++ b/ftplugin/latex-suite/elementmacros.vim @@ -0,0 +1,330 @@ +"============================================================================= +" 	     File: elementmacros.vim +"      Author: Mikolaj Machowski +"     Created: Tue Apr 23 06:00 PM 2002 PST +"  +"  Description: macros for dimensions/fonts/counters. +"               and various common commands such ref/label/footnote. +"============================================================================= + +nmap <silent> <script> <plug> i +imap <silent> <script> <C-o><plug> <Nop> + +if exists('s:lastElementsLocation') && g:Tex_ElementsMenuLocation == s:lastElementsLocation +	finish +endif + +if exists('s:lastElementsLocation') +	exe 'aunmenu '.s:lastElementsLocation.'Font.' +	exe 'aunmenu '.s:lastElementsLocation.'Dimension.' +	exe 'aunmenu '.s:lastElementsLocation.'Counters.' +	exe 'aunmenu '.s:lastElementsLocation.'Various.' +endif + +let s:lastElementsLocation = g:Tex_ElementsMenuLocation + +let s:fontMenuLoc       = g:Tex_ElementsMenuLocation.'Font.' +let s:dimensionMenuLoc  = g:Tex_ElementsMenuLocation.'Dimension.' +let s:counterMenuLoc    = g:Tex_ElementsMenuLocation.'Counters.' +let s:variousMenuLoc    = g:Tex_ElementsMenuLocation.'Various.' + +" ============================================================================== +" Set up the functions the first time. +" ==============================================================================  +if !exists('s:definedFuncs') " {{{ +	let s:definedFuncs = 1 + +	" Tex_RemoveElementMenus: remove the elements menu {{{ +	function! Tex_RemoveElementMenus() +		exe 'silent! aunmenu '.s:lastElementsLocation.'Font.' +		exe 'silent! aunmenu '.s:lastElementsLocation.'Dimension.' +		exe 'silent! aunmenu '.s:lastElementsLocation.'Counters.' +		exe 'silent! aunmenu '.s:lastElementsLocation.'Various.' +	endfunction " }}} +	" Tex_FontFamily: sets up font menus {{{ +	function! <SID>Tex_FontFamily(font,fam) +		let vislhs = matchstr(tolower(a:font), '^.\zs.*') + +		" avoid redoing imaps and vmaps for every reconfiguration of menus. +		if !exists('s:doneOnce') && g:Tex_FontMaps +			exe "vnoremap <silent> ".g:Tex_Leader.vislhs. +				\" \<C-\\>\<C-N>:call VEnclose('\\text".vislhs."{', '}', '{\\".vislhs.a:fam." ', '}')<CR>" +			exe 'call IMAP ("'.a:font.'", "\\text'.vislhs.'{<++>}<++>", "tex")' +		endif + +		" menu entry. +		if g:Tex_Menus && g:Tex_FontMenus +			let location = s:fontMenuLoc.substitute(a:fam, '^.', '\u&', '').'.'.vislhs.a:fam.'<tab>'.a:font.'\ ('.g:Tex_Leader.vislhs.')' +			exe "amenu ".location. +				\" <plug><C-r>=IMAP_PutTextWithMovement('\\text".vislhs."{<++>}<++>')<CR>" +			exe "vmenu ".location. +				\" \<C-\\>\<C-N>:call VEnclose('\\text".vislhs."{', '}', '{\\".vislhs.a:fam." ', '}')<CR>" +		endif + +	endfunction " }}} +	" Tex_FontDiacritics: sets up menus for diacritics. {{{ +	function! <SID>Tex_FontDiacritics(name, rhs) +		let location = s:fontMenuLoc.'&Diacritics.'.a:name.'<tab>' +		exe 'amenu '.location. +			\" <plug><C-r>=IMAP_PutTextWithMovement('\\".a:rhs."{<++>}<++>')<CR>" +		exe 'vmenu '.location. +			\" \<C-\\>\<C-n>:call VEnclose('\\".a:rhs."{', '}', '', '')<CR>"  +	endfunction " }}} +	" Tex_FontSize: sets up size fonts {{{ +	function! <SID>Tex_FontSize(name) +		let location = s:fontMenuLoc.'&Size.'.a:name.'<tab>' +		exe 'amenu '.location." <plug>\\".a:name +		exe 'vunmenu '.location +	endfunction " }}} +	" Tex_Fontfont: sets up the 'font' part of font menus {{{ +	function! <SID>Tex_Fontfont(desc, lhs) +		let location = s:fontMenuLoc.'&font.'.a:desc.'<tab>' +		exe "amenu ".location."  <plug><C-r>=IMAP_PutTextWithMovement('".a:lhs."')<CR>" +		exe "vunmenu ".location +	endfunction " }}} +	" Tex_DimMenus: set up dimension menus {{{ +	function! <SID>Tex_DimMenus(submenu, rhs) +		let location = s:dimensionMenuLoc.a:submenu.'.'.a:rhs.'<tab>' +		exe "amenu ".location." <plug>\\".a:rhs +		exe "vunmenu ".location +	endfunction " }}} +	" Tex_CounterMenus: set up counters menus {{{ +	function! <SID>Tex_CounterMenus(submenu, rhs) +		let location = s:counterMenuLoc.a:submenu.'.'.a:rhs.'<tab>' +		exe "amenu ".location." <plug>\\".a:rhs +		exe "vunmenu ".location +	endfunction " }}} +	" Tex_VariousMenus: set up various menus {{{ +	function! <SID>Tex_VariousMenus(desc, lhs) +		let location = s:variousMenuLoc.a:desc.'<tab>' +		exe "amenu ".location." <plug><C-r>=IMAP_PutTextWithMovement('".a:lhs."')<CR>" +		exe "vunmenu ".location +	endfunction " }}} + +endif +" }}} + +" ============================================================================== +" Fonts +" ==============================================================================  +" series/family/shape {{{ +call <SID>Tex_FontFamily("FBF","series") +call <SID>Tex_FontFamily("FMD","series") + +call <SID>Tex_FontFamily("FTT","family") +call <SID>Tex_FontFamily("FSF","family") +call <SID>Tex_FontFamily("FRM","family") + +call <SID>Tex_FontFamily("FUP","shape") +call <SID>Tex_FontFamily("FSL","shape") +call <SID>Tex_FontFamily("FSC","shape") +call <SID>Tex_FontFamily("FIT","shape") + +" the \emph is special. +if g:Tex_FontMaps | exe "vnoremap <silent> ".g:Tex_Leader."em \<C-\\>\<C-N>:call VEnclose('\\emph{', '}', '{\\em', '\\/}')<CR>" | endif +if g:Tex_FontMaps | exe 'call IMAP ("FEM", "\\emph{<++>}<++>", "tex")' | endif + +" }}} +if g:Tex_Menus && g:Tex_FontMenus +	" {{{ diacritics +	call <SID>Tex_FontDiacritics('Acute',        '"') +	call <SID>Tex_FontDiacritics('Breve',        'u') +	call <SID>Tex_FontDiacritics('Circle',       'r') +	call <SID>Tex_FontDiacritics('Circumflex',   '^') +	call <SID>Tex_FontDiacritics('Umlaut',       '"') +	call <SID>Tex_FontDiacritics('HUmlaut',      'H') +	call <SID>Tex_FontDiacritics('Dot\ over',    '.') +	call <SID>Tex_FontDiacritics('Grave',        '`') +	call <SID>Tex_FontDiacritics('Hacek',        'v') +	call <SID>Tex_FontDiacritics('Makron',       '=') +	call <SID>Tex_FontDiacritics('Tilde',        '~') +	call <SID>Tex_FontDiacritics('Underline',    'b') +	call <SID>Tex_FontDiacritics('Cedille',      'c') +	call <SID>Tex_FontDiacritics('Dot\ under',   ' ') +	call <SID>Tex_FontDiacritics('Ligature',     't') +	" }}} +	" {{{ Si&ze. +	call <SID>Tex_FontSize('tiny') +	call <SID>Tex_FontSize('scriptsize') +	call <SID>Tex_FontSize('footnotesize') +	call <SID>Tex_FontSize('small') +	call <SID>Tex_FontSize('normalsize') +	call <SID>Tex_FontSize('large') +	call <SID>Tex_FontSize('Large') +	call <SID>Tex_FontSize('LARGE') +	call <SID>Tex_FontSize('huge') +	call <SID>Tex_FontSize('Huge') +	" }}} +	" {{{ &font. +	call s:Tex_Fontfont('fontencoding{}',               '\fontencoding{<++>}<++>') +	call s:Tex_Fontfont('fontfamily{qtm}',              '\fontfamily{<++>}<++>') +	call s:Tex_Fontfont('fontseries{m\ b\ bx\ sb\ c}',  '\fontseries{<++>}<++>') +	call s:Tex_Fontfont('fontshape{n\ it\ sl\ sc\ ui}', '\fontshape{<++>}<++>') +	call s:Tex_Fontfont('fontsize{}{}',                 '\fontsize{<++>}{<++>}<++>') +	call s:Tex_Fontfont('selectfont',                   '\selectfont ') +	" }}} +endif + +" ============================================================================== +" Dimensions +" ==============================================================================  +if g:Tex_Menus +	" {{{ Static1 +	call <SID>Tex_DimMenus('Static1', 'arraycolsep') +	call <SID>Tex_DimMenus('Static1', 'arrayrulewidth') +	call <SID>Tex_DimMenus('Static1', 'bibindent') +	call <SID>Tex_DimMenus('Static1', 'columnsep') +	call <SID>Tex_DimMenus('Static1', 'columnseprule') +	call <SID>Tex_DimMenus('Static1', 'columnwidth') +	call <SID>Tex_DimMenus('Static1', 'doublerulesep') +	call <SID>Tex_DimMenus('Static1', 'evensidemargin') +	call <SID>Tex_DimMenus('Static1', 'fboxrule') +	call <SID>Tex_DimMenus('Static1', 'fboxsep') +	call <SID>Tex_DimMenus('Static1', 'footheight') +	call <SID>Tex_DimMenus('Static1', 'footnotesep') +	call <SID>Tex_DimMenus('Static1', 'footskip') +	call <SID>Tex_DimMenus('Static1', 'headheight') +	call <SID>Tex_DimMenus('Static1', 'headsep') +	call <SID>Tex_DimMenus('Static1', 'itemindent') +	call <SID>Tex_DimMenus('Static1', 'labelsep') +	call <SID>Tex_DimMenus('Static1', 'labelwidth') +	call <SID>Tex_DimMenus('Static1', 'leftmargin') +	call <SID>Tex_DimMenus('Static1', 'leftmargini') +	call <SID>Tex_DimMenus('Static1', 'leftmarginii') +	call <SID>Tex_DimMenus('Static1', 'leftmarginiii') +	call <SID>Tex_DimMenus('Static1', 'leftmarginiv') +	call <SID>Tex_DimMenus('Static1', 'leftmarginv') +	call <SID>Tex_DimMenus('Static1', 'leftmarginvi') +	call <SID>Tex_DimMenus('Static1', 'linewidth') +	call <SID>Tex_DimMenus('Static1', 'listparindent') +	call <SID>Tex_DimMenus('Static1', 'marginparpush') +	call <SID>Tex_DimMenus('Static1', 'marginparsep') +	call <SID>Tex_DimMenus('Static1', 'marginparwidth') +	call <SID>Tex_DimMenus('Static1', 'mathindent') +	call <SID>Tex_DimMenus('Static1', 'oddsidemargin') +	" }}} +	" {{{ Static2 +	call <SID>Tex_DimMenus('Static2', 'paperheight') +	call <SID>Tex_DimMenus('Static2', 'paperwidth') +	call <SID>Tex_DimMenus('Static2', 'parindent') +	call <SID>Tex_DimMenus('Static2', 'rightmargin') +	call <SID>Tex_DimMenus('Static2', 'tabbingsep') +	call <SID>Tex_DimMenus('Static2', 'tabcolsep') +	call <SID>Tex_DimMenus('Static2', 'textheight') +	call <SID>Tex_DimMenus('Static2', 'textwidth') +	call <SID>Tex_DimMenus('Static2', 'topmargin') +	call <SID>Tex_DimMenus('Static2', 'unitlength') +	" }}} +	" {{{ Dynamic +	call <SID>Tex_DimMenus('Dynamic', 'abovedisplayshortskip') +	call <SID>Tex_DimMenus('Dynamic', 'abovedisplayskip') +	call <SID>Tex_DimMenus('Dynamic', 'baselineskip') +	call <SID>Tex_DimMenus('Dynamic', 'belowdisplayshortskip') +	call <SID>Tex_DimMenus('Dynamic', 'belowdisplayskip') +	call <SID>Tex_DimMenus('Dynamic', 'dblfloatsep') +	call <SID>Tex_DimMenus('Dynamic', 'dbltextfloatsep') +	call <SID>Tex_DimMenus('Dynamic', 'floatsep') +	call <SID>Tex_DimMenus('Dynamic', 'intextsep') +	call <SID>Tex_DimMenus('Dynamic', 'itemsep') +	call <SID>Tex_DimMenus('Dynamic', 'parsep') +	call <SID>Tex_DimMenus('Dynamic', 'parskip') +	call <SID>Tex_DimMenus('Dynamic', 'partopsep') +	call <SID>Tex_DimMenus('Dynamic', 'textfloatsep') +	call <SID>Tex_DimMenus('Dynamic', 'topsep') +	call <SID>Tex_DimMenus('Dynamic', 'topskip') +	" }}} +	" {{{ Change +	call <SID>Tex_DimMenus('Change', 'setlength') +	call <SID>Tex_DimMenus('Change', 'addtolength') +	call <SID>Tex_DimMenus('Change', 'settoheight') +	call <SID>Tex_DimMenus('Change', 'settowidth') +	call <SID>Tex_DimMenus('Change', 'settolength') +	" }}} +endif + +" ============================================================================== +" Counters +" ==============================================================================  +if g:Tex_Menus +	" Counters {{{ +	call <SID>Tex_CounterMenus('Counters', 'bottomnumber') +	call <SID>Tex_CounterMenus('Counters', 'chapter') +	call <SID>Tex_CounterMenus('Counters', 'dbltopnumber') +	call <SID>Tex_CounterMenus('Counters', 'enumi') +	call <SID>Tex_CounterMenus('Counters', 'enumii') +	call <SID>Tex_CounterMenus('Counters', 'enumiii') +	call <SID>Tex_CounterMenus('Counters', 'enumiv') +	call <SID>Tex_CounterMenus('Counters', 'equation') +	call <SID>Tex_CounterMenus('Counters', 'figure') +	call <SID>Tex_CounterMenus('Counters', 'footnote') +	call <SID>Tex_CounterMenus('Counters', 'mpfootnote') +	call <SID>Tex_CounterMenus('Counters', 'page') +	call <SID>Tex_CounterMenus('Counters', 'paragraph') +	call <SID>Tex_CounterMenus('Counters', 'part') +	call <SID>Tex_CounterMenus('Counters', 'secnumdepth') +	call <SID>Tex_CounterMenus('Counters', 'section') +	call <SID>Tex_CounterMenus('Counters', 'subparagraph') +	call <SID>Tex_CounterMenus('Counters', 'subsection') +	call <SID>Tex_CounterMenus('Counters', 'subsubsection') +	call <SID>Tex_CounterMenus('Counters', 'table') +	call <SID>Tex_CounterMenus('Counters', 'tocdepth') +	call <SID>Tex_CounterMenus('Counters', 'topnumber') +	call <SID>Tex_CounterMenus('Counters', 'totalnumber') +	" }}} +	" theCounters {{{ +	call <SID>Tex_CounterMenus('theCounters', 'thebottomnumber') +	call <SID>Tex_CounterMenus('theCounters', 'thechapter') +	call <SID>Tex_CounterMenus('theCounters', 'thedbltopnumber') +	call <SID>Tex_CounterMenus('theCounters', 'theenumi') +	call <SID>Tex_CounterMenus('theCounters', 'theenumii') +	call <SID>Tex_CounterMenus('theCounters', 'theenumiii') +	call <SID>Tex_CounterMenus('theCounters', 'theenumiv') +	call <SID>Tex_CounterMenus('theCounters', 'theequation') +	call <SID>Tex_CounterMenus('theCounters', 'thefigure') +	call <SID>Tex_CounterMenus('theCounters', 'thefootnote') +	call <SID>Tex_CounterMenus('theCounters', 'thempfootnote') +	call <SID>Tex_CounterMenus('theCounters', 'thepage') +	call <SID>Tex_CounterMenus('theCounters', 'theparagraph') +	call <SID>Tex_CounterMenus('theCounters', 'thepart') +	call <SID>Tex_CounterMenus('theCounters', 'thesecnumdepth') +	call <SID>Tex_CounterMenus('theCounters', 'thesection') +	call <SID>Tex_CounterMenus('theCounters', 'thesubparagraph') +	call <SID>Tex_CounterMenus('theCounters', 'thesubsection') +	call <SID>Tex_CounterMenus('theCounters', 'thesubsubsection') +	call <SID>Tex_CounterMenus('theCounters', 'thetable') +	call <SID>Tex_CounterMenus('theCounters', 'thetocdepth') +	call <SID>Tex_CounterMenus('theCounters', 'thetopnumber') +	call <SID>Tex_CounterMenus('theCounters', 'thetotalnumber') +	" }}} +	" Type {{{ +	call <SID>Tex_CounterMenus('Type', 'alph') +	call <SID>Tex_CounterMenus('Type', 'Alph') +	call <SID>Tex_CounterMenus('Type', 'arabic') +	call <SID>Tex_CounterMenus('Type', 'roman') +	call <SID>Tex_CounterMenus('Type', 'Roman') +	" }}} +endif + +" ============================================================================== +" Various +" ==============================================================================  +if g:Tex_Menus +	" Various {{{ +	call <SID>Tex_VariousMenus('ref{}'         , '\ref{<++>}<++>') +	call <SID>Tex_VariousMenus('pageref{}'     , '\pageref{<++>}<++>') +	call <SID>Tex_VariousMenus('label{}'       , '\label{<++>}<++>') +	call <SID>Tex_VariousMenus('footnote{}'    , '\footnote{<++>}<++>') +	call <SID>Tex_VariousMenus('footnotemark{}', '\footnotemark{<++>}<++>') +	call <SID>Tex_VariousMenus('footnotemark{}', '\footnotetext{<++>}<++>') +	call <SID>Tex_VariousMenus('cite{}'        , '\cite{<++>}<++>') +	call <SID>Tex_VariousMenus('nocite{}'      , '\nocite{<++>}<++>') +	" }}} +endif + +if g:Tex_CatchVisMapErrors +	exe "vnoremap ".g:Tex_Leader."   :\<C-u>call ExecMap('".g:Tex_Leader."', 'v')\<CR>" +endif +" this is for avoiding reinclusion of imaps from next time on. +let s:doneOnce = 1 + +" vim:fdm=marker:ff=unix:noet:ts=4:sw=4 diff --git a/ftplugin/latex-suite/envmacros.vim b/ftplugin/latex-suite/envmacros.vim new file mode 100644 index 00000000..edf97f79 --- /dev/null +++ b/ftplugin/latex-suite/envmacros.vim @@ -0,0 +1,1166 @@ +"============================================================================= +" 	     File: envmacros.vim +"      Author: Mikolaj Machowski +"     Created: Tue Apr 23 08:00 PM 2002 PST +"  CVS Header: $Id: envmacros.vim 1101 2010-01-28 23:30:56Z tmaas $ +"  Description: mappings/menus for environments.  +"============================================================================= + +if !g:Tex_EnvironmentMaps && !g:Tex_EnvironmentMenus +	finish +endif + +exe 'so '.fnameescape(expand('<sfile>:p:h').'/wizardfuncs.vim') + +nmap <silent> <script> <plug> i +imap <silent> <script> <C-o><plug> <Nop> + +" Define environments for IMAP evaluation " {{{ +let s:figure =     "\\begin{figure}[<+htpb+>]\<cr>\\centering\<cr>\\psfig{figure=<+eps file+>}\<cr>\\caption{<+caption text+>}\<cr>\\label{fig:<+label+>}\<cr>\\end{figure}<++>" +let s:figure_graphicx =    "\\begin{figure}[<+htpb+>]\<cr>\\centering\<cr>\\includegraphics{<+file+>}\<cr>\\caption{<+caption text+>}\<cr>\\label{fig:<+label+>}\<cr>\\end{figure}<++>" +let s:minipage =   "\\begin{minipage}[<+tb+>]{<+width+>}\<cr><++>\<cr>\\end{minipage}<++>" +let s:picture =    "\\begin{picture}(<+width+>, <+height+>)(<+xoff+>,<+yoff+>)\<cr>\\put(<+xoff+>,<+yoff+>){\\framebox(<++>,<++>){<++>}}\<cr>\\end{picture}<++>" +let s:list =       "\\begin{list}{<+label+>}{<+spacing+>}\<cr>\\item <++>\<cr>\\end{list}<++>" +let s:table =      "\\begin{table}\<cr>\\centering\<cr>\\begin{tabular}{<+dimensions+>}\<cr><++>\<cr>\\end{tabular}\<cr>\\caption{<+Caption text+>}\<cr>\\label{tab:<+label+>}\<cr>\\end{table}<++>" +let s:array =      "\\left<++>\<cr>\\begin{array}{<+dimension+>}\<cr><+elements+>\<cr>\\end{array}\<cr>\\right<++>" +let s:description ="\\begin{description}\<cr>\\item[<+label+>]<++>\<cr>\\end{description}<++>" +let s:document =   "\\documentclass[<+options+>]{<+class+>}\<cr>\<cr>\\begin{document}\<cr><++>\<cr>\\end{document}" +let s:tabular = "\\begin{tabular}[<+hbtp+>]{<+format+>}\<cr><++>\<cr>\\end{tabular}" +let s:tabular_star = "\\begin{tabular*}[<+hbtp+>]{<+format+>}\<cr><++>\<cr>\\end{tabular*}" + +" }}} +" define environments with special behavior in line wise selection. {{{ +if !exists('s:vis_center_left') +	let s:vis_center_left = '\centerline{' +	let s:vis_center_right = '}' + +	let s:vis_verbatim_left = '\verb\|' +	let s:vis_verbatim_right = '\|' + +	let s:vis_flushright_left =  '{\raggedright ' +	let s:vis_flushright_right = '}' + +	let s:vis_fushleft_left = '{\raggedleft ' +	let s:vis_fushleft_right = '}' + +	let s:vis_lrbox_left = '\sbox{' +	let s:vis_lrbox_right = '}' +endif +" }}} +" Tex_EnvMacros: sets up maps and menus for environments {{{ +" Description:  +function! <SID>Tex_EnvMacros(lhs, submenu, name) + +	let extra = '' +	if a:submenu =~ 'Lists' +		let extra = '\item ' +	endif + +	let vright = '' +	let vleft = '' +	if exists('s:vis_'.a:name.'_right') +		let vright = s:vis_{a:name}_right +		let vleft = s:vis_{a:name}_left +	endif +	let vrhs = "\<C-\\>\<C-N>:call VEnclose('".vleft."', '".vright."', '\\begin{".a:name."}', '\\end{".a:name."}')\<CR>" +	let location = g:Tex_EnvMenuLocation.a:submenu.a:name.'<tab>' + +	if a:lhs != ''  + +		let vlhs = g:Tex_Leader2.substitute(tolower(a:lhs), '^.', '', '') +		let location = location.a:lhs.'\ ('.vlhs.')' + +		if g:Tex_EnvironmentMaps && !exists('s:doneOnce') +			call IMAP(a:lhs, "\<C-r>=Tex_PutEnvironment('".a:name."')\<CR>", 'tex') +			exec 'vnoremap <silent> '.vlhs.' '.vrhs +		endif + +	endif + +	if g:Tex_Menus && g:Tex_EnvironmentMenus && has("gui_running") +		exe 'amenu '.location.' <plug><C-r>=Tex_DoEnvironment("'.a:name.'")<CR>' +		exe 'vmenu '.location.' '.vrhs +	endif + +endfunction  + +" }}} +" Tex_SpecialMacros: macros with special right hand sides {{{ +" Description:  +function! <SID>Tex_SpecialMacros(lhs, submenu, name, irhs, ...) + +	let wiz = 1 +	if a:0 > 0 && a:1 == 0 +		let wiz = 0 +	endif + +	let location = g:Tex_EnvMenuLocation.a:submenu.a:name + +	let vright = '' +	let vleft = '' +	if exists('s:vis_'.a:name.'_right') +		let vright = s:vis_{a:name}_right +		let vleft = s:vis_{a:name}_left +	endif +	let vrhs = "\<C-\\>\<C-N>:call VEnclose('".vleft."', '".vright."', '\\begin{".a:name."}', '\\end{".a:name."}')\<CR>" + +	if a:lhs != '' + +		let vlhs = g:Tex_Leader2.substitute(tolower(a:lhs), '^.', '', '') +		let location = location.'<tab>'.a:lhs.'\ ('.vlhs.')' + +		if g:Tex_EnvironmentMaps && !exists('s:doneOnce') +			call IMAP(a:lhs, a:irhs, 'tex') +			exec 'vnoremap '.vlhs.' '.vrhs +		endif + +	endif + +	if g:Tex_Menus && g:Tex_EnvironmentMenus +		if wiz +			exe 'amenu '.location.' <plug><C-r>=Tex_DoEnvironment("'.a:name.'")<CR>' +		else +			exe 'amenu '.location." <plug><C-r>=IMAP_PutTextWithMovement('".a:irhs."')<CR>" +		endif +		exe 'vmenu '.location.' '.vrhs +	endif + +endfunction " }}} +" Tex_SectionMacros: creates section maps and menus {{{ +" Description:  +function! <SID>Tex_SectionMacros(lhs, name) + +	let vlhs = g:Tex_Leader2.substitute(tolower(a:lhs), '^.', '', '') +	let vrhs = "\<C-\\>\<C-N>:call VEnclose('\\".a:name."{', '}', '', '')<CR>" + +	if g:Tex_SectionMaps && !exists('s:doneOnce') +		exe 'vnoremap '.vlhs.' '.vrhs +		call IMAP (a:lhs, "\\".a:name.'{<++>}<++>', 'tex') +	endif + +	if g:Tex_Menus && g:Tex_SectionMenus +		let location = g:Tex_EnvMenuLocation.'Sections.'.a:name.'<tab>'.a:lhs.'\ ('.vlhs.')' +		let advlocation = g:Tex_EnvMenuLocation.'Sections.Advanced.'.a:name + +		let irhs = "\<C-r>=IMAP_PutTextWithMovement('\\".a:name."{<++>}<++>')\<CR>" + +		let advirhs = "\<C-r>=Tex_InsSecAdv('".a:name."')\<CR>" +		let advvrhs = "\<C-\\>\<C-N>:call Tex_VisSecAdv('".a:name."')\<CR>" + +		exe 'amenu '.advlocation.' <plug>'.advirhs +		exe 'vnoremenu '.advlocation." ".advvrhs + +		exe 'amenu '.location.' <plug>'.irhs +		exe 'vnoremenu '.location." ".vrhs +	endif +endfunction " }}} + +" NewEnvironments {{{ +call s:Tex_SpecialMacros('', '', 'newenvironment',     '\newenvironment{<++>}[<++>][<++>]{<++>}{<++>}<++>', 0) +call s:Tex_SpecialMacros('', '', 'newenvironment*',    '\newenvironment*{<++>}[<++>][<++>]{<++>}{<++>}<++>', 0) +call s:Tex_SpecialMacros('', '', 'renewenvironment',   '\renewenvironment{<++>}[<++>][<++>]{<++>}{<++>}<++>', 0) +call s:Tex_SpecialMacros('', '', 'renewenvironment*',  '\renewenvironment*{<++>}[<++>][<++>]{<++>}{<++>}<++>', 0) +call s:Tex_SpecialMacros('', '', '-sepenv0-', ' :', 0) +" }}} +" Environments specific commands {{{ +call s:Tex_SpecialMacros('', 'Env&Commands.&Lists.', '&item',     '\item', 0) +call s:Tex_SpecialMacros('', 'Env&Commands.&Lists.', 'i&tem[]',    '\item[<++>]<++>', 0) +call s:Tex_SpecialMacros('', 'Env&Commands.&Lists.', '&bibitem{}', '\bibitem{<++>}<++>', 0) +call s:Tex_SpecialMacros('', 'Env&Commands.&Tabbing.', '\\&=', '\=', 0) +call s:Tex_SpecialMacros('', 'Env&Commands.&Tabbing.', '\\&>', '\>', 0) +call s:Tex_SpecialMacros('', 'Env&Commands.&Tabbing.', '&\\\\', '\\', 0) +call s:Tex_SpecialMacros('', 'Env&Commands.&Tabbing.', '\\&+', '\+', 0) +call s:Tex_SpecialMacros('', 'Env&Commands.&Tabbing.', '\\&-', '\-', 0) +call s:Tex_SpecialMacros('', 'Env&Commands.&Tabbing.', "\\\'", "\\\'", 0) +call s:Tex_SpecialMacros('', 'Env&Commands.&Tabbing.', '\\&`', '\`', 0) +call s:Tex_SpecialMacros('', 'Env&Commands.&Tabbing.', '\\&kill', '\kill', 0) +call s:Tex_SpecialMacros('', 'Env&Commands.&Tabbing.', '&makron\ \\CHAR=', '\<++>=<++>', 0) +call s:Tex_SpecialMacros('', 'Env&Commands.&Tabbing.', "&aigu\ \\CHAR\'", "\\<++>\'<++>", 0) +call s:Tex_SpecialMacros('', 'Env&Commands.&Tabbing.', '&grave\ \\CHAR`', '\<++>`<++>', 0) +call s:Tex_SpecialMacros('', 'Env&Commands.&Tabbing.', 'p&ushtabs', '\pushtabs', 0) +call s:Tex_SpecialMacros('', 'Env&Commands.&Tabbing.', 'p&optabs', '\poptabs', 0) +call s:Tex_SpecialMacros('', 'EnvCommands.&Tabular.', '&hline', '\hline', 0) +call s:Tex_SpecialMacros('', 'EnvCommands.&Tabular.', '&cline', '\cline', 0)  +call s:Tex_SpecialMacros('', 'EnvCommands.&Tabular.', '&\&', '&', 0)  +call s:Tex_SpecialMacros('', 'EnvCommands.&Tabular.', '&\\\\', '\\', 0)  +call s:Tex_SpecialMacros('', 'EnvCommands.&Tabular.', '&multicolumn{}{}{}', '\multicolumn{<++>}{<++>}{<++>}<++>', 0) +call s:Tex_SpecialMacros('', 'EnvCommands.Le&tter.', '&makelabels', '\makelabels', 0) +call s:Tex_SpecialMacros('', 'EnvCommands.Le&tter.', '&address', '\address', 0) +call s:Tex_SpecialMacros('', 'EnvCommands.Le&tter.', '&signature', '\signature', 0) +call s:Tex_SpecialMacros('', 'EnvCommands.Le&tter.', '&date', '\date', 0) +call s:Tex_SpecialMacros('', 'EnvCommands.Le&tter.', '-sepenva4-', ' :', 0) +call s:Tex_SpecialMacros('', 'EnvCommands.Le&tter.', '&opening{}', '\opening{<++>}<++>', 0) +call s:Tex_SpecialMacros('', 'EnvCommands.Le&tter.', '&closing{}', '\closing{<++>}<++>', 0) +call s:Tex_SpecialMacros('', 'EnvCommands.Le&tter.', '&ps{}', '\ps{<++>}<++>', 0) +call s:Tex_SpecialMacros('', 'EnvCommands.Le&tter.', 'cc&{}', '\cc{<++>}<++>', 0) +call s:Tex_SpecialMacros('', 'EnvCommands.&Slides.', '&onlyslides{}', '\onlyslides{<++>}<++>', 0) +call s:Tex_SpecialMacros('', 'EnvCommands.&Slides.', '&onlynotes{}', '\onlynotes{<++>}<++>', 0) +call s:Tex_SpecialMacros('', 'EnvCommands.&Slides.', '-sepenva5-', ' :', 0) +call s:Tex_SpecialMacros('', 'EnvCommands.&Slides.', '&invisible', '\invisible', 0) +call s:Tex_SpecialMacros('', 'EnvCommands.&Slides.', '&visible', '\visible', 0) +call s:Tex_SpecialMacros('', 'EnvCommands.&Slides.', '&settime', '\settime', 0) +call s:Tex_SpecialMacros('', 'EnvCommands.&Slides.', '&addtime', '\addtime', 0) +call s:Tex_SpecialMacros('', '', '-sepenv0-', ' :', 0) +" }}} +" Lists {{{ +call s:Tex_SpecialMacros('ELI', '&Lists.',  'list', s:list) +call s:Tex_SpecialMacros('EDE', '&Lists.',  'description', s:description) +call s:Tex_EnvMacros('EEN', '&Lists.', 'enumerate') +call s:Tex_EnvMacros('EIT', '&Lists.', 'itemize') +call s:Tex_EnvMacros('ETI', '&Lists.', 'theindex') +call s:Tex_EnvMacros('ETL', '&Lists.', 'trivlist') +" }}} +" Tables {{{ +call s:Tex_SpecialMacros('ETE', '&Tables.', 'table', s:table) +call s:Tex_EnvMacros('ETG', '&Tables.', 'tabbing') +call s:Tex_EnvMacros('',    '&Tables.', 'table*') +call s:Tex_EnvMacros('',    '&Tables.', 'table2') +call s:Tex_SpecialMacros('ETR', '&Tables.', 'tabular', s:tabular) +call s:Tex_SpecialMacros('', '&Tables.', 'tabular*', s:tabular_star) +" }}} +" Math {{{ +call s:Tex_EnvMacros('EAR', '&Math.', 'array') +call s:Tex_EnvMacros('EDM', '&Math.', 'displaymath') +call s:Tex_EnvMacros('EEA', '&Math.', 'eqnarray') +call s:Tex_EnvMacros('',    '&Math.', 'eqnarray*') +call s:Tex_EnvMacros('EEQ', '&Math.', 'equation') +call s:Tex_EnvMacros('EMA', '&Math.', 'math') +" }}} +" Structure {{{ +call s:Tex_SpecialMacros('EAR', 'Math.', 'array', s:array) +call s:Tex_EnvMacros('EAB', '&Structure.', 'abstract') +call s:Tex_EnvMacros('EAP', '&Structure.', 'appendix') +call s:Tex_EnvMacros('ECE', '&Structure.', 'center') +call s:Tex_EnvMacros('EDO', '&Structure.', 'document') +call s:Tex_EnvMacros('EFC', '&Structure.', 'filecontents') +call s:Tex_EnvMacros('',    '&Structure.', 'filecontents*') +call s:Tex_EnvMacros('EFL', '&Structure.', 'flushleft') +call s:Tex_EnvMacros('EFR', '&Structure.', 'flushright') +call s:Tex_EnvMacros('EQN', '&Structure.', 'quotation') +call s:Tex_EnvMacros('EQE', '&Structure.', 'quote') +call s:Tex_EnvMacros('ESP', '&Structure.', 'sloppypar') +call s:Tex_EnvMacros('ETI', '&Structure.', 'theindex') +call s:Tex_EnvMacros('ETP', '&Structure.', 'titlepage') +call s:Tex_EnvMacros('EVM', '&Structure.', 'verbatim') +call s:Tex_EnvMacros('',    '&Structure.', 'verbatim*') +call s:Tex_EnvMacros('EVE', '&Structure.', 'verse') +call s:Tex_EnvMacros('ETB', '&Structure.', 'thebibliography') +call s:Tex_SpecialMacros('', '&Structure.', '-sepstruct0-', ':', 0) +call s:Tex_EnvMacros('ENO', '&Structure.', 'note') +call s:Tex_EnvMacros('EOV', '&Structure.', 'overlay') +call s:Tex_EnvMacros('ESL', '&Structure.', 'slide') +" }}} +" Sections {{{ +call s:Tex_SectionMacros('SPA', 'part') +call s:Tex_SectionMacros('SCH', 'chapter') +call s:Tex_SectionMacros('SSE', 'section') +call s:Tex_SectionMacros('SSS', 'subsection') +call s:Tex_SectionMacros('SS2', 'subsubsection') +call s:Tex_SectionMacros('SPG', 'paragraph') +call s:Tex_SectionMacros('SSP', 'subparagraph') +" }}} +" Miscellaneous {{{ +call s:Tex_SpecialMacros('', '', '-sepenv1-', ' :', 0) +call s:Tex_SpecialMacros('EFI', '', 'figure', "\<C-r>=Tex_PutEnvironment('figure')\<CR>") +call s:Tex_EnvMacros('', '', 'figure*') +call s:Tex_EnvMacros('ELR', '', 'lrbox') +call s:Tex_SpecialMacros('EMP', '', 'minipage', s:minipage) +call s:Tex_SpecialMacros('EPI', '', 'picture', s:picture) +" }}} + +if g:Tex_CatchVisMapErrors +	exe 'vnoremap '.g:Tex_Leader2."   :\<C-u>call ExecMap('".g:Tex_Leader2."', 'v')\<CR>" +endif + +" ============================================================================== +" Specialized functions for various environments +" +" All these functions are to be used as: +" +"   inoremap <lhs> <C-r>=Tex_itemize('enumerate')<CR> +"   nnoremap <lhs> i<C-r>=Tex_itemize('enumerate')<CR> +" +" and so on... +" ==============================================================================  +" Tex_itemize: {{{ +function! Tex_itemize(env) +	return IMAP_PutTextWithMovement('\begin{'.a:env."}\<cr>\\item <++>\<cr>\\end{".a:env."}<++>") +endfunction +" }}}  +" Tex_description: {{{ +function! Tex_description(env) +	if g:Tex_UseMenuWizard == 1 +		let itlabel = input('(Optional) Item label? ') +		if itlabel != '' +			let itlabel = '['.itlabel.']' +		endif +		return IMAP_PutTextWithMovement("\\begin{description}\<cr>\\item".itlabel." <++>\<cr>\\end{description}<++>") +	else +		return IMAP_PutTextWithMovement(s:description) +	endif +endfunction +" }}}  +" Tex_figure: {{{ +function! Tex_figure(env) +	if g:Tex_UseMenuWizard == 1 +		let flto    = input('Float to (htbp)? ') +		let caption = input('Caption? ') +		let center  = input('Center ([y]/n)? ') +		let label   = input('Label (for use with \ref)? ') +		" additional to AUC Tex since my pics are usually external files +		let pic = input('Name of Pic-File? ') +		if flto != '' +			let flto = '['.flto."]\<cr>" +		else +			let flto = "\<cr>" +		endif +		if pic != '' +			let pic = '\input{'.pic."}\<cr>" +		else +			let pic = "<++>\<cr>" +		endif +		if caption != '' +			let caption = '\caption{'.caption."}\<cr>" +		endif +		if label != '' +			let label = '\label{fig:'.label."}\<cr>" +		endif +		if center == 'y' +		  let centr = '\begin{center}' . "\<cr>" +		  let centr = centr . pic  +		  let centr = centr . caption +		  let centr = centr . label +		  let centr = centr . '\end{center}' . "\<cr>" +		else +		  let centr = pic +		  let centr = centr . caption +		  let centr = centr . label +		endif +		let figure = '\begin{'.a:env.'}'.flto +		let figure = figure . centr +		let figure = figure . '\end{'.a:env.'}' +		return IMAP_PutTextWithMovement(figure) +	else +		if g:Tex_package_detected =~ '\<graphicx\>' +			return IMAP_PutTextWithMovement(s:figure_graphicx) +		else +			return IMAP_PutTextWithMovement(s:figure) +		endif +	endif +endfunction +" }}}  +" Tex_table: {{{ +function! Tex_table(env) +	if g:Tex_UseMenuWizard == 1 +		let flto    = input('Float to (htbp)? ') +		let caption = input('Caption? ') +		let center  = input('Center (y/n)? ') +		let label   = input('Label? ') +		if flto != '' +			let flto ='['.flto."]\<cr>" +		else +			let flto = '' +		endif +		let ret='\begin{table}'.flto +		if center == 'y' +			let ret=ret."\\begin{center}\<cr>" +		endif +		let foo = '\begin{tabular}' +		let pos = input('(Optional) Position (t b)? ') +		if pos != '' +			let foo = foo.'['.pos.']' +		else +			let foo = foo."\<cr>" +		endif +		let format = input("Format  ( l r c p{width} | @{text} )? ") +		if format == '' +			let format = '<++>' +		endif +		let ret = ret.foo.'{'.format."}\<cr><++>\<cr>\\end{tabular}<++>\<cr>" +		if center == 'y' +			let ret=ret."\\end{center}\<cr>" +		endif +		if caption != '' +			let ret=ret.'\caption{'.caption."}\<cr>" +		endif +		if label != '' +			let ret=ret.'\label{tab:'.label."}\<cr>" +		endif +		let ret=ret.'\end{table}<++>' +		return IMAP_PutTextWithMovement(ret) +	else +		return IMAP_PutTextWithMovement(s:table) +	endif +endfunction +" }}}  +" Tex_tabular: {{{ +function! Tex_tabular(env) +	if g:Tex_UseMenuWizard == 1 +		let pos    = input('(Optional) Position (t b)? ') +		let format = input("Format  ( l r c p{width} | @{text} )? ") +		if pos != '' +		  let pos = '['.pos.']' +		endif +		if format != '' +		  let format = '{'.format.'}' +		endif +		return IMAP_PutTextWithMovement('\begin{'.a:env.'}'.pos.format."\<cr> \<cr>\\end{".a:env.'}<++>') +	else +		return IMAP_PutTextWithMovement('\begin{'.a:env.'}[<+position+>]{<+format+>}'."\<cr><++>\<cr>\\end{".a:env.'}<++>') +	endif +endfunction +" }}}  +" Tex_eqnarray: {{{ +function! Tex_eqnarray(env) +	if g:Tex_UseMenuWizard == 1 +		if a:env !~ '\*' +			let label = input('Label?  ') +			if label != '' +				let arrlabel = '\label{'.label."}\<cr>" +			  else +				let arrlabel = '' +			endif +		else +			let arrlabel = '' +		endif +	else +		if a:env !~ '\*' +			let arrlabel = "\\label{<++>}\<cr>" +		else +			let arrlabel = "" +		endif +	endif +	return IMAP_PutTextWithMovement('\begin{'.a:env."}\<cr><++>\<cr>".arrlabel."\\end{".a:env."}<++>") +endfunction +" }}}  +" Tex_list: {{{ +function! Tex_list(env) +	if g:Tex_UseMenuWizard == 1 +		let label = input('Label (for \item)? ') +		if label != '' +			let label = '{'.label.'}' +			let addcmd = input('Additional commands? ') +			if addcmd != '' +				let label = label . '{'.addcmd.'}' +			endif +		else +			let label = '' +		endif +		return IMAP_PutTextWithMovement('\begin{list}'.label."\<cr>\\item \<cr>\\end{list}<++>") +	else +		return IMAP_PutTextWithMovement(s:list) +	endif +endfunction +" }}}  +" Tex_document: {{{ +function! Tex_document(env) +	if g:Tex_UseMenuWizard == 1 +		let dstyle = input('Document style? ') +		let opts = input('(Optional) Options? ') +		let foo = '\documentclass' +		if opts == '' +			let foo = foo.'{'.dstyle.'}' +		else +			let foo = foo.'['.opts.']'.'{'.dstyle.'}' +		endif +		return IMAP_PutTextWithMovement(foo."\<cr>\<cr>\\begin{document}\<cr><++>\<cr>\\end{document}") +	else +		return IMAP_PutTextWithMovement(s:document) +	endif +endfunction +" }}}  +" Tex_minipage: {{{ +function! Tex_minipage(env) +	if g:Tex_UseMenuWizard == 1 +		let foo = '\begin{minipage}' +		let pos = input('(Optional) Position (t b)? ') +		let width = input('Width? ') +		if pos == '' +			let foo = foo.'{'.width.'}' +		else +			let  foo = foo.'['.pos.']{'.width.'}' +		endif +		return IMAP_PutTextWithMovement(foo."\<cr><++>\<cr>\\end{minipage}<++>") +	else +		return IMAP_PutTextWithMovement(s:minipage) +	endif +endfunction +" }}}  +" Tex_thebibliography: {{{ +function! Tex_thebibliography(env) +	if g:Tex_UseMenuWizard == 1 +		" AUC Tex: "Label for BibItem: 99" +		let indent = input('Indent for BibItem? ') +		let foo = '{'.indent.'}' +		let biblabel = input('(Optional) Bibitem label? ') +		let key = input('Add key? ') +		let bar = '\bibitem' +		if biblabel != '' +			let bar = bar.'['.biblabel.']' +		endif +		let bar = bar.'{'.key.'}' +		return IMAP_PutTextWithMovement('\begin{thebibliography}'.foo."\<cr>".bar." \<cr>\\end{thebibliography}<++>\<Up>") +	else +		return IMAP_PutTextWithMovement( +			\ "\\begin{thebibliography}\<CR>". +			\ "\\bibitem[<+biblabel+>]{<+bibkey+>} <++>\<CR>". +			\ "<++>\<CR>". +			\ "\\end{thebibliography}<++>") +	endif +endfunction +" }}}  + +" ============================================================================== +" Contributions / suggestions from Carl Mueller (auctex.vim) +" ==============================================================================  +" PromptForEnvironment: prompts for an environment {{{ +" Description:  +function! PromptForEnvironment(ask) +	return Tex_ChooseFromPrompt( +		\ a:ask."\n" .  +		\ Tex_CreatePrompt(g:Tex_PromptedEnvironments, 2, ",") . +		\ "\nEnter name or number of environment :",  +		\ g:Tex_PromptedEnvironments, ",") +endfunction " }}} +" Tex_DoEnvironment: fast insertion of environments {{{ +" Description: +"   The menus call this function with an argument (the name of the environment +"   to insert). The maps call this without any arguments. In this case, it +"   prompts for an environment to enter if the current line is empty. If +"   called without arguments and there is a word on the current line, then use +"   that as the name of a new environment. +function! Tex_DoEnvironment(...) +	if a:0 < 1 +		let env = matchstr(getline('.'), '^\s*\zs\w*\*\=\ze\s*$') +		" If in current line is more than one word or in visual mode +		" ignore contents of line and prompt for environment +		if env == '' || (exists('s:isvisual') && s:isvisual == 'yes') +			let env = PromptForEnvironment('Choose which environment to insert: ') +			if env != '' +				return Tex_PutEnvironment(env) +			else +				return '' +			endif +		else +			" delete the word on the line into the blackhole register. +			normal! 0"_D +			return Tex_PutEnvironment(env) +		endif +	else +		return Tex_PutEnvironment(a:1) +	endif +endfunction " }}} +" Tex_PutEnvironment: calls various specialized functions {{{ +" Description:  +"   Based on input argument, it calls various specialized functions. +function! Tex_PutEnvironment(env) +	if exists("s:isvisual") && s:isvisual == "yes" +		let s:isvisual = 'no' +		if a:env == '\[' +			return VEnclose('', '', '\[', '\]') +		elseif a:env == '$$' +			return VEnclose('', '', '$$', '$$') +		endif +		return VEnclose('\begin{'.a:env.'}', '\end{'.a:env.'}', '\begin{'.a:env.'}', '\end{'.a:env.'}') +	else +		" The user can define something like  +		" let g:Tex_Env_theorem = "\\begin{theorem}\<CR><++>\<CR>\\end{theorem}" +		" This will effectively over-write the default definition of the +		" theorem environment which uses a \label. +		if exists("b:Tex_Env_{'".a:env."'}") +			return IMAP_PutTextWithMovement(b:Tex_Env_{a:env}) +		elseif exists("g:Tex_Env_{'".a:env."'}") +			return IMAP_PutTextWithMovement(g:Tex_Env_{a:env}) +		elseif a:env =~ 'equation*\|eqnarray*\|theorem\|lemma\|equation\|eqnarray\|align\*\|align\>\|multline' +			let g:aa = a:env +			return Tex_eqnarray(a:env) +		elseif a:env =~ "enumerate\\|itemize\\|theindex\\|trivlist" +			return Tex_itemize(a:env) +		elseif a:env =~ "table\\|table*" +			return Tex_table(a:env) +		elseif a:env =~ "tabular\\|tabular*\\|array\\|array*" +			return Tex_tabular(a:env) +		elseif exists('*Tex_'.a:env) +			exe 'return Tex_'.a:env.'(a:env)' +		elseif a:env == '$$' +			return IMAP_PutTextWithMovement('$$<++>$$') +		elseif a:env == '\[' +			return IMAP_PutTextWithMovement("\\[\<CR><++>\<CR>\\]<++>") +		else +			" Look in supported packages if exists template for environment +			" given in the line +			if exists('g:Tex_package_supported') && g:Tex_package_supported != '' +				let i = 1 +				while Tex_Strntok(g:Tex_package_supported, ',', i) != '' +					let checkpack = Tex_Strntok(g:Tex_package_supported, ',', i) +					if g:TeX_package_{checkpack} =~ 'e..:'.a:env +						if a:env =~ '*' +							" Don't allow * to be treated as wildcard +							let aenv = substitute(a:env, '*', '\\*', '') +						else +							let aenv = a:env +						endif +						let envcommand = matchstr(g:TeX_package_{checkpack}, '\zse..:'.aenv.'[^,]\{-}\ze,') +						return Tex_ProcessPackageCommand(envcommand) +					endif +					let i = i + 1 +				endwhile +			endif +		endif +		" If nothing before us managed to create an environment, then just +		" create a bare-bones environment from the name. +		return IMAP_PutTextWithMovement('\begin{'.a:env."}\<cr><++>\<cr>\\end{".a:env."}<++>") +	endif +endfunction " }}} +" Mapping the <F5> key to insert/prompt for an environment/package {{{ +" and <S-F5> to prompt/replace an environment +" +" g:Tex_PromptedEnvironments is a variable containing a comma seperated list +" of environments. This list defines the prompt which latex-suite sets up when +" the user presses <F5> on an empty line. +" +" Leaving this empty is equivalent to disabling the feature. +if g:Tex_PromptedEnvironments != '' + +	let b:DoubleDollars = 0 + +	" Provide only <plug>s here. main.vim will create the actual maps. +	inoremap <silent> <Plug>Tex_FastEnvironmentInsert  <C-r>=Tex_FastEnvironmentInsert("no")<cr> +	nnoremap <silent> <Plug>Tex_FastEnvironmentInsert  i<C-r>=Tex_FastEnvironmentInsert("no")<cr> +	vnoremap <silent> <Plug>Tex_FastEnvironmentInsert  <C-\><C-N>:call Tex_FastEnvironmentInsert("yes")<CR> +	inoremap <silent> <Plug>Tex_FastEnvironmentChange  <C-O>:call Tex_ChangeEnvironments()<CR> +	nnoremap <silent> <Plug>Tex_FastEnvironmentChange  :call Tex_ChangeEnvironments()<CR> + +	" Tex_FastEnvironmentInsert: maps <F5> to prompt for env and insert it " {{{ +	" Description: +	"   This function calculates whether we are in the preamble. If we are +	"   then inserts a \usepackage line by either reading in a word from the +	"   current line or prompting to type in one. If not in the preamble, then +	"   inserts a environment template either by reading in a word from the +	"   current line or prompting the user to choose one. +	" +	function! Tex_FastEnvironmentInsert(isvisual) + +		let start_line = line('.') +		let pos = Tex_GetPos() +		let s:isvisual = a:isvisual + +		" decide if we are in the preamble of the document. If we are then +		" insert a package, otherwise insert an environment. +		" +		if search('\\documentclass', 'bW') && search('\\begin{document}') + +			" If there is a \documentclass line and a \begin{document} line in +			" the file, then a part of the file is the preamble. + +			" search for where the document begins. +			let begin_line = search('\\begin{document}') +			" if the document begins after where we are presently, then we are +			" in the preamble. +			if start_line < begin_line +				" return to our original location and insert a package +				" statement. +				call Tex_SetPos(pos) +				return Tex_package_from_line() +			else +				" we are after the preamble. insert an environment. +				call Tex_SetPos(pos) +				return Tex_DoEnvironment() +			endif + +		elseif search('\\documentclass') +			" if there is only a \documentclass but no \begin{document}, then +			" the entire file is a preamble. Put a package. + +			call Tex_SetPos(pos) +			return Tex_package_from_line() + +		else +			" no \documentclass, put an environment. + +			call Tex_SetPos(pos) +			return Tex_DoEnvironment() + +		endif + +	endfunction  + +	" }}} +	" Tex_package_from_line: puts a \usepackage line in the current line. " {{{ +	" Description: +	" +	function! Tex_package_from_line() +		" Function Tex_PutPackage is defined in packages.vim +		" Ignores <F5> in Visual mode  +		if s:isvisual == "yes" +			return 0 +		else	    +			let l = getline(".") +			let pack = matchstr(l, '^\s*\zs.*') +			normal!  0"_D +			return Tex_pack_one(pack) +		endif +	endfunction  +	 +	" }}} +	" Tex_ChangeEnvironments: calls Change() to change the environment {{{ +	" Description: +	"   Finds out which environment the cursor is positioned in and changes +	"   that to the chosen new environment. This function knows the changes +	"   which need to be made to change one env to another and calls +	"   Change() with the info. +	" +	function! Tex_ChangeEnvironments()  + +		let env_line = searchpair('$$\|\\[\|begin{', '', '$$\|\\]\|end{', "bn") + +		if env_line != 0 +			if getline(env_line) !~ 'begin{' +				let env_name = '[' +			else +				let env_name = matchstr(getline(env_line), 'begin{\zs.\{-}\ze}') +			endif +		endif +		 +		if !exists('env_name') +			echomsg "You are not inside environment" +			return 0 +		endif + +		exe 'echomsg "You are within a '.env_name.' environment."' +		let change_env = PromptForEnvironment('What do you want to change it to? ') + +		if change_env == 'eqnarray' +			call <SID>Change('eqnarray', 1, '', env_name =~ '\*$') +		elseif change_env == 'align' +			call <SID>Change('align', 1, '', env_name =~ '\*$') +		elseif change_env == 'eqnarray*' +			call <SID>Change('eqnarray*', 0, '\\nonumber', 0) +		elseif change_env == 'align*' +			call <SID>Change('align*', 0, '\\nonumber', 0) +		elseif change_env == 'equation*' +			call <SID>Change('equation*', 0, '&\|\\lefteqn{\|\\nonumber\|\\\\', 0) +		elseif change_env == '' +			return 0 +		else +			call <SID>Change(change_env, 0, '', '') +			return 0 +		endif + +	endfunction  +	 +	" }}} +	" Change: changes the current env to the new env {{{ +	" Description:  +	"   This function needs to know the changes which need to be made while +	"   going from an old environment to a new one. This info, it gets from +	"   Tex_ChangeEnvironments +	"  +	"   env : name of the new environment. +	"   label : if 1, then insert a \label at the end of the environment. +	"           otherwise, delete any \label line found. +	"   delete : a pattern which is to be deleted from the original environment. +	"            for example, going to a eqnarray* environment means we need to +	"            delete \label's. +	"   putInNonumber : whether we need to put a \nonumber before the end of the +	"                 environment. +	function! s:Change(env, label, delete, putInNonumber) + +		let start_line = line('.') +		let start_col = virtcol('.') + +		if a:env == '[' +			if b:DoubleDollars == 0 +				let first = '\\[' +				let second = '\\]' +			else +				let first = '$$' +				let second = '$$' +			endif +		else +			let first = '\\begin{' . a:env . '}' +			let second = '\\end{' . a:env . '}' +		endif + +		if b:DoubleDollars == 0 +			let bottom = searchpair('\\\[\|\\begin{','','\\\]\|\\end{','') +			s/\\\]\|\\end{.\{-}}/\=second/ +			let top = searchpair('\\\[\|\\begin{','','\\\]\|\\end{','b') +			s/\\\[\|\\begin{.\{-}}/\=first/ +		else +			let bottom = search('\$\$\|\\end{') +			s/\$\$\|\\end{.\{-}}/\=second/ +			let top = search('\$\$\|\\begin{','b') +			s/\$\$\|\\begin{.\{-}}/\=first/ +		end +		if a:delete != '' +			exe 'silent '. top . "," . bottom . 's/' . a:delete . '//e' +		endif + +		if a:putInNonumber == 1 +			exe top +			call search('\\end\|\\\\') +			if line('.') != bottom +				exe '.+1,' . bottom . 's/\\\\/\\nonumber\\\\/e' +				exe (bottom-1) . 's/\s*$/  \\nonumber/' +			endif +		endif + +		if a:label == 1 +			exe top +			if search("\\label", "W") > bottom +				exe top +				let local_label = input('Label? ') +				if local_label != '' +					put = '\label{'.local_label.'}' +				endif +				normal $ +			endif +		else +			exe 'silent '.top . ',' . bottom . ' g/\\label/delete' +		endif + +		if exists('local_label') && local_label != '' +			exe start_line + 1.' | normal! '.start_col.'|' +		else +			exe start_line.' | normal! '.start_col.'|' +		endif +	endfunction " }}} + +endif + +" }}} +" Map <S-F1> through <S-F4> to insert environments {{{ +if g:Tex_HotKeyMappings != '' + +	" SetUpHotKeys: maps <F1> through <F4> to insert environments +	" Description:  +	function! <SID>SetUpHotKeys() +		let i = 1 +		let envname = Tex_Strntok(g:Tex_HotKeyMappings, ',', i) +		while  envname != '' + +			exec 'inoremap <silent> <buffer> <S-F'.i.'> <C-r>=Tex_PutEnvironment("'.envname.'")<CR>' + +			let i = i + 1 +			let envname = Tex_Strntok(g:Tex_HotKeyMappings, ',', i) +			 +		endwhile + +	endfunction + +endif + +" }}} +" Tex_SetFastEnvironmentMaps: function for setting up the <F5> and <S-F1>-<S-F4> keys {{{ +" Description: This function is made public so it can be called by the +"              SetTeXOptions() function in main.vim +function! Tex_SetFastEnvironmentMaps() +	if g:Tex_PromptedEnvironments != '' +		call Tex_MakeMap("<F5>", "<Plug>Tex_FastEnvironmentInsert", 'i', '<silent> <buffer>') +		call Tex_MakeMap("<F5>", "<Plug>Tex_FastEnvironmentInsert", 'n', '<silent> <buffer>') +		call Tex_MakeMap("<F5>", "<Plug>Tex_FastEnvironmentInsert", 'v', '<silent> <buffer>') +		call Tex_MakeMap("<S-F5>", "<Plug>Tex_FastEnvironmentChange", 'i', '<silent> <buffer>') +		call Tex_MakeMap("<S-F5>", "<Plug>Tex_FastEnvironmentChange", 'n', '<silent> <buffer>') +	endif +	if g:Tex_HotKeyMappings != '' +		call s:SetUpHotKeys() +	endif +endfunction " }}} + +" ============================================================================== +" Contributions / Tex_InsertItem() from Johannes Tanzler +" ==============================================================================  +" Tex_GetCurrentEnv: gets the current environment in which the cursor lies {{{ +" Description: handles cases such as: +" 	 +" 	\begin{itemize} +" 		\item first item +" 		\item second item +" 			\begin{description} +" 			\item first desc +" 			\item second +" 			% Tex_GetCurrentEnv will return "description" when called from here +" 			\end{description} +" 		\item third item +" 		% Tex_GetCurrentEnv will return "itemize" when called from here +" 	\end{itemize} +" 	% Tex_GetCurrentEnv will return "" when called from here  +" +" Author: Alan Schmitt +function! Tex_GetCurrentEnv() +	let pos = Tex_GetPos() +	let i = 0 +	while 1 +		let env_line = search('^[^%]*\\\%(begin\|end\){', 'bW') +		if env_line == 0 +			" we reached the beginning of the file, so we return the empty string +			call Tex_SetPos(pos) +			return '' +		endif +		if match(getline(env_line), '^[^%]*\\begin{') == -1 +			" we found a \\end, so we keep searching +			let i = i + 1 +			continue +		else +			" we found a \\begin which has not been \\end'ed. we are done. +			if i == 0 +				let env = matchstr(getline(env_line), '\\begin{\zs.\{-}\ze}') +				call Tex_SetPos(pos) +				return env +			else +				" this \\begin closes a \\end, continue searching. +				let i = i - 1 +				continue +			endif +		endif +	endwhile +endfunction +" }}} +" Tex_InsertItem: insert \item into a list   {{{ +"    Description: Find last \begin line, extract env name, return to the start +"    			  position and insert proper \item, depending on env name. +"    			  Env names are stored in g: variables it can be used by +"    			  package files.  + +TexLet g:Tex_ItemStyle_itemize = '\item ' +TexLet g:Tex_ItemStyle_enumerate = '\item ' +TexLet g:Tex_ItemStyle_theindex = '\item ' +TexLet g:Tex_ItemStyle_thebibliography = '\bibitem[<+biblabel+>]{<+bibkey+>} <++>' +TexLet g:Tex_ItemStyle_description = '\item[<+label+>] <++>' + +function! Tex_InsertItem() +    " Get current enclosing environment +	let env = Tex_GetCurrentEnv() + +	if exists('g:Tex_ItemStyle_'.env) +		return IMAP_PutTextWithMovement(g:Tex_ItemStyle_{env}) +	else +		return '' +	endif +endfunction +" }}} +" Tex_SetItemMaps: sets the \item inserting maps for current buffer {{{ + +inoremap <script> <silent> <Plug>Tex_InsertItemOnThisLine <C-r>=Tex_InsertItem()<CR> +inoremap <script> <silent> <Plug>Tex_InsertItemOnNextLine <ESC>o<C-R>=Tex_InsertItem()<CR> + +function! Tex_SetItemMaps() +	if !hasmapto("<Plug>Tex_InsertItemOnThisLine", "i") +		imap <buffer> <M-i> <Plug>Tex_InsertItemOnThisLine +	endif +	if !hasmapto("<Plug>Tex_InsertItemOnNextLine", "i") +		imap <buffer> <C-CR> <Plug>Tex_InsertItemOnNextLine +	endif +endfunction " }}} + +" ============================================================================== +" Implementation of Fast Environment commands for LaTeX commands  +" ============================================================================== +" Define certain commonly used command definitions {{{ + +TexLet g:Tex_Com_{'newtheorem'} = '\newtheorem{<+name+>}{<+caption+>}[<+within+>]' +TexLet g:Tex_Com_{'frac'} = '\frac{<+n+>}{<+d+>}<++>' + +" }}} +" PromptForCommand: prompts for a command {{{ +" Description:  +function! PromptForCommand(ask) +	let common_com_prompt =  +				\ Tex_CreatePrompt(g:Tex_PromptedCommands, 2, ',') . "\n" . +				\ "Enter number or command name :" + +	let inp = input(a:ask."\n".common_com_prompt) +	if inp =~ '^[0-9]\+$' +		let com = Tex_Strntok(g:Tex_PromptedCommands, ',', inp) +	else +		let com = inp +	endif + +	return com +endfunction " }}} +" Tex_DoCommand: fast insertion of commands {{{ +" Description: +" +function! Tex_DoCommand(isvisual) +	" If the current line is empty or if a visual selection has been made, +	" prompt for a new environment. +	if getline('.') == '' || a:isvisual == 'yes' +		let com = PromptForCommand('Choose a command to insert: ') +		if com != '' +			return Tex_PutCommand(com, a:isvisual) +		else +			return '' +		endif +	else +		" We want to find out the word under the cursor without issuing +		" any movement commands. +		let presline = getline('.') +		let c = col('.') + +		let wordbef = matchstr(strpart(presline, 0, c-1), '\k\+\*\?$') +		let wordaft = matchstr(strpart(presline, c-1), '^\k\+\*\?') + +		let word = wordbef . wordaft +		call Tex_Debug("Tex_DoCommand: wordbef = [".wordbef."], wordaft = [".wordaft."], word = [".word."]", 'env') + +		" We use \<Del> instead of \<Bs> because \<Bs> does not work +		" unless bs=2 +		if word != '' +			return substitute(wordbef, '.', "\<Left>", 'g') +				\ . substitute(word, '.', "\<Del>", 'g') +				\ . Tex_PutCommand(word, a:isvisual) +		else +			let cmd = PromptForCommand('Choose a command to insert: ') +			if cmd != '' +				return Tex_PutCommand(cmd, a:isvisual) +			else +				return '' +			endif +		endif +	endif +endfunction " }}} +" Tex_PutCommand: calls various specialized functions {{{ +" Description:  +"   Based on input argument, it calls various specialized functions. +function! Tex_PutCommand(com, isvisual) +	if a:isvisual == "yes" +		if a:com == '$' +			return VEnclose('$', '$', '$', '$') +		elseif a:com == '\\(' +			return VEnclose('\\(', '\\)', '\\(', '\\)') +		else +			return VEnclose("\\".a:com.'{', '}', "\\".a:com.'{', '}') +		endif +	else +		if exists('b:Tex_Com_{"'.a:com.'"}') +			return IMAP_PutTextWithMovement(b:Tex_Com_{a:com}) +		elseif exists('g:Tex_Com_{"'.a:com.'"}') +			return IMAP_PutTextWithMovement(g:Tex_Com_{a:com}) +		elseif a:com == '$' +			return IMAP_PutTextWithMovement('$<++>$') +		else +			return IMAP_PutTextWithMovement("\\".a:com.'{<++>}<++>') +		endif +	endif +endfunction " }}} +" Mapping the <F7> key to prompt/insert for command {{{ +" and <S-F7> to prompt/replace command +" +" g:Tex_PromptedCommands is a variable containing a comma seperated list +" of commands.  +" +" Leaving this empty is equivalent to disabling the feature. +if g:Tex_PromptedCommands != '' + +	let b:DoubleDollars = 0 + +	inoremap <silent> <Plug>Tex_FastCommandInsert  <C-r>=Tex_DoCommand('no')<cr> +	nnoremap <silent> <Plug>Tex_FastCommandInsert  i<C-r>=Tex_DoCommand('no')<cr> +	vnoremap <silent> <Plug>Tex_FastCommandInsert  <C-\><C-N>:call Tex_DoCommand('yes')<CR> + +	inoremap <silent> <Plug>Tex_FastCommandChange  <C-O>:call Tex_ChangeCommand('no')<CR> +	nnoremap <silent> <Plug>Tex_FastCommandChange  :call Tex_ChangeCommand('no')<CR> + +	" Tex_ChangeCommand: calls ChangeCommand() to change the environment {{{ +	" Description: +	"   Finds out which environment the cursor is positioned in and changes +	"   that to the chosen new environment. This function knows the changes +	"   which need to be made to change one env to another and calls +	"   ChangeCommand() with the info. +	" +	function! Tex_ChangeCommand(isvisual)  + +		let pos_com = Tex_GetPos() + +		let com_line = searchpair('\\\k\{-}{', '', '}', 'b') + +		if com_line != 0 +			normal l +			let com_name = expand('<cword>') +		endif +		 +		if !exists('com_name') +			echomsg "You are not inside command" +			call Tex_SetPos(pos_com) +			return 0 +		endif + +		exe 'echomsg "You are within a '.com_name.' command."' +		let change_com = PromptForCommand('Do you want to change it to (number or name)? ') + +		if change_com == '' +			call Tex_SetPos(pos_com) +			return 0 +		else +			call <SID>ChangeCommand(change_com) +			call Tex_SetPos(pos_com) +			return 0 +		endif + +	endfunction  + +	" }}} +	" ChangeCommand: Changes current command according to prompt menu {{{ +	" Description: +	" +	function! s:ChangeCommand(newcom) + +		exe 'normal! ct{'.a:newcom."\<Esc>" +		 +	endfunction +	" }}} + +endif + +" }}} +" Tex_SetFastCommandMaps: function for setting up the <F7> keys {{{ +" Description: This function is made public so it can be called by the +"              SetTeXOptions() function in main.vim +function! Tex_SetFastCommandMaps() +	if g:Tex_PromptedCommands != '' +		if !hasmapto('<Plug>Tex_FastCommandInsert', 'i') +			imap <silent> <buffer> <F7> <Plug>Tex_FastCommandInsert +		endif +		if !hasmapto('<Plug>Tex_FastCommandInsert', 'n') +			nmap <silent> <buffer> <F7> <Plug>Tex_FastCommandInsert +		endif +		if !hasmapto('<Plug>Tex_FastCommandChange', 'i') +			imap <silent> <buffer> <S-F7> <Plug>Tex_FastCommandChange +		endif +		if !hasmapto('<Plug>Tex_FastCommandChange', 'n') +			nmap <silent> <buffer> <S-F7> <Plug>Tex_FastCommandChange +		endif +		if !hasmapto('<Plug>Tex_FastCommandInsert', 'v') +			vmap <silent> <buffer> <F7> <Plug>Tex_FastCommandInsert +		endif +	endif +endfunction " }}} + +" SetEnvMacrosOptions: sets mappings for buffers {{{ +" " Description:  +function! <SID>SetEnvMacrosOptions() +	if exists('b:doneTexEnvMaps') +		return +	endif +	let b:doneTexEnvMaps = 1 +	if g:Tex_PromptedEnvironments != '' || g:Tex_HotKeyMappings != '' +		call Tex_SetFastEnvironmentMaps() +	endif +	if g:Tex_PromptedCommands != '' +		call Tex_SetFastCommandMaps() +	endif +	call Tex_SetItemMaps() +endfunction " }}} +" Catch the Filetype event so we set maps for each buffer {{{ +augroup LatexSuite +	au LatexSuite User LatexSuiteFileType  +		\ call Tex_Debug('envmacros.vim: Catching LatexSuiteFileType event', 'env') | +		\ call s:SetEnvMacrosOptions() +augroup END +" }}} + +" this statement has to be at the end. +let s:doneOnce = 1 + +" vim:fdm=marker:nowrap:noet:ff=unix diff --git a/ftplugin/latex-suite/folding.vim b/ftplugin/latex-suite/folding.vim new file mode 100644 index 00000000..b65407c5 --- /dev/null +++ b/ftplugin/latex-suite/folding.vim @@ -0,0 +1,400 @@ +"============================================================================= +" 	     File: folding.vim +"      Author: Srinath Avadhanula +"      		   modifications/additions by Zhang Linbo +"     Created: Tue Apr 23 05:00 PM 2002 PST +"  +"  Description: functions to interact with Syntaxfolds.vim +"============================================================================= + +nnoremap <unique> <Plug>Tex_RefreshFolds :call MakeTexFolds(1)<cr> + +augroup LatexSuite +	au LatexSuite User LatexSuiteFileType  +		\ call Tex_Debug('folding.vim: catching LatexSuiteFileType', 'fold') |  +		\ call Tex_SetFoldOptions() +augroup END + +" Tex_SetFoldOptions: sets maps for every buffer {{{ +" Description:  +function! Tex_SetFoldOptions() +	if exists('b:doneSetFoldOptions') +		return +	endif +	let b:doneSetFoldOptions = 1 + +	setlocal foldtext=TexFoldTextFunction() + +	if g:Tex_Folding && g:Tex_AutoFolding +		call MakeTexFolds(0) +	endif + +	let s:ml = '<Leader>' + +	call Tex_MakeMap(s:ml."rf", "<Plug>Tex_RefreshFolds", 'n', '<silent> <buffer>') + +endfunction " }}} +" Tex_FoldSections: creates section folds {{{ +" Author: Zhang Linbo +" Description: +" 	This function takes a comma seperated list of "sections" and creates fold +" 	definitions for them. The first item is supposed to be the "shallowest" field +" 	and the last is the "deepest". See g:Tex_FoldedSections for the default +" 	definition of the lst input argument. +" +" 	**works recursively** +function! Tex_FoldSections(lst, endpat) +	let i = match(a:lst, ',') +	if i > 0 +		let s = strpart(a:lst, 0, i) +	else +		let s = a:lst +	endif +	if s =~ '%%fakesection' +		let s = '^\s*' . s +	else +		let pattern = '' +		let prefix = '' +		for label in split(s, "|") +			let pattern .= prefix . '^\s*\\' . label . '\W\|^\s*%%fake' . label +			let prefix = '\W\|' +		endfor +		let s = pattern +	endif +	let endpat = s . '\|' . a:endpat +	if i > 0 +		call Tex_FoldSections(strpart(a:lst,i+1), endpat) +	endif +	let endpat = '^\s*\\appendix\W\|' . endpat +	call AddSyntaxFoldItem(s, endpat, 0, -1) +endfunction +" }}} +" MakeTexFolds: function to create fold items for latex. {{{ +" +" used in conjunction with MakeSyntaxFolds(). +" see ../plugin/syntaxFolds.vim for documentation +function! MakeTexFolds(force) +	if exists('g:Tex_Folding') && !g:Tex_Folding +		return +	endif +	if &ft != 'tex' +		return +	end + +	" Setup folded items lists g:Tex_Foldedxxxx +	" 	1. Use default value if g:Tex_Foldedxxxxxx is not defined +	" 	2. prepend default value to g:Tex_Foldedxxxxxx if it starts with ',' +	" 	3. append default value to g:Tex_Foldedxxxxxx if it ends with ',' + +	" Folding items which are not caught in any of the standard commands, +	" environments or sections. +	let s = 'item,slide,preamble,<<<' +	if !exists('g:Tex_FoldedMisc') +		let g:Tex_FoldedMisc = s +	elseif g:Tex_FoldedMisc[0] == ',' +		let g:Tex_FoldedMisc = s . g:Tex_FoldedMisc +	elseif g:Tex_FoldedMisc =~ ',$' +		let g:Tex_FoldedMisc = g:Tex_FoldedMisc . s +	endif + +	" By default do not fold any commands. It looks like trying to fold +	" commands is a difficult problem since commands can be arbitrarily nested +	" and the end patterns are not unique unlike the case of environments. +	" For this to work well, we need a regexp which will match a line only if +	" a command begins on that line but does not end on that line. This +	" requires a regexp which will match unbalanced curly braces and that is +	" apparently not doable with regexps. +	let s = '' +    if !exists('g:Tex_FoldedCommands') +		let g:Tex_FoldedCommands = s +	elseif g:Tex_FoldedCommands[0] == ',' +		let g:Tex_FoldedCommands = s . g:Tex_FoldedCommands +	elseif g:Tex_FoldedCommands =~ ',$' +		let g:Tex_FoldedCommands = g:Tex_FoldedCommands . s +	endif + +	let s = 'verbatim,comment,eq,gather,align,figure,table,thebibliography,' +			\. 'keywords,abstract,titlepage' +    if !exists('g:Tex_FoldedEnvironments') +		let g:Tex_FoldedEnvironments = s +	elseif g:Tex_FoldedEnvironments[0] == ',' +		let g:Tex_FoldedEnvironments = s . g:Tex_FoldedEnvironments +	elseif g:Tex_FoldedEnvironments =~ ',$' +		let g:Tex_FoldedEnvironments = g:Tex_FoldedEnvironments . s +	endif +	 +    if !exists('g:Tex_FoldedSections') +		let g:Tex_FoldedSections = 'part,chapter,section,' +								\. 'subsection,subsubsection,paragraph' +	endif + +	" the order in which these calls are made decides the nestedness. in +	" latex, a table environment will always be embedded in either an item or +	" a section etc. not the other way around. so we first fold up all the +	" tables. and then proceed with the other regions. + +	let b:numFoldItems = 0 + +	" ======================================================================== +	" How to add new folding items {{{ +	" ======================================================================== +	" +	" Each of the following function calls defines a syntax fold region. Each +	" definition consists of a call to the AddSyntaxFoldItem() function. +	"  +	" The order in which the folds are defined is important. Juggling the +	" order of the function calls will create havoc with folding. The +	" "deepest" folding item needs to be called first. For example, if +	" the \begin{table} environment is a subset (or lies within) the \section +	" environment, then add the definition for the \table first. +	" +	" The AddSyntaxFoldItem() function takes either 4 or 6 arguments. When it +	" is called with 4 arguments, it is equivalent to calling it with 6 +	" arguments with the last two left blank (i.e as empty strings) +	" +	" The explanation for each argument is as follows: +	"    startpat: a line matching this pattern defines the beginning of a fold. +	"    endpat  : a line matching this pattern defines the end of a fold. +	"    startoff: this is the offset from the starting line at which folding will +	"              actually start +	"    endoff  : like startoff, but gives the offset of the actual fold end from +	"              the line satisfying endpat. +	"              startoff and endoff are necessary when the folding region does +	"              not have a specific end pattern corresponding to a start +	"              pattern. for example in latex, +	"              \begin{section} +	"              defines the beginning of a section, but its not necessary to +	"              have a corresponding +	"              \end{section} +	"              the section is assumed to end 1 line _before_ another section +	"              starts. +	"    startskip: a pattern which defines the beginning of a "skipped" region. +	" +	"               For example, suppose we define a \itemize fold as follows: +	"               startpat =  '^\s*\\item', +	"               endpat = '^\s*\\item\|^\s*\\end{\(enumerate\|itemize\|description\)}', +	"               startoff = 0, +	"               endoff = -1 +	" +	"               This defines a fold which starts with a line beginning with an +	"               \item and ending one line before a line beginning with an +	"               \item or \end{enumerate} etc. +	" +	"               Then, as long as \item's are not nested things are fine. +	"               However, once items begin to nest, the fold started by one +	"               \item can end because of an \item in an \itemize +	"               environment within this \item. i.e, the following can happen: +	" +	"               \begin{itemize} +	"               \item Some text <------- fold will start here +	"                     This item will contain a nested item +	"                     \begin{itemize} <----- fold will end here because next line contains \item... +	"                     \item Hello +	"                     \end{itemize} <----- ... instead of here. +	"               \item Next item of the parent itemize +	"               \end{itemize} +	" +	"               Therefore, in order to completely define a folding item which +	"               allows nesting, we need to also define a "skip" pattern. +	"               startskip and end skip do that. +	"               Leave '' when there is no nesting. +	"    endskip: the pattern which defines the end of the "skip" pattern for +	"             nested folds. +	" +	"    Example:  +	"    1. A syntax fold region for a latex section is +	"           startpat = "\\section{" +	"           endpat   = "\\section{" +	"           startoff = 0 +	"           endoff   = -1 +	"           startskip = '' +	"           endskip = '' +	"    Note that the start and end patterns are thus the same and endoff has a +	"    negative value to capture the effect of a section ending one line before +	"    the next starts. +	"    2. A syntax fold region for the \itemize environment is: +	"           startpat = '^\s*\\item', +	"           endpat = '^\s*\\item\|^\s*\\end{\(enumerate\|itemize\|description\)}', +	"           startoff = 0, +	"           endoff = -1, +	"           startskip = '^\s*\\begin{\(enumerate\|itemize\|description\)}', +	"           endskip = '^\s*\\end{\(enumerate\|itemize\|description\)}' +	"     Note the use of startskip and endskip to allow nesting. +	" +	" +	" }}} +	" ======================================================================== +	 +	" {{{ comment lines +	if g:Tex_FoldedMisc =~ '\<comments\>' +		call AddSyntaxFoldItem ( +			\ '^%\([^%]\|[^f]\|[^a]\|[^k]\|[^e]\)', +			\ '^[^%]', +			\ 0, +			\ -1  +			\ ) +	endif +	" }}} + +	" {{{ items +	if g:Tex_FoldedMisc =~ '\<item\>' +		call AddSyntaxFoldItem ( +			\ '^\s*\\item', +			\ '^\s*\\item\|^\s*\\end{\(enumerate\|itemize\|description\)}', +			\ 0, +			\ -1, +			\ '^\s*\\begin{\(enumerate\|itemize\|description\)}', +			\ '^\s*\\end{\(enumerate\|itemize\|description\)}' +			\ ) +	endif +	" }}} + +	" {{{ title +	if g:Tex_FoldedMisc =~ '\<title\>' +		call AddSyntaxFoldItem ( +			\ '^\s*\\title\W', +			\ '^\s*\\maketitle', +			\ 0, +			\ 0 +			\ ) +	endif +	" }}} +  +	" Commands and Environments {{{ +	" Fold the commands and environments in 2 passes. +	let pass = 0 +	while pass < 2 +		if pass == 0 +			let lst = g:Tex_FoldedCommands +		else +			let lst = g:Tex_FoldedEnvironments +		endif +		while lst != '' +			let i = match(lst, ',') +			if i > 0 +				let s = strpart(lst, 0, i) +				let lst = strpart(lst, i+1) +			else +				let s = lst +				let lst = '' +			endif +			if s != '' +				if pass == 0 +					" NOTE: This pattern ensures that a command which is +					" terminated on the same line will not start a fold. +					" However, it will also refuse to fold certain commands +					" which have not terminated. eg: +					" 	\commandname{something \bf{text} and  +					" will _not_ start a fold. +					" In other words, the pattern is safe, but not exact. +					call AddSyntaxFoldItem('^\s*\\'.s.'{[^{}]*$','^[^}]*}',0,0) +				else +					call AddSyntaxFoldItem('^\s*\\begin{'.s,'\(^\|\s\)\s*\\end{'.s,0,0) +				endif +			endif +		endwhile +		let pass = pass + 1 +	endwhile +	" }}} + +	" Sections {{{ +	if g:Tex_FoldedSections != ''  +		call Tex_FoldSections(g:Tex_FoldedSections, +			\ '^\s*\\frontmatter\|^\s*\\mainmatter\|^\s*\\backmatter\|' +			\. '^\s*\\begin{thebibliography\|>>>\|^\s*\\endinput\|' +			\. '^\s*\\begin{slide\|^\s*\\end{document') +	endif +	" }}}  +	 +	" {{{ slide +	if g:Tex_FoldedMisc =~ '\<slide\>' +		call AddSyntaxFoldItem ( +			\ '^\s*\\begin{slide', +			\ '^\s*\\appendix\W\|^\s*\\chapter\W\|^\s*\\end{slide\|^\s*\\end{document', +			\ 0, +			\ 0 +			\ ) +	endif +	" }}} + +	" {{{ preamble +	if g:Tex_FoldedMisc =~ '\<preamble\>' +		call AddSyntaxFoldItem ( +			\ '^\s*\\document\(class\|style\).*{', +			\ '^\s*\\begin{document}', +			\ 0, +			\ -1  +			\ ) +	endif +	" }}} + +	" Manually folded regions {{{ +	if g:Tex_FoldedMisc =~ '\(^\|,\)<<<\(,\|$\)' +		call AddSyntaxFoldItem ( +			\ '<<<', +			\ '>>>', +			\ 0, +			\ 0 +			\ ) +	endif +	" }}} +	 +	call MakeSyntaxFolds(a:force) +	normal! zv +endfunction + +" }}} +" TexFoldTextFunction: create fold text for folds {{{ +function! TexFoldTextFunction() +	let leadingSpace = matchstr('                                       ', ' \{,'.indent(v:foldstart).'}') +	if getline(v:foldstart) =~ '^\s*\\begin{' +		let header = matchstr(getline(v:foldstart), +							\ '^\s*\\begin{\zs\([:alpha:]*\)[^}]*\ze}') +		let caption = '' +		let label = '' +		let i = v:foldstart +		while i <= v:foldend +			if getline(i) =~ '\\caption' +				" distinguish between +				" \caption{fulldesc} - fulldesc will be displayed +				" \caption[shortdesc]{fulldesc} - shortdesc will be displayed +				if getline(i) =~ '\\caption\[' +					let caption = matchstr(getline(i), '\\caption\[\zs[^\]]*') +					let caption = substitute(caption, '\zs\]{.*}[^}]*$', '', '') +				else +					let caption = matchstr(getline(i), '\\caption{\zs.*') +					let caption = substitute(caption, '\zs}[^}]*$', '', '') +				end +			elseif getline(i) =~ '\\label' +				let label = matchstr(getline(i), '\\label{\zs.*') +				" :FIXME: this does not work when \label contains a +				" newline or a }-character +				let label = substitute(label, '\([^}]*\)}.*$', '\1', '') +			end + +			let i = i + 1 +		endwhile + +		let ftxto = foldtext() +		" if no caption found, then use the second line. +		if caption == '' +			let caption = getline(v:foldstart + 1) +		end + +		let retText = matchstr(ftxto, '^[^:]*').': '.header. +						\ ' ('.label.'): '.caption +		return leadingSpace.retText + +	elseif getline(v:foldstart) =~ '^%' && getline(v:foldstart) !~ '^%%fake' +		let ftxto = foldtext() +		return leadingSpace.substitute(ftxto, ':', ': % ', '') +	elseif getline(v:foldstart) =~ '^\s*\\document\(class\|style\).*{' +		let ftxto = leadingSpace.foldtext() +		return substitute(ftxto, ':', ': Preamble: ', '') +	else +		return leadingSpace.foldtext() +	end +endfunction +" }}} + +" vim:fdm=marker:ff=unix:noet:ts=4:sw=4 diff --git a/ftplugin/latex-suite/main.vim b/ftplugin/latex-suite/main.vim new file mode 100644 index 00000000..ad27b917 --- /dev/null +++ b/ftplugin/latex-suite/main.vim @@ -0,0 +1,1042 @@ +" LaTeX filetype +"	  Language: LaTeX (ft=tex) +"	Maintainer: Srinath Avadhanula +"		   URL:  + +" line continuation used here. +let s:save_cpo = &cpo +set cpo&vim + +" avoiding re-inclusion {{{ +" the avoiding re-inclusion statement is not provided here because the files +" which call this file should in the normal course of events handle the +" re-inclusion stuff. + +" we definitely dont want to run through the entire file each and every time. +" only once to define the functions. for successive latex files, just set up +" the folding and mappings and quit. +if exists('s:doneFunctionDefinitions') && !exists('b:forceRedoLocalTex') +	call s:SetTeXOptions() +	finish +endif + +let s:doneFunctionDefinitions = 1 + +" get the place where this plugin resides for setting cpt and dict options. +" these lines need to be outside the function. +let s:path = expand('<sfile>:p:h') +" set up personal defaults. +runtime ftplugin/tex/texrc +" set up global defaults. +exe "so ".fnameescape(s:path.'/texrc') + +" }}} + +nmap <silent> <script> <plug> i +imap <silent> <script> <C-o><plug> <Nop> + +" ============================================================================== +" mappings +" ============================================================================== +" {{{ +" calculate the mapleader character. +let s:ml = '<Leader>' + +if !exists('s:doneMappings') +	let s:doneMappings = 1 +	" short forms for latex formatting and math elements. {{{ +	" taken from auctex.vim or miktexmacros.vim +	call IMAP ('__', '_{<++>}<++>', "tex") +	call IMAP ('()', '(<++>)<++>', "tex") +	call IMAP ('[]', '[<++>]<++>', "tex") +	call IMAP ('{}', '{<++>}<++>', "tex") +	call IMAP ('^^', '^{<++>}<++>', "tex") +	call IMAP ('$$', '$<++>$<++>', "tex") +	call IMAP ('==', '&=& ', "tex") +	call IMAP ('~~', '&\approx& ', "tex") +	call IMAP ('=~', '\approx', "tex") +	call IMAP ('::', '\dots', "tex") +	call IMAP ('((', '\left( <++> \right)<++>', "tex") +	call IMAP ('[[', '\left[ <++> \right]<++>', "tex") +	call IMAP ('{{', '\left\{ <++> \right\}<++>', "tex") +	call IMAP (g:Tex_Leader.'^', '\hat{<++>}<++>', "tex") +	call IMAP (g:Tex_Leader.'_', '\bar{<++>}<++>', "tex") +	call IMAP (g:Tex_Leader.'6', '\partial', "tex") +	call IMAP (g:Tex_Leader.'8', '\infty', "tex") +	call IMAP (g:Tex_Leader.'/', '\frac{<++>}{<++>}<++>', "tex") +	call IMAP (g:Tex_Leader.'%', '\frac{<++>}{<++>}<++>', "tex") +	call IMAP (g:Tex_Leader.'@', '\circ', "tex") +	call IMAP (g:Tex_Leader.'0', '^\circ', "tex") +	call IMAP (g:Tex_Leader.'=', '\equiv', "tex") +	call IMAP (g:Tex_Leader."\\",'\setminus', "tex") +	call IMAP (g:Tex_Leader.'.', '\cdot', "tex") +	call IMAP (g:Tex_Leader.'*', '\times', "tex") +	call IMAP (g:Tex_Leader.'&', '\wedge', "tex") +	call IMAP (g:Tex_Leader.'-', '\bigcap', "tex") +	call IMAP (g:Tex_Leader.'+', '\bigcup', "tex") +	call IMAP (g:Tex_Leader.'M', '\sum_{<++>}^{<++>}<++>', 'tex') +	call IMAP (g:Tex_Leader.'S', '\sum_{<++>}^{<++>}<++>', 'tex') +	call IMAP (g:Tex_Leader.'(', '\subset', "tex") +	call IMAP (g:Tex_Leader.')', '\supset', "tex") +	call IMAP (g:Tex_Leader.'<', '\le', "tex") +	call IMAP (g:Tex_Leader.'>', '\ge', "tex") +	call IMAP (g:Tex_Leader.',', '\nonumber', "tex") +	call IMAP (g:Tex_Leader.'~', '\tilde{<++>}<++>', "tex") +	call IMAP (g:Tex_Leader.';', '\dot{<++>}<++>', "tex") +	call IMAP (g:Tex_Leader.':', '\ddot{<++>}<++>', "tex") +	call IMAP (g:Tex_Leader.'2', '\sqrt{<++>}<++>', "tex") +	call IMAP (g:Tex_Leader.'|', '\Big|', "tex") +	call IMAP (g:Tex_Leader.'I', "\\int_{<++>}^{<++>}<++>", 'tex') +	" }}} +	" Greek Letters {{{ +	call IMAP(g:Tex_Leader.'a', '\alpha', 'tex') +	call IMAP(g:Tex_Leader.'b', '\beta', 'tex') +	call IMAP(g:Tex_Leader.'c', '\chi', 'tex') +	call IMAP(g:Tex_Leader.'d', '\delta', 'tex') +	call IMAP(g:Tex_Leader.'e', '\varepsilon', 'tex') +	call IMAP(g:Tex_Leader.'f', '\varphi', 'tex') +	call IMAP(g:Tex_Leader.'g', '\gamma', 'tex') +	call IMAP(g:Tex_Leader.'h', '\eta', 'tex') +	call IMAP(g:Tex_Leader.'i', '\iota', 'tex') +	call IMAP(g:Tex_Leader.'k', '\kappa', 'tex') +	call IMAP(g:Tex_Leader.'l', '\lambda', 'tex') +	call IMAP(g:Tex_Leader.'m', '\mu', 'tex') +	call IMAP(g:Tex_Leader.'n', '\nu', 'tex') +	call IMAP(g:Tex_Leader.'p', '\pi', 'tex') +	call IMAP(g:Tex_Leader.'q', '\theta', 'tex') +	call IMAP(g:Tex_Leader.'r', '\rho', 'tex') +	call IMAP(g:Tex_Leader.'s', '\sigma', 'tex') +	call IMAP(g:Tex_Leader.'t', '\tau', 'tex') +	call IMAP(g:Tex_Leader.'u', '\upsilon', 'tex') +	call IMAP(g:Tex_Leader.'v', '\varsigma', 'tex') +	call IMAP(g:Tex_Leader.'w', '\omega', 'tex') +	call IMAP(g:Tex_Leader.'w', '\wedge', 'tex')  " AUCTEX style +	call IMAP(g:Tex_Leader.'x', '\xi', 'tex') +	call IMAP(g:Tex_Leader.'y', '\psi', 'tex') +	call IMAP(g:Tex_Leader.'z', '\zeta', 'tex') +	" not all capital greek letters exist in LaTeX! +	" reference: http://www.giss.nasa.gov/latex/ltx-405.html +	call IMAP(g:Tex_Leader.'D', '\Delta', 'tex') +	call IMAP(g:Tex_Leader.'F', '\Phi', 'tex') +	call IMAP(g:Tex_Leader.'G', '\Gamma', 'tex') +	call IMAP(g:Tex_Leader.'Q', '\Theta', 'tex') +	call IMAP(g:Tex_Leader.'L', '\Lambda', 'tex') +	call IMAP(g:Tex_Leader.'X', '\Xi', 'tex') +	call IMAP(g:Tex_Leader.'Y', '\Psi', 'tex') +	call IMAP(g:Tex_Leader.'S', '\Sigma', 'tex') +	call IMAP(g:Tex_Leader.'U', '\Upsilon', 'tex') +	call IMAP(g:Tex_Leader.'W', '\Omega', 'tex') +	" }}} +	" ProtectLetters: sets up indentity maps for things like ``a {{{ +	" " Description: If we simply do +	" 		call IMAP('`a', '\alpha', 'tex') +	" then we will never be able to type 'a' after a tex-quotation. Since +	" IMAP() always uses the longest map ending in the letter, this problem +	" can be avoided by creating a fake map for ``a -> ``a. +	" This function sets up fake maps of the following forms: +	" 	``[aA]  -> ``[aA]    (for writing in quotations) +	" 	\`[aA]  -> \`[aA]    (for writing diacritics) +	" 	"`[aA]  -> "`[aA]    (for writing german quotations) +	" It does this for all printable lower ascii characters just to make sure +	" we dont let anything slip by. +	function! s:ProtectLetters(first, last) +		let i = a:first +		while i <= a:last +			if nr2char(i) =~ '[[:print:]]' +				call IMAP('``'.nr2char(i), '``'.nr2char(i), 'tex') +				call IMAP('\`'.nr2char(i), '\`'.nr2char(i), 'tex') +				call IMAP('"`'.nr2char(i), '"`'.nr2char(i), 'tex') +			endif +			let i = i + 1 +		endwhile +	endfunction  +	call s:ProtectLetters(32, 127) +	" }}} +	" vmaps: enclose selected region in brackets, environments {{{  +	" The action changes depending on whether the selection is character-wise +	" or line wise. for example, selecting linewise and pressing \v will +	" result in the region being enclosed in \begin{verbatim}, \end{verbatim}, +	" whereas in characterise visual mode, the thingie is enclosed in \verb| +	" and |. +	exec 'vnoremap <silent> '.g:Tex_Leader."( \<C-\\>\<C-N>:call VEnclose('\\left( ', ' \\right)', '\\left(', '\\right)')\<CR>" +	exec 'vnoremap <silent> '.g:Tex_Leader."[ \<C-\\>\<C-N>:call VEnclose('\\left[ ', ' \\right]', '\\left[', '\\right]')\<CR>" +	exec 'vnoremap <silent> '.g:Tex_Leader."{ \<C-\\>\<C-N>:call VEnclose('\\left\\{ ', ' \\right\\}', '\\left\\{', '\\right\\}')\<CR>" +	exec 'vnoremap <silent> '.g:Tex_Leader."$ \<C-\\>\<C-N>:call VEnclose('$', '$', '\\[', '\\]')\<CR>" +	" }}} +end + +" }}} + +" ============================================================================== +" Helper functions for debugging +" ==============================================================================  +" Tex_Debug: appends the argument into s:debugString {{{ +" Description:  +"  +" Do not want a memory leak! Set this to zero so that latex-suite always +" starts out in a non-debugging mode. +if !exists('g:Tex_Debug') +	let g:Tex_Debug = 0 +endif +function! Tex_Debug(str, ...) +	if !g:Tex_Debug +		return +	endif +	if a:0 > 0 +		let pattern = a:1 +	else +		let pattern = '' +	endif +	if !exists('s:debugString_'.pattern) +		let s:debugString_{pattern} = '' +	endif +	let s:debugString_{pattern} = s:debugString_{pattern}.a:str."\n" + +	let s:debugString_ = (exists('s:debugString_') ? s:debugString_ : '') +		\ . pattern.' : '.a:str."\n" + +	if Tex_GetVarValue('Tex_DebugLog') != '' +		exec 'redir! >> '.Tex_GetVarValue('Tex_DebugLog') +		silent! echo pattern.' : '.a:str +		redir END +	endif +endfunction " }}} +" Tex_PrintDebug: prings s:debugString {{{ +" Description:  +"  +function! Tex_PrintDebug(...) +	if a:0 > 0 +		let pattern = a:1 +	else +		let pattern = '' +	endif +	if exists('s:debugString_'.pattern) +		echo s:debugString_{pattern} +	endif +endfunction " }}} +" Tex_ClearDebug: clears the s:debugString string {{{ +" Description:  +"  +function! Tex_ClearDebug(...) +	if a:0 > 0 +		let pattern = a:1 +	else +		let pattern = '' +	endif +	if exists('s:debugString_'.pattern) +		let s:debugString_{pattern} = '' +	endif +endfunction " }}} +" Tex_ShowVariableValue: debugging help {{{ +" provides a way to examine script local variables from outside the script. +" very handy for debugging. +function! Tex_ShowVariableValue(...) +	let i = 1 +	while i <= a:0 +		exe 'let arg = a:'.i +		if exists('s:'.arg) || +		\  exists('*s:'.arg) +			exe 'let val = s:'.arg +			echomsg 's:'.arg.' = '.val +		end +		let i = i + 1 +	endwhile +endfunction + +" }}} + +" ============================================================================== +" Helper functions for grepping +" ==============================================================================  +" Tex_Grep: shorthand for :grep or :vimgrep {{{ +function! Tex_Grep(string, where) +	if v:version >= 700 +		exec 'silent! vimgrep! /'.a:string.'/ '.a:where +	else +		exec 'silent! grep! '.Tex_EscapeForGrep(a:string).' '.a:where +	endif +endfunction + +" }}} +" Tex_Grepadd: shorthand for :grepadd or :vimgrepadd {{{ +function! Tex_Grepadd(string, where) +	if v:version >= 700 +		exec 'silent! vimgrepadd! /'.a:string.'/ '.a:where +	else +		exec "silent! grepadd! ".Tex_EscapeForGrep(a:string).' '.a:where +	endif +endfunction + +" }}} +" Tex_EscapeForGrep: escapes back-slashes and doublequotes the correct number of times {{{ +" Description: This command escapes the backslash and double quotes in a +" 	search pattern the correct number of times so it can be used in the ``:grep`` +" 	command. This command is meant to be used as:: +" +" 		exec "silent! grep ".Tex_EscapeForGrep(pattern)." file" +" +" 	The input argument to this function should be the string which you want +" 	the external command to finally see. For example, to search for a string +" 	``'\bibitem'``, the grep command needs to be passed a string like +" 	``'\\bibitem'``.  Examples:: +" +" 		Tex_EscapeForGrep('\\bibitem')        	" correct +" 		Tex_EscapeForGrep('\bibitem')			" wrong +" 		Tex_EscapeForGrep("\\bibitem")			" wrong +" 		Tex_EscapeForGrep('\<word\>')			" correct +" +function! Tex_EscapeForGrep(string) +	let retVal = a:string + +	" The shell halves the backslashes. +	if &shell =~ 'sh' +		let retVal = escape(retVal, "\\") + +		" If shellxquote is set, then the backslashes are halved yet again. +		if &shellxquote == '"' +			let retVal = escape(retVal, "\"\\") +		endif + +	endif +	" escape special characters which bash/cmd.exe might interpret +	let retVal = escape(retVal, "<>") + +	return retVal +endfunction " }}} + +" ============================================================================== +" Uncategorized helper functions +" ==============================================================================  +" Tex_Strntok: extract the n^th token from a list {{{ +" example: Strntok('1,23,3', ',', 2) = 23 +fun! Tex_Strntok(s, tok, n) +	return matchstr( a:s.a:tok[0], '\v(\zs([^'.a:tok.']*)\ze['.a:tok.']){'.a:n.'}') +endfun + +" }}} +" Tex_CreatePrompt: creates a prompt string {{{ +" Description:  +" Arguments: +"     promptList: This is a string of the form: +"         'item1,item2,item3,item4' +"     cols: the number of columns in the resultant prompt +"     sep: the list seperator token +" +" Example: +" Tex_CreatePrompt('item1,item2,item3,item4', 2, ',') +" returns +" "(1) item1\t(2)item2\n(3)item3\t(4)item4" +" +" This string can be used in the input() function. +function! Tex_CreatePrompt(promptList, cols, sep) + +	let g:listSep = a:sep +	let num_common = GetListCount(a:promptList) + +	let i = 1 +	let promptStr = "" + +	while i <= num_common + +		let j = 0 +		while j < a:cols && i + j <= num_common +			let com = Tex_Strntok(a:promptList, a:sep, i+j) +			let promptStr = promptStr.'('.(i+j).') '.  +						\ com."\t".( strlen(com) < 4 ? "\t" : '' ) + +			let j = j + 1 +		endwhile + +		let promptStr = promptStr."\n" + +		let i = i + a:cols +	endwhile +	return promptStr +endfunction  + +" }}} +" Tex_CleanSearchHistory: removes last search item from search history {{{ +" Description: This function needs to be globally visible because its +"              called from outside the script during expansion. +function! Tex_CleanSearchHistory() +  call histdel("/", -1) +  let @/ = histget("/", -1) +endfunction +nmap <silent> <script> <plug>cleanHistory :call Tex_CleanSearchHistory()<CR> + +" }}} +" Tex_GetVarValue: gets the value of the variable {{{ +" Description:  +" 	See if a window-local, buffer-local or global variable with the given name +" 	exists and if so, returns the corresponding value. If none exist, return +" 	an empty string. +function! Tex_GetVarValue(varname, ...) +	if exists('w:'.a:varname) +		return w:{a:varname} +	elseif exists('b:'.a:varname) +		return b:{a:varname} +	elseif exists('g:'.a:varname) +		return g:{a:varname} +	elseif a:0 > 0 +		return a:1 +	else +		return '' +	endif +endfunction " }}} +" Tex_GetMainFileName: gets the name of the main file being compiled. {{{ +" Description:  returns the full path name of the main file. +"               This function checks for the existence of a .latexmain file +"               which might point to the location of a "main" latex file. +"               If .latexmain exists, then return the full path name of the +"               file being pointed to by it. +" +"               Otherwise, return the full path name of the current buffer. +" +"               You can supply an optional "modifier" argument to the +"               function, which will optionally modify the file name before +"               returning. +"               NOTE: From version 1.6 onwards, this function always trims +"               away the .latexmain part of the file name before applying the +"               modifier argument. +function! Tex_GetMainFileName(...) +	if a:0 > 0 +		let modifier = a:1 +	else +		let modifier = ':p' +	endif + +	" If the user wants to use his own way to specify the main file name, then +	" use it straight away. +	if Tex_GetVarValue('Tex_MainFileExpression') != '' +		exec 'let retval = '.Tex_GetVarValue('Tex_MainFileExpression') +		return retval +	endif + +	let s:origdir = fnameescape(getcwd()) + +	let dirmodifier = '%:p:h' +	let dirLast = fnameescape(expand(dirmodifier)) +	exe 'cd '.dirLast + +	" move up the directory tree until we find a .latexmain file. +	" TODO: Should we be doing this recursion by default, or should there be a +	"       setting? +	while glob('*.latexmain') == '' +		let dirmodifier = dirmodifier.':h' +		let dirNew = fnameescape(expand(dirmodifier)) +		" break from the loop if we cannot go up any further. +		if dirNew == dirLast +			break +		endif +		let dirLast = dirNew +		exe 'cd '.dirLast +	endwhile + +	let lheadfile = glob('*.latexmain') +	if lheadfile != '' +		" Remove the trailing .latexmain part of the filename... We never want +		" that. +		let lheadfile = fnamemodify(substitute(lheadfile, '\.latexmain$', '', ''), modifier) +	else +		" If we cannot find any main file, just modify the filename of the +		" current buffer. +		let lheadfile = expand('%'.modifier) +	endif + +	exe 'cd '.s:origdir + +	" NOTE: The caller of this function needs to escape the file name with +	"       fnameescape() . The reason its not done here is that escaping is not +	"       safe if this file is to be used as part of an external command on +	"       certain platforms. +	return lheadfile +endfunction  + +" }}} +" Tex_ChooseFromPrompt: process a user input to a prompt string {{{ +" " Description:  +function! Tex_ChooseFromPrompt(dialog, list, sep) +	let g:Tex_ASDF = a:dialog +	let inp = input(a:dialog) +	if inp =~ '\d\+' +		return Tex_Strntok(a:list, a:sep, inp) +	else +		return inp +	endif +endfunction " }}} +" Tex_ChooseFile: produces a file list and prompts for choice {{{ +" Description:  +function! Tex_ChooseFile(dialog) +	let files = glob('*') +	if files == '' +		return '' +	endif +	let s:incnum = 0 +	echo a:dialog +	let filenames = substitute(files, "\\v(^|\n)", "\\=submatch(0).Tex_IncrementNumber(1).' : '", 'g') +	echo filenames +	let choice = input('Enter Choice : ') +	let g:choice = choice +	if choice == '' +		return '' +	endif +	if choice =~ '^\s*\d\+\s*$' +		let retval = Tex_Strntok(files, "\n", choice) +	else +		let filescomma = substitute(files, "\n", ",", "g") +		let retval = GetListMatchItem(filescomma, choice) +	endif +	if retval == '' +		return '' +	endif +	return retval +endfunction  + +" }}} +" Tex_IncrementNumber: returns an incremented number each time {{{ +" Description:  +let s:incnum = 0 +function! Tex_IncrementNumber(increm) +	let s:incnum = s:incnum + a:increm +	return s:incnum +endfunction  + +" }}} +" Tex_ResetIncrementNumber: increments s:incnum to zero {{{ +" Description:  +function! Tex_ResetIncrementNumber(val) +	let s:incnum = a:val +endfunction " }}} +" Tex_FindInRtp: check if file exists in &rtp {{{ +" Description:	Checks if file exists in globpath(&rtp, ...) and cuts off the +" 				rest of returned names. This guarantees that sourced file is +" 				from $HOME. +"               If an optional argument is given, it specifies how to expand +"               each filename found. For example, '%:p' will return a list of +"               the complete paths to the files. By default returns trailing +"               path-names without extenions. +"               NOTE: This function is very slow when a large number of +"                     matches are found because of a while loop which modifies +"                     each filename found. Some speedup was acheived by using +"                     a tokenizer approach rather than using Tex_Strntok which +"                     would have been more obvious. +function! Tex_FindInRtp(filename, directory, ...) +	" how to expand each filename. ':p:t:r' modifies each filename to its +	" trailing part without extension. +	let expand = (a:0 > 0 ? a:1 : ':p:t:r') +	" The pattern used... An empty filename should be regarded as '*' +	let pattern = (a:filename != '' ? a:filename : '*') + +	let filelist = globpath(&rtp, 'ftplugin/latex-suite/'.a:directory.'/'.pattern)."\n" + +	if filelist == "\n" +		return '' +	endif + +	if a:filename != '' +		return fnamemodify(Tex_Strntok(filelist, "\n", 1), expand) +	endif + +	" Now cycle through the files modifying each filename in the desired +	" manner. +	let retfilelist = '' +	let i = 1 +	while 1 +		" Extract the portion till the next newline. Then shorten the filelist +		" by removing till the newline. +		let nextnewline = stridx(filelist, "\n") +		if nextnewline == -1 +			break +		endif +		let filename = strpart(filelist, 0, nextnewline) +		let filelist = strpart(filelist, nextnewline+1) + +		" The actual modification. +		if fnamemodify(filename, expand) != '' +			let retfilelist = retfilelist.fnamemodify(filename, expand)."," +		endif +		let i = i + 1 +	endwhile + +	return substitute(retfilelist, ',$', '', '') +endfunction + +" }}} +" Tex_GetErrorList: returns vim's clist {{{ +" Description: returns the contents of the error list available via the :clist +"              command. +function! Tex_GetErrorList() +	let _a = @a +	redir @a | silent! clist | redir END +	let errlist = @a +	let @a = _a + +	if errlist =~ 'E42: ' +		let errlist = '' +	endif + +	return errlist +endfunction " }}} +" Tex_GetTempName: get the name of a temporary file in specified directory {{{ +" Description: Unlike vim's native tempname(), this function returns the name +"              of a temporary file in the directory specified. This enables +"              us to create temporary files in a specified directory. +function! Tex_GetTempName(dirname) +	let prefix = 'latexSuiteTemp' +	let slash = (a:dirname =~ '\\\|/$' ? '' : '/') +	let i = 0 +	while filereadable(a:dirname.slash.prefix.i.'.tex') && i < 1000 +		let i = i + 1 +	endwhile +	if filereadable(a:dirname.slash.prefix.i.'.tex') +		echoerr "Temporary file could not be created in ".a:dirname +		return '' +	endif +	return expand(a:dirname.slash.prefix.i.'.tex', ':p') +endfunction +" }}} +" Tex_MakeMap: creates a mapping from lhs to rhs if rhs is not already mapped {{{ +" Description:   +function! Tex_MakeMap(lhs, rhs, mode, extraargs) +	if !hasmapto(a:rhs, a:mode) +		exec a:mode.'map '.a:extraargs.' '.a:lhs.' '.a:rhs +	endif +endfunction " }}} +" Tex_CD: cds to given directory escaping spaces if necessary {{{ +" " Description:  +function! Tex_CD(dirname) +	exec 'cd '.Tex_EscapeSpaces(a:dirname) +endfunction " }}} +" Tex_EscapeSpaces: escapes unescaped spaces from a path name {{{ +" Description: +function! Tex_EscapeSpaces(path) +	return substitute(a:path, '[^\\]\(\\\\\)*\zs ', '\\ ', 'g') +endfunction " }}} +" Tex_FindFile: finds a file in the vim's 'path' {{{ +" Description: finds a file in vim's 'path' +function! Tex_FindFile(fname, path, suffixesadd) +	if exists('*findfile') +		let _suffixesadd = &suffixesadd +		let &suffixesadd = a:suffixesadd +		let retval = findfile(a:fname, a:path) +		let &suffixesadd = _suffixesadd +	else +		" split a new window so we do not screw with the current buffer. We +		" want to use the same filename each time so that multiple scratch +		" buffers are not created. +		let retval = '' +		silent! split __HOPEFULLY_THIS_FILE_DOES_NOT_EXIST__ +		let _suffixesadd = &suffixesadd +		let _path = &path +		let &suffixesadd = a:suffixesadd +		let &path = a:path +		exec 'silent! find '.a:fname +		if bufname('%') != '__HOPEFULLY_THIS_FILE_DOES_NOT_EXIST__' +			let retval = expand('%:p') +		end +		silent! bdelete! +		let &suffixesadd = _suffixesadd +		let &path = _path +	endif +	return retval +endfunction " }}} +" Tex_GetPos: gets position of cursor {{{ +function! Tex_GetPos() +	if exists('*getpos') +		return getpos('.') +	else +		return line('.').' | normal! '.virtcol('.').'|' +	endif +endfunction " }}} +" Tex_SetPos: sets position of cursor {{{ +function! Tex_SetPos(pos) +	if exists('*setpos') +		call setpos('.', a:pos) +	else +		exec a:pos +	endif +endfunction " }}} + + +" ============================================================================== +" Smart key-mappings +" ==============================================================================  +" TexQuotes: inserts `` or '' instead of " {{{ +if g:Tex_SmartKeyQuote + +	" TexQuotes: inserts `` or '' instead of " +	" Taken from texmacro.vim by Benji Fisher <benji@e-math.AMS.org> +	" TODO:  Deal with nested quotes. +	" The :imap that calls this function should insert a ", move the cursor to +	" the left of that character, then call this with <C-R>= . +	function! s:TexQuotes() +		let l = line(".") +		let c = col(".") +		let restore_cursor = l . "G" . virtcol(".") . "|" +		normal! H +		let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor +		execute restore_cursor +		" In math mode, or when preceded by a \, just move the cursor past the +		" already-inserted " character. +		if synIDattr(synID(l, c, 1), "name") =~ "^texMath" +			\ || (c > 1 && getline(l)[c-2] == '\') +			return "\<Right>" +		endif +		" Find the appropriate open-quote and close-quote strings. +		if exists("b:Tex_SmartQuoteOpen") +			let open = b:Tex_SmartQuoteOpen +		elseif exists("g:Tex_SmartQuoteOpen") +			let open = g:Tex_SmartQuoteOpen +		else +			let open = "``" +		endif +		if exists("b:Tex_SmartQuoteClose") +			let close = b:Tex_SmartQuoteClose +		elseif exists("g:Tex_SmartQuoteClose") +			let close = g:Tex_SmartQuoteClose +		else +			let close = "''" +		endif +		let boundary = '\|' +		" This code seems to be obsolete, since this script variable is never +		" set. The idea is that some languages use ",," as an open- or +		" close-quote string, and we want to avoid confusing ordinary "," +		" with a quote boundary. +		if exists("s:TeX_strictquote") +			if( s:TeX_strictquote == "open" || s:TeX_strictquote == "both" ) +				let boundary = '\<' . boundary +			endif +			if( s:TeX_strictquote == "close" || s:TeX_strictquote == "both" ) +				let boundary = boundary . '\>' +			endif +		endif + +		" Eventually return q; set it to the default value now. +		let q = open +		let pattern =  +			\ escape(open, '\~') . +			\ boundary . +			\ escape(close, '\~') . +			\ '\|^$\|"' + +		while 1	" Look for preceding quote (open or close), ignoring +			" math mode and '\"' . +			call search(pattern, "bw") +			if synIDattr(synID(line("."), col("."), 1), "name") !~ "^texMath" +				\ && strpart(getline('.'), col('.')-2, 2) != '\"' +				break +			endif +		endwhile +		 +		" Now, test whether we actually found a _preceding_ quote; if so, is it +		" an open quote? +		if ( line(".") < l || line(".") == l && col(".") < c ) +			if strpart(getline("."), col(".")-1) =~ '\V\^' . escape(open, '\') +				if line(".") == l && col(".") + strlen(open) == c +					" Insert "<++>''<++>" instead of just "''". +					let q = IMAP_PutTextWithMovement("<++>".close."<++>") +				else +					let q = close +				endif +			endif +		endif + +		" Return to line l, column c: +		execute restore_cursor +		" Start with <Del> to remove the " put in by the :imap . +		return "\<Del>" . q + +	endfunction + +endif +" }}} +" SmartBS: smart backspacing {{{ +if g:Tex_SmartKeyBS  + +	" SmartBS: smart backspacing +	" SmartBS lets you treat diacritic characters (those \'{a} thingies) as a +	" single character. This is useful for example in the following situation: +	" +	" \v{s}\v{t}astn\'{y}    ('happy' in Slovak language :-) ) +	" If you will delete this normally (without using smartBS() function), you +	" must press <BS> about 19x. With function smartBS() you must press <BS> only +	" 7x. Strings like "\v{s}", "\'{y}" are considered like one character and are +	" deleted with one <BS>. +	let s:smartBS_pat = Tex_GetVarValue('Tex_SmartBSPattern') + +	fun! s:SmartBS_pat() +		return s:smartBS_pat +	endfun + +	" This function comes from Benji Fisher <benji@e-math.AMS.org> +	" http://vim.sourceforge.net/scripts/download.php?src_id=409  +	" (modified/patched by Lubomir Host 'rajo' <host8 AT keplerDOTfmphDOTuniba.sk>) +	function! s:SmartBS(pat) +		let init = strpart(getline("."), 0, col(".")-1) +		let matchtxt = matchstr(init, a:pat) +		if matchtxt != '' +			let bstxt = substitute(matchtxt, '.', "\<bs>", 'g') +			return bstxt +		else +			return "\<bs>" +		endif +	endfun +	 +endif " }}} +" SmartDots: inserts \cdots instead of ... in math mode otherwise \ldots {{{ +" if amsmath package is detected then just use \dots and let amsmath take care +" of it. +if g:Tex_SmartKeyDot + +	function! <SID>SmartDots() +		if strpart(getline('.'), col('.')-3, 2) == '..' &&  +			\ g:Tex_package_detected =~ '\<amsmath\|ellipsis\>' +			return "\<bs>\<bs>\\dots" +		elseif synIDattr(synID(line('.'),col('.')-1,0),"name") =~ '^texMath' +			\&& strpart(getline('.'), col('.')-3, 2) == '..'  +			return "\<bs>\<bs>\\cdots" +		elseif strpart(getline('.'), col('.')-3, 2) == '..'  +			return "\<bs>\<bs>\\ldots" +		else +			return '.' +		endif +	endfunction  + +endif +" }}} + +" source texproject.vim before other files +exe 'source '.fnameescape(s:path.'/texproject.vim') + +" source all the relevant files. +exe 'source '.fnameescape(s:path.'/texmenuconf.vim') +exe 'source '.fnameescape(s:path.'/envmacros.vim') +exe 'source '.fnameescape(s:path.'/elementmacros.vim') + +" source utf-8 or plain math menus +if exists("g:Tex_UseUtfMenus") && g:Tex_UseUtfMenus != 0 && has("gui_running") +	exe 'source '.fnameescape(s:path.'/mathmacros-utf.vim') +else +	exe 'source '.fnameescape(s:path.'/mathmacros.vim') +endif + +exe 'source '.fnameescape(s:path.'/multicompile.vim') +exe 'source '.fnameescape(s:path.'/compiler.vim') +exe 'source '.fnameescape(s:path.'/folding.vim') +exe 'source '.fnameescape(s:path.'/templates.vim') +exe 'source '.fnameescape(s:path.'/custommacros.vim') +exe 'source '.fnameescape(s:path.'/bibtex.vim') + +" source advanced math functions +if g:Tex_AdvancedMath == 1 +	exe 'source '.fnameescape(s:path.'/brackets.vim') +	exe 'source '.fnameescape(s:path.'/smartspace.vim') +endif + +if g:Tex_Diacritics != 0 +	exe 'source '.fnameescape(s:path.'/diacritics.vim') +endif + +exe 'source '.fnameescape(s:path.'/texviewer.vim') +exe 'source '.fnameescape(s:path.'/version.vim') + +" ============================================================================== +" Finally set up the folding, options, mappings and quit. +" ==============================================================================  +" SetTeXOptions: sets options/mappings for this file. {{{ +function! <SID>SetTeXOptions() +	" Avoid reinclusion. +	if exists('b:doneSetTeXOptions') +		return +	endif +	let b:doneSetTeXOptions = 1 + +	exe 'setlocal dict^='.fnameescape(s:path.'/dictionaries/dictionary') + +	call Tex_Debug('SetTeXOptions: sourcing maps', 'main') +	" smart functions +	if g:Tex_SmartKeyQuote  +		inoremap <buffer> <silent> " "<Left><C-R>=<SID>TexQuotes()<CR> +	endif +	if g:Tex_SmartKeyBS +		inoremap <buffer> <silent> <BS> <C-R>=<SID>SmartBS(<SID>SmartBS_pat())<CR> +	endif +	if g:Tex_SmartKeyDot +		inoremap <buffer> <silent> . <C-R>=<SID>SmartDots()<CR> +	endif + +	" This line seems to be necessary to source our compiler/tex.vim file. +	" The docs are unclear why this needs to be done even though this file is +	" the first compiler plugin in 'runtimepath'. +	runtime compiler/tex.vim + +endfunction + +augroup LatexSuite +	au LatexSuite User LatexSuiteFileType  +		\ call Tex_Debug('main.vim: Catching LatexSuiteFileType event', 'main') |  +		\ call <SID>SetTeXOptions() +augroup END + +" }}} + +" ============================================================================== +" Settings for taglist.vim plugin +" ==============================================================================  +" Sets Tlist_Ctags_Cmd for taglist.vim and regexps for ctags {{{ +if exists("g:Tex_TaglistSupport") && g:Tex_TaglistSupport == 1  +	if !exists("g:tlist_tex_settings")  +		let g:tlist_tex_settings = 'tex;s:section;c:chapter;l:label;r:ref' +	endif + +	if exists("Tlist_Ctags_Cmd") +		let s:tex_ctags = Tlist_Ctags_Cmd +	else +		let s:tex_ctags = 'ctags' " Configurable in texrc? +	endif + +	if exists("g:Tex_InternalTagsDefinitions") && g:Tex_InternalTagsDefinitions == 1 +		let Tlist_Ctags_Cmd = s:tex_ctags ." --langdef=tex --langmap=tex:.tex.ltx.latex" +		\.' --regex-tex="/\\\\begin{abstract}/Abstract/s,abstract/"' +		\.' --regex-tex="/\\\\part[ \t]*\*?\{[ \t]*([^}]*)\}/\1/s,part/"' +		\.' --regex-tex="/\\\\chapter[ \t]*\*?\{[ \t]*([^}]*)\}/\1/s,chapter/"' +		\.' --regex-tex="/\\\\section[ \t]*\*?\{[ \t]*([^}]*)\}/\1/s,section/"' +		\.' --regex-tex="/\\\\subsection[ \t]*\*?\{[ \t]*([^}]*)\}/+ \1/s,subsection/"' +		\.' --regex-tex="/\\\\subsubsection[ \t]*\*?\{[ \t]*([^}]*)\}/+  \1/s,subsubsection/"' +		\.' --regex-tex="/\\\\paragraph[ \t]*\*?\{[ \t]*([^}]*)\}/+   \1/s,paragraph/"' +		\.' --regex-tex="/\\\\subparagraph[ \t]*\*?\{[ \t]*([^}]*)\}/+    \1/s,subparagraph/"' +		\.' --regex-tex="/\\\\begin{thebibliography}/BIBLIOGRAPHY/s,thebibliography/"' +		\.' --regex-tex="/\\\\tableofcontents/TABLE OF CONTENTS/s,tableofcontents/"' +		\.' --regex-tex="/\\\\frontmatter/FRONTMATTER/s,frontmatter/"' +		\.' --regex-tex="/\\\\mainmatter/MAINMATTER/s,mainmatter/"' +		\.' --regex-tex="/\\\\backmatter/BACKMATTER/s,backmatter/"' +		\.' --regex-tex="/\\\\appendix/APPENDIX/s,appendix/"' +		\.' --regex-tex="/\\\\label[ \t]*\*?\{[ \t]*([^}]*)\}/\1/l,label/"' +		\.' --regex-tex="/\\\\ref[ \t]*\*?\{[ \t]*([^}]*)\}/\1/r,ref/"' +	endif +endif + +" }}} +  +" commands to completion +let g:Tex_completion_explorer = ',' + +" Mappings defined in package files will overwrite all other +exe 'source '.fnameescape(s:path.'/packages.vim') + +" ============================================================================== +" These functions are used to immitate certain operating system type functions +" (like reading the contents of a file), which are not available in vim. For +" example, in Vim, its not possible to read the contents of a file without +" opening a buffer on it, which means that over time, lots of buffers can open +" up needlessly. +" +" If python is available (and allowed), then these functions utilize python +" library functions without making calls to external programs. +" ==============================================================================  +" Tex_GotoTempFile: open a temp file. reuse from next time on {{{ +function! Tex_GotoTempFile() +	if !exists('s:tempFileName') +		let s:tempFileName = tempname() +	endif +	exec 'silent! split '.s:tempFileName +endfunction " }}} +" Tex_IsPresentInFile: finds if a string str, is present in filename {{{ +if has('python') && g:Tex_UsePython +	function! Tex_IsPresentInFile(regexp, filename) +		exec 'python isPresentInFile(r"'.a:regexp.'", r"'.a:filename.'")' + +		return retval +	endfunction +else +	function! Tex_IsPresentInFile(regexp, filename) +		call Tex_GotoTempFile() + +		silent! 1,$ d _ +		let _report = &report +		let _sc = &sc +		set report=9999999 nosc +		exec 'silent! 0r! '.g:Tex_CatCmd.' '.a:filename +		set nomod +		let &report = _report +		let &sc = _sc + +		if search(a:regexp, 'w') +			let retval = 1 +		else +			let retval = 0 +		endif +		silent! bd +		return retval +	endfunction +endif " }}} +" Tex_CatFile: returns the contents of a file in a <NL> seperated string {{{ +if has('*readfile') +	function! Tex_CatFile(filename) +		return join(readfile(filename), "\n") +	endfunction +elseif has('python') && g:Tex_UsePython +	function! Tex_CatFile(filename) +		" catFile assigns a value to retval +		exec 'python catFile("'.a:filename.'")' + +		return retval +	endfunction +else +	function! Tex_CatFile(filename) +		if glob(a:filename) == '' +			return '' +		endif + +		call Tex_GotoTempFile() + +		silent! 1,$ d _ + +		let _report = &report +		let _sc = &sc +		set report=9999999 nosc +		exec 'silent! 0r! '.g:Tex_CatCmd.' '.a:filename + +		set nomod +		let _a = @a +		silent! normal! ggVG"ay +		let retval = @a +		let @a = _a + +		silent! bd +		let &report = _report +		let &sc = _sc +		return retval +	endfunction +endif +" }}} +" Tex_DeleteFile: removes a file if present {{{ +" Description:  +if has('python') && g:Tex_UsePython +	function! Tex_DeleteFile(filename) +		exec 'python deleteFile(r"'.a:filename.'")' +		 +		if exists('retval') +			return retval +		endif +	endfunction  +else +	function! Tex_DeleteFile(filename) +		if filereadable(a:filename) +			exec '! '.g:Tex_RmCmd.' '.a:filename +		endif +	endfunction +endif +" }}} + + +let &cpo = s:save_cpo + +" Define the functions in python if available. +if !has('python') || !g:Tex_UsePython +	finish +endif + +exec 'pyfile '.fnameescape(expand('<sfile>:p:h')).'/pytools.py' + +" vim:fdm=marker:ff=unix:noet:ts=4:sw=4:nowrap diff --git a/ftplugin/latex-suite/mathmacros-utf.vim b/ftplugin/latex-suite/mathmacros-utf.vim new file mode 100644 index 00000000..ac9cf7e5 --- /dev/null +++ b/ftplugin/latex-suite/mathmacros-utf.vim @@ -0,0 +1,729 @@ +"============================================================================= +" 	     File: mathmacros.vim +"      Author: Mikolaj Machowski +"     Created: Tue Apr 23 06:00 PM 2002 PST +"  +"  Description: macros for everything mathematical in latex. +"============================================================================= + +if !(has('gui_running') && g:Tex_MathMenus && g:Tex_Menus) +	finish +endif + +let s:MathMenuName = g:Tex_MenuPrefix.'Ma&th.' + +function! Tex_MathMenuRemove() +	exe 'silent! aunmenu '.s:MathMenuName +endfunction + +let s:pA = 'amenu <silent> 85 '.s:MathMenuName + +" brackets and dollars {{{ +exe s:pA.'\\&[\ \\]                 <plug><C-r>=IMAP_PutTextWithMovement("\\[<++>\\]<++>")<cr>' +exe s:pA.'\\&(\ \\)                 <plug><C-r>=IMAP_PutTextWithMovement("\\(<++>\\)<++>")<cr>' +exe s:pA.'&$\ $                     <plug>$$' +exe s:pA.'-sepmath1- :' +" }}} +" MATH arrows {{{ +let s:pA1 = s:pA."&Arrows." +exe s:pA1.'Leftarrow<Tab>⇠          <plug>\Leftarrow ' +exe s:pA1.'leftarrow<Tab>↠          <plug>\leftarrow' +exe s:pA1.'longleftarrow<Tab>↠      <plug>\longleftarrow ' +exe s:pA1.'Longleftarrow<Tab>⇠      <plug>\Longleftarrow ' +exe s:pA1.'rightarrow<Tab>→          <plug>\rightarrow ' +exe s:pA1.'longrightarrow<Tab>→      <plug>\longrightarrow ' +exe s:pA1.'Rightarrow<Tab>⇒          <plug>\Rightarrow ' +exe s:pA1.'Longrightarrow<Tab>⇒      <plug>\Longrightarrow ' +exe s:pA1.'leftrightarrow<Tab>⇆      <plug>\leftrightarrow ' +exe s:pA1.'longleftrightarrow<Tab>↔  <plug>\longleftrightarrow ' +exe s:pA1.'Leftrightarrow<Tab>⇔      <plug>\Leftrightarrow ' +exe s:pA1.'Longleftrightarrow<Tab>⇔  <plug>\Longleftrightarrow ' +exe s:pA1.'uparrow<Tab>↑             <plug>\uparrow ' +exe s:pA1.'Uparrow<Tab>⇑             <plug>\Uparrow ' +exe s:pA1.'downarrow<Tab>↓           <plug>\downarrow ' +exe s:pA1.'Downarrow<Tab>⇓           <plug>\Downarrow ' +exe s:pA1.'updownarrow<Tab>↕         <plug>\updownarrow ' +exe s:pA1.'Updownarrow<Tab>⇕         <plug>\Updownarrow ' +exe s:pA1.'nearrow<Tab>↗             <plug>\nearrow ' +exe s:pA1.'searrow<Tab>↘             <plug>\searrow ' +exe s:pA1.'swarrow<Tab>↙             <plug>\swarrow ' +exe s:pA1.'nwarrow<Tab>↖             <plug>\nwarrow ' +exe s:pA1.'mapsto<Tab>↦              <plug>\mapsto ' +exe s:pA1.'leadsto<Tab>↠            <plug>\leadsto ' +exe s:pA1.'longmapsto<Tab>⇖          <plug>\longmapsto ' +exe s:pA1.'hookleftarrow<Tab>↩       <plug>\hookleftarrow ' +exe s:pA1.'hookrightarrow<Tab>↪      <plug>\hookrightarrow ' +exe s:pA1.'leftharpoonup<Tab>↼       <plug>\leftharpoonup ' +exe s:pA1.'leftharpoondown<Tab>↽     <plug>\leftharpoondown ' +exe s:pA1.'rightharpoonup<Tab>⇀      <plug>\rightharpoonup ' +exe s:pA1.'rightharpoondown<Tab>⇠   <plug>\rightharpoondown ' +exe s:pA1.'rightleftharpoons<Tab>⇌   <plug>\rightleftharpoons ' +exe s:pA1.'overleftarrow<Tab>        <plug>\overleftarrow ' +exe s:pA1.'overrightarrow<Tab>       <plug>\overrightarrow ' +exe s:pA1.'overleftrightarrow<Tab>   <plug>\overleftrightarrow ' +exe s:pA1.'underleftarrow<Tab>       <plug>\underleftarrow ' +exe s:pA1.'underrightarrow<Tab>      <plug>\underrightarrow ' +exe s:pA1.'underleftrightarrow<Tab>  <plug>\underleftrightarrow ' +exe s:pA1.'xleftarrow<Tab>           <plug>\xleftarrow ' +exe s:pA1.'xrightarrow<Tab>          <plug>\xrightarrow ' +" }}} +" MATH Arrows2 {{{ +let s:pA1a = s:pA."Arrows2." +exe s:pA1a.'dashleftarrow<Tab>⇠       <plug>\dashleftarrow ' +exe s:pA1a.'leftleftarrows<Tab>⇇      <plug>\leftleftarrows ' +exe s:pA1a.'leftrightarrows<Tab>⇆     <plug>\leftrightarrows ' +exe s:pA1a.'Lleftarrow<Tab>⇚          <plug>\Lleftarrow ' +exe s:pA1a.'twoheadleftarrow<Tab>↞    <plug>\twoheadleftarrow ' +exe s:pA1a.'leftarrowtail<Tab>↢       <plug>\leftarrowtail ' +exe s:pA1a.'leftrightharpoons<Tab>⇋   <plug>\leftrightharpoons ' +exe s:pA1a.'Lsh<Tab>↰                 <plug>\Lsh ' +exe s:pA1a.'looparrowleft<Tab>↫       <plug>\looparrowleft ' +exe s:pA1a.'curvearrowleft<Tab>↶      <plug>\curvearrowleft ' +exe s:pA1a.'circlearrowleft<Tab>↺     <plug>\circlearrowleft ' +exe s:pA1a.'dashrightarrow<Tab>⇢      <plug>\dashrightarrow ' +exe s:pA1a.'rightrightarrows<Tab>⇉    <plug>\rightrightarrows ' +exe s:pA1a.'rightleftarrows<Tab>⇄     <plug>\rightleftarrows ' +exe s:pA1a.'Rrightarrow<Tab>⇛         <plug>\Rrightarrow ' +exe s:pA1a.'twoheadrightarrow<Tab>↠   <plug>\twoheadrightarrow ' +exe s:pA1a.'rightarrowtail<Tab>↣      <plug>\rightarrowtail ' +exe s:pA1a.'rightleftharpoons<Tab>⇌   <plug>\rightleftharpoons ' +exe s:pA1a.'Rsh<Tab>↱                 <plug>\Rsh ' +exe s:pA1a.'looparrowright<Tab>↬      <plug>\looparrowright ' +exe s:pA1a.'curvearrowright<Tab>↷     <plug>\curvearrowright ' +exe s:pA1a.'circlearrowright<Tab>↻    <plug>\circlearrowright ' +exe s:pA1a.'multimap<Tab>⊸            <plug>\multimap ' +exe s:pA1a.'upuparrows<Tab>⇈          <plug>\upuparrows ' +exe s:pA1a.'downdownarrows<Tab>⇊      <plug>\downdownarrows ' +exe s:pA1a.'upharpoonleft<Tab>↿       <plug>\upharpoonleft ' +exe s:pA1a.'upharpoonright<Tab>↾      <plug>\upharpoonright ' +exe s:pA1a.'downharpoonleft<Tab>⇃     <plug>\downharpoonleft ' +exe s:pA1a.'downharpoonright<Tab>⇂    <plug>\downharpoonright ' +exe s:pA1a.'rightsquigarrow<Tab>⇠    <plug>\rightsquigarrow ' +exe s:pA1a.'leftrightsquigarrow<Tab>↠<plug>\leftrightsquigarrow ' +" }}} +" MATH nArrows {{{ +let s:pA1b = s:pA."&nArrows." +exe s:pA1b.'nleftarrow<Tab>↚          <plug>\nleftarrow ' +exe s:pA1b.'nLeftarrow<Tab>⇠         <plug>\nLeftarrow ' +exe s:pA1b.'nleftrightarrow<Tab>↮     <plug>\nleftrightarrow ' +exe s:pA1b.'nLeftrightarrow<Tab>⇎     <plug>\nleftrightarrow ' +exe s:pA1b.'nrightarrow<Tab>↛         <plug>\nrightarrow ' +exe s:pA1b.'nRightarrow<Tab>⇠        <plug>\nRightarrow ' +" }}} +" MATH Fonts {{{ +let s:pA2a = s:pA."&MathFonts." +exe s:pA2a.'mathbf{}                <plug><C-r>=IMAP_PutTextWithMovement("\\mathbf{<++>}<++>")<cr>' +exe s:pA2a.'mathrm{}                <plug><C-r>=IMAP_PutTextWithMovement("\\mathrm{<++>}<++>")<cr>' +exe s:pA2a.'mathsf{}                <plug><C-r>=IMAP_PutTextWithMovement("\\mathsf{<++>}<++>")<cr>' +exe s:pA2a.'mathtt{}                <plug><C-r>=IMAP_PutTextWithMovement("\\mathtt{<++>}<++>")<cr>' +exe s:pA2a.'mathit{}                <plug><C-r>=IMAP_PutTextWithMovement("\\mathit{<++>}<++>")<cr>' +exe s:pA2a.'mathfrak{}              <plug><C-r>=IMAP_PutTextWithMovement("\\mathfrak{<++>}<++>")<cr>' +exe s:pA2a.'mathcal{}               <plug><C-r>=IMAP_PutTextWithMovement("\\mathcal{<++>}<++>")<cr>' +exe s:pA2a.'mathscr{}               <plug><C-r>=IMAP_PutTextWithMovement("\\mathscr{<++>}<++>")<cr>' +exe s:pA2a.'mathbb{}                <plug><C-r>=IMAP_PutTextWithMovement("\\mathbb{<++>}<++>")<cr>' +" }}} +" Greek Letters small {{{ +let s:pA2 = s:pA."&Greek.&Small." +exe s:pA2.'alpha<Tab>`a\ \ α       <plug>\alpha ' +exe s:pA2.'beta<Tab>`b\ \ β        <plug>\beta ' +exe s:pA2.'gamma<Tab>`g\ \ γ       <plug>\gamma ' +exe s:pA2.'delta<Tab>`d\ \ δ       <plug>\delta ' +exe s:pA2.'epsilon<Tab>∊           <plug>\epsilon ' +exe s:pA2.'varepsilon<Tab>`e\ \ ε  <plug>\varepsilon ' +exe s:pA2.'zeta<Tab>`z\ \ ζ        <plug>\zeta ' +exe s:pA2.'eta<Tab>`h\ \ η         <plug>\eta ' +exe s:pA2.'theta<Tab>`q\ \ θ       <plug>\theta ' +exe s:pA2.'vartheta<Tab>Ï‘          <plug>\vartheta ' +exe s:pA2.'iota<Tab>`i\ \ ι        <plug>\iota ' +exe s:pA2.'kappa<Tab>`k\ \ κ       <plug>\kappa ' +exe s:pA2.'lambda<Tab>`l\ \ λ      <plug>\lambda ' +exe s:pA2.'mu<Tab>`m\ \ μ          <plug>\mu ' +exe s:pA2.'nu<Tab>`n\ \ ν          <plug>\nu ' +exe s:pA2.'xi<Tab>`x\ \ ξ          <plug>\xi ' +exe s:pA2.'pi<Tab>`p\ \ Ï€          <plug>\pi ' +exe s:pA2.'varpi<Tab>Ï–             <plug>\varpi ' +exe s:pA2.'rho<Tab>`r\ \ Ï         <plug>\rho ' +exe s:pA2.'varrho<Tab>ϱ            <plug>\varrho ' +exe s:pA2.'sigma<Tab>`s\ \ σ       <plug>\sigma ' +exe s:pA2.'varsigma<Tab>`v\ \ Ï‚    <plug>\varsigma ' +exe s:pA2.'tau<Tab>`t\ \ Ï„         <plug>\tau ' +exe s:pA2.'upsilon<Tab>`u\ \ Ï…     <plug>\upsilon ' +exe s:pA2.'phi<Tab>φ               <plug>\phi ' +exe s:pA2.'varphi<Tab>`f\ \ Ï•      <plug>\varphi ' +exe s:pA2.'chi<Tab>`c\ \ χ         <plug>\chi ' +exe s:pA2.'psi<Tab>`y\ \ ψ         <plug>\psi ' +exe s:pA2.'omega<Tab>`w\ \ ω       <plug>\omega ' +" }}} +" Greek Letters big {{{ +let s:pA3 = s:pA.'&Greek.&Big.'  +exe s:pA3.'Alpha<Tab>`A\ \ A        <plug>\Alpha ' +exe s:pA3.'Beta<Tab>`B\ \ B         <plug>\Beta ' +exe s:pA3.'Gamma<Tab>`G\ \ Γ        <plug>\Gamma ' +exe s:pA3.'Delta<Tab>`D\ \ Δ        <plug>\Delta ' +exe s:pA3.'Epsilon<Tab>`E\ \ E      <plug>\Epsilon ' +exe s:pA3.'Zeta<Tab>`Z\ \ Z         <plug>\mathrm{Z} ' +exe s:pA3.'Eta<Tab>`H\ \ H          <plug>\Eta ' +exe s:pA3.'Theta<Tab>Θ              <plug>\Theta ' +exe s:pA3.'Iota<Tab>I               <plug>\mathrm{I} ' +exe s:pA3.'Kappa<Tab>`K\ \ K        <plug>\Kappa ' +exe s:pA3.'Lambda<Tab>`L\ \ Λ       <plug>\Lambda ' +exe s:pA3.'Mu<Tab>`M\ \ M           <plug>\Mu ' +exe s:pA3.'Nu<Tab>`N\ \ N           <plug>\Nu ' +exe s:pA3.'Xi<Tab>`X\ \ Ξ           <plug>\Xi ' +exe s:pA3.'Pi<Tab>`P\ \ Π           <plug>\Pi ' +exe s:pA3.'Rho<Tab>`R\ \ P          <plug>\Rho ' +exe s:pA3.'Sigma<Tab>`S\ \ Σ        <plug>\Sigma ' +exe s:pA3.'Tau<Tab>`T\ \ T          <plug>\Tau ' +exe s:pA3.'Upsilon<Tab>`U\ \ Y      <plug>\Upsilon ' +exe s:pA3.'Phi<Tab>Φ                <plug>\Phi ' +exe s:pA3.'Chi<Tab>`C\ \ X          <plug>\Chi ' +exe s:pA3.'Psi<Tab>`Y\ \ Ψ          <plug>\Psi ' +exe s:pA3.'Omega<Tab>`W\ \ Ω        <plug>\Omega ' +" }}} +" BinaryRel1 {{{ +let s:pA4 = s:pA."&BinaryRel1."   +exe s:pA4.'ll<Tab>≪                    <plug>\ll ' +exe s:pA4.'lll<Tab>⋘                   <plug>\lll ' +exe s:pA4.'leqslant<Tab>≤              <plug>\leqslant ' +exe s:pA4.'leq<Tab>≤                   <plug>\leq ' +exe s:pA4.'leqq<Tab>≦                  <plug>\leqq ' +exe s:pA4.'eqslantless<Tab>⋜            <plug>\eqslantless ' +exe s:pA4.'lessdot<Tab>â‹–               <plug>\lessdot ' +exe s:pA4.'prec<Tab>≺                  <plug>\prec ' +exe s:pA4.'preceq<Tab>≼                <plug>\preceq ' +exe s:pA4.'preccurlyeq<Tab>≼           <plug>\preccurlyeq ' +exe s:pA4.'curlyeqprec<Tab>⋞           <plug>\curlyeqprec ' +exe s:pA4.'lesssim<Tab>≲                 <plug>\lesssim ' +exe s:pA4.'lessapprox<Tab>             <plug>\lessapprox ' +exe s:pA4.'precsim<Tab>≾               <plug>\precsim ' +exe s:pA4.'precapprox<Tab>             <plug>\precapprox ' +exe s:pA4.'in<Tab>∈                    <plug>\in ' +exe s:pA4.'subset<Tab>`(\ \ ⊂          <plug>\subset ' +exe s:pA4.'Subset<Tab>`)\ \ â‹          <plug>\Subset ' +exe s:pA4.'subseteq<Tab>⊆              <plug>\subseteq ' +exe s:pA4.'subseteqq<Tab>              <plug>\subseteqq ' +exe s:pA4.'sqsubset<Tab>⊠             <plug>\sqsubset ' +exe s:pA4.'sqsubseteq<Tab>⊑            <plug>\sqsubseteq ' +exe s:pA4.'smile<Tab>⌣                 <plug>\smile ' +exe s:pA4.'smallsmile<Tab>⌣             <plug>\smallsmile ' +exe s:pA4.'parallel<Tab>∥              <plug>\parallel ' +exe s:pA4.'shortparallel<Tab>∥         <plug>\shortparallel ' +exe s:pA4.'dashv<Tab>⊣                 <plug>\dashv ' +exe s:pA4.'vdash<Tab>⊢                 <plug>\vdash ' +exe s:pA4.'vDash<Tab>⊨                 <plug>\vDash ' +exe s:pA4.'models<Tab>⊨                <plug>\models ' +exe s:pA4.'therefore<Tab>∴             <plug>\therefore ' +exe s:pA4.'backepsilon<Tab>∠          <plug>\backepsilon ' +" }}} +" nBinaryRel1 {{{  +let s:pA4a = s:pA."&nBinaryRel1."   +exe s:pA4a.'nless<Tab>≮                  <plug>\nless ' +exe s:pA4a.'nleqslant<Tab>≰              <plug>\nleqslant ' +exe s:pA4a.'nleq<Tab>                   <plug>\nleq ' +exe s:pA4a.'lneq<Tab>                   <plug>\lneq ' +exe s:pA4a.'nleqq<Tab>                  <plug>\nleqq ' +exe s:pA4a.'lneqq<Tab>≨                  <plug>\lneqq ' +exe s:pA4a.'lvertneqq<Tab>              <plug>\lvertneqq ' +exe s:pA4a.'nprec<Tab>⊀                  <plug>\nprec ' +exe s:pA4a.'npreceq<Tab>â‹                 <plug>\npreceq ' +exe s:pA4a.'precneqq<Tab>               <plug>\precneqq ' +exe s:pA4a.'lnsim<Tab>⋦                  <plug>\lnsim ' +exe s:pA4a.'lnapprox<Tab>               <plug>\lnapprox ' +exe s:pA4a.'precnsim<Tab>⋨               <plug>\precnsim ' +exe s:pA4a.'precnapprox<Tab>            <plug>\precnapprox ' +exe s:pA4a.'notin<Tab>∉                  <plug>\notin ' +exe s:pA4a.'nsubseteq<Tab>⊈              <plug>\nsubseteq ' +exe s:pA4a.'varsubsetneq<Tab>           <plug>\varsubsetneq ' +exe s:pA4a.'subsetneq<Tab>⊊              <plug>\subsetneq ' +exe s:pA4a.'nsubseteqq<Tab>             <plug>\nsubseteqq ' +exe s:pA4a.'varsubsetneqq<Tab>          <plug>\varsubsetneqq ' +exe s:pA4a.'subsetneqq<Tab>⊈             <plug>\subsetneqq ' +exe s:pA4a.'nparallel<Tab>∦              <plug>\nparallel ' +exe s:pA4a.'nshortparallel<Tab>         <plug>\nshortparallel ' +exe s:pA4a.'nvdash<Tab>⊬                 <plug>\nvdash ' +exe s:pA4a.'nvDash<Tab>⊠                <plug>\nvDash ' +" }}} +" BinaryRel2 {{{  +let s:pA5 = s:pA."&BinaryRel2."   +exe s:pA5.'gg<Tab>≫                      <plug>\gg ' +exe s:pA5.'ggg<Tab>â‹™                     <plug>\ggg ' +exe s:pA5.'gggtr<Tab>â‹™                    <plug>\gggtr ' +exe s:pA5.'geqslant<Tab>                 <plug>\geqslant ' +exe s:pA5.'geq<Tab>≥                     <plug>\geq ' +exe s:pA5.'geqq<Tab>≧                    <plug>\geqq ' +exe s:pA5.'eqslantgtr<Tab>               <plug>\eqslantgtr ' +exe s:pA5.'gtrdot<Tab>â‹—                  <plug>\gtrdot ' +exe s:pA5.'succ<Tab>≻                    <plug>\succ ' +exe s:pA5.'succeq<Tab>≽                  <plug>\succeq ' +exe s:pA5.'succcurlyeq<Tab>≽             <plug>\succcurlyeq ' +exe s:pA5.'curlyeqsucc<Tab>⋟             <plug>\curlyeqsucc ' +exe s:pA5.'gtrsim<Tab>≳                  <plug>\gtrsim ' +exe s:pA5.'gtrapprox<Tab>                <plug>\gtrapprox ' +exe s:pA5.'succsim<Tab>≿                 <plug>\succsim ' +exe s:pA5.'succapprox<Tab>               <plug>\succapprox ' +exe s:pA5.'ni<Tab>∋                      <plug>\ni ' +exe s:pA5.'owns<Tab>                     <plug>\owns ' +exe s:pA5.'supset<Tab>⊃                  <plug>\supset ' +exe s:pA5.'Supset<Tab>â‹‘                  <plug>\Supset ' +exe s:pA5.'supseteq<Tab>⊇                <plug>\supseteq ' +exe s:pA5.'supseteqq<Tab>                <plug>\supseteqq ' +exe s:pA5.'sqsupset<Tab>⊠               <plug>\sqsupset ' +exe s:pA5.'sqsupseteq<Tab>⊒              <plug>\sqsupseteq ' +exe s:pA5.'frown<Tab>⌢                   <plug>\frown ' +exe s:pA5.'smallfrown<Tab>⌢              <plug>\smallfrown ' +exe s:pA5.'mid<Tab>∣                     <plug>\mid ' +exe s:pA5.'shortmid<Tab>                 <plug>\shortmid ' +exe s:pA5.'between<Tab>≬                 <plug>\between ' +exe s:pA5.'Vdash<Tab>⊩                   <plug>\Vdash ' +exe s:pA5.'bowtie<Tab>⋈                  <plug>\bowtie ' +exe s:pA5.'Join<Tab>⋈                    <plug>\Join ' +exe s:pA5.'pitchfork<Tab>â‹”               <plug>\pitchfork ' +" }}} +" {{{ nBinaryRel2 +let s:pA5a = s:pA."n&BinaryRel2."  "TODO: dorobiæ logarytmy +exe s:pA5a.'ngtr<Tab>≯                   <plug>\ngtr ' +exe s:pA5a.'ngeqslant<Tab>≱              <plug>\ngeqslant ' +exe s:pA5a.'ngeq<Tab>                   <plug>\ngeq ' +exe s:pA5a.'gneq<Tab>                   <plug>\gneq ' +exe s:pA5a.'ngeqq<Tab>                  <plug>\ngeqq ' +exe s:pA5a.'gneqq<Tab>≩                  <plug>\gneqq ' +exe s:pA5a.'nsucc<Tab>⊠                 <plug>\nsucc ' +exe s:pA5a.'nsucceq<Tab>â‹¡                <plug>\nsucceq ' +exe s:pA5a.'succneqq<Tab>                <plug>\succneqq ' +exe s:pA5a.'gnsim<Tab>â‹§                  <plug>\gnsim ' +exe s:pA5a.'gnapprox<Tab>               <plug>\gnapprox ' +exe s:pA5a.'succnsim<Tab>â‹©               <plug>\succnsim ' +exe s:pA5a.'succnapprox<Tab>            <plug>\succnapprox ' +exe s:pA5a.'nsupseteq<Tab>⊉              <plug>\nsupseteq ' +exe s:pA5a.'varsupsetneq<Tab>           <plug>\varsupsetneq ' +exe s:pA5a.'supsetneq<Tab>⊋              <plug>\supsetneq ' +exe s:pA5a.'nsupseteqq<Tab>             <plug>\nsupseteqq ' +exe s:pA5a.'varsupsetneqq<Tab>          <plug>\varsupsetneqq ' +exe s:pA5a.'supsetneqq<Tab>             <plug>\supsetneqq ' +exe s:pA5a.'nmid<Tab>∤                   <plug>\nmid ' +exe s:pA5a.'nshortmid<Tab>              <plug>\nshortmid ' +exe s:pA5a.'nVdash<Tab>⊮                 <plug>\nVdash ' +" }}} +" {{{ BinaryRel3 +let s:pA6 = s:pA."&BinaryRel3."   +exe s:pA6.'doteq<Tab>≠                  <plug>\doteq ' +exe s:pA6.'circeq<Tab>≗                  <plug>\circeq ' +exe s:pA6.'eqcirc<Tab>≖                  <plug>\eqcirc ' +exe s:pA6.'risingdotseq<Tab>≓            <plug>\risingdotseq ' +exe s:pA6.'doteqdot<Tab>≑                <plug>\doteqdot ' +exe s:pA6.'Doteq<Tab>≑                   <plug>\Doteq ' +exe s:pA6.'fallingdotseq<Tab>≒           <plug>\fallingdotseq ' +exe s:pA6.'triangleq<Tab>≜               <plug>\triangleq ' +exe s:pA6.'bumpeq<Tab>≠                 <plug>\bumpeq ' +exe s:pA6.'Bumpeq<Tab>≎                  <plug>\Bumpeq ' +exe s:pA6.'equiv<Tab>`=\ \ ≡             <plug>\equiv ' +exe s:pA6.'sim<Tab>∼                     <plug>\sim ' +exe s:pA6.'thicksim<Tab>∼                <plug>\thicksim ' +exe s:pA6.'backsim<Tab>∽                 <plug>\backsim ' +exe s:pA6.'simeq<Tab>≃                   <plug>\simeq ' +exe s:pA6.'backsimeq<Tab>â‹               <plug>\backsimeq ' +exe s:pA6.'cong<Tab>≅                    <plug>\cong ' +exe s:pA6.'approx<tab>=~\ \ ≈            <plug>\approx ' +exe s:pA6.'thickapprox<Tab>≈             <plug>\thickapprox ' +exe s:pA6.'approxeq<Tab>≊                <plug>\approxeq ' +exe s:pA6.'blacktriangleleft<Tab>â—€       <plug>\blacktriangleleft ' +exe s:pA6.'vartriangleleft<Tab>⊲         <plug>\vartriangleleft ' +exe s:pA6.'trianglelefteq<Tab>⊴          <plug>\trianglelefteq ' +exe s:pA6.'blacktriangleright<Tab>â–¶      <plug>\blacktriangleright ' +exe s:pA6.'vartriangleright<Tab>⊳        <plug>\vartriangleright ' +exe s:pA6.'trianglerighteq<Tab>⊵         <plug>\trianglerighteq ' +exe s:pA6.'perp<Tab>⊥                    <plug>\perp ' +exe s:pA6.'asymp<Tab>≠                  <plug>\asymp ' +exe s:pA6.'Vvdash<Tab>⊪                  <plug>\Vvdash ' +exe s:pA6.'propto<Tab>∠                 <plug>\propto ' +exe s:pA6.'varpropto<Tab>∠              <plug>\varpropto ' +exe s:pA6.'because<Tab>∵                 <plug>\because ' +" }}} +" {{{ nBinaryRel3 +let s:pA6a = s:pA."&nBinaryRel3." +exe s:pA6a.'neq<Tab>≠                    <plug>\neq ' +exe s:pA6a.'nsim<Tab>≠                  <plug>\nsim ' +exe s:pA6a.'ncong<Tab>≆                  <plug>\ncong ' +exe s:pA6a.'ntriangleleft<Tab>⋪          <plug>\ntriangleleft ' +exe s:pA6a.'ntrianglelefteq<Tab>⋬        <plug>\ntrianglelefteq ' +exe s:pA6a.'ntriangleright<Tab>â‹«         <plug>\ntriangleright ' +exe s:pA6a.'ntrianglerighteq<Tab>â‹       <plug>\ntrianglerighteq ' +" }}} +" {{{ BinaryRel4 +let s:pA7 = s:pA."&BinaryRel4."   +exe s:pA7.'lessgtr<Tab>≶                 <plug>\lessgtr ' +exe s:pA7.'gtrless<Tab>≷                 <plug>\gtrless ' +exe s:pA7.'lesseqgtr<Tab>⋚               <plug>\lesseqgtr ' +exe s:pA7.'gtreqless<Tab>â‹›               <plug>\gtreqless ' +exe s:pA7.'lesseqqgtr<Tab>              <plug>\lesseqqgtr ' +exe s:pA7.'gtreqqless<Tab>              <plug>\gtreqqless ' +" }}} +" {{{ BigOp +let s:pA8a = s:pA."&BigOp." +exe s:pA8a.'limits<Tab>                 <plug>\limits' +exe s:pA8a.'nolimits<Tab>               <plug>\nolimits' +exe s:pA8a.'displaylimits<Tab>          <plug>\displaylimits' +exe s:pA8a.'-seplimits- :' +exe s:pA8a.'bigcap<Tab>`-\ \ â‹‚           <plug>\bigcap' +exe s:pA8a.'bigcup<Tab>`+\ \ ⋃        <plug>\bigcup' +exe s:pA8a.'bigodot<Tab>⊙                <plug>\bigodot' +exe s:pA8a.'bigoplus<Tab>⊕               <plug>\bigoplus' +exe s:pA8a.'bigotimes<Tab>⊗              <plug>\bigotimes' +exe s:pA8a.'bigsqcup<Tab>⊔               <plug>\bigsqcup' +exe s:pA8a.'biguplus<Tab>⊎               <plug>\biguplus' +exe s:pA8a.'bigvee<Tab>â‹                 <plug>\bigvee' +exe s:pA8a.'bigwedge<Tab>â‹€               <plug>\bigwedge' +exe s:pA8a.'coprod<Tab>∠                <plug>\coprod' +exe s:pA8a.'int<Tab>∫                    <plug>\int' +exe s:pA8a.'iint<Tab>∬                   <plug>\int' +exe s:pA8a.'iiint<Tab>∠                 <plug>\int' +exe s:pA8a.'oint<Tab>∮                   <plug>\oint' +exe s:pA8a.'prod<Tab>∠                  <plug>\prod' +exe s:pA8a.'sum<Tab>∑                    <plug>\sum' +" }}} +" {{{ BinaryOp +let s:pA8 = s:pA."&BinaryOp." +exe s:pA8.'pm<Tab>±                      <plug>\pm ' +exe s:pA8.'mp<Tab>∓                      <plug>\mp ' +exe s:pA8.'dotplus<Tab>∔                 <plug>\dotplus ' +exe s:pA8.'cdot<Tab>`.\ \ â‹…              <plug>\cdot ' +exe s:pA8.'centerdot<Tab>â‹…               <plug>\centerdot ' +exe s:pA8.'times<Tab>`*\ \ ×             <plug>\times ' +exe s:pA8.'ltimes<Tab>⋉                  <plug>\ltimes ' +exe s:pA8.'rtimes<Tab>⋊                  <plug>\rtimes ' +exe s:pA8.'leftthreetimes<Tab>â‹‹          <plug>\leftthreetimes ' +exe s:pA8.'rightthreetimes<Tab>⋌         <plug>\rightthreetimes ' +exe s:pA8.'div<Tab>÷                     <plug>\div ' +exe s:pA8.'divideontimes<Tab>⋇           <plug>\divideontimes ' +exe s:pA8.'bmod<Tab>                     <plug>\bmod ' +exe s:pA8.'ast<Tab>∗                     <plug>\ast ' +exe s:pA8.'star<Tab>⋆                    <plug>\star ' +exe s:pA8.'setminus<Tab>`\\\ \ ∖         <plug>\setminus ' +exe s:pA8.'smallsetminus<Tab>∖           <plug>\smallsetminus ' +exe s:pA8.'diamond<Tab>â‹„                 <plug>\diamond ' +exe s:pA8.'wr<Tab>≀                      <plug>\wr ' +exe s:pA8.'intercal<Tab>⊺                <plug>\intercal ' +exe s:pA8.'circ<Tab>`@\ \ ∘              <plug>\circ ' +exe s:pA8.'bigcirc<Tab>â—‹                 <plug>\bigcirc ' +exe s:pA8.'bullet<Tab>∙                  <plug>\bullet ' +exe s:pA8.'cap<Tab>∩                     <plug>\cap ' +exe s:pA8.'Cap<Tab>â‹’                     <plug>\Cap ' +exe s:pA8.'cup<Tab>∪                     <plug>\cup ' +exe s:pA8.'Cup<Tab>â‹“                     <plug>\Cup ' +exe s:pA8.'sqcap<Tab>⊓                   <plug>\sqcap ' +exe s:pA8.'sqcup<Tab>⊔                   <plug>\sqcup' +exe s:pA8.'amalg<Tab>                    <plug>\amalg ' +exe s:pA8.'uplus<Tab>⊎                   <plug>\uplus ' +exe s:pA8.'triangleleft<Tab>â—            <plug>\triangleleft ' +exe s:pA8.'triangleright<Tab>â–·           <plug>\triangleright ' +exe s:pA8.'bigtriangleup<Tab>â–³           <plug>\bigtriangleup ' +exe s:pA8.'bigtriangledown<Tab>â–½         <plug>\bigtriangledown ' +exe s:pA8.'vee<Tab>∨                     <plug>\vee ' +exe s:pA8.'veebar<Tab>⊻                  <plug>\veebar ' +exe s:pA8.'curlyvee<Tab>⋎                <plug>\curlyvee ' +exe s:pA8.'wedge<Tab>`&\ \ ∧             <plug>\wedge ' +exe s:pA8.'barwedge<Tab>⊼                <plug>\barwedge ' +exe s:pA8.'doublebarwedge<Tab>⌆          <plug>\doublebarwedge ' +exe s:pA8.'curlywedge<Tab>â‹              <plug>\curlywedge ' +exe s:pA8.'oplus<Tab>⊕                   <plug>\oplus ' +exe s:pA8.'ominus<Tab>⊖                  <plug>\ominus ' +exe s:pA8.'otimes<Tab>⊗                  <plug>\otimes ' +exe s:pA8.'oslash<Tab>⊘                  <plug>\oslash ' +exe s:pA8.'boxplus<Tab>⊞                 <plug>\boxplus ' +exe s:pA8.'boxminus<Tab>⊟                <plug>\boxminus ' +exe s:pA8.'boxtimes<Tab>⊠                <plug>\boxtimes ' +exe s:pA8.'boxdot<Tab>⊡                  <plug>\boxdot ' +exe s:pA8.'odot<Tab>⊙                    <plug>\odot ' +exe s:pA8.'circledast<Tab>⊛              <plug>\circledast ' +exe s:pA8.'circleddash<Tab>⊠            <plug>\circleddash ' +exe s:pA8.'circledcirc<Tab>⊚             <plug>\circledcirc ' +exe s:pA8.'dagger<Tab>†                  <plug>\dagger ' +exe s:pA8.'ddagger<Tab>‡                 <plug>\ddagger ' +exe s:pA8.'lhd<Tab>⊲                     <plug>\lhd ' +exe s:pA8.'unlhd<Tab>⊴                   <plug>\unlhd ' +exe s:pA8.'rhd<Tab>⊳                     <plug>\rhd ' +exe s:pA8.'unrhd<Tab>⊵                   <plug>\unrhd ' +" }}} +" {{{ Other1 +let s:pA9 = s:pA."&Other1." +exe s:pA9.'hat<Tab>â                   <plug>\hat ' +exe s:pA9.'check<Tab>ÇŽ                 <plug>\check ' +exe s:pA9.'grave<Tab>à                 <plug>\grave ' +exe s:pA9.'acute<Tab>á                 <plug>\acute ' +exe s:pA9.'dot<Tab>ȧ                   <plug>\dot ' +exe s:pA9.'ddot<Tab>ä                  <plug>\ddot ' +exe s:pA9.'tilde<Tab>`,\ \ ã           <plug>\tilde ' +exe s:pA9.'breve<Tab>ă                 <plug>\breve ' +exe s:pA9.'bar<Tab>Ä                   <plug>\bar ' +exe s:pA9.'vec<Tab>a⃗                   <plug>\vec ' +exe s:pA9.'aleph<Tab>×                 <plug>\aleph ' +exe s:pA9.'hbar<Tab>â„                  <plug>\hbar ' +exe s:pA9.'imath<Tab>                  <plug>\imath ' +exe s:pA9.'jmath<Tab>                  <plug>\jmath ' +exe s:pA9.'ell<Tab>â„“                   <plug>\ell ' +exe s:pA9.'wp<Tab>℘                    <plug>\wp ' +exe s:pA9.'Re<Tab>ℜ                    <plug>\Re ' +exe s:pA9.'Im<Tab>â„‘                    <plug>\Im ' +exe s:pA9.'partial<Tab>∂               <plug>\partial ' +exe s:pA9.'infty<Tab>`8\ \ ∞           <plug>\infty ' +exe s:pA9.'prime<Tab>′                 <plug>\prime ' +exe s:pA9.'emptyset<Tab>∅              <plug>\emptyset ' +exe s:pA9.'nabla<Tab>∇                 <plug>\nabla ' +exe s:pA9.'surd<Tab>√                  <plug>\surd ' +exe s:pA9.'top<Tab>⊤                   <plug>\top ' +exe s:pA9.'bot<Tab>⊥                   <plug>\bot ' +exe s:pA9.'angle<Tab>∠                 <plug>\angle ' +exe s:pA9.'triangle<Tab>â–³              <plug>\triangle ' +exe s:pA9.'backslash<Tab>\\            <plug>\backslash ' +exe s:pA9.'forall<Tab>∀                <plug>\forall ' +exe s:pA9.'exists<Tab>∃                <plug>\exists ' +exe s:pA9.'neg<Tab>¬                   <plug>\neg ' +exe s:pA9.'flat<Tab>â™                  <plug>\flat ' +exe s:pA9.'natural<Tab>â™®               <plug>\natural ' +exe s:pA9.'sharp<Tab>♯                 <plug>\sharp ' +exe s:pA9.'clubsuit<Tab>♣              <plug>\clubsuit ' +exe s:pA9.'diamondsuit<Tab>♢           <plug>\diamondsuit ' +exe s:pA9.'heartsuit<Tab>♡             <plug>\heartsuit ' +exe s:pA9.'spadesuit<Tab>â™              <plug>\spadesuit ' +exe s:pA9.'S<Tab>§                     <plug>\S ' +exe s:pA9.'P<Tab>¶                     <plug>\P' +" }}} +" {{{ MathCreating +let s:pA10 = s:pA."&MathCreating." +exe s:pA10.'not<Tab>                    <plug>\not' +exe s:pA10.'mkern<Tab>                  <plug>\mkern' +exe s:pA10.'mathbin<Tab>                <plug>\mathbin' +exe s:pA10.'mathrel<Tab>                <plug>\mathrel' +exe s:pA10.'stackrel<Tab>               <plug>\stackrel' +exe s:pA10.'mathord<Tab>                <plug>\mathord' +" }}} +" {{{ Styles +let s:pA11 = s:pA."&Styles." +exe s:pA11.'displaystyle<Tab>           <plug>\displaystyle' +exe s:pA11.'textstyle<Tab>              <plug>\textstyle' +exe s:pA11.'scritpstyle<Tab>            <plug>\scritpstyle' +exe s:pA11.'scriptscriptstyle<Tab>      <plug>\scriptscriptstyle' +" }}} +" {{{ MathDiacritics +let s:pA12 = s:pA."&MathDiacritics." +exe s:pA12.'acute{}<Tab>á            <plug><C-r>=IMAP_PutTextWithMovement("\\acute{<++>}<++>")<cr>' +exe s:pA12.'bar{}<Tab>`_\ \ Ä        <plug><C-r>=IMAP_PutTextWithMovement("\\bar{<++>}<++>")<cr>' +exe s:pA12.'breve{}<Tab>ă            <plug><C-r>=IMAP_PutTextWithMovement("\\breve{<++>}<++>")<cr>' +exe s:pA12.'check{}<Tab>ÇŽ            <plug><C-r>=IMAP_PutTextWithMovement("\\check{<++>}<++>")<cr>' +exe s:pA12.'ddot{}<Tab>`:\ \ ä       <plug><C-r>=IMAP_PutTextWithMovement("\\ddot{<++>}<++>")<cr>' +exe s:pA12.'dot{}<Tab>`;\ \ ȧ        <plug><C-r>=IMAP_PutTextWithMovement("\\dot{<++>}<++>")<cr>' +exe s:pA12.'grave{}<Tab>à            <plug><C-r>=IMAP_PutTextWithMovement("\\grave{<++>}<++>")<cr>' +exe s:pA12.'hat{}<Tab>`^\ \ â        <plug><C-r>=IMAP_PutTextWithMovement("\\hat{<++>}<++>")<cr>' +exe s:pA12.'tilde{}<tab>`~\ \ ã      <plug><C-r>=IMAP_PutTextWithMovement("\\tilde{<++>}<++>")<cr>' +exe s:pA12.'vec{}<Tab>a⃗              <plug><C-r>=IMAP_PutTextWithMovement("\\vec{<++>}<++>")<cr>' +exe s:pA12.'widehat{}<Tab>           <plug><C-r>=IMAP_PutTextWithMovement("\\widehat{<++>}<++>")<cr>' +exe s:pA12.'widetilde{}<Tab>         <plug><C-r>=IMAP_PutTextWithMovement("\\widetilde{<++>}<++>")<cr>' +exe s:pA12.'imath<Tab>               <plug><C-r>=IMAP_PutTextWithMovement("\\imath")<cr>' +exe s:pA12.'jmath<Tab>               <plug><C-r>=IMAP_PutTextWithMovement("\\jmath")<cr>' +" }}} +" {{{ OverlineAndCo +let s:pA13 = s:pA."&OverlineAndCo." +exe s:pA13.'overline{}              <plug><C-r>=IMAP_PutTextWithMovement("\\overline{}")<cr>' +exe s:pA13.'underline{}             <plug><C-r>=IMAP_PutTextWithMovement("\\underline{}")<cr>' +exe s:pA13.'overrightarrow{}        <plug><C-r>=IMAP_PutTextWithMovement("\\overrightarrow{}")<cr>' +exe s:pA13.'overleftarrow{}         <plug><C-r>=IMAP_PutTextWithMovement("\\overleftarrow{}")<cr>' +exe s:pA13.'overbrace{}             <plug><C-r>=IMAP_PutTextWithMovement("\\overbrace{}")<cr>' +exe s:pA13.'underbrace{}            <plug><C-r>=IMAP_PutTextWithMovement("\\underbrace{}")<cr>' +" }}} +" {{{ Symbols1 +let s:pA14a = s:pA."&Symbols1." +exe s:pA14a.'forall<Tab>∀               <plug>\forall ' +exe s:pA14a.'exists<Tab>∃               <plug>\exists ' +exe s:pA14a.'nexists<Tab>∄              <plug>\nexists ' +exe s:pA14a.'neg<Tab>¬                  <plug>\neg ' +exe s:pA14a.'top<Tab>⊤                  <plug>\top ' +exe s:pA14a.'bot<Tab>⊥                  <plug>\bot ' +exe s:pA14a.'emptyset<Tab>∅             <plug>\emptyset ' +exe s:pA14a.'varnothing<Tab>⌀           <plug>\varnothing ' +exe s:pA14a.'infty<Tab>∞                <plug>\infty ' +exe s:pA14a.'aleph<Tab>×                <plug>\aleph ' +exe s:pA14a.'beth<Tab>ב                 <plug>\beth ' +exe s:pA14a.'gimel<Tab>×’                <plug>\gimel ' +exe s:pA14a.'daleth<Tab>ד               <plug>\daleth ' +exe s:pA14a.'hbar<Tab>                  <plug>\hbar ' +exe s:pA14a.'hslash<Tab>â„               <plug>\hslash ' +exe s:pA14a.'diagup<Tab>â„               <plug>\diagup ' +exe s:pA14a.'vert<Tab>\|                <plug>\vert ' +exe s:pA14a.'Vert<Tab>∥                 <plug>\Vert ' +exe s:pA14a.'backslash<Tab>\\           <plug>\backslash ' +exe s:pA14a.'diagdown<Tab>              <plug>\diagdown ' +exe s:pA14a.'Bbbk<Tab>ᵕ                  <plug>\Bbbk ' +exe s:pA14a.'P<Tab>¶                    <plug>\P ' +exe s:pA14a.'S<Tab>§                    <plug>\S ' +" }}} +" {{{ Symbols2 +let s:pA14b = s:pA."&Symbols2." +exe s:pA14b.'#                      <plug>\# ' +exe s:pA14b.'%                      <plug>\% ' +exe s:pA14b.'_<Tab>                 <plug>\_ ' +exe s:pA14b.'$                      <plug>\$ ' +exe s:pA14b.'&                      <plug>\& ' +exe s:pA14b.'imath<Tab>             <plug>\imath ' +exe s:pA14b.'jmath<Tab>             <plug>\jmath ' +exe s:pA14b.'ell<Tab>â„“              <plug>\ell ' +exe s:pA14b.'wp<Tab>℘               <plug>\wp ' +exe s:pA14b.'Re<Tab>ℜ               <plug>\Re ' +exe s:pA14b.'Im<Tab>â„‘               <plug>\Im ' +exe s:pA14b.'prime<Tab>′            <plug>\prime ' +exe s:pA14b.'backprime<Tab>‵        <plug>\backprime ' +exe s:pA14b.'nabla<Tab>∇            <plug>\nabla ' +exe s:pA14b.'surd<Tab>√             <plug>\surd ' +exe s:pA14b.'flat<Tab>â™             <plug>\flat ' +exe s:pA14b.'sharp<Tab>♯            <plug>\sharp ' +exe s:pA14b.'natural<Tab>â™®          <plug>\natural ' +exe s:pA14b.'eth<Tab>ð              <plug>\eth ' +exe s:pA14b.'bigstar<Tab>★          <plug>\bigstar ' +exe s:pA14b.'circledS<Tab>Ⓢ         <plug>\circledS ' +exe s:pA14b.'Finv<Tab>Ⅎ             <plug>\Finv ' +exe s:pA14b.'dag<Tab>†              <plug>\dag ' +exe s:pA14b.'ddag<Tab>‡             <plug>\ddag ' +" }}} +" {{{ Symbols3 +let s:pA14c = s:pA."&Symbols3." +exe s:pA14c.'angle<Tab>∠                 <plug>\angle ' +exe s:pA14c.'measuredangle<Tab>∡         <plug>\measuredangle ' +exe s:pA14c.'sphericalangle<Tab>∢        <plug>\sphericalangle ' +exe s:pA14c.'spadesuit<Tab>â™              <plug>\spadesuit ' +exe s:pA14c.'heartsuit<Tab>♡             <plug>\heartsuit ' +exe s:pA14c.'diamondsuit<Tab>♢           <plug>\diamondsuit ' +exe s:pA14c.'clubsuit<Tab>♣              <plug>\clubsuit ' +exe s:pA14c.'lozenge<Tab>â—Š               <plug>\lozenge ' +exe s:pA14c.'blacklozenge<Tab>â—†          <plug>\blacklozenge ' +exe s:pA14c.'Diamond<Tab>â—‡               <plug>\Diamond ' +exe s:pA14c.'triangle<Tab>â–³              <plug>\triangle ' +exe s:pA14c.'vartriangle<Tab>â–³           <plug>\vartriangle ' +exe s:pA14c.'blacktriangle<Tab>â–²         <plug>\blacktriangle ' +exe s:pA14c.'triangledown<Tab>â–½          <plug>\triangledown ' +exe s:pA14c.'blacktriangledown<Tab>â–¼     <plug>\blacktriangledown ' +exe s:pA14c.'Box<Tab>â–¡                   <plug>\Box ' +exe s:pA14c.'square<Tab>â–¡                <plug>\square ' +exe s:pA14c.'blacksquare<Tab>â–            <plug>\blacksquare ' +exe s:pA14c.'complement<Tab>∠           <plug>\complement ' +exe s:pA14c.'mho<Tab>â„§                   <plug>\mho ' +exe s:pA14c.'Game<Tab>â…                  <plug>\Game ' +exe s:pA14c.'partial<Tab>`6\ \ ∂         <plug>\partial ' +exe s:pA14c.'smallint<Tab>∫              <plug>\smallint ' +" }}} +" {{{ Logic +let s:pA15 = s:pA."&Logic." +exe s:pA15.'lnot<Tab>¬                   <plug>\lnot ' +exe s:pA15.'lor<Tab>∨                    <plug>\lor ' +exe s:pA15.'land<Tab>∧                   <plug>\land ' +" }}} +" {{{ Limits1 +let s:pA16 = s:pA."&Limits1." +exe s:pA16.'left<Tab>(                  <plug>\left' +exe s:pA16.'right<Tab>)                 <plug>\right' +exe s:pA16.'-sepbigl- :' +exe s:pA16.'bigl<Tab>                   <plug>\bigl' +exe s:pA16.'Bigl<Tab>                   <plug>\Bigl' +exe s:pA16.'biggl<Tab>                  <plug>\biggl' +exe s:pA16.'Biggl<Tab>                  <plug>\Biggl' +exe s:pA16.'-sepbigr- :' +exe s:pA16.'bigr<Tab>                   <plug>\bigr' +exe s:pA16.'Bigr<Tab>                   <plug>\Bigr' +exe s:pA16.'biggr<Tab>                  <plug>\biggr' +exe s:pA16.'Biggr<Tab>                  <plug>\Biggr' +exe s:pA16.'-sepbig- :' +exe s:pA16.'big<Tab>                    <plug>\big' +exe s:pA16.'bigm<Tab>                   <plug>\bigm' +exe s:pA16.'-sepfloor- :' +exe s:pA16.'lfloor<Tab>⌊                 <plug>\lfloor ' +exe s:pA16.'lceil<Tab>⌈                  <plug>\lceil ' +exe s:pA16.'rfloor<Tab>⌋                 <plug>\rfloor ' +exe s:pA16.'rceil<Tab>⌉                  <plug>\rceil ' +exe s:pA16.'-sepangle- :' +exe s:pA16.'langle<Tab>〈                 <plug>\langle ' +exe s:pA16.'rangle<Tab>〉                 <plug>\rangle ' +" }}} +" {{{ Limits2 +let s:pA16a = s:pA."&Limits2." +exe s:pA16a.'ulcorner<Tab>⌜            <plug>\ulcorner ' +exe s:pA16a.'urcorner<Tab>⌠           <plug>\urcorner ' +exe s:pA16a.'llcorner<Tab>⌞            <plug>\llcorner ' +exe s:pA16a.'rlcorner<Tab>⌟            <plug>\rlcorner ' +exe s:pA16a.'-sepcorner- :' +exe s:pA16a.'vert<Tab>\|               <plug>\vert ' +exe s:pA16a.'Vert<Tab>∥                <plug>\Vert ' +exe s:pA16a.'lvert<Tab>                <plug>\lvert ' +exe s:pA16a.'lVert<Tab>                <plug>\lVert ' +exe s:pA16a.'rvert<Tab>                <plug>\rvert ' +exe s:pA16a.'rVert<Tab>                <plug>\rVert ' +exe s:pA16a.'uparrow<Tab>↑             <plug>\uparrow ' +exe s:pA16a.'Uparrow<Tab>⇑             <plug>\Uparrow ' +exe s:pA16a.'downarrow<Tab>↓           <plug>\downarrow ' +exe s:pA16a.'Downarrow<Tab>⇓           <plug>\Downarrow ' +exe s:pA16a.'updownarrow<Tab>↕         <plug>\updownarrow ' +exe s:pA16a.'Updownarrow<Tab>⇕         <plug>\Updownarrow ' +exe s:pA16a.'lgroup<Tab>               <plug>\lgroup ' +exe s:pA16a.'rgroup<Tab>               <plug>\rgroup ' +exe s:pA16a.'lmoustache<Tab>∫          <plug>\lmoustache ' +exe s:pA16a.'rmoustache<Tab>           <plug>\rmoustache ' +exe s:pA16a.'arrowvert<Tab>            <plug>\arrowvert ' +exe s:pA16a.'Arrowvert<Tab>            <plug>\Arrowvert ' +exe s:pA16a.'bracevert<Tab>            <plug>\bracevert ' +" }}} +" {{{ Log-likes +let s:pA17 = s:pA."Lo&g-likes." +exe s:pA17.'arccos<Tab>                 <plug>\arccos ' +exe s:pA17.'arcsin<Tab>                 <plug>\arcsin ' +exe s:pA17.'arctan<Tab>                 <plug>\arctan ' +exe s:pA17.'arg<Tab>                    <plug>\arg ' +exe s:pA17.'cos<Tab>                    <plug>\cos ' +exe s:pA17.'cosh<Tab>                   <plug>\cosh ' +exe s:pA17.'cot<Tab>                    <plug>\cot ' +exe s:pA17.'coth<Tab>                   <plug>\coth ' +exe s:pA17.'csc<Tab>                    <plug>\csc ' +exe s:pA17.'deg<Tab>                    <plug>\deg ' +exe s:pA17.'det<Tab>                    <plug>\det ' +exe s:pA17.'dim<Tab>                    <plug>\dim ' +exe s:pA17.'exp<Tab>                    <plug>\exp ' +exe s:pA17.'gcd<Tab>                    <plug>\gcd ' +exe s:pA17.'hom<Tab>                    <plug>\hom ' +exe s:pA17.'inf<Tab>                    <plug>\inf ' +exe s:pA17.'injlim<Tab>                 <plug>\injlim ' +exe s:pA17.'ker<Tab>                    <plug>\ker ' +exe s:pA17.'lg<Tab>                     <plug>\lg ' +exe s:pA17.'lim<Tab>                    <plug>\lim ' +exe s:pA17.'liminf<Tab>                 <plug>\liminf ' +exe s:pA17.'limsup<Tab>                 <plug>\limsup ' +exe s:pA17.'ln<Tab>                     <plug>\ln ' +exe s:pA17.'log<Tab>                    <plug>\log ' +exe s:pA17.'max<Tab>                    <plug>\max ' +exe s:pA17.'min<Tab>                    <plug>\min ' +exe s:pA17.'Pr<Tab>                     <plug>\Pr ' +exe s:pA17.'projlim<Tab>                <plug>\projlim ' +exe s:pA17.'sec<Tab>                    <plug>\sec ' +exe s:pA17.'sin<Tab>                    <plug>\sin ' +exe s:pA17.'sinh<Tab>                   <plug>\sinh ' +exe s:pA17.'sup<Tab>                    <plug>\sup ' +exe s:pA17.'tan<Tab>                    <plug>\tan ' +exe s:pA17.'tanh<Tab>                   <plug>\tanh ' +exe s:pA17.'varlimsup<Tab>              <plug>\varlimsup ' +exe s:pA17.'varliminf<Tab>              <plug>\varliminf ' +exe s:pA17.'varinjlim<Tab>              <plug>\varinjlim ' +exe s:pA17.'varprojlim<Tab>             <plug>\varprojlim ' +" }}} +" {{{ MathSpacing +let s:pA18 = s:pA."MathSpacing." +exe s:pA18.',                       <plug>\, ' +exe s:pA18.':                       <plug>\: ' +exe s:pA18.';                       <plug>\; ' +exe s:pA18.'[space]                 <plug>\  ' +exe s:pA18.'quad<Tab>               <plug>\quad ' +exe s:pA18.'qquad<Tab>              <plug>\qquad ' +exe s:pA18.'!                       <plug>\! ' +exe s:pA18.'thinspace<Tab>          <plug>\thinspace ' +exe s:pA18.'medspace<Tab>           <plug>\medspace ' +exe s:pA18.'thickspace<Tab>         <plug>\thickspace ' +exe s:pA18.'negthinspace<Tab>       <plug>\negthinspace ' +exe s:pA18.'negmedspace<Tab>        <plug>\negmedspace ' +exe s:pA18.'negthickspace<Tab>      <plug>\negthickspace ' +" 1}}} + +" vim:fdm=marker:ff=unix:noet:ts=4:sw=4:fenc=utf-8 diff --git a/ftplugin/latex-suite/mathmacros.vim b/ftplugin/latex-suite/mathmacros.vim new file mode 100644 index 00000000..553965c6 --- /dev/null +++ b/ftplugin/latex-suite/mathmacros.vim @@ -0,0 +1,730 @@ +"============================================================================= +" 	     File: mathmacros.vim +"      Author: Mikolaj Machowski +"     Created: Tue Apr 23 06:00 PM 2002 PST +"  +"  Description: macros for everything mathematical in latex. +"============================================================================= + +if !(has('gui_running') && g:Tex_MathMenus && g:Tex_Menus) +	finish +endif + +let s:MathMenuName = g:Tex_MenuPrefix.'&Math.' + +function! Tex_MathMenuRemove() +	exe 'silent! aunmenu '.s:MathMenuName +endfunction + +let s:pA = 'amenu <silent> '.g:Tex_NextMenuLocation.' '.s:MathMenuName +let g:Tex_NextMenuLocation = g:Tex_NextMenuLocation + 1 + +" brackets and dollars {{{ +exe s:pA.'\\&[\ \\]                 <plug><C-r>=IMAP_PutTextWithMovement("\\[<++>\\]<++>")<cr>' +exe s:pA.'\\&(\ \\)                 <plug><C-r>=IMAP_PutTextWithMovement("\\(<++>\\)<++>")<cr>' +exe s:pA.'&$\ $                     <plug>$$' +exe s:pA.'-sepmath1- :' +" }}} +" MATH arrows {{{ +let s:pA1 = s:pA."&Arrows." +exe s:pA1.'Leftarrow                <plug>\leftarrow ' +exe s:pA1.'leftarrow                <plug>\leftarrow' +exe s:pA1.'longleftarrow            <plug>\longleftarrow ' +exe s:pA1.'Leftarrow                <plug>\Leftarrow ' +exe s:pA1.'Longleftarrow            <plug>\Longleftarrow ' +exe s:pA1.'rightarrow               <plug>\rightarrow ' +exe s:pA1.'longrightarrow           <plug>\longrightarrow ' +exe s:pA1.'Rightarrow               <plug>\Rightarrow ' +exe s:pA1.'Longrightarrow           <plug>\Longrightarrow ' +exe s:pA1.'leftrightarrow           <plug>\leftrightarrow ' +exe s:pA1.'longleftrightarrow       <plug>\longleftrightarrow ' +exe s:pA1.'Leftrightarrow           <plug>\Leftrightarrow ' +exe s:pA1.'Longleftrightarrow       <plug>\Longleftrightarrow ' +exe s:pA1.'uparrow                  <plug>\uparrow ' +exe s:pA1.'Uparrow                  <plug>\Uparrow ' +exe s:pA1.'downarrow                <plug>\downarrow ' +exe s:pA1.'Downarrow                <plug>\Downarrow ' +exe s:pA1.'updownarrow              <plug>\updownarrow ' +exe s:pA1.'Updownarrow              <plug>\Updownarrow ' +exe s:pA1.'nearrow                  <plug>\nearrow ' +exe s:pA1.'searrow                  <plug>\searrow ' +exe s:pA1.'swarrow                  <plug>\swarrow ' +exe s:pA1.'nwarrow                  <plug>\nwarrow ' +exe s:pA1.'mapsto                   <plug>\mapsto ' +exe s:pA1.'leadsto                  <plug>\leadsto ' +exe s:pA1.'longmapsto               <plug>\longmapsto ' +exe s:pA1.'hookleftarrow            <plug>\hookleftarrow ' +exe s:pA1.'hookrightarrow           <plug>\hookrightarrow ' +exe s:pA1.'leftharpoonup            <plug>\leftharpoonup ' +exe s:pA1.'leftharpoondown          <plug>\leftharpoondown ' +exe s:pA1.'rightharpoonup           <plug>\rightharpoonup ' +exe s:pA1.'rightharpoondown         <plug>\rightharpoondown ' +exe s:pA1.'rightleftharpoons        <plug>\rightleftharpoons ' +exe s:pA1.'overleftarrow            <plug>\overleftarrow ' +exe s:pA1.'overrightarrow           <plug>\overrightarrow ' +exe s:pA1.'overleftrightarrow       <plug>\overleftrightarrow ' +exe s:pA1.'underleftarrow           <plug>\underleftarrow ' +exe s:pA1.'underrightarrow          <plug>\underrightarrow ' +exe s:pA1.'underleftrightarrow      <plug>\underleftrightarrow ' +exe s:pA1.'xleftarrow               <plug>\xleftarrow ' +exe s:pA1.'xrightarrow              <plug>\xrightarrow ' +" }}} + + +" MATH nArrows {{{ +let s:pA1a = s:pA."&nArrows." +exe s:pA1a.'nleftarrow              <plug>\nleftarrow ' +exe s:pA1a.'nLeftarrow              <plug>\nLeftarrow ' +exe s:pA1a.'nleftrightarrow         <plug>\nleftrightarrow ' +exe s:pA1a.'nrightarrow             <plug>\nrightarrow ' +exe s:pA1a.'nRightarrow             <plug>\nRightarrow ' +" }}} +" MATH Arrows2 {{{ +let s:pA1a = s:pA."Arrows2." +exe s:pA1a.'dashleftarrow               <plug>\dashleftarrow ' +exe s:pA1a.'leftleftarrows              <plug>\leftleftarrows ' +exe s:pA1a.'leftrightarrows             <plug>\leftrightarrows ' +exe s:pA1a.'Lleftarrow                  <plug>\Lleftarrow ' +exe s:pA1a.'twoheadleftarrow            <plug>\twoheadleftarrow ' +exe s:pA1a.'leftarrowtail               <plug>\leftarrowtail ' +exe s:pA1a.'leftrightharpoons           <plug>\leftrightharpoons ' +exe s:pA1a.'Lsh                         <plug>\Lsh ' +exe s:pA1a.'looparrowleft               <plug>\looparrowleft ' +exe s:pA1a.'curvearrowleft              <plug>\curvearrowleft ' +exe s:pA1a.'circlearrowleft             <plug>\circlearrowleft ' +exe s:pA1a.'dashrightarrow              <plug>\dashrightarrow ' +exe s:pA1a.'rightrightarrows            <plug>\rightrightarrows ' +exe s:pA1a.'rightleftarrows             <plug>\rightleftarrows ' +exe s:pA1a.'Rrightarrow                 <plug>\Rrightarrow ' +exe s:pA1a.'twoheadrightarrow           <plug>\twoheadrightarrow ' +exe s:pA1a.'rightarrowtail              <plug>\rightarrowtail ' +exe s:pA1a.'rightleftharpoons           <plug>\rightleftharpoons ' +exe s:pA1a.'Rsh                         <plug>\Rsh ' +exe s:pA1a.'looparrowright              <plug>\looparrowright ' +exe s:pA1a.'curvearrowright             <plug>\curvearrowright ' +exe s:pA1a.'circlearrowright            <plug>\circlearrowright ' +exe s:pA1a.'multimap                    <plug>\multimap ' +exe s:pA1a.'upuparrows                  <plug>\upuparrows ' +exe s:pA1a.'downdownarrows              <plug>\downdownarrows ' +exe s:pA1a.'upharpoonleft               <plug>\upharpoonleft ' +exe s:pA1a.'upharpoonright              <plug>\upharpoonright ' +exe s:pA1a.'downharpoonleft             <plug>\downharpoonleft ' +exe s:pA1a.'downharpoonright            <plug>\downharpoonright ' +exe s:pA1a.'rightsquigarrow             <plug>\rightsquigarrow ' +exe s:pA1a.'leftrightsquigarrow         <plug>\leftrightsquigarrow ' +" }}} +" MATH Fonts {{{ +let s:pA2a = s:pA."&MathFonts." +exe s:pA2a.'mathbf{}                <plug><C-r>=IMAP_PutTextWithMovement("\\mathbf{<++>}<++>")<cr>' +exe s:pA2a.'mathrm{}                <plug><C-r>=IMAP_PutTextWithMovement("\\mathrm{<++>}<++>")<cr>' +exe s:pA2a.'mathsf{}                <plug><C-r>=IMAP_PutTextWithMovement("\\mathsf{<++>}<++>")<cr>' +exe s:pA2a.'mathtt{}                <plug><C-r>=IMAP_PutTextWithMovement("\\mathtt{<++>}<++>")<cr>' +exe s:pA2a.'mathit{}                <plug><C-r>=IMAP_PutTextWithMovement("\\mathit{<++>}<++>")<cr>' +exe s:pA2a.'mathfrak{}              <plug><C-r>=IMAP_PutTextWithMovement("\\mathfrak{<++>}<++>")<cr>' +exe s:pA2a.'mathcal{}               <plug><C-r>=IMAP_PutTextWithMovement("\\mathcal{<++>}<++>")<cr>' +exe s:pA2a.'mathscr{}               <plug><C-r>=IMAP_PutTextWithMovement("\\mathscr{<++>}<++>")<cr>' +exe s:pA2a.'mathbb{}                <plug><C-r>=IMAP_PutTextWithMovement("\\mathbb{<++>}<++>")<cr>' +" }}} +" Greek Letters small {{{ +let s:pA2 = s:pA."&Greek.&Small." +exe s:pA2.'alpha<Tab>`a             <plug>\alpha ' +exe s:pA2.'beta<Tab>`b              <plug>\beta ' +exe s:pA2.'gamma<Tab>`g             <plug>\gamma ' +exe s:pA2.'delta<Tab>`d             <plug>\delta ' +exe s:pA2.'epsilon                  <plug>\epsilon ' +exe s:pA2.'varepsilon<Tab>`e        <plug>\varepsilon ' +exe s:pA2.'zeta<Tab>`z              <plug>\zeta ' +exe s:pA2.'eta<Tab>`h               <plug>\eta ' +exe s:pA2.'theta<Tab>`q             <plug>\theta ' +exe s:pA2.'vartheta                 <plug>\vartheta ' +exe s:pA2.'iota<Tab>`i              <plug>\iota ' +exe s:pA2.'kappa<Tab>`k             <plug>\kappa ' +exe s:pA2.'lambda<Tab>`l            <plug>\lambda ' +exe s:pA2.'mu<Tab>`m                <plug>\mu ' +exe s:pA2.'nu<Tab>`n                <plug>\nu ' +exe s:pA2.'xi<Tab>`x                <plug>\xi ' +exe s:pA2.'pi<Tab>`p                <plug>\pi ' +exe s:pA2.'varpi                    <plug>\varpi ' +exe s:pA2.'rho<Tab>`r               <plug>\rho ' +exe s:pA2.'varrho                   <plug>\varrho ' +exe s:pA2.'sigma<Tab>`s             <plug>\sigma ' +exe s:pA2.'varsigma<Tab>`v          <plug>\varsigma ' +exe s:pA2.'tau<Tab>`t               <plug>\tau ' +exe s:pA2.'upsilon<Tab>`u           <plug>\upsilon ' +exe s:pA2.'phi                      <plug>\phi ' +exe s:pA2.'varphi<Tab>`f            <plug>\varphi ' +exe s:pA2.'chi<Tab>`c               <plug>\chi ' +exe s:pA2.'psi<Tab>`y               <plug>\psi ' +exe s:pA2.'omega<Tab>`w             <plug>\omega ' +" }}} +" Greek Letters big {{{ +let s:pA3 = s:pA.'&Greek.&Big.'  +exe s:pA3.'Alpha<Tab>`A             <plug>\Alpha ' +exe s:pA3.'Beta<Tab>`B              <plug>\Beta ' +exe s:pA3.'Gamma<Tab>`G             <plug>\Gamma ' +exe s:pA3.'Delta<Tab>`D             <plug>\Delta ' +exe s:pA3.'Epsilon<Tab>`E           <plug>\Epsilon ' +exe s:pA3.'Zeta<Tab>`Z              <plug>\mathrm{Z} ' +exe s:pA3.'Eta<Tab>`H               <plug>\Eta ' +exe s:pA3.'Theta                    <plug>\Theta ' +exe s:pA3.'Iota                     <plug>\mathrm{I} ' +exe s:pA3.'Kappa<Tab>`K             <plug>\Kappa ' +exe s:pA3.'Lambda<Tab>`L            <plug>\Lambda ' +exe s:pA3.'Mu<Tab>`M                <plug>\Mu ' +exe s:pA3.'Nu<Tab>`N                <plug>\Nu ' +exe s:pA3.'Xi<Tab>`X                <plug>\Xi ' +exe s:pA3.'Pi<Tab>`P                <plug>\Pi ' +exe s:pA3.'Rho<Tab>`R               <plug>\Rho ' +exe s:pA3.'Sigma<Tab>`S             <plug>\Sigma ' +exe s:pA3.'Tau<Tab>`T               <plug>\Tau ' +exe s:pA3.'Upsilon<Tab>`U           <plug>\Upsilon ' +exe s:pA3.'Phi                      <plug>\Phi ' +exe s:pA3.'Chi<Tab>`C               <plug>\Chi ' +exe s:pA3.'Psi<Tab>`Y               <plug>\Psi ' +exe s:pA3.'Omega<Tab>`W             <plug>\Omega ' +" }}} +" BinaryRel1 {{{ +let s:pA4 = s:pA."&BinaryRel1."   +exe s:pA4.'ll                       <plug>\ll ' +exe s:pA4.'lll                      <plug>\lll ' +exe s:pA4.'leqslant                 <plug>\leqslant ' +exe s:pA4.'leq                      <plug>\leq ' +exe s:pA4.'leqq                     <plug>\leqq ' +exe s:pA4.'eqslantless              <plug>\eqslantless ' +exe s:pA4.'lessdot                  <plug>\lessdot ' +exe s:pA4.'prec                     <plug>\prec ' +exe s:pA4.'preceq                   <plug>\preceq ' +exe s:pA4.'preccurlyeq              <plug>\preccurlyeq ' +exe s:pA4.'curlyeqprec              <plug>\curlyeqprec ' +exe s:pA4.'lesssim                   <plug>\lesssim ' +exe s:pA4.'lessapprox               <plug>\lessapprox ' +exe s:pA4.'precsim                  <plug>\precsim ' +exe s:pA4.'precapprox               <plug>\precapprox ' +exe s:pA4.'in                       <plug>\in ' +exe s:pA4.'subset<Tab>`(            <plug>\subset ' +exe s:pA4.'Subset<Tab>`)            <plug>\Subset ' +exe s:pA4.'subseteq                 <plug>\subseteq ' +exe s:pA4.'subseteqq                <plug>\subseteqq ' +exe s:pA4.'sqsubset                 <plug>\sqsubset ' +exe s:pA4.'sqsubseteq               <plug>\sqsubseteq ' +exe s:pA4.'smile                    <plug>\smile ' +exe s:pA4.'smallsmile               <plug>\smallsmile ' +exe s:pA4.'parallel                 <plug>\parallel ' +exe s:pA4.'shortparallel            <plug>\shortparallel ' +exe s:pA4.'dashv                    <plug>\dashv ' +exe s:pA4.'vdash                    <plug>\vdash ' +exe s:pA4.'vDash                    <plug>\vDash ' +exe s:pA4.'models                   <plug>\models ' +exe s:pA4.'therefore                <plug>\therefore ' +exe s:pA4.'backepsilon              <plug>\backepsilon ' +" }}} +" nBinaryRel1 {{{  +let s:pA4a = s:pA."&nBinaryRel1."   +exe s:pA4a.'nless                   <plug>\nless ' +exe s:pA4a.'nleqslant               <plug>\nleqslant ' +exe s:pA4a.'nleq                    <plug>\nleq ' +exe s:pA4a.'lneq                    <plug>\lneq ' +exe s:pA4a.'nleqq                   <plug>\nleqq ' +exe s:pA4a.'lneqq                   <plug>\lneqq ' +exe s:pA4a.'lvertneqq               <plug>\lvertneqq ' +exe s:pA4a.'nprec                   <plug>\nprec ' +exe s:pA4a.'npreceq                 <plug>\npreceq ' +exe s:pA4a.'precneqq                <plug>\precneqq ' +exe s:pA4a.'lnsim                   <plug>\lnsim ' +exe s:pA4a.'lnapprox                <plug>\lnapprox ' +exe s:pA4a.'precnsim                <plug>\precnsim ' +exe s:pA4a.'precnapprox             <plug>\precnapprox ' +exe s:pA4a.'notin                   <plug>\notin ' +exe s:pA4a.'nsubseteq               <plug>\nsubseteq ' +exe s:pA4a.'varsubsetneq            <plug>\varsubsetneq ' +exe s:pA4a.'subsetneq               <plug>\subsetneq ' +exe s:pA4a.'nsubseteqq              <plug>\nsubseteqq ' +exe s:pA4a.'varsubsetneqq           <plug>\varsubsetneqq ' +exe s:pA4a.'subsetneqq              <plug>\subsetneqq ' +exe s:pA4a.'nparallel               <plug>\nparallel ' +exe s:pA4a.'nshortparallel          <plug>\nshortparallel ' +exe s:pA4a.'nvdash                  <plug>\nvdash ' +exe s:pA4a.'nvDash                  <plug>\nvDash ' +" }}} +" BinaryRel2 {{{  +let s:pA5 = s:pA."&BinaryRel2."   +exe s:pA5.'gg                       <plug>\gg ' +exe s:pA5.'ggg                      <plug>\ggg ' +exe s:pA5.'gggtr                    <plug>\gggtr ' +exe s:pA5.'geqslant                 <plug>\geqslant ' +exe s:pA5.'geq                      <plug>\geq ' +exe s:pA5.'geqq                     <plug>\geqq ' +exe s:pA5.'eqslantgtr               <plug>\eqslantgtr ' +exe s:pA5.'gtrdot                   <plug>\gtrdot ' +exe s:pA5.'succ                     <plug>\succ ' +exe s:pA5.'succeq                   <plug>\succeq ' +exe s:pA5.'succcurlyeq              <plug>\succcurlyeq ' +exe s:pA5.'curlyeqsucc              <plug>\curlyeqsucc ' +exe s:pA5.'gtrsim                   <plug>\gtrsim ' +exe s:pA5.'gtrapprox                <plug>\gtrapprox ' +exe s:pA5.'succsim                  <plug>\succsim ' +exe s:pA5.'succapprox               <plug>\succapprox ' +exe s:pA5.'ni                       <plug>\ni ' +exe s:pA5.'owns                     <plug>\owns ' +exe s:pA5.'supset                   <plug>\supset ' +exe s:pA5.'Supset                   <plug>\Supset ' +exe s:pA5.'supseteq                 <plug>\supseteq ' +exe s:pA5.'supseteqq                <plug>\supseteqq ' +exe s:pA5.'sqsupset                 <plug>\sqsupset ' +exe s:pA5.'sqsupseteq               <plug>\sqsupseteq ' +exe s:pA5.'frown                    <plug>\frown ' +exe s:pA5.'smallfrown               <plug>\smallfrown ' +exe s:pA5.'mid                      <plug>\mid ' +exe s:pA5.'shortmid                 <plug>\shortmid ' +exe s:pA5.'between                  <plug>\between ' +exe s:pA5.'Vdash                    <plug>\Vdash ' +exe s:pA5.'bowtie                   <plug>\bowtie ' +exe s:pA5.'Join                     <plug>\Join ' +exe s:pA5.'pitchfork                <plug>\pitchfork ' +" }}} +" {{{ nBinaryRel2 +let s:pA5a = s:pA."n&BinaryRel2."  "TODO: dorobiæ logarytmy +exe s:pA5a.'ngtr                    <plug>\ngtr ' +exe s:pA5a.'ngeqslant               <plug>\ngeqslant ' +exe s:pA5a.'ngeq                    <plug>\ngeq ' +exe s:pA5a.'gneq                    <plug>\gneq ' +exe s:pA5a.'ngeqq                   <plug>\ngeqq ' +exe s:pA5a.'gneqq                   <plug>\gneqq ' +exe s:pA5a.'nsucc                   <plug>\nsucc ' +exe s:pA5a.'nsucceq                 <plug>\nsucceq ' +exe s:pA5a.'succneqq                <plug>\succneqq ' +exe s:pA5a.'gnsim                   <plug>\gnsim ' +exe s:pA5a.'gnapprox                <plug>\gnapprox ' +exe s:pA5a.'succnsim                <plug>\succnsim ' +exe s:pA5a.'succnapprox             <plug>\succnapprox ' +exe s:pA5a.'nsupseteq               <plug>\nsupseteq ' +exe s:pA5a.'varsupsetneq            <plug>\varsupsetneq ' +exe s:pA5a.'supsetneq               <plug>\supsetneq ' +exe s:pA5a.'nsupseteqq              <plug>\nsupseteqq ' +exe s:pA5a.'varsupsetneqq           <plug>\varsupsetneqq ' +exe s:pA5a.'supsetneqq              <plug>\supsetneqq ' +exe s:pA5a.'nmid                    <plug>\nmid ' +exe s:pA5a.'nshortmid               <plug>\nshortmid ' +exe s:pA5a.'nVdash                  <plug>\nVdash ' +" }}} +" {{{ BinaryRel3 +let s:pA6 = s:pA."&BinaryRel3."   +exe s:pA6.'doteq                    <plug>\doteq ' +exe s:pA6.'circeq                   <plug>\circeq ' +exe s:pA6.'eqcirc                   <plug>\eqcirc ' +exe s:pA6.'risingdotseq             <plug>\risingdotseq ' +exe s:pA6.'doteqdot                 <plug>\doteqdot ' +exe s:pA6.'Doteq                    <plug>\Doteq ' +exe s:pA6.'fallingdotseq            <plug>\fallingdotseq ' +exe s:pA6.'triangleq                <plug>\triangleq ' +exe s:pA6.'bumpeq                   <plug>\bumpeq ' +exe s:pA6.'Bumpeq                   <plug>\Bumpeq ' +exe s:pA6.'equiv<Tab>`=             <plug>\equiv ' +exe s:pA6.'sim                      <plug>\sim ' +exe s:pA6.'thicksim                 <plug>\thicksim ' +exe s:pA6.'backsim                  <plug>\backsim ' +exe s:pA6.'simeq                    <plug>\simeq ' +exe s:pA6.'backsimeq                <plug>\backsimeq ' +exe s:pA6.'cong                     <plug>\cong ' +exe s:pA6.'approx<tab>=~            <plug>\approx ' +exe s:pA6.'thickapprox              <plug>\thickapprox ' +exe s:pA6.'approxeq                 <plug>\approxeq ' +exe s:pA6.'blacktriangleleft        <plug>\blacktriangleleft ' +exe s:pA6.'vartriangleleft          <plug>\vartriangleleft ' +exe s:pA6.'trianglelefteq           <plug>\trianglelefteq ' +exe s:pA6.'blacktriangleright       <plug>\blacktriangleright ' +exe s:pA6.'vartriangleright         <plug>\vartriangleright ' +exe s:pA6.'trianglerighteq          <plug>\trianglerighteq ' +exe s:pA6.'perp                     <plug>\perp ' +exe s:pA6.'asymp                    <plug>\asymp ' +exe s:pA6.'Vvdash                   <plug>\Vvdash ' +exe s:pA6.'propto                   <plug>\propto ' +exe s:pA6.'varpropto                <plug>\varpropto ' +exe s:pA6.'because                  <plug>\because ' +" }}} +" {{{ nBinaryRel3 +let s:pA6a = s:pA."&nBinaryRel3." +exe s:pA6a.'neq                     <plug>\neq ' +exe s:pA6a.'nsim                    <plug>\nsim ' +exe s:pA6a.'ncong                   <plug>\ncong ' +exe s:pA6a.'ntriangleleft           <plug>\ntriangleleft ' +exe s:pA6a.'ntrianglelefteq         <plug>\ntrianglelefteq ' +exe s:pA6a.'ntriangleright          <plug>\ntriangleright ' +exe s:pA6a.'ntrianglerighteq        <plug>\ntrianglerighteq ' +" }}} +" {{{ BinaryRel4 +let s:pA7 = s:pA."&BinaryRel4."   +exe s:pA7.'lessgtr                  <plug>\lessgtr ' +exe s:pA7.'gtrless                  <plug>\gtrless ' +exe s:pA7.'lesseqgtr                <plug>\lesseqgtr ' +exe s:pA7.'gtreqless                <plug>\gtreqless ' +exe s:pA7.'lesseqqgtr               <plug>\lesseqqgtr ' +exe s:pA7.'gtreqqless               <plug>\gtreqqless ' +" }}} +" {{{ BigOp +let s:pA8a = s:pA."&BigOp." +exe s:pA8a.'limits                  <plug>\limits' +exe s:pA8a.'nolimits                <plug>\nolimits' +exe s:pA8a.'displaylimits           <plug>\displaylimits' +exe s:pA8a.'-seplimits- :' +exe s:pA8a.'bigcap<Tab>`-           <plug>\bigcap' +exe s:pA8a.'bigcup<Tab>`+           <plug>\bigcup' +exe s:pA8a.'bigodot                 <plug>\bigodot' +exe s:pA8a.'bigoplus                <plug>\bigoplus' +exe s:pA8a.'bigotimes               <plug>\bigotimes' +exe s:pA8a.'bigsqcup                <plug>\bigsqcup' +exe s:pA8a.'biguplus                <plug>\biguplus' +exe s:pA8a.'bigvee                  <plug>\bigvee' +exe s:pA8a.'bigwedge                <plug>\bigwedge' +exe s:pA8a.'coprod                  <plug>\coprod' +exe s:pA8a.'int                     <plug>\int' +exe s:pA8a.'oint                    <plug>\oint' +exe s:pA8a.'prod                    <plug>\prod' +exe s:pA8a.'sum                     <plug>\sum' +" }}} +" {{{ BinaryOp +let s:pA8 = s:pA."&BinaryOp." +exe s:pA8.'pm                       <plug>\pm ' +exe s:pA8.'mp                       <plug>\mp ' +exe s:pA8.'dotplus                  <plug>\dotplus ' +exe s:pA8.'cdot<Tab>`.              <plug>\cdot ' +exe s:pA8.'centerdot                <plug>\centerdot ' +exe s:pA8.'times<Tab>`*             <plug>\times ' +exe s:pA8.'ltimes                   <plug>\ltimes ' +exe s:pA8.'rtimes                   <plug>\rtimes ' +exe s:pA8.'leftthreetimes           <plug>\leftthreetimes ' +exe s:pA8.'rightthreetimes          <plug>\rightthreetimes ' +exe s:pA8.'div                      <plug>\div ' +exe s:pA8.'divideontimes            <plug>\divideontimes ' +exe s:pA8.'bmod                     <plug>\bmod ' +exe s:pA8.'ast                      <plug>\ast ' +exe s:pA8.'star                     <plug>\star ' +exe s:pA8.'setminus<Tab>`\\         <plug>\setminus ' +exe s:pA8.'smallsetminus            <plug>\smallsetminus ' +exe s:pA8.'diamond                  <plug>\diamond ' +exe s:pA8.'wr                       <plug>\wr ' +exe s:pA8.'intercal                 <plug>\intercal ' +exe s:pA8.'circ<Tab>`@              <plug>\circ ' +exe s:pA8.'bigcirc                  <plug>\bigcirc ' +exe s:pA8.'bullet                   <plug>\bullet ' +exe s:pA8.'cap                      <plug>\cap ' +exe s:pA8.'Cap                      <plug>\Cap ' +exe s:pA8.'cup                      <plug>\cup ' +exe s:pA8.'Cup                      <plug>\Cup ' +exe s:pA8.'sqcap                    <plug>\sqcap ' +exe s:pA8.'sqcup                    <plug>\sqcup' +exe s:pA8.'amalg                    <plug>\amalg ' +exe s:pA8.'uplus                    <plug>\uplus ' +exe s:pA8.'triangleleft             <plug>\triangleleft ' +exe s:pA8.'triangleright            <plug>\triangleright ' +exe s:pA8.'bigtriangleup            <plug>\bigtriangleup ' +exe s:pA8.'bigtriangledown          <plug>\bigtriangledown ' +exe s:pA8.'vee                      <plug>\vee ' +exe s:pA8.'veebar                   <plug>\veebar ' +exe s:pA8.'curlyvee                 <plug>\curlyvee ' +exe s:pA8.'wedge<Tab>`&             <plug>\wedge ' +exe s:pA8.'barwedge                 <plug>\barwedge ' +exe s:pA8.'doublebarwedge           <plug>\doublebarwedge ' +exe s:pA8.'curlywedge               <plug>\curlywedge ' +exe s:pA8.'oplus                    <plug>\oplus ' +exe s:pA8.'ominus                   <plug>\ominus ' +exe s:pA8.'otimes                   <plug>\otimes ' +exe s:pA8.'oslash                   <plug>\oslash ' +exe s:pA8.'boxplus                  <plug>\boxplus ' +exe s:pA8.'boxminus                 <plug>\boxminus ' +exe s:pA8.'boxtimes                 <plug>\boxtimes ' +exe s:pA8.'boxdot                   <plug>\boxdot ' +exe s:pA8.'odot                     <plug>\odot ' +exe s:pA8.'circledast               <plug>\circledast ' +exe s:pA8.'circleddash              <plug>\circleddash ' +exe s:pA8.'circledcirc              <plug>\circledcirc ' +exe s:pA8.'dagger                   <plug>\dagger ' +exe s:pA8.'ddagger                  <plug>\ddagger ' +exe s:pA8.'lhd                      <plug>\lhd ' +exe s:pA8.'unlhd                    <plug>\unlhd ' +exe s:pA8.'rhd                      <plug>\rhd ' +exe s:pA8.'unrhd                    <plug>\unrhd ' +" }}} +" {{{ Other1 +let s:pA9 = s:pA."&Other1." +exe s:pA9.'hat                      <plug>\hat ' +exe s:pA9.'check                    <plug>\check ' +exe s:pA9.'grave                    <plug>\grave ' +exe s:pA9.'acute                    <plug>\acute ' +exe s:pA9.'dot                      <plug>\dot ' +exe s:pA9.'ddot                     <plug>\ddot ' +exe s:pA9.'tilde<Tab>`,             <plug>\tilde ' +exe s:pA9.'breve                    <plug>\breve ' +exe s:pA9.'bar                      <plug>\bar ' +exe s:pA9.'vec                      <plug>\vec ' +exe s:pA9.'aleph                    <plug>\aleph ' +exe s:pA9.'hbar                     <plug>\hbar ' +exe s:pA9.'imath                    <plug>\imath ' +exe s:pA9.'jmath                    <plug>\jmath ' +exe s:pA9.'ell                      <plug>\ell ' +exe s:pA9.'wp                       <plug>\wp ' +exe s:pA9.'Re                       <plug>\Re ' +exe s:pA9.'Im                       <plug>\Im ' +exe s:pA9.'partial                  <plug>\partial ' +exe s:pA9.'infty<Tab>`8             <plug>\infty ' +exe s:pA9.'prime                    <plug>\prime ' +exe s:pA9.'emptyset                 <plug>\emptyset ' +exe s:pA9.'nabla                    <plug>\nabla ' +exe s:pA9.'surd                     <plug>\surd ' +exe s:pA9.'top                      <plug>\top ' +exe s:pA9.'bot                      <plug>\bot ' +exe s:pA9.'angle                    <plug>\angle ' +exe s:pA9.'triangle                 <plug>\triangle ' +exe s:pA9.'backslash                <plug>\backslash ' +exe s:pA9.'forall                   <plug>\forall ' +exe s:pA9.'exists                   <plug>\exists ' +exe s:pA9.'neg                      <plug>\neg ' +exe s:pA9.'flat                     <plug>\flat ' +exe s:pA9.'natural                  <plug>\natural ' +exe s:pA9.'sharp                    <plug>\sharp ' +exe s:pA9.'clubsuit                 <plug>\clubsuit ' +exe s:pA9.'diamondsuit              <plug>\diamondsuit ' +exe s:pA9.'heartsuit                <plug>\heartsuit ' +exe s:pA9.'spadesuit                <plug>\spadesuit ' +exe s:pA9.'S                        <plug>\S ' +exe s:pA9.'P                        <plug>\P' +" }}} +" {{{ MathCreating +let s:pA10 = s:pA."&MathCreating." +exe s:pA10.'not                     <plug>\not' +exe s:pA10.'mkern                   <plug>\mkern' +exe s:pA10.'mathbin                 <plug>\mathbin' +exe s:pA10.'mathrel                 <plug>\mathrel' +exe s:pA10.'stackrel                <plug>\stackrel' +exe s:pA10.'mathord                 <plug>\mathord' +" }}} +" {{{ Styles +let s:pA11 = s:pA."&Styles." +exe s:pA11.'displaystyle            <plug>\displaystyle' +exe s:pA11.'textstyle               <plug>\textstyle' +exe s:pA11.'scritpstyle             <plug>\scritpstyle' +exe s:pA11.'scriptscriptstyle       <plug>\scriptscriptstyle' +" }}} +" {{{ MathDiacritics +let s:pA12 = s:pA."&MathDiacritics." +exe s:pA12.'acute{}                 <plug><C-r>=IMAP_PutTextWithMovement("\\acute{<++>}<++>")<cr>' +exe s:pA12.'bar{}<Tab>`_            <plug><C-r>=IMAP_PutTextWithMovement("\\bar{<++>}<++>")<cr>' +exe s:pA12.'breve{}                 <plug><C-r>=IMAP_PutTextWithMovement("\\breve{<++>}<++>")<cr>' +exe s:pA12.'check{}                 <plug><C-r>=IMAP_PutTextWithMovement("\\check{<++>}<++>")<cr>' +exe s:pA12.'ddot{}<Tab>`:           <plug><C-r>=IMAP_PutTextWithMovement("\\ddot{<++>}<++>")<cr>' +exe s:pA12.'dot{}<Tab>`;            <plug><C-r>=IMAP_PutTextWithMovement("\\dot{<++>}<++>")<cr>' +exe s:pA12.'grave{}                 <plug><C-r>=IMAP_PutTextWithMovement("\\grave{<++>}<++>")<cr>' +exe s:pA12.'hat{}<Tab>`^            <plug><C-r>=IMAP_PutTextWithMovement("\\hat{<++>}<++>")<cr>' +exe s:pA12.'tilde{}<tab>`~          <plug><C-r>=IMAP_PutTextWithMovement("\\tilde{<++>}<++>")<cr>' +exe s:pA12.'vec{}                   <plug><C-r>=IMAP_PutTextWithMovement("\\vec{<++>}<++>")<cr>' +exe s:pA12.'widehat{}               <plug><C-r>=IMAP_PutTextWithMovement("\\widehat{<++>}<++>")<cr>' +exe s:pA12.'widetilde{}             <plug><C-r>=IMAP_PutTextWithMovement("\\widetilde{<++>}<++>")<cr>' +exe s:pA12.'imath                   <plug><C-r>=IMAP_PutTextWithMovement("\\imath")<cr>' +exe s:pA12.'jmath                   <plug><C-r>=IMAP_PutTextWithMovement("\\jmath")<cr>' +" }}} +" {{{ OverlineAndCo +let s:pA13 = s:pA."&OverlineAndCo." +exe s:pA13.'overline{}              <plug><C-r>=IMAP_PutTextWithMovement("\\overline{}")<cr>' +exe s:pA13.'underline{}             <plug><C-r>=IMAP_PutTextWithMovement("\\underline{}")<cr>' +exe s:pA13.'overrightarrow{}        <plug><C-r>=IMAP_PutTextWithMovement("\\overrightarrow{}")<cr>' +exe s:pA13.'overleftarrow{}         <plug><C-r>=IMAP_PutTextWithMovement("\\overleftarrow{}")<cr>' +exe s:pA13.'overbrace{}             <plug><C-r>=IMAP_PutTextWithMovement("\\overbrace{}")<cr>' +exe s:pA13.'underbrace{}            <plug><C-r>=IMAP_PutTextWithMovement("\\underbrace{}")<cr>' +" }}} +" {{{ Symbols1 +let s:pA14a = s:pA."&Symbols1." +exe s:pA14a.'forall                 <plug>\forall ' +exe s:pA14a.'exists                 <plug>\exists ' +exe s:pA14a.'nexists                <plug>\nexists ' +exe s:pA14a.'neg                    <plug>\neg ' +exe s:pA14a.'top                    <plug>\top ' +exe s:pA14a.'bot                    <plug>\bot ' +exe s:pA14a.'emptyset               <plug>\emptyset ' +exe s:pA14a.'varnothing             <plug>\varnothing ' +exe s:pA14a.'infty                  <plug>\infty ' +exe s:pA14a.'aleph                  <plug>\aleph ' +exe s:pA14a.'beth                   <plug>\beth ' +exe s:pA14a.'gimel                  <plug>\gimel ' +exe s:pA14a.'daleth                 <plug>\daleth ' +exe s:pA14a.'hbar                   <plug>\hbar ' +exe s:pA14a.'hslash                 <plug>\hslash ' +exe s:pA14a.'diagup                 <plug>\diagup ' +exe s:pA14a.'vert                   <plug>\vert ' +exe s:pA14a.'Vert                   <plug>\Vert ' +exe s:pA14a.'backslash              <plug>\backslash ' +exe s:pA14a.'diagdown               <plug>\diagdown ' +exe s:pA14a.'Bbbk                   <plug>\Bbbk ' +exe s:pA14a.'P                      <plug>\P ' +exe s:pA14a.'S                      <plug>\S ' +" }}} +" {{{ Symbols2 +let s:pA14b = s:pA."&Symbols2." +exe s:pA14b.'#                      <plug>\# ' +exe s:pA14b.'%                      <plug>\% ' +exe s:pA14b.'_                      <plug>\_ ' +exe s:pA14b.'$                      <plug>\$ ' +exe s:pA14b.'&                      <plug>\& ' +exe s:pA14b.'imath                  <plug>\imath ' +exe s:pA14b.'jmath                  <plug>\jmath ' +exe s:pA14b.'ell                    <plug>\ell ' +exe s:pA14b.'wp                     <plug>\wp ' +exe s:pA14b.'Re                     <plug>\Re ' +exe s:pA14b.'Im                     <plug>\Im ' +exe s:pA14b.'prime                  <plug>\prime ' +exe s:pA14b.'backprime              <plug>\backprime ' +exe s:pA14b.'nabla                  <plug>\nabla ' +exe s:pA14b.'surd                   <plug>\surd ' +exe s:pA14b.'flat                   <plug>\flat ' +exe s:pA14b.'sharp                  <plug>\sharp ' +exe s:pA14b.'natural                <plug>\natural ' +exe s:pA14b.'eth                    <plug>\eth ' +exe s:pA14b.'bigstar                <plug>\bigstar ' +exe s:pA14b.'circledS               <plug>\circledS ' +exe s:pA14b.'Finv                   <plug>\Finv ' +exe s:pA14b.'dag                    <plug>\dag ' +exe s:pA14b.'ddag                   <plug>\ddag ' +" }}} +" {{{ Symbols3 +let s:pA14c = s:pA."&Symbols3." +exe s:pA14c.'angle                  <plug>\angle ' +exe s:pA14c.'measuredangle          <plug>\measuredangle ' +exe s:pA14c.'sphericalangle         <plug>\sphericalangle ' +exe s:pA14c.'spadesuit              <plug>\spadesuit ' +exe s:pA14c.'heartsuit              <plug>\heartsuit ' +exe s:pA14c.'diamondsuit            <plug>\diamondsuit ' +exe s:pA14c.'clubsuit               <plug>\clubsuit ' +exe s:pA14c.'lozenge                <plug>\lozenge ' +exe s:pA14c.'blacklozenge           <plug>\blacklozenge ' +exe s:pA14c.'Diamond                <plug>\Diamond ' +exe s:pA14c.'triangle               <plug>\triangle ' +exe s:pA14c.'vartriangle            <plug>\vartriangle ' +exe s:pA14c.'blacktriangle          <plug>\blacktriangle ' +exe s:pA14c.'triangledown           <plug>\triangledown ' +exe s:pA14c.'blacktriangledown      <plug>\blacktriangledown ' +exe s:pA14c.'Box                    <plug>\Box ' +exe s:pA14c.'square                 <plug>\square ' +exe s:pA14c.'blacksquare            <plug>\blacksquare ' +exe s:pA14c.'complement             <plug>\complement ' +exe s:pA14c.'mho                    <plug>\mho ' +exe s:pA14c.'Game                   <plug>\Game ' +exe s:pA14c.'partial<Tab>`6         <plug>\partial ' +exe s:pA14c.'smallint               <plug>\smallint ' +" }}} +" {{{ Logic +let s:pA15 = s:pA."&Logic." +exe s:pA15.'lnot                    <plug>\lnot ' +exe s:pA15.'lor                     <plug>\lor ' +exe s:pA15.'land                    <plug>\land ' +" }}} +" {{{ Limits1 +let s:pA16 = s:pA."&Limits1." +exe s:pA16.'left                    <plug>\left' +exe s:pA16.'right                   <plug>\right' +exe s:pA16.'-sepbigl- :' +exe s:pA16.'bigl                    <plug>\bigl' +exe s:pA16.'Bigl                    <plug>\Bigl' +exe s:pA16.'biggl                   <plug>\biggl' +exe s:pA16.'Biggl                   <plug>\Biggl' +exe s:pA16.'-sepbigr- :' +exe s:pA16.'bigr                    <plug>\bigr' +exe s:pA16.'Bigr                    <plug>\Bigr' +exe s:pA16.'biggr                   <plug>\biggr' +exe s:pA16.'Biggr                   <plug>\Biggr' +exe s:pA16.'-sepbig- :' +exe s:pA16.'big                     <plug>\big' +exe s:pA16.'bigm                    <plug>\bigm' +exe s:pA16.'-sepfloor- :' +exe s:pA16.'lfloor                  <plug>\lfloor ' +exe s:pA16.'lceil                   <plug>\lceil ' +exe s:pA16.'rfloor                  <plug>\rfloor ' +exe s:pA16.'rceil                   <plug>\rceil ' +exe s:pA16.'-sepangle- :' +exe s:pA16.'langle                  <plug>\langle ' +exe s:pA16.'rangle                  <plug>\rangle ' +" }}} +" {{{ Limits2 +let s:pA16a = s:pA."&Limits2." +exe s:pA16a.'ulcorner               <plug>\ulcorner ' +exe s:pA16a.'urcorner               <plug>\urcorner ' +exe s:pA16a.'llcorner               <plug>\llcorner ' +exe s:pA16a.'rlcorner               <plug>\rlcorner ' +exe s:pA16a.'-sepcorner- :' +exe s:pA16a.'vert                   <plug>\vert ' +exe s:pA16a.'Vert                   <plug>\Vert ' +exe s:pA16a.'lvert                  <plug>\lvert ' +exe s:pA16a.'lVert                  <plug>\lVert ' +exe s:pA16a.'rvert                  <plug>\rvert ' +exe s:pA16a.'rVert                  <plug>\rVert ' +exe s:pA16a.'uparrow                <plug>\uparrow ' +exe s:pA16a.'Uparrow                <plug>\Uparrow ' +exe s:pA16a.'downarrow              <plug>\downarrow ' +exe s:pA16a.'Downarrow              <plug>\Downarrow ' +exe s:pA16a.'updownarrow            <plug>\updownarrow ' +exe s:pA16a.'Updownarrow            <plug>\Updownarrow ' +exe s:pA16a.'lgroup                 <plug>\lgroup ' +exe s:pA16a.'rgroup                 <plug>\rgroup ' +exe s:pA16a.'lmoustache             <plug>\lmoustache ' +exe s:pA16a.'rmoustache             <plug>\rmoustache ' +exe s:pA16a.'arrowvert              <plug>\arrowvert ' +exe s:pA16a.'Arrowvert              <plug>\Arrowvert ' +exe s:pA16a.'bracevert              <plug>\bracevert ' +" }}} +" {{{ Log-likes +let s:pA17 = s:pA."Lo&g-likes." +exe s:pA17.'arccos                  <plug>\arccos ' +exe s:pA17.'arcsin                  <plug>\arcsin ' +exe s:pA17.'arctan                  <plug>\arctan ' +exe s:pA17.'arg                     <plug>\arg ' +exe s:pA17.'cos                     <plug>\cos ' +exe s:pA17.'cosh                    <plug>\cosh ' +exe s:pA17.'cot                     <plug>\cot ' +exe s:pA17.'coth                    <plug>\coth ' +exe s:pA17.'csc                     <plug>\csc ' +exe s:pA17.'deg                     <plug>\deg ' +exe s:pA17.'det                     <plug>\det ' +exe s:pA17.'dim                     <plug>\dim ' +exe s:pA17.'exp                     <plug>\exp ' +exe s:pA17.'gcd                     <plug>\gcd ' +exe s:pA17.'hom                     <plug>\hom ' +exe s:pA17.'inf                     <plug>\inf ' +exe s:pA17.'injlim                  <plug>\injlim ' +exe s:pA17.'ker                     <plug>\ker ' +exe s:pA17.'lg                      <plug>\lg ' +exe s:pA17.'lim                     <plug>\lim ' +exe s:pA17.'liminf                  <plug>\liminf ' +exe s:pA17.'limsup                  <plug>\limsup ' +exe s:pA17.'ln                      <plug>\ln ' +exe s:pA17.'log                     <plug>\log ' +exe s:pA17.'max                     <plug>\max ' +exe s:pA17.'min                     <plug>\min ' +exe s:pA17.'Pr                      <plug>\Pr ' +exe s:pA17.'projlim                 <plug>\projlim ' +exe s:pA17.'sec                     <plug>\sec ' +exe s:pA17.'sin                     <plug>\sin ' +exe s:pA17.'sinh                    <plug>\sinh ' +exe s:pA17.'sup                     <plug>\sup ' +exe s:pA17.'tan                     <plug>\tan ' +exe s:pA17.'tanh                    <plug>\tanh ' +exe s:pA17.'varlimsup               <plug>\varlimsup ' +exe s:pA17.'varliminf               <plug>\varliminf ' +exe s:pA17.'varinjlim               <plug>\varinjlim ' +exe s:pA17.'varprojlim              <plug>\varprojlim ' +" }}} +" {{{ MathSpacing +let s:pA18 = s:pA."MathSpacing." +exe s:pA18.',                       <plug>\, ' +exe s:pA18.':                       <plug>\: ' +exe s:pA18.';                       <plug>\; ' +exe s:pA18.'[space]                 <plug>\  ' +exe s:pA18.'quad                    <plug>\quad ' +exe s:pA18.'qquad                   <plug>\qquad ' +exe s:pA18.'!                       <plug>\! ' +exe s:pA18.'thinspace               <plug>\thinspace ' +exe s:pA18.'medspace                <plug>\medspace ' +exe s:pA18.'thickspace              <plug>\thickspace ' +exe s:pA18.'negthinspace            <plug>\negthinspace ' +exe s:pA18.'negmedspace             <plug>\negmedspace ' +exe s:pA18.'negthickspace           <plug>\negthickspace ' +" 1}}} + +" vim:fdm=marker:ff=unix:noet:ts=4:sw=4 diff --git a/ftplugin/latex-suite/multicompile.vim b/ftplugin/latex-suite/multicompile.vim new file mode 100644 index 00000000..2e747623 --- /dev/null +++ b/ftplugin/latex-suite/multicompile.vim @@ -0,0 +1,16 @@ +" ============================================================================ +" 	     File: multicompile.vim +"      Author: Srinath Avadhanula +"     Created: Sat Jul 05 03:00 PM 2003  +" Description: compile a .tex file multiple times to get cross references +"              right. +"     License: Vim Charityware License +"              Part of vim-latexSuite: http://vim-latex.sourceforge.net +" ============================================================================ + +" The contents of this file have been moved to compiler.vim, the file which +" contains all functions relevant to compiling and viewing. +" This file is kept empty on purpose so that it will over-write previous +" versions of multicompile.vim, therby preventing conflicts. + +" vim:fdm=marker:nowrap:noet:ff=unix:ts=4:sw=4 diff --git a/ftplugin/latex-suite/packages.vim b/ftplugin/latex-suite/packages.vim new file mode 100644 index 00000000..49b4e489 --- /dev/null +++ b/ftplugin/latex-suite/packages.vim @@ -0,0 +1,676 @@ +"============================================================================= +" 	     File: packages.vim +"      Author: Mikolaj Machowski +"     Created: Tue Apr 23 06:00 PM 2002 PST +"  +"  Description: handling packages from within vim +"============================================================================= + +" avoid reinclusion. +if !g:Tex_PackagesMenu || exists('s:doneOnce') +	finish +endif +let s:doneOnce = 1 + +let s:path = fnameescape(expand("<sfile>:p:h")) + +let s:menu_div = 20 + +com! -nargs=0 TPackageUpdate :silent! call Tex_pack_updateall(1) +com! -nargs=0 TPackageUpdateAll :silent! call Tex_pack_updateall(1) + +" Custom command-line completion of Tcommands is very useful but this feature +" is available only in Vim 6.2 and above. Check number of version and choose +" proper command and function. +if v:version >= 602 +	com! -complete=custom,Tex_CompletePackageName -nargs=* TPackage let s:retVal = Tex_pack_one(<f-args>) <bar> normal! i<C-r>=s:retVal<CR> + +	" Tex_CompletePackageName: for completing names in TPackage command {{{ +	"	Description: get list of package names with globpath(), remove full path +	"	and return list of names separated with newlines. +	" +	function! Tex_CompletePackageName(A,P,L) +		" Get name of packages from all runtimepath directories +		let packnames = Tex_FindInRtp('', 'packages') +		let packnames = substitute(packnames, '^,', '', 'e') +		" Separate names with \n not , +		let packnames = substitute(packnames,',','\n','g') +		return packnames +	endfunction +	" }}} +	 +else  +	com! -nargs=* TPackage let s:retVal = Tex_pack_one(<f-args>) <bar> normal! i<C-r>=s:retVal<CR> + +endif + +imap <silent> <plug> <Nop> +nmap <silent> <plug> i + +let g:Tex_package_supported = '' +let g:Tex_package_detected = '' +" Remember the defaults because we want g:Tex_PromptedEnvironments to contain +" in addition to the default, \newenvironments, and the \newenvironments might +" change... +let g:Tex_PromptedEnvironmentsDefault = g:Tex_PromptedEnvironments +let g:Tex_PromptedCommandsDefault = g:Tex_PromptedCommands + + +" Tex_pack_check: creates the package menu and adds to 'dict' setting. {{{ +" +function! Tex_pack_check(package) +	" Use Tex_FindInRtp() function to get first name from packages list in all +	" rtp directories conforming with latex-suite directories hierarchy +	" Store names in variables to process functions only once. +	let packname = Tex_FindInRtp(a:package, 'packages') +	if packname != '' +		exe 'runtime! ftplugin/latex-suite/packages/' . a:package +		if has("gui_running") +			call Tex_pack(a:package) +		endif +		if g:Tex_package_supported !~ a:package +			let g:Tex_package_supported = g:Tex_package_supported.','.a:package +		endif +	endif +	" Return full list of dictionaries (separated with ,) for package in &rtp +	call Tex_Debug("Tex_pack_check: searching for ".a:package." in dictionaries/ in &rtp", "pack") +	let dictname = Tex_FindInRtp(a:package, 'dictionaries', ':p') +	if dictname != '' +		exe 'setlocal dict^=' . dictname +		call Tex_Debug('Tex_pack_check: setlocal dict^=' . dictname, 'pack') +		if g:Tex_package_supported !~ a:package +			let g:Tex_package_supported = g:Tex_package_supported.','.a:package +		endif +	endif +	if g:Tex_package_detected !~ '\<'.a:package.'\>' +		let g:Tex_package_detected = g:Tex_package_detected.','.a:package +	endif +	let g:Tex_package_detected = substitute(g:Tex_package_detected, '^,', '', '') +	let g:Tex_package_supported = substitute(g:Tex_package_supported, '^,', '', '') +endfunction + +" }}} +" Tex_pack_uncheck: removes package from menu and 'dict' settings. {{{ +function! Tex_pack_uncheck(package) +	if has("gui_running") && Tex_FindInRtp(a:package, 'packages') != '' +		exe 'silent! aunmenu '.g:Tex_PackagesMenuLocation.'-sep'.a:package.'-' +		exe 'silent! aunmenu '.g:Tex_PackagesMenuLocation.a:package.'\ Options' +		exe 'silent! aunmenu '.g:Tex_PackagesMenuLocation.a:package.'\ Commands' +	endif +	if Tex_FindInRtp(a:package, 'dictionaries') != '' +		exe 'setlocal dict-='.Tex_FindInRtp(a:package, 'dictionaries') +	endif +endfunction + +" }}} +" Tex_pack_updateall: updates the TeX-Packages menu {{{ +" Description: +" 	This function first calls Tex_pack_all to scan for \usepackage's etc if +" 	necessary. After that, it 'supports' and 'unsupports' packages as needed +" 	in such a way as to not repeat work. +function! Tex_pack_updateall(force) +	call Tex_Debug('+Tex_pack_updateall', 'pack') + +	" Find out which file we need to scan. +	let fname = Tex_GetMainFileName(':p') + +	" If this is the same as last time, don't repeat. +	if !a:force && exists('s:lastScannedFile') && +				\ s:lastScannedFile == fname +		return +	endif +	" Remember which file we scanned for next time. +	let s:lastScannedFile = fname + +	" Remember which packages we detected last time. +	if exists('g:Tex_package_detected') +		let oldpackages = g:Tex_package_detected +	else +		let oldpackages = '' +	endif + +	" This sets up a global variable of all detected packages. +	let g:Tex_package_detected = '' +	" reset the environments and commands. +	let g:Tex_PromptedEnvironments = g:Tex_PromptedEnvironmentsDefault +	let g:Tex_PromptedCommands = g:Tex_PromptedCommandsDefault + +	if expand('%:p') != fname +		call Tex_Debug(':Tex_pack_updateall: sview '.Tex_EscapeSpaces(fname), 'pack') +		exe 'sview '.Tex_EscapeSpaces(fname) +	else +		call Tex_Debug(':Tex_pack_updateall: split', 'pack') +		split +	endif +		 +	call Tex_ScanForPackages() +	q + +	call Tex_Debug(':Tex_pack_updateall: detected ['.g:Tex_package_detected.'] in first run', 'pack') +	 +	" Now for each package find out if this is a custom package and if so, +	" scan that as well. We will use the ':find' command in vim to let vim +	" search through the file paths for us. +	" +	" NOTE: This while loop will also take into account packages included +	"       within packages to any level of recursion as long as +	"       g:Tex_package_detected is always padded with new package names +	"       from the end. +	" +	" First set the &path setting to the user's TEXINPUTS setting. +	let _path = &path +	let _suffixesadd = &suffixesadd + +	let &path = '.,'.g:Tex_TEXINPUTS +	let &suffixesadd = '.sty,.tex' + +	let scannedPackages = '' + +	let i = 1 +	let packname = Tex_Strntok(g:Tex_package_detected, ',', i) +	while packname != '' + +		call Tex_Debug(':Tex_pack_updateall: scanning package '.packname, 'pack') + +		" Scan this package only if we have not scanned it before in this +		" run. +		if scannedPackages =~ '\<'.packname.'\>' +			let i = i + 1 + +			call Tex_Debug(':Tex_pack_updateall: '.packname.' already scanned', 'pack') +			let packname = Tex_Strntok(g:Tex_package_detected, ',', i) +			continue +		endif  + +		" Split this window in two. The packages/files being found will open +		" in this new window and we also need not bother with files being +		" modified etc. +		split + +		call Tex_Debug(':Tex_pack_updateall: silent! find '.Tex_EscapeSpaces(packname).'.sty', 'pack') +		let thisbufnum = bufnr('%') +		exec 'silent! find '.Tex_EscapeSpaces(packname).'.sty' +		call Tex_Debug(':Tex_pack_updateall: present file = '.bufname('%'), 'pack') + +		" If this file was not found, assume that it means its not a +		" custom package and mark it "scanned". +		" A package is not found if we stay in the same buffer as before and +		" its not the one where we want to go. +		if bufnr('%') == thisbufnum && bufnr('%') != bufnr(packname.'.sty') +			let scannedPackages = scannedPackages.','.packname +			q + +			call Tex_Debug(':Tex_pack_updateall: '.packname.' not found anywhere', 'pack') +			let i = i + 1 +			let packname = Tex_Strntok(g:Tex_package_detected, ',', i) +			continue +		endif + +		" otherwise we are presently editing a custom package, scan it for +		" more \usepackage lines from the first line to the last. +		let packpath = expand('%:p') +		let &complete = &complete.'s'.packpath + +		call Tex_Debug(':Tex_pack_updateall: found custom package '.packpath, 'pack') +		call Tex_ScanForPackages(line('$'), line('$')) +		call Tex_Debug(':Tex_pack_updateall: After scanning, g:Tex_package_detected = '.g:Tex_package_detected, 'pack') + +		let scannedPackages = scannedPackages.','.packname +		" Do not use bwipe, but that leads to excessive buffer number +		" consumption. Besides, its intuitive for a custom package to remain +		" on the buffer list. +		q + +		let i = i + 1 +		let packname = Tex_Strntok(g:Tex_package_detected, ',', i) +	endwhile + +	let &path = _path +	let &suffixesadd = _suffixesadd + +	" Now only support packages we didn't last time. +	" First remove packages which were used last time but are no longer used. +	let i = 1 +	let oldPackName = Tex_Strntok(oldpackages, ',', i) +	while oldPackName != '' +		if g:Tex_package_detected !~ oldPackName +			call Tex_pack_uncheck(oldPackName) +		endif +		let i = i + 1 +		let oldPackName = Tex_Strntok(oldpackages, ',', i) +	endwhile + +	" Then support packages which are used this time but weren't used last +	" time. +	let i = 1 +	let newPackName = Tex_Strntok(g:Tex_package_detected, ',', i) +	while newPackName != '' +		if oldpackages !~ newPackName +			call Tex_pack_one(newPackName) +		endif +		let i = i + 1 +		let newPackName = Tex_Strntok(g:Tex_package_detected, ',', i) +	endwhile + +	" Throw an event that we are done scanning packages. Some packages might +	" use this to change behavior based on which options have been used etc. +	call Tex_Debug(":Tex_pack_updateall: throwing LatexSuiteScannedPackages event", "pack") +	silent! do LatexSuite User LatexSuiteScannedPackages + +	call Tex_Debug("-Tex_pack_updateall", "pack") +endfunction + +" }}} +" Tex_pack_one: supports each package in the argument list.{{{ +" Description: +"   If no arguments are supplied, then the user is asked to choose from the +"   packages found in the packages/ directory +function! Tex_pack_one(...) +	if a:0 == 0 || (a:0 > 0 && a:1 == '') +		let packlist = Tex_FindInRtp('', 'packages') +		let packname = Tex_ChooseFromPrompt( +					\ "Choose a package: \n" .  +					\ Tex_CreatePrompt(packlist, '3', ',') . +					\ "\nEnter number or filename :",  +					\ packlist, ',') +		if packname != '' +			return Tex_pack_one(packname) +		else +			return '' +		endif +	else +		" Support the packages supplied. This function can be called with +		" multiple arguments in which case, support each of them in turn. +		let retVal = '' +		let omega = 1 +		while omega <= a:0 +			let packname = a:{omega} +			if Tex_FindInRtp(packname, 'packages') != '' +				call Tex_pack_check(packname) +				if exists('g:TeX_package_option_'.packname) +						\ && g:TeX_package_option_{packname} != '' +					let retVal = retVal.'\usepackage[<++>]{'.packname.'}<++>' +				else +					let retVal = retVal.'\usepackage{'.packname.'}'."\<CR>" +				endif +			else +				let retVal = retVal.'\usepackage{'.packname.'}'."\<CR>" +			endif +			let omega = omega + 1 +		endwhile +		return IMAP_PutTextWithMovement(substitute(retVal, "\<CR>$", '', ''), '<+', '+>') +	endif +endfunction +" }}} +" Tex_ScanForPackages: scans the current file for \usepackage{} lines {{{ +"   and if supported, loads the options and commands found in the +"   corresponding package file. Also scans for \newenvironment and +"   \newcommand lines and adds names to g:Tex_Prompted variables, they can be +"   easy available through <F5> and <F7> shortcuts  +function! Tex_ScanForPackages(...) +	call Tex_Debug("+Tex_ScanForPackages", "pack") + +	let pos = Tex_GetPos() + +	" For package files without \begin and \end{document}, we might be told to +	" search from beginning to end. +	if a:0 < 2 +		0 +		let beginline = search('\\begin{document}', 'W') +		let endline = search('\\end{document}', 'W') +		0 +	else +		let beginline = a:1 +		let endline = a:2 +	endif + +	call Tex_Debug(":Tex_ScanForPackages: Begining scans in [".bufname('%')."], beginline = ".beginline, "pack") +	 + +	" Scan the file. First open up all the folds, because the command +	" /somepattern +	" issued in a closed fold _always_ goes to the first match. +	let erm = v:errmsg +	silent! normal! ggVGzO +	let v:errmsg = erm + +	call Tex_Debug(":Tex_ScanForPackages: beginning scan for \\usepackage lines", "pack") +	" The wrap trick enables us to match \usepackage on the first line as +	" well. +	let wrap = 'w' +	while search('^\s*\\usepackage\_.\{-}{\_.\+}', wrap) +		let wrap = 'W' + +		if line('.') > beginline  +			break +		endif + +		let saveUnnamed = @" +		let saveA = @a + +		" If there are options, then find those. +		if getline('.') =~ '\\usepackage\[.\{-}\]' +			let options = matchstr(getline('.'), '\\usepackage\[\zs.\{-}\ze\]') +		elseif getline('.') =~ '\\usepackage\[' +			" Entering here means that the user has split the \usepackage +			" across newlines. Therefore, use yank. +			exec "normal! /{\<CR>\"ayi}" +			let options = @a +		else +			let options = '' +		endif + +		" The following statement puts the stuff between the { }'s of a +		" \usepackage{stuff,foo} into @a. Do not use matchstr() and the like +		" because we can have things split across lines and such. +       	exec "normal! /{\<CR>\"ay/}\<CR>" + +		" now remove all whitespace from @a. We need to remove \n and \r +		" because we can encounter stuff like +		" \usepackage{pack1, +		"             newpackonanotherline} +		let @a = substitute(@a, "[ \t\n\r]", '', 'g') + +		" Now we have something like pack1,pack2,pack3 with possibly commas +		" and stuff before the first package and after the last package name. +		" Remove those. +		let @a = substitute(@a, '\(^\W*\|\W*$\)', '', 'g') + +		" This gets us a string like 'pack1,pack2,pack3' +		" TODO: This will contain duplicates if the user has duplicates. +		"       Should we bother taking care of this? +		let g:Tex_package_detected = g:Tex_package_detected.','.@a + +		" For each package found, form a global variable of the form +		" g:Tex_{packagename}_options  +		" which contains a list of the options. +		let j = 1 +		while Tex_Strntok(@a, ',', j) != '' +			let g:Tex_{Tex_Strntok(@a, ',', j)}_options = options +			let j = j + 1 +		endwhile + +		" Finally convert @a into something like '"pack1","pack2"' +		let @a = substitute(@a, '^\|$', '"', 'g') +		let @a = substitute(@a, ',', '","', 'g') + +		call Tex_Debug(":Tex_ScanForPackages: found package(s) [".@a."] on line ".line('.'), "pack") + +		" restore @a +		let @a = saveA +		let @" = saveUnnamed +	endwhile +	call Tex_Debug(":Tex_ScanForPackages: End scan \\usepackage, detected packages = ".g:Tex_package_detected, "pack") + +	" TODO: This needs to be changed. In the future, we might have +	" functionality to remember the fold-state before opening up all the folds +	" and then re-creating them. Use mkview.vim. +	let erm = v:errmsg +	silent! normal! ggVGzC +	let v:errmsg = erm + +	" Because creating list of detected packages gives string +	" ',pack1,pack2,pack3' remove leading , +	let g:Tex_package_detected = substitute(g:Tex_package_detected, '^,', '', '') + +	call Tex_Debug(":Tex_ScanForPackages: Beginning scan for \\newcommand's", "pack") +	" Scans whole file (up to \end{document}) for \newcommand and adds this +	" commands to g:Tex_PromptedCommands variable, it is easily available +	" through <F7> +	0  +	while search('^\s*\\newcommand\*\?{.\{-}}', 'W') + +		if line('.') > endline  +			break +		endif + +		let newcommand = matchstr(getline('.'), '\\newcommand\*\?{\\\zs.\{-}\ze}') +		let g:Tex_PromptedCommands = g:Tex_PromptedCommands . ',' . newcommand + +	endwhile + +	" Scans whole file (up to \end{document}) for \newenvironment and adds this +	" environments to g:Tex_PromptedEnvironments variable, it is easily available +	" through <F5> +	0 +	call Tex_Debug(":Tex_ScanForPackages: Beginning scan for \\newenvironment's", 'pack') + +	while search('^\s*\\newenvironment\*\?{.\{-}}', 'W') +		call Tex_Debug('found newenvironment on '.line('.'), 'pack') + +		if line('.') > endline  +			break +		endif + +		let newenvironment = matchstr(getline('.'), '\\newenvironment\*\?{\zs.\{-}\ze}') +		let g:Tex_PromptedEnvironments = g:Tex_PromptedEnvironments . ',' . newenvironment + +	endwhile + +	call Tex_SetPos(pos) +	" first make a random search so that we push at least one item onto the +	" search history. Since vim puts only one item in the history per function +	" call, this way we make sure that one and only item is put into the +	" search history. +	normal! /^<CR> +	" now delete it... +	call histdel('/', -1) + +	call Tex_Debug("-Tex_ScanForPackages", "pack") +endfunction +    +" }}} +" Tex_pack_supp_menu: sets up a menu for package files {{{ +"   found in the packages directory groups the packages thus found into groups +"   of 20... +function! Tex_pack_supp_menu() +	let suplist = Tex_FindInRtp('', 'packages') + +	call Tex_MakeSubmenu(suplist, g:Tex_PackagesMenuLocation.'Supported.',  +		\ '<plug><C-r>=Tex_pack_one("', '")<CR>') +endfunction  + +" }}} +" Tex_pack: loads the options (and commands) for the given package {{{ +function! Tex_pack(pack) +	if exists('g:TeX_package_'.a:pack) + +		let optionList = g:TeX_package_option_{a:pack}.',' +		let commandList = g:TeX_package_{a:pack}.',' + +		" Don't create separator if in package file are only Vim commands.  +		" Rare but possible. +		if !(commandList == ',' && optionList == ',') +			exec 'amenu '.g:Tex_PackagesMenuLocation.'-sep'.a:pack.'- <Nop>' +		endif + +		if optionList != '' + +			let mainMenuName = g:Tex_PackagesMenuLocation.a:pack.'\ Options.' +			call s:GroupPackageMenuItems(optionList, mainMenuName,  +				\ '<plug><C-r>=IMAP_PutTextWithMovement("', ',")<CR>') + +		endif + +		if commandList != '' + +			let mainMenuName = g:Tex_PackagesMenuLocation.a:pack.'\ Commands.' +			call s:GroupPackageMenuItems(commandList, mainMenuName,  +				\ '<plug><C-r>=Tex_ProcessPackageCommand("', '")<CR>', +				\ '<SID>FilterPackageMenuLHS') +		endif +	endif +endfunction  + +" }}} + +" ============================================================================== +" Menu Functions +" Creating menu items for the all the package files found in the packages/ +" directory as well as creating menus for each supported package found in the +" preamble. +" ==============================================================================  +" Tex_MakeSubmenu: makes a submenu given a list of items {{{ +" Description:  +"   This function takes a comma seperated list of menu items and creates a +"   'grouped' menu. i.e, it groups the items into s:menu_div items each and +"   puts them in submenus of the given mainMenu. +"   Each menu item is linked to the HandlerFunc. +"   If an additional argument is supplied, then it is used to filter each of +"   the menu items to generate better names for the menu display. +" +function! Tex_MakeSubmenu(menuList, mainMenuName,  +				\ handlerFuncLHS, handlerFuncRHS, ...) + +	let extractFunction = (a:0 > 0 ? a:1 : '' ) +	let menuList = substitute(a:menuList, '[^,]$', ',', '') + +	let doneMenuSubmenu = 0 + +	while menuList != '' + +		" Extract upto s:menu_div menus at once. +		let menuBunch = matchstr(menuList, '\v(.{-},){,'.s:menu_div.'}') + +		" The remaining menus go into the list. +		let menuList = strpart(menuList, strlen(menuBunch)) + +		let submenu = '' +		" If there is something remaining, then we got s:menu_div items. +		" therefore put these menu items into a submenu. +		if strlen(menuList) || doneMenuSubmenu +			exec 'let firstMenu = '.extractFunction."(matchstr(menuBunch, '\\v^.{-}\\ze,'))" +			exec 'let lastMenu = '.extractFunction."(matchstr(menuBunch, '\\v[^,]{-}\\ze,$'))" + +			let submenu = firstMenu.'\ \-\ '.lastMenu.'.' + +			let doneMenuSubmenu = 1 +		endif + +		" Now for each menu create a menu under the submenu +		let i = 1 +		let menuName = Tex_Strntok(menuBunch, ',', i) +		while menuName != '' +			exec 'let menuItem = '.extractFunction.'(menuName)' +			execute 'amenu '.a:mainMenuName.submenu.menuItem +				\ '       '.a:handlerFuncLHS.menuName.a:handlerFuncRHS + +			let i = i + 1 +			let menuName = Tex_Strntok(menuBunch, ',', i) +		endwhile +	endwhile +endfunction  + +" }}} +" GroupPackageMenuItems: uses the sbr: to split menus into groups {{{ +" Description:  +"   This function first splits up the menuList into groups based on the +"   special sbr: tag and then calls Tex_MakeSubmenu  +"  +function! <SID>GroupPackageMenuItems(menuList, menuName,  +					\ handlerFuncLHS, handlerFuncRHS,...) + +	if a:0 > 0 +		let extractFunction = a:1 +	else +		let extractFunction = '' +	endif +	let menuList = a:menuList + +	while matchstr(menuList, 'sbr:') != '' +		let groupName = matchstr(menuList, '\v^sbr:\zs.{-}\ze,') +		let menuList = strpart(menuList, strlen('sbr:'.groupName.',')) +		if matchstr(menuList, 'sbr:') != '' +			let menuGroup = matchstr(menuList, '\v^.{-},\zesbr:') +		else +			let menuGroup = menuList +		endif + +		call Tex_MakeSubmenu(menuGroup, a:menuName.groupName.'.',  +			\ a:handlerFuncLHS, a:handlerFuncRHS, extractFunction) + +		let menuList = strpart(menuList, strlen(menuGroup)) +	endwhile + +	call Tex_MakeSubmenu(menuList, a:menuName, +		\ a:handlerFuncLHS, a:handlerFuncRHS, extractFunction) + +endfunction " }}} +" Definition of what to do for various package commands {{{ +let s:CommandSpec_brs = '\<+replace+><++>' +let s:CommandSpec_bra = '\<+replace+>{<++>}<++>' +let s:CommandSpec_brd = '\<+replace+>{<++>}{<++>}<++>' + +let s:CommandSpec_nor = '\<+replace+>' +let s:CommandSpec_noo = '\<+replace+>[<++>]' +let s:CommandSpec_nob = '\<+replace+>[<++>]{<++>}{<++>}<++>' + +let s:CommandSpec_env = '\begin{<+replace+>}'."\<CR><++>\<CR>".'\end{<+replace+>}<++>' +let s:CommandSpec_ens = '\begin{<+replace+>}<+extra+>'."\<CR><++>\<CR>".'\end{<+replace+>}<++>' +let s:CommandSpec_eno = '\begin[<++>]{<+replace+>}'."\<CR><++>\<CR>".'\end{<+replace+>}' + +let s:CommandSpec_spe = '<+replace+>' +let s:CommandSpec_    = '\<+replace+>' + +let s:MenuLHS_bra = '\\&<+replace+>{}' +let s:MenuLHS_brs = '\\&<+replace+>{}' +let s:MenuLHS_brd = '\\&<+replace+>{}{}' +let s:MenuLHS_env = '&<+replace+>\ (E)' +let s:MenuLHS_ens = '&<+replace+>\ (E)' +let s:MenuLHS_eno = '&<+replace+>\ (E)' +let s:MenuLHS_nor = '\\&<+replace+>' +let s:MenuLHS_noo = '\\&<+replace+>[]' +let s:MenuLHS_nob = '\\&<+replace+>[]{}{}' +let s:MenuLHS_spe = '&<+replace+>' +let s:MenuLHS_sep = '-sep<+replace+>-' +let s:MenuLHS_    = '\\&<+replace+>' +" }}} +" Tex_ProcessPackageCommand: processes a command from the package menu {{{ +" Description:  +function! Tex_ProcessPackageCommand(command) +	if a:command =~ ':' +		let commandType = matchstr(a:command, '^\w\+\ze:') +		let commandName = matchstr(a:command, '^\w\+:\zs[^:]\+\ze:\?') +		let extrapart = strpart(a:command, strlen(commandType.':'.commandName.':')) +	else +		let commandType = '' +		let commandName = a:command +		let extrapart = '' +	endif + +	let command = s:CommandSpec_{commandType} +	let command = substitute(command, '<+replace+>', commandName, 'g') +	let command = substitute(command, '<+extra+>', extrapart, 'g') +	return IMAP_PutTextWithMovement(command) +endfunction  +" }}} +" FilterPackageMenuLHS: filters the command description to provide a better menu item {{{ +" Description:  +function! <SID>FilterPackageMenuLHS(command) +	let commandType = matchstr(a:command, '^\w\+\ze:') +	if commandType != '' +		let commandName = strpart(a:command, strlen(commandType.':')) +	else +		let commandName = a:command +	endif + +	return substitute(s:MenuLHS_{commandType}, '<+replace+>', commandName, 'g') +endfunction " }}} + +if g:Tex_Menus +	exe 'amenu '.g:Tex_PackagesMenuLocation.'&UpdatePackage :call Tex_pack(expand("<cword>"))<cr>' +	exe 'amenu '.g:Tex_PackagesMenuLocation.'&UpdateAll :call Tex_pack_updateall(1)<cr>' + + 	call Tex_pack_supp_menu() +endif + +augroup LatexSuite +	au LatexSuite User LatexSuiteFileType  +		\ call Tex_Debug('packages.vim: Catching LatexSuiteFileType event', 'pack') |  +		\ let s:save_clipboard = &clipboard | +		\ set clipboard= | +		\ call Tex_pack_updateall(0) | +		\ let &clipboard=s:save_clipboard +augroup END + +" vim:fdm=marker:ts=4:sw=4:noet:ff=unix diff --git a/ftplugin/latex-suite/projecttemplate.vim b/ftplugin/latex-suite/projecttemplate.vim new file mode 100644 index 00000000..1ab4be02 --- /dev/null +++ b/ftplugin/latex-suite/projecttemplate.vim @@ -0,0 +1,11 @@ +" Project name +" let g:projName = '' +" +" Project files +" let g:projFiles = ''  + + +" Vim settings/maps/abbrs specific for this project + +" Modeline for this file +" vim:fdm=marker:ff=unix:noet:ts=4:sw=4:ft=vim diff --git a/ftplugin/latex-suite/smartspace.vim b/ftplugin/latex-suite/smartspace.vim new file mode 100644 index 00000000..07526d8d --- /dev/null +++ b/ftplugin/latex-suite/smartspace.vim @@ -0,0 +1,102 @@ +"============================================================================= +" 	     File: smartspace.vim +"      Author: Carl Muller +"     Created: Fri Dec 06 12:00 AM 2002 PST +"  +" Description:  +"     Maps the <space> key in insert mode so that mathematical formulaes are +"     always kept on the same line. i.e, $$'s dont get broken across multiple +"     lines. +"============================================================================= + +" Avoid reinclusion or if the user doesn't want us. +if exists('b:done_smartspace')  +	\ || (exists('g:Tex_SmartKeySpace') && !g:Tex_SmartKeySpace) +	finish +endif +let b:done_smartspace = 1 + +" Smart space relies on taking over vim's insertion of carriage returns in +" order to keep $$'s on the same line. The only way to get vim not to break +" lines is to set tw=0.  +" +" NOTE: setting tw != 0 will break smartspace +"       the user's 'tw' setting is still respected in the insert mode. +"       However, normal mode actions which rely on 'tw' such as gqap will be +"       broken because of the faulty 'tw' setting. +let b:tw = &l:tw +setlocal tw=0 + +inoremap <buffer> <silent> <Space> <Space><Esc>:call <SID>TexFill(b:tw)<CR>a + +" Do not redefine the function. +if exists('*s:TexFill') +	finish +endif + +" TexFormatLine: format line retaining $$'s on the same line. {{{ +function! s:TexFill(width)  +	if a:width != 0 && col(".") > a:width +		" For future use, record the current line and the number of the current column +		let current_line = getline(".") +		let current_column = col(".") +		exe "normal! a##\<Esc>" +		call <SID>TexFormatLine(a:width,current_line,current_column) +		exe "normal! ?##\<CR>2s\<Esc>" +		" Remove ## from the search history. +		call histdel("/", -1)|let @/=histget("/", -1) +	endif +endfunction + +" }}} +function! s:TexFormatLine(width, current_line, current_column)    " {{{ +	" get the first non-blank character. +	let first = matchstr(getline('.'), '\S') +	normal! $ +	let length = col('.') +	let go = 1 +	while length > a:width+2 && go +		let between = 0 +		let string = strpart(getline('.'), 0, a:width) +		" Count the dollar signs +		let number_of_dollars = 0 +		let evendollars = 1 +		let counter = 0 +		while counter <= a:width-1 +			" Pay attention to '$$'. +			if string[counter] == '$' && string[counter-1] != '$' +				let evendollars = 1 - evendollars +				let number_of_dollars = number_of_dollars + 1 +			endif +			let counter = counter + 1 +		endwhile +		" Get ready to split the line. +		exe 'normal! ' . (a:width + 1) . '|' +		if evendollars +			" Then you are not between dollars. +			exe "normal! ?\\$\\+\\| \<CR>W" +		else +			" Then you are between dollars. +			normal! F$ +			if col(".") == 1 || getline('.')[col(".")-1] != "$" +				let go = 0 +			endif +		endif +		if first == '$' && number_of_dollars == 1 +			let go = 0 +		else +			exe "normal! i\<CR>\<Esc>$" +			" get the first non-blank character. +			let first = matchstr(getline('.'), '\S') +		endif +		let length = col(".") +	endwhile +	if go == 0 && strpart(a:current_line, 0, a:current_column) =~ '.*\$.*\$.*' +		exe "normal! ^f$a\<CR>\<Esc>" +		call <SID>TexFormatLine(a:width, a:current_line, a:current_column) +	endif +endfunction + +" }}} + +" vim:fdm=marker:ts=4:sw=4:noet diff --git a/ftplugin/latex-suite/templates.vim b/ftplugin/latex-suite/templates.vim new file mode 100644 index 00000000..ad1bbecd --- /dev/null +++ b/ftplugin/latex-suite/templates.vim @@ -0,0 +1,148 @@ +"============================================================================= +" 	     File: templates.vim +"      Author: Gergely Kontra +"              (minor modifications by Srinath Avadhanula) +"              (plus other modifications by Mikolaj Machowski)  +" 	  Version: 1.0  +"     Created: Tue Apr 23 05:00 PM 2002 PST +"  +"  Description: functions for handling templates in latex-suite/templates +"               directory. +"============================================================================= + +let s:path = fnameescape(expand("<sfile>:p:h")) + +" SetTemplateMenu: sets up the menu for templates {{{ +function! <SID>SetTemplateMenu() +	let flist = Tex_FindInRtp('', 'templates') +	let i = 1 +	while 1 +		let fname = Tex_Strntok(flist, ',', i) +		if fname == '' +			break +		endif +		exe "amenu ".g:Tex_TemplatesMenuLocation."&".i.":<Tab>".fname." ". +			\":call <SID>ReadTemplate('".fname."')<CR>" +		let i = i + 1 +	endwhile +endfunction  + +if g:Tex_Menus +	call <SID>SetTemplateMenu() +endif + +" }}} +" ReadTemplate: reads in the template file from the template directory. {{{ +function! <SID>ReadTemplate(...) +	if a:0 > 0 +		let filename = a:1 +	else +		let filelist = Tex_FindInRtp('', 'templates') +		let filename =  +					\ Tex_ChooseFromPrompt("Choose a template file:\n" .  +					\ Tex_CreatePrompt(filelist, 2, ',') .  +					\ "\nEnter number or name of file :",  +					\ filelist, ',') +	endif + +	let fname = Tex_FindInRtp(filename.'.tex', 'templates', ':p') +	call Tex_Debug("0read ".fname, 'templates') + +	silent! exe "0read ".fname + +	" The first line of the file contains the specifications of what the +	" placeholder characters and the other special characters are. +	let pattern = '\v(\S+)\t(\S+)\t(\S+)\t(\S+)' + +	let s:phsTemp = substitute(getline(1), pattern, '\1', '') +	let s:pheTemp = substitute(getline(1), pattern, '\2', '') +	let s:exeTemp = substitute(getline(1), pattern, '\3', '') +	let s:comTemp = substitute(getline(1), pattern, '\4', '') + +	0 d_ + +	call s:ProcessTemplate() +	call Tex_pack_updateall(1) + +	" Do not handle the placeholders here. Let IMAP_PutTextWithMovement do it +	" because it handles UTF-8 character substitutions etc. Therefore delete +	" the text into @a and paste it using IMAP_PutTextWithMovement(). +	let _a = @a +	normal! ggVG"ax +	 +	let _fo = &fo +	" Since IMAP_PutTextWithMovement simulates the key-presses, leading +	" indendatation can get duplicated in strange ways if ``fo`` is non-empty. +	" NOTE: the indentexpr thingie is still respected with an empty fo so that +	" 	    environments etc are properly indented. +	set fo= + +	call Tex_Debug("normal! i\<C-r>=IMAP_PutTextWithMovement(@a, '".s:phsTemp."', '".s:pheTemp."')\<CR>", 'templates') +	exec "normal! i\<C-r>=IMAP_PutTextWithMovement(@a, '".s:phsTemp."', '".s:pheTemp."')\<CR>" + +	let &fo = _fo +	let @a = _a + +	call Tex_Debug('phs = '.s:phsTemp.', phe = '.s:pheTemp.', exe = '.s:exeTemp.', com = '.s:comTemp, 'templates') + +endfunction + +" }}} +" ProcessTemplate: processes the special characters in template file. {{{ +"                  This implementation follows from Gergely Kontra's +"                  mu-template.vim +"                  http://vim.sourceforge.net/scripts/script.php?script_id=222 +function! <SID>ProcessTemplate() +	if exists('s:phsTemp') && s:phsTemp != '' + +		exec 'silent! %s/^'.s:comTemp.'\(\_.\{-}\)'.s:comTemp.'$/\=<SID>Compute(submatch(1))/ge' +		exec 'silent! %s/'.s:exeTemp.'\(.\{-}\)'.s:exeTemp.'/\=<SID>Exec(submatch(1))/ge' +		exec 'silent! g/'.s:comTemp.s:comTemp.'/d' +		 +		" A function only puts one item into the search history... +		call Tex_CleanSearchHistory() +	endif +endfunction + +function! <SID>Exec(what) +	exec 'return '.a:what +endfunction + +" Back-Door to trojans !!! +function! <SID>Compute(what) +	exe a:what +	if exists('s:comTemp') +		return s:comTemp.s:comTemp +	else +		return '' +	endif +endfunction + +" }}} +" Command definitions {{{ +if v:version >= 602 +	com! -complete=custom,Tex_CompleteTemplateName -nargs=? TTemplate :call <SID>ReadTemplate(<f-args>) +		\| :startinsert + +	" Tex_CompleteTemplateName: for completing names in TTemplate command {{{ +	"	Description: get list of template names with Tex_FindInRtp(), remove full path +	"	and return list of names separated with newlines. +	" +	function! Tex_CompleteTemplateName(A,P,L) +		" Get name of macros from all runtimepath directories +		let tmplnames = Tex_FindInRtp('', 'templates') +		" Separate names with \n not , +		let tmplnames = substitute(tmplnames,',','\n','g') +		return tmplnames +	endfunction +	" }}} +	 +else +	com! -nargs=? TTemplate :call <SID>ReadTemplate(<f-args>) +		\| :startinsert + +endif + +" }}} + +" vim:fdm=marker:ff=unix:noet:ts=4:sw=4 diff --git a/ftplugin/latex-suite/texmenuconf.vim b/ftplugin/latex-suite/texmenuconf.vim new file mode 100644 index 00000000..d2c42f3c --- /dev/null +++ b/ftplugin/latex-suite/texmenuconf.vim @@ -0,0 +1,130 @@ +"============================================================================= +"        File: texmenuconf.vim +"      Author: Srinath Avadhanula +"   Copyright: Vim charityware license. :help license +" Description:  +"  +"============================================================================= + +" Paths, crucial for functions +let s:path = fnameescape(expand("<sfile>:p:h")) +let s:up_path = fnameescape(expand("<sfile>:p:h:h")) +let s:mainmenuname = g:Tex_MenuPrefix.'S&uite.' +let s:mapleader = exists('mapleader') ? mapleader : "\\" + +" This glboal variable is incremented each time a top-level latex-suite menu +" is created. We should always use this variable for setting the locations of +" newly created top-level menus. +let g:Tex_NextMenuLocation = g:Tex_MainMenuLocation + +" The templates and macros menus are always nested within the main latex-suit +" menu. +let g:Tex_TemplatesMenuLocation = g:Tex_MainMenuLocation.'.20 '.s:mainmenuname.'&Templates.' +let g:Tex_MacrosMenuLocation = g:Tex_MainMenuLocation.'.20 '.s:mainmenuname.'&Macros.' + +" The packages menu can either be a child of the main menu or be a top-level +" menu by itself. +if g:Tex_NestPackagesMenu +	let g:Tex_PackagesMenuLocation = (g:Tex_MainMenuLocation).'.10 '.s:mainmenuname.'&Packages.' +else +	let g:Tex_PackagesMenuLocation = (g:Tex_NextMenuLocation).'.10 '.g:Tex_MenuPrefix.'Packages.' +	let g:Tex_NextMenuLocation = g:Tex_NextMenuLocation + 1 +endif + +" Environments are always a top-level menu. +let g:Tex_EnvMenuLocation = (g:Tex_NextMenuLocation).'.20 '.g:Tex_MenuPrefix.'E&nvironments.' +let g:Tex_NextMenuLocation = g:Tex_NextMenuLocation + 1 + +" Elements are always a top-level menu.  +" If we choose to nest elements, then the top-level &TeX-Elements menu +" contains <Fonts / Counters / Dimensions> +" otherwise, the Fonts, Counters and Dimensions menus become top-level menus. +if g:Tex_NestElementMenus +	let g:Tex_ElementsMenuLocation = (g:Tex_NextMenuLocation).'.20 '.g:Tex_MenuPrefix.'E&lements.' +else +	let g:Tex_ElementsMenuLocation = (g:Tex_NextMenuLocation).'.20 '.g:Tex_MenuPrefix +endif +let g:Tex_NextMenuLocation = g:Tex_NextMenuLocation + 1 + + +" Set up the compiler/viewer menus. {{{ +" +if has('gui_running') && g:Tex_Menus +	exec 'anoremenu '.g:Tex_MainMenuLocation.'.25 '. s:mainmenuname.'-sepsuite0-  :' + +	" menus for compiling / viewing etc. +	exec 'anoremenu '.g:Tex_MainMenuLocation.'.30 '.s:mainmenuname.'&Compile<tab>'.s:mapleader.'ll'. +		\'   :silent! call Tex_RunLaTeX()<CR>' +	exec 'anoremenu '.g:Tex_MainMenuLocation.'.40 '.s:mainmenuname.'&View<tab>'.s:mapleader.'lv'. +		\'   :silent! call Tex_ViewLaTeX()<CR>' +	exec 'anoremenu '.g:Tex_MainMenuLocation.'.50 '.s:mainmenuname.'&Search<tab>'.s:mapleader.'ls'. +		\'   :silent! call ForwardSearchLaTeX()<CR>' +	exec 'anoremenu '.g:Tex_MainMenuLocation.'.60 '.s:mainmenuname.'&Target\ Format<tab>:TTarget'. +		\'   :call SetTeXTarget()<CR>' +	exec 'anoremenu '.g:Tex_MainMenuLocation.'.70 '.s:mainmenuname.'&Compiler\ Target<tab>:TCTarget'. +		\'   :call Tex_SetTeXCompilerTarget("Compile", "")<CR>' +	exec 'anoremenu '.g:Tex_MainMenuLocation.'.80 '.s:mainmenuname.'&Viewer\ Target<tab>:TVTarget'. +		\'   :call Tex_SetTeXCompilerTarget("View", "")<CR>' +	exec 'anoremenu '.g:Tex_MainMenuLocation.'.90 '.s:mainmenuname.'Set\ &Ignore\ Level<tab>:TCLevel'. +		\'   :TCLevel<CR>' +	exec 'imenu '.g:Tex_MainMenuLocation.'.100 '.s:mainmenuname.'C&omplete\ Ref/Cite'. +		\'   <Plug>Tex_Completion' +	exec 'anoremenu '.g:Tex_MainMenuLocation.'.110 '.s:mainmenuname.'-sepsuite1- :' +	" refreshing folds +	if g:Tex_Folding +		exec 'anoremenu '.g:Tex_MainMenuLocation.'.120 '.s:mainmenuname.'&Refresh\ Folds<tab>'.s:mapleader.'rf'. +			\'   :call MakeTexFolds(1)<CR>' +		exec 'anoremenu '.g:Tex_MainMenuLocation.'.130 '.s:mainmenuname.'-sepsuite2- :' +	endif +endif + +" }}} + +" ============================================================================== +" MenuConf: configure the menus as compact/extended, with/without math +" ==============================================================================  +function! Tex_MenuConfigure(type, action) " {{{ +	let menuloc = s:mainmenuname.'Configure\ Menu.' +	if a:type == 'math' +		if a:action == 1 +			let g:Tex_MathMenus = 1 +			exe 'source '.s:path.'/mathmacros.vim' +			exe 'amenu disable '.menuloc.'Add\ Math\ Menu' +			exe 'amenu enable '.menuloc.'Remove\ Math\ Menu' +		elseif a:action == 0 +			call Tex_MathMenuRemove() +			exe 'amenu enable '.menuloc.'Add\ Math\ Menu' +			exe 'amenu disable '.menuloc.'Remove\ Math\ Menu' +		endif +	elseif a:type == 'elements' +		if a:action == 'expand' +			let g:Tex_ElementsMenuLocation = '80.20 '.g:Tex_MenuPrefix +			exe 'amenu disable '.menuloc.'Expand\ Elements' +			exe 'amenu enable '.menuloc.'Compress\ Elements' +		elseif a:action == 'nest' +			let g:Tex_ElementsMenuLocation = '80.20 '.g:Tex_MenuPrefix.'Elements.' +			exe 'amenu enable '.menuloc.'Expand\ Elements' +			exe 'amenu disable '.menuloc.'Compress\ Elements' +		endif +		exe 'source '.fnameescape(s:path.'/elementmacros.vim') +	elseif a:type == 'packages' +		if a:action == 1 +			let g:Tex_PackagesMenu = 1 +			exe 'source '.s:path.'/packages.vim' +			exe 'amenu disable '.menuloc.'Load\ Packages\ Menu' +		endif +	endif +endfunction + +" }}} + +" configuration menu. +if g:Tex_Menus +	exe 'amenu '.g:Tex_MainMenuLocation.'.900 '.s:mainmenuname.'Configure\ Menu.Add\ Math\ Menu         :call Tex_MenuConfigure("math", 1)<cr>' +	exe 'amenu '.g:Tex_MainMenuLocation.'.900 '.s:mainmenuname.'Configure\ Menu.Remove\ Math\ Menu      :call Tex_MenuConfigure("math", 0)<cr>' +	exe 'amenu '.g:Tex_MainMenuLocation.'.900 '.s:mainmenuname.'Configure\ Menu.Expand\ Elements        :call Tex_MenuConfigure("elements", "expand")<cr>' +	exe 'amenu '.g:Tex_MainMenuLocation.'.900 '.s:mainmenuname.'Configure\ Menu.Compress\ Elements      :call Tex_MenuConfigure("elements", "nest")<cr>' +	exe 'amenu '.g:Tex_MainMenuLocation.'.900 '.s:mainmenuname.'Configure\ Menu.Load\ Packages\ Menu    :call Tex_MenuConfigure("packages", 1)<cr>' +endif + +" vim:fdm=marker:ff=unix:noet:ts=4:sw=4 diff --git a/ftplugin/latex-suite/texproject.vim b/ftplugin/latex-suite/texproject.vim new file mode 100644 index 00000000..fd1734bc --- /dev/null +++ b/ftplugin/latex-suite/texproject.vim @@ -0,0 +1,54 @@ +"============================================================================= +" 	     File: texproject.vim +"      Author: Mikolaj Machowski +" 	  Version: 1.0  +"     Created: Wen Apr 16 05:00 PM 2003 +"  +"  Description: Handling tex projects. +"============================================================================= + +let s:path = fnameescape(expand("<sfile>:p:h")) + +command! -nargs=0 TProjectEdit  :call <SID>Tex_ProjectEdit() + +" Tex_ProjectEdit: Edit project file " {{{ +" Description: If project file exists (*.latexmain) open it in window created +"              with ':split', if no create ':new' window and read there +"              project template +" +function! s:Tex_ProjectEdit() + +	let file = expand("%:p") +	let mainfname = Tex_GetMainFileName() +	if glob(mainfname.'.latexmain') != '' +		exec 'split '.fnameescape(mainfname.'.latexmain') +	else +		echohl WarningMsg +		echomsg "Master file not found." +		echomsg "    :help latex-master-file" +		echomsg "for more information" +		echohl None +	endif + +endfunction " }}} +" Tex_ProjectLoad: loads the .latexmain file {{{ +" Description: If a *.latexmain file exists, then sources it +function! Tex_ProjectLoad() +	let s:origdir = fnameescape(getcwd()) +	exe 'cd '.fnameescape(expand('%:p:h')) + +	if glob(Tex_GetMainFileName(':p').'.latexmain') != '' +		call Tex_Debug("Tex_ProjectLoad: sourcing [".Tex_GetMainFileName().".latexmain]", "proj") +               exec 'source '.fnameescape(Tex_GetMainFileName().'.latexmain') +	endif +	 +	exe 'cd '.s:origdir +endfunction " }}} + +augroup LatexSuite +	au LatexSuite User LatexSuiteFileType  +		\ call Tex_Debug("texproject.vim: catching LatexSuiteFileType event", "proj") | +		\ call Tex_ProjectLoad() +augroup END + +" vim:fdm=marker:ff=unix:noet:ts=4:sw=4 diff --git a/ftplugin/latex-suite/texviewer.vim b/ftplugin/latex-suite/texviewer.vim new file mode 100644 index 00000000..0b511dd1 --- /dev/null +++ b/ftplugin/latex-suite/texviewer.vim @@ -0,0 +1,1070 @@ +" ============================================================================ +" 	     File: texviewer.vim +"      Author: Mikolaj Machowski +"     Created: Sun Jan 26 06:00 PM 2003 +" Description: make a viewer for various purposes: \cite{, \ref{ +"     License: Vim Charityware License +"              Part of vim-latexSuite: http://vim-latex.sourceforge.net +" ============================================================================ +" Tex_SetTexViewerMaps: sets maps for this ftplugin {{{ +function! Tex_SetTexViewerMaps() +	inoremap <silent> <Plug>Tex_Completion <Esc>:call Tex_Complete("default","text")<CR> +	if !hasmapto('<Plug>Tex_Completion', 'i') +		if has('gui_running') +			imap <buffer> <silent> <F9> <Plug>Tex_Completion +		else +			imap <buffer> <F9> <Plug>Tex_Completion +		endif +	endif +endfunction + +augroup LatexSuite +	au LatexSuite User LatexSuiteFileType  +		\ call Tex_Debug('texviewer.vim: Catching LatexSuiteFileType event', 'view') |  +		\ call Tex_SetTexViewerMaps() +augroup END + +command -nargs=1 TLook    call Tex_Complete(<q-args>, 'tex') +command -nargs=1 TLookAll call Tex_Complete(<q-args>, 'all') +command -nargs=1 TLookBib call Tex_Complete(<q-args>, 'bib') + +" }}} + +" ============================================================================== +" Main completion function +" ============================================================================== +" Tex_Complete: main function {{{ +" Description: +function! Tex_Complete(what, where) + +	" Get info about current window and position of cursor in file +	let s:winnum = winnr() +	let s:pos = Tex_GetPos() + +	" Change to the directory of the file being edited before running all the +	" :grep commands. We will change back to the original directory after we +	" finish with the grep. +	let s:origdir = fnameescape(getcwd()) +	exe 'cd '.fnameescape(expand('%:p:h')) + +	unlet! s:type +	unlet! s:typeoption + +	if Tex_GetVarValue('Tex_WriteBeforeCompletion') == 1 +		wall +	endif + +	if a:where == "text" +		" What to do after <F9> depending on context +		let s:curline = strpart(getline('.'), 0, col('.')) +		let s:prefix = matchstr(s:curline, '.*{\zs.\{-}\(}\|$\)') +		" a command is of the type +		" \psfig[option=value]{figure=} +		" Thus +		" 	s:curline = '\psfig[option=value]{figure=' +		" (with possibly some junk before \psfig) +		" from which we need to extract +		" 	s:type = 'psfig' +		" 	s:typeoption = '[option=value]' +		let pattern = '.*\\\(\w\{-}\)\(\[.\{-}\]\)*{\([^ [\]\t]\+\)\?$' +		if s:curline =~ pattern +			let s:type = substitute(s:curline, pattern, '\1', 'e') +			let s:typeoption = substitute(s:curline, pattern, '\2', 'e') +			call Tex_Debug('Tex_Complete: s:type = '.s:type.', typeoption = '.s:typeoption, 'view') +		endif + +		if exists("s:type") && s:type =~ 'ref' +			if Tex_GetVarValue('Tex_UseOutlineCompletion') == 1 +				call Tex_Debug("Tex_Complete: using outline search method", "view") +				call Tex_StartOutlineCompletion() + +			elseif Tex_GetVarValue('Tex_UseSimpleLabelSearch') == 1 +				call Tex_Debug("Tex_Complete: searching for \\labels in all .tex files in the present directory", "view") +				call Tex_Debug("Tex_Complete: silent! grep! ".Tex_EscapeForGrep('\\label{'.s:prefix)." *.tex", 'view') +				call Tex_Grep('\\label{'.s:prefix, '*.tex') +				call <SID>Tex_SetupCWindow() + +			elseif Tex_GetVarValue('Tex_ProjectSourceFiles') != '' +				call Tex_Debug('Tex_Complete: searching for \\labels in all Tex_ProjectSourceFiles', 'view') +				exec 'cd '.fnameescape(Tex_GetMainFileName(':p:h')) +				call Tex_Grep('\\label{'.s:prefix, Tex_GetVarValue('Tex_ProjectSourceFiles')) +				call <SID>Tex_SetupCWindow() + +			else +				call Tex_Debug("Tex_Complete: calling Tex_GrepHelper", "view") +				silent! grep! ____HIGHLY_IMPROBABLE___ % +				call Tex_GrepHelper(s:prefix, 'label') +				call <SID>Tex_SetupCWindow() +			endif + +			redraw! + +		elseif exists("s:type") && s:type =~ 'cite' + +			let s:prefix = matchstr(s:prefix, '\([^,]\+,\)*\zs\([^,]\+\)\ze$') +			call Tex_Debug(":Tex_Complete: using s:prefix = ".s:prefix, "view") + +			if has('python') && Tex_GetVarValue('Tex_UsePython')  +				\ && Tex_GetVarValue('Tex_UseCiteCompletionVer2') == 1 + +				exe 'cd '.s:origdir +				silent! call Tex_StartCiteCompletion() + +			elseif Tex_GetVarValue('Tex_UseJabref') == 1 + +				exe 'cd '.s:origdir +				let g:Remote_WaitingForCite = 1 +				let citation = input('Enter citation from jabref (<enter> to leave blank): ') +				let g:Remote_WaitingForCite = 0 +				call Tex_CompleteWord(citation, strlen(s:prefix)) +			 +			else +				" grep! nothing %  +				" does _not_ clear the search history contrary to what the +				" help-docs say. This was expected. So use something improbable. +				" TODO: Is there a way to clear the search-history w/o making a +				"       useless, inefficient search? +				silent! grep! ____HIGHLY_IMPROBABLE___ % +				if g:Tex_RememberCiteSearch && exists('s:citeSearchHistory') +					call <SID>Tex_SetupCWindow(s:citeSearchHistory) +				else +					call Tex_GrepHelper(s:prefix, 'bib') +					redraw! +					call <SID>Tex_SetupCWindow() +				endif +				if g:Tex_RememberCiteSearch && &ft == 'qf' +					let _a = @a +					silent! normal! ggVG"ay +					let s:citeSearchHistory = @a +					let @a = _a +				endif +			endif + +		elseif exists("s:type") && (s:type =~ 'includegraphics' || s:type == 'psfig')  +			call Tex_SetupFileCompletion( +				\ '',  +				\ '^\.\\|\.tex$\\|\.bib$\\|\.bbl$\\|\.zip$\\|\.gz$',  +				\ 'noext',  +				\ Tex_GetVarValue('Tex_ImageDir', '.'),  +				\ Tex_GetVarValue('Tex_ImageDir', '')) +			 +		elseif exists("s:type") && s:type == 'bibliography' +			call Tex_SetupFileCompletion( +				\ '\.b..$', +				\ '', +				\ 'noext', +				\ '.',  +				\ '') + +		elseif exists("s:type") && s:type =~ 'include\(only\)\=' +			call Tex_SetupFileCompletion( +				\ '\.t..$',  +				\ '', +				\ 'noext', +				\ '.',  +				\ '') + +		elseif exists("s:type") && s:type == 'input' +			call Tex_SetupFileCompletion( +				\ '',  +				\ '', +				\ 'ext', +				\ '.',  +				\ '') + +		elseif exists('s:type') && exists("g:Tex_completion_".s:type) +			call <SID>Tex_CompleteRefCiteCustom('plugin_'.s:type) + +		else +			let s:word = expand('<cword>') +			if s:word == '' +				call Tex_SwitchToInsertMode() +				return +			endif +			call Tex_Debug("silent! grep! ".Tex_EscapeForGrep('\<'.s:word.'\>')." *.tex", 'view') +			call Tex_Grep('\<'.s:word.'\>', '*.tex') + +			call <SID>Tex_SetupCWindow() +		endif +		 +	elseif a:where == 'tex' +		" Process :TLook command +		call Tex_Grep(a:what, "*.tex") +		call <SID>Tex_SetupCWindow() + +	elseif a:where == 'bib' +		" Process :TLookBib command +		call Tex_Grep(a:what, "*.bib") +		call Tex_Grepadd(a:what, "*.bbl") +		call <SID>Tex_SetupCWindow() + +	elseif a:where == 'all' +		" Process :TLookAll command +		call Tex_Grep(a:what, "*") +		call <SID>Tex_SetupCWindow() +	endif + +endfunction  +" }}} +" Tex_CompleteWord: inserts a word at the chosen location {{{ +" Description: This function is meant to be called when the user press +" 	``<enter>`` in one of the [Error List] windows which shows the list of +" 	matches. completeword is the rest of the word which needs to be inserted. +" 	prefixlength characters are deleted before completeword is inserted +function! Tex_CompleteWord(completeword, prefixlength) +	" Set cursor to window and position recorded when completion was invoked. +	exe s:winnum.' wincmd w' +	call Tex_SetPos(s:pos) + +	" Complete word, check if add closing } +	if a:prefixlength > 0 +		if a:prefixlength > 1 +			exe 'normal! '.(a:prefixlength-1).'h' +		endif +		exe 'normal! '.a:prefixlength.'s'.a:completeword."\<Esc>" +	else +		exe 'normal! a'.a:completeword."\<Esc>" +	endif + +	if getline('.')[col('.')-1] !~ '{' && getline('.')[col('.')] !~ '}' +		exe "normal! a}\<Esc>" +	endif +	 +	" Return to Insert mode +	call Tex_SwitchToInsertMode() +endfunction " }}} + +" ============================================================================== +" File name completion helper functons +" ==============================================================================  +" Tex_SetupFileCompletion:  {{{ +" Description:  +function! Tex_SetupFileCompletion(accept, reject, ext, dir, root) +	call FB_SetVar('FB_AllowRegexp', a:accept) +	call FB_SetVar('FB_RejectRegexp', a:reject) +	call FB_SetVar('FB_CallBackFunction', 'Tex_CompleteFileName') +	call FB_SetVar('FB_CallBackFunctionArgs', '"'.a:ext.'", "'.a:root.'"') + +	call FB_OpenFileBrowser(a:dir) +endfunction " }}} +" Tex_CompleteFileName:  {{{ +" Description:  +function! Tex_CompleteFileName(filename, ext, root) +	let root = (a:root == '' ? Tex_GetMainFileName(':p:h') : a:root) + +	call Tex_Debug('+Tex_CompleteFileName: getting filename '.a:filename, 'view') + +	if a:ext == 'noext' +		let completeword = fnamemodify(a:filename, ':r') +	else +		let completeword = a:filename +	endif +	let completeword = Tex_RelPath(completeword, root) + +	call Tex_Debug(":Tex_CompleteFileName: completing with ".completeword, "view") +	call Tex_CompleteWord(completeword, strlen(s:prefix)) +endfunction " }}} +" Tex_Common: common part of strings {{{ +function! s:Tex_Common(path1, path2) +	" Assume the caller handles 'ignorecase' +	if a:path1 == a:path2 +		return a:path1 +	endif +	let n = 0 +	while a:path1[n] == a:path2[n] +		let n = n+1 +	endwhile +	return strpart(a:path1, 0, n) +endfunction " }}} +" Tex_NormalizePath:  {{{ +" Description:  +function! Tex_NormalizePath(path) +	let retpath = a:path +	if has("win32") || has("win16") || has("dos32") || has("dos16") +		let retpath = substitute(retpath, '\\', '/', 'ge') +	endif +	if isdirectory(retpath) && retpath !~ '/$' +		let retpath = retpath.'/' +	endif +	return retpath +endfunction " }}} +" Tex_RelPath: ultimate file name {{{ +function! Tex_RelPath(explfilename,texfilename) +	let path1 = Tex_NormalizePath(a:explfilename) +	let path2 = Tex_NormalizePath(a:texfilename) + +	let n = matchend(<SID>Tex_Common(path1, path2), '.*/') +	let path1 = strpart(path1, n) +	let path2 = strpart(path2, n) +	if path2 !~ '/' +		let subrelpath = '' +	else +		let subrelpath = substitute(path2, '[^/]\{-}/', '../', 'ge') +		let subrelpath = substitute(subrelpath, '[^/]*$', '', 'ge') +	endif +	let relpath = subrelpath.path1 +	return escape(Tex_NormalizePath(relpath), ' ') +endfunction " }}} + +" ============================================================================== +" Helper functions for dealing with the 'quickfix' and 'preview' windows. +" ============================================================================== +" Tex_SetupCWindow: set maps and local settings for cwindow {{{ +" Description: Set local maps jkJKq<cr> for cwindow. Also size and basic +" settings +" +function! s:Tex_SetupCWindow(...) +	call Tex_Debug('+Tex_SetupCWindow', 'view') +	cclose +	exe 'copen '. g:Tex_ViewerCwindowHeight +	" If called with an argument, it means we want to re-use some search +	" history from last time. Therefore, just paste it here and proceed. +	if a:0 == 1 +		set modifiable +		% d _ +		silent! 0put!=a:1 +		$ d _ +	endif +	setlocal nonumber +	setlocal nowrap + +	let s:scrollOffVal = &scrolloff +	call <SID>Tex_SyncPreviewWindow() + +	" If everything went well, then we should be situated in the quickfix +	" window. If there were problems, (no matches etc), then we will not be. +	" Therefore return. +	if &ft != 'qf' +		call Tex_Debug('not in quickfix window, quitting', 'view') +		return +	endif + +    nnoremap <buffer> <silent> j j:call <SID>Tex_SyncPreviewWindow()<CR> +    nnoremap <buffer> <silent> k k:call <SID>Tex_SyncPreviewWindow()<CR> +    nnoremap <buffer> <silent> <up> <up>:call <SID>Tex_SyncPreviewWindow()<CR> +    nnoremap <buffer> <silent> <down> <down>:call <SID>Tex_SyncPreviewWindow()<CR> + +	" Change behaviour of <cr> only for 'ref' and 'cite' context.  +	if exists("s:type") && s:type =~ 'ref\|cite' +		exec 'nnoremap <buffer> <silent> <cr> ' +			\ .':set scrolloff='.s:scrollOffVal.'<CR>' +			\ .':cd '.s:origdir.'<CR>' +			\ .':silent! call <SID>Tex_CompleteRefCiteCustom("'.s:type.'")<CR>' + +	else +		" In other contexts jump to place described in cwindow and close small +		" windows +		exec 'nnoremap <buffer> <silent> <cr> ' +			\ .':set scrolloff='.s:scrollOffVal.'<CR>' +			\ .':cd '.s:origdir.'<CR>' +			\ .':call <SID>Tex_GoToLocation()<cr>' + +	endif + +	" Scroll the preview window while in the quickfix window +	nnoremap <buffer> <silent> J :wincmd j<cr><c-e>:wincmd k<cr> +	nnoremap <buffer> <silent> K :wincmd j<cr><c-y>:wincmd k<cr> + +	" Exit the quickfix window without doing anything. +	exe 'nnoremap <buffer> <silent> q ' +		\ .':set scrolloff='.s:scrollOffVal.'<CR>' +		\ .':cd '.s:origdir.'<CR>' +		\ .':call Tex_CloseSmallWindows()<CR>' + +endfunction " }}} +" Tex_CompleteRefCiteCustom: complete/insert name for current item {{{ +" Description: handle completion of items depending on current context +" +function! s:Tex_CompleteRefCiteCustom(type) + +	let prefixlength=strlen(s:prefix) +	if a:type =~ 'cite' +		if getline('.') =~ '\\bibitem\s*{' +			let bibkey = matchstr(getline('.'), '\\bibitem\s*{\zs.\{-}\ze}') +		else +			let bibkey = matchstr(getline('.'), '\\bibitem\s*\[.\{-}\]\s*{\zs.\{-}\ze}') +		endif +		let completeword = bibkey + +	elseif a:type =~ 'ref' +		let label = matchstr(getline('.'), '\\label{\zs.\{-}\ze}') +		let completeword = label + +	elseif a:type =~ '^plugin_' +		let type = substitute(a:type, '^plugin_', '', '') +		let completeword = <SID>Tex_DoCompletion(type) +		" use old behaviour for plugins because of backward compatibility +		let prefixlength=0 +		 +	endif + +	call Tex_CloseSmallWindows() +	call Tex_Debug(":Tex_CompleteRefCiteCustom: completing with ".completeword, "view") +	call Tex_CompleteWord(completeword, prefixlength) +endfunction " }}} +" Tex_SyncPreviewWindow: synchronize quickfix and preview window {{{ +" Description: Usually quickfix engine takes care about most of these things +" but we discard it for better control of events. +" +function! s:Tex_SyncPreviewWindow() +	 call Tex_Debug('+Tex_SyncPreviewWindow', 'view') + +	let viewfile = matchstr(getline('.'), '^\f*\ze|\d') +	let viewline = matchstr(getline('.'), '|\zs\d\+\ze') + +	" Hilight current line in cwindow +	" Normally hightlighting is done with quickfix engine but we use something +	" different and have to do it separately +	syntax clear +	runtime syntax/qf.vim +	exe 'syn match vTodo /\%'. line('.') .'l.*/' +	hi link vTodo Todo + +	" Close preview window and open it again in new place +    pclose +	exe 'silent! bot pedit +'.viewline.' '.viewfile + +	" Vanilla 6.1 has bug. This additional setting of cwindow height prevents +	" resizing of this window +	exe g:Tex_ViewerCwindowHeight.' wincmd _' +	 +	" Handle situation if there is no item beginning with s:prefix. +	" Unfortunately, because we know it late we have to close everything and +	" return as in complete process  +	if v:errmsg =~ 'E32\>' +		exe s:winnum.' wincmd w' +		call Tex_SetPos(s:pos) +		pclose! +		cclose +		if exists("s:prefix") +			echomsg 'No bibkey, label or word beginning with "'.s:prefix.'"' +		endif +		call Tex_SwitchToInsertMode() +		let v:errmsg = '' +		call Tex_Debug('Tex_SyncPreviewWindow: got error E32, no matches found, quitting', 'view') +		return 0 +	endif + +	" Move to preview window. Really is it under cwindow? +	wincmd j + +	" Settings of preview window +	exe g:Tex_ViewerPreviewHeight.' wincmd _' +	setlocal nofoldenable + +	if exists('s:type') && s:type =~ 'cite' +		" In cite context place bibkey at the top of preview window. +		setlocal scrolloff=0 +		normal! zt +	else +		" In other contexts in the middle. Highlight this line? +		setlocal scrolloff=100 +		normal! z. +	endif + +	" Return to cwindow +	wincmd p + +endfunction " }}} +" Tex_CloseSmallWindows: {{{ +" Description: +" +function! Tex_CloseSmallWindows() +	pclose! +	cclose +	exe s:winnum.' wincmd w' +	call Tex_SetPos(s:pos) +endfunction " }}} +" Tex_GoToLocation: Go to chosen location {{{ +" Description: Get number of current line and go to this number +" +function! s:Tex_GoToLocation() +	pclose! +	let errmsg = v:errmsg +	let v:errmsg = '' +	exe 'silent! cc ' . line('.') +	" If the current buffer is modified, then split +	if v:errmsg =~ '^E37:' +		split +		exe 'silent! cc ' . line('.') +	endif +	cclose +	let v:errmsg = errmsg +endfunction " }}} + +" ============================================================================== +" Functions for finding \\label's or \\bibitem's in the main file. +" ==============================================================================  +" Tex_GrepHelper: grep main filename for \\bibitem's or \\label's {{{ +" Description:  +function! Tex_GrepHelper(prefix, what) +	let _path = &path +	let _suffixesadd = &suffixesadd +	let _hidden = &hidden + +	let mainfname = Tex_GetMainFileName(':p') +	" If we are already editing the file, then use :split without any +	" arguments so it works even if the file is modified. +	" FIXME: If mainfname is being presently edited in another window and +	"        is 'modified', then the second split statement will not work. +	"        We will need to travel to that window and back. +	if mainfname == expand('%:p') +		split +	else +		exec 'split '.fnameescape(mainfname) +	endif + +	let pos = Tex_GetPos() +	if a:what =~ 'bib' +		call Tex_ScanFileForCite(a:prefix) +	else +		call Tex_ScanFileForLabels(a:prefix) +	endif +	call Tex_SetPos(pos) + +	q +	let &path = _path +	let &suffixesadd = _suffixesadd + +endfunction " }}} +" Tex_ScanFileForCite: search for \bibitem's in .bib or .bbl or tex files {{{ +" Description:  +" Search for bibliographic entries in the presently edited file in the +" following manner: +" 1. First see if the file has a \bibliography command. +"    If YES: +"    	1. If a .bib file corresponding to the \bibliography command can be +"    	   found, then search for '@.*'.a:prefix inside it. +"    	2. Otherwise, if a .bbl file corresponding to the \bibliography command +"    	   can be found, then search for '\bibitem'.a:prefix inside it. +" 2. Next see if the file has a \thebibliography environment +"    If YES: +"    	1. Search for '\bibitem'.a:prefix in this file. +" +" If neither a \bibliography or \begin{thebibliography} are found, then repeat +" steps 1 and 2 for every file \input'ed into this file. Abort any searching +" as soon as the first \bibliography or \begin{thebibliography} is found. +function! Tex_ScanFileForCite(prefix) +	call Tex_Debug('+Tex_ScanFileForCite: searching for bibkeys in '.bufname('%').' (buffer #'.bufnr('%').')', 'view') +	let presBufNum = bufnr('%') + +	let foundCiteFile = 0 +	" First find out if this file has a \bibliography command in it. If so, +	" assume that this is the only file in the project which defines a +	" bibliography. +	if search('\\\(no\)\?bibliography{', 'w') +		call Tex_Debug('Tex_ScanFileForCite: found bibliography command in '.bufname('%'), 'view') +		" convey that we have found a bibliography command. we do not need to +		" proceed any further. +		let foundCiteFile = 1 + +		" extract the bibliography filenames from the command. +		let bibnames = matchstr(getline('.'), '\\\(no\)\?bibliography{\zs.\{-}\ze}') +		let bibnames = substitute(bibnames, '\s', '', 'g') + +		call Tex_Debug('trying to search through ['.bibnames.']', 'view') + +		let &path = '.,'.g:Tex_BIBINPUTS + +		let i = 1 +		while 1 +			let bibname = Tex_Strntok(bibnames, ',', i) +			if bibname == '' +				break +			endif + +			" first try to find if a .bib file exists. If so do not search in +			" the corresponding .bbl file. (because the .bbl file will most +			" probly be generated automatically from the .bib file with +			" bibtex). +			 +			let fname = Tex_FindFile(bibname, '.,'.g:Tex_BIBINPUTS, '.bib') +			if fname != '' +				call Tex_Debug('finding .bib file ['.bufname('%').']', 'view') +				exec 'split '.Tex_EscapeSpaces(fname) +				call Tex_Grepadd('@.*{'.a:prefix, "%") +				q +			else +				let fname = Tex_FindFile(bibname, '.,'.g:Tex_BIBINPUTS, '.bbl') +				if fname != '' +					exec 'split '.Tex_EscapeSpaces(fname) +					call Tex_Debug('finding .bbl file ['.bufname('.').']', 'view') +					call Tex_Grepadd('\\bibitem{'.a:prefix, "%") +					q +				endif +			endif + +			let i = i + 1 +		endwhile + +		if foundCiteFile +			return 1 +		endif +	endif + +	" If we have a thebibliography environment, then again assume that this is +	" the only file which defines the bib-keys. Aand convey this information +	" upwards by returning 1. +	if search('^\s*\\begin{thebibliography}', 'w') +		call Tex_Debug('got a thebibliography environment in '.bufname('%'), 'view') +		 +		let foundCiteFile = 1 + +		split +		exec 'lcd'.fnameescape(expand('%:p:h')) +		call Tex_Debug("silent! grepadd! ".Tex_EscapeForGrep('\\bibitem{'.a:prefix)." %", 'view') +		call Tex_Grepadd('\\bibitem\s*[\[|{]'.a:prefix, "%") +		q +		 +		return 1 +	endif + +	" If we have not found any \bibliography or \thebibliography environment +	" in this file, search for these environments in all the files which this +	" file includes. + +	exec 0 +	let wrap = 'w' +	while search('^\s*\\\(input\|include\)', wrap) +		let wrap = 'W' + +		let filename = matchstr(getline('.'), '\\\(input\|include\){\zs.\{-}\ze}') + +		let foundfile = Tex_FindFile(filename, '.,'.g:Tex_TEXINPUTS, '.tex') +		if foundfile != '' +			exec 'split '.Tex_EscapeSpaces(foundfile) +			call Tex_Debug('scanning recursively in ['.foundfile.']', 'view') +			let foundCiteFile = Tex_ScanFileForCite(a:prefix) +			q +		endif + +		if foundCiteFile +			return 1 +		endif +	endwhile + + +	return 0 +endfunction " }}} +" Tex_ScanFileForLabels: greps present file and included files for \\label's {{{ +" Description:  +" Grep the presently edited file for \\label's. If the present file \include's +" or \input's other files, then recursively scan those as well, i.e we support +" arbitrary levels of \input'ed-ness. +function! Tex_ScanFileForLabels(prefix) +	call Tex_Debug("+Tex_ScanFileForLabels: grepping in file [".bufname('%')."]", "view") + +	exec 'lcd'.fnameescape(expand('%:p:h')) +	call Tex_Grepadd('\\label{'.a:prefix, "%") + +	" Then recursively grep for all \include'd or \input'ed files. +	exec 0 +	let wrap = 'w' +	while search('^\s*\\\(input\|include\)', wrap) +		let wrap = 'W' + +		let filename = matchstr(getline('.'), '\\\(input\|include\){\zs.\{-}\ze}') +		let foundfile = Tex_FindFile(filename, '.,'.Tex_TEXINPUTS, '.tex') +		if foundfile != '' +			exec 'split '.Tex_EscapeSpaces(foundfile) +			call Tex_Debug('Tex_ScanFileForLabels: scanning recursively in ['.foundfile.']', 'view') +			call Tex_ScanFileForLabels(a:prefix) +			q +		endif +	endwhile + +endfunction " }}} + +" ============================================================================== +" Functions for custom command completion +" ============================================================================== +" Tex_completion_{var}: similar variables can be set in package files {{{ +let g:Tex_completion_bibliographystyle = 'abbr,alpha,plain,unsrt' +let g:Tex_completion_addtocontents = 'lof}{,lot}{,toc}{' +let g:Tex_completion_addcontentsline = 'lof}{figure}{,lot}{table}{,toc}{chapter}{,toc}{part}{,'. +									\ 'toc}{section}{,toc}{subsection}{,toc}{paragraph}{,'. +									\ 'toc}{subparagraph}{' +" }}} +" Tex_PromptForCompletion: prompts for a completion {{{ +" Description:  +function! s:Tex_PromptForCompletion(texcommand,ask) + +	let common_completion_prompt =  +				\ Tex_CreatePrompt(g:Tex_completion_{a:texcommand}, 2, ',') . "\n" . +				\ 'Enter number or completion: ' + +	let inp = input(a:ask."\n".common_completion_prompt) +	if inp =~ '^[0-9]\+$' +		let completion = Tex_Strntok(g:Tex_completion_{a:texcommand}, ',', inp) +	else +		let completion = inp +	endif + +	return completion +endfunction " }}} +" Tex_DoCompletion: fast insertion of completion {{{ +" Description: +" +function! s:Tex_DoCompletion(texcommand) +	let completion = <SID>Tex_PromptForCompletion(a:texcommand, 'Choose a completion to insert: ') +	if completion != '' +		return completion +	else +		return '' +	endif +endfunction " }}} + +" ============================================================================== +" Functions for presenting an outlined version for completion +" ==============================================================================  +" Tex_StartOutlineCompletion: sets up an outline window {{{ + +" get the place where this plugin resides for setting cpt and dict options. +" these lines need to be outside the function. +let s:path = expand('<sfile>:p:h') +if has('python') && Tex_GetVarValue('Tex_UsePython') +	python import sys, re +	exec "python sys.path += [r'". s:path . "']" +	python import outline +endif + +function! Tex_StartOutlineCompletion() +	let mainfname = Tex_GetMainFileName(':p') + +	" open the buffer +    let _report = &report +    let _cmdheight=&cmdheight +    let _lazyredraw = &lazyredraw +    set report=1000 +    set cmdheight=1 +    set lazyredraw + +	if has('python') && Tex_GetVarValue('Tex_UsePython') +		python retval = outline.main(vim.eval("Tex_GetMainFileName(':p')"), vim.eval("s:prefix")) + +		" transfer variable from python to a local variable. +		python vim.command("""let retval = "%s" """ % re.sub(r'"|\\', r'\\\g<0>', retval)) +	else +		let retval = system(shellescape(s:path.'/outline.py').' '.shellescape(mainfname).' '.shellescape(s:prefix)) +	endif + +    bot split __OUTLINE__ +	exec Tex_GetVarValue('Tex_OutlineWindowHeight', 15).' wincmd _' + +	setlocal modifiable +	setlocal noswapfile +	setlocal buftype=nowrite +	setlocal bufhidden=delete +	setlocal nowrap +    setlocal foldmethod=marker +    setlocal foldmarker=<<<,>>> + +	" delete everything in it to the blackhole +	% d _ +	0put!=retval + +	0 + +    call Tex_SetupOutlineSyntax() + +	exec 'nnoremap <buffer> <cr> ' +		\ .':cd '.s:origdir.'<CR>' +		\ .':call Tex_FinishOutlineCompletion()<CR>' +	exec 'nnoremap <buffer> q ' +		\ .':cd '.s:origdir.'<CR>' +		\ .':close<CR>' +		\ .':call Tex_SwitchToInsertMode()<CR>' + +	" once the buffer is initialized, go back to the original settings. +	setlocal nomodifiable +	setlocal nomodified +    let &report = _report +    let &cmdheight = _cmdheight +    let &lazyredraw = _lazyredraw + +endfunction " }}} +" Tex_SetupOutlineSyntax: sets up the syntax items for the outline {{{ +" Description:  +function! Tex_SetupOutlineSyntax() +    syn match outlineFileName "<\f\+>$" contained +    syn match foldMarkers "<<<\d$" contained +    syn match firstSemiColon '^:' contained +    syn match firstAngle '^>' contained + +    syn match sectionNames '\(\d\.\)\+ .*' contains=foldMarkers +    syn match previousLine '^:.*' contains=firstSemiColon +    syn match labelLine '^>.*' contains=firstAngle,outlineFileName + +    hi def link outlineFileName Ignore +    hi def link foldMarkers Ignore +    hi def link firstSemiColon Ignore +    hi def link firstAngle Ignore + +    hi def link sectionNames Type +    hi def link previousLine Special +    hi def link labelLine Comment +endfunction " }}} +" Tex_FinishOutlineCompletion: inserts the reference back in the text {{{ +function! Tex_FinishOutlineCompletion() +	if getline('.') !~ '^[>:]' +		return +	endif + +	if getline('.') =~ '^>' +		let ref_complete = matchstr(getline('.'), '^>\s\+\zs\S\+\ze') +	elseif getline('.') =~ '^:' +		let ref_complete = matchstr(getline(line('.')-1), '^>\s\+\zs\S\+\ze') +	endif + +	close +	call Tex_CompleteWord(ref_complete, strlen(s:prefix)) +endfunction " }}} + +" ============================================================================== +" Functions for presenting a nicer list of bibtex entries +" ==============================================================================  +" Tex_FindBibFiles: finds all .bib files used by the main file {{{ +" Description:  +function! Tex_FindBibFiles() +	call Tex_Debug(":Tex_FindBibFiles: ", "view") + +	let mainfname = Tex_GetMainFileName(':p') +	new +	exec 'e ' . fnameescape(mainfname) + +	if search('\\\(no\)\?bibliography{', 'w') + +		call Tex_Debug('Tex_FindBibFiles: found bibliography command in '.bufname('%'), 'view') + +		" extract the bibliography filenames from the command. +		let bibnames = matchstr(getline('.'), '\\\(no\)\?bibliography{\zs.\{-}\ze}') +		let bibnames = substitute(bibnames, '\s', '', 'g') + +		call Tex_Debug(':Tex_FindBibFiles: trying to search through ['.bibnames.']', 'view') + +		let bibfiles = '' +		let i = 1 +		while 1 +			let bibname = Tex_Strntok(bibnames, ',', i) +			if bibname == '' +				break +			endif +			let fname = Tex_FindFile(bibname, '.,'.g:Tex_BIBINPUTS, '.bib') +			if fname != '' +				let bibfiles = bibfiles.fname."\n" +			endif +			let i = i + 1 +		endwhile + +		call Tex_Debug(":Tex_FindBibFiles: returning [".bibfiles."]", "view") +		q +		return bibfiles + +	else +		q +		return '' +	endif + +endfunction " }}} +" Tex_StartBibtexOutline: sets up an outline window {{{ + +" get the place where this plugin resides for setting cpt and dict options. +" these lines need to be outside the function. +if has('python') && Tex_GetVarValue('Tex_UsePython') +	python import sys, re +	exec "python sys.path += [r'". s:path . "']" +	python import bibtools +endif + +function! Tex_StartCiteCompletion() +	let bibfiles = Tex_FindBibFiles() +	if bibfiles !~ '\S' +		call Tex_SwitchToInsertMode() +		echohl WarningMsg +		echomsg 'No bibfiles found! Sorry' +		echohl None +		return +	endif + +    bot split __OUTLINE__ +	exec Tex_GetVarValue('Tex_OutlineWindowHeight', 15).' wincmd _' + +	exec 'python Tex_BibFile = bibtools.BibFile("""'.bibfiles.'""")' +	exec 'python Tex_BibFile.addfilter("key ^'.s:prefix.'")' +	call Tex_DisplayBibList() + +	nnoremap <buffer> <Plug>Tex_JumpToNextBibEntry :call search('^\S.*\]$', 'W')<CR>:call Tex_EchoBibShortcuts()<CR>z. +	nnoremap <buffer> <Plug>Tex_JumpToPrevBibEntry :call search('^\S.*\]$', 'bW')<CR>:call Tex_EchoBibShortcuts()<CR>z. +	nnoremap <buffer> <Plug>Tex_FilterBibEntries   :call Tex_HandleBibShortcuts('filter')<CR> +	nnoremap <buffer> <Plug>Tex_RemoveBibFilters   :call Tex_HandleBibShortcuts('remove_filters')<CR> +	nnoremap <buffer> <Plug>Tex_SortBibEntries	  :call Tex_HandleBibShortcuts('sort')<CR> +	nnoremap <buffer> <Plug>Tex_CompleteCiteEntry  :call Tex_CompleteCiteEntry()<CR> + +	nmap <buffer> <silent> n 		<Plug>Tex_JumpToNextBibEntry +	nmap <buffer> <silent> p 		<Plug>Tex_JumpToPrevBibEntry +	nmap <buffer> <silent> f		<Plug>Tex_FilterBibEntries +	nmap <buffer> <silent> s		<Plug>Tex_SortBibEntries +	nmap <buffer> <silent> a		<Plug>Tex_RemoveBibFilters +	nmap <buffer> <silent> q		:close<CR>:call Tex_SwitchToInsertMode()<CR> +	nmap <buffer> <silent> <CR>		<Plug>Tex_CompleteCiteEntry + +endfunction " }}} +" Tex_DisplayBibList: displays the list of bibtex entries {{{ +" Description:  +function! Tex_DisplayBibList() +	" open the buffer +    let _report = &report +    let _cmdheight=&cmdheight +    let _lazyredraw = &lazyredraw +    set report=1000 +    set cmdheight=1 +    set lazyredraw + +	setlocal modifiable +	setlocal noswapfile +	setlocal buftype=nowrite +	setlocal bufhidden=delete +	setlocal nowrap +    setlocal foldmethod=marker +    setlocal foldmarker=<<<,>>> + + +	" delete everything in it to the blackhole +	% d _ + +	exec 'python Tex_CurBuf = vim.current.buffer' +	exec 'python Tex_CurBuf[:] = str(Tex_BibFile).splitlines()' + +	call Tex_SetupBibSyntax() + +	0 +	call Tex_EchoBibShortcuts() + +	" once the buffer is initialized, go back to the original settings. +	setlocal nomodifiable +	setlocal nomodified +    let &report = _report +    let &cmdheight = _cmdheight +    let &lazyredraw = _lazyredraw + +endfunction " }}} +" Tex_EchoBibShortcuts: echos all the shortcuts in the status line {{{ +" Description: +function! Tex_EchoBibShortcuts() +	echomsg '(a) all (f) filter (s) sort (n) next (p) previous (q) quit (<CR>) choose' +endfunction " }}} +" Tex_SetupBibSyntax: sets up the syntax items for the outline {{{ +" Description:  +function! Tex_SetupBibSyntax() +	syn match BibTitleHeader "^TI" contained +	syn match BibAuthorHeader "^AU" contained +	syn match BibLocationHeader "^IN" contained +	syn match BibMiscHeader "^MI" contained + +	syn match BibKeyLine '^\S.*\]$' contains=BibKey +	syn match BibTitle "^TI .*" contains=BibTitleHeader +	syn match BibAuthor "^AU .*" contains=BibAuthorHeader +	syn match BibLocation "^IN .*" contains=BibLocationHeader +	syn match BibMisc "^MI .*" contains=BibMiscHeader + +    hi def link BibTitleHeader Ignore +    hi def link BibAuthorHeader Ignore +    hi def link BibLocationHeader Ignore +	hi def link BibMiscHeader Ignore + +	hi def link BibKeyLine Visual +    hi def link BibTitle Type +    hi def link BibAuthor Special +    hi def link BibLocation Comment +	hi def link BibMisc Comment +endfunction " }}} +" Tex_HandleBibShortcuts: handles user keypresses {{{ +" Description:  +function! Tex_HandleBibShortcuts(command) + +	if a:command == 'filter' || a:command == 'sort' + +		let fieldprompt =  +			\ "Field acronyms: (`:let g:Tex_EchoBibFields = 0` to avoid this message)\n" . +			\ " [t] title         [a] author        [b] booktitle     \n" . +			\ " [j] journal       [y] year          [p] bibtype       \n" . +			\ " (you can also enter the complete field name)    \n" + +		let fieldprompt = Tex_GetVarValue('Tex_BibFieldPrompt', fieldprompt) + +		if Tex_GetVarValue('Tex_EchoBibFields', 1) == 1 +			echo fieldprompt +		endif + +		let inp = input('Enter '.a:command.' criterion [field<space>value]: ') +		if inp !~ '\v^\S+\s+\S.*' +			echohl WarningMsg +			echomsg 'Invalid filter specification. Use "field<space>value"' +			echohl None +			return +		endif + +		if inp != '' +			" If the field is specified as a single character, then replace +			" it with the corresponding 'full form'. +			if inp =~ '^[a-z]\>' +				if Tex_GetVarValue('Tex_BibAcronym_'.inp[0]) != '' +					let inp = substitute(inp, '.', Tex_GetVarValue('Tex_BibAcronym_'.inp[0]), '') +				elseif fieldprompt =~ '\['.inp[0].'\]' +					let full = matchstr(fieldprompt, '\['.inp[0].'\] \zs\w\+\ze') +					let inp = substitute(inp, '.', full, '') +				endif +			endif +			call Tex_Debug(":Tex_HandleBibShortcuts: using inp = [".inp."]", "view") +			if a:command == 'filter' +				exec 'python Tex_BibFile.addfilter("'.inp.'")' +			elseif a:command == 'sort' +				exec "python Tex_BibFile.addsortfield(\"".inp."\")" +				exec 'python Tex_BibFile.sort()' +			endif +			silent! call Tex_DisplayBibList() +		endif + +	elseif a:command == 'remove_filters' + +		exec 'python Tex_BibFile.rmfilters()' +		exec 'python Tex_BibFile.addfilter("key ^'.s:prefix.'")' +		call Tex_DisplayBibList() +		 +	endif + +endfunction " }}} +" Tex_CompleteCiteEntry: completes cite entry {{{ +" Description:  +function! Tex_CompleteCiteEntry() +	normal! 0 +	call search('\[\S\+\]$', 'W') +	if getline('.') !~ '\[\S\+\]$' +		call search('\[\S\+\]$', 'bW') +	endif +	 +	if getline('.') !~ '\[\S\+\]$' +		return +	endif + +	let ref = matchstr(getline('.'), '\[\zs\S\+\ze\]$') +	close +	call Tex_Debug(":Tex_CompleteCiteEntry: completing with ".ref, "view") +	call Tex_CompleteWord(ref, strlen(s:prefix)) +endfunction " }}} + +" Tex_SwitchToInsertMode: Switch to insert mode {{{ +" Description: This is usually called when completion is finished +function! Tex_SwitchToInsertMode() +	call Tex_Debug(":Tex_SwitchToInsertMode: ", "view") +	if col('.') == strlen(getline('.')) +		startinsert! +	else +		normal! l +		startinsert +	endif +endfunction " }}} + +com! -nargs=0 TClearCiteHist unlet! s:citeSearchHistory + +" vim:fdm=marker:nowrap:noet:ff=unix:ts=4:sw=4 diff --git a/ftplugin/latex-suite/version.vim b/ftplugin/latex-suite/version.vim new file mode 100644 index 00000000..3da5ef42 --- /dev/null +++ b/ftplugin/latex-suite/version.vim @@ -0,0 +1,30 @@ +" Tex_Version: returns a string which gives the current version number of latex-suite +" Description:  +" 	Each time a bug fix/addition is done in any source file in latex-suite, +" 	not just this file, the number below has to be incremented by the author. +" 	This will ensure that there is a single 'global' version number for all of +" 	latex-suite. +" +" 	If a change is done in the doc/ directory, i.e an addition/change in the +" 	documentation, then this number should NOT be incremented. +" +" 	Latex-suite will follow a 3-tier system of versioning just as Vim. A +" 	version number will be of the form: +"		 +"		X.Y.ZZ +" +"	'X' 	will only be incremented for a major over-haul or feature addition. +"	'Y' 	will be incremented for significant changes which do not qualify +"			as major. +"	'ZZ' 	will be incremented for bug-fixes and very trivial additions such +"			as adding an option etc. Once ZZ reaches 50, then Y will be +"			incremented and ZZ will be reset to 01. Each time we have a +"			version number of the form X.Y.01, then we'll make a release on +"			vim.sf.net and also create a cvs tag at that point. We'll try to +"			"stabilize" that version by releasing a few pre-releases and then +"			keep that as a stable point. +function! Tex_Version() +	return "Latex-Suite: version 1.8.23" +endfunction  + +com! -nargs=0 TVersion echo Tex_Version() diff --git a/ftplugin/latex-suite/wizardfuncs.vim b/ftplugin/latex-suite/wizardfuncs.vim new file mode 100644 index 00000000..4a290698 --- /dev/null +++ b/ftplugin/latex-suite/wizardfuncs.vim @@ -0,0 +1,376 @@ +"        File: wizardfuncs.vim +"      Author: Mikolaj Machowski <mikmach@wp.pl> +" Description:  +"  +" Installation: +"      History: pluginized by Srinath Avadhanula +"============================================================================= + +if exists('s:doneOnce') +	finish +endif +let s:doneOnce = 1 + +let s:mapleader = exists('mapleader') ? mapleader : "\\" +" ============================================================================== +" Specialized functions for handling sections from command line +" ==============================================================================  + +com! -nargs=? TSection call Tex_section(<f-args>) +com! -nargs=? TSectionAdvanced call Tex_section_adv(<f-args>) + +" Tex_VisSecAdv: handles visual selection for sections {{{ +function! Tex_VisSecAdv(section) +	let shorttitle =  input("Short title? ") +	let toc = input("Include in table of contents [y]/n ? ") +	let sstructure = "\\".a:section +	if ( toc == "" || toc == "y" ) +		let toc = "" +	else +		let toc = "*" +	endif +	if shorttitle != "" +		let shorttitle = '['.shorttitle.']' +	endif +	exe "normal `>a}\<cr>\<esc>`<i".sstructure.toc.shorttitle."{" +endfunction  + +" }}} +" Tex_InsSecAdv: section wizard in insert mode {{{ +function! Tex_InsSecAdv(structure) +	let ttitle = input("Title? ") +	let shorttitle =  input("Short title? ") +	let toc = input("Include in table of contents [y]/n ? ") +	"Structure +	let sstructure = "\\".a:structure +	"TOC +	if ( toc == "" || toc == "y" ) +		let toc = "" +	else +		let toc = "*" +	endif +	"Shorttitle +	if shorttitle != "" +		let shorttitle = '['.shorttitle.']' +	endif +	"Title +	let ttitle = '{'.ttitle.'}' +	"Happy end? +	return sstructure.toc.shorttitle.ttitle  +endfunction  + +" }}} +function! Tex_section(...) "{{{ +	silent let pos = Tex_GetPos() +	silent let last_section_value = s:Tex_section_detection() +	if a:0 == 0 +		silent let last_section_name = s:Tex_section_name(last_section_value) +		silent call s:Tex_section_call(last_section_name) +	elseif a:1 =~ "[+=\-]" +		silent let sec_arg = a:1 +		silent let curr_section_value = s:Tex_section_curr_rel_value(sec_arg, last_section_value) +		silent let curr_section_name = s:Tex_section_name(curr_section_value) +		silent call s:Tex_section_call(curr_section_name) +	elseif a:1 == "?" +		echo s:last_section_line +	else +		silent let curr_section_value = s:Tex_section_curr_value(a:1) +		silent let curr_section_name = s:Tex_section_name(curr_section_value) +		silent call s:Tex_section_call(curr_section_name) +	endif +	silent call Tex_SetPos(pos) +endfunction "}}} +function! Tex_section_adv(...) "{{{ +	let pos = Tex_GetPos() +	silent let last_section_value = s:Tex_section_detection() +	if a:0 == 0 +		silent let last_section_name = s:Tex_section_name(last_section_value) +		let section = Tex_InsSecAdv(last_section_name) +	elseif a:1 =~ "[+=\-]" +		silent let sec_arg = a:1 +		silent let curr_section_value = s:Tex_section_curr_rel_value(sec_arg, last_section_value) +		silent let curr_section_name = s:Tex_section_name(curr_section_value) +		let section = Tex_InsSecAdv(curr_section_name) +	else +		silent let curr_section_value = s:Tex_section_curr_value(a:1) +		silent let curr_section_name = s:Tex_section_name(curr_section_value) +		silent call s:Tex_section_call(curr_section_name) +		let section = Tex_InsSecAdv(curr_section_name) +	endif +	exe "normal i".section +	call Tex_SetPos(pos) +endfunction "}}} +function! s:Tex_section_detection() "{{{ +	let pos = Tex_GetPos() +	let last_section1 = search("\\\\\subparagraph\\|\\\\paragraph\\|\\\\subsubsection\\|\\\\subsection\\|\\\\section\\|\\\\chapter\\|\\\part\)", "b") +	call Tex_SetPos(pos) +	let last_section2 = search("\\\\\part\\|\\\\chapter\\|\\\\section\\|\\\\subsection\\|\\\\subsubsection\\|\\\\paragraph\\|\\\subparagraph\)", "b") +	if last_section1 > last_section2 +		let last_section = last_section1 +	else +		let last_section = last_section2 +	endif +	if last_section != 0 +		exe last_section +		if getline(".") =~ "\\\\part" +			let last_section_value = 0 +		elseif getline(".") =~ "\\\\chapter" +			let last_section_value = 1 +		elseif getline(".") =~ "\\\\section" +			let last_section_value = 2 +		elseif getline(".") =~ "\\\\subsection" +			let last_section_value = 3 +		elseif getline(".") =~ "\\\\subsubsection" +			let last_section_value = 4 +		elseif getline(".") =~ "\\\\paragraph" +			let last_section_value = 5 +		elseif getline(".") =~ "\\\\subparagraph" +			let last_section_value = 6 +		endif +		let s:last_section_line = getline(".") +	else +		let last_section_value = 0 +	endif +	call Tex_SetPos(pos) +	return last_section_value +endfunction "}}} +function! s:Tex_section_curr_value(sec_arg) "{{{ +	if a:sec_arg == "pa" || a:sec_arg == "0" || a:sec_arg == "part" +		let curr_section_value = 0 +	elseif a:sec_arg == "ch" || a:sec_arg == "1" || a:sec_arg == "chapter" +		let curr_section_value = 1 +	elseif a:sec_arg == "se" || a:sec_arg == "2" || a:sec_arg == "section" +		let curr_section_value = 2 +	elseif a:sec_arg == "ss" || a:sec_arg == "3" || a:sec_arg == "subsection" +		let curr_section_value = 3 +	elseif a:sec_arg == "s2" || a:sec_arg == "4" || a:sec_arg == "subsubsection" +		let curr_section_value = 4 +	elseif a:sec_arg == "pr" || a:sec_arg == "5" || a:sec_arg == "paragraph" +		let curr_section_value = 5 +	elseif a:sec_arg == "sp" || a:sec_arg == "6" || a:sec_arg == "subparagraph" +		let curr_section_value = 6 +	endif +	return curr_section_value +endfunction "}}} +function! s:Tex_section_curr_rel_value(sec_arg, last_section_value) "{{{ +	let last_section_value = a:last_section_value +	if a:sec_arg == "+" || a:sec_arg == "+1" +		let curr_section_value = last_section_value + 1 +	elseif a:sec_arg == "++" || a:sec_arg == "+2" +		let curr_section_value = last_section_value + 2 +	elseif a:sec_arg == "-" || a:sec_arg == "-1" +		let curr_section_value = last_section_value - 1 +	elseif a:sec_arg == "--" || a:sec_arg == "-2" +		let curr_section_value = last_section_value - 2 +	elseif a:sec_arg == "=" +		let curr_section_value = last_section_value +	else +		exe "let curr_section_value = last_section_value".a:sec_arg +	endif +	if curr_section_value < 0 +		let curr_section_value = 0 +	elseif curr_section_value > 6 +		let curr_section_value = 6 +	endif +	return curr_section_value +endfunction "}}} +function! s:Tex_section_name(section_value) "{{{ +	if a:section_value == 0 +		let section_name = "part" +	elseif a:section_value == 1 +		let section_name = "chapter" +	elseif a:section_value == 2 +		let section_name = "section" +	elseif a:section_value == 3 +		let section_name = "subsection" +	elseif a:section_value == 4 +		let section_name = "subsubsection" +	elseif a:section_value == 5 +		let section_name = "paragraph" +	elseif a:section_value == 6 +		let section_name = "subparagraph" +	endif +	return section_name +endfunction "}}} +function! s:Tex_section_call(section_name) "{{{ +	exe "normal! i\\".a:section_name."{<++>}<++>\<Esc>0\<C-j>" +"	let ret_section = "\\".a:section_name."{<++>}<++>" +"	exe "normal! i\<C-r>=IMAP_PutTextWithMovement(ret_section)\<CR>" +"	normal f}i +endfunction "}}} + +" ============================================================================== +" Add looking help into latexhelp.txt +" ==============================================================================  + +inoremap <silent> <Plug>Tex_Help <C-o>:call <SID>TexHelp()<CR> +nnoremap <silent> <Plug>Tex_Help :call <SID>TexHelp()<CR> +command! -nargs=0 THelp call <SID>TexHelp() +call Tex_MakeMap('<F1>', '<Plug>Tex_Help', 'i', '') +call Tex_MakeMap('<F1>', '<Plug>Tex_Help', 'n', '') + +" TexHelp: Cursor being on LaTeX item check if exists help tag about it " {{{ +function! s:TexHelp() +	let syntax_item = synIDattr(synID(line('.'),col('.')-1,0),"name") +	if syntax_item =~ '^tex' +		setlocal isk+=\ +		let curword = expand('<cword>') +		setlocal isk-=\ +		let v:errmsg = '' +		if curword =~ "^\\" || syntax_item == 'texSectionName' +			exe 'silent! help '.curword +			if v:errmsg =~ '^E149:' +				echohl ErrorMsg +				exe "echomsg 'Sorry, no help for LaTeX: ".curword."'" +				echohl None +				let v:errmsg = '' +			endif +		else +			help +		endif +	else +		help +	endif +endfunction " }}} + +" ============================================================================== +" Tables of shortcuts +" ==============================================================================  +" +command! -nargs=? Tshortcuts call Tex_shortcuts(<f-args>)<CR> + +" Tex_shortcuts: Show shortcuts in terminal after : command {{{ +function! Tex_shortcuts(...) +	if a:0 == 0 +		let shorts = input(" Allowed arguments are:" +		\."\n g     General" +		\."\n e     Environments" +		\."\n f     Fonts" +		\."\n s     Sections" +		\."\n m     Math" +		\."\n a     All" +		\."\n Enter your choice (<Enter> quits) : ") +		call Tex_shortcuts(shorts) +	elseif a:1 == 'g' +		echo g:generalshortcuts +	elseif a:1 == 'e' +		echo g:environmentshortcuts +	elseif a:1 == 'f' +		echo g:fontshortcuts +	elseif a:1 == 's' +		echo g:sectionshortcuts +	elseif a:1 == 'm' +		echo g:mathshortcuts +	elseif a:1 == 'a' +		echo g:generalshortcuts +		echo g:environmentshortcuts +		echo g:fontshortcuts +		echo g:sectionshortcuts +		echo g:mathshortcuts +	endif + +endfunction +" }}} + +" General shortcuts {{{ +let g:generalshortcuts = '' +\."\n General shortcuts" +\."\n <mapleader> is a value of <Leader>" +\."\n ".s:mapleader.'ll	compile whole document' +\."\n ".s:mapleader.'lv	view compiled document' +\."\n ".s:mapleader.'ls	forward searching (if possible)' +\."\n ".s:mapleader.'rf	refresh folds' +" }}} +" Environment shortcuts {{{ +let g:environmentshortcuts = '' +\."\n Environment shortcuts" +\."\n <mapleader> is a value of g:Tex_Leader2" +\."\n I     v&V                       I     v&V" +\."\n ELI   ".g:Tex_Leader2."li   list                EQN   ".g:Tex_Leader2."qn   quotation" +\."\n EDE   ".g:Tex_Leader2."de   description         ESP   ".g:Tex_Leader2."sb   sloppypar" +\."\n EEN   ".g:Tex_Leader2."en   enumerate           ETI   ".g:Tex_Leader2."ti   theindex" +\."\n EIT   ".g:Tex_Leader2."it   itemize             ETP   ".g:Tex_Leader2."tp   titlepage" +\."\n ETI   ".g:Tex_Leader2."ti   theindex            EVM   ".g:Tex_Leader2."vm   verbatim" +\."\n ETL   ".g:Tex_Leader2."tl   trivlist            EVE   ".g:Tex_Leader2."ve   verse" +\."\n ETE   ".g:Tex_Leader2."te   table               ETB   ".g:Tex_Leader2."tb   thebibliography" +\."\n ETG   ".g:Tex_Leader2."tg   tabbing             ENO   ".g:Tex_Leader2."no   note" +\."\n ETR   ".g:Tex_Leader2."tr   tabular             EOV   ".g:Tex_Leader2."ov   overlay" +\."\n EAR   ".g:Tex_Leader2."ar   array               ESL   ".g:Tex_Leader2."sl   slide" +\."\n EDM   ".g:Tex_Leader2."dm   displaymath         EAB   ".g:Tex_Leader2."ab   abstract" +\."\n EEA   ".g:Tex_Leader2."ea   eqnarray            EAP   ".g:Tex_Leader2."ap   appendix" +\."\n EEQ   ".g:Tex_Leader2."eq   equation            ECE   ".g:Tex_Leader2."ce   center" +\."\n EDO   ".g:Tex_Leader2."do   document            EFI   ".g:Tex_Leader2."fi   figure" +\."\n EFC   ".g:Tex_Leader2."fc   filecontents        ELR   ".g:Tex_Leader2."lr   lrbox" +\."\n EFL   ".g:Tex_Leader2."fl   flushleft           EMP   ".g:Tex_Leader2."mp   minipage" +\."\n EFR   ".g:Tex_Leader2."fr   flushright          EPI   ".g:Tex_Leader2."pi   picture" +\."\n EMA   ".g:Tex_Leader2."ma   math                EQE   ".g:Tex_Leader2."qe   quote" +" }}} +" Font shortcuts {{{ +let g:fontshortcuts = '' +\."\n Font shortcuts" +\."\n <mapleader> is a value of g:Tex_Leader" +\."\n Shortcuts         Effects" +\."\n I        v&V      I&v               V" +\."\n FBF      ".g:Tex_Leader."bf      \\textbf{}         {\\bfseries }" +\."\n FMD      ".g:Tex_Leader."md      \\textmd{}         {\\mdseries }" +\."\n" +\."\n FTT      ".g:Tex_Leader."tt      \\texttt{}         {\\ttfamily }" +\."\n FSF      ".g:Tex_Leader."sf      \\textsf{}         {\\sffamily }" +\."\n FRM      ".g:Tex_Leader."rm      \\textrm{}         {\\rmfamily }" +\."\n" +\."\n FUP      ".g:Tex_Leader."up      \\textup{}         {\\upshape }" +\."\n FSL      ".g:Tex_Leader."sl      \\textsl{}         {\\slshape }" +\."\n FSC      ".g:Tex_Leader."sc      \\textsc{}         {\\scshape }" +\."\n FIT      ".g:Tex_Leader."it      \\textit{}         {\\itshape }" +" }}} +" Section shortcuts {{{ +let g:sectionshortcuts = '' +\."\n Section shortcuts" +\."\n <mapleader> is a value of g:Tex_Leader2" +\."\n I     v&V" +\."\n SPA   ".g:Tex_Leader2."pa   part" +\."\n SCH   ".g:Tex_Leader2."ch   chapter" +\."\n SSE   ".g:Tex_Leader2."se   section" +\."\n SSS   ".g:Tex_Leader2."ss   subsection" +\."\n SS2   ".g:Tex_Leader2."s2   subsubsection" +\."\n SPG   ".g:Tex_Leader2."pg   paragraph" +\."\n SSP   ".g:Tex_Leader2."sp   subparagraph" +" }}} +" Math shortcuts {{{ +let g:mathshortcuts = '' +\."\n Math shortcuts - Insert mode" +\."\n `a     \\alpha            `b     \\beta" +\."\n `g     \\gamma            `d     \\delta" +\."\n `e     \\varepsilon       `z     \\zeta" +\."\n `h     \\eta              `q     \\theta" +\."\n `i     \\iota             `k     \\kappa" +\."\n `l     \\lambda           `m     \\mu" +\."\n `n     \\nu               `x     \\xi" +\."\n `p     \\pi               `r     \\rho" +\."\n `s     \\sigma            `v     \\varsigma" +\."\n `t     \\tau              `u     \\upsilon" +\."\n `f     \\varphi           `c     \\chi" +\."\n `y     \\psi              `w     \\omega" +\."\n `A     \\Alpha            `B     \\Beta" +\."\n `G     \\Gamma            `D     \\Delta" +\."\n `E     \\Epsilon          `Z     \\mathrm{Z}" +\."\n `H     \\Eta              `K     \\Kappa" +\."\n `L     \\Lambda           `M     \\Mu" +\."\n `N     \\Nu               `X     \\Xi" +\."\n `P     \\Pi               `R     \\Rho" +\."\n `S     \\Sigma            `T     \\Tau" +\."\n `U     \\Upsilon          `C     \\Chi" +\."\n `Y     \\Psi              `W     \\Omega" +\."\n `(     \\subset           `)     \\Subset" +\."\n `=     \\equiv            =~     \\approx" +\."\n `-     \\bigcap           `+     \\bigcup" +\."\n `.     \\cdot             `*     \\times" +\."\n `\\     \\setminus         `@     \\circ" +\."\n `&     \\wedge            `,     \\nonumber" +\."\n `8     \\infty            `_     \\bar{}" +\."\n `:     \\ddot{}           `;     \\dot{}" +\."\n `^     \\hat{}            `~     \\tilde{}" +\."\n `6     \\partial" +" }}} + +" vim:fdm=marker:ff=unix:noet:ts=4:sw=4 | 
