2012-06-24 22 views
12

Khi Vim được bắt đầu, nó lấy rất nhiều biến môi trường từ hệ điều hành (như PATH) và nó cũng đặt biến môi trường riêng (như MYVIMRC).Làm thế nào để liệt kê tất cả các biến môi trường trong Vim?

Làm cách nào để tôi liệt kê hoặc xem tất cả các biến môi trường mà Vim hiểu và giá trị tương ứng của chúng từ bên trong Vim?

+1

http://vim.wikia.com/wiki/Displaying_the_current_Vim_environment có thể được giúp đỡ – epsilonhalbe

+0

Vì vậy, bạn đang tìm kiếm một danh sách đầy đủ của env vars thừa kế vim, hoặc là bạn đang tìm kiếm tất cả các vv env Vim tạo ra trên riêng của mình (của chính nó)? –

+2

Theo như tôi biết, nó không thể làm điều đó bằng Vim chỉ có nghĩa là. Tuy nhiên, trong các hệ thống giống Unix, người dùng chỉ có thể sử dụng ':! Env'. –

Trả lời

18

Trong tập lệnh Vim, không có cách nào được thiết kế để nhận danh sách hiện tại là các biến môi trường được xác định. Tuy nhiên, có thể khai thác Vim tính năng hoàn thành dòng lệnh.

Xem xét các hoàn thành có thể có cho lệnh chưa hoàn thành sau.

:echo $ 

Nó không phải là khó khăn để thấy rằng, theo cú pháp kịch bản Vim, tất cả các hoàn là tên của các biến môi trường. Nhấn wildchar chính (Tab, theo mặc định) hoặc Ctrl +D sẽ hiển thị tất cả trong số họ.

Để nhận danh sách hoàn thành này từ bên trong tập lệnh, chúng tôi cần khắc phục tính chất tương tác của nó. Một mẹo có thể xảy ra mà chúng tôi xem xét ở đây là thực hiện , dựa trên sự kết hợp các tính năng. Đầu tiên là Ctrl + A lệnh. Trong chế độ Dòng lệnh, phím tắt này kích hoạt chèn mọi hoàn thành có sẵn ở phía trước con trỏ. Những lần hoàn thành này được liệt kê theo thứ tự bảng chữ cái và được phân tách bằng dấu cách.

Nếu chúng tôi làm cho Vim in những hoàn thành được chèn ngay vào dòng lệnh, chúng tôi có thể dễ dàng chụp chúng bằng cách chuyển hướng đầu ra lệnh bằng lệnh :redir . Nhưng tất cả chúng ta cần phải đạt được điều đó tác dụng phụ là trích dẫn các văn bản chèn với Ctrl +Một: Trích dẫn làm cho phần còn lại của chúng tôi :echo lệnh một chuỗi chữ sẽ được chỉ in ra!

:echo 'NAME1 NAME2 NAME3' 
NAME1 NAME2 NAME3 

Để chỉnh sửa một dòng lệnh theo cách này, người dùng có thể gõ :ec (một bí danh cho :echo) sau đó $, nhấn Ctrl + Một, gõ ', nhảy đến đầu của lệnh với Ctrl + B, di chuyển con trỏ qua ký hiệu đô la bằng cách nhấn (phím mũi tên phải) hai lần, xóa số $ và chèn ' thay thế. Trình tự nhấn phím tương tự có thể được sao chép không tương tác bằng cách sử dụng lệnh :normal.

Đưa tất cả các phần câu đố này lại với nhau, chúng tôi có được chức năng sau.

function! Env() 
    redir => s 
    sil! exe "norm!:ec$\<c-a>'\<c-b>\<right>\<right>\<del>'\<cr>" 
    redir END 
    return split(s) 
endfunction 

Đối với phương pháp này để làm việc, Vim sẽ được biên dịch với các tính năng +cmdline_compl .

+0

Tốt hơn là thay đổi 'echo' thành' return': nó hoạt động đối với tôi: 'execute 'fu! Test() \ nexe's bình thường!: return $ \ '') \ \ \ \ split ('' '. \ "\\ n \" \ nendfu "'. – ZyX

13

Để liệt kê tất cả các biến môi trường, sử dụng

:echo $<C-D> 

Sau đó, bạn có thể bắt đầu gõ tên của biến về lợi ích, tính năng tự động hoàn chỉnh với Tab, cuối cùng nhấn Nhập để hiển thị giá trị của nó.

Bạn không biết bạn có cần điều này tương tác hay trong tập lệnh hay không. Đối với sau này, thật không may là không thể chụp đầu ra thông qua :redir.

+0

Ingo Karkat: Cảm ơn. Tương tác là tốt với tôi. –

+0

Có thể chụp hoàn thành dòng lệnh bằng cách sử dụng ': redir'. Nó đòi hỏi một thủ thuật không tầm thường, mặc dù. Nếu quan tâm, hãy xem [answer] của tôi (http://stackoverflow.com/a/11192777/254635). –

3

Nhìn vào các anwers khác, bạn có thể làm điều đó mà không cần tập lệnh.

Vào chế độ chèn, sau đó nhấn

<C-R>= 

đâu Ctrl +R cho phép bạn chèn thêm bất kỳ của thanh ghi sẵn (xem: giúp i_Ctrl-R). Nhưng đặc biệt bạn sẽ sử dụng thanh ghi biểu thức = tại đây để đánh giá một chuỗi (xem: help @ =).

Vì vậy, bây giờ bạn có thể chèn biểu thức được giới thiệu bởi câu trả lời của ib. Nhập thông tin này:

$<C-A>"<HOME>"<CR><ESC> 

Bây giờ, bạn nên trở lại chế độ bình thường và biểu thức phải được đánh giá thành chuỗi và được đặt vào bộ đệm. Bạn có thể làm sạch thêm bằng lệnh thay thế:

:s/\s/\r$/g 

Điều đó sẽ đặt mọi biến môi trường trên một dòng khác.

0

Dựa trên ý tưởng của ib và các ý kiến ​​từ ZYX, đây là chức năng mà tôi đã kết thúc bằng:

function! GetEnvVars() 
    silent execute "normal! :return $\<C-a>')\<C-b>\<C-right>\<Right>\<Del>split('\<CR>" 
endfunction 
Các vấn đề liên quan