2018-10-23 commit, with vim-pathogen

This commit is contained in:
2018-10-23 19:13:25 -04:00
parent 1d67b40d1c
commit 7193782b0f
214 changed files with 44511 additions and 0 deletions

View File

@ -0,0 +1,207 @@
" Maintainer: Robert Melton ( robert -at- robertmelton -dot- com)
" Last Change: 2012 Oct 28th
" default schemes
amenu T&hemes.D&efault.Blue :colo blue<CR>
amenu T&hemes.D&efault.DarkBlue :colo darkblue<CR>
amenu T&hemes.D&efault.Default :colo default<CR>
amenu T&hemes.D&efault.Delek :colo delek<CR>
amenu T&hemes.D&efault.Desert :colo desert<CR>
amenu T&hemes.D&efault.ElfLord :colo elflord<CR>
amenu T&hemes.D&efault.Evening :colo evening<CR>
amenu T&hemes.D&efault.Koehler :colo koehler<CR>
amenu T&hemes.D&efault.Morning :colo morning<CR>
amenu T&hemes.D&efault.Murphy :colo murphy<CR>
amenu T&hemes.D&efault.Pablo :colo pablo<CR>
amenu T&hemes.D&efault.PeachPuff :colo peachpuff<CR>
amenu T&hemes.D&efault.Ron :colo ron<CR>
amenu T&hemes.D&efault.Shine :colo shine<CR>
amenu T&hemes.D&efault.Torte :colo torte<CR>
amenu T&hemes.-s1- :
" New
amenu T&hemes.&New.&Dark.Wombat256 :colo wombat256<CR>
amenu T&hemes.&New.&Dark.Wombat256mod :colo wombat256mod<CR>
amenu T&hemes.&New.&Dark.Zendnb :colo zendnb<CR>
amenu T&hemes.&New.&Dark.Vimhut :colo vimhut<CR>
amenu T&hemes.&New.&Dark.Sorcerer :colo sorcerer<CR>
amenu T&hemes.&New.&Dark.Mizore :colo mizore<CR>
amenu T&hemes.&New.&Dark.Midnight :colo midnight<CR>
amenu T&hemes.&New.&Dark.Midnight2 :colo midnight2<CR>
amenu T&hemes.&New.&Dark.Manuscript :colo manuscript<CR>
amenu T&hemes.&New.&Dark.Luinnar :colo luinnar<CR>
amenu T&hemes.&New.&Dark.LiquidCarbon :colo liquidcarbon<CR>
amenu T&hemes.&New.&Dark.Gentooish :colo gentooish<CR>
amenu T&hemes.&New.&Dark.FU :colo fu<CR>
amenu T&hemes.&New.&Dark.Dejavu :colo dejavu<CR>
amenu T&hemes.&New.&Dark.Blackbeauty :colo blackbeauty<CR>
amenu T&hemes.&New.&Other.Tesla :colo tesla<CR>
amenu T&hemes.&New.&Other.Solarized :colo solarized<CR>
amenu T&hemes.&New.&Other.PSClone :colo psclone<CR>
amenu T&hemes.&New.&Other.Paradox :colo paradox<CR>
amenu T&hemes.&New.&Other.Omen :colo omen<CR>
amenu T&hemes.&New.&Other.NightVision :colo nightvision<CR>
amenu T&hemes.&New.&Other.Masmed :colo masmed<CR>
amenu T&hemes.&New.&Other.Deepblue :colo deepblue<CR>
amenu T&hemes.&New.&Other.Darkburn :colo darkburn<CR>
amenu T&hemes.&New.&Other.Bigbang :colo bigbang<CR>
amenu T&hemes.&New.&Other.Astroboy :colo astroboy<CR>
amenu T&hemes.&New.&Other.Anokha :colo anokha<CR>
amenu T&hemes.&New.&Light.Zenesque :colo zenesque<CR>
amenu T&hemes.&New.&Light.Scame :colo scame<CR>
amenu T&hemes.&New.&Light.Newspaper :colo newspaper<CR>
amenu T&hemes.&New.&Light.Montz :colo montz<CR>
amenu T&hemes.&New.&Light.MickeySoft :colo mickeysoft<CR>
amenu T&hemes.&New.&Light.MayanSmoke :colo mayansmoke<CR>
amenu T&hemes.&New.&Light.IntelliJ :colo intellij<CR>
amenu T&hemes.&New.&Light.Imperial :colo imperial<CR>
amenu T&hemes.&New.&Light.Greyhouse :colo greyhouse<CR>
amenu T&hemes.&New.&Light.Github :colo github<CR>
amenu T&hemes.&New.&Light.Gaea :colo gaea<CR>
amenu T&hemes.&New.&Light.Calmbreeze :colo calmbreeze<CR>
" Updated
amenu T&hemes.&Updated.&Dark.DarkZ :colo darkz<CR>
amenu T&hemes.&Updated.&Dark.DesertEx :colo desertEx<CR>
amenu T&hemes.&Updated.&Dark.Earendel :colo earendel<CR>
amenu T&hemes.&Updated.&Dark.Fruity :colo fruity<CR>
amenu T&hemes.&Updated.&Dark.Jellybeans :colo jellybeans<CR>
amenu T&hemes.&Updated.&Dark.Leo :colo leo<CR>
amenu T&hemes.&Updated.&Dark.Lucius :colo lucius<CR>
amenu T&hemes.&Updated.&Dark.Matrix :colo matrix<CR>
amenu T&hemes.&Updated.&Dark.Metacosm :colo metacosm<CR>
amenu T&hemes.&Updated.&Dark.Moria :colo moria<CR>
amenu T&hemes.&Updated.&Dark.Neverness :colo neverness<CR>
amenu T&hemes.&Updated.&Dark.Railscasts :colo railscasts<CR>
amenu T&hemes.&Updated.&Dark.Synic :colo synic<CR>
amenu T&hemes.&Updated.&Dark.Vividchalk :colo vividchalk<CR>
amenu T&hemes.&Updated.&Dark.Xoria256 :colo xoria256<CR>
amenu T&hemes.&Updated.&Dark.Zenburn :colo zenburn<CR>
amenu T&hemes.&Updated.&Light.Biogoo :colo biogoo<CR>
amenu T&hemes.&Updated.&Light.Print_bw :colo print_bw<CR>
amenu T&hemes.&Updated.&Light.Pyte :colo pyte<CR>
amenu T&hemes.&Updated.&Light.VYLight :colo vylight<CR>
amenu T&hemes.&Updated.&Other.Moss :colo moss<CR>
amenu T&hemes.&Updated.&Other.Peaksea :colo peaksea<CR>
" Themepack Themes
amenu T&hemes.&Dark.Adaryn :colo adaryn<CR>
amenu T&hemes.&Dark.Adrian :colo adrian<CR>
amenu T&hemes.&Dark.Anotherdark :colo anotherdark<CR>
amenu T&hemes.&Dark.Asu1dark :colo asu1dark<CR>
amenu T&hemes.&Dark.BlackSea :colo blacksea<CR>
amenu T&hemes.&Dark.Brookstream :colo brookstream<CR>
amenu T&hemes.&Dark.Calmar256-dark :colo calmar256-dark<CR>
amenu T&hemes.&Dark.Camo :colo camo<CR>
amenu T&hemes.&Dark.Candy :colo candy<CR>
amenu T&hemes.&Dark.Candycode :colo candycode<CR>
amenu T&hemes.&Dark.Colorer :colo colorer<CR>
amenu T&hemes.&Dark.Dante :colo dante<CR>
amenu T&hemes.&Dark.Darkbone :colo darkbone<CR>
amenu T&hemes.&Dark.Darkspectrum :colo darkspectrum<CR>
amenu T&hemes.&Dark.Desert256 :colo desert256<CR>
amenu T&hemes.&Dark.Dusk :colo dusk<CR>
amenu T&hemes.&Dark.DwBlue :colo dw_blue<CR>
amenu T&hemes.&Dark.DwCyan :colo dw_cyan<CR>
amenu T&hemes.&Dark.DwGreen :colo dw_green<CR>
amenu T&hemes.&Dark.DwOrange :colo dw_orange<CR>
amenu T&hemes.&Dark.DwPurple :colo dw_purple<CR>
amenu T&hemes.&Dark.DwRed :colo dw_red<CR>
amenu T&hemes.&Dark.DwYellow :colo dw_yellow<CR>
amenu T&hemes.&Dark.Ekvoli :colo ekvoli<CR>
amenu T&hemes.&Dark.Fnaqevan :colo fnaqevan<CR>
amenu T&hemes.&Dark.Freya :colo freya<CR>
amenu T&hemes.&Dark.Golden :colo golden<CR>
amenu T&hemes.&Dark.Herald :colo herald<CR>
amenu T&hemes.&Dark.Inkpot :colo inkpot<CR>
amenu T&hemes.&Dark.Jammy :colo jammy<CR>
amenu T&hemes.&Dark.Kellys :colo kellys<CR>
amenu T&hemes.&Dark.Lettuce :colo lettuce<CR>
amenu T&hemes.&Dark.Manxome :colo manxome<CR>
amenu T&hemes.&Dark.Maroloccio :colo maroloccio<CR>
amenu T&hemes.&Dark.Molokai :colo molokai<CR>
amenu T&hemes.&Dark.Motus :colo motus<CR>
amenu T&hemes.&Dark.Mustang :colo mustang<CR>
amenu T&hemes.&Dark.Neon :colo neon<CR>
amenu T&hemes.&Dark.Northland :colo northland<CR>
amenu T&hemes.&Dark.Oceanblack :colo oceanblack<CR>
amenu T&hemes.&Dark.Railscasts2 :colo railscasts2<CR>
amenu T&hemes.&Dark.Rdark :colo rdark<CR>
amenu T&hemes.&Dark.Relaxedgreen :colo relaxedgreen<CR>
amenu T&hemes.&Dark.Rootwater :colo rootwater<CR>
amenu T&hemes.&Dark.Tango :colo tango<CR>
amenu T&hemes.&Dark.Tango2 :colo tango2<CR>
amenu T&hemes.&Dark.TIRBlack :colo tir_black<CR>
amenu T&hemes.&Dark.Twilight :colo twilight<CR>
amenu T&hemes.&Dark.Two2Tango :colo two2tango<CR>
amenu T&hemes.&Dark.Vibrantink :colo vibrantink<CR>
amenu T&hemes.&Dark.Wombat :colo wombat<CR>
amenu T&hemes.&Dark.Wuye :colo wuye<CR>
amenu T&hemes.&Dark.Zmrok :colo zmrok<CR>
amenu T&hemes.&Light.Autumn :colo autumn<CR>
amenu T&hemes.&Light.Autumn2 :colo autumn2<CR>
amenu T&hemes.&Light.Autumnleaf :colo autumnleaf<CR>
amenu T&hemes.&Light.Baycomb :colo baycomb<CR>
amenu T&hemes.&Light.BClear :colo bclear<CR>
amenu T&hemes.&Light.Buttercream :colo buttercream<CR>
amenu T&hemes.&Light.Calmar256-light :colo calmar256-light<CR>
amenu T&hemes.&Light.Chela_light :colo chela_light<CR>
amenu T&hemes.&Light.Dawn :colo dawn<CR>
amenu T&hemes.&Light.Eclipse :colo eclipse<CR>
amenu T&hemes.&Light.Fine_blue :colo fine_blue<CR>
amenu T&hemes.&Light.Fog :colo fog<CR>
amenu T&hemes.&Light.Fruit :colo fruit<CR>
amenu T&hemes.&Light.Habilight :colo habilight<CR>
amenu T&hemes.&Light.Impact :colo impact<CR>
amenu T&hemes.&Light.Ironman :colo ironman<CR>
amenu T&hemes.&Light.Martin_krischik :colo martin_krischik<CR>
amenu T&hemes.&Light.Nuvola :colo nuvola<CR>
amenu T&hemes.&Light.Oceanlight :colo oceanlight<CR>
amenu T&hemes.&Light.PapayaWhip :colo PapayaWhip<CR>
amenu T&hemes.&Light.Satori :colo satori<CR>
amenu T&hemes.&Light.Sienna :colo sienna<CR>
amenu T&hemes.&Light.Silent :colo silent<CR>
amenu T&hemes.&Light.Simpleandfriendly :colo simpleandfriendly<CR>
amenu T&hemes.&Light.SoSo :colo soso<CR>
amenu T&hemes.&Light.Spring :colo spring<CR>
amenu T&hemes.&Light.SummerFruit256 :colo summerfruit256<CR>
amenu T&hemes.&Light.TAqua :colo taqua<CR>
amenu T&hemes.&Light.TCSoft :colo tcsoft<CR>
amenu T&hemes.&Light.Tolerable :colo tolerable<CR>
amenu T&hemes.&Light.Vc :colo vc<CR>
amenu T&hemes.&Light.Winter :colo winter<CR>
amenu T&hemes.&Other.Aiseered :colo aiseered<CR>
amenu T&hemes.&Other.Aqua :colo aqua<CR>
amenu T&hemes.&Other.Astronaut :colo astronaut<CR>
amenu T&hemes.&Other.Bluegreen :colo bluegreen<CR>
amenu T&hemes.&Other.Borland :colo borland<CR>
amenu T&hemes.&Other.Breeze :colo breeze<CR>
amenu T&hemes.&Other.Chocolateliquor :colo chocolateliquor<CR>
amenu T&hemes.&Other.Clarity :colo clarity<CR>
amenu T&hemes.&Other.CleanPHP :colo cleanphp<CR>
amenu T&hemes.&Other.Darkblue2 :colo darkblue2<CR>
amenu T&hemes.&Other.Darkslategray :colo darkslategray<CR>
amenu T&hemes.&Other.Denim :colo denim<CR>
amenu T&hemes.&Other.Guardian :colo guardian<CR>
amenu T&hemes.&Other.Marklar :colo marklar<CR>
amenu T&hemes.&Other.Navajo-night :colo navajo-night<CR>
amenu T&hemes.&Other.Navajo :colo navajo<CR>
amenu T&hemes.&Other.Night :colo night<CR>
amenu T&hemes.&Other.Nightshimmer :colo nightshimmer<CR>
amenu T&hemes.&Other.NoQuarter :colo no_quarter<CR>
amenu T&hemes.&Other.Oceandeep :colo oceandeep<CR>
amenu T&hemes.&Other.Olive :colo olive<CR>
amenu T&hemes.&Other.RobinHood :colo robinhood<CR>
amenu T&hemes.&Other.Sea :colo sea<CR>
amenu T&hemes.&Other.Settlemyer :colo settlemyer<CR>
amenu T&hemes.&Other.SoftBlue :colo softblue<CR>
amenu T&hemes.&Other.Tabula :colo tabula<CR>
amenu T&hemes.&Other.Wood :colo wood<CR>
amenu T&hemes.&Other.Xemacs :colo xemacs<CR>

