[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