你如何在Vim中“ chomp”一个字符串?


32

假设您运行以下vimscript:

let @z = system("date")

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

Answers:


24

您可以使用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。)


这行得通,但是为什么call语法很奇怪?为什么不给Chomp一个名为参数string,然后传递a:stringsubstitute
bdesham 2015年

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

对。system()有一个可选{input}参数,并且可以通用地处理其中的任何一个。如果您不需要此功能,请按照常规方式进行。
Ingo Karkat 2015年

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

为您删除换行符。


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

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

4

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

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

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

我不知道它如何处理\r\n行尾的类型...
x-yuri

@ x-yuri当然值得检查。不要在此引用我的名字,但我认为 Windows上的Vim \n在返回它们之前会将其归一化。
joeytwiddle
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.