Skip to content

Commit 1ba62c6

Browse files
committed
Python: Prioritize closest viable bracket
That way, the order of nesting {, [, or ( doesn't matter. Strings are still a bit of a pain.
1 parent d6e48fb commit 1ba62c6

3 files changed

Lines changed: 60 additions & 3 deletions

File tree

autoload/sj/python.vim

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,23 @@ function! sj#python#JoinStatement()
1919
endif
2020
endfunction
2121

22+
function! sj#python#SplitBracketedItem() abort
23+
let closest_bracket_line = search('[{([]', 'bcW', line('.'), 0, s:skip)
24+
if closest_bracket_line <= 0
25+
return
26+
endif
27+
28+
let bracket = getline('.')[col('.') - 1]
29+
30+
if bracket == '('
31+
return sj#python#SplitTuple()
32+
elseif bracket == '['
33+
return sj#python#SplitArray()
34+
elseif bracket == '{'
35+
return sj#python#SplitDict()
36+
endif
37+
endfunction
38+
2239
function! sj#python#SplitDict()
2340
let [from, to] = sj#LocateBracesAroundCursor('{', '}', ['pythonString'])
2441

ftplugin/python/splitjoin.vim

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@ if !exists('b:splitjoin_split_callbacks')
22
let b:splitjoin_split_callbacks = [
33
\ 'sj#python#SplitString',
44
\ 'sj#python#SplitListComprehension',
5-
\ 'sj#python#SplitDict',
6-
\ 'sj#python#SplitTuple',
75
\ 'sj#python#SplitArgs',
6+
\ 'sj#python#SplitBracketedItem',
87
\ 'sj#python#SplitAssignment',
98
\ 'sj#python#SplitTernaryAssignment',
10-
\ 'sj#python#SplitArray',
119
\ 'sj#python#SplitStatement',
1210
\ 'sj#python#SplitImport',
1311
\ ]

spec/plugin/python_spec.rb

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,48 @@ def example():
360360
EOF
361361
end
362362

363+
specify "split prioritization based on cursor position" do
364+
set_file_contents "spam = {'spam': [1, 2, 3], 'spam, spam': mix('eggs', 'ham')}"
365+
366+
vim.search('{')
367+
split
368+
369+
assert_file_contents <<~EOF
370+
spam = {
371+
'spam': [1, 2, 3],
372+
'spam, spam': mix('eggs', 'ham')
373+
}
374+
EOF
375+
join
376+
377+
vim.search('[')
378+
split
379+
380+
assert_file_contents <<~EOF
381+
spam = {'spam': [1,
382+
2,
383+
3], 'spam, spam': mix('eggs', 'ham')}
384+
EOF
385+
join
386+
387+
vim.search('mix(')
388+
split
389+
390+
assert_file_contents <<~EOF
391+
spam = {'spam': [1, 2, 3], 'spam, spam': mix('eggs',
392+
'ham')}
393+
EOF
394+
join
395+
396+
vim.search('(')
397+
split
398+
399+
assert_file_contents <<~EOF
400+
spam = {'spam': [1, 2, 3], 'spam, spam': mix('eggs',
401+
'ham')}
402+
EOF
403+
end
404+
363405
describe "strings" do
364406
it "joins ''' strings into single-quoted strings" do
365407
set_file_contents <<~EOF

0 commit comments

Comments
 (0)