diff options
Diffstat (limited to '')
-rw-r--r-- | .vim/ftplugin/python_fn.vim | 446 |
1 files changed, 0 insertions, 446 deletions
diff --git a/.vim/ftplugin/python_fn.vim b/.vim/ftplugin/python_fn.vim deleted file mode 100644 index 7c7cf21..0000000 --- a/.vim/ftplugin/python_fn.vim +++ /dev/null @@ -1,446 +0,0 @@ -" -*- vim -*- -" FILE: python_fn.vim -" LAST MODIFICATION: 2008-08-28 8:19pm -" (C) Copyright 2001-2005 Mikael Berthe <bmikael@lists.lilotux.net> -" Maintained by Jon Franklin <jvfranklin@gmail.com> -" Version: 1.13 - -" USAGE: -" -" Save this file to $VIMFILES/ftplugin/python.vim. You can have multiple -" python ftplugins by creating $VIMFILES/ftplugin/python and saving your -" ftplugins in that directory. If saving this to the global ftplugin -" directory, this is the recommended method, since vim ships with an -" ftplugin/python.vim file already. -" You can set the global variable "g:py_select_leading_comments" to 0 -" if you don't want to select comments preceding a declaration (these -" are usually the description of the function/class). -" You can set the global variable "g:py_select_trailing_comments" to 0 -" if you don't want to select comments at the end of a function/class. -" If these variables are not defined, both leading and trailing comments -" are selected. -" Example: (in your .vimrc) "let g:py_select_leading_comments = 0" -" You may want to take a look at the 'shiftwidth' option for the -" shift commands... -" -" REQUIREMENTS: -" vim (>= 7) -" -" Shortcuts: -" ]t -- Jump to beginning of block -" ]e -- Jump to end of block -" ]v -- Select (Visual Line Mode) block -" ]< -- Shift block to left -" ]> -- Shift block to right -" ]# -- Comment selection -" ]u -- Uncomment selection -" ]c -- Select current/previous class -" ]d -- Select current/previous function -" ]<up> -- Jump to previous line with the same/lower indentation -" ]<down> -- Jump to next line with the same/lower indentation - -" Only do this when not done yet for this buffer -if exists("b:loaded_py_ftplugin") - finish -endif -let b:loaded_py_ftplugin = 1 - -map ]t :PBoB<CR> -vmap ]t :<C-U>PBOB<CR>m'gv`` -map ]e :PEoB<CR> -vmap ]e :<C-U>PEoB<CR>m'gv`` - -map ]v ]tV]e -map ]< ]tV]e< -vmap ]< < -map ]> ]tV]e> -vmap ]> > - -map ]# :call PythonCommentSelection()<CR> -vmap ]# :call PythonCommentSelection()<CR> -map ]u :call PythonUncommentSelection()<CR> -vmap ]u :call PythonUncommentSelection()<CR> - -map ]c :call PythonSelectObject("class")<CR> -map ]d :call PythonSelectObject("function")<CR> - -map ]<up> :call PythonNextLine(-1)<CR> -map ]<down> :call PythonNextLine(1)<CR> -" You may prefer use <s-up> and <s-down>... :-) - -" jump to previous class -map ]J :call PythonDec("class", -1)<CR> -vmap ]J :call PythonDec("class", -1)<CR> - -" jump to next class -map ]j :call PythonDec("class", 1)<CR> -vmap ]j :call PythonDec("class", 1)<CR> - -" jump to previous function -map ]F :call PythonDec("function", -1)<CR> -vmap ]F :call PythonDec("function", -1)<CR> - -" jump to next function -map ]f :call PythonDec("function", 1)<CR> -vmap ]f :call PythonDec("function", 1)<CR> - - - -" Menu entries -nmenu <silent> &Python.Update\ IM-Python\ Menu - \:call UpdateMenu()<CR> -nmenu &Python.-Sep1- : -nmenu <silent> &Python.Beginning\ of\ Block<Tab>[t - \]t -nmenu <silent> &Python.End\ of\ Block<Tab>]e - \]e -nmenu &Python.-Sep2- : -nmenu <silent> &Python.Shift\ Block\ Left<Tab>]< - \]< -vmenu <silent> &Python.Shift\ Block\ Left<Tab>]< - \]< -nmenu <silent> &Python.Shift\ Block\ Right<Tab>]> - \]> -vmenu <silent> &Python.Shift\ Block\ Right<Tab>]> - \]> -nmenu &Python.-Sep3- : -vmenu <silent> &Python.Comment\ Selection<Tab>]# - \]# -nmenu <silent> &Python.Comment\ Selection<Tab>]# - \]# -vmenu <silent> &Python.Uncomment\ Selection<Tab>]u - \]u -nmenu <silent> &Python.Uncomment\ Selection<Tab>]u - \]u -nmenu &Python.-Sep4- : -nmenu <silent> &Python.Previous\ Class<Tab>]J - \]J -nmenu <silent> &Python.Next\ Class<Tab>]j - \]j -nmenu <silent> &Python.Previous\ Function<Tab>]F - \]F -nmenu <silent> &Python.Next\ Function<Tab>]f - \]f -nmenu &Python.-Sep5- : -nmenu <silent> &Python.Select\ Block<Tab>]v - \]v -nmenu <silent> &Python.Select\ Function<Tab>]d - \]d -nmenu <silent> &Python.Select\ Class<Tab>]c - \]c -nmenu &Python.-Sep6- : -nmenu <silent> &Python.Previous\ Line\ wrt\ indent<Tab>]<up> - \]<up> -nmenu <silent> &Python.Next\ Line\ wrt\ indent<Tab>]<down> - \]<down> - -:com! PBoB execute "normal ".PythonBoB(line('.'), -1, 1)."G" -:com! PEoB execute "normal ".PythonBoB(line('.'), 1, 1)."G" -:com! UpdateMenu call UpdateMenu() - - -" Go to a block boundary (-1: previous, 1: next) -" If force_sel_comments is true, 'g:py_select_trailing_comments' is ignored -function! PythonBoB(line, direction, force_sel_comments) - let ln = a:line - let ind = indent(ln) - let mark = ln - let indent_valid = strlen(getline(ln)) - let ln = ln + a:direction - if (a:direction == 1) && (!a:force_sel_comments) && - \ exists("g:py_select_trailing_comments") && - \ (!g:py_select_trailing_comments) - let sel_comments = 0 - else - let sel_comments = 1 - endif - - while((ln >= 1) && (ln <= line('$'))) - if (sel_comments) || (match(getline(ln), "^\\s*#") == -1) - if (!indent_valid) - let indent_valid = strlen(getline(ln)) - let ind = indent(ln) - let mark = ln - else - if (strlen(getline(ln))) - if (indent(ln) < ind) - break - endif - let mark = ln - endif - endif - endif - let ln = ln + a:direction - endwhile - - return mark -endfunction - - -" Go to previous (-1) or next (1) class/function definition -function! PythonDec(obj, direction) - if (a:obj == "class") - let objregexp = "^\\s*class\\s\\+[a-zA-Z0-9_]\\+" - \ . "\\s*\\((\\([a-zA-Z0-9_,. \\t\\n]\\)*)\\)\\=\\s*:" - else - let objregexp = "^\\s*def\\s\\+[a-zA-Z0-9_]\\+\\s*(\\_[^:#]*)\\s*:" - endif - let flag = "W" - if (a:direction == -1) - let flag = flag."b" - endif - let res = search(objregexp, flag) -endfunction - - -" Comment out selected lines -" commentString is inserted in non-empty lines, and should be aligned with -" the block -function! PythonCommentSelection() range - let commentString = "#" - let cl = a:firstline - let ind = 1000 " I hope nobody use so long lines! :) - - " Look for smallest indent - while (cl <= a:lastline) - if strlen(getline(cl)) - let cind = indent(cl) - let ind = ((ind < cind) ? ind : cind) - endif - let cl = cl + 1 - endwhile - if (ind == 1000) - let ind = 1 - else - let ind = ind + 1 - endif - - let cl = a:firstline - execute ":".cl - " Insert commentString in each non-empty line, in column ind - while (cl <= a:lastline) - if strlen(getline(cl)) - execute "normal ".ind."|i".commentString - endif - execute "normal \<Down>" - let cl = cl + 1 - endwhile -endfunction - -" Uncomment selected lines -function! PythonUncommentSelection() range - " commentString could be different than the one from CommentSelection() - " For example, this could be "# \\=" - let commentString = "#" - let cl = a:firstline - while (cl <= a:lastline) - let ul = substitute(getline(cl), - \"\\(\\s*\\)".commentString."\\(.*\\)$", "\\1\\2", "") - call setline(cl, ul) - let cl = cl + 1 - endwhile -endfunction - - -" Select an object ("class"/"function") -function! PythonSelectObject(obj) - " Go to the object declaration - normal $ - call PythonDec(a:obj, -1) - let beg = line('.') - - if !exists("g:py_select_leading_comments") || (g:py_select_leading_comments) - let decind = indent(beg) - let cl = beg - while (cl>1) - let cl = cl - 1 - if (indent(cl) == decind) && (getline(cl)[decind] == "#") - let beg = cl - else - break - endif - endwhile - endif - - if (a:obj == "class") - let eod = "\\(^\\s*class\\s\\+[a-zA-Z0-9_]\\+\\s*" - \ . "\\((\\([a-zA-Z0-9_,. \\t\\n]\\)*)\\)\\=\\s*\\)\\@<=:" - else - let eod = "\\(^\\s*def\\s\\+[a-zA-Z0-9_]\\+\\s*(\\_[^:#]*)\\s*\\)\\@<=:" - endif - " Look for the end of the declaration (not always the same line!) - call search(eod, "") - - " Is it a one-line definition? - if match(getline('.'), "^\\s*\\(#.*\\)\\=$", col('.')) == -1 - let cl = line('.') - execute ":".beg - execute "normal V".cl."G" - else - " Select the whole block - execute "normal \<Down>" - let cl = line('.') - execute ":".beg - execute "normal V".PythonBoB(cl, 1, 0)."G" - endif -endfunction - - -" Jump to the next line with the same (or lower) indentation -" Useful for moving between "if" and "else", for example. -function! PythonNextLine(direction) - let ln = line('.') - let ind = indent(ln) - let indent_valid = strlen(getline(ln)) - let ln = ln + a:direction - - while((ln >= 1) && (ln <= line('$'))) - if (!indent_valid) && strlen(getline(ln)) - break - else - if (strlen(getline(ln))) - if (indent(ln) <= ind) - break - endif - endif - endif - let ln = ln + a:direction - endwhile - - execute "normal ".ln."G" -endfunction - -function! UpdateMenu() - " delete menu if it already exists, then rebuild it. - " this is necessary in case you've got multiple buffers open - " a future enhancement to this would be to make the menu aware of - " all buffers currently open, and group classes and functions by buffer - if exists("g:menuran") - aunmenu IM-Python - endif - let restore_fe = &foldenable - set nofoldenable - " preserve disposition of window and cursor - let cline=line('.') - let ccol=col('.') - 1 - norm H - let hline=line('.') - " create the menu - call MenuBuilder() - " restore disposition of window and cursor - exe "norm ".hline."Gzt" - let dnscroll=cline-hline - exe "norm ".dnscroll."j".ccol."l" - let &foldenable = restore_fe -endfunction - -function! MenuBuilder() - norm gg0 - let currentclass = -1 - let classlist = [] - let parentclass = "" - while line(".") < line("$") - " search for a class or function - if match ( getline("."), '^\s*class\s\+[_a-zA-Z].*\|^\s*def\s\+[_a-zA-Z].*' ) != -1 - norm ^ - let linenum = line('.') - let indentcol = col('.') - norm "nye - let classordef=@n - norm w"nywge - let objname=@n - let parentclass = FindParentClass(classlist, indentcol) - if classordef == "class" - call AddClass(objname, linenum, parentclass) - else " this is a function - call AddFunction(objname, linenum, parentclass) - endif - " We actually created a menu, so lets set the global variable - let g:menuran=1 - call RebuildClassList(classlist, [objname, indentcol], classordef) - endif " line matched - norm j - endwhile -endfunction - -" classlist contains the list of nested classes we are in. -" in most cases it will be empty or contain a single class -" but where a class is nested within another, it will contain 2 or more -" this function adds or removes classes from the list based on indentation -function! RebuildClassList(classlist, newclass, classordef) - let i = len(a:classlist) - 1 - while i > -1 - if a:newclass[1] <= a:classlist[i][1] - call remove(a:classlist, i) - endif - let i = i - 1 - endwhile - if a:classordef == "class" - call add(a:classlist, a:newclass) - endif -endfunction - -" we found a class or function, determine its parent class based on -" indentation and what's contained in classlist -function! FindParentClass(classlist, indentcol) - let i = 0 - let parentclass = "" - while i < len(a:classlist) - if a:indentcol <= a:classlist[i][1] - break - else - if len(parentclass) == 0 - let parentclass = a:classlist[i][0] - else - let parentclass = parentclass.'\.'.a:classlist[i][0] - endif - endif - let i = i + 1 - endwhile - return parentclass -endfunction - -" add a class to the menu -function! AddClass(classname, lineno, parentclass) - if len(a:parentclass) > 0 - let classstring = a:parentclass.'\.'.a:classname - else - let classstring = a:classname - endif - exe 'menu IM-Python.classes.'.classstring.' :call <SID>JumpToAndUnfold('.a:lineno.')<CR>' -endfunction - -" add a function to the menu, grouped by member class -function! AddFunction(functionname, lineno, parentclass) - if len(a:parentclass) > 0 - let funcstring = a:parentclass.'.'.a:functionname - else - let funcstring = a:functionname - endif - exe 'menu IM-Python.functions.'.funcstring.' :call <SID>JumpToAndUnfold('.a:lineno.')<CR>' -endfunction - - -function! s:JumpToAndUnfold(line) - " Go to the right line - execute 'normal '.a:line.'gg' - " Check to see if we are in a fold - let lvl = foldlevel(a:line) - if lvl != 0 - " and if so, then expand the fold out, other wise, ignore this part. - execute 'normal 15zo' - endif -endfunction - -"" This one will work only on vim 6.2 because of the try/catch expressions. -" function! s:JumpToAndUnfoldWithExceptions(line) -" try -" execute 'normal '.a:line.'gg15zo' -" catch /^Vim\((\a\+)\)\=:E490:/ -" " Do nothing, just consume the error -" endtry -"endfunction - - -" vim:set et sts=2 sw=2: - |