Commits

Alfredo Deza committed 4f85bad

oops stuff not commited

  • Participants
  • Parent commits 9d3ce61

Comments (0)

Files changed (7)

File .vim/bundle/gundo.vim/README.markdown

+<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.
+
+Current status: Beta. It might eat your data. Be careful.
+=========================================================
+
+Preview
+-------
+
+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>
+
+Screencast: [http://screenr.com/M9l](http://screenr.com/M9l)
+
+
+Requirements
+------------
+
+* Vim 7.3+
+* Python support for Vim
+* Python 2.4+
+
+Installation
+------------
+
+Use [Pathogen][]. Don't use pathogen? Start.
+
+Add a mapping to your `~/.vimrc` (change the key to suit your taste):
+
+    nnoremap <F5> :GundoToggle<CR>
+
+[Pathogen]: http://www.vim.org/scripts/script.php?script_id=2332
+
+Usage
+-----
+
+Run `:help gundo` for the full docs. Here's the in-a-nutshell version.
+
+When you're editing a file you can bring up the undo graph for that file with
+`<F5>` (or whatever key you mapped it to).
+
+Press `<F5>` again to close the undo graph and return to your file.
+
+Use `j` and `k` to move up and down the graph. The preview pane will update with
+a diff of the change made by the undo state you're currently on.
+
+Press return to revert the file's contents to that undo state and return to the
+file.

File .vim/bundle/gundo.vim/doc/gundo.txt

+*gundo.txt*   Graph your undo tree so you can actually USE it.
+
+
+                            CURRENT STATUS: BETA
+
+                           IT MIGHT EAT YOUR DATA
+
+      SERIOUSLY: IF YOU USE THIS PLUGIN, LOSE DATA AND COMPLAIN ABOUT IT
+                   I AM GOING TO MAKE FUN OF YOU ON TWITTER
+
+
+Making's 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.2 gundo_right ............... |gundo_right|
+    4. License ........................ |GundoLicense|
+    5. Bugs ........................... |GundoBugs|
+    6. Contributing ................... |GundoContributing|
+    7. 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.
+
+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_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)
+
+==============================================================================
+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. 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.
+
+==============================================================================

File .vim/bundle/gundo.vim/plugin/gundo.vim

