contrib/gaphrase.el
author Oleksandr Gavenko <gavenkoa@gmail.com>
Sat, 20 Apr 2019 02:28:22 +0300
changeset 1141 879c410290ea
child 1145 79b55cca9f44
permissions -rw-r--r--
Added Emacs major mode for editing gaphrase dialog files.

;;; gaphrase.el --- major mode for editing gaphrase dialog files -*- lexical-binding: t -*-

;; Copyright (C) 2019 by Oleksandr Gavenko <gavenkoa@gmail.com>

;; You can do anything with this file without any warranty.

;; Author: Oleksandr Gavenko <gavenkoa@gmail.com>
;; Maintainer: Oleksandr Gavenko <gavenkoa@gmail.com>
;; Created: 2019
;; Version: 0.1
;; Keywords: dict, dictionary

;;; Commentary:
;;
;; Mode can be installed by:
;;
;;   (autoload 'gaphrase-mode "gaphrase")
;;
;; File association can be registered by:
;;
;;   (add-to-list 'auto-mode-alist (cons "\\.gaphrase$" 'gaphrase-mode))

;;; Code:

(defvar gaphrase-font-lock-keywords
  '(("^\\(__\\)\n\n" (1 font-lock-type-face))
    ("^\\(__\n?[^\n]+\\)" (1 highlight))
    ("^- " . font-lock-keyword-face)))

(defvar font-lock-beg)
(defvar font-lock-end)
(defun gaphrase-font-lock-extend-region ()
  ;; (gaphrase-font-lock-extend-region--debug)
  (save-excursion
    (goto-char font-lock-beg)
    (forward-line 0)
    (unless (looking-at "__")
      (re-search-backward "^__" (- (point) 10240) t))
    (if (= (point) font-lock-beg)
        nil
      (setq font-lock-beg (point)))))

(defun gaphrase-font-lock-extend-region--debug ()
  (save-excursion
    (let ( beg end )
      (goto-char font-lock-beg)
      (beginning-of-line)
      (setq beg (buffer-substring-no-properties (point) font-lock-beg))
      (goto-char font-lock-end)
      (end-of-line)
      (setq end (buffer-substring-no-properties font-lock-end (point)))
      (message "lines: %d, %s ## %s" (count-lines font-lock-beg font-lock-end) beg end))))

(defun gaphrase-insert-template ()
  (interactive)
  (forward-line 0)
  (unless (looking-at "__")
    (re-search-backward "^__" (- (point) 10240) t))
  (forward-line 1)
  (unless (re-search-forward "^__" (+ (point) 10240) t)
    (goto-char (point-max)))
  (forward-line 0)
  (while (memq (char-before) '(?\  ?\n ?\t))
    (delete-char -1))
  (insert "\n__\n\n- \n")
  (backward-char))

(define-derived-mode gaphrase-mode fundamental-mode "gaphrase"
  (setq font-lock-defaults '(gaphrase-font-lock-keywords))
  (setq font-lock-extend-region-functions (list #'gaphrase-font-lock-extend-region))
  (define-key (current-local-map) [C-return] 'gaphrase-insert-template))

(provide 'gaphrase)

;;; gaphrase.el ends here