VIM函数生成一个标签,输出后如何居中光标位置

时间:2011-11-02 14:02:53

标签: vim

我尝试使用一个简单的函数来回显XML标记:

func! SayTag()
    let tagName = input("Tag: ")
    return "<" . tagName . ">" . "<" . tagName . ">"
endfunc

并绑定到:

imap \tag <C-R>=SayTag()<CR>

但输出后,光标位于标记之后,例如< TAG > < /TAG > _CURSOR_

如何动态设置光标位置?

2 个答案:

答案 0 :(得分:2)

我不太喜欢以下解决方案,但我正在探讨你的问题,因为我无法想到一个简单的解决方案:

func! GetTag()
  call inputsave()
  let g:tagName = input("Tag: ")
  call inputrestore()
endfunc

imap \t <esc>:call GetTag()<CR>:exe "normal! i<".tagName."></".tagName.">"<CR>bba

它应该可以正常工作,你可以阅读文档here(参见最新的例子)。顺便说一句,如果您打算编写大量XML或HTML,我建议您查看以下插件:

他们会为你节省很多打字。

答案 1 :(得分:2)

另一种可能的实现方式,使用更好的地图。

function! GetTag()
    let tag = input("Tag: ")
    execute "normal! i<".tag."></".tag.">"
    execute "normal! " . repeat('h', strlen(tag)+2)
endfunction

inoremap \tag <C-o>:call GetTag()<enter>

但是,我非常同意您使用专为这类事情设计的插件可以节省大量时间。

编辑:删除了不必要的循环。