从vim函数内部更改光标下的单词

时间:2011-04-13 09:20:56

标签: function vim

我想编写一个函数,它可以增加/减少LaTeX文本的大小。例如,当光标位于单词 \ footnotesize 上方时,我想调用Tex_ChangeSize(-1)将其更改为 \ small Tex_ChangeSize(1)将其更改为 \ normalsize

我所拥有的是以下内容:

function! Tex_ChangeSize(direction)
    let sizes = ["tiny", "scriptsize", "footnotesize", "small", "normalsize", "large", "Large", "LARGE", "huge", "Huge"]
    let cursize = index(sizes,expand("<cword>"))
    if cursize != -1
        "FIXME: replace current word under cursor with the following
        echo sizes[cursize + a:direction]
    endif
endfunction
imap <C-h> <C-o>:call Tex_ChangeSize(-1)<Enter>
imap <C-g> <C-o>:call Tex_ChangeSize(1)<Enter>

我不知道的是,如何替换光标下的单词(参见FIXME)。 更确切地说:有没有比解析getline(line('.'))并将其设置回setline()更好的方法?

1 个答案:

答案 0 :(得分:1)

getline + setline是一个更整洁的选择,因为它不会弄乱任何寄存器(@"@/),但是找到当前单词的限制有点棘手8世界,也可以使用制表符(\ t)。 (col('.') + match()会执行此操作;有关示例,请参阅https://github.com/LucHermitte/lh-misc/blob/master/plugin/vim-tip-swap-word.vim

您还可以使用nnoremapping执行简单的cw<c-r>=<sid>ChangeSize(1)<cr> s:ChangeSize()@"测试@"以查看下一个符号以便返回它 - 而不是弄乱{{1}虽然在这种情况下很简单。

如果您不想让它返回任何内容,您也可以在该功能中使用:exe 'normal! "_cw'.new_word