Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit30449e9

Browse files
authored
Support whole word transform on tabstop and variable (#232)
* Support whole word transform: capitalize, downcase, upcase* Support additional text with whole word transform* Update parser to support format: camelcase, pascalcase* Refactor node/transform formatters* Support whole word transform: camelcase, pascalcase
1 parent60ee203 commit30449e9

File tree

7 files changed

+176
-3
lines changed

7 files changed

+176
-3
lines changed

‎autoload/vsnip/snippet.vim‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ function! s:Snippet.sync() abort
200200
calladd(self.targets, {
201201
\'range':a:context.range,
202202
\'node':a:context.node,
203-
\'new_text':self.new_texts[a:context.node.id],
203+
\'new_text':a:context.node.transform.text(self.new_texts[a:context.node.id]),
204204
\})
205205
endif
206206
endif

‎autoload/vsnip/snippet/node.vim‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
lets:Placeholder=vsnip#snippet#node#placeholder#import()
22
lets:Variable=vsnip#snippet#node#variable#import()
33
lets:Text=vsnip#snippet#node#text#import()
4+
lets:Transform=vsnip#snippet#node#transform#import()
45

56
"
67
" vsnip#snippet#node#create_from_ast
@@ -33,3 +34,10 @@ function! vsnip#snippet#node#create_text(text) abort
3334
\'escaped':a:text
3435
\})
3536
endfunction
37+
38+
"
39+
" vsnip#snippet#node#create_transform
40+
"
41+
function!vsnip#snippet#node#create_transform(transform)abort
42+
returns:Transform.new(a:transform)
43+
endfunction

‎autoload/vsnip/snippet/node/placeholder.vim‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ function! s:Placeholder.new(ast) abort
2121
\'follower':v:false,
2222
\'choice':get(a:ast,'choice', []),
2323
\'children':vsnip#snippet#node#create_from_ast(get(a:ast,'children', [])),
24+
\'transform':vsnip#snippet#node#create_transform(get(a:ast,'transform')),
2425
\})
2526

2627
ifl:node.is_final
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
function!vsnip#snippet#node#transform#import()abort
2+
returns:Transform
3+
endfunction
4+
5+
lets:Transform= {}
6+
7+
function!s:upcase(word)
8+
let word=toupper(a:word)
9+
return word
10+
endfunction
11+
12+
function!s:downcase(word)
13+
let word=tolower(a:word)
14+
return word
15+
endfunction
16+
17+
function!s:capitalize(word)
18+
let word=s:upcase(strpart(a:word,0,1)) .strpart(a:word,1)
19+
return word
20+
endfunction
21+
22+
" https://github.com/tpope/vim-abolish/blob/3f0c8faa/plugin/abolish.vim#L111-L118
23+
function!s:camelcase(word)
24+
let word=substitute(a:word,'-','_','g')
25+
if word!~#'_'&& word=~#'\l'
26+
returnsubstitute(word,'^.','\l&','')
27+
else
28+
returnsubstitute(word,'\C\(_\)\=\(.\)','\=submatch(1)==""?tolower(submatch(2)) : toupper(submatch(2))','g')
29+
endif
30+
endfunction
31+
32+
"
33+
" new.
34+
"
35+
function!s:Transform.new(ast)abort
36+
letl:transform=empty(a:ast) ? {} :a:ast
37+
38+
letl:node=extend(deepcopy(s:Transform), {
39+
\'type':'transform',
40+
\'regex':get(l:transform,'regex',v:null),
41+
\'replacements':get(l:transform,'format', []),
42+
\'options':get(l:transform,'option', []),
43+
\})
44+
45+
letl:node.is_noop=l:node.regexisv:null
46+
47+
returnl:node
48+
endfunction
49+
50+
"
51+
" text.
52+
"
53+
function!s:Transform.text(input_text)abort
54+
ifempty(a:input_text)||self.is_noop
55+
returna:input_text
56+
endif
57+
58+
ifself.regex.pattern!=#'(.*)'
59+
" TODO: fully support regex
60+
returna:input_text
61+
endif
62+
63+
letl:text=''
64+
65+
forl:replacementinself.replacements
66+
ifl:replacement.type==#'format'
67+
ifl:replacement.modifier==#'/capitalize'
68+
letl:text.=s:capitalize(a:input_text)
69+
elseifl:replacement.modifier==#'/downcase'
70+
letl:text.=s:downcase(a:input_text)
71+
elseifl:replacement.modifier==#'/upcase'
72+
letl:text.=s:upcase(a:input_text)
73+
elseifl:replacement.modifier==#'/camelcase'
74+
letl:text.=s:camelcase(a:input_text)
75+
elseifl:replacement.modifier==#'/pascalcase'
76+
letl:text.=s:capitalize(s:camelcase(a:input_text))
77+
endif
78+
elseifl:replacement.type==#'text'
79+
letl:text.=l:replacement.escaped
80+
endif
81+
endfor
82+
83+
returnl:text
84+
endfunction
85+
86+
"
87+
" to_string
88+
"
89+
function!s:Transform.to_string()abort
90+
ifself.is_noop
91+
return
92+
end
93+
94+
returnprintf('%s(regex=%s, total_replacements=%s, options=%s)',
95+
\self.type,
96+
\get(self.regex,'pattern',''),
97+
\len(self.replacements),
98+
\join(self.options,''),
99+
\)
100+
endfunction

