Kết xuất đầu ra của lệnh vim nội bộ vào bộ đệm


18

Làm cách nào để kết xuất một lệnh vim nội bộ (không phải lệnh shell) vào bộ đệm mới?

Ví dụ, tôi muốn để đổ một danh sách của tất cả các plugin vào :enewtừ :scriptnamesđể tôi có thể tìm kiếm nó.

Câu trả lời:


24

Bạn có thể sử dụng :redirđể chuyển hướng đầu ra đến một biến, đăng ký hoặc tệp. Ví dụ về chuyển hướng đến thanh ghi không tên:

:redir @">|silent scriptnames|redir END|enew|put

Ngoài ra, scriptease.vim của Tim Pope cung cấp :Scriptnameslệnh sẽ tải :scriptnamesvào danh sách quickfix và :copen.

Nếu bạn thấy mình chuyển hướng nhiều lệnh, bạn có thể muốn kết thúc lệnh này trong một lệnh:

command! -nargs=+ -complete=command Redir let s:reg = @@ | redir @"> | silent execute <q-args> | redir END | new | pu | 1,2d_ | let @@ = s:reg

Bây giờ bạn có thể sử dụng :Redirlệnh để chuyển hướng đầu ra sang bộ đệm mới. ví dụ :Redir scriptnameshay :Redir ls.

Vim 8+

Tàu Vim 8 với execute()chức năng mới . Bạn có thể sử dụng execute()chức năng thay vì :redirđể bắt đầu ra lệnh cũ.

 :enew|pu=execute('scriptnames') 

Để được trợ giúp thêm xem:

:h :redir
:h :silent
:h :scriptnames
:h :enew
:h :put
:h execute()

ENDnghĩa là gì?
Bryce Guinta

1
Nó dừng chuyển hướng đầu ra đến thanh ghi để bạn có thể có đầu ra thường xuyên một lần nữa.
Tumbler41

1
:redir ENDnói với Vim để kết thúc tin nhắn chuyển hướng. Xem:h :redir
Peter Rincker

Để thực hiện lệnh bên ngoài và bắt đầu ra của nó trong biến Vim, hãy sử dụng system (). : let hostname = system ('hostname')
user3751385

2

Để đầy đủ, tôi muốn trình bày các chức năng tuyệt vời này mà tôi đã thu thập (lấy trộm) từ romainl

" redirect the output of a Vim or external command into a scratch buffer
function! Redir(cmd)
  if a:cmd =~ '^!'
    execute "let output = system('" . substitute(a:cmd, '^!', '', '') . "')"
  else
    redir => output
    execute a:cmd
    redir END
  endif
  tabnew
  setlocal nobuflisted buftype=nofile bufhidden=wipe noswapfile
  call setline(1, split(output, "\n"))
  put! = a:cmd
  put = '----'
endfunction
command! -nargs=1 Redir silent call Redir(<f-args>)

Điều này sẽ mất đầu ra lệnh hệ thống hoặc bình thường và đặt nó trong một tab mới. Hãy thoải mái thay đổi dòng tabnewthành vsplithoặc splitvv


liên kết đến ý chính của @ romainl gist.github.com/romainl/eae0a260ab9c135390c30cd370c20cd7
Dyno Fu

@DynoFu, thêm liên kết vào câu trả lời của tôi.
klaus

1

Ngoài ra còn có plugin bufferize.vim :

:Bufferize scriptnames

về cơ bản là một phiên bản đóng gói của câu trả lời được chấp nhận (sử dụng :redir) và có thể thuận tiện hơn cho một số người.

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.