138 lines
3.6 KiB
EmacsLisp
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)
|