Як ви "чіпляєте" рядок у Vim?


32

Припустимо, ви запустили такий фрагмент вимскрипту:

let @z = system("date")

Це додасть версію рядка поточної дати до реєстру z, але рядок закінчиться новим рядком, який я не хочу. Чи існує вбудований спосіб (схожий на Perl chomp) для позбавлення від рядкових рядків?

Відповіді:


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]

видаляє новий рядок для вас.


Я думаю, що це, мабуть, такий підхід, який я насправді використовуватиму, але я прийняв іншу відповідь, тому що вона є більш загальною. (Наприклад, він видалить останні рядки з багаторядкового рядка, поки залишить інші нові рядки в спокої.)
bdesham

5
Зверніть увагу , що це не буде працювати коректно для систем , які використовують щось інше , ніж \nдля нового рядка. systemlist()видаляє лише те \n, а не будь-яке \r.
Jamessan

4

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

Мені це подобається, тому що він короткий:

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

Цікаво, як він обробляє \r\nтип закінчень рядків ...
x-yuri

@ x-yuri Це, безумовно, варто перевірити Не цитуйте мене на цьому, але я думаю, що Vim-on-Windows нормалізує ці закінчення рядків до \nїх повернення.
joeytwiddle
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.