34
bundle/gundo/README.markdown Executable file
View File

@ -0,0 +1,34 @@
<a href="http://flattr.com/thing/74149/Gundo-vim" target="_blank">
<img src="http://api.flattr.com/button/button-compact-static-100x17.png" alt="Flattr this" title="Flattr this" border="0" /></a>
Gundo.vim is Vim plugin to visualize your Vim undo tree.
Preview
-------
Screencast:
### [http://screenr.com/M9l](http://screenr.com/M9l)
Screenshot:
<a href="http://www.flickr.com/photos/sjl7678/5093114605/" title="gundo by stevelosh, on Flickr"><img src="http://farm5.static.flickr.com/4113/5093114605_ebc46d6494.jpg" width="487" height="500" alt="gundo" /></a>
Requirements
------------
* Vim 7.3+
* Python support for Vim
* Python 2.4+
Installation and Usage
----------------------
Check out the [project site][] for installation instructions.
[project site]: http://sjl.bitbucket.org/gundo.vim/
License
-------
GPLv2+, just like Mercurial.

577
bundle/gundo/autoload/gundo.py Executable file
View File

@ -0,0 +1,577 @@
# ============================================================================
# File: gundo.py
# Description: vim global plugin to visualize your undo tree
# Maintainer: Steve Losh <steve@stevelosh.com>
# License: GPLv2+ -- look it up.
# Notes: Much of this code was thiefed from Mercurial, and the rest was
# heavily inspired by scratch.vim and histwin.vim.
#
# ============================================================================
import difflib
import itertools
import sys
import time
import vim
# Mercurial's graphlog code --------------------------------------------------------
def asciiedges(seen, rev, parents):
"""adds edge info to changelog DAG walk suitable for ascii()"""
if rev not in seen:
seen.append(rev)
nodeidx = seen.index(rev)
knownparents = []
newparents = []
for parent in parents:
if parent in seen:
knownparents.append(parent)
else:
newparents.append(parent)
ncols = len(seen)
seen[nodeidx:nodeidx + 1] = newparents
edges = [(nodeidx, seen.index(p)) for p in knownparents]
if len(newparents) > 0:
edges.append((nodeidx, nodeidx))
if len(newparents) > 1:
edges.append((nodeidx, nodeidx + 1))
nmorecols = len(seen) - ncols
return nodeidx, edges, ncols, nmorecols
def get_nodeline_edges_tail(
node_index, p_node_index, n_columns, n_columns_diff, p_diff, fix_tail):
if fix_tail and n_columns_diff == p_diff and n_columns_diff != 0:
# Still going in the same non-vertical direction.
if n_columns_diff == -1:
start = max(node_index + 1, p_node_index)
tail = ["|", " "] * (start - node_index - 1)
tail.extend(["/", " "] * (n_columns - start))
return tail
else:
return ["\\", " "] * (n_columns - node_index - 1)
else:
return ["|", " "] * (n_columns - node_index - 1)
def draw_edges(edges, nodeline, interline):
for (start, end) in edges:
if start == end + 1:
interline[2 * end + 1] = "/"
elif start == end - 1:
interline[2 * start + 1] = "\\"
elif start == end:
interline[2 * start] = "|"
else:
nodeline[2 * end] = "+"
if start > end:
(start, end) = (end, start)
for i in range(2 * start + 1, 2 * end):
if nodeline[i] != "+":
nodeline[i] = "-"
def fix_long_right_edges(edges):
for (i, (start, end)) in enumerate(edges):
if end > start:
edges[i] = (start, end + 1)
def ascii(buf, state, type, char, text, coldata):
"""prints an ASCII graph of the DAG
takes the following arguments (one call per node in the graph):
- Somewhere to keep the needed state in (init to asciistate())
- Column of the current node in the set of ongoing edges.
- Type indicator of node data == ASCIIDATA.
- Payload: (char, lines):
- Character to use as node's symbol.
- List of lines to display as the node's text.
- Edges; a list of (col, next_col) indicating the edges between
the current node and its parents.
- Number of columns (ongoing edges) in the current revision.
- The difference between the number of columns (ongoing edges)
in the next revision and the number of columns (ongoing edges)
in the current revision. That is: -1 means one column removed;
0 means no columns added or removed; 1 means one column added.
"""
idx, edges, ncols, coldiff = coldata
assert -2 < coldiff < 2
if coldiff == -1:
# Transform
#
# | | | | | |
# o | | into o---+
# |X / |/ /
# | | | |
fix_long_right_edges(edges)
# add_padding_line says whether to rewrite
#
# | | | | | | | |
# | o---+ into | o---+
# | / / | | | # <--- padding line
# o | | | / /
# o | |
add_padding_line = (len(text) > 2 and coldiff == -1 and
[x for (x, y) in edges if x + 1 < y])
# fix_nodeline_tail says whether to rewrite
#
# | | o | | | | o | |
# | | |/ / | | |/ /
# | o | | into | o / / # <--- fixed nodeline tail
# | |/ / | |/ /
# o | | o | |
fix_nodeline_tail = len(text) <= 2 and not add_padding_line
# nodeline is the line containing the node character (typically o)
nodeline = ["|", " "] * idx
nodeline.extend([char, " "])
nodeline.extend(
get_nodeline_edges_tail(idx, state[1], ncols, coldiff,
state[0], fix_nodeline_tail))
# shift_interline is the line containing the non-vertical
# edges between this entry and the next
shift_interline = ["|", " "] * idx
if coldiff == -1:
n_spaces = 1
edge_ch = "/"
elif coldiff == 0:
n_spaces = 2
edge_ch = "|"
else:
n_spaces = 3
edge_ch = "\\"
shift_interline.extend(n_spaces * [" "])
shift_interline.extend([edge_ch, " "] * (ncols - idx - 1))
# draw edges from the current node to its parents
draw_edges(edges, nodeline, shift_interline)
# lines is the list of all graph lines to print
lines = [nodeline]
if add_padding_line:
lines.append(get_padding_line(idx, ncols, edges))
lines.append(shift_interline)
# make sure that there are as many graph lines as there are
# log strings
while len(text) < len(lines):
text.append("")
if len(lines) < len(text):
extra_interline = ["|", " "] * (ncols + coldiff)
while len(lines) < len(text):
lines.append(extra_interline)
# print lines
indentation_level = max(ncols, ncols + coldiff)
for (line, logstr) in zip(lines, text):
ln = "%-*s %s" % (2 * indentation_level, "".join(line), logstr)
buf.write(ln.rstrip() + '\n')
# ... and start over
state[0] = coldiff
state[1] = idx
def generate(dag, edgefn, current):
seen, state = [], [0, 0]
buf = Buffer()
for node, parents in list(dag):
if node.time:
age_label = age(int(node.time))
else:
age_label = 'Original'
line = '[%s] %s' % (node.n, age_label)
if node.n == current:
char = '@'
else:
char = 'o'
ascii(buf, state, 'C', char, [line], edgefn(seen, node, parents))
return buf.b
# Mercurial age function -----------------------------------------------------------
agescales = [("year", 3600 * 24 * 365),
("month", 3600 * 24 * 30),
("week", 3600 * 24 * 7),
("day", 3600 * 24),
("hour", 3600),
("minute", 60),
("second", 1)]
def age(ts):
'''turn a timestamp into an age string.'''
def plural(t, c):
if c == 1:
return t
return t + "s"
def fmt(t, c):
return "%d %s" % (c, plural(t, c))
now = time.time()
then = ts
if then > now:
return 'in the future'
delta = max(1, int(now - then))
if delta > agescales[0][1] * 2:
return time.strftime('%Y-%m-%d', time.gmtime(float(ts)))
for t, s in agescales:
n = delta // s
if n >= 2 or s == 1:
return '%s ago' % fmt(t, n)
# Python Vim utility functions -----------------------------------------------------
normal = lambda s: vim.command('normal %s' % s)
MISSING_BUFFER = "Cannot find Gundo's target buffer (%s)"
MISSING_WINDOW = "Cannot find window (%s) for Gundo's target buffer (%s)"
def _check_sanity():
'''Check to make sure we're not crazy.
Does the following things:
* Make sure the target buffer still exists.
'''
b = int(vim.eval('g:gundo_target_n'))
if not vim.eval('bufloaded(%d)' % b):
vim.command('echo "%s"' % (MISSING_BUFFER % b))
return False
w = int(vim.eval('bufwinnr(%d)' % b))
if w == -1:
vim.command('echo "%s"' % (MISSING_WINDOW % (w, b)))
return False
return True
def _goto_window_for_buffer(b):
w = int(vim.eval('bufwinnr(%d)' % int(b)))
vim.command('%dwincmd w' % w)
def _goto_window_for_buffer_name(bn):
b = vim.eval('bufnr("%s")' % bn)
return _goto_window_for_buffer(b)
def _undo_to(n):
n = int(n)
if n == 0:
vim.command('silent earlier %s' % (int(vim.eval('&undolevels')) + 1))
else:
vim.command('silent undo %d' % n)
INLINE_HELP = '''\
" Gundo for %s (%d)
" j/k - move between undo states
" p - preview diff of selected and current states
" <cr> - revert to selected state
'''
# Python undo tree data structures and functions -----------------------------------
class Buffer(object):
def __init__(self):
self.b = ''
def write(self, s):
self.b += s
class Node(object):
def __init__(self, n, parent, time, curhead):
self.n = int(n)
self.parent = parent
self.children = []
self.curhead = curhead
self.time = time
def _make_nodes(alts, nodes, parent=None):
p = parent
for alt in alts:
curhead = 'curhead' in alt
node = Node(n=alt['seq'], parent=p, time=alt['time'], curhead=curhead)
nodes.append(node)
if alt.get('alt'):
_make_nodes(alt['alt'], nodes, p)
p = node
def make_nodes():
ut = vim.eval('undotree()')
entries = ut['entries']
root = Node(0, None, False, 0)
nodes = []
_make_nodes(entries, nodes, root)
nodes.append(root)
nmap = dict((node.n, node) for node in nodes)
return nodes, nmap
def changenr(nodes):
_curhead_l = list(itertools.dropwhile(lambda n: not n.curhead, nodes))
if _curhead_l:
current = _curhead_l[0].parent.n
else:
current = int(vim.eval('changenr()'))
return current
# Gundo rendering ------------------------------------------------------------------
# Rendering utility functions
def _fmt_time(t):
return time.strftime('%Y-%m-%d %I:%M:%S %p', time.localtime(float(t)))
def _output_preview_text(lines):
_goto_window_for_buffer_name('__Gundo_Preview__')
vim.command('setlocal modifiable')
vim.current.buffer[:] = lines
vim.command('setlocal nomodifiable')
def _generate_preview_diff(current, node_before, node_after):
_goto_window_for_buffer(vim.eval('g:gundo_target_n'))
if not node_after.n: # we're at the original file
before_lines = []
_undo_to(0)
after_lines = vim.current.buffer[:]
before_name = 'n/a'
before_time = ''
after_name = 'Original'
after_time = ''
elif not node_before.n: # we're at a pseudo-root state
_undo_to(0)
before_lines = vim.current.buffer[:]
_undo_to(node_after.n)
after_lines = vim.current.buffer[:]
before_name = 'Original'
before_time = ''
after_name = node_after.n
after_time = _fmt_time(node_after.time)
else:
_undo_to(node_before.n)
before_lines = vim.current.buffer[:]
_undo_to(node_after.n)
after_lines = vim.current.buffer[:]
before_name = node_before.n
before_time = _fmt_time(node_before.time)
after_name = node_after.n
after_time = _fmt_time(node_after.time)
_undo_to(current)
return list(difflib.unified_diff(before_lines, after_lines,
before_name, after_name,
before_time, after_time))
def _generate_change_preview_diff(current, node_before, node_after):
_goto_window_for_buffer(vim.eval('g:gundo_target_n'))
_undo_to(node_before.n)
before_lines = vim.current.buffer[:]
_undo_to(node_after.n)
after_lines = vim.current.buffer[:]
before_name = node_before.n or 'Original'
before_time = node_before.time and _fmt_time(node_before.time) or ''
after_name = node_after.n or 'Original'
after_time = node_after.time and _fmt_time(node_after.time) or ''
_undo_to(current)
return list(difflib.unified_diff(before_lines, after_lines,
before_name, after_name,
before_time, after_time))
def GundoRenderGraph():
if not _check_sanity():
return
nodes, nmap = make_nodes()
for node in nodes:
node.children = [n for n in nodes if n.parent == node]
def walk_nodes(nodes):
for node in nodes:
if node.parent:
yield (node, [node.parent])
else:
yield (node, [])
dag = sorted(nodes, key=lambda n: int(n.n), reverse=True)
current = changenr(nodes)
result = generate(walk_nodes(dag), asciiedges, current).rstrip().splitlines()
result = [' ' + l for l in result]
target = (vim.eval('g:gundo_target_f'), int(vim.eval('g:gundo_target_n')))
if int(vim.eval('g:gundo_help')):
header = (INLINE_HELP % target).splitlines()
else:
header = []
vim.command('call s:GundoOpenGraph()')
vim.command('setlocal modifiable')
vim.current.buffer[:] = (header + result)
vim.command('setlocal nomodifiable')
i = 1
for line in result:
try:
line.split('[')[0].index('@')
i += 1
break
except ValueError:
pass
i += 1
vim.command('%d' % (i+len(header)-1))
def GundoRenderPreview():
if not _check_sanity():
return
target_state = vim.eval('s:GundoGetTargetState()')
# Check that there's an undo state. There may not be if we're talking about
# a buffer with no changes yet.
if target_state == None:
_goto_window_for_buffer_name('__Gundo__')
return
else:
target_state = int(target_state)
_goto_window_for_buffer(vim.eval('g:gundo_target_n'))
nodes, nmap = make_nodes()
current = changenr(nodes)
node_after = nmap[target_state]
node_before = node_after.parent
vim.command('call s:GundoOpenPreview()')
_output_preview_text(_generate_preview_diff(current, node_before, node_after))
_goto_window_for_buffer_name('__Gundo__')
def GundoRenderChangePreview():
if not _check_sanity():
return
target_state = vim.eval('s:GundoGetTargetState()')
# Check that there's an undo state. There may not be if we're talking about
# a buffer with no changes yet.
if target_state == None:
_goto_window_for_buffer_name('__Gundo__')
return
else:
target_state = int(target_state)
_goto_window_for_buffer(vim.eval('g:gundo_target_n'))
nodes, nmap = make_nodes()
current = changenr(nodes)
node_after = nmap[target_state]
node_before = nmap[current]
vim.command('call s:GundoOpenPreview()')
_output_preview_text(_generate_change_preview_diff(current, node_before, node_after))
_goto_window_for_buffer_name('__Gundo__')
# Gundo undo/redo
def GundoRevert():
if not _check_sanity():
return
target_n = int(vim.eval('s:GundoGetTargetState()'))
back = vim.eval('g:gundo_target_n')
_goto_window_for_buffer(back)
_undo_to(target_n)
vim.command('GundoRenderGraph')
_goto_window_for_buffer(back)
if int(vim.eval('g:gundo_close_on_revert')):
vim.command('GundoToggle')
def GundoPlayTo():
if not _check_sanity():
return
target_n = int(vim.eval('s:GundoGetTargetState()'))
back = int(vim.eval('g:gundo_target_n'))
vim.command('echo "%s"' % back)
_goto_window_for_buffer(back)
normal('zR')
nodes, nmap = make_nodes()
start = nmap[changenr(nodes)]
end = nmap[target_n]
def _walk_branch(origin, dest):
rev = origin.n < dest.n
nodes = []
if origin.n > dest.n:
current, final = origin, dest
else:
current, final = dest, origin
while current.n >= final.n:
if current.n == final.n:
break
nodes.append(current)
current = current.parent
else:
return None
nodes.append(current)
if rev:
return reversed(nodes)
else:
return nodes
branch = _walk_branch(start, end)
if not branch:
vim.command('unsilent echo "No path to that node from here!"')
return
for node in branch:
_undo_to(node.n)
vim.command('GundoRenderGraph')
normal('zz')
_goto_window_for_buffer(back)
vim.command('redraw')
vim.command('sleep 60m')
def initPythonModule():
if sys.version_info[:2] < (2, 4):
vim.command('let s:has_supported_python = 0')

