Vim快捷方式构建适当的html

时间:2013-09-05 04:52:18

标签: vim vim-plugin

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

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

修正了标题 - 抱歉!

1 个答案:

答案 0 :(得分:1)

我可能已经将类名解析为List,然后使用join()将它们重新组合在一起,用空格分隔,但我明白(特别是初学者)更容易替换字符串反复。

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

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

其他评论

  • You should use :noremap;它使映射不受重映射和递归的影响。

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