‎autoload/vsnip/snippet/node/variable.vim‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,23 @@ function! s:Variable.new(ast) abort
2323
\'unknown':empty(l:resolver),
2424
\'resolver':l:resolver,
2525
\'children':vsnip#snippet#node#create_from_ast(get(a:ast,'children', [])),
26+
\'transform':vsnip#snippet#node#create_transform(get(a:ast,'transform')),
2627
\})
2728
endfunction
2829

2930
"
3031
" text.
3132
"
3233
function!s:Variable.text()abort
33-
returnjoin(map(copy(self.children),'v:val.text()'),'')
34+
returnself.transform.text(join(map(copy(self.children),'v:val.text()'),''))
3435
endfunction
3536

3637
"
3738
" resolve.
3839
"
3940
function!s:Variable.resolve(context)abort
4041
if!self.unknown
41-
letl:resolved=self.resolver.func({'node':self })
42+
letl:resolved=self.transform.text(self.resolver.func({'node':self }))
4243
ifl:resolvedisnotv:null
4344
" Fix indent when one variable returns multiple lines
4445
letl:base_indent=vsnip#indent#get_base_indent(split(a:context.before_text,"\n",v:true)[-1])

‎autoload/vsnip/snippet/parser.vim‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ let s:format3 = s:map(
8282
\s:token('/upcase'),
8383
\s:token('/downcase'),
8484
\s:token('/capitalize'),
85+
\s:token('/camelcase'),
86+
\s:token('/pascalcase'),
8587
\s:token('+if'),
8688
\s:token('?if:else'),
8789
\s:token('-else'),

‎spec/autoload/vsnip/snippet.vimspec‎

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ Describe vsnip#snippet
3131
let l:snippet = s:Snippet.new(s:start_position, 'console.log(${CURRENT_YEAR})')
3232
call s:expect(l:snippet.text()).to_equal('console.log(' . strftime('%Y') . ')')
3333
End
34+
35+
It should support whole word transform
36+
let l:snippet = s:Snippet.new(s:start_position, '${1:state}, set${1/(.*)/${1:/capitalize}/}')
37+
call s:expect(l:snippet.text()).to_equal('state, setState')
38+
End
3439
End
3540

3641
Describe #sync
@@ -259,6 +264,62 @@ Describe vsnip#snippet
259264
call s:expect(l:snippet.text()).to_equal('default')
260265
End
261266

267+
It should support whole word transform (upcase) on tabstop
268+
let l:snippet = s:Snippet.new(s:start_position, '${1:varName}, ${1/(.*)/${1:/upcase}/}')
269+
call s:expect(l:snippet.text()).to_equal('varName, VARNAME')
270+
End
271+
272+
It should support whole word transform (downcase) on variable
273+
call vsnip#selected_text('varName')
274+
let l:snippet = s:Snippet.new(s:start_position, '${TM_SELECTED_TEXT/(.*)/${1:/downcase}/}')
275+
call s:expect(l:snippet.text()).to_equal('varname')
276+
End
277+
278+
It should support whole word transform (capitalize)
279+
call vsnip#selected_text('varName')
280+
let l:snippet = s:Snippet.new(s:start_position, '${TM_SELECTED_TEXT/(.*)/${1:/capitalize}/}')
281+
call s:expect(l:snippet.text()).to_equal('VarName')
282+
End
283+
284+
It should support whole word transform (camelcase)
285+
call vsnip#selected_text('var_name')
286+
call s:expect(
287+
\ s:Snippet.new(s:start_position, '${TM_SELECTED_TEXT/(.*)/${1:/camelcase}/}').text()
288+
\ ).to_equal('varName')
289+
290+
call vsnip#selected_text('VAR_NAME')
291+
call s:expect(
292+
\ s:Snippet.new(s:start_position, '${TM_SELECTED_TEXT/(.*)/${1:/camelcase}/}').text()
293+
\ ).to_equal('varName')
294+
295+
call vsnip#selected_text('VarName')
296+
call s:expect(
297+
\ s:Snippet.new(s:start_position, '${TM_SELECTED_TEXT/(.*)/${1:/camelcase}/}').text()
298+
\ ).to_equal('varName')
299+
End
300+
301+
It should support whole word transform (pascalcase)
302+
call vsnip#selected_text('var_name')
303+
call s:expect(
304+
\ s:Snippet.new(s:start_position, '${TM_SELECTED_TEXT/(.*)/${1:/pascalcase}/}').text()
305+
\ ).to_equal('VarName')
306+
307+
call vsnip#selected_text('VAR_NAME')
308+
call s:expect(
309+
\ s:Snippet.new(s:start_position, '${TM_SELECTED_TEXT/(.*)/${1:/pascalcase}/}').text()
310+
\ ).to_equal('VarName')
311+
312+
call vsnip#selected_text('varName')
313+
call s:expect(
314+
\ s:Snippet.new(s:start_position, '${TM_SELECTED_TEXT/(.*)/${1:/pascalcase}/}').text()
315+
\ ).to_equal('VarName')
316+
End
317+
318+
It should support whole word transform with additional text
319+
call vsnip#selected_text('varName')
320+
let l:snippet = s:Snippet.new(s:start_position, '${TM_SELECTED_TEXT/(.*)/start-lowercase-${1:/downcase}/}-end')
321+
call s:expect(l:snippet.text()).to_equal('start-lowercase-varname-end')
322+
End
262323
End
263324

264325
Describe #range

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp