diff options
Diffstat (limited to 'home/.vim/after/ftplugin/python_snippets.vim')
-rw-r--r-- | home/.vim/after/ftplugin/python_snippets.vim | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/home/.vim/after/ftplugin/python_snippets.vim b/home/.vim/after/ftplugin/python_snippets.vim new file mode 100644 index 0000000..97d3e0c --- /dev/null +++ b/home/.vim/after/ftplugin/python_snippets.vim @@ -0,0 +1,202 @@ +if !exists('loaded_snippet') || &cp + finish +endif + +" Given a string containing a list of arguments (e.g. "one, two = 'test'"), +" this function cleans it up by removing useless whitespace and commas. +function! PyCleanupArgs(text) + if a:text == 'args' + return '' + endif + let text = substitute(a:text, '\(\w\)\s\(\w\)', '\1,\2', 'g') + return join(split(text, '\s*,\s*'), ', ') +endfunction + +" Given a string containing a list of arguments (e.g. "one = 'test', *args, +" **kwargs"), this function returns a string containing only the variable +" names, separated by spaces, e.g. "one two". +function! PyGetVarnamesFromArgs(text) + let text = substitute(a:text, 'self,*\s*', '', '') + let text = substitute(text, '\*\*\?\k\+', '', 'g') + let text = substitute(text, '=.\{-},', '', 'g') + let text = substitute(text, '=.\{-}$', '', 'g') + let text = substitute(text, '\s*,\s*', ' ', 'g') + if text == ' ' + return '' + endif + return text +endfunction + +" Returns the current indent as a string. +function! PyGetIndentString() + if &expandtab + let tabs = indent('.') / &shiftwidth + let tabstr = repeat(' ', &shiftwidth) + else + let tabs = indent('.') / &tabstop + let tabstr = '\t' + endif + return repeat(tabstr, tabs) +endfunction + +" Given a string containing a list of arguments (e.g. "one = 'test', *args, +" **kwargs"), this function returns them formatted correctly for the +" docstring. +function! PyGetDocstringFromArgs(text) + let text = PyGetVarnamesFromArgs(a:text) + if a:text == 'args' || text == '' + return '' + endif + let indent = PyGetIndentString() + let st = g:snip_start_tag + let et = g:snip_end_tag + let docvars = map(split(text), 'v:val." -- ".st.et') + return '\n'.indent.join(docvars, '\n'.indent).'\n'.indent +endfunction + +" Given a string containing a list of arguments (e.g. "one = 'test', *args, +" **kwargs"), this function returns them formatted as a variable assignment in +" the form "self._ONE = ONE", as used in class constructors. +function! PyGetVariableInitializationFromVars(text) + let text = PyGetVarnamesFromArgs(a:text) + if a:text == 'args' || text == '' + return '' + endif + let indent = PyGetIndentString() + let st = g:snip_start_tag + let et = g:snip_end_tag + let assert_vars = map(split(text), '"assert ".v:val." ".st.et') + let assign_vars = map(split(text), '"self._".v:val." = ".v:val') + let assertions = join(assert_vars, '\n'.indent) + let assignments = join(assign_vars, '\n'.indent) + return assertions.'\n'.indent.assignments.'\n'.indent +endfunction + +" Given a string containing a list of arguments (e.g. "one = 'test', *args, +" **kwargs"), this function returns them with the default arguments removed. +function! PyStripDefaultValue(text) + return substitute(a:text, '=.*', '', 'g') +endfunction + +" Returns the number of occurences of needle in haystack. +function! Count(haystack, needle) + let counter = 0 + let index = match(a:haystack, a:needle) + while index > -1 + let counter = counter + 1 + let index = match(a:haystack, a:needle, index+1) + endwhile + return counter +endfunction + +" Returns replacement if the given subject matches the given match. +" Returns the subject otherwise. +function! PyReplace(subject, match, replacement) + if a:subject == a:match + return a:replacement + endif + return a:subject +endfunction + +" Returns the % operator with a tuple containing n elements appended, where n +" is the given number. +function! PyHashArgList(count) + if a:count == 0 + return '' + endif + let st = g:snip_start_tag + let et = g:snip_end_tag + return ' % ('.st.et.repeat(', '.st.et, a:count - 1).')' +endfunction + +let st = g:snip_start_tag +let et = g:snip_end_tag +let cd = g:snip_elem_delim + +" Note to users: The following method of defininf snippets is to allow for +" changes to the default tags. +" Feel free to define your own as so: +" Snippet mysnip This is the expansion text.<{}> +" There is no need to use exec if you are happy to hardcode your own start and +" end tags + +" Properties, setters and getters. +exec "Snippet prop ".st."attribute".et." = property(get_".st."attribute".et.", set_".st."attribute".et.st.et.")<CR>".st.et +exec "Snippet get def get_".st."name".et."(self):<CR>return self._".st."name".et."<CR>".st.et +exec "Snippet set def set_".st."name".et."(self, ".st."value".et."): +\<CR>self._".st."name".et." = ".st."value:PyStripDefaultValue(@z)".et." +\<CR>".st.et + +" Functions and methods. +exec "Snippet def def ".st."fname".et."(".st."args:PyCleanupArgs(@z)".et."): +\<CR>\"\"\" +\<CR>".st.et." +\<CR>".st."args:PyGetDocstringFromArgs(@z)".et."\"\"\" +\<CR>".st."pass".et." +\<CR>".st.et +exec "Snippet cm ".st."class".et." = classmethod(".st."class".et.")<CR>".st.et + +" Class definition. +exec "Snippet cl class ".st."ClassName".et."(".st."object".et."): +\<CR>\"\"\" +\<CR>This class represents ".st.et." +\<CR>\"\"\" +\<CR> +\<CR>def __init__(self, ".st."args:PyCleanupArgs(@z)".et."): +\<CR>\"\"\" +\<CR>Constructor. +\<CR>".st."args:PyGetDocstringFromArgs(@z)".et."\"\"\" +\<CR>".st."args:PyGetVariableInitializationFromVars(@z)".et.st.et + +" Keywords +exec "Snippet for for ".st."variable".et." in ".st."ensemble".et.":<CR>".st."pass".et."<CR>".st.et +exec "Snippet pf print '".st."s".et."'".st."s:PyHashArgList(Count(@z, '%[^%]'))".et."<CR>".st.et +exec "Snippet im import ".st."module".et."<CR>".st.et +exec "Snippet from from ".st."module".et." import ".st.'name:PyReplace(@z, "name", "*")'.et."<CR>".st.et +exec "Snippet % '".st."s".et."'".st."s:PyHashArgList(Count(@z, '%[^%]'))".et.st.et +exec "Snippet ass assert ".st."expression".et.st.et +" From Kib2 +exec "Snippet bc \"\"\"<CR>".st.et."<CR>\"\"\"<CR>".st.et + +" Try, except, finally. +exec "Snippet trye try: +\<CR>".st.et." +\<CR>except Exception, e: +\<CR>".st.et." +\<CR>".st.et + +exec "Snippet tryf try: +\<CR>".st.et." +\<CR>finally: +\<CR>".st.et." +\<CR>".st.et + +exec "Snippet tryef try: +\<CR>".st.et." +\<CR>except Exception, e: +\<CR>".st.et." +\<CR>finally: +\<CR>".st.et." +\<CR>".st.et + +" Other multi statement templates +" From Panos +exec "Snippet ifn if __name__ == '".st."main".et."':<CR>".st.et +exec "Snippet ifmain if __name__ == '__main__':<CR>".st.et + +" Shebang +exec "Snippet sb #!/usr/bin/env python<CR># -*- coding: ".st."encoding".et." -*-<CR>".st.et +exec "Snippet sbu #!/usr/bin/env python<CR># -*- coding: UTF-8 -*-<CR>".st.et +" From Kib2 +exec "Snippet sbl1 #!/usr/bin/env python<CR># -*- coding: Latin-1 -*-<CR>".st.et + +" Unit tests. +exec "Snippet unittest if __name__ == '__main__': +\<CR>import unittest +\<CR> +\<CR>class ".st."ClassName".et."Test(unittest.TestCase): +\<CR>def setUp(self): +\<CR>".st."pass".et." +\<CR> +\<CR>def runTest(self): +\<CR>".st.et |