Automatisches Einfügen eines Leerzeichens beim Einfügen eines Zeichens in Abhängigkeit vom vorherigen Zeichen


8

Normalerweise . , :mache ich nach dem Einfügen von Satzzeichen ein Leerzeichen, bevor ich das nächste Zeichen einfüge. Ist es möglich, dass Emacs dieses Verhalten automatisch ausführt? Wenn Sie beispielsweise so etwas einfügen, wird Folgendes .xeingegeben, . xwobei xes sich um ein beliebiges Zeichen handelt (mit Ausnahme einiger vom Benutzer ausgeschlossener Sonderfälle, z. B. wenn xes sich um ein spaceselbst handelt).

Manchmal kann dies helfen, das Tippen zu beschleunigen.


2
Vielleicht schauen Sie sich das an: Smart-Operator
Kindermädchen

Antworten:


8

Smart Operator sieht vielversprechend aus, aber ich habe es nicht ausprobiert, sodass ich nicht dafür sprechen kann. Eine vorgefertigte Lösung wäre ideal, aber wenn keine ausreicht, wäre es sehr einfach, diese Funktionalität zu schreiben und in einem kleinen Modus zu verpacken.

Hier ist mein Los:

(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)))

Sie können es einfach zu Ihrem Init hinzufügen und automatisch aktivieren, wenn Sie möchten

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

auto-punc-maybe-doLesen Sie jedes Mal, wenn Sie ein Zeichen einfügen, das die Funktion ausführt, die Dokumentzeichenfolge, um sicherzustellen, dass dies das gewünschte Verhalten ist. Wenn Sie Interpunktion eingeben, wird automatisch ein Leerzeichen eingefügt, wenn es sich nicht um Interpunktion oder Leerzeichen handelt.


2
Ich bestätige, dass Ihre Lösung im Textmodus perfekt funktioniert.
Name

1
Großartig, froh es zu hören. Ich habe gerade den Code aktualisiert, um den `Post-Self-Insert-Hook-Puffer lokal zu machen. Wenn Sie den Code früher abgerufen haben, funktioniert der Modus möglicherweise in Puffern, die Sie nicht erwarten, da er möglicherweise global hinzugefügt wurde, und führt den neuen aus Code sollte es beheben.
Jordon Biondo

2

Sie könnten an einem elektrischen Operator interessiert sein , es ist ein ziemlich allgemeiner Nebenmodus zum Hinzufügen von Abständen um Operatoren (hauptsächlich für Programmiermodi, aber es funktioniert auch in Textmodi).

Es wird jedoch nicht angezeigt, was Sie nach dem Operator eingegeben haben, sodass der Teil Ihrer Frage "Nur ein Leerzeichen hinzufügen, wenn ich noch keinen eingegeben habe" derzeit nicht verarbeitet werden kann.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.