Dịch chuỗi sang nhấn phím


8

Đưa ra một chuỗi trong elisp, tôi muốn mô phỏng các emacs nhận bất kỳ phím nhấn nào là cần thiết để tạo lại chuỗi đó. Vì vậy, các chuỗi emacs "Hello" sẽ hoạt động giống hệt như khi tôi nhấn Shift + H, e, l, l, o. Lưu ý rằng điều này không phải lúc nào cũng giống như chèn văn bản vào bộ đệm - một số chế độ như chế độ isearch nghe trực tiếp các sự kiện nhấn phím.

Lý do điều này là cần thiết là vì có rất nhiều chế độ và tiện ích mở rộng đưa ra giả định rằng tất cả đầu vào đến từ bàn phím hoặc đưa ra giả định rằng mọi thay đổi bộ đệm / cửa sổ / khung sẽ được liên kết với sự kiện nhập bàn phím và rất nhiều thời gian họ kiểm tra dữ liệu liên quan đến sự kiện đó. Đối với chế độ nhận dạng giọng nói mà tôi làm việc để hoạt động trơn tru với phần mã hiện có, nó không thể gọi trực tiếp vào elisp để thực hiện các hành động, thay vào đó, nó cần phải nói với elisp nhấn phím để khiến những hành động đó xảy ra.

Tôi đã tìm thấy các sự kiện lệnh chưa đọc, nhưng tôi không biết bất kỳ mã hiện có nào sẽ dịch các chuỗi thành các chuỗi khóa cần thiết. Có một cái gì đó như thế đã tồn tại?

Câu trả lời:


5

Làm

(execute-kbd-macro (kbd "Hello"))

Làm việc bằng cơ hội nào?


2
Nó sẽ hoạt động trong trường hợp này, nhưng không phải với chuỗi "C-Beams" chẳng hạn. Một cách để tránh nó là thêm khoảng trắng giữa mỗi nhân vật. (let ((string "C-Beams")) (execute-kbd-macro (kbd (mapconcat #'char-to-string string " "))))sẽ làm việc. Có lẽ có một cách tốt hơn ...
YoungFrog

Hmm, thủ thuật mapconcat không hoạt động nếu chuỗi thực sự chứa khoảng trắng, ví dụ "chùm C" trở thành "Cbeams". (execute-kbd-macro (kbd "SPC"))mặc dù nó hoạt động, vì vậy bạn có thể viết một cái gì đó phức tạp hơn một chút so với mapconcat để thực hiện thay thế đó ... điều này khiến tôi lo lắng mặc dù có thể có các khóa liên quan khác mặc dù cần điều trị đặc biệt này.
Joseph Garvin

Có vẻ như các dòng mới và các tab cũng có vấn đề này. Tôi có thể đối phó với việc thay thế SPC / RET / TAB, mặc dù tôi tự hỏi liệu toàn bộ cách tiếp cận này sẽ có vấn đề với bàn phím quốc tế.
Joseph Garvin

(mapc (lambda (char) (execute-kbd-macro (char-to-string char))) string)Có vẻ hoạt động tốt. Nhưng (tất nhiên?) Nếu có một ký tự tab, nó sẽ giả vờ rằng nó đang nhấn TAB, có thể không bị ràng buộc với một lệnh chèn một tab thực tế ...
YoungFrog

@YoungFrog: dường như vẫn bị phá vỡ bởi \ n
Joseph Garvin

4

Được rồi, vì vậy câu trả lời đầu tiên của tôi có một số thiếu sót như chi tiết trong các bình luận của nó.

exec-kbd-macro là một hàm tích hợp trong C source code.

(execute-kbd-macro MACRO &optional COUNT LOOPFUNC)

Thực thi MACRO dưới dạng chuỗi các ký tự lệnh biên tập. MACRO cũng có thể là một vector của các sự kiện bàn phím . Nếu MACRO là một ký hiệu, định nghĩa chức năng của nó được sử dụng. COUNT là số lần lặp lại hoặc không cho một lần hoặc 0 cho vòng lặp vô hạn.

LOOPFUNC thứ ba tùy chọn có thể là một hàm được gọi trước mỗi lần lặp của macro. Lặp lại dừng nếu LOOPFUNC trả về nil.

(nhấn mạnh của tôi)

Vì vậy, một giải pháp để chuyển một chuỗi thẳng tới Emacs như các phím bấm riêng lẻ là:

(defun insert-via-kbd (str)
  (execute-kbd-macro (vconcat str)))

Điều này có vẻ hoạt động khá tốt (thậm chí còn xử lý tiếng Nhật!), Nhưng vẫn còn một số điều kỳ lạ:

  • \nsẽ kích hoạt C-j(không C-m, REThay <return>)
  • \tsẽ kích hoạt TAB(không <tab>)
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.