aboutsummaryrefslogtreecommitdiff
path: root/vim/bundle/vim-snippets/pythonx
diff options
context:
space:
mode:
Diffstat (limited to 'vim/bundle/vim-snippets/pythonx')
-rw-r--r--vim/bundle/vim-snippets/pythonx/vimsnippets.py92
1 files changed, 92 insertions, 0 deletions
diff --git a/vim/bundle/vim-snippets/pythonx/vimsnippets.py b/vim/bundle/vim-snippets/pythonx/vimsnippets.py
new file mode 100644
index 0000000..6a446a2
--- /dev/null
+++ b/vim/bundle/vim-snippets/pythonx/vimsnippets.py
@@ -0,0 +1,92 @@
+"""Helper methods used in UltiSnips snippets."""
+
+import string, vim
+
+def complete(tab, opts):
+ """
+ get options that start with tab
+
+ :param tab: query string
+ :param opts: list that needs to be completed
+
+ :return: a string that start with tab
+ """
+ msg = "({0})"
+ if tab:
+ opts = [m[len(tab):] for m in opts if m.startswith(tab)]
+ if len(opts) == 1:
+ return opts[0]
+
+ if not len(opts):
+ msg = "{0}"
+ return msg.format("|".join(opts))
+
+def _parse_comments(s):
+ """ Parses vim's comments option to extract comment format """
+ i = iter(s.split(","))
+
+ rv = []
+ try:
+ while True:
+ # get the flags and text of a comment part
+ flags, text = next(i).split(':', 1)
+
+ if len(flags) == 0:
+ rv.append((text, text, text, ""))
+ # parse 3-part comment, but ignore those with O flag
+ elif 's' in flags and 'O' not in flags:
+ ctriple = ["TRIPLE"]
+ indent = ""
+
+ if flags[-1] in string.digits:
+ indent = " " * int(flags[-1])
+ ctriple.append(text)
+
+ flags, text = next(i).split(':', 1)
+ assert flags[0] == 'm'
+ ctriple.append(text)
+
+ flags, text = next(i).split(':', 1)
+ assert flags[0] == 'e'
+ ctriple.append(text)
+ ctriple.append(indent)
+
+ rv.append(ctriple)
+ elif 'b' in flags:
+ if len(text) == 1:
+ rv.insert(0, ("SINGLE_CHAR", text, text, text, ""))
+ except StopIteration:
+ return rv
+
+def get_comment_format():
+ """ Returns a 4-element tuple (first_line, middle_lines, end_line, indent)
+ representing the comment format for the current file.
+
+ It first looks at the 'commentstring', if that ends with %s, it uses that.
+ Otherwise it parses '&comments' and prefers single character comment
+ markers if there are any.
+ """
+ commentstring = vim.eval("&commentstring")
+ if commentstring.endswith("%s"):
+ c = commentstring[:-2]
+ return (c, c, c, "")
+ comments = _parse_comments(vim.eval("&comments"))
+ for c in comments:
+ if c[0] == "SINGLE_CHAR":
+ return c[1:]
+ return comments[0][1:]
+
+
+def make_box(twidth, bwidth=None):
+ b, m, e, i = (s.strip() for s in get_comment_format())
+ bwidth_inner = bwidth - 3 - max(len(b), len(i + e)) if bwidth else twidth + 2
+ sline = b + m + bwidth_inner * m[0] + 2 * m[0]
+ nspaces = (bwidth_inner - twidth) // 2
+ mlines = i + m + " " + " " * nspaces
+ mlinee = " " + " "*(bwidth_inner - twidth - nspaces) + m
+ eline = i + m + bwidth_inner * m[0] + 2 * m[0] + e
+ return sline, mlines, mlinee, eline
+
+def foldmarker():
+ "Return a tuple of (open fold marker, close fold marker)"
+ return vim.eval("&foldmarker").split(",")