Có cách nào để phát hiện nếu tôi đang ghi trong vimscript không?


11

Có gì giống như

eval("is_recording()")

mà tôi có thể gọi trong vimscript của mình để tìm hiểu xem hiện tại tôi có đang ghi macro không? Tôi đã có thể nghĩ rằng điều này hoạt động:

eval("mode(1)")

nhưng điều đó chỉ trở lại "n".

Không chắc nó có vấn đề gì không, nhưng tôi đang sử dụng neovim, vì vậy nếu nó là độc quyền của neovim, thì không sao.


3
IMHO sẽ là một ý tưởng tồi - "ghi âm", trong trường hợp đó, sẽ trở thành một tên giả :) Không biết bạn đang cố gắng làm gì, nhưng có lẽ việc hỏi câu hỏi đó có thể cung cấp các cách khác nhau để giải quyết nó.
VanLaser

@VanLaser Bạn có ý gì với tên giả?
James

1
Nếu một hành động Vim khác khi bạn ghi nó, điều đó có nghĩa là chính quá trình ghi ảnh hưởng đến hành động đó, khi đó chỉ nên "lưu trữ" nó để lặp lại sau. Bạn mong đợi điều gì sẽ xảy ra khi bạn chạy macro?
VanLaser

Câu trả lời:


4

Thứ nhất, tôi nghĩ rằng vấn đề của bạn chủ yếu là vấn đề XY . Bạn nên cung cấp cho chúng tôi thêm thông tin về những gì bạn đang cố gắng làm cuối cùng và tôi nghĩ rằng chúng ta có thể tìm thấy một giải pháp khác.

Bây giờ đây là một cách giải quyết, nó có thể không lý tưởng và chắc chắn không mạnh mẽ lắm nhưng bạn có thể thêm những dòng này vào .vimrc:

let g:isRecording = 0
nnoremap Q :call ToggleRecording()<CR>q

function! ToggleRecording()
    let g:isRecording = !g:isRecording
    echo "is recording " . g:isRecording
endfunction

Ý tưởng là "chế độ ghi" được bật riêng khi bạn nhấn qở chế độ bình thường.

Dựa vào đó, bạn tạo một biến g:isRecordingsẽ được bật mỗi lần bạn bắt đầu hoặc dừng ghi. Cách này khi bạn bắt đầu ghi g:isRecordingsẽ được đặt thành 10khi bạn dừng ghi. Sau đó, bạn có thể truy cập trạng thái ghi thông qua giá trị của biến.

"Hạn chế" là để tránh ánh xạ đệ quy, bạn sẽ phải sử dụng Shit-q để bắt đầu và dừng ghi thay vì q. (Lưu ý rằng đó không phải là một vấn đề lớn: Tôi đã sử dụng shift-qđể chuyển đổi chế độ ghi trong một thời gian vì tôi không thích shift-qhành vi ban đầu )

Vấn đề chính của giải pháp này là nếu bạn quên nó và sử dụng qbiến sẽ không được bật nhưng bạn không thể vô hiệu hóa q(ví dụ như với nnoremap q <nop>) bởi vì nếu bạn shift-qkhông làm việc nữa.


2

Đây là một yêu cầu khá tò mò vì không có "chế độ" để ghi macro. Sau khi đào qua một số tài liệu tôi đã tìm thấy những điều sau đây trongusr_10

Bạn bắt đầu bằng cách di chuyển đến ký tự đầu tiên của dòng đầu tiên. Tiếp theo bạn thực hiện các lệnh sau:

qa Bắt đầu ghi một macro trong đăng ký a .

^ Di chuyển đến đầu dòng.

i # bao gồm "Chèn chuỗi #include" ở đầu dòng.

$ Di chuyển đến cuối dòng.

một "Nối dấu ngoặc kép kép (") vào cuối dòng.

j Đi đến dòng tiếp theo.

q Dừng ghi macro.

Điều nổi bật với tôi là dòng về "Bắt đầu ghi một macro khi đăng ký"

Vì mỗi macro sẽ được lưu vào một đăng ký theo mặc định, tôi đã hy vọng rằng chúng ta sẽ có thể nhìn thấy nó trong :regdanh sách. Hóa ra nó hoạt động như một lá bùa!

Thí dụ:

Ở chế độ bình thường: qaisomething<Esc>

và bên trong :regchúng ta thấy mục!

"a   isomething^[

