Files
2012-emacs/kurs.el
2025-03-05 11:47:46 +01:00

138 lines
3.6 KiB
EmacsLisp

;; Modus for Emacs-kurs.
;; Last inn denne filen med `M-x load-file <RET>' og si `M-x
;; kurs-mode' i emacs-kurs.txt.
(defface kurs-overskrift-face
`((((type tty) (class color))
(:foreground "blue"))
(((type tty) (class mono))
(:inverse-video t))
(((class color) (background dark))
(:foreground "lightblue" :weight bold :height 200))
(((class color) (background light))
(:foreground "darkblue" :weight bold :height 200))
(t (:foreground "blue" :weight bold :height 200)))
"Kurs-overskrift")
(defvar kurs-tittel "kurs")
(defvar kurs-mode-map nil)
(setq kurs-mode-map (make-sparse-keymap))
(define-key kurs-mode-map " " 'kurs-neste-side)
(define-key kurs-mode-map "n" 'kurs-neste-side)
(define-key kurs-mode-map "p" 'kurs-forrige-side)
(define-key kurs-mode-map (kbd "<DEL>") 'kurs-forrige-side)
(define-key kurs-mode-map "g" 'kurs-hopp)
(define-key kurs-mode-map "<" 'kurs-topp)
(define-key kurs-mode-map ">" 'kurs-bunn)
(define-key kurs-mode-map "\M-?" 'kurs-info)
(defun kurs-neste-side (&optional arg)
"Gå til neste side i kurset.
Med prefiksargument N, gå N sider forover."
(interactive "p")
(when (> (point) (point-min))
;; avoid moving two pages when point is at end of page
(backward-char))
(widen)
(forward-page arg)
(narrow-to-page))
(defun kurs-forrige-side (&optional arg)
"Gå til forrige side i kurset.
Med prefiksargument N, gå N sider bakover."
(interactive "p")
(widen)
(backward-page)
(backward-page arg)
(narrow-to-page))
(defun kurs-topp ()
"Gå til første side."
(interactive)
(widen)
(goto-char (point-min))
(narrow-to-page))
(defun kurs-bunn ()
"Gå til siste side."
(interactive)
(widen)
(goto-char (point-max))
(narrow-to-page))
(defun kurs-sidenr ()
"Returnerer nåværende sidenummer."
(save-restriction
(widen)
(save-excursion
(let ((sidenr 1)
(pt (point)))
(goto-char 1)
(while (re-search-forward page-delimiter pt t)
(setq sidenr (1+ sidenr)))
sidenr))))
(defun kurs-antall-sider ()
"Returnerer antall sider i bufferet."
(save-restriction
(widen)
(save-excursion
(goto-char (point-max))
(kurs-sidenr))))
(defun kurs-hopp (n)
"Gå til en bestemt side."
(interactive "nHopp til side: ")
(let ((hopp-pt
(save-restriction
(widen)
(save-excursion
(let ((sidenr 1)
(pt (point)))
(goto-char 1)
(while (and (< sidenr n)
(re-search-forward page-delimiter))
(setq sidenr (1+ sidenr)))
(point))))))
(widen)
(goto-char hopp-pt)
(narrow-to-page)))
(defun kurs-info ()
"Vis nåværende sidenummer og antall sider."
(interactive)
(message "Side %d av %d" (kurs-sidenr) (kurs-antall-sider)))
(setq kurs-mode-font-lock-keywords
'(("^((.*))$" . 'kurs-overskrift-face)))
(defun kurs-finn-tittel ()
(save-excursion
(goto-char (point-min))
(search-forward-regexp "((\\(.*\\)))")
(buffer-substring-no-properties
(match-beginning 1)
(match-end 1))))
(define-derived-mode kurs-mode fundamental-mode "kurs"
"Durmodus for Emacs-kurs.
Begrenser vist tekst til én side av gangen. Bruk `n' og `p' for
å skifte side. For å se alle sidene, si `C-x n w' (widen). Bruk
`M-?' for å finne ut hvor i filen du er."
(setq mode-name "kurs")
(setq font-lock-defaults '(kurs-mode-font-lock-keywords))
(make-local-variable 'kurs-tittel)
(setq kurs-tittel (kurs-finn-tittel))
(setq header-line-format
'((:eval kurs-tittel)
": side "
(:eval (number-to-string (kurs-sidenr)))
" av "
(:eval (number-to-string (kurs-antall-sider)))))
(narrow-to-page))
(provide 'kurs-mode)