Tự động chèn một khoảng trắng khi chèn một ký tự tùy thuộc vào ký tự trước đó


8

Thông thường sau khi chèn dấu chấm câu như . , :tôi tạo khoảng trắng trước khi chèn ký tự tiếp theo. Có thể là Emacs tự động thực hiện hành vi này? Ví dụ: chèn một cái gì đó giống như .xkết quả khi gõ trong . xđó xlà một ký tự tùy ý (ngoại trừ một số trường hợp cụ thể được loại trừ bởi người dùng, ví dụ như trường hợp xspacechính nó).

Đôi khi điều này có thể giúp tăng tốc độ gõ.


2
Có thể nhìn vào điều này: nhà điều hành thông minh
mẫu

Câu trả lời:


8

Toán tử thông minh có vẻ đầy hứa hẹn, nhưng tôi chưa thử nó vì vậy tôi không thể nói cho nó. Một giải pháp dựng sẵn sẽ là lý tưởng, nhưng nếu không có gì là đủ, thì sẽ rất dễ dàng để viết chức năng này và bọc nó trong một chế độ nhỏ.

Đây là tôi đi:

(defvar auto-punc-punctuation-members
  (string-to-list ".,:;?!")
  "List of charactesr to insert spaces after")

(defvar auto-punc-ignore-members
  (string-to-list " \t")
  "List of characters to not auto insert spaces before")

(defun auto-punc-maybe-do ()
  "If the last entered character is not in `auto-punc-punctuation-members' or `auto-punc-ignore-members',
and the prior character is in `auto-punc-punctuation-members',
insert a space between the two characters. "
  (when (and auto-space-punctuation-mode
             (not (member (char-before) (append auto-punc-punctuation-members auto-punc-ignore-members)))
             (member (char-before (1- (point))) auto-punc-punctuation-members))
    (backward-char 1)
    (insert " ")
    (forward-char 1)))

(define-minor-mode auto-space-punctuation-mode
  "Automatically inserts spaces between some punctuation and other characters."
  :init-value nil
  :lighter "._a"
  :keymap nil
  (make-variable-buffer-local 'post-self-insert-hook)
  (if auto-space-punctuation-mode
      (add-hook 'post-self-insert-hook 'auto-punc-maybe-do)
    (remove-hook 'post-self-insert-hook 'auto-punc-maybe-do)))

Bạn có thể chỉ cần thêm nó vào init và tự động kích hoạt nó khi bạn muốn

(add-hook 'text-mode-hook 'auto-space-punctuation-mode)

Mỗi khi bạn chèn một ký tự mà hàm auto-punc-maybe-dochạy, hãy đọc chuỗi doc để đảm bảo đây là hành vi bạn muốn. Về cơ bản nếu bạn gõ dấu câu, thì bất cứ thứ gì không có dấu chấm câu hoặc khoảng trắng, một khoảng trắng sẽ được chèn tự động.


2
Tôi xác nhận rằng giải pháp của bạn hoạt động hoàn hảo ở chế độ văn bản.
Tên

1
Thật tuyệt, thật vui khi nghe nó. Tôi vừa cập nhật mã để làm cho bộ đệm `post-self-insert-hook cục bộ, nếu bạn đã lấy mã trước đó, bạn có thể thấy chế độ làm việc trong các bộ đệm mà bạn không mong đợi vì nó có thể đã được thêm vào trên toàn cầu, tạo ra cái mới mã nên sửa nó.
Jordon Biondo

2

Bạn có thể quan tâm đến toán tử điện , đó là một chế độ nhỏ khá chung để thêm khoảng cách xung quanh các toán tử (chủ yếu cho các chế độ lập trình, nhưng nó cũng hoạt động ở chế độ văn bản).

Mặc dù vậy, nó không nhìn vào những gì bạn đã nhập sau toán tử, vì vậy hiện tại nó không thể xử lý phần "chỉ thêm một khoảng trắng nếu tôi chưa gõ một phần" câu hỏi của bạn.

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.