[Trennmuster] Emacs-Helferlein

Werner LEMBERG wl at gnu.org
So Okt 23 09:14:17 CEST 2016


Angehängt findet sich eine kleine Datei mit nützlichen Helferlein für
die Bearbeitung von Wortlisten mit Emacs.  Ich bin kein guter
Elisp-Programmierer und kenne mich auch zuwenig mit den Emacs-Interna
aus; es gibt daher bestimmt viele Möglichkeiten, den Code zu
verbessern!

Geladen werden kann die Datei mit

  M-x load-file <RET> wortliste.el

Am Ende der Datei befinden sich die Tastenkürzel – auf meinem
GNU/Linux-Rechner verwende ich die »Windows«-Taste als
»super«-Modifizierer, daher »s-n« etc.  Bitte nach Geschmack anpassen!

Die vielleicht wichtigste Funktion ist »toggle-wortliste-isearch«, die
das Verhalten von C-s (also inkrementelles Suchen) verändert.  Ist der
Toggle gesetzt, werden beim Suchen von Wörtern die Trennmarker
»-=<>.·« ignoriert.  So findet beispielsweise die Eingabe
»aalangelfischerei« den Eintrag »Aal==an-gel=fi-sche-rei«.  Ich habe
den Toggle auf das Tastaturkürzel »s-s« gelegt.

Will man lange Listen von Wörtern inspizieren, finde ich es am
angenehmsten, wenn der Cursor immer auf der gleichen Bildschirmzeile
bleibt und stattdessen der Inhalt hinauf- oder hinunterverschoben
wird.  Die entsprechenden Funktionen finden sich als Tastaturkürzel
»s-n« (»next-line-and-recenter«) und »s-p«
(»previous-line-and-recenter«), in Analogie zu den Kürzeln »C-n« und
»C-p« (welche äquivalent zu den Hinauf- und Hinunter-Pfeiltasten
sind).

Hat man Listen der Form

   foobar;foo-bar
   barbarbar;bar=bar<bar
   foo;foo

und man will die Trennungen kontrollieren, kann es hilfreich sein, die
erste Spalte unsichtbar zu machen, damit man einen festen linken Rand
hat:

   foo-bar
   bar=bar<bar
   foo

Genau das macht die letzte Funktion, »make-first-word-invisible«.
Dieser Toggle läßt das erste Wort in der ganzen Datei unsichtbar oder
sichtbar werden; ich hab's auf das Tastaturkürzel »s-i« gelegt.


   Werner
-------------- nächster Teil --------------
;;; wortliste.el
;;;
;;; Werner Lemberg, October 2016


;; from an older version of font-lock.el
(defmacro save-buffer-state (varlist &rest body)
  "Bind variables according to VARLIST and eval BODY restoring
buffer state."
  (declare (indent 1) (debug let))
  (let ((modified (make-symbol "modified")))
    `(let* ,(append varlist
		    `((,modified (buffer-modified-p))
		      (buffer-undo-list t)
		      (inhibit-read-only t)
		      (inhibit-point-motion-hooks t)
		      (inhibit-modification-hooks t)
		      deactivate-mark
		      buffer-file-name
		      buffer-file-truename))
       (unwind-protect
	   (progn
	     , at body)
	 (unless ,modified
	   (restore-buffer-modified-p nil))))))


(defun make-first-word-invisible (&optional arg)
  "In all lines, make first word invisible and intangible.
With a prefix arg, make them visible again.

To be more precise, make everything before the second word invisible
and intangible.

This function applies to the whole buffer.

Note that this function modifies the `invisible' and `intangible'
text properties; it may thus interfere with modes which use them.
Due to implementation restrictions in current Emacs versions it
is not possible to use overlays -- which would avoid text
property modifications -- without becoming unbearably slow for
large buffers with many matches."
  (interactive "P")
  (save-excursion
    (cond
     (arg
      (save-buffer-state ((next-pos (point-min)))
	(while (setq next-pos
		     (text-property-any next-pos
					(point-max)
					'make-first-word-invisible
					t))
	  (goto-char next-pos)
	  (setq next-pos (or (next-single-property-change
			      (point)
			      'make-first-word-invisible)
			     (point-max)))
	  (remove-list-of-text-properties (point)
					  next-pos
					  '(make-first-word-invisible
					    invisible
					    intangible)))))
    (t
     (save-buffer-state ((start 0)
			 (end 0))
       (goto-char (point-min))
       (while (re-search-forward "^\\w+\\W+" nil t)
	 (setq start (match-beginning 0))
	 (setq end (match-end 0))
	 (add-text-properties start
			      end
			      '(make-first-word-invisible t
				invisible t
				intangible t))))))))


(defun next-line-and-recenter ()
  "Go to next line and recenter screen."
  (interactive)
  (next-line)
  (recenter))


(defun previous-line-and-recenter ()
  "Go to previous line and recenter screen."
  (interactive)
  (previous-line)
  (recenter))


(defun wortliste-isearch-function ()
  "Make isearch ignore characters -=<>. while searching."
  (if (not isearch-regexp)
      (lambda (string &optional bound noerror count)
	(funcall
	 (if isearch-forward
	     're-search-forward
	   're-search-backward)
	 (mapconcat (lambda (c) (regexp-quote (string c))) string
		    "\\(?:[-=<>.·]*\\)?")
	 bound
	 noerror
	 count))
    (isearch-search-fun-default)))


(defun toggle-wortliste-isearch ()
  "Toggle wortliste search mode.
If activated, incremental search skips characters -=<>.· while
searching.

For example, searching `foobar' matches `foo-bar' or `f-o-o=b<a>r'."
  (interactive)
  (if (eq isearch-search-fun-function 'isearch-search-fun-default)
      (progn
	(setq isearch-search-fun-function 'wortliste-isearch-function)
	(message "wortliste isearch on"))
    (setq isearch-search-fun-function 'isearch-search-fun-default)
    (message "wortliste isearch off")))


(global-set-key (kbd "s-n") 'next-line-and-recenter)
(global-set-key (kbd "s-p") 'previous-line-and-recenter)
(global-set-key (kbd "s-i") 'make-first-word-invisible)
(global-set-key (kbd "s-s") 'toggle-wortliste-isearch)

;; eof


Mehr Informationen über die Mailingliste Trennmuster