+" ============================================================================
+" 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('loaded_gundo') || &cp)"{{{
+    finish
+endif
+let loaded_gundo = 1"}}}
+
+if v:version < '703'"{{{
+    echo  "Gundo requires Vim 7.3+"
+    finish
+endif"}}}
+
+if has('python')"{{{
+    let s:has_supported_python = 1
+
+python << ENDPYTHON
+import sys
+import vim
+if sys.version_info[:2] < (2, 4):
+    vim.command('let s:has_supported_python = 0')
+ENDPYTHON
+
+    " Python version is too old
+    if !s:has_supported_python
+        echo  "Gundo requires that Vim be compiled with Python 2.4+"
+        finish
+    endif
+else
+    " no Python support
+    echo  "Gundo requires that Vim be compiled with Python 2.4+"
+    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_right')"{{{
+    let g:gundo_right = 0
+endif"}}}
+
+"}}}
+
+"{{{ Mercurial's graphlog code
+python << ENDPYTHON
+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 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):
+
+      - buffer to write to
+      - 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 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
+ENDPYTHON
+"}}}
+
+"{{{ Mercurial age function
+python << ENDPYTHON
+import time
+
+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)
+ENDPYTHON
+"}}}
+
+"{{{ Python Vim utility functions
+python << ENDPYTHON
+import vim
+
+normal = lambda s: vim.command('normal %s' % s)
+
+def _goto_window_for_buffer(b):
+    w = vim.eval('bufwinnr(%d)' % int(b))
+    vim.command('%dwincmd w' % int(w))
+
+def _goto_window_for_buffer_name(bn):
+    b = vim.eval('bufnr("%s")' % bn)
+    _goto_window_for_buffer(b)
+
+def _undo_to(n):
+    n = int(n)
+    if n == 0:
+        vim.command('silent earlier 999999999d')
+    else:
+        vim.command('silent undo %d' % n)
+
+
+INLINE_HELP = '''\
+" Gundo for %s [%d]
+" j/k  - move between undo states
+" <cr> - revert to that state
+
+'''
+ENDPYTHON
+"}}}
+
+"{{{ Python undo tree data structures and functions
+python << ENDPYTHON
+import itertools
+
+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):
+    # TODO: This seems to sometimes be wrong right after you open a file...
+    _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
+ENDPYTHON
+"}}}
+
+"{{{ Gundo buffer settings
+
+function! s:GundoMapGraph()"{{{
+    nnoremap <script> <silent> <buffer> <CR>          :call <sid>GundoRevert()<CR>
+    nnoremap <script> <silent> <buffer> j             :call <sid>GundoMove(1)<CR>
+    nnoremap <script> <silent> <buffer> k             :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> 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
+    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"}}}
+
+"}}}
+
+"{{{ Buffer/window management
+
+function! s:GundoResizeBuffers(backto)"{{{
+    exe bufwinnr(bufnr('__Gundo__')) . "wincmd w"
+    exe "vertical resize " . g:gundo_width
+
+    exe bufwinnr(bufnr('__Gundo_Preview__')) . "wincmd w"
+    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
+        exe bufwinnr(bufnr('__Gundo_Preview__')) . "wincmd w"
+        exe "new __Gundo__"
+        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
+            exe bufwinnr(bufnr('__Gundo_Preview__')) . "wincmd w"
+            exe "split +buffer" . existing_gundo_buffer
+            call s:GundoResizeBuffers(winnr())
+        endif
+    endif
+endfunction"}}}
+
+function! s:GundoOpenPreview()"{{{
+    let existing_preview_buffer = bufnr("__Gundo_Preview__")
+
+    if existing_preview_buffer == -1
+        exe "vnew __Gundo_Preview__"
+
+        if g:gundo_right
+            wincmd L
+        else
+            wincmd H
+        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
+            exe "vsplit +buffer" . existing_preview_buffer
+
+            if g:gundo_right
+                wincmd L
+            else
+                wincmd H
+            endif
+        endif
+    endif
+endfunction"}}}
+
+function! s:GundoClose()"{{{
+        if bufwinnr(bufnr('__Gundo__')) != -1
+            exe bufwinnr(bufnr('__Gundo__')) . "wincmd w"
+            quit
+        endif
+
+        if bufwinnr(bufnr('__Gundo_Preview__')) != -1
+            exe bufwinnr(bufnr('__Gundo_Preview__')) . "wincmd w"
+            quit
+        endif
+
+        exe bufwinnr(g:gundo_target_n) . "wincmd w"
+endfunction"}}}
+
+function! s:GundoToggle()"{{{
+    if expand('%') == "__Gundo__"
+        call s:GundoClose()
+    else
+        if expand('%') != "__Gundo_Preview__"
+            " Record the previous buffer number.
+            "
+            " This sucks because we're not getting the window number, and there
+            " may be more than one window viewing the same buffer, so we might
+            " go back to the wrong one.
+            "
+            " Unfortunately window numbers change as we open more windows.
+            "
+            " TODO: Figure out how to fix this.
+            let g:gundo_target_n = bufnr('')
+            let g:gundo_target_f = @%
+        endif
+
+        call s:GundoOpenPreview()
+        exe bufwinnr(g:gundo_target_n) . "wincmd w"
+        GundoRender
+
+        " TODO: Move these lines into RenderPreview
+        let target_line = matchstr(getline("."), '\v\[[0-9]+\]')
+        let target_num = matchstr(target_line, '\v[0-9]+')
+        call s:GundoRenderPreview(target_num)
+    endif
+endfunction"}}}
+
+"}}}
+
+"{{{ Mouse handling
+
+function! s:GundoMouseDoubleClick()"{{{
+    let start_line = getline('.')
+
+    if stridx(start_line, '[') == -1
+        return
+    else
+        call s:GundoRevert()
+    endif
+endfunction"}}}
+ 
+"}}}
+
+"{{{ Movement
+
+function! s:GundoMove(direction)"{{{
+    let start_line = getline('.')
+
+    " If we're in between two nodes we move by one to get back on track.
+    if stridx(start_line, '[') == -1
+        let distance = 1
+    else
+        let distance = 2
+    endif
+
+    let target_n = line('.') + (distance * a:direction)
+
+    " Bound the movement to the graph.
+    if target_n <= 4
+        call cursor(5, 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
+
+    let target_line = matchstr(getline("."), '\v\[[0-9]+\]')
+    let target_num = matchstr(target_line, '\v[0-9]+')
+    call s:GundoRenderPreview(target_num)
+endfunction"}}}
+
+"}}}
+
+"{{{ Rendering
+
+function! s:GundoRenderGraph()"{{{
+python << ENDPYTHON
+def GundoRenderGraph():
+    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')))
+    header = (INLINE_HELP % target).splitlines()
+
+    vim.command('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))
+
+GundoRenderGraph()
+ENDPYTHON
+endfunction"}}}
+
+function! s:GundoRenderPreview(target)"{{{
+python << ENDPYTHON
+import difflib
+
+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 GundoRenderPreview():
+    target_n = vim.eval('a:target')
+
+    # Check that there's an undo state. There may not be if we're talking about
+    # a buffer with no changes yet.
+    if target_n == None:
+        _goto_window_for_buffer_name('__Gundo__')
+        return
+    else:
+        target_n = int(vim.eval('a:target'))
+
+    _goto_window_for_buffer(vim.eval('g:gundo_target_n'))
+
+    nodes, nmap = make_nodes()
+    current = changenr(nodes)
+
+    node_after = nmap[target_n]
+    node_before = node_after.parent
+
+    _output_preview_text(_generate_preview_diff(current, node_before, node_after))
+
+    _goto_window_for_buffer_name('__Gundo__')
+
+GundoRenderPreview()
+ENDPYTHON
+endfunction"}}}
+
+"}}}
+
+"{{{ Undo/redo commands
+
+function! s:GundoRevert()"{{{
+    let target_line = matchstr(getline("."), '\v\[[0-9]+\]')
+    let target_num = matchstr(target_line, '\v[0-9]+')
+    let back = bufwinnr(g:gundo_target_n)
+    exe back . "wincmd w"
+python << ENDPYTHON
+_undo_to(vim.eval('target_num'))
+ENDPYTHON
+    GundoRenderGraph
+    exe back . "wincmd w"
+endfunction"}}}
+
+function! s:GundoPlayTo()"{{{
+    let target_line = matchstr(getline("."), '\v\[[0-9]+\]')
+    let target_num = matchstr(target_line, '\v[0-9]+')
+    let back = bufwinnr(g:gundo_target_n)
+    exe back . "wincmd w"
+    normal zR
+
+python << ENDPYTHON
+def GundoPlayTo():
+    nodes, nmap = make_nodes()
+
+    start = nmap[changenr(nodes)]
+    end = nmap[int(vim.eval('target_num'))]
+
+    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)
+
+        return reversed(nodes) if rev else 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')
+        vim.command('%dwincmd w' % int(vim.eval('back')))
+        vim.command('redraw')
+        vim.command('sleep 60m')
+
+GundoPlayTo()
+ENDPYTHON
+endfunction"}}}
+
+"}}}
+
+"{{{ Misc
+command! -nargs=0 GundoOpenGraph call s:GundoOpenGraph()
+command! -nargs=0 GundoToggle call s:GundoToggle()
+command! -nargs=0 GundoRenderGraph call s:GundoRenderGraph()
+autocmd BufNewFile __Gundo__ call s:GundoSettingsGraph()
+autocmd BufNewFile __Gundo_Preview__ call s:GundoSettingsPreview()
+"}}}

File .vim/bundle/vim-autocomplpop/autoload/acp.vim

+"=============================================================================
+" Copyright (c) 2007-2009 Takeshi NISHIDA
+"
+"=============================================================================
+" LOAD GUARD {{{1
+
+if !l9#guardScriptLoading(expand('<sfile>:p'), 0, 0, [])
+  finish
+endif
+
+" }}}1
+"=============================================================================
+" GLOBAL FUNCTIONS: {{{1
+
+"
+function acp#enable()
+  call acp#disable()
+
+  augroup AcpGlobalAutoCommand
+    autocmd!
+    autocmd InsertEnter * unlet! s:posLast s:lastUncompletable
+    autocmd InsertLeave * call s:finishPopup(1)
+  augroup END
+
+  if g:acp_mappingDriven
+    call s:mapForMappingDriven()
+  else
+    autocmd AcpGlobalAutoCommand CursorMovedI * call s:feedPopup()
+  endif
+
+  nnoremap <silent> i i<C-r>=<SID>feedPopup()<CR>
+  nnoremap <silent> a a<C-r>=<SID>feedPopup()<CR>
+  nnoremap <silent> R R<C-r>=<SID>feedPopup()<CR>
+endfunction
+
+"
+function acp#disable()
+  call s:unmapForMappingDriven()
+  augroup AcpGlobalAutoCommand
+    autocmd!
+  augroup END
+  nnoremap i <Nop> | nunmap i
+  nnoremap a <Nop> | nunmap a
+  nnoremap R <Nop> | nunmap R
+endfunction
+
+"
+function acp#lock()
+  let s:lockCount += 1
+endfunction
+
+"
+function acp#unlock()
+  let s:lockCount -= 1
+  if s:lockCount < 0
+    let s:lockCount = 0
+    throw "AutoComplPop: not locked"
+  endif
+endfunction
+
+"
+function acp#meetsForSnipmate(context)
+  if g:acp_behaviorSnipmateLength < 0
+    return 0
+  endif
+  let matches = matchlist(a:context, '\(^\|\s\|\<\)\(\u\{' .
+        \                            g:acp_behaviorSnipmateLength . ',}\)$')
+  return !empty(matches) && !empty(s:getMatchingSnipItems(matches[2]))
+endfunction
+
+"
+function acp#meetsForKeyword(context)
+  if g:acp_behaviorKeywordLength < 0
+    return 0
+  endif
+  let matches = matchlist(a:context, '\(\k\{' . g:acp_behaviorKeywordLength . ',}\)$')
+  if empty(matches)
+    return 0
+  endif
+  for ignore in g:acp_behaviorKeywordIgnores
+    if stridx(ignore, matches[1]) == 0
+      return 0
+    endif
+  endfor
+  return 1
+endfunction
+
+"
+function acp#meetsForFile(context)
+  if g:acp_behaviorFileLength < 0
+    return 0
+  endif
+  if has('win32') || has('win64')
+    let separator = '[/\\]'
+  else
+    let separator = '\/'
+  endif
+  if a:context !~ '\f' . separator . '\f\{' . g:acp_behaviorFileLength . ',}$'
+    return 0
+  endif
+  return a:context !~ '[*/\\][/\\]\f*$\|[^[:print:]]\f*$'
+endfunction
+
+"
+function acp#meetsForRubyOmni(context)
+  if !has('ruby')
+    return 0
+  endif
+  if g:acp_behaviorRubyOmniMethodLength >= 0 &&
+        \ a:context =~ '[^. \t]\(\.\|::\)\k\{' .
+        \              g:acp_behaviorRubyOmniMethodLength . ',}$'
+    return 1
+  endif
+  if g:acp_behaviorRubyOmniSymbolLength >= 0 &&
+        \ a:context =~ '\(^\|[^:]\):\k\{' .
+        \              g:acp_behaviorRubyOmniSymbolLength . ',}$'
+    return 1
+  endif
+  return 0
+endfunction
+
+"
+function acp#meetsForPythonOmni(context)
+  return has('python') && g:acp_behaviorPythonOmniLength >= 0 &&
+        \ a:context =~ '\k\.\k\{' . g:acp_behaviorPythonOmniLength . ',}$'
+endfunction
+
+"
+function acp#meetsForPerlOmni(context)
+  return g:acp_behaviorPerlOmniLength >= 0 &&
+        \ a:context =~ '\w->\k\{' . g:acp_behaviorPerlOmniLength . ',}$'
+endfunction
+
+"
+function acp#meetsForXmlOmni(context)
+  return g:acp_behaviorXmlOmniLength >= 0 &&
+        \ a:context =~ '\(<\|<\/\|<[^>]\+ \|<[^>]\+=\"\)\k\{' .
+        \              g:acp_behaviorXmlOmniLength . ',}$'
+endfunction
+
+"
+function acp#meetsForHtmlOmni(context)
+  return g:acp_behaviorHtmlOmniLength >= 0 &&
+        \ a:context =~ '\(<\|<\/\|<[^>]\+ \|<[^>]\+=\"\)\k\{' .
+        \              g:acp_behaviorHtmlOmniLength . ',}$'
+endfunction
+
+"
+function acp#meetsForCssOmni(context)
+  if g:acp_behaviorCssOmniPropertyLength >= 0 &&
+        \ a:context =~ '\(^\s\|[;{]\)\s*\k\{' .
+        \              g:acp_behaviorCssOmniPropertyLength . ',}$'
+    return 1
+  endif
+  if g:acp_behaviorCssOmniValueLength >= 0 &&
+        \ a:context =~ '[:@!]\s*\k\{' .
+        \              g:acp_behaviorCssOmniValueLength . ',}$'
+    return 1
+  endif
+  return 0
+endfunction
+
+"
+function acp#completeSnipmate(findstart, base)
+  if a:findstart
+    let s:posSnipmateCompletion = len(matchstr(s:getCurrentText(), '.*\U'))
+    return s:posSnipmateCompletion
+  endif
+  let lenBase = len(a:base)
+  let items = filter(GetSnipsInCurrentScope(),
+        \            'strpart(v:key, 0, lenBase) ==? a:base')
+  return map(sort(items(items)), 's:makeSnipmateItem(v:val[0], v:val[1])')
+endfunction
+
+"
+function acp#onPopupCloseSnipmate()
+  let word = s:getCurrentText()[s:posSnipmateCompletion :]
+  for trigger in keys(GetSnipsInCurrentScope())
+    if word ==# trigger
+      call feedkeys("\<C-r>=TriggerSnippet()\<CR>", "n")
+      return 0
+    endif
+  endfor
+  return 1
+endfunction
+
+"
+function acp#onPopupPost()
+  " to clear <C-r>= expression on command-line
+  echo ''
+  if pumvisible()
+    inoremap <silent> <expr> <C-h> acp#onBs()
+    inoremap <silent> <expr> <BS>  acp#onBs()
+    " a command to restore to original text and select the first match
+    return (s:behavsCurrent[s:iBehavs].command =~# "\<C-p>" ? "\<C-n>\<Up>"
+          \                                                 : "\<C-p>\<Down>")
+  endif
+  let s:iBehavs += 1
+  if len(s:behavsCurrent) > s:iBehavs 
+    call s:setCompletefunc()
+    return printf("\<C-e>%s\<C-r>=acp#onPopupPost()\<CR>",
+          \       s:behavsCurrent[s:iBehavs].command)
+  else
+    let s:lastUncompletable = {
+          \   'word': s:getCurrentWord(),
+          \   'commands': map(copy(s:behavsCurrent), 'v:val.command')[1:],
+          \ }
+    call s:finishPopup(0)
+    return "\<C-e>"
+  endif
+endfunction
+
+"
+function acp#onBs()
+  " using "matchstr" and not "strpart" in order to handle multi-byte
+  " characters
+  if call(s:behavsCurrent[s:iBehavs].meets,
+        \ [matchstr(s:getCurrentText(), '.*\ze.')])
+    return "\<BS>"
+  endif
+  return "\<C-e>\<BS>"
+endfunction
+
+" }}}1
+"=============================================================================
+" LOCAL FUNCTIONS: {{{1
+
+"
+function s:mapForMappingDriven()
+  call s:unmapForMappingDriven()
+  let s:keysMappingDriven = [
+        \ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
+        \ 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+        \ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+        \ 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+        \ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+        \ '-', '_', '~', '^', '.', ',', ':', '!', '#', '=', '%', '$', '@', '<', '>', '/', '\',
+        \ '<Space>', '<C-h>', '<BS>', ]
+  for key in s:keysMappingDriven
+    execute printf('inoremap <silent> %s %s<C-r>=<SID>feedPopup()<CR>',
+          \        key, key)
+  endfor
+endfunction
+
+"
+function s:unmapForMappingDriven()
+  if !exists('s:keysMappingDriven')
+    return
+  endif
+  for key in s:keysMappingDriven
+    execute 'iunmap ' . key
+  endfor
+  let s:keysMappingDriven = []
+endfunction
+
+"
+function s:getCurrentWord()
+  return matchstr(s:getCurrentText(), '\k*$')
+endfunction
+
+"
+function s:getCurrentText()
+  return strpart(getline('.'), 0, col('.') - 1)
+endfunction
+
+"
+function s:getPostText()
+  return strpart(getline('.'), col('.') - 1)
+endfunction
+
+"
+function s:isModifiedSinceLastCall()
+  if exists('s:posLast')
+    let posPrev = s:posLast
+    let nLinesPrev = s:nLinesLast
+    let textPrev = s:textLast
+  endif
+  let s:posLast = getpos('.')
+  let s:nLinesLast = line('$')
+  let s:textLast = getline('.')
+  if !exists('posPrev')
+    return 1
+  elseif posPrev[1] != s:posLast[1] || nLinesPrev != s:nLinesLast
+    return (posPrev[1] - s:posLast[1] == nLinesPrev - s:nLinesLast)
+  elseif textPrev ==# s:textLast
+    return 0
+  elseif posPrev[2] > s:posLast[2]
+    return 1
+  elseif has('gui_running') && has('multi_byte')
+    " NOTE: auto-popup causes a strange behavior when IME/XIM is working
+    return posPrev[2] + 1 == s:posLast[2]
+  endif
+  return posPrev[2] != s:posLast[2]
+endfunction
+
+"
+function s:makeCurrentBehaviorSet()
+  let modified = s:isModifiedSinceLastCall()
+  if exists('s:behavsCurrent[s:iBehavs].repeat') && s:behavsCurrent[s:iBehavs].repeat
+    let behavs = [ s:behavsCurrent[s:iBehavs] ]
+  elseif exists('s:behavsCurrent[s:iBehavs]')
+    return []
+  elseif modified
+    let behavs = copy(exists('g:acp_behavior[&filetype]')
+          \           ? g:acp_behavior[&filetype]
+          \           : g:acp_behavior['*'])
+  else
+    return []
+  endif
+  let text = s:getCurrentText()
+  call filter(behavs, 'call(v:val.meets, [text])')
+  let s:iBehavs = 0
+  if exists('s:lastUncompletable') &&
+        \ stridx(s:getCurrentWord(), s:lastUncompletable.word) == 0 &&
+        \ map(copy(behavs), 'v:val.command') ==# s:lastUncompletable.commands
+    let behavs = []
+  else
+    unlet! s:lastUncompletable
+  endif
+  return behavs
+endfunction
+
+"
+function s:feedPopup()
+  " NOTE: CursorMovedI is not triggered while the popup menu is visible. And
+  "       it will be triggered when popup menu is disappeared.
+  if s:lockCount > 0 || pumvisible() || &paste
+    return ''
+  endif
+  if exists('s:behavsCurrent[s:iBehavs].onPopupClose')
+    if !call(s:behavsCurrent[s:iBehavs].onPopupClose, [])
+      call s:finishPopup(1)
+      return ''
+    endif
+  endif
+  let s:behavsCurrent = s:makeCurrentBehaviorSet()
+  if empty(s:behavsCurrent)
+    call s:finishPopup(1)
+    return ''
+  endif
+  " In case of dividing words by symbols (e.g. "for(int", "ab==cd") while a
+  " popup menu is visible, another popup is not available unless input <C-e>
+  " or try popup once. So first completion is duplicated.
+  call insert(s:behavsCurrent, s:behavsCurrent[s:iBehavs])
+  call l9#tempvariables#set(s:TEMP_VARIABLES_GROUP0,
+        \ '&spell', 0)
+  call l9#tempvariables#set(s:TEMP_VARIABLES_GROUP0,
+        \ '&completeopt', 'menuone' . (g:acp_completeoptPreview ? ',preview' : ''))
+  call l9#tempvariables#set(s:TEMP_VARIABLES_GROUP0,
+        \ '&complete', g:acp_completeOption)
+  call l9#tempvariables#set(s:TEMP_VARIABLES_GROUP0,
+        \ '&ignorecase', g:acp_ignorecaseOption)
+  " NOTE: With CursorMovedI driven, Set 'lazyredraw' to avoid flickering.
+  "       With Mapping driven, set 'nolazyredraw' to make a popup menu visible.
+  call l9#tempvariables#set(s:TEMP_VARIABLES_GROUP0,
+        \ '&lazyredraw', !g:acp_mappingDriven)
+  " NOTE: 'textwidth' must be restored after <C-e>.
+  call l9#tempvariables#set(s:TEMP_VARIABLES_GROUP1,
+        \ '&textwidth', 0)
+  call s:setCompletefunc()
+  call feedkeys(s:behavsCurrent[s:iBehavs].command . "\<C-r>=acp#onPopupPost()\<CR>", 'n')
+  return '' " this function is called by <C-r>=
+endfunction
+
+"
+function s:finishPopup(fGroup1)
+  inoremap <C-h> <Nop> | iunmap <C-h>
+  inoremap <BS>  <Nop> | iunmap <BS>
+  let s:behavsCurrent = []
+  call l9#tempvariables#end(s:TEMP_VARIABLES_GROUP0)
+  if a:fGroup1
+    call l9#tempvariables#end(s:TEMP_VARIABLES_GROUP1)
+  endif
+endfunction
+
+"
+function s:setCompletefunc()
+  if exists('s:behavsCurrent[s:iBehavs].completefunc')
+    call l9#tempvariables#set(s:TEMP_VARIABLES_GROUP0,
+          \ '&completefunc', s:behavsCurrent[s:iBehavs].completefunc)
+  endif
+endfunction
+
+"
+function s:makeSnipmateItem(key, snip)
+  if type(a:snip) == type([])
+    let descriptions = map(copy(a:snip), 'v:val[0]')
+    let snipFormatted = '[MULTI] ' . join(descriptions, ', ')
+  else
+    let snipFormatted = substitute(a:snip, '\(\n\|\s\)\+', ' ', 'g')
+  endif
+  return  {
+        \   'word': a:key,
+        \   'menu': strpart(snipFormatted, 0, 80),
+        \ }
+endfunction
+
+"
+function s:getMatchingSnipItems(base)
+  let key = a:base . "\n"
+  if !exists('s:snipItems[key]')
+    let s:snipItems[key] = items(GetSnipsInCurrentScope())
+    call filter(s:snipItems[key], 'strpart(v:val[0], 0, len(a:base)) ==? a:base')
+    call map(s:snipItems[key], 's:makeSnipmateItem(v:val[0], v:val[1])')
+  endif
+  return s:snipItems[key]
+endfunction
+
+" }}}1
+"=============================================================================
+" INITIALIZATION {{{1
+
+let s:TEMP_VARIABLES_GROUP0 = "AutoComplPop0"
+let s:TEMP_VARIABLES_GROUP1 = "AutoComplPop1"
+let s:lockCount = 0
+let s:behavsCurrent = []
+let s:iBehavs = 0
+let s:snipItems = {}
+
+" }}}1
+"=============================================================================
+" vim: set fdm=marker:

