Vimscript函数选择块然后排序

时间:2015-11-06 21:51:02

标签: vim

我正在学习Vimscript,我正在尝试选择一个文本块并通过函数对其进行排序。这就是我现在所得到的:

function! SortFirstBlock()
    call setpos(".", [0, 1, 1, 0])
    execute "normal! vip:sort<cr>"
endfunction

我如何阅读这是通过setpos转到缓冲区中的第一个位置,然后使用execute,运行vip,可视地选择一个文本块,然后{{1对该块进行排序。

我的光标移动到第一个位置,但不突出显示该块并且不进行排序。这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

几乎在那里,所有缺失的都是<CR>之前的反斜杠:

function! SortFirstBlock() abort
  call cursor(1, 1)
  execute "normal! vip:sort\<CR>"
endfunction

<>令牌必须位于双引号字符串中并进行转义。所有此类特殊令牌的文档位于:h expr-string

两个不相关的建议,代码审查风格:

  • 您可以使用cursor()作为setpos(".", ...)
  • 的简写
  • 一旦遇到错误,请始终使用abort使函数停止。如果您不使用abort,即使发生错误,Vim也会尝试继续执行,并且您将获得漫长而混乱的堆栈跟踪。

答案 1 :(得分:3)

你的功能出了什么问题:

  • setpos()过于冗长,cursor()更简单,
  • execute不是必需的,因为你没有连接任何东西,
  • 你应该将宏和ex命令分开:

    normal! vip
    sort
    normal! <Esc>
    
  • 但无论如何,视觉模式完全没必要。

您应该在所需范围内使用:sort

function! SortFirstBlock()
    1,/^$/-sort
endfunction

好吧,我只是简单地使用:1,/^$/-sort<CR>并且不打算使用函数,实际上......但是你的例子可能是更大整体的一部分。

答案 2 :(得分:2)

我赞成了回答,但我想我会提供另一种解决方案。 您可以简单地从刚刚移动到的位置(文件的开头)到当前段落结束之前的行进行排序,而不是在排序之前进行选择:

userDidAuthorize

逗号之前没有任何内容表示范围的开头是当前行。 function! SortFirstBlock() call setpos(".", [0, 1, 1, 0]) ,'}-1sort endfunction 是预定义的标记,表示段落的结尾。该 '}将范围的终点移回一行,这样就可以了 段落末尾的空行不包括在排序中。这个 范围涵盖了普通中-1所包含的相同行 模式。