Created
October 12, 2012 10:48
-
-
Save bowbow99/3878662 to your computer and use it in GitHub Desktop.
#xyzzy のキーワード編集用モード
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;;; -*- mode: lisp; package: keyword-mode -*- | |
;;; | |
;;; keyword-mode.l --- Major mode for editing keyword file for xyzzy. | |
;;; Code: | |
(defpackage :keyword-mode | |
(:use :lisp :editor)) | |
(in-package :keyword-mode) | |
(export '(keyword-mode | |
*keyword-mode-hook* | |
*keyword-mode-keymap* | |
*keyword-mode-syntax-table* | |
keyword-mode-update-keyword-table | |
keyword-mode-update-keyword-table-on-save | |
)) | |
;;;; "I'm the keyword file" thing | |
(defun keyword-mode-update-keyword-table (&optional save) | |
(interactive) | |
(when (and (need-buffer-save-p (selected-buffer)) | |
(or save | |
(and (interactive-p) | |
(yes-or-no-p "•Û‘¶‚·‚éH")))) | |
(save-buffer)) | |
(let ((filename (get-buffer-file-name))) | |
(when (and filename | |
(file-exist-p filename)) | |
(make-local-variable 'keyword-hash-table) | |
(setf keyword-hash-table (load-keyword-file filename)) | |
(use-syntax-table (keyword-mode-syntax-table))))) | |
;; for `*after-save-buffer-hook*` | |
(defun keyword-mode-update-keyword-table-on-save () | |
(when (eq buffer-mode 'keyword-mode) | |
(keyword-mode-update-keyword-table))) | |
(defparameter *keyword-mode-syntax-table* | |
(let ((syntab (make-syntax-table))) | |
(set-syntax-start-comment syntab #\;) | |
(set-syntax-end-comment syntab #\LFD) | |
syntab)) | |
(defun keyword-mode-syntax-table (&optional (base *keyword-mode-syntax-table*)) | |
(let ((syntab (make-syntax-table))) | |
(copy-syntax-table base syntab) | |
(when (hash-table-p keyword-hash-table) | |
;; Make every character used in keywords a symbol char to get highlighted | |
(maphash (lambda (keyword v) | |
(when (stringp keyword) | |
(dotimes (i (length keyword)) | |
(let ((c (char keyword i))) | |
(unless (or (syntax-word-p c syntab) | |
(syntax-symbol-p c syntab)) | |
(set-syntax-symbol syntab c)))))) | |
keyword-hash-table)) | |
syntab)) | |
;;;; Everyday major mode stuff | |
(defvar *keyword-mode-hook* nil) | |
(defparameter *keyword-mode-keymap* | |
(let ((keymap (make-sparse-keymap))) | |
keymap)) | |
(defun keyword-mode () | |
(interactive) | |
(kill-all-local-variables) | |
(setf buffer-mode 'keyword-mode | |
mode-name "Keyword") | |
(use-syntax-table (keyword-mode-syntax-table)) | |
(use-keymap *keyword-mode-keymap*) | |
(keyword-mode-update-keyword-table) | |
(run-hooks '*keyword-mode-hook*)) | |
;;;; setup | |
(use-package :keyword-mode :user) | |
(add-hook '*after-save-buffer-hook* 'keyword-mode-update-keyword-table-on-save) | |
;; sometimes I name a keyword file "SomeLang.kwd" | |
(pushnew '("\\.kwd$" . keyword-mode) *auto-mode-alist* | |
:key #'car :test #'equal) | |
;; hopefully work for normal cases | |
(defun maybe-start-keyword-mode () | |
(let ((filename (get-buffer-file-name))) | |
(when (and filename | |
(null (pathname-type filename)) ; no extension | |
(let ((dir (directory-namestring filename))) | |
(or (member dir *keyword-load-path* :test #'path-equal) | |
(path-equal dir *etc-path*))) | |
(eq buffer-mode *default-buffer-mode*)) | |
(keyword-mode)))) | |
(add-hook '*find-file-hooks* 'maybe-start-keyword-mode) | |
(provide "keyword-mode") | |
;;; keyword-mode.l ends here |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment