Wie kann man Leerzeichen nach dem Ziehen automatisch anpassen?

7

Beim Bearbeiten von Text in menschlicher Sprache und beim Verschieben von Textfragmenten stoße ich häufig auf das Problem, dass Leerzeichen, die am Anfang oder Ende eines Fragments verschoben wurden, nicht in die neue Position passen. Betrachten Sie zum Beispiel diesen Absatz:

This is the first sentence.  This is the second sentence.  These
three sentences are the whole paragraph.

Wenn ich den letzten Satz vor dem ersten durch kill + yank verschiebe, habe ich entweder ein führendes oder ein nachfolgendes Leerzeichen. Ein ähnliches Problem tritt bei Aufzählungen auf.

Ein anderer Anwendungsfall ist, wenn ich ein einzelnes Wort oder einen Ausdruck einfügen möchte, der sich im Kill-Ring befindet, ohne nachgestellte oder führende Leerzeichen. Betrachten Sie beispielsweise das Wort "sehr" im Tötungsring und den folgenden Satz:

Such a minor mode would be useful.

Nach dem Ziehen kann dies fälschlicherweise werden:

Such a minor mode would bevery useful.

Gibt es eine Möglichkeit, Leerzeichen in menschlichen Texten automatisch anzupassen?

Torsten Bronger
quelle

Antworten:

3

Hier ist eine Funktion, delete-leading-whitespace-on-linedie Sie tun können, wie der Name schon sagt:

(defun delete-leading-whitespace-on-line ()
  "Delete whitespace at the beginning of the current line."
  (interactive)
  (let ((start (line-beginning-position))
        (end (line-end-position)))
    (save-excursion
      (delete-whitespace-rectangle start end nil))))

Für nachgestellte Leerzeichen verwende ich M-x delete-trailing-whitespace.

Um diese nach dem Ziehen auszulösen, können Sie Folgendes tun:

(defun yank-and-trim-whitespace ()
  "Yank and then trim whitespace on the line."
  (interactive)
  (yank)
  (delete-leading-whitespace-on-line)
  (delete-trailing-whitespace))

und binde es wie folgt:

(global-set-key "\C-y" 'yank-and-trim-whitespace)

Vielleicht möchten Sie auch den Whitespace-Cleanup-Modus von Steve Purcell ausprobieren , einen kleinen Modus, der:

ruft intelligent die Whitespace-Bereinigung auf, bevor Puffer gespeichert werden.

PS Sein GitHub-Account ist eine Fundgrube an Emacs Goodies.

yurrriq
quelle
Ich habe noch keinen Ruf, aber hier ist ein Link zur entsprechenden Dokumentation: gnu.org/software/emacs/manual/html_node/emacs/…
yurrriq
Sind die call-interactivelyhier notwendig? Können Sie nicht einfach die Funktionen aufrufen?
Erikstokes
@erikstokes, guter Fang. Die call-interactivelysind überflüssig.
Yurrriq
Ich denke, call-interactivelyhier zu verwenden würde es funktionieren lassen yank-pop.
Politza
1

Dies scheint zu tun, was Sie gefragt haben. Wenn dagegen bereits zusätzliche Leerzeichen vorhanden sind, bleiben diese wie zuvor erhalten.

  (defun yank-and-adjust-whitespace ()
  (interactive)
  (if (equal (char-after) ?\s)
      (progn
        (insert " ")
        (yank))
    (if (eolp) (if (bolp) (yank)
        (if (equal (char-before) ?\s)
            (yank)
          (insert " ")
          (yank)))
      (yank)
      (insert " "))))

Wie die Antwort von Eric Bailey können Sie die folgende Verknüpfung zuordnen.

(global-set-key "\C-y" 'yank-and-adjust-whitespace)

Die Verwendung eolp/bolpwurde von https://emacs.stackexchange.com/a/13741/ ausgeliehen .

Name
quelle
@wasamasa Dank für die Bearbeitung, sah ich , dass Sie geändert haben ? zu ?\s. Es scheint, dass beide funktionieren. Ich bin interessiert über ihre Unterschiede zu wissen.
Name
1
Richtig, beide sind gleichwertig. Das Handbuch empfiehlt dies ?\sjedoch, da es viel weniger verwirrend aussieht als ? und sicherstellt, dass Sie ein Leerzeichen zuordnen möchten, anstatt es falsch zu tippen.
Wasamasa