Làm thế nào để bạn có thể sử dụng một chuỗi trong Vim?


32

Giả sử bạn chạy đoạn vimscript sau:

let @z = system("date")

Điều này sẽ đặt một phiên bản chuỗi của ngày hiện tại vào thanh ghi z, nhưng chuỗi sẽ kết thúc bằng một dòng mới mà tôi không muốn. Có cách tích hợp nào (tương tự như Perl chomp) để thoát khỏi các dòng mới của chuỗi không?

Câu trả lời:


24

Bạn có thể sử dụng substitute()hoặc xác định hàm:

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

Biến thể này sẽ gọi systemcho bạn và sau đó kiểm tra kết quả:

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

(Chức năng này cũng có sẵn trong plugin thư viện ingo của tôi dưới dạng ingo#system#Chomped.)


Điều này hoạt động, nhưng tại sao callcú pháp kỳ lạ ? Tại sao không chỉ đưa ra Chompmột tham số được gọi stringvà sau đó chuyển a:stringđến substitute?
bdesham

2
@bdesham Bởi vì Chomp()đang chuyển bất kỳ đối số nào mà nó nhận được system(), tước bỏ dòng mới từ đầu ra của nó và trả về đó.
jamessan

Đúng. system()có một {input}đối số tùy chọn và điều này xử lý bất kỳ trong số này một cách khái quát. Nếu bạn không cần điều này, chỉ cần làm theo cách thông thường.
Ingo Karkat

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

xóa dòng mới cho bạn.


Tôi nghĩ rằng đây có lẽ là cách tiếp cận tôi thực sự sẽ sử dụng, nhưng tôi đã chấp nhận câu trả lời khác bởi vì nó thường được áp dụng hơn. (Ví dụ: nó sẽ xóa các dòng mới ra khỏi chuỗi nhiều dòng trong khi để lại các dòng mới khác.)
bdesham

5
Lưu ý rằng điều này sẽ không hoạt động chính xác cho các hệ thống sử dụng một cái gì đó ngoài \ndòng mới. systemlist()chỉ loại bỏ \n, không phải bất kỳ \r.
jamessan

4

Christian Brabandt đã liệt kê một số phương pháp khác nhau trên superuser.com.

Tôi thích cái này vì nó ngắn:

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

Tôi tự hỏi làm thế nào nó xử lý \r\nloại kết thúc dòng ...
x-yuri

@ x-yuri Điều đó chắc chắn đáng để kiểm tra Đừng trích dẫn tôi về điều này, nhưng tôi nghĩ Vim-on-Windows sẽ bình thường hóa các kết thúc dòng \nđó trước khi trả lại chúng.
joeytwiddle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.