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 :enew
từ :scriptnames
để tôi có thể tìm kiếm nó.
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 :enew
từ :scriptnames
để tôi có thể tìm kiếm nó.
Câu trả lời:
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 :Scriptnames
lệnh sẽ tải :scriptnames
và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 :Redir
lệnh để chuyển hướng đầu ra sang bộ đệm mới. ví dụ :Redir scriptnames
hay :Redir ls
.
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()
:redir END
nói với Vim để kết thúc tin nhắn chuyển hướng. Xem:h :redir
Để đầ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 tabnew
thành vsplit
hoặc split
vv
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.
END
nghĩa là gì?