2018-10-23 commit, with vim-pathogen
This commit is contained in:
207
bundle/color_sample_pack/plugin/color_sample_pack.vim
Executable file
207
bundle/color_sample_pack/plugin/color_sample_pack.vim
Executable 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
34
bundle/gundo/README.markdown
Executable 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
577
bundle/gundo/autoload/gundo.py
Executable 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
469
bundle/gundo/autoload/gundo.vim
Executable 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
283
bundle/gundo/doc/gundo.txt
Executable 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
22
bundle/gundo/doc/tags
Normal 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
24
bundle/gundo/plugin/gundo.vim
Executable 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()
|
||||
"}}}
|
226
bundle/mimicpak/plugin/mimicpak.vim
Executable file
226
bundle/mimicpak/plugin/mimicpak.vim
Executable 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:
|
47
bundle/paren_crosshairs/plugin/paren_crosshairs.vim
Executable file
47
bundle/paren_crosshairs/plugin/paren_crosshairs.vim
Executable 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
|
152
bundle/securemodelines/plugin/securemodelines.vim
Executable file
152
bundle/securemodelines/plugin/securemodelines.vim
Executable 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
1
bundle/xmledit
Submodule
Submodule bundle/xmledit added at 1335d79a55
Reference in New Issue
Block a user