我正在学习Vimscript,我正在尝试选择一个文本块并通过函数对其进行排序。这就是我现在所得到的:
function! SortFirstBlock()
call setpos(".", [0, 1, 1, 0])
execute "normal! vip:sort<cr>"
endfunction
我如何阅读这是通过setpos
转到缓冲区中的第一个位置,然后使用execute
,运行vip
,可视地选择一个文本块,然后{{1对该块进行排序。
我的光标移动到第一个位置,但不突出显示该块并且不进行排序。这样做的正确方法是什么?
答案 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
所包含的相同行
模式。