Skip to content

Commit f0fedf6

Browse files
committed
Improve indent for try statement
1 parent 06c33bc commit f0fedf6

2 files changed

Lines changed: 98 additions & 7 deletions

File tree

indent/python.vim

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
" Vim indent file
22
" Language: Python
33
" Author: Akinori Hattori <hattya@gmail.com>
4-
" Last Change: 2023-07-13
4+
" Last Change: 2023-07-17
55
" License: MIT License
66

77
if exists('b:did_indent')
@@ -135,6 +135,8 @@ function! GetPEP8PythonIndent() abort
135135
let kw = s:matchkw(ll)
136136
if kw ==# ''
137137
let ind += s:cont()
138+
elseif kw =~# 'except'
139+
let ind += len(substitute(kw, '\s\+', '', '')) + 1
138140
else
139141
let ind += len(substitute(kw, '\s\+', ' ', '')) + 1
140142
endif
@@ -181,7 +183,7 @@ function! s:is_compound_stmt(str, ...) abort
181183
endfunction
182184

183185
function! s:matchkw(str) abort
184-
return matchstr(a:str, '\v^\s*\zs<%(assert|del|return|yield%(\s+from)=|raise|import|from|global|nonlocal|if|elif|while|for|except|with|match|case|def|class)>')
186+
return matchstr(a:str, '\v^\s*\zs<%(%(assert|del|return|yield%(\s+from)=|raise|import|from|global|nonlocal|if|elif|while|for|with|match|case|def|class)>|except>%(\s*\*)=)')
185187
endfunction
186188

187189
function! s:cont() abort

test/indent.vimspec

Lines changed: 94 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -691,66 +691,109 @@ Describe filetype indent
691691
Describe try statement
692692
It aligns with left brackets
693693
let in = "try:\<CR>...\<CR>"
694-
let in .= "except (TypeError,\<CR>ValueError):"
694+
let in .= "except (TypeError,\<CR>ValueError):\<CR>pass\<CR>"
695+
let in .= "try:\<CR>...\<CR>"
696+
let in .= "except* (TypeError,\<CR>ValueError):"
695697
let out = [
696698
\ 'try:',
697699
\ ' ...',
698700
\ 'except (TypeError,',
699701
\ ' ValueError):',
702+
\ ' pass',
703+
\ 'try:',
704+
\ ' ...',
705+
\ 'except* (TypeError,',
706+
\ ' ValueError):',
700707
\]
701708
Assert Equals(Insert(in), Buffer(out))
702709
End
703710

704711
It increases the indent level by 2
705712
let b:python_indent_multiline_statement = 1
706713
let in = "try:\<CR>...\<CR>"
707-
let in .= "except (TypeError,\<CR>ValueError):"
714+
let in .= "except (TypeError,\<CR>ValueError):\<CR>pass\<CR>"
715+
let in .= "try:\<CR>...\<CR>"
716+
let in .= "except* (TypeError,\<CR>ValueError):"
708717
let out = [
709718
\ 'try:',
710719
\ ' ...',
711720
\ 'except (TypeError,',
712721
\ ' ValueError):',
722+
\ ' pass',
723+
\ 'try:',
724+
\ ' ...',
725+
\ 'except* (TypeError,',
726+
\ ' ValueError):',
713727
\]
714728
Assert Equals(Insert(in), Buffer(out))
715729
End
716730

717731
It increases the indent level (hanging indent)
718732
let in = "try:\<CR>...\<CR>"
719-
let in .= "except (\<CR>TypeError,\<CR>ValueError\<CR>):"
733+
let in .= "except (\<CR>TypeError,\<CR>ValueError\<CR>):\<CR>pass\<CR>"
734+
let in .= "try:\<CR>...\<CR>"
735+
let in .= "except* (\<CR>TypeError,\<CR>ValueError\<CR>):"
720736
let out = [
721737
\ 'try:',
722738
\ ' ...',
723739
\ 'except (',
724740
\ ' TypeError,',
725741
\ ' ValueError',
726742
\ '):',
743+
\ ' pass',
744+
\ 'try:',
745+
\ ' ...',
746+
\ 'except* (',
747+
\ ' TypeError,',
748+
\ ' ValueError',
749+
\ '):',
727750
\]
728751
Assert Equals(Insert(in), Buffer(out))
729752
End
730753

731754
It increases the indent level by 2 (hanging indent)
732755
let b:python_indent_multiline_statement = 1
733756
let in = "try:\<CR>...\<CR>"
734-
let in .= "except (\<CR>TypeError,\<CR>ValueError\<CR>):"
757+
let in .= "except (\<CR>TypeError,\<CR>ValueError\<CR>):\<CR>pass\<CR>"
758+
let in .= "try:\<CR>...\<CR>"
759+
let in .= "except* (\<CR>TypeError,\<CR>ValueError\<CR>):"
735760
let out = [
736761
\ 'try:',
737762
\ ' ...',
738763
\ 'except (',
739764
\ ' TypeError,',
740765
\ ' ValueError',
741766
\ '):',
767+
\ ' pass',
768+
\ 'try:',
769+
\ ' ...',
770+
\ 'except* (',
771+
\ ' TypeError,',
772+
\ ' ValueError',
773+
\ '):',
742774
\]
743775
Assert Equals(Insert(in), Buffer(out))
744776
End
745777

