我正在尝试编写自己的函数来转换像这样的字符串:
div.class1.class2#id
进入像这样的HTML元素
<div class="class1 class2" id="id">|</div>
与|表示光标。我已经做到了这一点,但它产生了多个类:
<div class="class1" class="class2" id="id">|</div>
可以预期代码。我遇到的错误是,对viml不熟悉,我不知道在语言中解决这个问题的最佳方法。关于让类空间分离的任何想法?
此外,这是我的第一个viml文件,所以任何评论都会受到赞赏(特别是在绑定本身!)
function! CompileSelectors (input)
let element=ParseElement(a:input)
return '<'.element.'>'.CloseTag(element)
endfunction
function! ParseElement (input)
let escapedInput=escape(a:input, '^$.*\/~[]')
let elementWithClass=substitute(escapedInput, '\\\.\([^\.#]*\)', ' class="\1"', 'g')
let elementWithId=substitute(elementWithClass, '#\([^\.#]*\)', ' id="\1"', 'g')
return substitute(elementWithId, '\\\([\^\$\.\*\\\/\~\[\]\)', '\1', 'g')
endfunction
function! CloseTag (input)
return '</'.matchstr(a:input, '\S\+', 0, 1).'>'
endfunction
imap <Leader><Tab> <Esc>vBdi
\<C-R>=CompileSelectors('<C-r>"')<CR>
\<Esc><<F<i
imap <Leader><Return> <Esc>vBdi
\<C-R>=CompileSelectors('<C-r>"')<CR>
\<Esc><<F<i<Return><Esc>O
修正了标题 - 抱歉!
答案 0 :(得分:1)
我可能已经将类名解析为List,然后使用join()
将它们重新组合在一起,用空格分隔,但我明白(特别是初学者)更容易替换字符串反复。
要继续使用您的方法,您只需添加另一个删除中间class=
的替换:
let elementWithClass=substitute(elementWithClass, '" class="', ' ', 'g')
You should use :noremap
;它使映射不受重映射和递归的影响。
您正在使用容易发生名称冲突的全局函数。特别是如果您打算最终将其作为插件发布,请使用脚本本地(function! s:CompileSelectors()
,在映射中使用<SID>CompileSelectors
)或自动加载(function! MyPlugin#CompileSelectors()
)范围。