├── Makefile ├── ftplugin ├── tex_nine │ ├── skeleton │ │ ├── tex_skeleton.tex.make │ │ ├── tex_skeleton.tex.latex │ │ ├── tex_skeleton.tex.pdflatex │ │ └── tex_skeleton.tex.xelatex │ ├── snippets │ │ ├── tex_snippets.snippets │ │ └── bib_snippets.snippets │ ├── tex_nine_synctex.py │ ├── tex_nine_common.vim │ ├── tex_nine_utils.py │ ├── evince_dbus.py │ ├── tex_dictionary.txt │ ├── tex_nine_symbols.py │ └── __init__.py ├── bib_nine.vim └── tex_nine.vim ├── README ├── README.orig ├── indent └── tex.vim ├── autoload └── tex_nine.vim ├── doc └── tex_nine.txt └── LICENSE /Makefile: -------------------------------------------------------------------------------- 1 | 2 | VERSION=`git describe` 3 | PROGRAM=tex_nine 4 | NAME=$(PROGRAM)-$(VERSION) 5 | 6 | all: 7 | git archive --prefix=$(NAME)/ -o $(NAME).tar.gz -9 $(VERSION) 8 | 9 | -------------------------------------------------------------------------------- /ftplugin/tex_nine/skeleton/tex_skeleton.tex.make: -------------------------------------------------------------------------------- 1 | % vim:tw=72 sw=2 ft=tex 2 | % File: ${_file} 3 | % Date Created: ${_date_created} 4 | % Last Change: 5 | % Compiler: make 6 | % Author: ${_author} 7 | \documentclass{article} 8 | 9 | \begin{document} 10 | 11 | 12 | \end{document} 13 | -------------------------------------------------------------------------------- /ftplugin/tex_nine/skeleton/tex_skeleton.tex.latex: -------------------------------------------------------------------------------- 1 | % vim:tw=72 sw=2 ft=tex 2 | % File: ${_file} 3 | % Date Created: ${_date_created} 4 | % Last Change: 5 | % Compiler: latex 6 | % Author: ${_author} 7 | \documentclass[12pt,a4paper]{article} 8 | \usepackage{amsmath, amssymb} 9 | \usepackage[utf8]{inputenc} 10 | \usepackage[T1]{fontenc} 11 | \usepackage[english]{babel} 12 | \usepackage[dvips]{graphicx} 13 | 14 | \begin{document} 15 | 16 | 17 | \end{document} 18 | -------------------------------------------------------------------------------- /ftplugin/tex_nine/skeleton/tex_skeleton.tex.pdflatex: -------------------------------------------------------------------------------- 1 | % vim:tw=72 sw=2 ft=tex 2 | % File: ${_file} 3 | % Date Created: ${_date_created} 4 | % Last Change: 5 | % Compiler: pdflatex 6 | % Author: ${_author} 7 | \documentclass[12pt,a4paper]{article} 8 | \usepackage{amsmath, amssymb} 9 | \usepackage[utf8]{inputenc} 10 | \usepackage[T1]{fontenc} 11 | \usepackage[english]{babel} 12 | \usepackage{graphicx} 13 | 14 | \begin{document} 15 | 16 | 17 | \end{document} 18 | -------------------------------------------------------------------------------- /ftplugin/tex_nine/skeleton/tex_skeleton.tex.xelatex: -------------------------------------------------------------------------------- 1 | % vim:tw=72 sw=2 ft=tex 2 | % File: ${_file} 3 | % Date Created: ${_date_created} 4 | % Last Change: 5 | % Compiler: xelatex 6 | % Author: ${_author} 7 | \documentclass[12pt,a4paper]{article} 8 | \usepackage{amsmath, amssymb} 9 | \usepackage{fontspec} 10 | \defaultfontfeatures{Ligatures=TeX} 11 | \usepackage[math-style=ISO, 12 | bold-style=ISO]{unicode-math} 13 | \usepackage{polyglossia} 14 | \setdefaultlanguage{english} 15 | 16 | % The rest 17 | \usepackage{graphicx} 18 | \usepackage{booktabs, tabularx} 19 | \usepackage{url} 20 | \usepackage[super]{natbib} 21 | 22 | \begin{document} 23 | 24 | 25 | \end{document} 26 | -------------------------------------------------------------------------------- /ftplugin/tex_nine/snippets/tex_snippets.snippets: -------------------------------------------------------------------------------- 1 | # vim:tw=0 sw=2 sts=2 2 | # table 3 | snippet table 4 | \begin{table} 5 | \begin{tabular} 6 | \end{tabular} 7 | \caption{\label{}} 8 | \end{table} 9 | 10 | # figure 11 | snippet figure 12 | \begin{figure} 13 | \includegraphics{} 14 | \caption{\label{}} 15 | \end{figure} 16 | 17 | # equation 18 | snippet equation 19 | \begin{equation} 20 | \label{eq:} 21 | \end{equation} 22 | 23 | # equation* 24 | snippet equation* 25 | \begin{equation*} 26 | \end{equation*} 27 | 28 | # align 29 | snippet align 30 | \begin{align} 31 | \label{eq:} 32 | \end{align} 33 | 34 | # align* 35 | snippet align* 36 | \begin{align*} 37 | \end{align*} 38 | 39 | # letter 40 | snippet letter 41 | \begin{letter}{} 42 | 43 | \opening{} 44 | 45 | \closing{} 46 | 47 | \end{letter} 48 | 49 | # enumerate 50 | snippet enumerate 51 | \begin{enumerate} 52 | \item 53 | \end{enumerate} 54 | 55 | snippet itemize 56 | \begin{itemize} 57 | \item 58 | \end{itemize} 59 | 60 | # bibliography 61 | snippet bibliography 62 | \begin{thebibliography}{} 63 | \bibitem[Surname(year)Surname Initial]{key} 64 | Name, 65 | \textit{Title}, 66 | [ Series, Volume etc. ], Publisher, Location, Edition, 67 | Year. 68 | \end{thebibliography} 69 | 70 | # subfloat 71 | snippet subfloat 72 | \subfloat[]{ 73 | \includegraphics[width=0.45\textwidth]{} 74 | } 75 | 76 | snippet frame 77 | \begin{frame} 78 | 79 | \end{frame} 80 | 81 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | This is a mirror of http://www.vim.org/scripts/script.php?script_id=3508 2 | 3 | TeX-9 4 | 5 | Author: Elias Toivanen 6 | License: GPL 7 | Version: 1.3.13 8 | 9 | TeX-9 is a ftplugin that aims to enhance the writing experience of high 10 | quality documents with LaTeX and Vim. The goal of TeX-9 is to be simple 11 | and Vimish, meaning that focus is on carefully thought-out key mappings 12 | and features that are already present in a typical Vim installation. If 13 | you need to write a thesis or research articles and insist on having only 14 | one editor for all editing tasks, then TeX-9 is for you! 15 | 16 | TeX-9 uses Python2.x as its backend and therefore a Vim installation with 17 | Python support is required. TeX-9 is being developed on Linux running 18 | Vim 7.4. 19 | 20 | The main features of TeX-9 are 21 | * Compile, debug and launch a document viewer from within Vim 22 | * Insert LaTeX code snippets with ease 23 | * Powerful text-object for LaTeX environments 24 | * Omni-completion of BibTeX database entries and label references 25 | * Omni-completion of mathematical symbols 26 | * SyncTeX support (for the Evince document viewer) 27 | * Filetype specific indentation (courtesy of Johannes Tanzler) 28 | * LaTeX2e manual (ported to Vim by Mikolaj Machowski) 29 | * No-hassle settings, relatively few mappings 30 | 31 | ============================================================================== 32 | 33 | -------------------------------------------------------------------------------- /ftplugin/tex_nine/tex_nine_synctex.py: -------------------------------------------------------------------------------- 1 | 2 | import evince_dbus 3 | from urllib import pathname2url, url2pathname 4 | import dbus.mainloop.glib 5 | import vim 6 | import time 7 | 8 | class TeXNineSyncTeX(evince_dbus.EvinceWindowProxy): 9 | def __init__(self, target, logger = None): 10 | 11 | self.uri = self._path_to_uri(target) 12 | evince_dbus.EvinceWindowProxy.__init__(self, self.uri, 13 | spawn = False, 14 | logger = logger) 15 | self.set_source_handler(self.source_handler_vim) 16 | 17 | # Forward search: Vim -> Evince 18 | def forward_search(self, fname, cursor): 19 | self.SyncView(fname, cursor, int(time.time())) 20 | 21 | # Backward search: Evince -> Vim 22 | def source_handler_vim(self, input_file, source_link, timestamp): 23 | input_file = self._uri_to_path(input_file) 24 | input_file = input_file.replace(' ', '\ ') 25 | row = source_link[0] 26 | try: 27 | vim.command('buffer {0}'.format(input_file)) 28 | except vim.error: 29 | vim.command('edit {0}'.format(input_file)) 30 | finally: 31 | vim.current.window.cursor = (row, vim.current.window.cursor[1]) 32 | vim.command('exe "normal" "\\V"') 33 | 34 | def _path_to_uri(self, fname): 35 | uri = "file://" 36 | uri += pathname2url(fname) 37 | return uri 38 | 39 | def _uri_to_path(self, uri, enc='latin1'): 40 | uri = uri[len('file://'):] 41 | fname = url2pathname(uri).encode(enc) 42 | return fname 43 | 44 | # Hook Vim to DBus 45 | dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) 46 | -------------------------------------------------------------------------------- /README.orig: -------------------------------------------------------------------------------- 1 | 2 | TeX-9 3 | 4 | A semi-automatic, prefix-operated 5 | TeX ftplugin 6 | with lots of firepower! 7 | 8 | Author: Elias Toivanen 9 | Email: [1] 10 | License: GPL 11 | Version: 1.3.13 12 | 13 | TeX-9 is a ftplugin that aims to enhance the writing experience of high 14 | quality documents with LaTeX and Vim. The goal of TeX-9 is to be simple 15 | and Vimish, meaning that focus is on carefully thought-out key mappings 16 | and features that are already present in a typical Vim installation. If 17 | you need to write a thesis or research articles and insist on having only 18 | one editor for all editing tasks, then TeX-9 is for you! 19 | 20 | TeX-9 uses Python2.x as its backend and therefore a Vim installation with 21 | Python support is required. TeX-9 is being developed on Linux running 22 | Vim 7.4 23 | 24 | The main features of TeX-9 are 25 | * Compile, debug and launch a document viewer from within Vim 26 | * Insert LaTeX code snippets with ease 27 | * Powerful text-object for LaTeX environments 28 | * Omni-completion of BibTeX database entries and label references 29 | * Omni-completion of mathematical symbols 30 | * SyncTeX support (for the Evince document viewer) 31 | * Filetype specific indentation (courtesy of Johannes Tanzler) 32 | * LaTeX2e manual (ported to Vim by Mikolaj Machowski) 33 | * No-hassle settings, relatively few mappings 34 | 35 | ============================================================================== 36 | 37 | 1. Quick help for installation 38 | 39 | * Unzip the tarball to your local Vim tree (usually ~/.vim) 40 | * Update helptags (:helptags ~/.vim/doc/) 41 | * Read the help on TeX-9 (:help tex_nine) 42 | 43 | ============================================================================== 44 | 45 | [1] http://www.google.com/recaptcha/mailhide/d?k=01zYGjcmroKw0SapWSzBKoIQ==&c=a4IzT40CjKv-Rc9xXg4HCrD2AUf-Ku8Qb77II5iVomQ= 46 | 47 | ============================================================================== 48 | 49 | vim:tw=72:ts=8:norl 50 | 51 | 52 | -------------------------------------------------------------------------------- /indent/tex.vim: -------------------------------------------------------------------------------- 1 | " Vim indent file 2 | " Language: LaTeX 3 | " Maintainer: Johannes Tanzler 4 | " Created: Sat, 16 Feb 2002 16:50:19 +0100 5 | " Last Change: Sun, 17 Feb 2002 00:09:11 +0100 6 | " Last Update: 2013-08-06 7 | " ET: Modified this script for TeX 9. Items are indented 8 | " automatically. 9 | " Version: 1.3.13 10 | 11 | " Disable system wide indentation 12 | let b:did_indent = 1 13 | 14 | " Control TeX-9 indentation 15 | if exists("b:did_tex_nine_indent") | finish 16 | endif 17 | let b:did_tex_nine_indent = 1 18 | 19 | setlocal indentexpr=TeXNineIndent() 20 | setlocal nolisp 21 | setlocal nosmartindent 22 | setlocal autoindent 23 | setlocal indentkeys+=},=\\item,=\\bibitem 24 | 25 | " Only define the function once 26 | if exists("*TeXNineIndent") | finish 27 | endif 28 | 29 | function TeXNineIndent() 30 | 31 | " Find a non-blank line above the current line. 32 | let lnum = prevnonblank(v:lnum - 1) 33 | 34 | " At the start of the file use zero indent. 35 | if lnum == 0 | return 0 36 | endif 37 | 38 | let ind = indent(lnum) 39 | let line = getline(lnum) " first line in the current range 40 | let cline = getline(v:lnum) " current line 41 | 42 | if line =~ '^\s*%' 43 | return ind " Do not change indentation of commented lines. 44 | endif 45 | 46 | let openingpat = '\\\(begin\|section\*\=\|paragraph\*\=\)\(\[.\+\]\)\={\(.*\)}' 47 | let endpat = '\\\(end\|section\*\=\|paragraph\*\=\)\(\[.\+\]\)\={\(.*\)}' 48 | let excluded = 'begin{document}\|begin{verbatim}\|end{document}\|end{verbatim}' 49 | 50 | " Add/remove a 'shiftwidth' after an environment begins/ends. 51 | " Add an additional 'shiftwidth' when entering a list and when typing in 52 | " an item of a list. 53 | if line =~ openingpat && line !~ excluded 54 | let ind += &sw 55 | 56 | " Add another sw for item-environments 57 | if line =~ 'itemize\|description\|enumerate\|thebibliography\|parts' 58 | let ind += &sw 59 | endif 60 | endif 61 | 62 | " Subtract a 'shiftwidth' when an environment ends 63 | if cline =~ endpat && cline !~ excluded 64 | let ind -= &sw 65 | " Remove another sw for item-environments 66 | if cline =~ 'itemize\|description\|enumerate\|thebibliography\|parts' 67 | let ind -= &sw 68 | endif 69 | endif 70 | 71 | " Special treatment for 'item' 72 | if cline =~ '^\s*\\\(bib\)\=item\|^\s*\\part' 73 | let ind -= &sw 74 | endif 75 | 76 | if line =~ '^\s*\\\(bib\)\=item\|^\s*\\part' 77 | let ind += &sw 78 | endif 79 | 80 | return ind 81 | endfunction 82 | 83 | " vim: fdm=marker 84 | -------------------------------------------------------------------------------- /ftplugin/tex_nine/tex_nine_common.vim: -------------------------------------------------------------------------------- 1 | " LaTeX filetype plugin: Common settings 2 | " Language: LaTeX (ft=tex), BibTeX (ft=bib) 3 | " Maintainer: Elias Toivanen 4 | " Version: 1.3.13 5 | " Last Change: 6 | " Licence: GPL 7 | 8 | "************************************************************************ 9 | " 10 | " This program is free software: you can redistribute it and/or modify 11 | " it under the terms of the GNU General Public License as published by 12 | " the Free Software Foundation, either version 3 of the License, or 13 | " (at your option) any later version. 14 | " 15 | " This program is distributed in the hope that it will be useful, 16 | " but WITHOUT ANY WARRANTY; without even the implied warranty of 17 | " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 | " GNU General Public License for more details. 19 | " 20 | " You should have received a copy of the GNU General Public License 21 | " along with this program. If not, see . 22 | " 23 | " Copyright Elias Toivanen, 2011-2014 24 | "************************************************************************ 25 | 26 | let s:path = fnameescape(expand(':h')) 27 | let b:tex_nine_skeleton = fnameescape(s:path.'/skeleton/tex_skeleton.tex') 28 | let b:tex_nine_snippets = fnameescape(s:path.'/snippets/tex_snippets.snippets') 29 | let b:bib_nine_snippets = fnameescape(s:path.'/snippets/bib_snippets.snippets') 30 | let &dictionary = fnameescape(s:path.'/tex_dictionary.txt') 31 | 32 | " Defaults 33 | let b:tex_nine_config = { 34 | \ 'compiler' : '', 35 | \ 'verbose' : 0, 36 | \ 'leader' : '', 37 | \ 'viewer' : {'app': 'xdg-open', 'target': 'pdf'}, 38 | \ 'disable' : 0, 39 | \ 'debug': 0, 40 | \ 'synctex' : 0, 41 | \ 'extra_args' : '', 42 | \ 'shell_escape' : 0 43 | \} 44 | 45 | " Override values with user preferences 46 | if exists('g:tex_nine_config') 47 | call extend(b:tex_nine_config, g:tex_nine_config) 48 | "unlet g:tex_nine_config 49 | endif 50 | 51 | " Configure the leader 52 | if b:tex_nine_config.leader == '' 53 | if exists('g:maplocalleader') 54 | let b:tex_nine_config.leader = g:maplocalleader 55 | elseif exists('g:mapleader') 56 | let b:tex_nine_config.leader = g:mapleader 57 | else 58 | let b:tex_nine_config.leader = ';' 59 | endif 60 | endif 61 | 62 | " Define Python environment once per Vim session 63 | if !exists('g:tex_nine_did_python') 64 | let g:tex_nine_did_python = 1 65 | let b:tex_nine_config._pypath = s:path 66 | exe "pyfile" fnameescape(b:tex_nine_config._pypath.'/__init__.py') 67 | endif 68 | -------------------------------------------------------------------------------- /ftplugin/tex_nine/snippets/bib_snippets.snippets: -------------------------------------------------------------------------------- 1 | # vim:tw=0 sw=2 sts=2 ft=snippet 2 | snippet article 3 | @article{, 4 | author = {}, 5 | title = {}, 6 | journal = {}, 7 | year = {}, 8 | volume = {}, 9 | number = {}, 10 | pages = {}, 11 | month = {}, 12 | key = {} 13 | } 14 | 15 | snippet book 16 | @book{, 17 | author = {}, 18 | title = {}, 19 | publisher = {}, 20 | year = {} 21 | } 22 | 23 | snippet inbook 24 | @inbook{, 25 | author = {}, 26 | title = {}, 27 | pages = {}, 28 | publisher = {}, 29 | year = {}, 30 | volume = {}, 31 | series = {}, 32 | address = {}, 33 | edition = {}, 34 | month = {}, 35 | note = {}, 36 | key = {} 37 | } 38 | 39 | snippet incollection 40 | @incollection{, 41 | author = {}, 42 | title = {}, 43 | booktitle = {}, 44 | year = {}, 45 | editor = {}, 46 | pages = {}, 47 | organization = {}, 48 | publisher = {}, 49 | address = {}, 50 | month = {}, 51 | note = {}, 52 | key = {} 53 | } 54 | 55 | snippet inproceedings 56 | @inproceedings{, 57 | author = {}, 58 | title = {}, 59 | booktitle = {}, 60 | year = {}, 61 | editor = {}, 62 | series = {}, 63 | pages = {}, 64 | organization = {}, 65 | publisher = {}, 66 | address = {}, 67 | month = {}, 68 | note = {}, 69 | key = {} 70 | } 71 | 72 | snippet manual 73 | @manual{, 74 | title = {}, 75 | author = {}, 76 | organization = {}, 77 | address = {}, 78 | edition = {}, 79 | month = {}, 80 | year = {}, 81 | note = {}, 82 | key = {} 83 | } 84 | 85 | snippet mastersthesis 86 | @mastersthesis{, 87 | author = {}, 88 | title = {}, 89 | school = {}, 90 | year = {}, 91 | address = {}, 92 | month = {}, 93 | note = {}, 94 | key = {} 95 | } 96 | 97 | snippet misc 98 | @misc{, 99 | author = {}, 100 | title = {}, 101 | howpublished = {}, 102 | month = {}, 103 | year = {}, 104 | note = {}, 105 | key = {} 106 | } 107 | 108 | snippet phdthesis 109 | @phdthesis{, 110 | author = {}, 111 | title = {}, 112 | school = {}, 113 | year = {}, 114 | address = {}, 115 | month = {}, 116 | note = {}, 117 | key = {} 118 | } 119 | 120 | snippet proceedings 121 | @proceedings{, 122 | title = {}, 123 | year = {}, 124 | editor = {}, 125 | publisher = {}, 126 | organization = {}, 127 | address = {}, 128 | month = {}, 129 | note = {}, 130 | key = {} 131 | } 132 | 133 | snippet techreport 134 | @techreport{, 135 | author = {}, 136 | title = {}, 137 | institution = {}, 138 | year = {}, 139 | type = {}, 140 | number = {}, 141 | address = {}, 142 | month = {}, 143 | note = {}, 144 | key = {} 145 | } 146 | 147 | snippet unpublished 148 | @unpublished{, 149 | author = {}, 150 | title = {}, 151 | note = {}, 152 | month = {}, 153 | year = {}, 154 | key = {} 155 | } 156 | 157 | -------------------------------------------------------------------------------- /ftplugin/tex_nine/tex_nine_utils.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | #************************************************************************ 3 | # 4 | # TeX-9 library: Python module 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, or 9 | # (at your option) any later version. 10 | # 11 | # This program is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with this program. If not, see . 18 | # 19 | # Copyright Elias Toivanen, 2011-2014 20 | # 21 | #************************************************************************ 22 | 23 | import re 24 | import vim 25 | import sys 26 | 27 | # Utility functions 28 | 29 | def echoerr(errorstr): 30 | sys.stderr.write("TeX-9: {0}\n".format(str(errorstr))) 31 | 32 | def echomsg(msgstr): 33 | sys.stdout.write("TeX-9: {0}\n".format(str(msgstr))) 34 | 35 | def get_latex_environment(vim_window): 36 | """Get information about the current LaTeX environment. 37 | 38 | Returns a dictionary with keys 39 | 'environment': the name of the current LaTeX environment 40 | 'range': 2-tuple of the beginning and ending line numbers 41 | 42 | """ 43 | 44 | pat = re.compile(r'^\s*\\(begin|end){([^}]+)}') 45 | b = list(vim_window.buffer) 46 | row = vim_window.cursor[0] - 1 47 | environment = "" 48 | begin = end = 0 49 | 50 | current_line = b[row] 51 | head = b[row - 1::-1] # From line above to the start 52 | tail = b[row + 1:] # From next line to the end 53 | 54 | c = pat.match(current_line) 55 | if c: 56 | environment = c.group(2) 57 | if c.group(1) == 'end': 58 | end = row + 1 59 | elif c.group(1) == 'begin': 60 | begin = row + 1 61 | 62 | if not begin: 63 | envs = {} 64 | for i, line in enumerate(head): 65 | m = pat.match(line) 66 | if m: 67 | e = m.group(2) 68 | envs[m.groups()] = i 69 | if ('begin', e) in envs and ('end', e) in envs and envs[('end', e)] < envs[('begin', e)]: 70 | # Eliminate nested environments 71 | del envs[('begin', e)] 72 | del envs[('end', e)] 73 | elif ('end', e) not in envs: 74 | begin = row - i 75 | environment = e 76 | break 77 | 78 | if not end: 79 | envs = {} 80 | for i, line in enumerate(tail): 81 | m = pat.match(line) 82 | if m: 83 | envs[m.groups()] = i 84 | e = m.group(2) 85 | if ('begin', e) in envs and ('end', e) in envs: 86 | #and envs[('end', e)] > envs[('begin', e)]: 87 | # Eliminate nested environments 88 | del envs[('begin', e)] 89 | del envs[('end', e)] 90 | elif m.groups() == ('end', environment): 91 | end = row + i + 2 92 | break 93 | 94 | return {'environment': environment, 'range': (begin, end)} 95 | 96 | def is_latex_math_environment(vim_window, 97 | environments = re.compile(r"matrix|cases|math|equation|align|array")): 98 | """Returns True if the cursor is currently on a maths environment.""" 99 | e = get_latex_environment(vim_window) 100 | return bool(environments.search(e['environment'])) 101 | 102 | def find_compiler(vimbuffer, nlines=10): 103 | """Finds the compiler from the header.""" 104 | lines = "\n".join(vimbuffer[:nlines]) 105 | if lines: 106 | c = re.search("^%\s*Compiler:\s*(\S+)", lines, re.M) 107 | if c: 108 | return c.group(1).strip() 109 | else: 110 | return "" 111 | 112 | else: 113 | #Cannot determine the compiler 114 | return "" 115 | 116 | class TeXNineError(Exception): 117 | pass 118 | -------------------------------------------------------------------------------- /ftplugin/bib_nine.vim: -------------------------------------------------------------------------------- 1 | " LaTeX filetype plugin 2 | " Languages: BibTeX 3 | " Maintainer: Elias Toivanen 4 | " Version: 1.3.13 5 | " Last Change: 6 | " License: GPL 7 | 8 | "************************************************************************ 9 | " 10 | " TeX-9 library: Python module 11 | " 12 | " This program is free software: you can redistribute it and/or modify 13 | " it under the terms of the GNU General Public License as published by 14 | " the Free Software Foundation, either version 3 of the License, or 15 | " (at your option) any later version. 16 | " 17 | " This program is distributed in the hope that it will be useful, 18 | " but WITHOUT ANY WARRANTY; without even the implied warranty of 19 | " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 | " GNU General Public License for more details. 21 | " 22 | " You should have received a copy of the GNU General Public License 23 | " along with this program. If not, see . 24 | " 25 | " Copyright Elias Toivanen, 2011-2014 26 | " 27 | " 28 | "************************************************************************ 29 | 30 | if !has('python') 31 | echoerr "TeX-9: a Vim installation with +python is required" 32 | finish 33 | endif 34 | 35 | " Let the user have the last word 36 | if exists('g:tex_nine_config') && has_key(g:tex_nine_config, 'disable') 37 | if g:tex_nine_config.disable 38 | redraw 39 | echomsg("TeX-9: Disabled by user.") 40 | finish 41 | endif 42 | endif 43 | 44 | " Load Vimscript only once per buffer 45 | if exists('b:init_tex_nine') 46 | finish 47 | endif 48 | let b:init_tex_nine = 1 49 | 50 | "*********************************************************************** 51 | ru ftplugin/tex_nine/tex_nine_common.vim 52 | call tex_nine#AddBuffer(b:tex_nine_config, b:bib_nine_snippets) 53 | 54 | "*********************************************************************** 55 | 56 | " Save old leader 57 | if exists('g:maplocalleader') 58 | let s:maplocalleader_saved = g:maplocalleader 59 | endif 60 | let g:maplocalleader = b:tex_nine_config.leader 61 | 62 | inoremap B tex_nine#InsertSnippet() 63 | 64 | " Greek 65 | inoremap a \alpha 66 | inoremap b \beta 67 | inoremap c \chi 68 | inoremap d \delta 69 | inoremap e \epsilon 70 | inoremap f \phi 71 | inoremap g \gamma 72 | inoremap h \eta 73 | inoremap k \kappa 74 | inoremap l \lambda 75 | inoremap m \mu 76 | inoremap n \nu 77 | inoremap o \omega 78 | inoremap p \pi 79 | inoremap q \theta 80 | inoremap r \rho 81 | inoremap s \sigma 82 | inoremap t \tau 83 | inoremap u \upsilon 84 | inoremap w \varpi 85 | inoremap x \xi 86 | inoremap y \psi 87 | inoremap z \zeta 88 | inoremap D \Delta 89 | inoremap F \Phi 90 | inoremap G \Gamma 91 | inoremap L \Lambda 92 | inoremap O \Omega 93 | inoremap P \Pi 94 | inoremap Q \Theta 95 | inoremap U \Upsilon 96 | inoremap X \Xi 97 | inoremap Y \Psi 98 | 99 | " Math 100 | inoremap ½ \sqrt{} 101 | inoremap N \nabla 102 | inoremap S \sum_{}^{}F}i 103 | inoremap I \int\limits_{}^{}F}i 104 | inoremap 0 \emptyset 105 | inoremap 6 \partial 106 | inoremap i \infty 107 | inoremap / \frac{}{}F}i 108 | inoremap v \vee 109 | inoremap & \wedge 110 | inoremap @ \circ 111 | inoremap \ \setminus 112 | inoremap = \equiv 113 | inoremap - \bigcap 114 | inoremap + \bigcup 115 | inoremap < \leq 116 | inoremap > \geq 117 | inoremap ~ \tilde{} 118 | inoremap ^ \hat{} 119 | inoremap _ \bar{} 120 | inoremap . \dot{} 121 | inoremap \nonumber\\ 122 | 123 | " Enlarged delimiters 124 | inoremap ( \left(\right)F(a 125 | inoremap [ \left[\right]F[a 126 | inoremap { \left\{ \right\}F a 127 | 128 | " Neat insertion of various LaTeX constructs by tapping keys 129 | inoremap _ tex_nine#IsLeft('_') ? '{}' : '_' 130 | inoremap ^ tex_nine#IsLeft('^') ? '{}' : '^' 131 | inoremap = tex_nine#IsLeft('=') ? '&=' : '=' 132 | inoremap ~ tex_nine#IsLeft('~') ? '\approx' : '~' 133 | "inoremap < tex_nine#IsLeft('<') ? '\ll' : '<' 134 | "inoremap > tex_nine#IsLeft('>') ? '\gg' : '>' 135 | 136 | if exists('s:maplocalleader_saved') 137 | let g:maplocalleader = s:maplocalleader_saved 138 | else 139 | unlet g:maplocalleader 140 | endif 141 | -------------------------------------------------------------------------------- /ftplugin/tex_nine/evince_dbus.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | # This file is part of the Gedit Synctex plugin. 5 | # 6 | # Copyright (C) 2010 Jose Aliste 7 | # 8 | # This program is free software; you can redistribute it and/or modify it under 9 | # the terms of the GNU General Public Licence as published by the Free Software 10 | # Foundation; either version 2 of the Licence, or (at your option) any later 11 | # version. 12 | # 13 | # This program is distributed in the hope that it will be useful, but WITHOUT 14 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 15 | # FOR A PARTICULAR PURPOSE. See the GNU General Public Licence for more 16 | # details. 17 | # 18 | # You should have received a copy of the GNU General Public Licence along with 19 | # this program; if not, write to the Free Software Foundation, Inc., 51 Franklin 20 | # Street, Fifth Floor, Boston, MA 02110-1301, USA 21 | 22 | ############################ 23 | # 24 | # Modified for TeX 9 25 | # Elias Toivanen, 2012-04-19 26 | # 27 | ############################ 28 | 29 | import dbus 30 | 31 | RUNNING, CLOSED = range(2) 32 | 33 | EV_DAEMON_PATH = "/org/gnome/evince/Daemon" 34 | EV_DAEMON_NAME = "org.gnome.evince.Daemon" 35 | EV_DAEMON_IFACE = "org.gnome.evince.Daemon" 36 | 37 | EVINCE_PATH = "/org/gnome/evince/Evince" 38 | EVINCE_IFACE = "org.gnome.evince.Application" 39 | 40 | EV_WINDOW_IFACE = "org.gnome.evince.Window" 41 | 42 | class EvinceWindowProxy: 43 | """A DBUS proxy for an Evince Window.""" 44 | daemon = None 45 | bus = None 46 | 47 | def __init__(self, uri, spawn = False, logger = None): 48 | self._log = logger 49 | self.uri = uri 50 | self.spawn = spawn 51 | self.status = CLOSED 52 | self.source_handler = None 53 | self.dbus_name = '' 54 | self._handler = None 55 | try: 56 | if EvinceWindowProxy.bus is None: 57 | EvinceWindowProxy.bus = dbus.SessionBus() 58 | 59 | if EvinceWindowProxy.daemon is None: 60 | EvinceWindowProxy.daemon = EvinceWindowProxy.bus.get_object(EV_DAEMON_NAME, 61 | EV_DAEMON_PATH, 62 | follow_name_owner_changes=True) 63 | EvinceWindowProxy.bus.add_signal_receiver(self._on_doc_loaded, signal_name="DocumentLoaded", 64 | dbus_interface = EV_WINDOW_IFACE, 65 | sender_keyword='sender') 66 | self._get_dbus_name(False) 67 | 68 | except dbus.DBusException: 69 | if self._log: 70 | self._log.debug("Could not connect to the Evince Daemon") 71 | 72 | def _on_doc_loaded(self, uri, **keyargs): 73 | if uri == self.uri and self._handler is None: 74 | self.handle_find_document_reply(keyargs['sender']) 75 | 76 | def _get_dbus_name(self, spawn): 77 | EvinceWindowProxy.daemon.FindDocument(self.uri,spawn, 78 | reply_handler=self.handle_find_document_reply, 79 | error_handler=self.handle_find_document_error, 80 | dbus_interface = EV_DAEMON_IFACE) 81 | 82 | def handle_find_document_error(self, error): 83 | if self._log: 84 | self._log.debug("FindDocument DBus call has failed") 85 | 86 | def handle_find_document_reply(self, evince_name): 87 | if self._handler is not None: 88 | handler = self._handler 89 | else: 90 | handler = self.handle_get_window_list_reply 91 | if evince_name != '': 92 | self.dbus_name = evince_name 93 | self.status = RUNNING 94 | self.evince = EvinceWindowProxy.bus.get_object(self.dbus_name, EVINCE_PATH) 95 | self.evince.GetWindowList(dbus_interface = EVINCE_IFACE, 96 | reply_handler = handler, 97 | error_handler = self.handle_get_window_list_error) 98 | 99 | def handle_get_window_list_error (self, e): 100 | if self._log: 101 | self._log.debug("GetWindowList DBus call has failed") 102 | 103 | def handle_get_window_list_reply (self, window_list): 104 | if len(window_list) > 0: 105 | window_obj = EvinceWindowProxy.bus.get_object(self.dbus_name, window_list[0]) 106 | self.window = dbus.Interface(window_obj,EV_WINDOW_IFACE) 107 | self.window.connect_to_signal("Closed", self.on_window_close) 108 | self.window.connect_to_signal("SyncSource", self.on_sync_source) 109 | else: 110 | #That should never happen. 111 | if self._log: 112 | self._log.debug("GetWindowList returned empty list") 113 | 114 | 115 | def set_source_handler (self, source_handler): 116 | self.source_handler = source_handler 117 | 118 | def on_window_close(self): 119 | self.window = None 120 | self.status = CLOSED 121 | 122 | def on_sync_source(self, input_file, source_link, timestamp): 123 | if self.source_handler is not None: 124 | self.source_handler(input_file, source_link, timestamp) 125 | 126 | def SyncView(self, input_file, data, time): 127 | if self.status == CLOSED: 128 | if self.spawn: 129 | self._tmp_syncview = [input_file, data, time]; 130 | self._handler = self._syncview_handler 131 | self._get_dbus_name(True) 132 | else: 133 | self.window.SyncView(input_file, data, time, dbus_interface = "org.gnome.evince.Window") 134 | 135 | def _syncview_handler(self, window_list): 136 | self.handle_get_window_list_reply(window_list) 137 | 138 | if self.status == CLOSED: 139 | return False 140 | 141 | try: 142 | self.window.SyncView(self._tmp_syncview[0], 143 | self._tmp_syncview[1], 144 | self._tmp_syncview[2], 145 | dbus_interface="org.gnome.evince.Window") 146 | del self._tmp_syncview 147 | self._handler = None 148 | return True 149 | 150 | except AttributeError: 151 | # When restarting Vim, _tmp_syncview is forgotten 152 | return False 153 | 154 | 155 | -------------------------------------------------------------------------------- /ftplugin/tex_nine.vim: -------------------------------------------------------------------------------- 1 | " LaTeX filetype plugin 2 | " Languages: LaTeX 3 | " Maintainer: Elias Toivanen 4 | " Version: 1.3.13 5 | " Last Change: 6 | " License: GPL 7 | 8 | "************************************************************************ 9 | " 10 | " TeX-9 library: Vim script 11 | " 12 | " This program is free software: you can redistribute it and/or modify 13 | " it under the terms of the GNU General Public License as published by 14 | " the Free Software Foundation, either version 3 of the License, or 15 | " (at your option) any later version. 16 | " 17 | " This program is distributed in the hope that it will be useful, 18 | " but WITHOUT ANY WARRANTY; without even the implied warranty of 19 | " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 | " GNU General Public License for more details. 21 | " 22 | " You should have received a copy of the GNU General Public License 23 | " along with this program. If not, see . 24 | " 25 | " Copyright Elias Toivanen, 2011-2014 26 | " 27 | " 28 | "************************************************************************ 29 | 30 | if !has('python') 31 | echoerr "TeX-9: a Vim installation with +python is required" 32 | finish 33 | endif 34 | 35 | " Let the user have the last word 36 | if exists('g:tex_nine_config') && has_key(g:tex_nine_config, 'disable') 37 | if g:tex_nine_config.disable 38 | redraw 39 | echomsg("TeX-9: Disabled by user.") 40 | finish 41 | endif 42 | endif 43 | 44 | " Load Vimscript only once per buffer 45 | if exists('b:init_tex_nine') 46 | finish 47 | endif 48 | let b:init_tex_nine = 1 49 | 50 | "*********************************************************************** 51 | ru ftplugin/tex_nine/tex_nine_common.vim 52 | 53 | setlocal completeopt=longest,menuone 54 | setlocal fo=tcq 55 | setlocal tw=72 sw=2 56 | setlocal tabstop=8 57 | setlocal omnifunc=tex_nine#OmniCompletion 58 | setlocal completefunc=tex_nine#MathCompletion 59 | 60 | call tex_nine#AddBuffer(b:tex_nine_config, b:tex_nine_snippets) 61 | call tex_nine#SetAutoCmds(b:tex_nine_config) 62 | 63 | "*********************************************************************** 64 | 65 | " Mappings 66 | 67 | " Leader 68 | 69 | " Save old leader 70 | if exists('g:maplocalleader') 71 | let s:maplocalleader_saved = g:maplocalleader 72 | endif 73 | 74 | let g:maplocalleader = b:tex_nine_config.leader 75 | 76 | " Templates 77 | noremap :call tex_nine#InsertSkeleton(b:tex_nine_skeleton.'.xelatex') 78 | noremap :call tex_nine#InsertSkeleton(b:tex_nine_skeleton.'.pdflatex') 79 | noremap :call tex_nine#InsertSkeleton(b:tex_nine_skeleton.'.latex') 80 | noremap :call tex_nine#InsertSkeleton(b:tex_nine_skeleton.'.make') 81 | 82 | " Viewing 83 | noremap V :call tex_nine#ViewDocument() 84 | 85 | " Compilation 86 | noremap k :call tex_nine#Compile(0, b:tex_nine_config) 87 | noremap K :call tex_nine#Compile(1, b:tex_nine_config) 88 | 89 | " Misc 90 | noremap U :call tex_nine#Reconfigure(b:tex_nine_config) 91 | noremap Q :copen 92 | noremap gd yiB/\\label{0} 93 | noremap gb :call tex_nine#Bibquery(expand('')) 94 | 95 | " Insert mode mappings 96 | inoremap 97 | inoremap K  98 | inoremap M \ 99 | inoremap B tex_nine#InsertSnippet() 100 | imap E tex_nine#SmartInsert('\eqref{') 101 | imap R tex_nine#SmartInsert('\ref{') 102 | imap C tex_nine#SmartInsert('\cite{', '\[cC]ite') 103 | 104 | " SyncTeX 105 | if b:tex_nine_config.synctex 106 | noremap :call tex_nine#ForwardSearch() 107 | endif 108 | 109 | " Greek 110 | inoremap a \alpha 111 | inoremap b \beta 112 | inoremap c \chi 113 | inoremap d \delta 114 | inoremap e \epsilon 115 | inoremap f \phi 116 | inoremap g \gamma 117 | inoremap h \eta 118 | inoremap k \kappa 119 | inoremap l \lambda 120 | inoremap m \mu 121 | inoremap n \nu 122 | inoremap o \omega 123 | inoremap p \pi 124 | inoremap q \theta 125 | inoremap r \rho 126 | inoremap s \sigma 127 | inoremap t \tau 128 | inoremap u \upsilon 129 | inoremap w \varpi 130 | inoremap x \xi 131 | inoremap y \psi 132 | inoremap z \zeta 133 | inoremap D \Delta 134 | inoremap F \Phi 135 | inoremap G \Gamma 136 | inoremap L \Lambda 137 | inoremap O \Omega 138 | inoremap P \Pi 139 | inoremap Q \Theta 140 | inoremap U \Upsilon 141 | inoremap X \Xi 142 | inoremap Y \Psi 143 | 144 | " Math 145 | 146 | " Start mathmode completion 147 | inoremap \ \setminus 148 | inoremap ½ \sqrt{} 149 | inoremap N \nabla 150 | inoremap S \sum_{}^{}F}i 151 | inoremap V \vec{} 152 | inoremap I \int\limits_{}^{}F}i 153 | inoremap 0 \emptyset 154 | inoremap 6 \partial 155 | inoremap i \infty 156 | inoremap / \frac{}{}F}i 157 | inoremap v \vee 158 | inoremap & \wedge 159 | inoremap @ \circ 160 | inoremap * \cdot 161 | inoremap = \equiv 162 | inoremap - \bigcap 163 | inoremap + \bigcup 164 | inoremap < \leq 165 | inoremap > \geq 166 | inoremap ~ \tilde{} 167 | inoremap ^ \hat{} 168 | inoremap _ \bar{} 169 | inoremap . \dot{} 170 | inoremap \nonumber\\ 171 | 172 | " Enlarged delimiters 173 | inoremap ( \left(\right)F(a 174 | inoremap [ \left[\right]F[a 175 | inoremap { \left\{ \right\}F a 176 | 177 | " Neat insertion of various LaTeX constructs by tapping keys 178 | inoremap _ tex_nine#IsLeft('_') ? '{}' : '_' 179 | inoremap ^ tex_nine#IsLeft('^') ? '{}' : '^' 180 | inoremap = tex_nine#IsLeft('=') ? '&=' : '=' 181 | inoremap ~ tex_nine#IsLeft('~') ? '\approx' : '~' 182 | 183 | " These are problematic when you want to type << or >> (C bitshift, C++ operators) 184 | "inoremap < tex_nine#IsLeft('<') ? '\ll' : '<' 185 | "inoremap > tex_nine#IsLeft('>') ? '\gg' : '>' 186 | 187 | " Robust inner/outer environment operators 188 | vmap ae tex_nine#EnvironmentOperator('outer') 189 | omap ae :normal vae 190 | vmap ie tex_nine#EnvironmentOperator('inner') 191 | omap ie :normal vie 192 | 193 | if exists('s:maplocalleader_saved') 194 | let g:maplocalleader = s:maplocalleader_saved 195 | else 196 | unlet g:maplocalleader 197 | endif 198 | -------------------------------------------------------------------------------- /ftplugin/tex_nine/tex_dictionary.txt: -------------------------------------------------------------------------------- 1 | a4paper 2 | a5paper 3 | abbrv 4 | abovedisplayshortskip 5 | abovedisplayskip 6 | abstract 7 | abstractname 8 | acute 9 | addcontentsline 10 | address 11 | addtime 12 | addtocontents 13 | addtocounter 14 | addtolength 15 | addvspace 16 | align 17 | align* 18 | Alph 19 | amsmath 20 | amsthm 21 | and 22 | appendix 23 | appendixname 24 | arabic 25 | array 26 | arraycolsep 27 | arrayrulewidth 28 | arraystretch 29 | article 30 | author 31 | b5paper 32 | backmatter 33 | baselineskip 34 | baselinestretch 35 | batchmode 36 | begin 37 | belowdisplayshortskip 38 | belowdisplayskip 39 | bezier 40 | bf 41 | bfseries 42 | bibindent 43 | bibitem 44 | bibliography 45 | bibliographystyle 46 | bibname 47 | biggr 48 | Biggr 49 | bigl 50 | Bigl 51 | bigm 52 | Bigm 53 | bigr 54 | Bigr 55 | bigskip 56 | bigskipamount 57 | binom 58 | blg 59 | bmatrix 60 | Bmatrix 61 | boldmath 62 | boldsymbol 63 | book 64 | booklet 65 | botfigrule 66 | bottmofraction 67 | bottomnumber 68 | boxedminipage 69 | bp 70 | breve 71 | calc 72 | caption 73 | caption2 74 | capt-of 75 | cases 76 | ccaption 77 | ccname 78 | cdotscenter 79 | centering 80 | cercle 81 | cfrac 82 | changebar 83 | chapter 84 | chapterbib 85 | chaptername 86 | check 87 | cite 88 | cleardoublepage 89 | clearpage 90 | cline 91 | clock 92 | closing 93 | cm 94 | COLON 95 | columnsep 96 | columnseprule 97 | columnwidth 98 | conference 99 | contentsline 100 | contentsname 101 | copyright 102 | dashbox 103 | date 104 | dbinom 105 | dblfigure 106 | dblfloatpage 107 | dblfloatsep 108 | dbltextfloatsep 109 | dbltopfraction 110 | dbltopnumber 111 | dcolumn 112 | DeclareMathOperator 113 | depth 114 | description 115 | dfrac 116 | displaylimits 117 | displaymath 118 | displaystyle 119 | document 120 | documentclass 121 | dotfill 122 | doublerulesep 123 | downbracefill 124 | draft 125 | dropping 126 | dywiz 127 | emph 128 | encl 129 | enclname 130 | end 131 | endfloat 132 | enlargethispage 133 | enskip 134 | enspace 135 | ensuremath 136 | enumerate 137 | enumi 138 | enumii 139 | enumiii 140 | enumiv 141 | eqnarray 142 | equation 143 | equation* 144 | errorstopmode 145 | eucal 146 | eufrak 147 | evensidemargin 148 | everyship 149 | executivepaper 150 | expdlist 151 | extracolsep 152 | extramark 153 | fancybox 154 | fancyhdr 155 | fbox 156 | fboxrule 157 | fboxsep 158 | figure 159 | figurename 160 | file 161 | filecontents 162 | final 163 | flafter 164 | fleqn 165 | floatflt 166 | floatpagefraction 167 | floatsep 168 | flushbottom 169 | flushleft 170 | flushright 171 | fn2end 172 | fnpara 173 | fnsymbol 174 | fontenc 175 | footheight 176 | footmisc 177 | footnote 178 | footnotemark 179 | footnoterule 180 | footnotesep 181 | footnotesize 182 | footnotetext 183 | footnpag 184 | footskip 185 | frac 186 | frame 187 | framebox 188 | frenchspacing 189 | frontmatter 190 | ftnright 191 | fussy 192 | gather 193 | genfrac 194 | geometry 195 | glossary 196 | glossaryentry 197 | graphicx 198 | graphpaper 199 | grave 200 | hat 201 | hbox 202 | headheihgt 203 | headings 204 | headsep 205 | height 206 | helvet 207 | hfill 208 | hhline 209 | hline 210 | hrulefill 211 | hspace 212 | huge 213 | Huge 214 | HUGE 215 | hyperref 216 | hyphenation 217 | ifthen 218 | inbook 219 | include 220 | includegraphics 221 | includeonly 222 | incollection 223 | indent 224 | indentfirst 225 | index 226 | indexentry 227 | indexname 228 | indexspace 229 | inproceedings 230 | input 231 | inputenc 232 | intertext 233 | intextsep 234 | invisible 235 | item 236 | itemindent 237 | itemize 238 | itemsep 239 | itshape 240 | jot 241 | kill 242 | label 243 | labelenumi 244 | labelenumii 245 | labelenumiii 246 | labelenumiv 247 | labelitemi 248 | labelitemii 249 | labelitemiii 250 | labelitemiv 251 | labelsep 252 | labelwidth 253 | landscape 254 | large 255 | Large 256 | LARGE 257 | LaTeX 258 | LaTeXe 259 | latexsym 260 | leftarrowfill 261 | lefteqn 262 | leftmargin 263 | leftmargini 264 | leftmarginii 265 | leftmarginiii 266 | leftmarginiv 267 | leftmarginv 268 | leftmarginvi 269 | leftmark 270 | legalpaper 271 | leqno 272 | letter 273 | letterpaper 274 | letterspace 275 | lhead 276 | limits 277 | line 278 | linebreak 279 | linethickness 280 | linewidth 281 | list 282 | listfigurename 283 | listfiles 284 | listoffigures 285 | listoftables 286 | listparindent 287 | location 288 | longtable 289 | lq 290 | lrbox 291 | lscape 292 | mainmatter 293 | makeatletter 294 | makeatother 295 | makebox 296 | makeglossary 297 | makeidx 298 | makeindex 299 | makelabel 300 | maketitle 301 | manual 302 | manyfoot 303 | marginpar 304 | marginparpush 305 | marginparsep 306 | marginparwidth 307 | markboth 308 | markleft 309 | markright 310 | masterthesis 311 | mathbb 312 | mathbf 313 | mathbin 314 | mathcal 315 | mathclose 316 | mathfrak 317 | mathindent 318 | mathit 319 | mathnormal 320 | mathop 321 | mathopen 322 | mathord 323 | mathpunct 324 | mathrel 325 | mathrm 326 | mathscr 327 | mathsf 328 | mathstrut 329 | mathtt 330 | mathversion 331 | mbox 332 | mdseries 333 | medmuskip 334 | medskip 335 | medskipamount 336 | minipage 337 | minitoc 338 | misc 339 | mkern 340 | moreverbatim 341 | mpfootnote 342 | multicol 343 | multicolumn 344 | multilanguage 345 | multiput 346 | multirow 347 | myheadings 348 | name 349 | NeedsTeXFormat 350 | newcommand 351 | newcounter 352 | newenvironment 353 | newfont 354 | newlength 355 | newline 356 | newpage 357 | newsavebox 358 | newtheorem 359 | nocite 360 | nofiles 361 | noindent 362 | nolimits 363 | nolinebreak 364 | nomathsymbols 365 | nonfrenchspacing 366 | nonumber 367 | nopagebreak 368 | normalfont 369 | normalsize 370 | not 371 | notag 372 | note 373 | notitlepage 374 | num 375 | numberline 376 | numline 377 | numprint 378 | oddsidemargin 379 | oldstyle 380 | onecolumn 381 | oneside 382 | onlynotes 383 | onlyslides 384 | openany 385 | openbib 386 | opening 387 | openright 388 | operatorname 389 | oval 390 | overbrace 391 | overlay 392 | overleftarrow 393 | overline 394 | overrightarrow 395 | page 396 | pagebreak 397 | pagenumbering 398 | pageref 399 | pagestyle 400 | paperheight 401 | paperwidth 402 | paragraph 403 | parbox 404 | parindent 405 | parsep 406 | parskip 407 | partname 408 | partopsep 409 | pauza 410 | pc 411 | pdhthesis 412 | picture 413 | plain 414 | PLdateending 415 | plmath 416 | PLSlash 417 | pmatrix 418 | pmb 419 | pmod 420 | polski 421 | poptabs 422 | pounds 423 | ppauza 424 | prefixing 425 | printindex 426 | proceedings 427 | protect 428 | providecommand 429 | pushtabs 430 | put 431 | qbezier 432 | qbeziermax 433 | qquad 434 | quad 435 | quotation 436 | quote 437 | ragged2e 438 | raggedbottom 439 | raggedleft 440 | raggedright 441 | raisebox 442 | ratio 443 | real 444 | ref 445 | refname 446 | refstepcounter 447 | relsize 448 | renewcommand 449 | renewenvironment 450 | report 451 | reversemarginpar 452 | rhead 453 | rightarrowfill 454 | rightmargin 455 | rightmark 456 | rm 457 | rmfamily 458 | roman 459 | Roman 460 | rotate 461 | rotating 462 | rq 463 | rule 464 | samepage 465 | savebox 466 | sb 467 | sbox 468 | sc 469 | scriptscriptstyle 470 | scriptsize 471 | scriptstyle 472 | scrollmode 473 | scshape 474 | secnumdepth 475 | section 476 | sectionmark 477 | see 478 | seename 479 | selectfont 480 | selectlanguage 481 | setcounter 482 | setlength 483 | settime 484 | settodepth 485 | settoheight 486 | settowidth 487 | sf 488 | sffamily 489 | shadethm 490 | shadow 491 | shapepar 492 | shortstack 493 | showlabels 494 | sidecap 495 | signature 496 | sin 497 | slide 498 | slides 499 | sloppy 500 | sloppybar 501 | slshape 502 | small 503 | smallskip 504 | smallskipamount 505 | soul 506 | space 507 | sqrt 508 | ss 509 | SS 510 | stackrel 511 | startbreaks 512 | stepcounter 513 | stop 514 | stopbreaks 515 | stretch 516 | strut 517 | subfigure 518 | subfloat 519 | subitem 520 | subparagraph 521 | subsection 522 | subsubitem 523 | subsubsection 524 | supressfloats 525 | symbol 526 | tabbing 527 | tabcolsep 528 | table 529 | tablename 530 | tableofcontents 531 | tabular 532 | tabularx 533 | tag 534 | tan 535 | tbinom 536 | techreport 537 | telephone 538 | TeX 539 | textbf 540 | textbullet 541 | textcircled 542 | textcompwordmark 543 | textemdash 544 | textendash 545 | textexclamdown 546 | textfloatsep 547 | textfraction 548 | textheight 549 | textit 550 | textmd 551 | textnormal 552 | textperiodcenter 553 | textquestiondown 554 | textquotedblleft 555 | textquotedblright 556 | textquoteleft 557 | textquoteright 558 | textrm 559 | textsc 560 | textsf 561 | textsl 562 | textstyle 563 | textsuperscript 564 | texttt 565 | textup 566 | textvisiblespace 567 | textwidth 568 | tfrac 569 | thanks 570 | thebibliography 571 | theindex 572 | theorem 573 | thepage 574 | thesection 575 | thicklines 576 | thickmuskip 577 | thinlines 578 | thispagestyle 579 | threeparttable 580 | tilde 581 | tiny 582 | title 583 | titlepage 584 | tocdepth 585 | today 586 | topfigrule 587 | topfraction 588 | topmargin 589 | topsep 590 | topskip 591 | totalheight 592 | totalnumber 593 | trivlist 594 | tt 595 | ttfamily 596 | twocolumn 597 | twoside 598 | typein 599 | typeout 600 | ulem 601 | unboldmath 602 | underbrace 603 | underline 604 | unpublished 605 | unsort 606 | unsrt 607 | upbracefill 608 | upshape 609 | usebox 610 | usecounter 611 | usefont 612 | usepackage 613 | value 614 | vbox 615 | vec 616 | vector 617 | verb 618 | verbatim 619 | verse 620 | vfill 621 | visible 622 | vline 623 | vmargin 624 | vmatrix 625 | Vmatrix 626 | voffset 627 | vspace 628 | widehat 629 | widetilde 630 | width 631 | wrapfig 632 | xleftarrow 633 | xrightarrow 634 | subequations 635 | -------------------------------------------------------------------------------- /ftplugin/tex_nine/tex_nine_symbols.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | tex_nine_maths_cache = [ 4 | 5 | {"word": r"aleph", "menu": "ℵ"}, 6 | {"word": r"alpha", "menu": "α"}, 7 | {"word": r"amalg", "menu": "⨿"}, 8 | {"word": r"angle", "menu": "∠"}, 9 | {"word": r"approx", "menu": "≈"}, 10 | {"word": r"ast", "menu": "∗"}, 11 | {"word": r"asymp", "menu": "≍"}, 12 | {"word": r"backslash", "menu": "\\"}, 13 | {"word": r"beta", "menu": "β"}, 14 | {"word": r"bigcap", "menu": "∩"}, 15 | {"word": r"bigcirc", "menu": "◦"}, 16 | {"word": r"bigcup", "menu": "∪"}, 17 | {"word": r"bigodot", "menu": "⊙"}, 18 | {"word": r"bigoplus", "menu": "⊕"}, 19 | {"word": r"bigotimes", "menu": "⊗"}, 20 | {"word": r"bigsqcup", "menu": "⊔"}, 21 | {"word": r"bigtriangledown", "menu": "▽"}, 22 | {"word": r"bigtriangleup", "menu": "△"}, 23 | {"word": r"biguplus", "menu": "⊎"}, 24 | {"word": r"bigvee", "menu": "∨"}, 25 | {"word": r"bigwedge", "menu": "∧"}, 26 | {"word": r"bot", "menu": "⊥"}, 27 | {"word": r"bowtie", "menu": "▷◁"}, 28 | {"word": r"Box", "menu": "□"}, 29 | {"word": r"bullet", "menu": "•"}, 30 | {"word": r"cap", "menu": "∩"}, 31 | {"word": r"cdot", "menu": "·"}, 32 | {"word": r"cdots", "menu": "···"}, 33 | {"word": r"chi", "menu": "χ"}, 34 | {"word": r"circ", "menu": "◦"}, 35 | {"word": r"clubsuit", "menu": "♣"}, 36 | {"word": r"cong", "menu": "≅"}, 37 | {"word": r"coprod", "menu": "⨿"}, 38 | {"word": r"cup", "menu": "∪"}, 39 | {"word": r"dagger", "menu": "†"}, 40 | {"word": r"dashv", "menu": "⊣"}, 41 | {"word": r"ddagger", "menu": "‡"}, 42 | {"word": r"ddots", "menu": "..."}, 43 | {"word": r"Delta", "menu": "∆"}, 44 | {"word": r"delta", "menu": "δ"}, 45 | {"word": r"diamond", "menu": "⋄"}, 46 | {"word": r"Diamond", "menu": "♢"}, 47 | {"word": r"diamondsuit", "menu": "♢"}, 48 | {"word": r"div", "menu": "÷"}, 49 | {"word": r"doteq", "menu": "≐"}, 50 | {"word": r"downarrow", "menu": "↓"}, 51 | {"word": r"Downarrow", "menu": "⇓"}, 52 | {"word": r"ell", "menu": "ℓ"}, 53 | {"word": r"emptyset", "menu": "∅"}, 54 | {"word": r"epsilon", "menu": "ϵ"}, 55 | {"word": r"equiv", "menu": "≡"}, 56 | {"word": r"eta", "menu": "η"}, 57 | {"word": r"exists", "menu": "∃"}, 58 | {"word": r"flat", "menu": "♭"}, 59 | {"word": r"forall", "menu": "∀"}, 60 | {"word": r"frown", "menu": "⌢"}, 61 | {"word": r"gamma", "menu": "γ"}, 62 | {"word": r"Gamma", "menu": "Γ"}, 63 | {"word": r"geq", "menu": "≥"}, 64 | {"word": r"gg", "menu": "≫"}, 65 | {"word": r"hbar", "menu": "ħ"}, 66 | {"word": r"heartsuit", "menu": "♡"}, 67 | {"word": r"hookleftarrow", "menu": "↩"}, 68 | {"word": r"hookrightarrow", "menu": "↪"}, 69 | {"word": r"imath", "menu": "ı"}, 70 | {"word": r"Im", "menu": "ℑ"}, 71 | {"word": r"infty", "menu": "∞"}, 72 | {"word": r"in", "menu": "∈"}, 73 | {"word": r"int", "menu": "∫"}, 74 | {"word": r"iota", "menu": "ι"}, 75 | {"word": r"jmath", "menu": "ȷ"}, 76 | {"word": r"kappa", "menu": "κ"}, 77 | {"word": r"lambda", "menu": "λ"}, 78 | {"word": r"Lambda", "menu": "Λ"}, 79 | {"word": r"langle", "menu": "〈"}, 80 | {"word": r"ldots", "menu": "..."}, 81 | {"word": r"leadsto", "menu": "⇝"}, 82 | {"word": r"leftarrow", "menu": "←"}, 83 | {"word": r"Leftarrow", "menu": "⇐"}, 84 | {"word": r"leftharpoondown", "menu": "↽"}, 85 | {"word": r"leftharpoonup", "menu": "↼"}, 86 | {"word": r"leftrightarrow", "menu": "↔"}, 87 | {"word": r"Leftrightarrow", "menu": "⇔"}, 88 | {"word": r"leq", "menu": "≤"}, 89 | {"word": r"lhd", "menu": "◁"}, 90 | {"word": r"ll", "menu": "≪"}, 91 | {"word": r"longleftarrow", "menu": "←−"}, 92 | {"word": r"Longleftarrow", "menu": "⇐="}, 93 | {"word": r"longleftrightarrow", "menu": "←→"}, 94 | {"word": r"Longleftrightarrow", "menu": "⇐⇒"}, 95 | {"word": r"longmapsto", "menu": "−→"}, 96 | {"word": r"longrightarrow", "menu": "−→"}, 97 | {"word": r"Longrightarrow", "menu": "=⇒"}, 98 | {"word": r"mapsto", "menu": "↦"}, 99 | {"word": r"|", "menu": "∥"}, 100 | {"word": r"mho", "menu": "℧"}, 101 | {"word": r"mid", "menu": "|"}, 102 | {"word": r"models", "menu": "⊧"}, 103 | {"word": r"mp", "menu": "∓"}, 104 | {"word": r"mu", "menu": "μ"}, 105 | {"word": r"nabla", "menu": "∇"}, 106 | {"word": r"natural", "menu": "♮"}, 107 | {"word": r"nearrow", "menu": "↗"}, 108 | {"word": r"neg", "menu": "¬"}, 109 | {"word": r"neq", "menu": "≠"}, 110 | {"word": r"ni", "menu": "∋"}, 111 | {"word": r"nu", "menu": "ν"}, 112 | {"word": r"nwarrow", "menu": "↖"}, 113 | {"word": r"odot", "menu": "⊙"}, 114 | {"word": r"oint", "menu": "∮"}, 115 | {"word": r"omega", "menu": "ω"}, 116 | {"word": r"Omega", "menu": "Ω"}, 117 | {"word": r"ominus", "menu": "⊖"}, 118 | {"word": r"oplus", "menu": "⊕"}, 119 | {"word": r"oslash", "menu": "⊘"}, 120 | {"word": r"otimes", "menu": "⊗"}, 121 | {"word": r"parallel", "menu": "∥"}, 122 | {"word": r"partial", "menu": "∂"}, 123 | {"word": r"perp", "menu": "⊥"}, 124 | {"word": r"Phi", "menu": "Φ"}, 125 | {"word": r"phi", "menu": "ϕ"}, 126 | {"word": r"pi", "menu": "π"}, 127 | {"word": r"Pi", "menu": "Π"}, 128 | {"word": r"pm", "menu": "±"}, 129 | {"word": r"preceq", "menu": "⪯"}, 130 | {"word": r"prec", "menu": "≺"}, 131 | {"word": r"prime", "menu": "′"}, 132 | {"word": r"prod", "menu": "∏"}, 133 | {"word": r"propto", "menu": "∝"}, 134 | {"word": r"psi", "menu": "ψ"}, 135 | {"word": r"Psi", "menu": "Ψ"}, 136 | {"word": r"rangle", "menu": "〉"}, 137 | {"word": r"Re", "menu": "ℜ"}, 138 | {"word": r"rhd", "menu": "▷"}, 139 | {"word": r"rho", "menu": "ρ"}, 140 | {"word": r"rightarrow", "menu": "→"}, 141 | {"word": r"Rightarrow", "menu": "⇒"}, 142 | {"word": r"rightharpoondown", "menu": "⇁"}, 143 | {"word": r"rightharpoonup", "menu": "⇀"}, 144 | {"word": r"rightleftharpoons", "menu": "⇌"}, 145 | {"word": r"searrow", "menu": "↘"}, 146 | {"word": r"setminus", "menu": "\\"}, 147 | {"word": r"sharp", "menu": "♯"}, 148 | {"word": r"sigma", "menu": "σ"}, 149 | {"word": r"Sigma", "menu": "Σ"}, 150 | {"word": r"simeq", "menu": "≃"}, 151 | {"word": r"sim", "menu": "∼"}, 152 | {"word": r"smile", "menu": "⌣"}, 153 | {"word": r"spadesuit", "menu": "♠"}, 154 | {"word": r"sqcap", "menu": "⊓"}, 155 | {"word": r"sqcup", "menu": "⊔"}, 156 | {"word": r"sqsubseteq", "menu": "⊑"}, 157 | {"word": r"sqsubset", "menu": "⊏"}, 158 | {"word": r"sqsupseteq", "menu": "⊒"}, 159 | {"word": r"sqsupset", "menu": "⊐"}, 160 | {"word": r"star", "menu": "⋆"}, 161 | {"word": r"subseteq", "menu": "⊆"}, 162 | {"word": r"subset", "menu": "⊂"}, 163 | {"word": r"succeq", "menu": "⪰"}, 164 | {"word": r"succ", "menu": "≻"}, 165 | {"word": r"sum", "menu": "∑"}, 166 | {"word": r"supseteq", "menu": "⊇"}, 167 | {"word": r"supset", "menu": "⊃"}, 168 | {"word": r"surd", "menu": "√"}, 169 | {"word": r"swarrow", "menu": "↙"}, 170 | {"word": r"tau", "menu": "τ"}, 171 | {"word": r"theta", "menu": "θ"}, 172 | {"word": r"Theta", "menu": "Θ"}, 173 | {"word": r"times", "menu": "×"}, 174 | {"word": r"top", "menu": "⊤"}, 175 | {"word": r"triangleleft", "menu": "◁"}, 176 | {"word": r"triangle", "menu": "△"}, 177 | {"word": r"triangleright", "menu": "▷"}, 178 | {"word": r"unlhd", "menu": "⊴"}, 179 | {"word": r"unrhd", "menu": "⊵"}, 180 | {"word": r"uparrow", "menu": "↑"}, 181 | {"word": r"Uparrow", "menu": "⇑"}, 182 | {"word": r"updownarrow", "menu": "↕"}, 183 | {"word": r"Updownarrow", "menu": "⇕"}, 184 | {"word": r"uplus", "menu": "⊎"}, 185 | {"word": r"upsilon", "menu": "υ"}, 186 | {"word": r"Upsilon", "menu": "Υ"}, 187 | {"word": r"varepsilon", "menu": "ε"}, 188 | {"word": r"varphi", "menu": "φ"}, 189 | {"word": r"varpi", "menu": "ϖ"}, 190 | {"word": r"varrho", "menu": "ϱ"}, 191 | {"word": r"varsigma", "menu": "ς"}, 192 | {"word": r"vartheta", "menu": "ϑ"}, 193 | {"word": r"vdash", "menu": "⊢"}, 194 | {"word": r"vdots", "menu": "..."}, 195 | {"word": r"vee", "menu": "∨"}, 196 | {"word": r"wedge", "menu": "∧"}, 197 | {"word": r"wp", "menu": "℘"}, 198 | {"word": r"wr", "menu": "≀"}, 199 | {"word": r"xi", "menu": "ξ"}, 200 | {"word": r"Xi", "menu": "Ξ"}, 201 | {"word": r"zeta", "menu": "ζ"} 202 | ] 203 | 204 | -------------------------------------------------------------------------------- /autoload/tex_nine.vim: -------------------------------------------------------------------------------- 1 | " vim: tw=72 2 | 3 | "*********************************************************************** 4 | " General purpose routines 5 | "*********************************************************************** 6 | 7 | function tex_nine#GetMaster() 8 | python << EOF 9 | try: 10 | master_file = document.get_master_file(vim.current.buffer) 11 | except TeXNineError, e: 12 | echoerr(e) 13 | master_file = "" 14 | EOF 15 | return pyeval('master_file') 16 | endfunction 17 | 18 | function tex_nine#GetOutputFile() 19 | python << EOF 20 | master_output = "" 21 | try: 22 | master_output = document.get_master_output(vim.current.buffer) 23 | except TeXNineError, e: 24 | echoerr(e) 25 | master_output = "" 26 | EOF 27 | return pyeval('master_output') 28 | endfunction 29 | 30 | function tex_nine#GetCompiler(config) 31 | 32 | " The mode line takes precedence 33 | silent! let tex_nine_compiler = pyeval('document.get_compiler(vim.current.buffer)') 34 | 35 | " The compiler was set in vimrc 36 | if tex_nine_compiler == "" && a:config.compiler != "" 37 | let tex_nine_compiler = a:config.compiler 38 | endif 39 | 40 | " Side effect: configure the compilation flags 41 | if &l:makeprg == "" && tex_nine_compiler != "" 42 | call tex_nine#ConfigureCompiler(tex_nine_compiler, a:config.synctex, a:config.shell_escape, a:config.extra_args) 43 | endif 44 | 45 | return tex_nine_compiler 46 | 47 | endfunction 48 | 49 | 50 | "*********************************************************************** 51 | " Viewing and SyncTeXing 52 | "*********************************************************************** 53 | 54 | function tex_nine#ViewDocument() 55 | echo "Viewing the document...\r" 56 | python document.view(vim.current.buffer) 57 | endfunction 58 | 59 | function tex_nine#ForwardSearch() 60 | python << EOF 61 | try: 62 | document.forward_search(vim.current.buffer, vim.current) 63 | except TeXNineError, e: 64 | echoerr(e) 65 | EOF 66 | return 67 | endfunction 68 | 69 | 70 | "*********************************************************************** 71 | " Miscellaneous (Omni completion, snippets, headers, bibqueries) 72 | "*********************************************************************** 73 | 74 | function tex_nine#UpdateHeader() 75 | python document.update_header(vim.current.buffer) 76 | endfunction 77 | 78 | function tex_nine#InsertSkeleton(skeleton) 79 | python document.insert_skeleton(vim.current.buffer, vim.eval('a:skeleton')) 80 | update 81 | edit 82 | " Enter insert mode for safety and set the buffer as modified 83 | startinsert 84 | setlocal mod 85 | endfunction 86 | 87 | function tex_nine#OmniCompletion(findstart, base) 88 | if a:findstart 89 | let pos = pyeval('omni.findstart()') 90 | return pos 91 | else 92 | let compl = pyeval('omni.completions()') 93 | return compl 94 | endif 95 | endfunction 96 | 97 | function tex_nine#MathCompletion(findstart, base) 98 | if a:findstart 99 | let line = getline('.') 100 | let start = col('.') - 1 101 | while start > 0 && line[start - 1] != '\' 102 | if line[start] == ' ' | return -2 | endif 103 | let start -= 1 104 | endwhile 105 | return start 106 | else 107 | let compl = pyeval('tex_nine_maths_cache') 108 | call filter(compl, 'v:val.word =~ "^'.a:base.'"') 109 | "let res = [] 110 | "for m in compl 111 | " if m.word =~ '^'.a:base 112 | " call add(res, m) 113 | " endif 114 | "endfor 115 | return compl 116 | endif 117 | endfunction 118 | 119 | function tex_nine#Bibquery(cword) 120 | python << EOF 121 | try: 122 | document.bibquery(vim.eval('a:cword'), omni.bibpaths) 123 | except TeXNineError, e: 124 | echoerr(e) 125 | EOF 126 | return 127 | endfunction 128 | 129 | function tex_nine#IsLeft(lchar) 130 | let left = getline('.')[col('.')-2] 131 | return left == a:lchar ? 1 : 0 132 | endfunction 133 | 134 | function tex_nine#ChangeFontStyle(style) 135 | let str = 'di' 136 | let is_math = pyeval("int(is_latex_math_environment(vim.current.window))") 137 | let str .= is_math ? '\math'.a:style : '\text'.a:style 138 | let str .= "{}\\\"" 139 | return str 140 | endfunction 141 | 142 | function tex_nine#SmartInsert(keyword, ...) 143 | " Inserts a LaTeX statement and starts omni completion. If the 144 | " line already contains the statement and the statement is still 145 | " incomplete, i.e. missing the closing delimiter, only omni 146 | " completion is started. 147 | 148 | let pattern = exists('a:1') ? '\'.a:1.'{' : '\'.a:keyword 149 | let line = getline('.') 150 | let pos = col('.') 151 | 152 | " There's a beginning of a statement on the left 153 | if line[:pos] =~ pattern 154 | " Is there closing delimiter on the right and no beginning of a 155 | " new statement 156 | 157 | " The closing delimiter is closer than \ 158 | let i = pos-1 159 | while i < col('$') 160 | if line[i] == '\' 161 | break 162 | elseif line[i] == '}' 163 | return "" 164 | endif 165 | let i = i+1 166 | endwhile 167 | endif 168 | 169 | return a:keyword."}\ha" 170 | endfunction 171 | 172 | function! ListEnvCompletions(A,L,P) 173 | " Breaks if dictionary is a list but we only support one dictionary 174 | " at the moment 175 | if filereadable(&dictionary) 176 | return join(readfile(&dictionary), "\") 177 | else 178 | return [] 179 | endif 180 | endfunction 181 | 182 | function tex_nine#InsertSnippet(...) 183 | if exists('a:1') 184 | let s:envkey = a:1 185 | else 186 | let s:envkey = input('Environment: ', '', 'custom,ListEnvCompletions') 187 | endif 188 | 189 | if s:envkey != "" 190 | python snip = document.insert_snippet(vim.eval('s:envkey'), vim.eval('&ft')) 191 | return pyeval('snip') 192 | else 193 | return "\" 194 | endif 195 | endfunction 196 | 197 | function tex_nine#EnvironmentOperator(mode) 198 | let pos = pyeval('get_latex_environment(vim.current.window)["range"]') 199 | if !pos[0] && !pos[1] 200 | return "\" 201 | endif 202 | if a:mode == 'inner' 203 | let pos[0] += 1 204 | let pos[1] -= 1 205 | endif 206 | return "\:".pos[0]."\V".(pos[1] - pos[0])."jO" 207 | endfunction 208 | 209 | 210 | "*********************************************************************** 211 | " Settings 212 | "*********************************************************************** 213 | 214 | function tex_nine#AddBuffer(config, snipfile) 215 | python << EOF 216 | omni = TeXNineOmni() 217 | document = TeXNineDocument(vim.current.buffer) 218 | document.setup_snippets(vim.eval('a:snipfile'), 219 | vim.eval('&ft')) 220 | 221 | EOF 222 | if a:config.synctex == 1 223 | python << EOF 224 | try: 225 | target = document.get_master_output(vim.current.buffer) 226 | evince_proxy = tex_nine_synctex.TeXNineSyncTeX(target, logging) 227 | document.buffers[vim.current.buffer.name]['synctex'] = evince_proxy 228 | except (TeXNineError, NameError) as e: 229 | msg = 'TeX-9: Failed to connect to an Evince window: {0}'.format(str(e).decode('string_escape')) 230 | logging.debug(msg) 231 | pass 232 | EOF 233 | endif 234 | endfunction 235 | 236 | function tex_nine#SetAutoCmds(config) 237 | 238 | augroup tex_nine 239 | au BufWritePre *.tex call tex_nine#UpdateHeader() 240 | augroup END 241 | 242 | "au QuickFixCmdPre call tex_nine#Premake() 243 | "au! tex_nine QuickFixCmdPost 244 | 245 | "if a:config.verbose 246 | " au tex_nine QuickFixCmdPost call tex_nine#PostmakeVanilla() 247 | "else 248 | " au tex_nine QuickFixCmdPost call tex_nine#Postmake() 249 | "endif 250 | endfunction 251 | 252 | function tex_nine#Reconfigure(config) 253 | python << EOF 254 | try: 255 | omni.update() 256 | paths = map(path.basename, omni.bibpaths) 257 | echomsg("Updated BibTeX databases...using {0}.".format(", ".join(paths))) 258 | except TeXNineError, e: 259 | # It may be not an error. The user may not use BibTeX... 260 | echomsg("Cannot update BibTeX databases: "+str(e)) 261 | EOF 262 | 263 | silent! let tex_nine_compiler = pyeval('document.get_compiler(vim.current.buffer, update=True)') 264 | 265 | " Did it succeed? 266 | if tex_nine_compiler == "" && a:config.compiler == "" 267 | python echomsg("Cannot determine the compiler: Make sure the header contains the compiler line or compiler is set in vimrc.") 268 | return 269 | endif 270 | 271 | " Modeline takes precedence 272 | let tex_nine_compiler = tex_nine_compiler ? a:config.compiler : tex_nine_compiler 273 | 274 | if tex_nine_compiler != "" 275 | call tex_nine#ConfigureCompiler(tex_nine_compiler, a:config.synctex, a:config.shell_escape, a:config.extra_args) 276 | python echomsg("Updated the compiler...using `{}'.".format(vim.eval('tex_nine_compiler'))) 277 | else 278 | python echomsg("Cannot determine the compiler: Make sure the header contains the compiler line or compiler is set in vimrc.") 279 | endif 280 | endfunction 281 | 282 | "*********************************************************************** 283 | " Compilation 284 | "*********************************************************************** 285 | 286 | 287 | function tex_nine#Compile(deep, config) 288 | 289 | let tex_nine_compiler = tex_nine#GetCompiler(a:config) 290 | let master = tex_nine#GetMaster() 291 | 292 | if tex_nine_compiler == "" || master == "" 293 | return 294 | elseif tex_nine_compiler == "make" 295 | silent make! 296 | else 297 | update " Autowrite is not enough 298 | exe "lcd" fnameescape(fnamemodify(master, ':h')) 299 | unsilent echo "Compiling...\r" 300 | if a:deep == 1 301 | python document.compile(vim.current.buffer, vim.eval('tex_nine_compiler')) 302 | endif 303 | " Make and do not jump to the first error 304 | exe 'silent' 'make!' escape(fnamemodify(master, ':t'), ' ') 305 | lcd - 306 | endif 307 | 308 | " Post-process errors 309 | if !a:config.verbose 310 | call setqflist(pyeval('document.postmake()')) 311 | endif 312 | 313 | if (!has("gui_running")) 314 | redraw! 315 | endif 316 | 317 | let numerrors = len(filter(getqflist(), 'v:val.valid==1')) 318 | unsilent echo "Found ".numerrors." Error(s)." 319 | 320 | endfunction 321 | 322 | function tex_nine#ConfigureCompiler(compiler, synctex, shell_escape, extra_args) 323 | " Configure the l:makeprg variable according to user's preference 324 | 325 | let &l:makeprg = a:compiler 326 | if &l:makeprg != 'make' 327 | let &l:makeprg .= ' -file-line-error -interaction=nonstopmode' 328 | if a:synctex 329 | let &l:makeprg .= ' -synctex=1' 330 | endif 331 | if a:shell_escape 332 | let &l:makeprg .= ' -shell-escape' 333 | endif 334 | let &l:makeprg .= ' '.a:extra_args 335 | endif 336 | let &l:makeprg .= ' $*' 337 | 338 | " TODO: test Makefile 339 | " This is taken from vim help, see :help errorformat-LaTeX, with 340 | " addition from Srinath Avadhanula 341 | setlocal errorformat=%E!\ LaTeX\ %trror:\ %m, 342 | \%E%f:%l:\ %m, 343 | \%E!\ %m, 344 | \%+WLaTeX\ %.%#Warning:\ %.%#line\ %l%.%#, 345 | \%+W%.%#\ at\ lines\ %l--%*\\d, 346 | \%WLaTeX\ %.%#Warning:\ %m, 347 | \%Cl.%l\ %m, 348 | \%+C\ \ %m., 349 | \%+C%.%#-%.%#, 350 | \%+C%.%#[]%.%#, 351 | \%+C[]%.%#, 352 | \%+C%.%#%[{}\\]%.%#, 353 | \%+C<%.%#>%.%#, 354 | \%C\ \ %m, 355 | \%-GSee\ the\ LaTeX%m, 356 | \%-GType\ \ H\ %m, 357 | \%-G\ ...%.%#, 358 | \%-G%.%#\ (C)\ %.%#, 359 | \%-G(see\ the\ transcript%.%#), 360 | \%-G\\s%#, 361 | \%+O(%*[^()])%r, 362 | \%+O%*[^()](%*[^()])%r, 363 | \%+P(%f%r, 364 | \%+P\ %\\=(%f%r, 365 | \%+P%*[^()](%f%r, 366 | \%+P[%\\d%[^()]%#(%f%r, 367 | \%+Q)%r, 368 | \%+Q%*[^()])%r, 369 | \%+Q[%\\d%*[^()])%r 370 | 371 | endfunction 372 | -------------------------------------------------------------------------------- /doc/tex_nine.txt: -------------------------------------------------------------------------------- 1 | *tex_nine.txt* 2 | 3 | TeX-9 4 | 5 | A semi-automatic, prefix-operated 6 | LaTeX ftplugin 7 | with lots of firepower! 8 | 9 | 10 | Author: Elias Toivanen 11 | Email: See README 12 | License: GPL 13 | Version: 1.3.13 14 | 15 | TeX-9 is a ftplugin that aims to enhance the writing experience of high 16 | quality documents with LaTeX and Vim. The goal of TeX-9 is to be simple 17 | and Vimish, meaning that focus is on carefully thought-out key mappings 18 | and features that are already present in a typical Vim installation. If 19 | you need to write a thesis or research articles and insist on having 20 | only one editor for all editing tasks, then TeX-9 is for you! 21 | 22 | TeX-9 uses Python2.x as its backend and therefore a Vim installation 23 | with Python support is required. TeX-9 is being developed on Linux 24 | running Vim 7.4. 25 | 26 | The main features of TeX-9 are 27 | * Compile, debug and launch a document viewer from within Vim 28 | * Insert LaTeX code snippets with ease 29 | * Powerful text-object for LaTeX environments 30 | * Omni-completion of BibTeX database entries and label references 31 | * Omni-completion of mathematical symbols 32 | * SyncTeX support (for the Evince document viewer) 33 | * Filetype specific indentation (courtesy of Johannes Tanzler) 34 | * LaTeX2e manual (ported to Vim by Mikolaj Machowski) 35 | * No-hassle settings, relatively few mappings 36 | 37 | Shoutouts & thanks 38 | * Carl Mueller, this ftplugin was inspired by his `auctex.vim' script 39 | * Vim-LaTeX people Srinath Avadhanula, Mikolaj Machowski and Benji Fisher 40 | * Johannes Tanzler, Jose Aliste, Sergio Losilla 41 | * Peter Lewis, Volker Lorrmann 42 | 43 | ============================================================================== 44 | 45 | *TeX-9* *tex_nine* 46 | 47 | 1. Installation |tex_nine-installation|| 48 | 2. Basics |tex_nine-basics| 49 | 3. Advanced |tex_nine-advanced| 50 | 4. Snippets |tex_nine-snippets| 51 | 5. BibTeX |tex_nine-bibtex| 52 | 6. Mappings |tex_nine-mappings| 53 | 7. Tips and trick |tex_nine-tips| 54 | 55 | ============================================================================== 56 | 57 | 1. Installation *tex_nine-installation* 58 | 59 | TeX-9 is distributed as a gzipped tarball. Unzip it to your local 60 | runtime path, usually `~/.vim/'. 61 | 62 | Next, open up |vimrc| and ensure it contains the following lines 63 | > 64 | filetype plugin indent on 65 | let g:tex_flavor = 'latex' 66 | < 67 | For basic usage you don't need to configure anything else. However, 68 | you may tweak some features of TeX-9 by defining a |Dictionary| called 69 | `g:tex_nine_config' in your vimrc. The following keys are recognized: 70 | 71 | compiler: String 72 | * The TeX compiler you want to use (xelatex, pdflatex, latex, make...) 73 | * Recommended setting 74 | * See |tex_nine-advanced| for details. 75 | * Default: undefined 76 | 77 | leader: String 78 | * Most TeX-9 mappings begin with this prefix 79 | * Optional 80 | * Default: The values of |mapleader| and |maplocalleader| are 81 | honored. Otherwise set to semi-colon ';'. 82 | 83 | viewer: Dictionary 84 | * Application used for viewing documents. 85 | * Vim dictionary with keys 'app' and 'target'. 86 | * Optional 87 | * Default: {'app': 'xdg-open', 'target': 'pdf'} 88 | 89 | verbose: Boolean 90 | * Controls the amount of output in error logs 91 | * Error messages are gathered in a ||quickfix|| list that 92 | you may access by typing Q in normal mode. 93 | * Optional 94 | * Default: 0 (Less verbose logs) 95 | 96 | synctex: Boolean 97 | * Highlight current source code position in a PDF viewer and vice 98 | versa. 99 | * GVim/Evince only. 100 | * See |tex_nine-advanced| for details 101 | * Optional 102 | * Default: 0 (Disabled) 103 | 104 | shell_escape: Boolean 105 | * The LaTeX compiler will be called with the -shell-escape flag. 106 | * Required for packages such as minted, etc. 107 | * Optional 108 | * Default: 0 (Disabled) 109 | 110 | extra_args: String 111 | * Whatever extra arguments you want to give the LaTeX compiler. 112 | * For the -shell-escape flag, see above. 113 | * Optional 114 | * Default: "" 115 | 116 | disable: Boolean 117 | * TeX-9 is disabled temporarily. 118 | * Default: 0 (TeX-9 is loaded) 119 | 120 | Examples: > 121 | 122 | " Old school LaTeX user 123 | let g:tex_nine_config = { 124 | \'compiler': 'latex', 125 | \'viewer': {'app':'xdvi', 'target':'dvi'}, 126 | \} 127 | 128 | " A MacVim user 129 | let g:tex_nine_config = { 130 | \'compiler': 'pdflatex', 131 | \'viewer': {'app':'open', 'target':'pdf'}, 132 | \} 133 | 134 | " Xelatex user who wants SyncTeX support 135 | let g:tex_nine_config = { 136 | \'compiler': 'xelatex', 137 | \'synctex': 1 138 | \} 139 | 140 | " Makefile users 141 | let g:tex_nine_config = { 142 | \'compiler': 'make', 143 | \'verbose': 1 144 | \} 145 | < 146 | 147 | ============================================================================== 148 | 149 | 2. Basics *tex_nine-basics* 150 | 151 | TeX-9 defines various mappings that speed up typesetting LaTeX code. Most 152 | of the mappings are prefixed with a leader referred below with the symbol 153 | . If you have set `g:tex_nine_config.leader', 154 | |maplocalleader| or |mapleader|, the corresponding character is used. 155 | Otherwise, the leader defaults to semi-colon. 156 | 157 | Below is a short tutorial that should get you going in no time. Users who 158 | want to use SyncTeX, split their LaTeX manuscripts in several files and/or 159 | use different kinds of LaTeX compilers at the same time should also read 160 | the |tex_nine-advanced| section. 161 | 162 | 2.1. Templates 163 | 164 | The buttons , and insert skeleton files for the article 165 | documentclass with the preamble adjusted for xelatex, pdflatex and 166 | latex respectively. Press to insert a barebone template that is 167 | intended for Makefile users. Edit the files in the `skeleton' folder 168 | to customize the templates to your taste. 169 | 170 | 2.2. Insert mode 171 | 172 | Type M to get a popup list of different maths symbols. In 173 | addition, the most frequently used maths symbols have their own 174 | shortcuts. Typing a expands to \alpha for example. Refer 175 | to |tex_nine-mappings| for a complete listing. 176 | 177 | Type C to insert a citation, i.e. `\cite{citekey}'. You're 178 | prompted with a popup list of completions if the \bibliography{} statement 179 | contains a valid BibTeX file (see |tex_nine-bibtex| for details). Inserting 180 | references, `\ref{ref}', works in a similar way. The corresponding mapping is 181 | R. 182 | 183 | To insert an environment, press B. You're prompted for an 184 | environment name and if a corresponding LaTeX code snippet was defined, 185 | it is inserted into the file (see |tex_nine-snippets|). 186 | 187 | 2.3. Normal mode 188 | 189 | The mapping k, `small compile', compiles your document 190 | once and doesn't bother about references; K, `big 191 | compile', calls additionally bibtex and should get the cross-references 192 | right. You're informed about potential errors. To go over them, open 193 | the ||quickfix|| list with Q. Typing V should 194 | open the document in your desktop's default PDF viewer, if you didn't 195 | set `g:tex_nine_config.viewer' to something else. 196 | 197 | Should you need advice on LaTeX, consult the LaTeX2e manual with `:help 198 | latex'. 199 | 200 | 201 | ============================================================================== 202 | 203 | 3. Advanced *tex_nine-advanced* 204 | 205 | 3.1 Automatic compiler detection/Changing compiler on-the-fly 206 | 207 | Some users need to switch between different LaTeX compilers. For this 208 | reason TeX-9 allows you to leave the setting `g:tex_nine_config.compiler' 209 | undefined and let TeX-9 determine the compiler on a file-by-file basis 210 | from a modeline of the form 211 | > 212 | % Compiler: COMPILER 213 | < 214 | where COMPILER could for example be `pdflatex'. The modeline should appear 215 | in the ten first lines of the (main) LaTeX file. If you change the line 216 | containing COMPILER, remember to make the changes effective by pressing 217 | U in normal mode. 218 | 219 | A recipe for changing the compiler on the fly would be 220 | 221 | 1. Yank the entire document environment (see Extras in |tex_nine-mappings|) 222 | 2. Change template (, , , ) 223 | 3. Paste the yanked text back in the buffer 224 | 4. Update changes (U) 225 | 226 | NB! If you are only using one compiler all the time, it is recommended to 227 | set `g:tex_nine_config.compiler' in |vimrc|. This way you can compile even 228 | your old LaTeX files without problems. 229 | 230 | 3.2. Multi-file projects 231 | 232 | The traditional way to handle multi-file projects is to set up a Makefile 233 | and compile with `make'. TeX-9 supports this behavior via the 234 | `g:tex_nine_config.compiler' option which can be set to `make'. 235 | 236 | You can save yourself the trouble of writing a Makefile by indicating the 237 | relative location of the main file in the \include-ed files with a modeline 238 | of the form 239 | > 240 | % mainfile: MASTER_FILE 241 | < 242 | The string MASTER_FILE could be for example `../main.tex' if the included file 243 | is in a subdirectory of the actual compilation folder. The modeline may appear 244 | in the three first or three last lines of the document. This way all the 245 | TeX-9 mappings continue to work as expected wherever you are in your 246 | project. 247 | 248 | NB! Make sure the filename MASTER_FILE does not contain any whitespace and 249 | have the main file to be active in Vim (see |active-buffers|). Otherwise 250 | TeX-9 cannot access its contents which is required for some features. 251 | 252 | 3.3 SyncTeX *tex_nine-synctex* 253 | 254 | If you have set `g:tex_nine_config.synctex' and use Evince 255 | (http://projects.gnome.org/evince), you can Ctrl-click a line in Evince 256 | and see the corresponding line highlighted in GVim! This is called 257 | forward searching. Backward searching works similarly: you select a 258 | cursor position in GVim and click on the position. The 259 | correct line should then be highlighted in Evince. SyncTeXing from 260 | included files works too, but remember to set the modeline to the 261 | correct main file (see above). 262 | 263 | The requirements for SyncTeX support are: dbus-python and a Vim 264 | installation _without_ a python3 interpreter. The feature is known to 265 | work correctly with Evince 3.8.3 and TeXLive 2013. 266 | 267 | ============================================================================== 268 | 269 | 4. Snippets *tex_nine-snippets* 270 | 271 | When you want to insert a LaTeX snippet with B, 272 | notice that the input prompt is -completable. Your input is 273 | matched against words in `tex_dictionary.txt'. Once entered, the 274 | name of the environment is matched against keywords in the file 275 | `snippets/tex_snippets.snippets'. Matching snippets are inserted. 276 | Otherwise TeX-9 inserts a generic environment in LaTeX manuscripts 277 | and raises an error in BibTeX files. 278 | > 279 | % Generic environment 280 | \begin{keyword} 281 | 282 | \end{keyword} 283 | < 284 | You may extend the snippet file with your own environments and you will 285 | notice that the syntax bears resemblance with Michael Sander's snipMate 286 | plugin (http://www.vim.org/scripts/script.php?script_id=2540). TeX-9 287 | leaves the key untouched so that you may still resort to snipMate 288 | if you so prefer. If your custom environments is not included in 289 | `tex_dictionary.txt', append it there. > 290 | 291 | :cd ~/.vim/ftplugin/TeX_9/dictionaries 292 | :!echo 'new_environment' >> tex_dictionary.txt 293 | < 294 | ============================================================================== 295 | 296 | 5. BibTeX *tex_nine-bibtex* 297 | 298 | When adding entries in BibTeX databases or appending new databases in the 299 | \bibliography{} statement, you need tell TeX-9 to update its citekey 300 | database. This is accomplished by typing U in normal mode. 301 | 302 | In addition to citekey completion, TeX-9 provides a preview feature 303 | that makes it easier to work with BibTeX and LaTeX files in the same 304 | Vim session. You may take a quick peek at a particular BibTeX entry 305 | by pressing `gb' over its citekey, i.e. \cite{citekey}. This command 306 | is in line with ||gd|| and |gf| with the exception that the BibTeX 307 | entry is shown in a |preview-window||. 308 | 309 | 310 | ============================================================================== 311 | 312 | 6. Mappings *tex_nine-mappings* 313 | 314 | The symbol refers to the value of 315 | `g:tex_nine_config.leader', |maplocalleader|, |mapleader|. If none of 316 | these are set, the default value is semi-colon ';'. 317 | 318 | 6.1 Insert mode > 319 | 320 | 321 | K Dictionary completion 322 | M Maths completion 323 | C Insert a citation 324 | B Insert an environment 325 | R Insert a reference 326 | E Insert an equation reference 327 | < 328 | Greek 329 | > 330 | a \alpha 331 | b \beta 332 | c \chi 333 | d \delta 334 | e \epsilon 335 | f \phi 336 | g \gamma 337 | h \eta 338 | k \kappa 339 | l \lambda 340 | m \mu 341 | n \nu 342 | o \omega 343 | p \pi 344 | q \theta 345 | r \varrho 346 | s \sigma 347 | t \tau 348 | u \upsilon 349 | w \varpi 350 | x \xi 351 | y \psi 352 | z \zeta 353 | D \Delta 354 | F \Phi 355 | G \Gamma 356 | L \Lambda 357 | O \Omega 358 | P \Pi 359 | Q \Theta 360 | U \Upsilon 361 | X \Xi 362 | Y \Psi 363 | < 364 | Maths 365 | > 366 | N \nabla 367 | S \sum_{}^{} 368 | I \int\limits_{}^{} 369 | V \vec{} 370 | 0 \emptyset 371 | 6 \partial 372 | i \infty 373 | / \frac{}{} 374 | v \vee 375 | & \wedge 376 | @ \circ 377 | \ \setminus 378 | = \equiv 379 | * \cdot 380 | - \bigcap 381 | + \bigcup 382 | < \leq 383 | > \geq 384 | ~ \tilde{} 385 | ^ \hat{} 386 | _ \bar{} 387 | ( \left(\right) 388 | [ \left[\right] 389 | { \left{\right} 390 | \nonumber\\ 391 | < 392 | 393 | 6.2 Normal Mode > 394 | 395 | to Insert template files 396 | Jump to next section or chapter 397 | Jump to previous section or chapter 398 | gd Goto label's declaration 399 | gb Goto citekey's declaration 400 | k Small compile 401 | K Big compile 402 | V View the document 403 | SyncTeX: Forward search 404 | Q View the quickfix window 405 | U Reconfigure TeX-9 406 | 407 | 6.4 Extras 408 | 409 | TeX-9 comes with a custom `environment operator' (see ||text-objects||). 410 | Press 'vie' or 'vae' in normal normal to highlight the current inner 411 | environment (without the \begin and \end statements) or the outer 412 | environment respectively. Replace 'v' with another operator to achieve 413 | yanking, changing or deleting etc. For example, typing 'dae' makes it 414 | trivial to move figures and tables around in the document. Delete the 415 | environment, find a new location and paste it back to the buffer! 416 | 417 | There are also some macros that work by tapping a character on your 418 | keyboard (super convenient for subscripts and superscripts!). 419 | 420 | > 421 | ^^ -> ^{} 422 | __ -> _{} 423 | ~~ -> \approx 424 | == -> &= 425 | < 426 | Finally, try omni-completion () inside curly braces when you're 427 | including a picture with `\includegraphics{}' or when you're setting your 428 | font with the `fontspec' package, e.g. `\setmainfont{}'. You'll get a 429 | listing of pictures in the compilation folder in the first case and a list 430 | of installed font on your system in the latter. Supported picture formats 431 | are EPS, PDF, JPG and PNG. 432 | 433 | ============================================================================== 434 | 435 | 7. Tips and trick *tex_nine-tips* 436 | 437 | 7.1. Preferred way to override, extend and hack TeX-9 438 | 439 | Create a custom tex.vim file in the after directory, i.e. 440 | ~/.vim/after/ftplugin/tex.vim. Here you can redefine mappings and 441 | extend TeX-9's functionality with your own ideas. If you come up with 442 | something sweet, drop me a line (email address available on Vim.org 443 | and in the README). 444 | 445 | 7.2 Spell checking 446 | 447 | If you've enabled 'modeline', you may conveniently activate spell 448 | checking in your LaTeX documents by editing the modeline in the 449 | skeleton file. 450 | 451 | Example for anglophones: > 452 | 453 | % vim:tw=66 sw=2 ft=tex spell spelllang=en 454 | < 455 | Notice that newer versions of Vim provide an option > 456 | 457 | let g:tex_comment_nospell= 1 458 | 459 | < for disabling spell checking of comments that otherwise get messed up 460 | pretty badly. 461 | 462 | 7.3 Folding 463 | 464 | With newer versions of Vim it's easy as > 465 | 466 | let g:tex_fold_enabled = 1 467 | 468 | 7.4 SyncTeXing without Evince 469 | 470 | It might be possible to get SyncTeX working with some other PDF viewers, but 471 | you'd need the write wrapper scripts by yourself. However, there's one TeX-9 472 | function that you might find useful. If you want to know the absolute name of 473 | the PDF file in your project, you can use the function 474 | `tex_nine#GetOutputFile()'. 475 | 476 | To avoid conflicts with Evince, please leave 477 | `g:tex_nine_config.synctex' unset and ensure you have 478 | > 479 | \synctex=1 480 | < 481 | in your preamble. 482 | 483 | 7.5. Custom templates 484 | 485 | I like to include some extra packages in the preamble. Here's what I 486 | have in my ~/.vim/after/ftplugin/tex.vim 487 | 488 | > 489 | let custom_template = expand('$HOME').'/.vim/after/ftplugin/tex_skeleton.tex.custom' 490 | noremap :call tex_nine#InsertSkeleton(custom_template) 491 | < 492 | 493 | 7.6 Change the typeface of a word, sentence... 494 | 495 | If you are not using Tim Pope's famous `surround.vim' plugin and would 496 | like to have neat way of changing the typeface of text, you can add 497 | these mappings to ~/.vim/after/ftplugin/tex.vim. 498 | 499 | > 500 | vmap bf tex_nine#ChangeFontStyle('bf') 501 | vmap it tex_nine#ChangeFontStyle('it') 502 | vmap rm tex_nine#ChangeFontStyle('rm') 503 | vmap sf tex_nine#ChangeFontStyle('sf') 504 | vmap tt tex_nine#ChangeFontStyle('tt') 505 | vmap up di\text{}" 506 | < 507 | For example, to convert the word under the cursor to boldface, type 508 | > 509 | viwbf 510 | < 511 | 512 | ============================================================================== 513 | 514 | 515 | vim:tw=72:ts=8:ft=help:norl:autoindent 516 | 517 | 518 | -------------------------------------------------------------------------------- /ftplugin/tex_nine/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | #************************************************************************ 3 | # 4 | # TeX-9 library: Python module 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, or 9 | # (at your option) any later version. 10 | # 11 | # This program is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with this program. If not, see . 18 | # 19 | # Copyright Elias Toivanen, 2011-2014 20 | # 21 | #************************************************************************ 22 | 23 | # Short summary of the module: 24 | # 25 | # Defines two main objects TeXNineDocument and TeXNineOmni that are 26 | # meant to handle editing and completion tasks. Both of these classes 27 | # are singletons. 28 | 29 | # System modules 30 | import vim 31 | import sys 32 | import re 33 | import subprocess 34 | import os 35 | import os.path as path 36 | import logging 37 | 38 | from getpass import getuser 39 | from time import strftime 40 | from itertools import groupby 41 | from string import Template 42 | 43 | #Local modules 44 | # config = vim.bindeval('b:tex_nine_config') 45 | # TODO: Remove vim.eval() in favor of vim.bindeval() 46 | # TODO: Separate python module from b:tex_nine_config 47 | # Older Vim's do not have bindeval 48 | config = vim.eval('b:tex_nine_config') 49 | config['disable'] = int(config['disable']) 50 | config['debug'] = int(config['debug']) 51 | config['synctex'] = int(config['synctex']) 52 | config['verbose'] = int(config['verbose']) 53 | 54 | sys.path.extend([config['_pypath']]) 55 | from tex_nine_symbols import tex_nine_maths_cache 56 | from tex_nine_utils import * 57 | 58 | # Control debugging 59 | if config['debug']: 60 | logging.basicConfig(level=logging.DEBUG, stream=sys.stdout) 61 | else: 62 | logging.basicConfig(level=logging.ERROR) 63 | 64 | # Control SyncTeX 65 | # TODO: Python 3 support 66 | if config['synctex']: 67 | if int(vim.eval("has('gui_running')")): 68 | if not int(vim.eval("has('python3')")): 69 | logging.debug("TeX-9: Importing tex_nine_synctex") 70 | # NB: Important side effect: Vim will be hooked to the DBus session daemon 71 | import tex_nine_synctex 72 | else: 73 | echoerr("Must not have +python3 when using SyncTeX.") 74 | else: 75 | echomsg("SyncTeX not available in terminal.") 76 | 77 | # Miscellaneous extra settings 78 | config['_datelabel'] = '% Last Change:' 79 | config['_timestr'] = '%Y %b %d' 80 | 81 | # Start of the main module 82 | logging.debug("TeX-9: Entering the Python module.") 83 | 84 | messages = { 85 | 'NO_BIBTEX': 'No BibTeX databases present...', 86 | 'INVALID_BIBFILE': 'Invalid BibTeX file: `{0}\'', 87 | 'INVALID_BIBENTRY_TYPE': 'No such BibTeX entry type: `{0}\'', 88 | 'INVALID_BIBENTRY': 'Following BibTeX entry is invalid: {0}', 89 | 'INVALID_MODELINE': 'Cannot find master file `{0}\'', 90 | 'NO_MODELINE': 'Cannot find master file: no modeline or \documentclass statement', 91 | 'MASTER_NOT_ACTIVE': 'Please have the master file `{0}\' open in Vim.', 92 | 'NO_OUTPUT': 'Output file `{0}\' does not exist.', 93 | 'INVALID_HEADER': r'Missing information in header.', 94 | 'NO_BIBSTYLE': r'No valid bibliography style found in the document.', 95 | 'NO_COMPILER': r'Compiler unknown.' 96 | } 97 | 98 | class TeXNineBase(object): 99 | """Singleton base class for TeX-9.""" 100 | 101 | _instance = None 102 | buffers = {} 103 | 104 | def __new__(self, *args, **kwargs): 105 | if self._instance is None: 106 | self._instance = object.__new__(self) 107 | return self._instance 108 | 109 | def add_buffer(self, vimbuffer): 110 | """Add vimbuffer to buffers. 111 | 112 | Does not override existing entries. 113 | """ 114 | logging.debug("TeX-9: Adding `{0}\' to buffer dict.".format(vimbuffer.name)) 115 | bufinfo = { 116 | 'ft' : vim.eval('&ft'), 117 | 'master': "", 118 | 'buffer': vimbuffer, 119 | 'synctex': None 120 | } 121 | 122 | self.buffers.setdefault(vimbuffer.name, bufinfo) 123 | return 124 | 125 | def find_master_file(self, vimbuffer, nlines=3): 126 | """Finds the filename of the master file in a LaTeX project. 127 | 128 | Checks if `vimbuffer' contains a \documentclass statement and sets 129 | the master file to `vimbuffer.name'. Otherwise checks the 130 | `nlines' first and `nlines' last lines for modeline of the form 131 | 132 | % mainfile: 133 | 134 | where is the path of the master file relative to 135 | the master file, e.g. ../main.tex. 136 | 137 | Raises `TeXNineError' if master cannot be found. 138 | 139 | """ 140 | 141 | # Most often this is the case 142 | for line in vimbuffer: 143 | if '\\documentclass' in line: 144 | return vimbuffer.name 145 | 146 | # Look for modeline 147 | for line in vimbuffer[:nlines]+vimbuffer[-nlines:]: 148 | match = re.search(r'^\s*%\s*mainfile:\s*(\S+)', line) 149 | if match: 150 | master_file = path.join(path.dirname(vimbuffer.name), 151 | match.group(1)) 152 | master_file = path.abspath(master_file) 153 | 154 | if path.exists(master_file): 155 | return master_file 156 | else: 157 | e = messages['INVALID_MODELINE'].format(match.group(1)) 158 | raise TeXNineError(e) 159 | 160 | # Empty buffer, no match or no read access to master 161 | raise TeXNineError(messages['NO_MODELINE']) 162 | 163 | def get_master_file(self, vimbuffer): 164 | """Returns the filename of the master file.""" 165 | 166 | if not self.buffers[vimbuffer.name]['master']: 167 | master = self.find_master_file(vimbuffer) 168 | self.buffers[vimbuffer.name]['master'] = master 169 | 170 | # Make sure master knows it's the master 171 | masterinfo = self.buffers.get(master) 172 | if masterinfo is not None: 173 | masterinfo['master'] = master 174 | 175 | return self.buffers[vimbuffer.name]['master'] 176 | 177 | @staticmethod 178 | def multi_file(f): 179 | """Decorates methods that need to know the actual master file in 180 | a multi-file project. 181 | 182 | The decorator swaps passed vim.buffer object to the vim.buffer object 183 | of the master file. 184 | 185 | When calling a decorated method, `TeXNineError' has to be caught. 186 | 187 | """ 188 | def new_f(self, vimbuffer, *args, **kwargs): 189 | 190 | master = self.get_master_file(vimbuffer) 191 | masterbuffer = self.buffers.get(master) 192 | if masterbuffer is None: 193 | # Master is not loaded yet 194 | # NB: badd does not make the master buffer active so 195 | # decorated methods are not guaranteed to get read access to 196 | # the master buffer. 197 | vim.command('badd {0}'.format(master.replace(' ', '\ '))) 198 | for b in vim.buffers: 199 | if b.name == master: 200 | break 201 | self.add_buffer(b) 202 | self.buffers[master]['master'] = master 203 | masterbuffer = self.buffers[master] 204 | 205 | return f(self, masterbuffer['buffer'], *args, **kwargs) 206 | 207 | return new_f 208 | 209 | class TeXNineBibTeX(TeXNineBase): 210 | """A class to gather BibTeX entries in a list. 211 | 212 | After instantiation, this object tries to figure out 213 | all BibTeX files in a project by looking at the master file 214 | containing the \\bibliography{...} statement. 215 | 216 | Alternatively, this behavior may be overridden by providing 217 | a list of absolute paths to the BibTeX files: 218 | 219 | # Let the object figure out everything 220 | omni = TeXNineBibTeX() 221 | entries = omni.bibentries 222 | 223 | # DIY 224 | omni = TeXNineBibTeX() 225 | omni.bibpaths = [path1, path2,...] 226 | entries = omni.bibentries 227 | 228 | # Update entries 229 | omni.update() #or omni.update(my_new_paths) 230 | 231 | """ 232 | 233 | _bibcompletions = [] 234 | _bibpaths = set([]) 235 | 236 | def _bibparser(self, fname): 237 | """Opens a file and extracts all BibTeX entries in it.""" 238 | try: 239 | with open(fname) as f: 240 | logging.debug("TeX-9: Reading BibTeX entries from `{0}'".format(path.basename(fname))) 241 | return re.findall('^@\w+ *{\s*([^, ]+) *,', f.read(), re.M) 242 | 243 | except IOError: 244 | echoerr(messages["INVALID_BIBFILE"].format(fname)) 245 | return [] 246 | 247 | @property 248 | def bibpaths(self): 249 | return self.get_bibpaths(vim.current.buffer) 250 | 251 | @bibpaths.setter 252 | def set_bibpaths(self, paths): 253 | for p in paths: 254 | self._bibpaths.add(p) 255 | self._bibcompletions = [] 256 | return 257 | 258 | @property 259 | def bibentries(self): 260 | return self.get_bibentries() 261 | 262 | # Lazy load 263 | @TeXNineBase.multi_file 264 | def get_bibpaths(self, vimbuffer, update=False): 265 | """Returns the BibTeX files in a LaTeX project. 266 | 267 | Reads the master file to find out the names of BibTeX files. 268 | Files in the compilation folder take precedence over files 269 | located in a TDS tree[1]. 270 | 271 | * Requires the program ``kpsewhich'' 272 | that is shipped with the standard TeXLive distribution. 273 | 274 | [1] http://www.tug.org/tds/tds.html#BibTeX 275 | """ 276 | 277 | if not self._bibpaths or update: 278 | # Find out the bibfiles in use 279 | master = vimbuffer.name 280 | masterbuffer = "\n".join(vimbuffer[:]) 281 | if not masterbuffer: 282 | e = messages['MASTER_NOT_ACTIVE'].format(path.basename(master)) 283 | raise TeXNineError(e) 284 | else: 285 | match = re.search(r'\\bibliography{([^}]+)}', 286 | masterbuffer) 287 | if not match: 288 | e = messages['NO_BIBTEX'] 289 | raise TeXNineError(e) 290 | 291 | bibfiles = match.group(1).split(',') 292 | dirname = path.dirname(master) 293 | # Find the absolute paths of the bibfiles 294 | for b in bibfiles: 295 | b += '.bib' 296 | # Check if the bibfile is in the compilation folder 297 | bibtemp = path.join(dirname, b) 298 | b = ( bibtemp if path.exists(bibtemp) else b ) 299 | # Get the path with kspewhich 300 | proc = subprocess.Popen(['kpsewhich','-must-exist', b], 301 | stdout=subprocess.PIPE) 302 | bibpath = proc.communicate()[0].strip('\n') 303 | # kpsewhich return either the full path or an empty 304 | # string. 305 | if bibpath: 306 | self._bibpaths.add(bibpath) 307 | else: 308 | raise TeXNineError(messages["INVALID_BIBFILE"].format(b)) 309 | 310 | return list(self._bibpaths) 311 | 312 | def get_bibentries(self): 313 | """Returns a list of BibTeX entries found in the BibTeX files.""" 314 | if not self._bibcompletions: 315 | bibpaths = self.get_bibpaths(vim.current.buffer) 316 | for b in bibpaths: 317 | self._bibcompletions += self._bibparser(b) 318 | return self._bibcompletions 319 | 320 | def update(self, bibpaths=[]): 321 | self._bibcompletions = [] 322 | self._bibpaths.clear() 323 | if bibpaths: 324 | for p in bibpaths: 325 | self._bibpaths.add(p) 326 | else: 327 | self.get_bibpaths(vim.current.buffer, update=True) 328 | 329 | class TeXNineOmni(TeXNineBibTeX): 330 | """Vim's omni completion for a LaTeX document. 331 | 332 | findstart() finds the position where completion should start and 333 | stores the relevant `keyword'. An appropiate list is then returned 334 | based on the keyword. 335 | 336 | Following items are completed via omni completion 337 | 338 | * BibTeX entries 339 | * Labels for cross-references 340 | * Font names when using `fontspec' or 'unicode-math' 341 | * Picture names when using `graphicx' (EPS, PNG, JPG, PDF) 342 | 343 | """ 344 | 345 | def __init__(self, bibfiles=[]): 346 | self.keyword = None 347 | 348 | @TeXNineBase.multi_file 349 | def _labels(self, vimbuffer, 350 | pat=re.compile(r'\\label{(?P