File .vim/bundle/vim-autocomplpop/doc/acp.jax

+*acp.txt*       補完メニューの自動ポップアップ
+
+        Copyright (c) 2007-2009 Takeshi NISHIDA
+
+AutoComplPop                                              *autocomplpop* *acp*
+
+概要                            |acp-introduction|
+インストール                    |acp-installation|
+使い方                          |acp-usage|
+コマンド                        |acp-commands|
+オプション                      |acp-options|
+SPECIAL THANKS                  |acp-thanks|
+CHANGELOG                       |acp-changelog|
+あばうと                        |acp-about|
+
+
+==============================================================================
+概要                                                *acp-introduction*
+
+このプラグインは、インサートモードで文字を入力したりカーソルを動かしたときに補
+完メニューを自動的に開くようにします。しかし、続けて文字を入力するのを妨げたり
+はしません。
+
+
+==============================================================================
+インストール                                                *acp-installation*
+
+ZIPファイルをランタイムディレクトリに展開します。
+
+以下のようにファイルが配置されるはずです。
+>
+        <your runtime directory>/plugin/acp.vim
+        <your runtime directory>/doc/acp.txt
+        ...
+<
+もしランタイムディレクトリが多数のプラグインでごちゃごちゃになるのが嫌なら、各
+プラグインを個別のディレクトリに配置し、そのディレクトリのパスを 'runtimepath'
+に追加してください。アンインストールも楽になります。
+
+その後、ヘルプを有効にするためにタグファイルを更新してください。詳しくは
+|add-local-help|を参照してください。
+
+必要なもの: ~
+
+- L9 library (vimscript #3252)
+
+
+==============================================================================
+使い方                                                              *acp-usage*
+
+このプラグインがインストールされていれば、自動ポップアップは vim の開始時から
+有効になります。
+
+カーソル直前のテキストに応じて、利用する補完の種類を切り替えます。デフォルトの
+補完動作は次の通りです:
+
+        補完モード      filetype    カーソル直前のテキスト ~
+        キーワード補完  *           2文字のキーワード文字
+        ファイル名補完  *           ファイル名文字 + パスセパレータ
+                                    + 0文字以上のファイル名文字
+        オムニ補完      ruby        ".", "::" or 単語を構成する文字以外 + ":"
+        オムニ補完      python      "."
+        オムニ補完      xml         "<", "</" or ("<" + ">"以外の文字列 + " ")
+        オムニ補完      html/xhtml  "<", "</" or ("<" + ">"以外の文字列 + " ")
+        オムニ補完      css         (":", ";", "{", "^", "@", or "!")
+                                    + 0個または1個のスペース
+
+さらに、設定を行うことで、ユーザー定義補完と snipMate トリガー補完
+(|acp-snipMate|) を自動ポップアップさせることができます。
+
+これらの補完動作はカスタマイズ可能です。
+
+                                                                *acp-snipMate*
+snipMate トリガー補完 ~
+
+snipMate トリガー補完では、snipMate プラグイン
+(http://www.vim.org/scripts/script.php?script_id=2540) が提供するスニペットの
+トリガーを補完してそれを展開することができます。
+
+この自動ポップアップを有効にするには、次の関数を plugin/snipMate.vim に追加す
+る必要があります:
+>
+  fun! GetSnipsInCurrentScope()
+    let snips = {}
+    for scope in [bufnr('%')] + split(&ft, '\.') + ['_']
+      call extend(snips, get(s:snippets, scope, {}), 'keep')
+      call extend(snips, get(s:multi_snips, scope, {}), 'keep')
+    endfor
+    return snips
+  endf
+<
+そして|g:acp_behaviorSnipmateLength|オプションを 1 にしてください。
+
+この自動ポップアップには制限があり、カーソル直前の単語は大文字英字だけで構成さ
+れていなければなりません。
+
+                                                               *acp-perl-omni*
+Perl オムニ補完 ~
+
+AutoComplPop は perl-completion.vim
+(http://www.vim.org/scripts/script.php?script_id=2852) をサポートしています。
+
+この自動ポップアップを有効にするには、|g:acp_behaviorPerlOmniLength|オプション
+を 0 以上にしてください。
+
+
+==============================================================================
+コマンド                                                        *acp-commands*
+
+                                                                  *:AcpEnable*
+:AcpEnable
+        自動ポップアップを有効にします。
+
+                                                                 *:AcpDisable*
+:AcpDisable
+        自動ポップアップを無効にします。
+
+                                                                    *:AcpLock*
+:AcpLock
+        自動ポップアップを一時的に停止します。
+
+        別のスクリプトへの干渉を回避する目的なら、このコマンドと|:AcpUnlock| 
+        を利用することを、|:AcpDisable|と|:AcpEnable| を利用するよりも推奨しま
+        す。
+
+                                                                  *:AcpUnlock*
+:AcpUnlock
+        |:AcpLock| で停止された自動ポップアップを再開します。
+
+
+==============================================================================
+オプション                                                          *acp-options*
+
+                                                    *g:acp_enableAtStartup*  >
+  let g:acp_enableAtStartup = 1
+<
+        真なら vim 開始時から自動ポップアップが有効になります。
+
+                                                      *g:acp_mappingDriven*  >
+  let g:acp_mappingDriven = 0
+<
+        真なら|CursorMovedI|イベントではなくキーマッピングで自動ポップアップを
+        行うようにします。カーソルを移動するたびに補完が行われることで重いなど
+        の不都合がある場合に利用してください。ただし他のプラグインとの相性問題
+        や日本語入力での不具合が発生する可能性があります。(逆も然り。)
+
+                                                   *g:acp_ignorecaseOption*  >
+  let g:acp_ignorecaseOption = 1
+<
+        自動ポップアップ時に、'ignorecase' に一時的に設定する値
+
+                                                     *g:acp_completeOption*  >
+  let g:acp_completeOption = '.,w,b,k'
+<
+        自動ポップアップ時に、'complete' に一時的に設定する値
+
+                                                 *g:acp_completeoptPreview*  >
+  let g:acp_completeoptPreview = 0
+<
+        真なら自動ポップアップ時に、 'completeopt' へ "preview" を追加します。
+
+                                        *g:acp_behaviorUserDefinedFunction*  >
+  let g:acp_behaviorUserDefinedFunction = ''
+<
+        ユーザー定義補完の|g:acp_behavior-completefunc|。空ならこの補完は行わ
+        れません。。
+
+                                         *g:acp_behaviorUserDefinedMeets*  >
+  let g:acp_behaviorUserDefinedMeets = ''
+<
+        ユーザー定義補完の|g:acp_behavior-meets|。空ならこの補完は行われません
+        。
+
+                                             *g:acp_behaviorSnipmateLength*  >
+  let g:acp_behaviorSnipmateLength = -1
+<
+        snipMate トリガー補完の自動ポップアップを行うのに必要なカーソルの直前
+        のパターン。
+
+                                             *g:acp_behaviorKeywordCommand*  >
+  let g:acp_behaviorKeywordCommand = "\<C-n>"
+<
+        キーワード補完のコマンド。このオプションには普通 "\<C-n>" か "\<C-p>"
+        を設定します。
+
+                                              *g:acp_behaviorKeywordLength*  >
+  let g:acp_behaviorKeywordLength = 2
+<
+        キーワード補完の自動ポップアップを行うのに必要なカーソルの直前のキーワ
+        ード文字数。負数ならこの補完は行われません。
+
+                                             *g:acp_behaviorKeywordIgnores*  >
+  let g:acp_behaviorKeywordIgnores = []
+<
+        文字列のリスト。カーソル直前の単語がこれらの内いずれかの先頭部分にマッ
+        チする場合、この補完は行われません。
+
+        例えば、 "get" で始まる補完キーワードが多過ぎて、"g", "ge", "get" を入
+        力したときの自動ポップアップがレスポンスの低下を引き起こしている場合、
+        このオプションに ["get"] を設定することでそれを回避することができます。
+
+                                                 *g:acp_behaviorFileLength*  >
+  let g:acp_behaviorFileLength = 0
+<
+        ファイル名補完の自動ポップアップを行うのに必要なカーソルの直前のキーワ
+        ード文字数。負数ならこの補完は行われません。
+
+                                       *g:acp_behaviorRubyOmniMethodLength*  >
+  let g:acp_behaviorRubyOmniMethodLength = 0
+<
+        メソッド補完のための、Ruby オムニ補完の自動ポップアップを行うのに必要
+        なカーソルの直前のキーワード文字数。負数ならこの補完は行われません。
+
+                                       *g:acp_behaviorRubyOmniSymbolLength*  >
+  let g:acp_behaviorRubyOmniSymbolLength = 1
+<
+        シンボル補完のための、Ruby オムニ補完の自動ポップアップを行うのに必要
+        なカーソルの直前のキーワード文字数。負数ならこの補完は行われません。
+
+                                           *g:acp_behaviorPythonOmniLength*  >
+  let g:acp_behaviorPythonOmniLength = 0
+<
+        Python オムニ補完の自動ポップアップを行うのに必要なカーソルの直前のキ
+        ーワード文字数。負数ならこの補完は行われません。
+
+                                             *g:acp_behaviorPerlOmniLength*  >
+  let g:acp_behaviorPerlOmniLength = -1
+<
+        Perl オムニ補完の自動ポップアップを行うのに必要なカーソルの直前のキー
+        ワード文字数。負数ならこの補完は行われません。
+
+        See also: |acp-perl-omni|
+
+                                              *g:acp_behaviorXmlOmniLength*  >
+  let g:acp_behaviorXmlOmniLength = 0
+<
+        XML オムニ補完の自動ポップアップを行うのに必要なカーソルの直前のキーワ
+        ード文字数。負数ならこの補完は行われません。
+
+                                             *g:acp_behaviorHtmlOmniLength*  >
+  let g:acp_behaviorHtmlOmniLength = 0
+<
+        HTML オムニ補完の自動ポップアップを行うのに必要なカーソルの直前のキー
+        ワード文字数。負数ならこの補完は行われません。
+
+                                      *g:acp_behaviorCssOmniPropertyLength*  >
+  let g:acp_behaviorCssOmniPropertyLength = 1
+<
+        プロパティ補完のための、CSS オムニ補完の自動ポップアップを行うのに必要
+        なカーソルの直前のキーワード文字数。負数ならこの補完は行われません。
+
+                                         *g:acp_behaviorCssOmniValueLength*  >
+  let g:acp_behaviorCssOmniValueLength = 0
+<
+        値補完のための、CSS オムニ補完の自動ポップアップを行うのに必要なカーソ
+        ルの直前のキーワード文字数。負数ならこの補完は行われません。
+
+                                                           *g:acp_behavior*  >
+  let g:acp_behavior = {}
+<
+
+        これは内部仕様がわかっている人向けのオプションで、他のオプションでの設
+        定より優先されます。 
+
+        |Dictionary|型で、キーはファイルタイプに対応します。 '*' はデフォルト
+        を表します。値はリスト型です。補完候補が得られるまでリストの先頭アイテ
+        ムから順に評価します。各要素は|Dictionary|で詳細は次の通り:
+
+        "command":                                    *g:acp_behavior-command*
+          補完メニューをポップアップするためのコマンド。
+
+        "completefunc":                          *g:acp_behavior-completefunc*
+          'completefunc' に設定する関数。 "command" が "<C-x><C-u>" のときだけ
+          意味があります。
+
+        "meets":                                        *g:acp_behavior-meets*
+          この補完を行うかどうかを判断する関数の名前。この関数はカーソル直前の
+          テキストを引数に取り、補完を行うなら非 0 の値を返します。
+
+        "onPopupClose":                          *g:acp_behavior-onPopupClose*
+          この補完のポップアップメニューが閉じられたときに呼ばれる関数の名前。
+          この関数が 0 を返した場合、続いて行われる予定の補完は抑制されます。
+
+        "repeat":                                      *g:acp_behavior-repeat*
+          真なら最後の補完が自動的に繰り返されます。
+
+
+==============================================================================
+あばうと                                *acp-about* *acp-contact* *acp-author*
+
+作者:       Takeshi NISHIDA <ns9tks@DELETE-ME.gmail.com>
+ライセンス: MIT Licence
+URL:        http://www.vim.org/scripts/script.php?script_id=1879
+            http://bitbucket.org/ns9tks/vim-autocomplpop/
+
+バグや要望など ~
+
+こちらへどうぞ: http://bitbucket.org/ns9tks/vim-autocomplpop/issues/
+
+==============================================================================
+ vim:tw=78:ts=8:ft=help:norl:
+

File .vim/bundle/vim-autocomplpop/doc/acp.txt

+*acp.txt*       Automatically opens popup menu for completions.
+
+        Copyright (c) 2007-2009 Takeshi NISHIDA
+
+AutoComplPop                                              *autocomplpop* *acp*
+
+INTRODUCTION                    |acp-introduction|
+INSTALLATION                    |acp-installation|
+USAGE                           |acp-usage|
+COMMANDS                        |acp-commands|
+OPTIONS                         |acp-options|
+SPECIAL THANKS                  |acp-thanks|
+CHANGELOG                       |acp-changelog|
+ABOUT                           |acp-about|
+
+
+==============================================================================
+INTRODUCTION                                                *acp-introduction*
+
+With this plugin, your vim comes to automatically opens popup menu for
+completions when you enter characters or move the cursor in Insert mode. It
+won't prevent you continuing entering characters.
+
+
+==============================================================================
+INSTALLATION                                                *acp-installation*
+
+Put all files into your runtime directory. If you have the zip file, extract
+it to your runtime directory.
+
+You should place the files as follows:
+>
+        <your runtime directory>/plugin/acp.vim
+        <your runtime directory>/doc/acp.txt
+        ...
+<
+If you are disgusted to make your runtime directory confused with a lot of
+plugins, put each of the plugins into a directory individually and just add
+the directory path to 'runtimepath'. It's easy to uninstall plugins.
+
+Then update your help tags files to enable help for this plugin. See
+|add-local-help| for details.
+
+Requirements: ~
+
+- L9 library (vimscript #3252)
+
+
+==============================================================================
+USAGE                                                              *acp-usage*
+
+Once this plugin is installed, auto-popup is enabled at startup by default.
+
+Which completion method is used depends on the text before the cursor. The
+default behavior is as follows:
+
+        kind      filetype    text before the cursor ~
+        Keyword   *           two keyword characters
+        Filename  *           a filename character + a path separator 
+                              + 0 or more filename character
+        Omni      ruby        ".", "::" or non-word character + ":"
+                              (|+ruby| required.)
+        Omni      python      "." (|+python| required.)
+        Omni      xml         "<", "</" or ("<" + non-">" characters + " ")
+        Omni      html/xhtml  "<", "</" or ("<" + non-">" characters + " ")
+        Omni      css         (":", ";", "{", "^", "@", or "!")
+                              + 0 or 1 space
+
+Also, you can make user-defined completion and snipMate's trigger completion
+(|acp-snipMate|) auto-popup if the options are set.
+
+These behavior are customizable.
+
+                                                                *acp-snipMate*
+snipMate's Trigger Completion ~
+
+snipMate's trigger completion enables you to complete a snippet trigger
+provided by snipMate plugin
+(http://www.vim.org/scripts/script.php?script_id=2540) and expand it.
+
+
+To enable auto-popup for this completion, add following function to
+plugin/snipMate.vim:
+>
+  fun! GetSnipsInCurrentScope()
+    let snips = {}
+    for scope in [bufnr('%')] + split(&ft, '\.') + ['_']
+      call extend(snips, get(s:snippets, scope, {}), 'keep')
+      call extend(snips, get(s:multi_snips, scope, {}), 'keep')
+    endfor
+    return snips
+  endf
+<
+And set |g:acp_behaviorSnipmateLength| option to 1.
+
+There is the restriction on this auto-popup, that the word before cursor must
+consist only of uppercase characters.
+
+                                                               *acp-perl-omni*
+Perl Omni-Completion ~
+
+AutoComplPop supports perl-completion.vim
+(http://www.vim.org/scripts/script.php?script_id=2852).
+
+To enable auto-popup for this completion, set |g:acp_behaviorPerlOmniLength|
+option to 0 or more.
+
+
+==============================================================================
+COMMANDS                                                        *acp-commands*
+
+                                                                  *:AcpEnable*
+:AcpEnable
+        enables auto-popup.
+
+                                                                 *:AcpDisable*
+:AcpDisable
+        disables auto-popup.
+
+                                                                    *:AcpLock*
+:AcpLock
+        suspends auto-popup temporarily.
+
+        For the purpose of avoiding interruption to another script, it is