2012-07-19 10 views
6

Tôi muốn xác định macro vim ngắt cho đầu vào của người dùng vào những thời điểm nhất định, điều này có khả thi không?Bạn có thể thực hiện các macro tương tác hoặc bản ghi trong vim không?

EDIT: Hóa ra tôi chữa ghi (q), không macro

Có thể sử dụng lệnh đầu vào trong một ghi âm, nhưng đó là nhiều rắc rối hơn nó có giá trị.

đầu tiên tôi ánh xạ chèn thoát đầu vào cho một chìa khóa

:map <F2> a<C-R>=input('input: ')<CR> 

sau đó tôi đã ghi âm này vào sổ đăng ký q

name: 

và dán nó vào một tab mới

iname: ^[ 

Và sau lần thoát cuối cùng tôi nhấn <C-V><F2> làm dòng:

iname ^[^[OQ 

Tôi đã quay trở lại bộ đệm q rồi sử dụng macro, cho phép tôi sử dụng chức năng nhập. Nó hoạt động, nhưng khủng khiếp.

Trả lời

3

Có. Xem hàm input({prompt}, [, {text} [, {completion}] ]). Thậm chí còn có inputdialog({prompt} [, {text} [, {cancelreturn}]]), để mở hộp thoại.

+0

vim thật tuyệt vời! là có bất kỳ câu hỏi như "tôi có thể làm xxx trong vim" với một không có câu trả lời? :) – moritz

+0

đầu vào() dường như không có sẵn trong macro (thậm chí không thông qua 'Ctrl-R = input ('prompt:')') nhưng nếu bạn ổn với ánh xạ thông thường hoặc chức năng nó sẽ thực hiện công việc độc đáo . – mogelbrod

+0

@VictorHallberg: Hmm. Chỉ cần (lại) đã thử. Làm việc cho tôi (Vim 7.3.547). Chỉ trong trường hợp, bạn có ý gì bởi _macro_? Không phải cái gì ': macro trợ giúp' giải thích? – fork0

1

Thật không may là dường như không thể. Bạn có thể kích hoạt input() bên trong macro, nhưng tiếp tục sau đó dường như không thể thực hiện được vì bất kỳ đầu vào bổ sung nào được ghi lại được chèn vào dấu nhắc nhập.

Đặt dòng vào thanh ghi có tên ("qY) và chạy nó (@q) để dùng thử.
Lưu ý: thay thế ^R^M bằng Ctrl-V Ctrl-R/M (xem :help i_CTRL-V).

  • oBEFORE ^R=input('prompt> ')- công trình
  • oBEFORE ^R=input('prompt> ')^Mitest- tác phẩm, nhưng chèn itest vào cửa sổ
  • oBEFORE ^R=input('prompt> ')<CR>test- không
+0

Tôi nhận thấy điều tương tự. Sẽ thật tuyệt nếu tính năng này được triển khai. – everett1992

+0

@ everett1992: Đó là, dưới dạng 'inputave()' và 'inputrestore()'; hãy nhìn vào câu trả lời của tôi. –

2

Nếu bạn sử dụng input() bên trong một bản đồ hoặc vĩ mô, các ký tự còn lại sẽ được lấy làm đầu vào, không phải là bạn muốn. Vim cung cấp các chức năng inputsave()inputrestore() để tạm thời ngừng đọc từ luồng ký tự ánh xạ.

Dựa trên câu trả lời của mogelbrod, điều này không hiệu quả; các itest được đọc trong khi đầu vào:

oBEFORE ^R=input('prompt> ')^Mitest 

Nhưng điều này không:

function! Input() 
    call inputsave() 
    let text = input('prompt> ') 
    call inputrestore() 
    return text 
endfunction 
oBEFORE ^R=Input()^Mitest 

Thật không may, bởi vì <C-R> mất một biểu thức, chúng ta không thể đặt các lệnh nội tuyến, nhưng phải xác định một Input() chức năng riêng biệt.