diff --git a/scriba-mode.el b/scriba-mode.el new file mode 100644 index 0000000..bf684bd --- /dev/null +++ b/scriba-mode.el @@ -0,0 +1,127 @@ +;;; Variables + +(defgroup scriba nil + "Scriba Mode." + :link '(custom-group-link :tag "Font Lock Faces group" font-lock-faces) + :group 'docs) + +(defcustom scriba-mode-hook nil + "List of functions to call when entering Scriba mode." + :type 'hook + :options '(flyspell-mode)) + +;;; Syntax highlighting + +(defvar scriba-font-lock-keywords + '(("@[a-zA-Z]+" . font-lock-keyword-face) + ("@begin(\\([a-zA-Z]+\\))" 1 font-lock-function-name-face) + ("@end(\\([a-zA-Z]+\\))" 1 font-lock-function-name-face))) + +;;; Text insertion and manipulation + +(defun scriba-insert-at-sign () + (interactive) + (insert "@")) + +(defun scriba-insert-block (tag-name) + "Insert a @begin/@end block." + (interactive (list (read-string "Tag: "))) + (insert "@begin(" tag-name ")\n\n@end(" tag-name ")")) + +(defun scriba-insert-section (title) + "Insert a section." + (interactive (list (read-string "Title: "))) + (insert "@begin(section)\n@title(" title ")\n\n@end(section)")) + +(defun scriba-wrap-text (before-text after-text) + "Wrap the selected region in text." + (let ((begin (mark)) + (end (point))) + (save-restriction + (narrow-to-region begin end) + (goto-char (point-min)) + (insert before-text) + (goto-char (point-max)) + (insert after-text)))) + +(defun scriba-apply-markup (tag) + "Wrap the selected region in markup." + (scriba-wrap-text (concat "@" tag "(") + ")")) + +(defun scriba-boldify () + (interactive) + (scriba-apply-markup "b")) + +(defun scriba-italicize () + (interactive) + (scriba-apply-markup "i")) + +(defun scriba-underline () + (interactive) + (scriba-apply-markup "u")) + +(defun scriba-strikethrough () + (interactive) + (scriba-apply-markup "strike")) + +(defun scriba-codify () + (interactive) + (scriba-apply-markup "c")) + +(defun scriba-superscript () + (interactive) + (scriba-apply-markup "sup")) + +(defun scriba-subscript () + (interactive) + (scriba-apply-markup "sub")) + +;;; Keybindings + +(defvar scriba-mode-map + (let ((map (make-keymap))) + ;; Inserting strings + (define-key map "\t" 'scriba-insert-at-sign) + (define-key map "\C-c\C-cb" 'scriba-insert-block) + (define-key map "\C-c\C-cs" 'scriba-insert-section) + + ;; Markup + (define-key map "\C-c\C-sb" 'scriba-boldify) + (define-key map "\C-c\C-si" 'scriba-italicize) + (define-key map "\C-c\C-su" 'scriba-underline) + (define-key map "\C-c\C-ss" 'scriba-strikethrough) + (define-key map "\C-c\C-sc" 'scriba-codify) + (define-key map "\C-c\C-s^" 'scriba-superscript) + (define-key map "\C-c\C-sv" 'scriba-subscript) + map)) + +;;; Menu + +(easy-menu-define scriba-mode-menu + scriba-mode-map + "Menu used for `scriba-mode'." + '("Scriba" + ["Insert block" scriba-insert-block t] + ["Insert section" scriba-insert-section t] + "----" + ["Bold" scriba-boldify t] + ["Italic" scriba-italicize t] + ["Underline" scriba-underline t] + ["Strikethrough" scriba-strikethrough t] + ["Code" scriba-codify t] + ["Superscript" scriba-superscript t] + ["Subscript" scriba-subscript t])) + +;;; File extensions + +(add-to-list 'auto-mode-alist + '("\\.scr\\'" . scriba-mode)) + +;;; Mode + +(define-derived-mode scriba-mode text-mode "Scriba" + "Major mode for editing Scriba files." + (setq font-lock-defaults '((scriba-font-lock-keywords)))) + +(provide 'scriba)