Làm cách nào để phát hiện tổ hợp phím không chỉnh sửa bộ đệm?


8

Cách tốt nhất để phát hiện tổ hợp phím (ví dụ: thông qua một cái móc) không chỉnh sửa bộ đệm là gì? Ý tôi là những thứ như phím mũi tên cho chuyển động điểm, gọi đến beginning-of-buffer, v.v.

Lý do cho điều này là vì tôi đang làm việc với một số ycmdràng buộc cho emacs và tôi muốn có thể phát hiện (ít nhất là theo kinh nghiệm) khi người dùng đã ngừng chỉnh sửa và đang di chuyển xung quanh bộ đệm. Đây là thời điểm tốt để chuyển nội dung bộ đệm ra để phân tích cú pháp. Máy khách vim thực hiện việc này khi người dùng thoát khỏi chế độ chèn và tôi đang cố gắng mô phỏng hành vi đó.


8
Bạn có thể quan tâm đến bộ đếm thời gian nhàn rỗi cho loại công cụ này: gnu.org/software/emacs/manual/html_node/elisp/Idle-Timers.html
giordano

2
Một ý tưởng khác (hoặc sàng lọc ý tưởng với bộ hẹn giờ nhàn rỗi): khuyên bạn nên self-insert-commandhủy và sắp xếp lại bộ hẹn giờ thay vì sử dụng bộ hẹn giờ nhàn rỗi. Bằng cách này, ngay cả khi người dùng làm gì đó, bộ hẹn giờ sẽ không được đặt lại trừ khi "cái gì đó" là chèn văn bản.
mbork

2
mbork: after-change-functionslà một cơ chế chung để phản ứng với các thay đổi văn bản.
phils

1
Sử dụng a post-command-hook. Điều đó sẽ kích hoạt mọi thứ, vì vậy bạn có thể cần thực hiện một số bộ lọc về những gì đã kích hoạt nó trước khi thực hiện bất kỳ hành động nào bạn muốn.
Malabarba

1
Không chắc nó có liên quan đến vấn đề cụ thể này không, nhưng buffer-chars-modified-tickchức năng có thể hữu ích.
Jon O.

Câu trả lời:


2

Thêm các móc sau:

  • Để pre-command-hook, đặt một số biến sentinel thành t- điều này báo hiệu lệnh không thay đổi.
  • Để after-change-functions, đặt giá trị sentinel này thành nil. (Đây là một cái móc, nó không giống âm thanh nào cả, cảm ơn @phils đã chỉ ra điều này.)
  • Để post-command-hook, kiểm tra giá trị sentinel này và chạy chức năng của bạn.

Điều này có thể hoặc có thể không hoạt động tùy thuộc vào thứ tự thực hiện. Nếu không, hãy cho tôi biết trong các ý kiến ​​dưới đây.


Khi tôi nghỉ làm, tôi sẽ đăng một ví dụ.


Tôi phải đi làm ngay bây giờ
Sean Allred

2
Đừng khuyên tự chèn. Sử dụng các chức năng sau khi thay đổi
Malabarba

Tôi sẽ cho nó một shot khi tôi có cơ hội.
abingham

4
@abingham Theo nguyên tắc chung, hook thích hợp hơn cho lời khuyên. Móc được thiết kế đặc biệt để bạn gắn các chức năng, trong khi lời khuyên là cách để gắn một cái gì đó ở những nơi không mong muốn. Trong trường hợp cụ thể này, bạn cũng không nên tư vấn một số hàm rất cơ bản, vì nó tương tác không đáng tin cậy với quá trình biên dịch byte.
Malabarba

2
Tôi nghĩ Sean có ý muốn nói đến post-self-insert-hook(câu trả lời đó có vẻ khó hiểu với câu hỏi đó self-insert-command). Trong mọi trường hợp, tôi nghĩ bạn thường thích after-change-functionsbởi vì nó thực sự làm những gì bạn muốn (vì tự chèn không phải là loại hành trình phím duy nhất sửa đổi bộ đệm).
phils

0

Chỉ là một ý nghĩ -

Đây thực sự không phải là về "tổ hợp phím", mà là về các lệnh - cho dù chúng được thực thi như thế nào, phải không ? Nếu tôi hiểu chính xác, bạn thực sự đang tìm cách để biết liệu một lệnh đã cho được gọi có sửa đổi bộ đệm hay không.

Nếu vậy, sau đó có thể làm một cái gì đó như thế này:

  • Đặt một hàm trên pre-command-hookđó (1) ghi lại giá trị hiện tại (buffer-modified-p)và sau đó (2) sử dụng set-modified-pđể làm cho bộ đệm không bị thay đổi.

  • Đặt một hàm trên post-command-hookđó (1) kiểm tra xem lệnh có sửa đổi bộ đệm hay không (bằng cách so sánh giá trị được ghi với giá trị hiện tại mới (buffer-modified-p)), sau đó hành động tương ứng và (2) nếu giá trị mới được nilđặt lại thành giá trị thay đổi trước sử dụng set-modified-p.

Loại nặng tay (nó kiểm tra từng lệnh được gọi), nhưng nó có thể đáng để thử.

Nếu phần " hành động tương ứng " chỉ là phần không cho tất cả các lệnh sửa đổi bộ đệm và nếu đó cũng là phần không cho nhiều lệnh không sửa đổi (ví dụ: vì bạn vừa thực hiện nó trên lệnh không sửa đổi trước đó), sau đó ít nhất bạn sẽ không thực hiện hành động " hành động phù hợp " đó nhiều hơn mức cần thiết. Nhưng chỉ riêng phần kiểm tra có thể tốn kém / quá mức (làm chậm quá nhiều thứ) - hãy thử để xem.

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.