469
bundle/gundo/autoload/gundo.vim Executable file
View File

@ -0,0 +1,469 @@
" ============================================================================
" File: gundo.vim
" Description: vim global plugin to visualize your undo tree
" Maintainer: Steve Losh <steve@stevelosh.com>
" License: GPLv2+ -- look it up.
" Notes: Much of this code was thiefed from Mercurial, and the rest was
" heavily inspired by scratch.vim and histwin.vim.
"
" ============================================================================
"{{{ Init
if v:version < '703'"{{{
function! s:GundoDidNotLoad()
echohl WarningMsg|echomsg "Gundo unavailable: requires Vim 7.3+"|echohl None
endfunction
command! -nargs=0 GundoToggle call s:GundoDidNotLoad()
finish
endif"}}}
if !exists('g:gundo_width')"{{{
let g:gundo_width = 45
endif"}}}
if !exists('g:gundo_preview_height')"{{{
let g:gundo_preview_height = 15
endif"}}}
if !exists('g:gundo_preview_bottom')"{{{
let g:gundo_preview_bottom = 0
endif"}}}
if !exists('g:gundo_right')"{{{
let g:gundo_right = 0
endif"}}}
if !exists('g:gundo_help')"{{{
let g:gundo_help = 1
endif"}}}
if !exists("g:gundo_map_move_older")"{{{
let g:gundo_map_move_older = 'j'
endif"}}}
if !exists("g:gundo_map_move_newer")"{{{
let g:gundo_map_move_newer = 'k'
endif"}}}
if !exists("g:gundo_close_on_revert")"{{{
let g:gundo_close_on_revert = 0
endif"}}}
if !exists("g:gundo_prefer_python3")"{{{
let g:gundo_prefer_python3 = 0
endif"}}}
if !exists("g:gundo_auto_preview")"{{{
let g:gundo_auto_preview = 1
endif"}}}
let s:has_supported_python = 0
if g:gundo_prefer_python3 && has('python3')"{{{
let s:has_supported_python = 2
elseif has('python')"
let s:has_supported_python = 1
endif
if !s:has_supported_python
function! s:GundoDidNotLoad()
echohl WarningMsg|echomsg "Gundo requires Vim to be compiled with Python 2.4+"|echohl None
endfunction
command! -nargs=0 GundoToggle call s:GundoDidNotLoad()
finish
endif"}}}
let s:plugin_path = escape(expand('<sfile>:p:h'), '\')
"}}}
"{{{ Gundo utility functions
function! s:GundoGetTargetState()"{{{
let target_line = matchstr(getline("."), '\v\[[0-9]+\]')
return matchstr(target_line, '\v[0-9]+')
endfunction"}}}
function! s:GundoGoToWindowForBufferName(name)"{{{
if bufwinnr(bufnr(a:name)) != -1
exe bufwinnr(bufnr(a:name)) . "wincmd w"
return 1
else
return 0
endif
endfunction"}}}
function! s:GundoIsVisible()"{{{
if bufwinnr(bufnr("__Gundo__")) != -1 || bufwinnr(bufnr("__Gundo_Preview__")) != -1
return 1
else
return 0
endif
endfunction"}}}
function! s:GundoInlineHelpLength()"{{{
if g:gundo_help
return 6
else
return 0
endif
endfunction"}}}
"}}}
"{{{ Gundo buffer settings
function! s:GundoMapGraph()"{{{
exec 'nnoremap <script> <silent> <buffer> ' . g:gundo_map_move_older . " :call <sid>GundoMove(1)<CR>"
exec 'nnoremap <script> <silent> <buffer> ' . g:gundo_map_move_newer . " :call <sid>GundoMove(-1)<CR>"
nnoremap <script> <silent> <buffer> <CR> :call <sid>GundoRevert()<CR>
nnoremap <script> <silent> <buffer> o :call <sid>GundoRevert()<CR>
nnoremap <script> <silent> <buffer> <down> :call <sid>GundoMove(1)<CR>
nnoremap <script> <silent> <buffer> <up> :call <sid>GundoMove(-1)<CR>
nnoremap <script> <silent> <buffer> gg gg:call <sid>GundoMove(1)<CR>
nnoremap <script> <silent> <buffer> P :call <sid>GundoPlayTo()<CR>
nnoremap <script> <silent> <buffer> p :call <sid>GundoRenderChangePreview()<CR>
nnoremap <script> <silent> <buffer> r :call <sid>GundoRenderPreview()<CR>
nnoremap <script> <silent> <buffer> q :call <sid>GundoClose()<CR>
cabbrev <script> <silent> <buffer> q call <sid>GundoClose()
cabbrev <script> <silent> <buffer> quit call <sid>GundoClose()
nnoremap <script> <silent> <buffer> <2-LeftMouse> :call <sid>GundoMouseDoubleClick()<CR>
endfunction"}}}
function! s:GundoMapPreview()"{{{
nnoremap <script> <silent> <buffer> q :call <sid>GundoClose()<CR>
cabbrev <script> <silent> <buffer> q call <sid>GundoClose()
cabbrev <script> <silent> <buffer> quit call <sid>GundoClose()
endfunction"}}}
function! s:GundoSettingsGraph()"{{{
setlocal buftype=nofile
setlocal bufhidden=hide
setlocal noswapfile
setlocal nobuflisted
setlocal nomodifiable
setlocal filetype=gundo
setlocal nolist
setlocal nonumber
setlocal norelativenumber
setlocal nowrap
call s:GundoSyntaxGraph()
call s:GundoMapGraph()
endfunction"}}}
function! s:GundoSettingsPreview()"{{{
setlocal buftype=nofile
setlocal bufhidden=hide
setlocal noswapfile
setlocal nobuflisted
setlocal nomodifiable
setlocal filetype=diff
setlocal nonumber
setlocal norelativenumber
setlocal nowrap
setlocal foldlevel=20
setlocal foldmethod=diff
call s:GundoMapPreview()
endfunction"}}}
function! s:GundoSyntaxGraph()"{{{
let b:current_syntax = 'gundo'
syn match GundoCurrentLocation '@'
syn match GundoHelp '\v^".*$'
syn match GundoNumberField '\v\[[0-9]+\]'
syn match GundoNumber '\v[0-9]+' contained containedin=GundoNumberField
hi def link GundoCurrentLocation Keyword
hi def link GundoHelp Comment
hi def link GundoNumberField Comment
hi def link GundoNumber Identifier
endfunction"}}}
"}}}
"{{{ Gundo buffer/window management
function! s:GundoResizeBuffers(backto)"{{{
call s:GundoGoToWindowForBufferName('__Gundo__')
exe "vertical resize " . g:gundo_width
call s:GundoGoToWindowForBufferName('__Gundo_Preview__')
exe "resize " . g:gundo_preview_height
exe a:backto . "wincmd w"
endfunction"}}}
function! s:GundoOpenGraph()"{{{
let existing_gundo_buffer = bufnr("__Gundo__")
if existing_gundo_buffer == -1
call s:GundoGoToWindowForBufferName('__Gundo_Preview__')
exe "new __Gundo__"
if g:gundo_preview_bottom
if g:gundo_right
wincmd L
else
wincmd H
endif
endif
call s:GundoResizeBuffers(winnr())
else
let existing_gundo_window = bufwinnr(existing_gundo_buffer)
if existing_gundo_window != -1
if winnr() != existing_gundo_window
exe existing_gundo_window . "wincmd w"
endif
else
call s:GundoGoToWindowForBufferName('__Gundo_Preview__')
if g:gundo_preview_bottom
if g:gundo_right
exe "botright vsplit +buffer" . existing_gundo_buffer
else
exe "topleft vsplit +buffer" . existing_gundo_buffer
endif
else
exe "split +buffer" . existing_gundo_buffer
endif
call s:GundoResizeBuffers(winnr())
endif
endif
if exists("g:gundo_tree_statusline")
let &l:statusline = g:gundo_tree_statusline
endif
endfunction"}}}
function! s:GundoOpenPreview()"{{{
let existing_preview_buffer = bufnr("__Gundo_Preview__")
if existing_preview_buffer == -1
if g:gundo_preview_bottom
exe "botright new __Gundo_Preview__"
else
if g:gundo_right
exe "botright vnew __Gundo_Preview__"
else
exe "topleft vnew __Gundo_Preview__"
endif
endif
else
let existing_preview_window = bufwinnr(existing_preview_buffer)
if existing_preview_window != -1
if winnr() != existing_preview_window
exe existing_preview_window . "wincmd w"
endif
else
if g:gundo_preview_bottom
exe "botright split +buffer" . existing_preview_buffer
else
if g:gundo_right
exe "botright vsplit +buffer" . existing_preview_buffer
else
exe "topleft vsplit +buffer" . existing_preview_buffer
endif
endif
endif
endif
if exists("g:gundo_preview_statusline")
let &l:statusline = g:gundo_preview_statusline
endif
endfunction"}}}
function! s:GundoClose()"{{{
if s:GundoGoToWindowForBufferName('__Gundo__')
quit
endif
if s:GundoGoToWindowForBufferName('__Gundo_Preview__')
quit
endif
exe bufwinnr(g:gundo_target_n) . "wincmd w"
endfunction"}}}
function! s:GundoOpen()"{{{
if !exists('g:gundo_py_loaded')
if s:has_supported_python == 2 && g:gundo_prefer_python3
exe 'py3file ' . s:plugin_path . '/gundo.py'
python3 initPythonModule()
else
exe 'pyfile ' . s:plugin_path . '/gundo.py'
python initPythonModule()
endif
if !s:has_supported_python
function! s:GundoDidNotLoad()
echohl WarningMsg|echomsg "Gundo unavailable: requires Vim 7.3+"|echohl None
endfunction
command! -nargs=0 GundoToggle call s:GundoDidNotLoad()
call s:GundoDidNotLoad()
return
endif"
let g:gundo_py_loaded = 1
endif
" Save `splitbelow` value and set it to default to avoid problems with
" positioning new windows.
let saved_splitbelow = &splitbelow
let &splitbelow = 0
call s:GundoOpenPreview()
exe bufwinnr(g:gundo_target_n) . "wincmd w"
call s:GundoRenderGraph()
call s:GundoRenderPreview()
" Restore `splitbelow` value.
let &splitbelow = saved_splitbelow
endfunction"}}}
function! s:GundoToggle()"{{{
if s:GundoIsVisible()
call s:GundoClose()
else
let g:gundo_target_n = bufnr('')
let g:gundo_target_f = @%
call s:GundoOpen()
endif
endfunction"}}}
function! s:GundoShow()"{{{
if !s:GundoIsVisible()
let g:gundo_target_n = bufnr('')
let g:gundo_target_f = @%
call s:GundoOpen()
endif
endfunction"}}}
function! s:GundoHide()"{{{
if s:GundoIsVisible()
call s:GundoClose()
endif
endfunction"}}}
"}}}
"{{{ Gundo mouse handling
function! s:GundoMouseDoubleClick()"{{{
let start_line = getline('.')
if stridx(start_line, '[') == -1
return
else
call s:GundoRevert()
endif
endfunction"}}}
"}}}
"{{{ Gundo movement
function! s:GundoMove(direction) range"{{{
let start_line = getline('.')
if v:count1 == 0
let move_count = 1
else
let move_count = v:count1
endif
let distance = 2 * move_count
" If we're in between two nodes we move by one less to get back on track.
if stridx(start_line, '[') == -1
let distance = distance - 1
endif
let target_n = line('.') + (distance * a:direction)
" Bound the movement to the graph.
if target_n <= s:GundoInlineHelpLength() - 1
call cursor(s:GundoInlineHelpLength(), 0)
else
call cursor(target_n, 0)
endif
let line = getline('.')
" Move to the node, whether it's an @ or an o
let idx1 = stridx(line, '@')
let idx2 = stridx(line, 'o')
if idx1 != -1
call cursor(0, idx1 + 1)
else
call cursor(0, idx2 + 1)
endif
if g:gundo_auto_preview == 1
call s:GundoRenderPreview()
endif
endfunction"}}}
"}}}
"{{{ Gundo rendering
function! s:GundoRenderGraph()"{{{
if s:has_supported_python == 2 && g:gundo_prefer_python3
python3 GundoRenderGraph()
else
python GundoRenderGraph()
endif
endfunction"}}}
function! s:GundoRenderPreview()"{{{
if s:has_supported_python == 2 && g:gundo_prefer_python3
python3 GundoRenderPreview()
else
python GundoRenderPreview()
endif
endfunction"}}}
function! s:GundoRenderChangePreview()"{{{
if s:has_supported_python == 2 && g:gundo_prefer_python3
python3 GundoRenderChangePreview()
else
python GundoRenderChangePreview()
endif
endfunction"}}}
"}}}
"{{{ Gundo undo/redo
function! s:GundoRevert()"{{{
if s:has_supported_python == 2 && g:gundo_prefer_python3
python3 GundoRevert()
else
python GundoRevert()
endif
endfunction"}}}
function! s:GundoPlayTo()"{{{
if s:has_supported_python == 2 && g:gundo_prefer_python3
python3 GundoPlayTo()
else
python GundoPlayTo()
endif
endfunction"}}}
"}}}
"{{{ Misc
function! gundo#GundoToggle()"{{{
call s:GundoToggle()
endfunction"}}}
function! gundo#GundoShow()"{{{
call s:GundoShow()
endfunction"}}}
function! gundo#GundoHide()"{{{
call s:GundoHide()
endfunction"}}}
function! gundo#GundoRenderGraph()"{{{
call s:GundoRenderGraph()
endfunction"}}}
augroup GundoAug
autocmd!
autocmd BufNewFile __Gundo__ call s:GundoSettingsGraph()
autocmd BufNewFile __Gundo_Preview__ call s:GundoSettingsPreview()
augroup END
"}}}

283
bundle/gundo/doc/gundo.txt Executable file
View File

@ -0,0 +1,283 @@
*gundo.txt* Graph your undo tree so you can actually USE it.
Making Vim's undo tree usable by humans.
==============================================================================
CONTENTS *Gundo-contents*
1. Intro ........................... |GundoIntro|
2. Usage ........................... |GundoUsage|
3. Configuration ................... |GundoConfig|
3.1 gundo_width ............... |gundo_width|
3.2 gundo_preview_height ...... |gundo_preview_height|
3.3 gundo_preview_bottom ...... |gundo_preview_bottom|
3.4 gundo_right ............... |gundo_right|
3.5 gundo_help ................ |gundo_help|
3.6 gundo_disable ............. |gundo_disable|
3.7 gundo_map_move_older ...... |gundo_map_move_older|
gundo_map_move_newer ...... |gundo_map_move_newer|
3.8 gundo_close_on_revert ..... |gundo_close_on_revert|
3.9 gundo_preview_statusline .. |gundo_preview_statusline|
gundo_tree_statusline ..... |gundo_tree_statusline|
3.10 gundo_auto_preview ........ |gundo_auto_preview|
4. License ......................... |GundoLicense|
5. Bugs ............................ |GundoBugs|
6. Contributing .................... |GundoContributing|
7. Changelog ....................... |GundoChangelog|
8. Credits ......................... |GundoCredits|
==============================================================================
1. Intro *GundoIntro*
You know that Vim lets you undo changes like any text editor. What you might
not know is that it doesn't just keep a list of your changes -- it keeps
a goddamed |:undo-tree| of them.
Say you make a change (call it X), undo that change, and then make another
change (call it Y). With most editors, change X is now gone forever. With Vim
you can get it back.
The problem is that trying to do this in the real world is painful. Vim gives
you an |:undolist| command that shows you the leaves of the tree. Good luck
finding the change you want in that list.
Gundo is a plugin to make browsing this ridiculously powerful undo tree less
painful.
==============================================================================
2. Usage *GundoUsage*
We'll get to the technical details later, but if you're a human the first
thing you need to do is add a mapping to your |:vimrc| to toggle the undo
graph: >
nnoremap <F5> :GundoToggle<CR>
Change the mapped key to suit your taste. We'll stick with F5 because that's
what the author uses.
Now you can press F5 to toggle the undo graph and preview pane, which will
look something like this: >
Undo graph File
+-----------------------------------+------------------------------------+
| " Gundo for something.txt [1] |one |
| " j/k - move between undo states |two |
| " <cr> - revert to that state |three |
| |five |
| @ [5] 3 hours ago | |
| | | |
| | o [4] 4 hours ago | |
| | | | |
| o | [3] 4 hours ago | |
| | | | |
| o | [2] 4 hours ago | |
| |/ | |
| o [1] 4 hours ago | |
| | | |
| o [0] Original | |
+-----------------------------------+ |
| --- 3 2010-10-12 06:27:35 PM | |
| +++ 5 2010-10-12 07:38:37 PM | |
| @@ -1,3 +1,4 | |
| one | |
| two | |
| three | |
| +five | |
+-----------------------------------+------------------------------------+
Preview pane
Your current position in the undo tree is marked with an '@' character. Other
nodes are marked with an 'o' character.
When you toggle open the graph Gundo will put your cursor on your current
position in the tree. You can move up and down the graph with the j and
k keys.
You can move to the top of the graph (the newest state) with gg and to the
bottom of the graph (the oldest state) with G.
As you move between undo states the preview pane will show you a unified diff
of the change that state made.
Pressing enter on a state (or double clicking on it) will revert the contents
of the file to match that state.
You can use p on a state to make the preview window show the diff between
your current state and the selected state, instead of a preview of what the
selected state changed.
Pressing P while on a state will initiate "play to" mode targeted at that
state. This will replay all the changes between your current state and the
target, with a slight pause after each change. It's mostly useless, but can be
fun to watch and see where your editing lags -- that might be a good place to
define a new mapping to speed up your editing.
Pressing q while in the undo graph will close it. You can also just press your
toggle mapping key.
==============================================================================
3. Configuration *GundoConfig*
You can tweak the behavior of Gundo by setting a few variables in your :vimrc
file. For example: >
let g:gundo_width = 60
let g:gundo_preview_height = 40
let g:gundo_right = 1
------------------------------------------------------------------------------
3.1 g:gundo_width *gundo_width*
Set the horizontal width of the Gundo graph (and preview).
Default: 45
------------------------------------------------------------------------------
3.2 g:gundo_preview_height *gundo_preview_height*
Set the vertical height of the Gundo preview.
Default: 15
------------------------------------------------------------------------------
3.3 g:gundo_preview_bottom *gundo_preview_bottom*
Force the preview window below current windows instead of below the graph.
This gives the preview window more space to show the unified diff.
Example:
+--------+ +--------+
!g! ! ! !g!
!g! ! or ! !g!
!g!______! !______!g!
!g!pppppp! !pppppp!g!
+--------+ +--------+
Default: 0
------------------------------------------------------------------------------
3.4 g:gundo_right *gundo_right*
Set this to 1 to make the Gundo graph (and preview) open on the right side
instead of the left.
Default: 0 (off, open on the left side)
------------------------------------------------------------------------------
3.5 g:gundo_help *gundo_help*
Set this to 0 to disable the help text in the Gundo graph window.
Default: 1 (show the help)
------------------------------------------------------------------------------
3.6 g:gundo_disable *gundo_disable*
Set this to 1 to disable Gundo entirely.
Useful if you use the same ~/.vim folder on multiple machines, and some of
them may not have Python support.
Default: 0 (Gundo is enabled as usual)
------------------------------------------------------------------------------
3.7 g:gundo_map_move_older, g:gundo_map_move_newer *gundo_map_move_older*
*gundo_map_move_newer*
These options let you change the keys that navigate the undo graph. This is
useful if you use a Dvorak keyboard and have changed your movement keys.
Default: gundo_map_move_older = "j"
gundo_map_move_newer = "k"
------------------------------------------------------------------------------
3.8 g:gundo_close_on_revert *gundo_close_on_revert*
Set this to 1 to automatically close the Gundo windows when reverting.
Default: 0 (windows do not automatically close)
------------------------------------------------------------------------------
3.9 g:gundo_preview_statusline *gundo_preview_statusline*
g:gundo_tree_statusline *gundo_tree_statusline*
Set these to a string to display it as the status line for each Gundo window.
Default: unset (windows use the default statusline)
------------------------------------------------------------------------------
3.10 g:gundo_auto_preview *gundo_auto_preview*
Set this to 0 to disable automatically rendering preview diffs as you move
through the undo tree (you can still render a specific diff with r). This can
be useful on large files and undo trees to speed up Gundo.
Default: 1 (automatically preview diffs)
==============================================================================
4. License *GundoLicense*
GPLv2+. Look it up.
==============================================================================
5. Bugs *GundoBugs*
If you find a bug please post it on the issue tracker:
http://bitbucket.org/sjl/gundo.vim/issues?status=new&status=open
==============================================================================
6. Contributing *GundoContributing*
Think you can make this plugin better? Awesome. Fork it on BitBucket or GitHub
and send a pull request.
BitBucket: http://bitbucket.org/sjl/gundo.vim/
GitHub: http://github.com/sjl/gundo.vim/
==============================================================================
7. Changelog *GundoChangelog*
v2.4.0
* Add auto preview option.
* Add 'r' mapping to preview current state.
* Add public gundo#GundoShow() and gundo#GundoHide() functions.
v2.3.0
* Add statusline configuration.
v2.2.2
* More performance improvements.
v2.2.1
* Refactoring and performance improvements.
v2.2.0
* Add the g:gundo_close_on_revert setting.
* Fix a bug with the splitbelow setting.
v2.1.1
* Fix a bug with the movement key mappings.
v2.1.0
* Warnings about having an incompatible Vim and/or Python installation
are now deferred until the first time you try to use Gundo, instead
of being displayed on launch.
* The <j> and <k> mappings are now configurable with
g:gundo_map_move_older and g:gundo_map_move_newer.
* The o, <Up> and <Down> keys are now mapped in the Gundo pane.
* Improve and add several unit tests for Gundo.
v2.0.0
* Make GundoToggle close the Gundo windows if they're visible but not the
current window, instead of moving to them.
* Add the g:gundo_help setting.
* Add the g:gundo_disable setting.
* Add the 'p' mapping to preview the result of reverting to the selected
state.
* Fix movement commands with counts in the graph.
v1.0.0
* Initial stable release.
==============================================================================
8. Credits *GundoCredits*
The graphing code was all taken from Mercurial, hence the GPLv2+ license.
The plugin was heavily inspired by histwin.vim, and the code for scratch.vim
helped the author get started.
==============================================================================

22
bundle/gundo/doc/tags Normal file
View File

@ -0,0 +1,22 @@
Gundo-contents gundo.txt /*Gundo-contents*
GundoBugs gundo.txt /*GundoBugs*
GundoChangelog gundo.txt /*GundoChangelog*
GundoConfig gundo.txt /*GundoConfig*
GundoContributing gundo.txt /*GundoContributing*
GundoCredits gundo.txt /*GundoCredits*
GundoIntro gundo.txt /*GundoIntro*
GundoLicense gundo.txt /*GundoLicense*
GundoUsage gundo.txt /*GundoUsage*
gundo.txt gundo.txt /*gundo.txt*
gundo_auto_preview gundo.txt /*gundo_auto_preview*
gundo_close_on_revert gundo.txt /*gundo_close_on_revert*
gundo_disable gundo.txt /*gundo_disable*
gundo_help gundo.txt /*gundo_help*
gundo_map_move_newer gundo.txt /*gundo_map_move_newer*
gundo_map_move_older gundo.txt /*gundo_map_move_older*
gundo_preview_bottom gundo.txt /*gundo_preview_bottom*
gundo_preview_height gundo.txt /*gundo_preview_height*
gundo_preview_statusline gundo.txt /*gundo_preview_statusline*
gundo_right gundo.txt /*gundo_right*
gundo_tree_statusline gundo.txt /*gundo_tree_statusline*
gundo_width gundo.txt /*gundo_width*

24
bundle/gundo/plugin/gundo.vim Executable file
View File

@ -0,0 +1,24 @@
" ============================================================================
" File: gundo.vim
" Description: vim global plugin to visualize your undo tree
" Maintainer: Steve Losh <steve@stevelosh.com>
" License: GPLv2+ -- look it up.
" Notes: Much of this code was thiefed from Mercurial, and the rest was
" heavily inspired by scratch.vim and histwin.vim.
"
" ============================================================================
"{{{ Init
if !exists('g:gundo_debug') && (exists('g:gundo_disable') || exists('loaded_gundo') || &cp)"{{{
finish
endif
let loaded_gundo = 1"}}}
"}}}
"{{{ Misc
command! -nargs=0 GundoToggle call gundo#GundoToggle()
command! -nargs=0 GundoShow call gundo#GundoShow()
command! -nargs=0 GundoHide call gundo#GundoHide()
command! -nargs=0 GundoRenderGraph call gundo#GundoRenderGraph()
"}}}

View File

@ -0,0 +1,226 @@
"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
" Script File: mimicpak.vim
" Last Change: 2009-10-17 [21:23:56]
" Version: 115
" License: Public Domain, Free / Frei / Gratis / Libre.
" Author: Jaime Wottrich, <jaime.wottrich@gmail.com>
" Description: Defines the menu entries for the "MimicPak" colorschemes.
" Creates a submenu "MimicPak" under the "Themes" menu,
" which is also used by the Robert Melton's ColorSamplerPack.
"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
" Setup {{{1
"~~~~~~~
if exists("g:loaded_mimicpak") || !has("menu") || version < 600
finish
endif
let g:loaded_mimicpak = 115
" need the "<>", so store & reset compatible options
let s:saved_cpo = &cpo
set cpo&vim
" Script Functions {{{1
"~~~~~~~~~~~~~~~~~~
" Function: s:MakeMenu(name, cmd, ...) {{{2
" Creates a menu for all modes and with an optional tooltip.
" Parameters:
" name--the menu name as displayed on screen, can also contain submenus.
" Spaces are escaped.
" cmd--the command that this menu executes. Doesn't need the starting ":"
" and the ending "<CR>".
" a:1--the tooltip for this menu (is only set for X11 & Win32 GUI).
" Example:
" call s:MakeMenu( "Menu.-separator-", "")
" call s:MakeMenu( "Menu.Sub&Menu.What's up doc" ,
" \ "echo 'Whats up doc'",
" \ "Greets you..." )
"
function! s:MakeMenu(name, cmd, ...)
let name = escape(a:name, "\ ")
execute "amenu " . name . " :" . a:cmd . "<CR>"
if 0 < a:0 && (has("x11") || has("gui_win32"))
execute "tmenu " . name . " " . a:1
endif
endfunction "}}}2
"}}}1
" Create the menus {{{1
"~~~~~~~~~~~~~~~~~~
" font style selection menu {{{2
call s:MakeMenu("T&hemes.&MimicPak.Choose &Font style.&None<Tab>(default)",
\ "unlet! g:mimic_font_style",
\ "MimicPak colorschemes won't use bold nor italic fonts." )
call s:MakeMenu("T&hemes.&MimicPak.Choose &Font style.Use &Bolds",
\ "let g:mimic_font_style=1",
\ "MimicPak colorschemes will use bold fonts.")
call s:MakeMenu("T&hemes.&MimicPak.Choose &Font style.Use &Italics",
\ "let g:mimic_font_style=2",
\ "MimicPak colorschemes will use italic fonts.")
call s:MakeMenu("T&hemes.&MimicPak.Choose &Font style.Use Bolds &and Italics",
\ "let g:mimic_font_style=3",
\ "MimicPak colorschemes will use italic and bold fonts.")
" colorize GUI? menu {{{2
if has("gui_running") && !(has("gui_win32") || has("gui_win32s"))
call s:MakeMenu("T&hemes.&MimicPak.&Colorize GUI?.&Yes",
\ "let g:mimic_colorize_gui=1",
\ "MimicPak colorschemes will set colors for Toolbar, Scrollbar, Menu.")
call s:MakeMenu("T&hemes.&MimicPak.&Colorize GUI?.&No<TAB>(default)",
\ "unlet! g:mimic_colorize_gui",
\ "MimicPak colorschemes will NOT set colors for Toolbar, Scrollbar, Menu.")
endif
" black/almost-black schemes {{{2
call s:MakeMenu("T&hemes.&MimicPak.-spMMPblack-", "")
" Astroboy, the clone of astronaut.vim {{{3
" grey20 and black
call s:MakeMenu("T&hemes.&MimicPak.&Astroboy.bgcolor == &grey20 [almost black]<TAB>(default)",
\ "unlet! g:mimic_astroboy_dark g:mimic_astroboy_alt<BAR>color astroboy",
\ "astroboy.vim: astronaut.vim clone (see ':h astroboy.vim')")
call s:MakeMenu("T&hemes.&MimicPak.&Astroboy.bgcolor == &black",
\ "unlet! g:mimic_astroboy_alt<BAR>let g:mimic_astroboy_dark=1<BAR>color astroboy",
\ "astroboy.vim: astronaut.vim clone (see ':h astroboy.vim')")
" blue and darkblue backgrounds
call s:MakeMenu("T&hemes.&MimicPak.&Astroboy.bgcolor == b&lue",
\ "unlet! g:mimic_astroboy_dark<BAR>let g:mimic_astroboy_alt=1<BAR>color astroboy",
\ "astroboy.vim: astronaut.vim clone (see ':h astroboy.vim')")
call s:MakeMenu("T&hemes.&MimicPak.&Astroboy.bgcolor == &darkblue",
\ "let g:mimic_astroboy_alt=1<BAR>let g:mimic_astroboy_dark=1<BAR>color astroboy",
\ "astroboy.vim: astronaut.vim clone (see ':h astroboy.vim')")
" help
call s:MakeMenu("T&hemes.&MimicPak.&Astroboy.-spMMPAstroboy000-", "")
call s:MakeMenu("T&hemes.&MimicPak.&Astroboy.&Help<tab>:h astroboy",
\ "help astroboy.vim",
\ "Shows the help for the AstroBoy colorscheme.")
" }}}3
" Big Bang, (Feuer Frei! Bang! Bang!) {{{3
" grey20 and black
call s:MakeMenu("T&hemes.&MimicPak.&Big Bang.bgcolor == &grey20 [almost black]<TAB>(default)",
\ "unlet! g:mimic_bigbang_dark g:mimic_bigbang_alt<BAR>color bigbang",
\ "bigbang.vim: experimental colorscheme (see ':h bigbang.vim')")
call s:MakeMenu("T&hemes.&MimicPak.&Big Bang.bgcolor == &black",
\ "unlet! g:mimic_bigbang_alt<BAR>let g:mimic_bigbang_dark=1<BAR>color bigbang",
\ "bigbang.vim: experimental colorscheme (see ':h bigbang.vim')")
" blue and darkblue backgrounds
call s:MakeMenu("T&hemes.&MimicPak.&Big Bang.bgcolor == b&lue",
\ "unlet! g:mimic_bigbang_dark<BAR>let g:mimic_bigbang_alt=1<BAR>color bigbang",
\ "bigbang.vim: experimental colorscheme (see ':h bigbang.vim')")
call s:MakeMenu("T&hemes.&MimicPak.&Big Bang.bgcolor == &darkblue",
\ "let g:mimic_bigbang_alt=1<BAR>let g:mimic_bigbang_dark=1<BAR>color bigbang",
\ "bigbang.vim: experimental colorscheme (see ':h bigbang.vim')")
" help
call s:MakeMenu("T&hemes.&MimicPak.&Big Bang.-spMMPBigBan000-", "")
call s:MakeMenu("T&hemes.&MimicPak.&Big Bang.&Help<tab>:h bigbang",
\ "help bigbang.vim",
\ "How did everything begin? Shows help for Big Bang colorscheme.")
" }}}3
" Dejavu... could have been called DNB, but it's called Dejavu {{{3
" for dark backgrounds, defaults
call s:MakeMenu("T&hemes.&MimicPak.&Deja Vu.for Dark bg (bgcolor == &grey20 [almost black])",
\ "unlet! g:mimic_dejavu_dark g:mimic_dejavu_alt<BAR>set bg=dark<BAR>color dejavu",
\ "dejavu.vim: scheme with nice options (see ':h dejavu.vim' to know them)")
call s:MakeMenu("T&hemes.&MimicPak.&Deja Vu.for Dark bg (bgcolor == &black) ",
\ "unlet! g:mimic_dejavu_alt<BAR>let g:mimic_dejavu_dark=1<BAR>set bg=dark<BAR>color dejavu",
\ "dejavu.vim: scheme with nice options (see ':h dejavu.vim' to know them)")
" for dark backgrounds, blue background
call s:MakeMenu("T&hemes.&MimicPak.&Deja Vu.for Dark bg (bgcolor == b&lue)",
\ "unlet! g:mimic_dejavu_dark<BAR>let g:mimic_dejavu_alt=1<BAR>set bg=dark<BAR>color dejavu",
\ "dejavu.vim: scheme with nice options (see ':h dejavu.vim' to know them)")
call s:MakeMenu("T&hemes.&MimicPak.&Deja Vu.for Dark bg (bgcolor == &darkblue) ",
\ "let g:mimic_dejavu_alt=1<BAR>let g:mimic_dejavu_dark=1<BAR>set bg=dark<BAR>color dejavu",
\ "dejavu.vim: scheme with nice options (see ':h dejavu.vim' to know them)")
" for light backgrounds
call s:MakeMenu("T&hemes.&MimicPak.&Deja Vu.-spMMPDejaVu001-", "")
call s:MakeMenu("T&hemes.&MimicPak.&Deja Vu.for Light bg (bgcolor == &white)",
\ "unlet! g:mimic_dejavu_dark<BAR>set bg=light<BAR>color dejavu",
\ "dejavu.vim: scheme with nice options (see ':h dejavu.vim' to know them)")
call s:MakeMenu("T&hemes.&MimicPak.&Deja Vu.for Light bg (bgcolor == &lightgray)",
\ "let g:mimic_dejavu_dark=1<BAR>set bg=light<BAR>color dejavu",
\ "dejavu.vim: scheme with nice options (see ':h dejavu.vim' to know them)")
" help
call s:MakeMenu("T&hemes.&MimicPak.&Deja Vu.-spMMPDejaVu002-", "")
call s:MakeMenu("T&hemes.&MimicPak.&Deja Vu.&Help<tab>:h dejavu",
\ "help dejavu.vim",
\ "Shows the help for the dejavu colorscheme.")
"}}}3
" peaksea (aka "ps_color") clone
call s:MakeMenu("T&hemes.&MimicPak.&PS Clone",
\ "color psclone",
\ "psclone.vim: scheme cloned from peaksea (ps_color) but with smoother colors")
" strange thingy
call s:MakeMenu("T&hemes.&MimicPak.&Zen DNB",
\ "color zendnb",
\ "zendnb.vim: a dark colorscheme for VIM/GVIM (try it with Italic fonts)")
" blue/purple schemes {{{2
call s:MakeMenu("T&hemes.&MimicPak.-spMMPblue-", "")
call s:MakeMenu("T&hemes.&MimicPak.Deep &Blue",
\ "color deepblue",
\ "deepblue.vim: colors for people who love Dark Blue backgrounds.")
call s:MakeMenu("T&hemes.&MimicPak.&MAsmEd's originals.bgcolor == dark &purple<TAB>(default)",
\ "unlet! g:mimic_masmed_alt<BAR>color masmed",
\ "masmed.vim: the original defaults from the cool MAsmEd (IDE for MASM, windoze)")
call s:MakeMenu("T&hemes.&MimicPak.&MAsmEd's originals.bgcolor == &grey20 (almost black)",
\ "let g:mimic_masmed_alt=1<BAR>color masmed",
\ "masmed.vim: MAsmEd's defaults on a Grey20 bg.")
" green/cyan schemes {{{2
call s:MakeMenu("T&hemes.&MimicPak.-spMMPgreen-", "")
call s:MakeMenu("T&hemes.&MimicPak.&Anokha.bgcolor == dark &teal<TAB>(default)",
\ "unlet! g:mimic_anokha_alt<BAR>color anokha",
\ "anokha.vim: colors from the lisp editor J, uses a Dark Teal bg")
call s:MakeMenu("T&hemes.&MimicPak.&Anokha.bgcolor == dark &green",
\ "let g:mimic_anokha_alt=1<BAR>color anokha",
\ "anokha.vim: colors from the lisp editor J, uses a Dark Green bg")
call s:MakeMenu("T&hemes.&MimicPak.Parado&x.bgcolor == dark &teal<TAB>(default)",
\ "unlet! g:mimic_paradox_alt<BAR>color paradox",
\ "paradox.vim: colors from MAsmEd. Looks like old Emacs (try Italics fonts)")
call s:MakeMenu("T&hemes.&MimicPak.Parado&x.bgcolor == &grey20 (almost black)",
\ "let g:mimic_paradox_alt=1<BAR>color paradox",
\ "paradox.vim: colors from MAsmEd on an almost black bg.")
" white/lightgray schemes {{{2
call s:MakeMenu("T&hemes.&MimicPak.-spMMPlight-", "")
call s:MakeMenu("T&hemes.&MimicPak.&Grey House",
\ "color greyhouse",
\ "greyhouse.vim: a scheme from MAsmEd, uses a Gray bg (try it with Bold fonts)")
call s:MakeMenu("T&hemes.&MimicPak.&Gaea",
\ "color gaea",
\ "gaea.vim: natural colors (try it with Bold+Italics)")
call s:MakeMenu("T&hemes.&MimicPak.Imperia&l",
\ "color imperial",
\ "imperial.vim: royal colors for GVIM (try it with Bold+Italics)")
call s:MakeMenu("T&hemes.&MimicPak.&IntelliJ",
\ "color intellij",
\ "intellij.vim: default IntelliJIDEA's colors (try it with Bold+Italics)")
call s:MakeMenu("T&hemes.&MimicPak.Mickey$oft",
\ "color mickeysoft",
\ "mickeysoft.vim: yet another M$ scheme (try it with Bold+Italics fonts)")
call s:MakeMenu("T&hemes.&MimicPak.&Omen",
\ "color omen",
\ "omen.vim: simple red/black scheme (try it with Bold+Italics fonts)")
call s:MakeMenu("T&hemes.&MimicPak.&SCAME (EMACS)",
\ "color scame",
\ "scame.vim: EMACS' default colorscheme")
call s:MakeMenu("T&hemes.&MimicPak.&Vim Hut.for &Dark bg",
\ "set bg=dark<BAR>color vimhut",
\ "vimhut.vim: gVim default colors for dark backgrounds (try it with Italic fonts)")
call s:MakeMenu("T&hemes.&MimicPak.&Vim Hut.for &Light bg",
\ "set bg=light<BAR>color vimhut",
\ "vimhut.vim: gVim default colors, but with more Gray (try it with Bold fonts)")
" help {{{2
call s:MakeMenu("T&hemes.&MimicPak.-spMMPhelp-", "")
call s:MakeMenu("T&hemes.&MimicPak.&Help<tab>:h mimicpak",
\ "help mimicpak",
\ "Shows the MimicPak colorschemes' help.")
"}}}1
" Cleanup {{{1
"~~~~~~~~~
delfunction s:MakeMenu
" restore user settings
let &cpo = s:saved_cpo
unlet s:saved_cpo
" vim:et:sw=2:ts=2:tw=78:nowrap:
" vim600:fdc=2:fdm=marker:

View File

@ -0,0 +1,47 @@
" Vim plugin for putting crosshairs on cursor when on a paren
" Maintainer: Bryan Richter <at the googles>
" Last Change: 2012
" License: WTFPL
if exists("g:loaded_paren_crosshairs") || &cp || !exists("##CursorMoved")
finish
endif
let g:loaded_paren_crosshairs = 1
augroup TargetMatchpairs
au!
au WinEnter,CmdwinEnter,CursorMoved,CursorMovedI * call s:targetMatchpairs()
au WinLeave * call s:suspendTargeting()
augroup END
func! s:targetMatchpairs()
if !exists('w:targetAcquired')
let w:targetAcquired = 0
endif
" Global to buffer:
if !exists('b:matchPairs')
" '[:],{,},(,)' --> '[]{}()'
let b:matchPairs = substitute(&matchpairs, "[,:]", "", "g")
endif
let curChar = getline('.')[col('.') - 1]
let targetInReticule =
\len(curChar) > 0 && stridx(b:matchPairs, curChar) >= 0
if targetInReticule && !w:targetAcquired
let w:disengage = "set " . (&cuc ? "cuc" : "nocuc")
\. ' ' . (&cul ? "cul" : "nocul")
set cuc cul
let w:targetAcquired = 1
elseif !targetInReticule && w:targetAcquired
exec w:disengage
let w:targetAcquired = 0
endif
endfu
func! s:suspendTargeting()
if w:targetAcquired
exec w:disengage
let w:targetAcquired = 0
endif
endfu

View File

@ -0,0 +1,152 @@
" vim: set sw=4 sts=4 et ft=vim :
" Script: securemodelines.vim
" Author: Ciaran McCreesh <ciaran.mccreesh at googlemail.com>
" Homepage: http://github.com/ciaranm/securemodelines
" Requires: Vim 7
" License: Redistribute under the same terms as Vim itself
" Purpose: A secure alternative to modelines
if &compatible || v:version < 700 || exists('g:loaded_securemodelines')
finish
endif
let g:loaded_securemodelines = 1
if (! exists("g:secure_modelines_allowed_items"))
let g:secure_modelines_allowed_items = [
\ "textwidth", "tw",
\ "softtabstop", "sts",
\ "tabstop", "ts",
\ "shiftwidth", "sw",
\ "expandtab", "et", "noexpandtab", "noet",
\ "filetype", "ft",
\ "foldmethod", "fdm",
\ "readonly", "ro", "noreadonly", "noro",
\ "rightleft", "rl", "norightleft", "norl",
\ "cindent", "cin", "nocindent", "nocin",
\ "smartindent", "si", "nosmartindent", "nosi",
\ "autoindent", "ai", "noautoindent", "noai",
\ "spell",
\ "spelllang"
\ ]
endif
if (! exists("g:secure_modelines_verbose"))
let g:secure_modelines_verbose = 0
endif
if (! exists("g:secure_modelines_modelines"))
let g:secure_modelines_modelines=5
endif
if (! exists("g:secure_modelines_leave_modeline"))
if &modeline
set nomodeline
if g:secure_modelines_verbose
echohl WarningMsg
echo "Forcibly disabling internal modelines for securemodelines.vim"
echohl None
endif
endif
endif
fun! <SID>IsInList(list, i) abort
for l:item in a:list
if a:i == l:item
return 1
endif
endfor
return 0
endfun
fun! <SID>DoOne(item) abort
let l:matches = matchlist(a:item, '^\([a-z]\+\)\%([-+^]\?=[a-zA-Z0-9_\-.]\+\)\?$')
if len(l:matches) > 0
if <SID>IsInList(g:secure_modelines_allowed_items, l:matches[1])
exec "setlocal " . a:item
elseif g:secure_modelines_verbose
echohl WarningMsg
echo "Ignoring '" . a:item . "' in modeline"
echohl None
endif
endif
endfun
fun! <SID>DoNoSetModeline(line) abort
for l:item in split(a:line, '[ \t:]')
call <SID>DoOne(l:item)
endfor
endfun
fun! <SID>DoSetModeline(line) abort
for l:item in split(a:line)
call <SID>DoOne(l:item)
endfor
endfun
fun! <SID>CheckVersion(op, ver) abort
if a:op == "="
return v:version != a:ver
elseif a:op == "<"
return v:version < a:ver
elseif a:op == ">"
return v:version >= a:ver
else
return 0
endif
endfun
fun! <SID>DoModeline(line) abort
let l:matches = matchlist(a:line, '\%(\S\@<!\%(vi\|vim\([<>=]\?\)\([0-9]\+\)\?\)\|\sex\):\s*\%(set\s\+\)\?\([^:]\+\):\S\@!')
if len(l:matches) > 0
let l:operator = ">"
if len(l:matches[1]) > 0
let l:operator = l:matches[1]
endif
if len(l:matches[2]) > 0
if <SID>CheckVersion(l:operator, l:matches[2]) ? 0 : 1
return
endif
endif
return <SID>DoSetModeline(l:matches[3])
endif
let l:matches = matchlist(a:line, '\%(\S\@<!\%(vi\|vim\([<>=]\?\)\([0-9]\+\)\?\)\|\sex\):\(.\+\)')
if len(l:matches) > 0
let l:operator = ">"
if len(l:matches[1]) > 0
let l:operator = l:matches[1]
endif
if len(l:matches[2]) > 0
if <SID>CheckVersion(l:operator, l:matches[2]) ? 0 : 1
return
endif
endif
return <SID>DoNoSetModeline(l:matches[3])
endif
endfun
fun! <SID>DoModelines() abort
if line("$") > g:secure_modelines_modelines
let l:lines={ }
call map(filter(getline(1, g:secure_modelines_modelines) +
\ getline(line("$") - g:secure_modelines_modelines, "$"),
\ 'v:val =~ ":"'), 'extend(l:lines, { v:val : 0 } )')
for l:line in keys(l:lines)
call <SID>DoModeline(l:line)
endfor
else
for l:line in getline(1, "$")
call <SID>DoModeline(l:line)
endfor
endif
endfun
fun! SecureModelines_DoModelines() abort
call <SID>DoModelines()
endfun
aug SecureModeLines
au!
au BufRead,StdinReadPost * :call <SID>DoModelines()
aug END

1
bundle/xmledit Submodule

Submodule bundle/xmledit added at 1335d79a55