Wie greife ich auf den Inhalt des aktuellen Bereichs in Emacs Lisp?
Frage
Ich möchte innerhalb einer Funktion, den Inhalt des aktuellen Bereichs als String zuzugreifen. Zum Beispiel:
(concat "stringa" (get-region-as-string) "stringb")
Danke
Ed
Lösung
buffer-substring
zusammen mit region-beginning
und region-end
das tun kann.
Andere Tipps
Wie sagt Starblue, kehrt (buffer-substring (mark) (point))
den Inhalt der Region, wenn die Marke gesetzt ist. Wenn Sie nicht wollen, die String Eigenschaften , Sie können die 'buffer-substring-no-properties
Variante verwenden.
Wenn Sie jedoch ein interaktive gerade schreiben Befehl, gibt es einen besseren Weg, um die Endpunkte der Region zu erhalten, das Formular (interactive "r")
verwenden. Hier ist ein Beispiel von simple.el
:
(defun count-lines-region (start end) "Print number of lines and characters in the region." (interactive "r") (message "Region has %d lines, %d characters" (count-lines start end) (- end start)))
Wenn Sie von Lisp-Code bezeichnet wird, wird die (interactive ...)
Form ignoriert, so dass Sie diese Funktion verwenden, können die Linien in jeder Teil des Puffers zu zählen, nicht nur die Region, indem Sie die entsprechenden Argumente übergeben: beispielsweise auf (count-lines-region (point-min) (point-max))
die Linien in der Einschnürung des Puffers zu zählen. Aber wenn interaktiv wird die (interactive ...)
Form ausgewertet und der "r"
Code liefert den Punkt und die Markierung, wie zwei numerische Argumente genannt, kleinste zuerst.
Sehen Sie die Emacs Lisp Handbuch, Abschnitte 21.2.1 Interactive und
Wenn Sie Region Inhalt in einem Lisp-Code an einen Benutzer zugänglichen Datenstruktur wie Kill-Ring, X Zwischenablage kopieren möchten oder registrieren, Emacs Lisp Handbuch empfiehlt zu verwenden filter-buffer-substring
anstatt einfach buffer-substring
. Vor dem Kopieren gilt die Funktion Filterfunktionen aus einer Liste Variable mit dem Namen filter-buffer-substring-functions
. Die Funktion wurde in Version 22.3 hinzugefügt.