Как вы «разбиваете» строку в Vim?

32

Предположим, вы запустили следующий фрагмент vimscript:

let @z = system("date")

Это поместит строковую версию текущей даты в регистр z, но строка будет заканчиваться символом новой строки, который мне не нужен. Есть ли встроенный способ (похожий на Perl chomp), чтобы избавиться от завершающих строк строки?

bdesham
источник

Ответы:

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:stringк substitute?
Bdesham
2
@bdesham Потому Chomp()что передает все аргументы, которые он получает, удаляет завершающий символ system()новой строки из его вывода и возвращает его.
Jamessan
Правильно. system()имеет необязательный {input}аргумент, и это обрабатывает любой из них в общем. Если вам это не нужно, просто сделайте это обычным способом.
Инго Каркат
25
let @z = systemlist('date')[0]

удаляет новую строку для вас.

romainl
источник
Я думаю, что это, вероятно, подход, который я на самом деле буду использовать, но я принял другой ответ, потому что он более применим. (Например, он удалит завершающие новые строки из многострочной строки, оставив другие
новые
5
Обратите внимание, что это не будет работать правильно для систем, которые используют что-то другое, чем \nдля новой строки. systemlist()только удаляет \n, а не любой \r.
jamessan
4

Кристиан Брабандт перечислил несколько различных методов на superuser.com.

Мне нравится этот, потому что он короткий:

let @z = system("date")[:-2]
joeytwiddle
источник
Интересно, как он обрабатывает \r\nтипы окончаний строк ...
x-yuri
@ x-yuri Это, безусловно, стоит проверить. Не цитируйте меня об этом, но я думаю, что Vim-on-Windows нормализует эти строки до того, \nкак их вернуть.
Joeytwiddle