如何在Vimscript中不移动光标的情况下选择文件的第一段?

时间:2015-11-08 01:02:43

标签: vim

通过previous question的答案,我提供了一个小功能来帮助我将语言编译指示插入到源代码文件中:

function! HaskellInsertLanguagePragma() abort
    let here = getpos(".")
    let prag = input("GHC pragma: ")
    call append(0, "{-# LANGUAGE " . prag . " #-}")
    call setpos(".", [0, 1, 1, 0])
    ,'}-sort
    ,'}-Tabularize /#-}$/
    call setpos(".", here)
endfunction

基本上,它会要求您输入关键字,然后将其与样板文件一起插入文件的第一行,对其进行排序,使用Tabular插件对结束分隔符进行排序。真棒。

该函数的问题在于,因为插入了一行,所以最后的setpos将光标放在它现在开始的前一行。显而易见的解决方案是setpos,行号加1,但我想知道以下两种解决方案中的任何一种是否会更好:

  1. 在功能开头设置标记,并在结尾处转到该标记。如果是这样,如何设置和移动到Vimscript中的标记?

  2. 根本不要移动光标,并使用显式范围执行,'}-sort,'}-Tabular。但是如何指定范围“文件的第一个paragrpah”?

  3. 对我而言,似乎能够选择文件的第一段是更好的方法。感谢任何有关如何做到这一点的帮助。

2 个答案:

答案 0 :(得分:1)

在Vimscript中,我通常在之前设置标记,然后再回到之后。

function! MyFunction()
    " Save our location.
    normal! mz

    ...

    " Move back to our original location.
    normal! `z
endfunction

答案 1 :(得分:0)

@Andy Ray非常好地回答了你的第一个问题。遗憾的是,关于第二个,即使使用显式范围,使用范围的sort函数似乎也会改变光标的位置。如何指定一个范围的段落?你可以使用

1;'}-sort
1;'}-Tabularize /#-}$/

当用;分隔时,光标位置将设置为该行 在解释下一行说明符之前,您不需要将光标位置移动到第一行(选中:h :,)。或者您可以使用模式

1;/^$/-sort
1;/^$/-Tabularize /#-}$/

^$表示空行,通常结束段落。分离需要/之后的pattern