2013-08-12 29 views
20

Trong vimscript, sự khác biệt giữa callexecute là gì? Trong kịch bản/trường hợp sử dụng nào tôi nên sử dụng cái này so với trường hợp khác?gọi vimscript và thực thi

(Tuyên bố từ chối trách nhiệm, tôi biết về trợ giúp trực tuyến mở rộng có sẵn trong vim - Tôi đang tìm câu trả lời ngắn gọn cho câu hỏi cụ thể này).

Trả lời

12

Từ kinh nghiệm của các văn bản bổ sung của riêng tôi và đọc mã của người khác:

: gọi: Được sử dụng để gọi chức năng:

function! s:foo(id) 
    execute 'buffer' a:id 
endfunction 

let target_id = 1 
call foo(target_id) 

: thực hiện: Được sử dụng cho hai điều:

1) Tạo chuỗi và đánh giá chuỗi đó. Điều này thường được sử dụng để truyền tham số cho lệnh:

execute 'source' fnameescape('l:path') 

2) Đánh giá giá trị trả về của một hàm (cho là giống nhau):

function! s:bar(id) 
    return 'buffer ' . a:id 
endfunction 

let target_id = 1 
execute s:bar(target_id) 
17
  • :call: Gọi hàm.
  • :exec: Thực hiện chuỗi dưới dạng lệnh Ex. Nó có ý nghĩa tương tự eval (trong javascript, python, vv)

Ví dụ:

function! Hello() 
    echo "hello, world" 
endfunction 

call Hello() 

exec "call Hello()" 
+0

Trong những kịch bản tôi muốn sử dụng một trong vs người kia? Hoặc là thực hiện chỉ khi bạn cần lập trình soạn lệnh để thực thi? – noahlz

+0

Bạn có thể xây dựng một lệnh động và 'exec' nó. Tuy nhiên, bạn chỉ có thể gọi một hàm theo tên. – kev

+2

Bạn có thể muốn hiển thị một ví dụ về xây dựng một lệnh cũ bằng cách sử dụng exec và chuỗi nối. – FDinoff

0

Xem Switch to last-active tab in VIM

ví dụ

: exe " tabn ".g: lasttab

Nơi g: lasttab là biến toàn cục để lưu trữ số tab hiện tại và số đó được nối với "tabnext" để chuyển đổi thành số tab 1 (Nếu g: lasttab ví dụ: có chứa '3' chẳng hạn)

Toàn bộ chuỗi đó "" tabn ".g: lasttab < được đánh giá và thực hiện bởi lệnh exec của VIM.

HTH?

2

Câu trả lời ngắn

Bạn có thể thấy call lần đầu tiên đánh giá biểu thức và sau đó loại bỏ kết quả. Vì vậy, chỉ có các tác dụng phụ hữu ích.

Long trả lời

Xác định:

function! Foo() 
    echo 'echoed' 
    return 'returned' 
endfunction 

Gọi:

:call Foo() 

Output:

echoed 

Execute:

:execute Foo() 

Output:

echoed 
EXXX: Not an editor command: returned 

Execute:

:silent let foo = Foo() 
:echo foo 

Output:

returned 
Các vấn đề liên quan