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.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1141
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     1
;;; gaphrase.el --- major mode for editing gaphrase dialog files -*- lexical-binding: t -*-
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     2
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     3
;; Copyright (C) 2019 by Oleksandr Gavenko <gavenkoa@gmail.com>
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     4
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     5
;; You can do anything with this file without any warranty.
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     6
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     7
;; Author: Oleksandr Gavenko <gavenkoa@gmail.com>
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     8
;; Maintainer: Oleksandr Gavenko <gavenkoa@gmail.com>
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     9
;; Created: 2019
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    10
;; Version: 0.1
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    11
;; Keywords: dict, dictionary
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    12
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    13
;;; Commentary:
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    14
;;
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    15
;; Mode can be installed by:
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    16
;;
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    17
;;   (autoload 'gaphrase-mode "gaphrase")
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    18
;;
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    19
;; File association can be registered by:
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    20
;;
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    21
;;   (add-to-list 'auto-mode-alist (cons "\\.gaphrase$" 'gaphrase-mode))
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    22
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    23
;;; Code:
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    24
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    25
(defvar gaphrase-font-lock-keywords
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    26
  '(("^\\(__\\)\n\n" (1 font-lock-type-face))
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    27
    ("^\\(__\n?[^\n]+\\)" (1 highlight))
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    28
    ("^- " . font-lock-keyword-face)))
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    29
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    30
(defvar font-lock-beg)
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    31
(defvar font-lock-end)
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    32
(defun gaphrase-font-lock-extend-region ()
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    33
  ;; (gaphrase-font-lock-extend-region--debug)
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    34
  (save-excursion
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    35
    (goto-char font-lock-beg)
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    36
    (forward-line 0)
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    37
    (unless (looking-at "__")
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    38
      (re-search-backward "^__" (- (point) 10240) t))
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    39
    (if (= (point) font-lock-beg)
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    40
        nil
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    41
      (setq font-lock-beg (point)))))
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    42
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    43
(defun gaphrase-font-lock-extend-region--debug ()
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    44
  (save-excursion
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    45
    (let ( beg end )
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    46
      (goto-char font-lock-beg)
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    47
      (beginning-of-line)
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    48
      (setq beg (buffer-substring-no-properties (point) font-lock-beg))
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    49
      (goto-char font-lock-end)
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    50
      (end-of-line)
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    51
      (setq end (buffer-substring-no-properties font-lock-end (point)))
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    52
      (message "lines: %d, %s ## %s" (count-lines font-lock-beg font-lock-end) beg end))))
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    53
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    54
(defun gaphrase-insert-template ()
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    55
  (interactive)
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    56
  (forward-line 0)
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    57
  (unless (looking-at "__")
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    58
    (re-search-backward "^__" (- (point) 10240) t))
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    59
  (forward-line 1)
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    60
  (unless (re-search-forward "^__" (+ (point) 10240) t)
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    61
    (goto-char (point-max)))
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    62
  (forward-line 0)
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    63
  (while (memq (char-before) '(?\  ?\n ?\t))
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    64
    (delete-char -1))
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    65
  (insert "\n__\n\n- \n")
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    66
  (backward-char))
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    67
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    68
(define-derived-mode gaphrase-mode fundamental-mode "gaphrase"
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    69
  (setq font-lock-defaults '(gaphrase-font-lock-keywords))
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    70
  (setq font-lock-extend-region-functions (list #'gaphrase-font-lock-extend-region))
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    71
  (define-key (current-local-map) [C-return] 'gaphrase-insert-template))
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    72
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    73
(provide 'gaphrase)
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    74
879c410290ea Added Emacs major mode for editing gaphrase dialog files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    75
;;; gaphrase.el ends here