Vim用户定义的命令过滤器

时间:2018-04-13 10:15:35

标签: vim

我有以下输入文件:

abcde                                                                         
abc                                                                      
abcdef                                                                   
abcd

我想按行长排序。我可以通过运行输出命令1,4!awk '{print length, $0}' | sort -n -s | cut -d' ' -f2来执行此操作:

abc                                                                      
abcd                                                                     
abcde                                                                    
abcdef

现在我想创建一个与上面完全相同的用户定义命令SortL

command! -count SortL <count>!awk '{print length, $0}' | sort -n -s | cut -d' ' -f2-

但是当我在输入文件上运行1,4SortL时,我得到:

abcde                                                                         
abc                                                                      
abcdef                                                                   
abcd

没有进行任何更改,因此我必须在SortL的定义上犯了错误。如何定义SortL以使行按长度排序?

2 个答案:

答案 0 :(得分:1)

请注意,它也可以仅在vimscript中完成,它具有可移植的优点(鉴于它是从vim运行的 - 好的,lambda是最近的,它们现在已经2年了?)

command! -range=% SortL 
   \ call setline(<line1>, 
   \              sort(getline(<line1>,<line2>),
   \                   { a, b -> strchars(a) - strchars(b)}))

BTW,strchars()将正确计算多字节字符的字形数,而不是字节数。

答案 1 :(得分:0)

为了完整起见,答案是:

command! -range SortL <line1>,<line2>!awk '{print length, $0}' | sort -n -s | cut -d' ' -f2-