mirror of
https://github.com/junegunn/vim-easy-align.git
synced 2025-11-08 09:53:51 -05:00
Change split logic to allow advanced patterns
- \v (Fix #67) - \zs (Fix #55)
This commit is contained in:
@@ -264,11 +264,8 @@ function! s:split_line(line, nth, modes, cycle, fc, lc, pattern, stick_to_left,
|
|||||||
\ strpart(getline(a:line), a:fc - 1, a:lc - a:fc + 1) :
|
\ strpart(getline(a:line), a:fc - 1, a:lc - a:fc + 1) :
|
||||||
\ strpart(getline(a:line), a:fc - 1)
|
\ strpart(getline(a:line), a:fc - 1)
|
||||||
let idx = 0
|
let idx = 0
|
||||||
" Do not allow \zs
|
let nomagic = match(a:pattern, '\\v') > match(a:pattern, '\C\\[mMV]')
|
||||||
" 1: whole match
|
let pattern = '^.\{-}\s*\zs\('.a:pattern.(nomagic ? ')' : '\)')
|
||||||
" 2: token
|
|
||||||
" 3: delimiter
|
|
||||||
let pattern = '^\(\(.\{-}\s*\)\(' .a:pattern. '\)\s' . (a:stick_to_left ? '*' : '\{-}') . '\)'
|
|
||||||
let tokens = []
|
let tokens = []
|
||||||
let delims = []
|
let delims = []
|
||||||
|
|
||||||
@@ -277,18 +274,22 @@ function! s:split_line(line, nth, modes, cycle, fc, lc, pattern, stick_to_left,
|
|||||||
let token = ''
|
let token = ''
|
||||||
let phantom = 0
|
let phantom = 0
|
||||||
while 1
|
while 1
|
||||||
let matches = matchlist(string, pattern, idx)
|
let matchidx = match(string, pattern, idx)
|
||||||
" No match
|
" No match
|
||||||
if empty(matches) | break | endif
|
if matchidx < 0 | break | endif
|
||||||
|
let matchend = matchend(string, pattern, idx)
|
||||||
|
let spaces = matchstr(string, '\s'.(a:stick_to_left ? '*' : '\{-}'), matchend + (matchidx == matchend))
|
||||||
|
|
||||||
" Match, but empty delimiter
|
" Match, but empty
|
||||||
if empty(matches[1])
|
if len(spaces) + matchend - idx == 0
|
||||||
let char = strpart(string, idx, 1)
|
let char = strpart(string, idx, 1)
|
||||||
if empty(char) | break | endif
|
if empty(char) | break | endif
|
||||||
let [match, part, delim] = [char, char, '']
|
let [match, part, delim] = [char, char, '']
|
||||||
" Match
|
" Match
|
||||||
else
|
else
|
||||||
let [match, part, delim] = matches[1 : 3]
|
let match = strpart(string, idx, matchend - idx + len(spaces))
|
||||||
|
let part = strpart(string, idx, matchidx - idx)
|
||||||
|
let delim = strpart(string, matchidx, matchend - matchidx)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let ignorable = s:highlighted_as(a:line, idx + len(part) + a:fc, a:ignore_groups)
|
let ignorable = s:highlighted_as(a:line, idx + len(part) + a:fc, a:ignore_groups)
|
||||||
|
|||||||
@@ -212,4 +212,38 @@ Expect:
|
|||||||
aa -= bb
|
aa -= bb
|
||||||
aaa ?= bbb
|
aaa ?= bbb
|
||||||
|
|
||||||
|
* #67 \v
|
||||||
|
Given c:
|
||||||
|
bzero(&servaddr, sizeof(servaddr));
|
||||||
|
servaddr.sin_family = AF_INET;
|
||||||
|
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||||
|
servaddr.sin_port = htons(SERV_PORT);
|
||||||
|
|
||||||
|
Execute (#67 \v breaks surrounding regex):
|
||||||
|
%EasyAlign/\v(\=\s)@<=</
|
||||||
|
|
||||||
|
Expect:
|
||||||
|
bzero(&servaddr, sizeof(servaddr));
|
||||||
|
servaddr.sin_family = AF_INET;
|
||||||
|
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||||
|
servaddr.sin_port = htons(SERV_PORT);
|
||||||
|
|
||||||
|
Execute (#67 \V followed by \v shouldn't matter):
|
||||||
|
%EasyAlign/\v(\=\s)@<=<\V/
|
||||||
|
|
||||||
|
Expect:
|
||||||
|
bzero(&servaddr, sizeof(servaddr));
|
||||||
|
servaddr.sin_family = AF_INET;
|
||||||
|
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||||
|
servaddr.sin_port = htons(SERV_PORT);
|
||||||
|
|
||||||
|
Execute (#67 \zs is now allowed):
|
||||||
|
%EasyAlign/=\zs/
|
||||||
|
|
||||||
|
Expect:
|
||||||
|
bzero(&servaddr, sizeof(servaddr));
|
||||||
|
servaddr.sin_family = AF_INET;
|
||||||
|
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||||
|
servaddr.sin_port = htons(SERV_PORT);
|
||||||
|
|
||||||
Include: include/teardown.vader
|
Include: include/teardown.vader
|
||||||
|
|||||||
Reference in New Issue
Block a user