Cách thức mở rộng sơ đồ bàn phím để chèn ký hiệu unicode?


7

Tôi thường thấy mình cần chèn các ký tự Unicode không có ràng buộc mặc định iso-transl-ctl-x-8-map, nghĩa là các ký tự không thể được chèn bằng cách sử dụng C-x 8theo sau bởi một hoặc nhiều ký tự / ký tự dấu chấm câu.

Để thêm các ràng buộc vào C-x 8sơ đồ bàn phím, tôi thường

  1. xác định lệnh tùy chỉnh để chèn một ký tự Unicode đã cho, chẳng hạn như:

    (defun ucs-rightwards-arrow ()
      "Insert unicode symbol: →"
      (interactive)
      (insert-char #x2192))
  2. thêm một ràng buộc cho lệnh này vào bản đồ thông qua

    (define-key iso-transl-ctl-x-8-map (kbd "a") 'ucs-rightwards-arrow)

C-x 8sơ đồ bàn phím thực sự chỉ ghép các ràng buộc chính với các ký tự đơn lẻ mà tôi đang tự hỏi:

Q: Có cách nào nhẹ nhàng hơn / thành ngữ để mở rộng C-x 8sơ đồ bàn phím không?

Câu trả lời:


7

Không cần xác định lệnh để ràng buộc char unicode:

(define-key 'iso-transl-ctl-x-8-map "a" [?α])

liên kết α với C-x 8 a. Trong khi

(define-key 'iso-transl-ctl-x-8-map (kbd "M-s") [?ς])

liên kết đến C-x 8 M-s.


1
Mảng có thể được hoán đổi cho một chuỗi btw, điều đó sẽ làm cho nó ngắn hơn một byte.
wasamasa

4

Thư viện ucs-cmds.elcó thể giúp đỡ.

Nó cung cấp một macro, ucsc-make-commandsđể nhanh chóng tạo ra một tập hợp các lệnh chèn các ký tự Unicode. Bạn cung cấp biểu thức chính quy cho nó, khớp với tất cả các tên ký tự Unicode (in ucs-names). Lệnh chèn được tạo cho mỗi ký tự có tên trùng khớp. (Tên lệnh về cơ bản giống như tên char - xem bên dưới.)

Sáng tạo lệnh mẫu:

 (ucsc-make-commands "^math") ; Math symbols
 (ucsc-make-commands "latin") ; Latin alphabet characters
 (ucsc-make-commands "arabic")
 (ucsc-make-commands "^cjk")  ; Chinese, Japanese, Korean characters
 (ucsc-make-commands "^box drawings ")
 (ucsc-make-commands "^greek [a-z]+ letter") ; Greek characters
 (ucsc-make-commands "\\(^hangul\\|^circled hangul\\|^parenthesized hangul\\)")

Đây là chuỗi doc:

ucsc-make-commands is a Lisp macro in `ucs-cmds.el'.

(ucsc-make-commands REGEXP)

Create commands to insert Unicode characters whose names match REGEXP.
Letter case is ignored for matching.

The set of char names used is taken from `ucs-names'.  There are
*many* such chars, so consider using a tighter regexp to limit the
number of commands created.

The commands created have the same names as the chars they insert,
except that `SPC' chars in the character names are replaced by
hyphens (`-'), and the command names are lowercase.

Nếu bạn muốn liên kết các lệnh bạn tạo với các khóa theo cách có hệ thống, thì bạn có thể dễ dàng tạo một macro dựa trên mã của ucsc-make-commandscả hai tạo ra các lệnh bạn muốn và liên kết chúng. Macro ucsc-make-commandschỉ lặp lại trên tất cả các xe Unicode và tạo các lệnh cho những người có tên khớp với REGEXPđối số.

Trong một lần lặp, bạn có quyền truy cập vào tên nhân vật và điểm mã của nó. Chỉ ra một ánh xạ thường xuyên thuận tiện của các điểm mã hoặc tên char cho các khóa và macro của bạn có thể thêm các define-keys thích hợp ngoài lệnh defuns.


Thư viện cũng cung cấp một lệnh, ucsc-insertcó thể thay thế lệnh vanilla insert-char. Hành vi và mã ucsc-insertgiống hệt với hành vi insert-charngoại trừ những gì xảy ra khi bạn sử dụng đối số tiền tố phủ định:

  1. Nó hoạt động như thể giá trị tiền tố-arg là dương. Vì vậy, giá trị -3 chèn ba bản sao của ký tự, giống như 3.

  2. Ngoài việc chèn ký tự, nó xác định một lệnh mà bạn có thể sử dụng sau đó để chèn ký tự đó. Bạn có thể sử dụng một đối số tiền tố với lệnh đó để chèn nhiều bản sao của ký tự đã cho.

Điều này cung cấp cho bạn một lệnh được thiết kế riêng để chèn một ký tự Unicode đã cho. Sau đó, bạn có thể liên kết lệnh với một chuỗi khóa, thêm hiệu quả các ký tự Unicode vào bàn phím của bạn.

Bất cứ khi nào insert-charlàm bất cứ điều gì (nó không làm gì cho tiền tố phủ định arg), ucsc-insertcũng làm điều tương tự. Vì điều này, bạn có thể liên kết ucsc-insertđể C-x 8 RETthay thế cho insert-char:

(define-key global-map [remap insert-char] 'ucsc-insert)

Nếu bạn chỉ cần một vài lệnh như vậy để chèn các ký tự Unicode cụ thể, thì sử dụng ucsc-insertđể xác định chúng là đủ thuận tiện. Nếu bạn cần rất nhiều lệnh như vậy thì macro ucsc-make-commandslà bạn của bạn.


Cảm ơn, có ucsc-insertvẻ như nó có thể giúp bao gồm các trường hợp sử dụng của tôi. Xác định các lệnh mới tương tác (thông qua M-- M-x ucsc-insert RET #x2190 RET) hoạt động tốt, nhưng khi tôi cố gắng thực thi chúng (sau khi ràng buộc chúng thông qua (define-key iso-transl-ctl-x-8-map (kbd "b") 'left-arrow)) tôi nhận được "Đối số kiểu sai: wholenump, nil". Bạn có thể đưa ra một ví dụ về cách ucsc-insertcó thể được sử dụng để xác định lập trình một ràng buộc cho một ký tự Unicode cụ thể không?
itjeyd

Bạn đúng! Có một lỗi ở đây. Đã sửa lỗi trên Emacs Wiki ucs-cmds.el. Nên được nhân đôi với MELPA trong vòng 24 giờ. Cám ơn.
vẽ

Vui mừng tôi đã có thể giúp bạn tìm và sửa lỗi :) Bây giờ tôi có thể xác định và liên kết các lệnh để chèn các ký hiệu Unicode cụ thể thông qua (ucsc-insert #x2192 -1) (define-key ctl-x-map (kbd "8 a") 'right-arrow), điều này chắc chắn ngắn gọn hơn so với phương pháp ban đầu của tôi. Tôi cần phải hỏi, tuy nhiên, nếu đây là dự định cách sử dụng ucsc-insertđể xác định lệnh cho các ký hiệu Unicode mà vẫn tồn tại xuyên suốt các phiên? Tôi có cảm giác nó có thể không xảy ra, bởi vì nó khiến Emacs chèn các ký tự mà tôi đang xác định các lệnh tùy chỉnh vào *scratch*bộ đệm khi khởi động ...
itjeyd

Mục đích sử dụng của ucsc-insertnó là để nó hoạt động giống như ucs-insert, hay insert-char, trừ khi bạn sử dụng tiền tố phủ định arg - nó luôn chèn một char . Nếu bạn không muốn chèn một char, nhưng chỉ muốn xác định một lệnh để chèn một char, thì bạn có thể sử dụng macro ucsc-make-commands. Nhưng bạn đã đúng (một lần nữa) rằng sẽ rất tốt nếu có một hàm chỉ định nghĩa một lệnh duy nhất. Vì vậy, tôi đã thêm chức năng (lệnh) ucsc-define-char-insert-cmd. Ví dụ: (ucsc-define-char-insert-cmd 8592)xác định lệnh và trả về ký hiệu của nó , left-arrow. Hãy thử mới nhất. Cám ơn.
vẽ

Cảm ơn, sẽ dùng thử khi bản cập nhật biến nó thành MELPA!
itjeyd
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.