Với kiến ​​thức đó, bạn sẽ có thể "theo dõi" các thanh ghi để xác nhận rằng một macro đang được ghi lại (sử dụng một thanh ghi có tên trên mỗi bản ghi [bản đồ qđể luôn sử dụng cùng một thanh ghi (hoặc đại loại như thế)]

Nếu bạn gặp vấn đề hãy cho tôi biết và tôi sẽ cố gắng giúp bạn (vì chức năng này cũng mới đối với tôi: D)

chỉnh sửa Để giải quyết vấn đề về một thanh ghi đang được sử dụng trong thời gian yank, tôi khuyên bạn nên xem xét một loại đăng ký đặc biệt mà bạn chỉ có thể sử dụng cho việc vimLbạn đang viết (không có yank nào được tham gia vào đăng ký ( "ay))

Đây là một chút thông tin từ :help registerstrên các thanh ghi có sẵn

Có mười loại thanh ghi: thanh ghi E354

  1. Sổ đăng ký không tên ""

  2. 10 thanh ghi được đánh số "0 đến" 9

  3. Thanh ghi xóa nhỏ "-

  4. 26 thanh ghi có tên "a đến" z hoặc "A đến" Z

  5. ba thanh ghi chỉ đọc ":,"., "%

  6. thanh ghi bộ đệm thay thế "#

  7. thanh ghi biểu thức "=

  8. Các thanh ghi lựa chọn và thả "*," + và "~

  9. Thanh ghi lỗ đen "_

  10. Đăng ký mẫu tìm kiếm cuối cùng "/

Giả sử rằng bạn có một thanh ghi mà bạn sẽ sử dụng bây giờ, vấn đề sẽ trở thành "làm sao tôi biết khi nào quá trình ghi bị dừng?". Để giải quyết vấn đề này, tôi sẽ xem xét autocmd-eventcho CursorHold; ghi chú trong tài liệu trợ giúp có vẻ khá hứa hẹn (Tôi sẽ cố gắng tìm hiểu làm thế nào tôi có thể phân biệt con trỏ bình thường với sự kiện nhàn rỗi / không tồn tại xảy ra khi đăng ký của bạn được viết cho mục đích của macro)

Con trỏ

Khi người dùng không nhấn phím trong khoảng thời gian được chỉ định bằng 'updatetime'. Không được kích hoạt lại cho đến khi người dùng nhấn một phím (tức là không kích hoạt mỗi 'updatetime' ms nếu bạn rời Vim để pha cà phê. :) Xem | CoderHold-example | để xem trước các thẻ. Sự kiện này chỉ được kích hoạt ở chế độ Bình thường. Nó không được kích hoạt khi chờ đợi một đối số lệnh được gõ hoặc một chuyển động sau một toán tử. Trong khi ghi lại sự kiện CthonHold không được kích hoạt. | q |


Tôi thực sự không thấy nó giải quyết vấn đề như thế nào: khi bạn hoàn thành ghi macro của mình, một chuỗi được lưu trong thanh ghi nhưng làm thế nào để bạn phân biệt khi thanh ghi chứa macro hoặc khi nó chứa thứ gì đó đến từ lệnh yank chẳng hạn. Ngoài ra, thanh ghi được lưu dưới dạng một lần chụp khi bạn kết thúc ghi để khi bạn thấy rằng nội dung của thanh ghi đã thay đổi, bạn không còn ở chế độ ghi nữa.
statox

Tôi hy vọng rằng bạn sẽ có thể sử dụng một cái gì đó như thanh ghi lỗ đen (một thanh ghi sẽ không được kéo dài đến bao giờ). Nếu bạn đã đăng ký khóa đó thì bạn có thể kiểm tra CthonHold có một số hành vi đặc biệt khi ở chế độ ghi (sẽ cập nhật câu trả lời của tôi với một số thông tin khác để xem có giúp được không)
Dan Bradbury

đã thêm một số thông tin trên các thanh ghi khác (cách để tránh xung đột với yank) và một gợi ý về cách chúng tôi có thể bắt "ghi âm" với CthonHold không hoạt động trong khi ghi macro. Nếu bạn vẫn đang chiến đấu với điều này sau khi những ghi chú đó cho tôi biết và tôi có thể cố gắng thực hiện nó sau khi kết thúc công việc. Như một lưu ý, blackhole registernó chỉ được đề cập như một gợi ý và một vid tidbit thú vị có thể dẫn đến một cái gì đó (sẽ không hữu ích khi sử dụng macro; vì @_ không thể sử dụng được.) Thực tế bạn thậm chí không thể lưu macro với nó ..
Dan Bradbury

Tôi đã dành một chút thời gian cho đêm qua này (đập bàn phím bia) và thấy rất khó để tìm ra chính xác khi nào việc ghi âm đang diễn ra và kết thúc. Linh cảm của tôi về CursorHolddường như là một giấc mơ không thể do sự chậm trễ của CursorHold thực tế xảy ra (thực hiện một sự gia tăng toàn cầu đơn giản để xảy ra mọi lúc để xem điều này). Vẫn cực kỳ thích thú với việc tìm ra cách để làm điều này và sẽ tiếp tục đập mặt tôi vào chìa khóa cho đến khi chúng tôi có giải pháp ..
Dan Bradbury

Theo tôi, bạn không có hàng ngàn lựa chọn khác nhau: bạn phải ghi đè hành vi qvà biến nó thành một biến và bắt đầu / dừng ghi. Một autocomand không thể đáng tin cậy ở đây vì không có autocmd kích hoạt trên một phím bấm và không thể thực hiện chức năng bỏ phiếu do tính chất đơn điệu của Vim. Chúc may mắn với các thử nghiệm trong tương lai của bạn :-)
statox
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.