Permalink
Browse files

Merge branch 'release/0.6.8'

  • Loading branch information...
2 parents 49ae47e + e1311f5 commit e4a72d7614e376342f67cb5fec02b3ee1fd7a6ad @klen committed Sep 6, 2012
Showing with 232 additions and 50 deletions.
  1. +4 −0 Changelog.rst
  2. +8 −6 README.rst
  3. +14 −0 after/indent/python.vim
  4. +184 −0 autoload/pymode/indent.vim
  5. +10 −21 doc/pymode.txt
  6. +1 −15 ftplugin/python/pymode.vim
  7. +6 −6 plugin/pymode.vim
  8. +5 −2 pylibs/autopep8.py
View
4 Changelog.rst
@@ -1,6 +1,10 @@
Changelog
=========
+## 2012-09-06 0.6.8
+-------------------
+* Add PEP8 indentation ":help 'pymode_indent'"
+
## 2012-08-15 0.6.7
-------------------
* Fix documentation. Thanks (c) bgrant;
View
14 README.rst
@@ -287,11 +287,11 @@ Default values: ::
" Autoremove unused whitespaces
let g:pymode_utils_whitespaces = 1
- " Set default pymode python indent options
- let g:pymode_options_indent = 1
+ " Enable pymode indentation
+ let g:pymode_indent = 1
- " Set default pymode python other options
- let g:pymode_options_other = 1
+ " Set default pymode python options
+ let g:pymode_options = 1
Syntax highlight
@@ -478,6 +478,10 @@ Copyright (C) 2012 Kirill Klenov (klen_)
Copyright (c) 2010 Dmitry Vasiliev
http://www.hlabs.spb.ru/vim/python.vim
+ **PEP8 VIM indentation**
+ Copyright (c) 2012 Hynek Schlawack <hs@ox.cx>
+ http://github.com/hynek/vim-python-pep8-indent
+
License
=======
@@ -488,8 +492,6 @@ If you like this plugin, you can send me postcard :)
My address is here: "Russia, 143401, Krasnogorsk, Shkolnaya 1-19" to "Kirill Klenov".
**Thanks for support!**
-Version 0.6.5: I still haven't received any postcard, guys :(
-
.. _GNU lesser general public license: http://www.gnu.org/copyleft/lesser.html
.. _klen: http://klen.github.com/
View
14 after/indent/python.vim
@@ -0,0 +1,14 @@
+if pymode#Default('b:pymode_indent', 1) || !g:pymode_indent
+ finish
+endif
+
+
+setlocal nolisp
+setlocal tabstop=4
+setlocal softtabstop=4
+setlocal shiftwidth=4
+setlocal shiftround
+setlocal expandtab
+setlocal autoindent
+setlocal indentexpr=pymode#indent#Indent(v:lnum)
+setlocal indentkeys=!^F,o,O,<:>,0),0],0},=elif,=except
View
184 autoload/pymode/indent.vim
@@ -0,0 +1,184 @@
+" PEP8 compatible Python indent file
+" Language: Python
+" Maintainer: Hynek Schlawack <hs@ox.cx>
+" Prev Maintainer: Eric Mc Sween <em@tomcom.de> (address invalid)
+" Original Author: David Bustos <bustos@caltech.edu> (address invalid)
+" Last Change: 2012-06-21
+" License: Public Domainlet
+
+
+function! pymode#indent#Indent(lnum)
+
+ " First line has indent 0
+ if a:lnum == 1
+ return 0
+ endif
+
+ " If we can find an open parenthesis/bracket/brace, line up with it.
+ call cursor(a:lnum, 1)
+ let parlnum = s:SearchParensPair()
+ if parlnum > 0
+ let parcol = col('.')
+ let closing_paren = match(getline(a:lnum), '^\s*[])}]') != -1
+ if match(getline(parlnum), '[([{]\s*$', parcol - 1) != -1
+ if closing_paren
+ return indent(parlnum)
+ else
+ return indent(parlnum) + &shiftwidth
+ endif
+ else
+ return parcol
+ endif
+ endif
+
+ " Examine this line
+ let thisline = getline(a:lnum)
+ let thisindent = indent(a:lnum)
+
+ " If the line starts with 'elif' or 'else', line up with 'if' or 'elif'
+ if thisline =~ '^\s*\(elif\|else\)\>'
+ let bslnum = s:BlockStarter(a:lnum, '^\s*\(if\|elif\)\>')
+ if bslnum > 0
+ return indent(bslnum)
+ else
+ return -1
+ endif
+ endif
+
+ " If the line starts with 'except' or 'finally', line up with 'try'
+ " or 'except'
+ if thisline =~ '^\s*\(except\|finally\)\>'
+ let bslnum = s:BlockStarter(a:lnum, '^\s*\(try\|except\)\>')
+ if bslnum > 0
+ return indent(bslnum)
+ else
+ return -1
+ endif
+ endif
+
+ " Examine previous line
+ let plnum = a:lnum - 1
+ let pline = getline(plnum)
+ let sslnum = s:StatementStart(plnum)
+
+ " If the previous line is blank, keep the same indentation
+ if pline =~ '^\s*$'
+ return -1
+ endif
+
+ " If this line is explicitly joined, try to find an indentation that looks
+ " good.
+ if pline =~ '\\$'
+ let compound_statement = '^\s*\(if\|while\|for\s.*\sin\|except\)\s*'
+ let maybe_indent = matchend(getline(sslnum), compound_statement)
+ if maybe_indent != -1
+ return maybe_indent
+ else
+ return indent(sslnum) + &sw * 2
+ endif
+ endif
+
+ " If the previous line ended with a colon and is not a comment, indent
+ " relative to statement start.
+ if pline =~ ':\s*$' && pline !~ '^\s*#'
+ return indent(sslnum) + &sw
+ endif
+
+ " If the previous line was a stop-execution statement or a pass
+ if getline(sslnum) =~ '^\s*\(break\|continue\|raise\|return\|pass\)\>'
+ " See if the user has already dedented
+ if indent(a:lnum) > indent(sslnum) - &sw
+ " If not, recommend one dedent
+ return indent(sslnum) - &sw
+ endif
+ " Otherwise, trust the user
+ return -1
+ endif
+
+ " In all other cases, line up with the start of the previous statement.
+ return indent(sslnum)
+endfunction
+
+
+" Find backwards the closest open parenthesis/bracket/brace.
+function! s:SearchParensPair()
+ let line = line('.')
+ let col = col('.')
+
+ " Skip strings and comments and don't look too far
+ let skip = "line('.') < " . (line - 50) . " ? dummy :" .
+ \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? ' .
+ \ '"string\\|comment"'
+
+ " Search for parentheses
+ call cursor(line, col)
+ let parlnum = searchpair('(', '', ')', 'bW', skip)
+ let parcol = col('.')
+
+ " Search for brackets
+ call cursor(line, col)
+ let par2lnum = searchpair('\[', '', '\]', 'bW', skip)
+ let par2col = col('.')
+
+ " Search for braces
+ call cursor(line, col)
+ let par3lnum = searchpair('{', '', '}', 'bW', skip)
+ let par3col = col('.')
+
+ " Get the closest match
+ if par2lnum > parlnum || (par2lnum == parlnum && par2col > parcol)
+ let parlnum = par2lnum
+ let parcol = par2col
+ endif
+ if par3lnum > parlnum || (par3lnum == parlnum && par3col > parcol)
+ let parlnum = par3lnum
+ let parcol = par3col
+ endif
+
+ " Put the cursor on the match
+ if parlnum > 0
+ call cursor(parlnum, parcol)
+ endif
+ return parlnum
+endfunction
+
+
+" Find the start of a multi-line statement
+function! s:StatementStart(lnum)
+ let lnum = a:lnum
+ while 1
+ if getline(lnum - 1) =~ '\\$'
+ let lnum = lnum - 1
+ else
+ call cursor(lnum, 1)
+ let maybe_lnum = s:SearchParensPair()
+ if maybe_lnum < 1
+ return lnum
+ else
+ let lnum = maybe_lnum
+ endif
+ endif
+ endwhile
+endfunction
+
+
+" Find the block starter that matches the current line
+function! s:BlockStarter(lnum, block_start_re)
+ let lnum = a:lnum
+ let maxindent = 10000 " whatever
+ while lnum > 1
+ let lnum = prevnonblank(lnum - 1)
+ if indent(lnum) < maxindent
+ if getline(lnum) =~ a:block_start_re
+ return lnum
+ else
+ let maxindent = indent(lnum)
+ " It's not worth going further if we reached the top level
+ if maxindent == 0
+ return -1
+ endif
+ endif
+ endif
+ endwhile
+ return -1
+endfunction
View
31 doc/pymode.txt
@@ -6,7 +6,7 @@
(__) (__) (__) (_) (_)(_____)(_)\_) (_/\/\_)(_____)(____/(____) ~
- Version: 0.6.7
+ Version: 0.6.8
==============================================================================
CONTENTS *Python-mode-contents*
@@ -100,10 +100,9 @@ PythonMode. These options should be set in your vimrc.
|'pymode_syntax'| Turns off the custom syntax highlighting
-|'pymode_options_indent'| Set default pymode options for
- python indentation
+|'pymode_indent'| Enable/Disable pymode PEP8 indentation
-|'pymode_options_other'| Set default pymode options for
+|'pymode_options'| Set default pymode options for
python codding
|'pymode_motion'| Enable pymode motion stuff
@@ -346,24 +345,12 @@ If this option is set to 0 then the custom syntax highlighting will
not be used.
------------------------------------------------------------------------------
- *'pymode_options_indent'*
+ *'pymode_indent'*
Values: 0 or 1.
Default: 1.
-If this option is set to 1, pymode will enable the following options for python
-buffers: >
+If this option is set to 1, pymode will enable python indentation support
- setlocal cinwords=if,elif,else,for,while,try,except,finally,def,class
- setlocal cindent
- setlocal tabstop=4
- setlocal softtabstop=4
- setlocal shiftwidth=4
- setlocal shiftround
- setlocal smartindent
- setlocal smarttab
- setlocal expandtab
- setlocal autoindent
-<
------------------------------------------------------------------------------
*'pymode_folding'*
Values: 0 or 1.
@@ -372,7 +359,7 @@ Default: 1.
If this option is set to 1, pymode will enable python-folding.
------------------------------------------------------------------------------
- *'pymode_options_other'*
+ *'pymode_options'*
Values: 0 or 1.
Default: 1.
@@ -535,6 +522,10 @@ from `.vimrc` from your projects directories.
Copyright (c) 2010 Dmitry Vasiliev
http://www.hlabs.spb.ru/vim/python.vim
+ PEP8 VIM indentation
+ Copyright (c) 2012 Hynek Schlawack <hs@ox.cx>
+ http://github.com/hynek/vim-python-pep8-indent
+
==============================================================================
7. License ~
@@ -547,8 +538,6 @@ If you like this plugin, you can send me a postcard :)
My address is: "Russia, 143401, Krasnogorsk, Shkolnaya 1-19" to "Kirill Klenov".
Thanks for your support!
-Version 0.6.5: I still haven't received any postcards, guys :(
-
------------------------------------------------------------------------------
View
16 ftplugin/python/pymode.vim
@@ -15,22 +15,8 @@ endif
" Options {{{
-" Python indent options
-if pymode#Option('options_indent')
- setlocal cinwords=if,elif,else,for,while,try,except,finally,def,class
- setlocal cindent
- setlocal tabstop=4
- setlocal softtabstop=4
- setlocal shiftwidth=4
- setlocal shiftround
- setlocal smartindent
- setlocal smarttab
- setlocal expandtab
- setlocal autoindent
-endif
-
" Python other options
-if pymode#Option('options_other')
+if pymode#Option('options')
setlocal complete+=t
setlocal formatoptions-=t
if v:version > 702 && !&relativenumber
View
12 plugin/pymode.vim
@@ -1,4 +1,4 @@
-let g:pymode_version = "0.6.7"
+let g:pymode_version = "0.6.8"
com! PymodeVersion echomsg "Current python-mode version: " . g:pymode_version
@@ -281,13 +281,13 @@ call pymode#Default("g:pymode_folding", 1)
" OPTION: g:pymode_syntax -- bool. Enable python-mode syntax for pyfiles.
call pymode#Default("g:pymode_syntax", 1)
+" OPTION: g:pymode_indent -- bool. Enable/Disable pymode PEP8 indentation
+call pymode#Default("g:pymode_indent", 1)
+
" OPTION: g:pymode_utils_whitespaces -- bool. Remove unused whitespaces on save
call pymode#Default("g:pymode_utils_whitespaces", 1)
-" OPTION: g:pymode_options_indent -- bool. To set indent options.
-call pymode#Default("g:pymode_options_indent", 1)
-
-" OPTION: g:pymode_options_other -- bool. To set other options.
-call pymode#Default("g:pymode_options_other", 1)
+" OPTION: g:pymode_options -- bool. To set some python options.
+call pymode#Default("g:pymode_options", 1)
" vim: fdm=marker:fdl=0
View
7 pylibs/autopep8.py
@@ -49,7 +49,7 @@
pep8 = None
-__version__ = '0.7.3'
+__version__ = '0.8'
PEP8_BIN = 'pep8'
@@ -1580,4 +1580,7 @@ def main():
if __name__ == '__main__':
- sys.exit(main())
+ try:
+ sys.exit(main())
+ except KeyboardInterrupt:
+ sys.exit(1)

0 comments on commit e4a72d7

Please sign in to comment.