68 lines
1.7 KiB
EmacsLisp
68 lines
1.7 KiB
EmacsLisp
|
;;; long-s-mode.el --- Proper typography for Emacs -*- lexical-binding: t; -*-
|
|||
|
|
|||
|
;;; Commentary:
|
|||
|
|
|||
|
;; from Catie on #emacs
|
|||
|
|
|||
|
;;; Code:
|
|||
|
|
|||
|
(define-minor-mode long-s-mode
|
|||
|
"Minor mode for inserting 'ſ' characters")
|
|||
|
|
|||
|
(defconst +long-s+ ?ſ)
|
|||
|
(defconst +short-s+ ?s)
|
|||
|
|
|||
|
(defun long-s-p (char)
|
|||
|
(char-equal char +long-s+))
|
|||
|
|
|||
|
(defun short-s-p (char)
|
|||
|
(or (char-equal char +short-s+)))
|
|||
|
|
|||
|
(defun s-char-p (char)
|
|||
|
(or (long-s-p char)
|
|||
|
(short-s-p char)))
|
|||
|
|
|||
|
(defun alpha-char-p (char)
|
|||
|
(memq (get-char-code-property char 'general-category)
|
|||
|
'(Ll Lu Lo Lt Lm Mn Mc Me Nl)))
|
|||
|
|
|||
|
(defun long-s-insert-short-s ()
|
|||
|
(interactive)
|
|||
|
(if (long-s-p (preceding-char))
|
|||
|
(insert-char +short-s+)
|
|||
|
(insert-char +long-s+)))
|
|||
|
|
|||
|
(defun long-s-insert-space ()
|
|||
|
(interactive)
|
|||
|
(if (long-s-p (preceding-char))
|
|||
|
(progn (delete-backward-char 1)
|
|||
|
(insert-char +short-s+))
|
|||
|
(save-excursion
|
|||
|
(while (not (alpha-char-p (preceding-char)))
|
|||
|
(backward-char))
|
|||
|
(when (long-s-p (preceding-char))
|
|||
|
(delete-backward-char 1)
|
|||
|
(insert-char +short-s+))))
|
|||
|
(insert-char ?\ ))
|
|||
|
|
|||
|
(defvar long-s-mode-map
|
|||
|
(let ((map (make-sparse-keymap)))
|
|||
|
(set-keymap-parent map (current-global-map))
|
|||
|
(define-key map (kbd "s") #'long-s-insert-short-s)
|
|||
|
(define-key map (kbd "SPC") #'long-s-insert-space)
|
|||
|
map))
|
|||
|
|
|||
|
(setq long-s-mode-map
|
|||
|
(let ((map (make-sparse-keymap)))
|
|||
|
(define-key map (kbd "s") #'long-s-insert-short-s)
|
|||
|
(define-key map (kbd "SPC") #'long-s-insert-space)
|
|||
|
map))
|
|||
|
|
|||
|
(unless (seq-some #'(lambda (x) (eq (car x) 'long-s-mode))
|
|||
|
minor-mode-map-alist)
|
|||
|
(push (cons 'long-s-mode long-s-mode-map)
|
|||
|
minor-mode-map-alist))
|
|||
|
|
|||
|
(provide 'long-s-mode)
|
|||
|
;;; long-s-mode.el ends here
|