mirror of
https://github.com/mattn/emmet-vim.git
synced 2025-12-11 04:51:52 +08:00
Add user-defined dollar expression (Merged tang3w's awesome commits)
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
"=============================================================================
|
"=============================================================================
|
||||||
" zencoding.vim
|
" zencoding.vim
|
||||||
" Author: Yasuhiro Matsumoto <mattn.jp@gmail.com>
|
" Author: Yasuhiro Matsumoto <mattn.jp@gmail.com>
|
||||||
" Last Change: 03-Jun-2013.
|
" Last Change: 06-Jun-2013.
|
||||||
|
|
||||||
let s:save_cpo = &cpo
|
let s:save_cpo = &cpo
|
||||||
set cpo&vim
|
set cpo&vim
|
||||||
@@ -101,7 +101,7 @@ function! zencoding#parseIntoTree(abbr, type)
|
|||||||
return zencoding#lang#{rtype}#parseIntoTree(abbr, type)
|
return zencoding#lang#{rtype}#parseIntoTree(abbr, type)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:mergeConfig(lhs, rhs)
|
function! zencoding#mergeConfig(lhs, rhs)
|
||||||
if type(a:lhs) == 3 && type(a:rhs) == 3
|
if type(a:lhs) == 3 && type(a:rhs) == 3
|
||||||
let a:lhs += a:rhs
|
let a:lhs += a:rhs
|
||||||
if len(a:lhs)
|
if len(a:lhs)
|
||||||
@@ -119,7 +119,7 @@ function! s:mergeConfig(lhs, rhs)
|
|||||||
let a:lhs[key] += a:rhs[key]
|
let a:lhs[key] += a:rhs[key]
|
||||||
elseif type(a:rhs[key]) == 4
|
elseif type(a:rhs[key]) == 4
|
||||||
if has_key(a:lhs, key)
|
if has_key(a:lhs, key)
|
||||||
call s:mergeConfig(a:lhs[key], a:rhs[key])
|
call zencoding#mergeConfig(a:lhs[key], a:rhs[key])
|
||||||
else
|
else
|
||||||
let a:lhs[key] = a:rhs[key]
|
let a:lhs[key] = a:rhs[key]
|
||||||
endif
|
endif
|
||||||
@@ -166,7 +166,6 @@ function! zencoding#toString(...)
|
|||||||
let dollar_expr = zencoding#getResource(type, 'dollar_expr', 1)
|
let dollar_expr = zencoding#getResource(type, 'dollar_expr', 1)
|
||||||
let itemno = 0
|
let itemno = 0
|
||||||
let str = ''
|
let str = ''
|
||||||
let use_pipe_for_cursor = zencoding#getResource(type, 'use_pipe_for_cursor', 1)
|
|
||||||
let rtype = zencoding#lang#exists(type) ? type : 'html'
|
let rtype = zencoding#lang#exists(type) ? type : 'html'
|
||||||
while itemno < current.multiplier
|
while itemno < current.multiplier
|
||||||
if len(current.name)
|
if len(current.name)
|
||||||
@@ -189,9 +188,6 @@ function! zencoding#toString(...)
|
|||||||
endif
|
endif
|
||||||
if len(snippet) > 0
|
if len(snippet) > 0
|
||||||
let tmp = snippet
|
let tmp = snippet
|
||||||
if use_pipe_for_cursor
|
|
||||||
let tmp = substitute(tmp, '|', '${cursor}', 'g')
|
|
||||||
endif
|
|
||||||
let tmp = substitute(tmp, '\${zenname}', current.name, 'g')
|
let tmp = substitute(tmp, '\${zenname}', current.name, 'g')
|
||||||
let snippet_node = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 0, 'parent': {}, 'value': '{'.tmp.'}', 'pos': 0, 'important': current.important }
|
let snippet_node = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 0, 'parent': {}, 'value': '{'.tmp.'}', 'pos': 0, 'important': current.important }
|
||||||
let str = zencoding#lang#{rtype}#toString(s:zen_settings, snippet_node, type, inline, filters, group_itemno, indent)
|
let str = zencoding#lang#{rtype}#toString(s:zen_settings, snippet_node, type, inline, filters, group_itemno, indent)
|
||||||
@@ -244,7 +240,7 @@ function! zencoding#getResource(type, name, default)
|
|||||||
endif
|
endif
|
||||||
for ext in extends
|
for ext in extends
|
||||||
if has_key(s:zen_settings, ext) && has_key(s:zen_settings[ext], a:name)
|
if has_key(s:zen_settings, ext) && has_key(s:zen_settings[ext], a:name)
|
||||||
call s:mergeConfig(ret, s:zen_settings[ext][a:name])
|
call zencoding#mergeConfig(ret, s:zen_settings[ext][a:name])
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
endif
|
endif
|
||||||
@@ -252,7 +248,7 @@ function! zencoding#getResource(type, name, default)
|
|||||||
if has_key(s:zen_settings[a:type], a:name)
|
if has_key(s:zen_settings[a:type], a:name)
|
||||||
let v = s:zen_settings[a:type][a:name]
|
let v = s:zen_settings[a:type][a:name]
|
||||||
if type(ret) == 3 || type(ret) == 4
|
if type(ret) == 3 || type(ret) == 4
|
||||||
call s:mergeConfig(ret, s:zen_settings[a:type][a:name])
|
call zencoding#mergeConfig(ret, s:zen_settings[a:type][a:name])
|
||||||
else
|
else
|
||||||
let ret = s:zen_settings[a:type][a:name]
|
let ret = s:zen_settings[a:type][a:name]
|
||||||
endif
|
endif
|
||||||
@@ -295,6 +291,90 @@ function! zencoding#getFileType(...)
|
|||||||
return type
|
return type
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! zencoding#getDollarExprs(expand)
|
||||||
|
let expand = a:expand
|
||||||
|
let dollar_list = []
|
||||||
|
let dollar_reg = '\%(\\\)\@<!\${\(\([^{}]\|\%(\\\)\@\<=[{}]\)\{}\)}'
|
||||||
|
while 1
|
||||||
|
let matcharr = matchlist(expand, dollar_reg)
|
||||||
|
if len(matcharr) > 0
|
||||||
|
let key = get(matcharr, 1)
|
||||||
|
if key !~ '^\d\+:'
|
||||||
|
let key = substitute(key, '\\{', '{', 'g')
|
||||||
|
let key = substitute(key, '\\}', '}', 'g')
|
||||||
|
let value = zencoding#getDollarValueByKey(key)
|
||||||
|
if type(value) == type('')
|
||||||
|
let expr = get(matcharr, 0)
|
||||||
|
call add(dollar_list, {'expr': expr, 'value': value})
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
let expand = substitute(expand, dollar_reg, '', '')
|
||||||
|
endwhile
|
||||||
|
return dollar_list
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! zencoding#getDollarValueByKey(key)
|
||||||
|
let ret = 0
|
||||||
|
let key = a:key
|
||||||
|
let ftsetting = get(s:zen_settings, zencoding#getFileType())
|
||||||
|
if type(ftsetting) == 4 && has_key(ftsetting, key)
|
||||||
|
let value = get(ftsetting, key)
|
||||||
|
if type(value) == 1 | let ret = value | endif
|
||||||
|
endif
|
||||||
|
if type(ret) != 1 && has_key(s:zen_settings, key)
|
||||||
|
let value = get(s:zen_settings, key)
|
||||||
|
if type(value) == 1 | return value | endif
|
||||||
|
endif
|
||||||
|
return ret
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! zencoding#reExpandDollarExpr(expand, times)
|
||||||
|
let expand = a:expand
|
||||||
|
let dollar_exprs = zencoding#getDollarExprs(expand)
|
||||||
|
if len(dollar_exprs) > 0
|
||||||
|
if a:times < 9
|
||||||
|
for n in range(len(dollar_exprs))
|
||||||
|
let pair = get(dollar_exprs, n)
|
||||||
|
let pat = get(pair, 'expr')
|
||||||
|
let sub = get(pair, 'value')
|
||||||
|
let expand = substitute(expand, pat, sub, 'g')
|
||||||
|
endfor
|
||||||
|
return zencoding#reExpandDollarExpr(expand, a:times + 1)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
return expand
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! zencoding#expandDollarExpr(expand)
|
||||||
|
return zencoding#reExpandDollarExpr(a:expand, 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! zencoding#expandCursorExpr(expand, mode)
|
||||||
|
let expand = a:expand
|
||||||
|
let type = zencoding#getFileType()
|
||||||
|
let use_pipe_for_cursor = zencoding#getResource(type, 'use_pipe_for_cursor', 1)
|
||||||
|
if use_pipe_for_cursor
|
||||||
|
let expand = substitute(expand, '|', '${cursor}', 'g')
|
||||||
|
endif
|
||||||
|
if expand !~ '\${cursor}'
|
||||||
|
if a:mode == 2
|
||||||
|
let expand = '${cursor}' . expand
|
||||||
|
else
|
||||||
|
let expand .= '${cursor}'
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
let expand = substitute(expand, '\${cursor}', '$cursor$', '')
|
||||||
|
let expand = substitute(expand, '\${cursor}', '', 'g')
|
||||||
|
return expand
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! zencoding#unescapeDollarExpr(expand)
|
||||||
|
return substitute(a:expand, '\\\$', '$', 'g')
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! zencoding#expandAbbr(mode, abbr) range
|
function! zencoding#expandAbbr(mode, abbr) range
|
||||||
let type = zencoding#getFileType()
|
let type = zencoding#getFileType()
|
||||||
let rtype = zencoding#getFileType(1)
|
let rtype = zencoding#getFileType(1)
|
||||||
@@ -435,31 +515,23 @@ function! zencoding#expandAbbr(mode, abbr) range
|
|||||||
endif
|
endif
|
||||||
let expand = substitute(expand, '\$line\([0-9]\+\)\$', '\=submatch(1)', 'g')
|
let expand = substitute(expand, '\$line\([0-9]\+\)\$', '\=submatch(1)', 'g')
|
||||||
endif
|
endif
|
||||||
|
let expand = zencoding#expandDollarExpr(expand)
|
||||||
|
let expand = zencoding#expandCursorExpr(expand, a:mode)
|
||||||
if len(expand)
|
if len(expand)
|
||||||
if expand !~ '\${cursor}'
|
|
||||||
if a:mode == 2 |
|
|
||||||
let expand = '${cursor}' . expand
|
|
||||||
else
|
|
||||||
let expand .= '${cursor}'
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
let expand = substitute(expand, '\${\%(lorem\|lipsum\)\(\d*\)}', '\=zencoding#util#lorem(submatch(1))', 'g')
|
let expand = substitute(expand, '\${\%(lorem\|lipsum\)\(\d*\)}', '\=zencoding#util#lorem(submatch(1))', 'g')
|
||||||
let expand = substitute(expand, '${lang}', s:zen_settings.lang, 'g')
|
|
||||||
let expand = substitute(expand, '${charset}', s:zen_settings.charset, 'g')
|
|
||||||
if has_key(s:zen_settings, 'timezone') && len(s:zen_settings.timezone)
|
if has_key(s:zen_settings, 'timezone') && len(s:zen_settings.timezone)
|
||||||
let expand = substitute(expand, '${datetime}', strftime("%Y-%m-%dT%H:%M:%S") . s:zen_settings.timezone, 'g')
|
let expand = substitute(expand, '${datetime}', strftime("%Y-%m-%dT%H:%M:%S") . s:zen_settings.timezone, 'g')
|
||||||
else
|
else
|
||||||
" TODO: on windows, %z/%Z is 'Tokyo(Standard)'
|
" TODO: on windows, %z/%Z is 'Tokyo(Standard)'
|
||||||
let expand = substitute(expand, '${datetime}', strftime("%Y-%m-%dT%H:%M:%S %z"), 'g')
|
let expand = substitute(expand, '${datetime}', strftime("%Y-%m-%dT%H:%M:%S %z"), 'g')
|
||||||
endif
|
endif
|
||||||
|
let expand = zencoding#unescapeDollarExpr(expand)
|
||||||
if a:mode == 2 && visualmode() ==# 'v'
|
if a:mode == 2 && visualmode() ==# 'v'
|
||||||
if a:firstline == a:lastline
|
if a:firstline == a:lastline
|
||||||
let expand = substitute(expand, '\n\s*', '', 'g')
|
let expand = substitute(expand, '\n\s*', '', 'g')
|
||||||
else
|
else
|
||||||
let expand = substitute(expand, '\n$', '', 'g')
|
let expand = substitute(expand, '\n$', '', 'g')
|
||||||
endif
|
endif
|
||||||
let expand = substitute(expand, '\${cursor}', '$cursor$', '')
|
|
||||||
let expand = substitute(expand, '\${cursor}', '', 'g')
|
|
||||||
silent! normal! gv
|
silent! normal! gv
|
||||||
let col = col("'<")
|
let col = col("'<")
|
||||||
silent! normal! c
|
silent! normal! c
|
||||||
@@ -473,8 +545,6 @@ function! zencoding#expandAbbr(mode, abbr) range
|
|||||||
call append(line('.'), lines[1:])
|
call append(line('.'), lines[1:])
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
let expand = substitute(expand, '\${cursor}', '$cursor$', '')
|
|
||||||
let expand = substitute(expand, '\${cursor}', '', 'g')
|
|
||||||
if line[:-len(part)-1] =~ '^\s\+$'
|
if line[:-len(part)-1] =~ '^\s\+$'
|
||||||
let indent = line[:-len(part)-1]
|
let indent = line[:-len(part)-1]
|
||||||
else
|
else
|
||||||
@@ -648,8 +718,7 @@ function! zencoding#ExpandWord(abbr, type, orig)
|
|||||||
let expand = substitute(expand, '>', '\>', 'g')
|
let expand = substitute(expand, '>', '\>', 'g')
|
||||||
endif
|
endif
|
||||||
if a:orig == 0
|
if a:orig == 0
|
||||||
let expand = substitute(expand, '\${lang}', s:zen_settings.lang, 'g')
|
let expand = zencoding#expandDollarExpr(expand)
|
||||||
let expand = substitute(expand, '\${charset}', s:zen_settings.charset, 'g')
|
|
||||||
let expand = substitute(expand, '\${cursor}', '', 'g')
|
let expand = substitute(expand, '\${cursor}', '', 'g')
|
||||||
endif
|
endif
|
||||||
return expand
|
return expand
|
||||||
@@ -1484,7 +1553,7 @@ let s:zen_settings = {
|
|||||||
\}
|
\}
|
||||||
|
|
||||||
if exists('g:user_zen_settings')
|
if exists('g:user_zen_settings')
|
||||||
call s:mergeConfig(s:zen_settings, g:user_zen_settings)
|
call zencoding#mergeConfig(s:zen_settings, g:user_zen_settings)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let &cpo = s:save_cpo
|
let &cpo = s:save_cpo
|
||||||
|
|||||||
@@ -119,7 +119,13 @@ function! zencoding#lang#html#parseIntoTree(abbr, type)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
if tag_name =~ '^\(lorem\|lipsum\)\d*$'
|
if tag_name =~ '^\(lorem\|lipsum\)\d*$'
|
||||||
|
if parent.name == ''
|
||||||
|
let div = zencoding#lang#html#parseTag('<div/>')
|
||||||
|
let div.value = '{\${' . tag_name . '}}'
|
||||||
|
let current.snippet = zencoding#toString(div, type, 0, [])
|
||||||
|
else
|
||||||
let current.snippet = '${' . tag_name . '}'
|
let current.snippet = '${' . tag_name . '}'
|
||||||
|
endif
|
||||||
let current.name = ''
|
let current.name = ''
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -602,9 +608,10 @@ function! zencoding#lang#html#balanceTag(flag) range
|
|||||||
endif
|
endif
|
||||||
endwhile
|
endwhile
|
||||||
endif
|
endif
|
||||||
call setpos('.', curpos)
|
|
||||||
if a:flag == -2 || a:flag == 2
|
if a:flag == -2 || a:flag == 2
|
||||||
silent! exe "normal! gv"
|
silent! exe "normal! gv"
|
||||||
|
else
|
||||||
|
call setpos('.', curpos)
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user