746778
It increases the indent level (line continueation)
747779
let in = "try:\<CR>...\<CR>"
748-
let in .= "except TypeError, \\\<CR>ValueError:"
780+
let in .= "except TypeError, \\\<CR>ValueError:\<CR>pass\<CR>"
781+
let in .= "try:\<CR>...\<CR>"
782+
let in .= "except* TypeError, \\\<CR>ValueError:\<CR>pass\<CR>"
783+
let in .= "except * \\\<CR>OSError:"
749784
let out = [
750785
\ 'try:',
751786
\ ' ...',
752787
\ 'except TypeError, \',
753788
\ ' ValueError:',
789+
\ ' pass',
790+
\ 'try:',
791+
\ ' ...',
792+
\ 'except* TypeError, \',
793+
\ ' ValueError:',
794+
\ ' pass',
795+
\ 'except * \',
796+
\ ' OSError:',
754797
\]
755798
Assert Equals(Insert(in), Buffer(out))
756799
End
@@ -771,10 +814,29 @@ Describe filetype indent
771814
Assert Equals(Insert(in), Buffer(out))
772815
End
773816

817+
It indents the except* clause
818+
let in = "try:\<CR>"
819+
let in .= "try:\<CR>...\<CR>"
820+
let in .= "except* TypeError:\<CR>pass\<CR>"
821+
let in .= "except* ValueError:"
822+
let out = [
823+
\ 'try:',
824+
\ ' try:',
825+
\ ' ...',
826+
\ ' except* TypeError:',
827+
\ ' pass',
828+
\ ' except* ValueError:',
829+
\]
830+
Assert Equals(Insert(in), Buffer(out))
831+
End
832+
774833
It indents the else clause
775834
let in = "try:\<CR>"
776835
let in .= "try:\<CR>...\<CR>"
777836
let in .= "except TypeError:\<CR>pass\<CR>"
837+
let in .= "else:\<CR>pass\<CR>"
838+
let in .= "try:\<CR>...\<CR>"
839+
let in .= "except* TypeError:\<CR>pass\<CR>"
778840
let in .= "else:"
779841
let out = [
780842
\ 'try:',
@@ -783,6 +845,12 @@ Describe filetype indent
783845
\ ' except TypeError:',
784846
\ ' pass',
785847
\ ' else:',
848+
\ ' pass',
849+
\ ' try:',
850+
\ ' ...',
851+
\ ' except* TypeError:',
852+
\ ' pass',
853+
\ ' else:',
786854
\]
787855
Assert Equals(Insert(in), Buffer(out))
788856
End
@@ -792,10 +860,17 @@ Describe filetype indent
792860
let in .= "try:\<CR>...\<CR>"
793861
let in .= "except TypeError:\<CR>pass\<CR>"
794862
let in .= "finally:\<CR>pass\<CR>"
863+
let in .= "try:\<CR>...\<CR>"
864+
let in .= "except* TypeError:\<CR>pass\<CR>"
865+
let in .= "finally:\<CR>pass\<CR>"
795866
let in .= "finally:\<CR>"
796867
let in .= "try:\<CR>...\<CR>"
797868
let in .= "except ValueError:\<CR>pass\<CR>"
798869
let in .= "else:\<CR>pass\<CR>"
870+
let in .= "finally:\<CR>pass\<CR>"
871+
let in .= "try:\<CR>...\<CR>"
872+
let in .= "except* ValueError:\<CR>pass\<CR>"
873+
let in .= "else:\<CR>pass\<CR>"
799874
let in .= "finally:"
800875
let out = [
801876
\ 'try:',
@@ -805,6 +880,12 @@ Describe filetype indent
805880
\ ' pass',
806881
\ ' finally:',
807882
\ ' pass',
883+
\ ' try:',
884+
\ ' ...',
885+
\ ' except* TypeError:',
886+
\ ' pass',
887+
\ ' finally:',
888+
\ ' pass',
808889
\ 'finally:',
809890
\ ' try:',
810891
\ ' ...',
@@ -813,6 +894,14 @@ Describe filetype indent
813894
\ ' else:',
814895
\ ' pass',
815896
\ ' finally:',
897+
\ ' pass',
898+
\ ' try:',
899+
\ ' ...',
900+
\ ' except* ValueError:',
901+
\ ' pass',
902+
\ ' else:',
903+
\ ' pass',
904+
\ ' finally:',
816905
\]
817906
Assert Equals(Insert(in), Buffer(out))
818907
End

0 commit comments

Comments
 (0)