0

我正在尝试编写自己的函数来转换这样的字符串:

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

修正了标题 - 对此感到抱歉!

4

1 回答 1

1

我可能会将类名解析为一个列表,然后join()将它们重新组合在一起,用空格分隔,但我知道(尤其是对于初学者)重复替换字符串更容易。

要继续您的方法,您只需添加另一个删除中间的替换class=

let elementWithClass=substitute(elementWithClass, '" class="', ' ', 'g')

附加评论

  • 你应该使用:noremap; 它使映射不受重新映射和递归的影响。

  • 您正在使用容易发生名称冲突的全局函数。特别是如果您打算最终将其作为插件发布,请使用脚本本地(function! s:CompileSelectors()在映射中使用<SID>CompileSelectors)或自动加载(function! MyPlugin#CompileSelectors())范围。

于 2013-09-05T06:27:53.897 回答