假设您运行以下一段vimscript:

let @z = system("date")


这会将当前日期的字符串版本放入z寄存器,但是该字符串将以换行符结尾我不要有内置的方法(类似于Perl的chomp)来消除字符串的尾随换行符吗?

#1 楼

您可以使用substitute()或定义一个函数:

function! Chomp(string)
    return substitute(a:string, '\n\+$', '', '')
endfunction


此变体将为您调用system,然后截断结果:

function! ChompedSystem( ... )
    return substitute(call('system', a:000), '\n\+$', '', '')
endfunction


(此功能在我的ingo-library插件中也可以使用ingo#system#Chomped。)

评论


这可行,但是为什么调用语法很奇怪?为什么不只给Chomp一个名为string的参数,然后传递一个:string来代替呢?

–bdesham
2015年4月9日在15:03

@bdesham因为Chomp()将传递给它的任何参数传递给system(),所以从其输出中删除尾随的换行符,然后将其返回。

–詹姆斯
2015年4月9日15:22

对。 system()有一个可选的{input}参数,它可以通用地处理所有这些参数。如果您不需要此功能,请按照常规方式进行。

– Ingo Karkat
2015年4月9日在16:12

看起来非常像正则表达式,是否也可以砍掉所有数字?

–保险丝团队
20 Dec 1'在17:25

@Fuseteam:我不确定您的确切想法,但是如果将\ n \ + $替换为\ d * \ n \ + $,所有尾随数字也将被删除。但是,我可能不会将非常特定于应用程序的剪切与尾随换行符的常规删除结合起来,而是在收到断行后再进行第二次替换(l:result,'\ d * $',``,”) l:结果,使代码更整洁。

– Ingo Karkat
20年12月1日在17:43

#2 楼

let @z = systemlist('date')[0]


为您删除换行符。

评论


我认为这可能是我实际使用的方法,但是我接受了另一个答案,因为它更通用。 (例如,它将从多行字符串中删除尾随的换行符,而不留其他换行符。)

–bdesham
2015年4月10日在2:28

请注意,这对于换行符使用\ n以外的内容的系统将无法正常工作。 systemlist()仅删除\ n,而不删除任何\ r。

–詹姆斯
2015年4月10日在14:12

请注意,如果被调用函数不产生任何输出,则将导致错误。为避免这种情况,而是获取一个空字符串:get(systemlist(“ date”),0,“”)

– pR0Ps
20年7月21日在18:12

#3 楼

Vim v8.0.1630添加了一个trim()函数,该函数从字符串的结尾或开头(默认两个都删除)中删除字符(默认为空白):
let @z = trim(system("date"))

有关更多详细信息,请参见:help trim()

#4 楼

Christian Brabandt在superuser.com上列出了许多不同的方法。

我喜欢这个,因为它很简短:

let @z = system("date")[:-2]


评论


我想知道它如何处理\ r \ n类型的行尾...

–x-yuri
18年11月16日在16:27

@ x-yuri当然值得检查。不要在此引用我的名字,但是我认为Windows上的Vim在返回它们之前会将这些行尾标准化为\ n。

– joeytwiddle
18年11月18日在4:33