Cách xuất kết quả của lệnh vim sang shell


11

Giả sử tôi đang ở trong shell ( bash) và muốn xem đầu ra :scriptnamessẽ cung cấp, nhưng không muốn bắt đầu vim hoặc có thể tôi muốn lặp lại điều đó vào một tệp khác.

Vì vậy, tôi thực hiện

vim +scriptnames

Điều này cho tôi thấy tất cả các kịch bản, nhưng làm thế nào để tôi lặp lại điều đó vào thiết bị xuất chuẩn của shell?

Câu trả lời:


10

Điều đó xảy ra, vì thường Vim chuyển sang màn hình thay thế và hoạt động ở đó. Khi thoát, Vim sẽ chuyển trở lại và do đó bạn không thấy bất cứ điều gì còn lại từ phiên Vim của mình, nhưng kết quả của lệnh được thực thi ngay cả trước khi bắt đầu Vim.

Tính năng này được giải thích tại :h xterm-screens (liên kết)

Vì vậy, về cơ bản bạn không muốn điều đó và do đó muốn vô hiệu hóa điều đó. Bạn có thể làm như vậy, bằng cách đặt :set t_ti= t_te=mã đầu cuối thực hiện việc này thành trống.

Đặt tất cả lại với nhau, bạn sẽ muốn bắt đầu Vim như thế này:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!'

Chúng tôi đang đặt lại 'more'tùy chọn để bạn không thấy dấu nhắc nhập.


1
Đây là TUYỆT VỜI, cảm ơn bạn rất nhiều! Tôi thực sự nghi ngờ điều này là có thể.
hg Diesel

Điều này có làm cho nó có thể sử dụng VimL như một ngôn ngữ kịch bản hệ thống đầy đủ bằng cách cho phép nó viết ra thiết bị xuất chuẩn (đối với đặc biệt là khổ dâm)?
Shadowtalker

1
Một vấn đề với điều này là tôi không thể cuộn thiết bị đầu cuối. (Nếu văn bản dài hơn chiều cao thiết bị đầu cuối của tôi, tôi không thể nhìn thấy trên cùng) Văn bản cũng biến mất nếu tôi mở vim rồi thoát.
FDinoff

@FDinoff Đó là những gì máy nhắn tin thích lesscó. Chỉ cần ống nó vào ít như vậy vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!' | less. Bố cục ban đầu có thể bị rối tung (trong thiết bị đầu cuối của tôi), nhưng sau khi nhấn <CL>, mọi thứ đều tốt và đẹp.
hg Diesel

Tôi thấy không có đầu ra khi chạy vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!', chỉ có một "đèn flash nhanh", lệnh thoát với mã 0, không có đầu ra. Tui bỏ lỡ điều gì vậy?
TrungDQ

3

Chúng ta cũng có thể sử dụng :redirlệnh để chuyển hướng kết quả của các lệnh vim vào một tệp

Ví dụ,

vim -c "redir! > vimout | scriptnames | redir END | q"

Điều này chuyển hướng đầu ra của scriptnamestập tin "vimout"


1

Tôi đánh giá cao câu trả lời do Christian Brabandt cung cấp nhưng tôi nghĩ câu trả lời tốt hơn sẽ là tách lệnh thoát bằng cách sử dụng lệnh -c khác như vậy:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames' -c 'q!' 

Sử dụng phương pháp này có nghĩa là bạn có thể xâu chuỗi một số lệnh khác nhau lại với nhau và sau đó sử dụng 'q!' Cuối cùng để thoát ra khỏi vim.


0

Đối với các tình huống mà vim cần tải đầy đủ như thể bạn khởi động thủ công, điều này hoạt động:

vim -c "autocmd! CursorHold * <commands to run>"

Ví dụ: tôi muốn chuyển hướng đầu ra của :maptệp từ trình bao, nhưng tôi muốn chụp ánh xạ mà vim- air tạo ra chỉ sau khi nó hiển thị dòng tab của nó (dòng ở trên cùng hiển thị tất cả các tên đệm mở.) Bởi vì nó dường như làm điều này không đồng bộ, chỉ đơn giản là chạy -cchuyển hướng đến một tệp không cho nó thời gian để tạo ánh xạ. Có thể có một cách tốt hơn, nhưng điều này hiệu quả với tôi, đặc biệt là vì tôi đã updatetimeđặt thành 100(0,1 giây), điều này ảnh hưởng đến thời gian cho đến khi CursorHoldsự kiện diễn ra. Theo mặc định, vim đặt nó thành 4 giây.

vim -c "autocmd! CursorHold * set nomore | redir! > mapNew | map | redir END | q"
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.