Skip to content

Instantly share code, notes, and snippets.

@bowbow99
Created October 12, 2012 10:48
Show Gist options
  • Save bowbow99/3878662 to your computer and use it in GitHub Desktop.
Save bowbow99/3878662 to your computer and use it in GitHub Desktop.
#xyzzy のキーワード編集用モード
;;; -*- 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