Skip to content

Instantly share code, notes, and snippets.

@youz
Created December 23, 2010 05:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save youz/752609 to your computer and use it in GitHub Desktop.
Save youz/752609 to your computer and use it in GitHub Desktop.
xyzzyを侵略 (要api.l)
;;; -*- mode:lisp; package:shinryaku! -*-
(eval-when (:compile-toplevel :load-toplevel :execute)
(require "api"))
(provide "shinryaku!")
(defpackage "shinryaku!"
(:use :lisp :editor))
(in-package "shinryaku!")
(defvar *ika-mode-on* nil)
(defvar *ika-cmds* nil)
(defvar *original-mode-line* nil)
(defvar *original-title-bar* nil)
(defvar *icon-path* "~/etc/shokushu.ico")
(defvar *shokushu-icon*
"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
ykrLkBcqKD9RxcDAgIqv/j946l96++IKNhUAAA==
")
(defun set-shokushu-icon ()
(with-open-file (os *icon-path* :direction :output
:if-exists :supersede
:encoding :binary)
(princ (si:inflate-stream (si:base64-decode *shokushu-icon*)) os))
(winapi::SendMessage
(ed::get-window-handle) winapi::WM_SETICON 1
(winapi::LoadImage
0 (si:make-string-chunk
(map-slash-to-backslash
(namestring *icon-path*)))
winapi::IMAGE_ICON 0 0 winapi::LR_LOADFROMFILE)))
(defun revert-app-icon ()
(winapi::SendMessage
(ed::get-window-handle) winapi::WM_SETICON 1
(winapi::LoadImage
(winapi::GetModuleHandle 0)
(si:make-string-chunk "IDI_XYZZY")
winapi::IMAGE_ICON 0 0 winapi::LR_DEFAULTCOLOR)))
(defun user::shinryaku! ()
(interactive)
(unless *ika-mode-on*
(setq *ika-cmds* nil
*original-mode-line* mode-line-format
*original-title-bar* title-bar-format)
(do-external-symbols (s :editor)
#1=(when (fboundp s)
(let ((f (symbol-function s)))
(when (commandp f)
(let ((is (intern (format nil "~A-shinaIka?" s) "shinryaku!")))
(push is *ika-cmds*)
(setf (symbol-function is) f))))))
(do-symbols (s :user) #1#)
(push 'chizuru *ika-cmds*)
(setf (symbol-function 'chizuru) #'quit-ika-mode)
(define-history-variable *ika-cmd-history* nil)
(setf (get 'ika-execute 'ed::minibuffer-history-variable) '*ika-cmd-history*)
(global-set-key #\M-x 'ika-execute)
(setq mode-line-format (format nil "侵略! ~A" *original-mode-line*)
title-bar-format "海の家れもん - %b")
(set-shokushu-icon)
(refresh-title-bar)
(setq *ika-mode-on* t)))
(defun ika-execute (&optional raw arg)
(interactive "0P\np")
(let ((*prefix-args* raw)
(*prefix-value* arg)
(cmd (completing-read "M-x: " *ika-cmds* :history 'ika-execute)))
(setq *last-complex-command* nil)
(call-interactively (find-symbol cmd "shinryaku!"))))
(defun quit-ika-mode ()
(interactive)
(global-set-key #\M-x 'execute-extended-command)
(unregister-history-variable '*ika-cmd-history*)
(setq mode-line-format *original-mode-line*
title-bar-format *original-title-bar*
*ika-mode-on* nil)
(revert-app-icon)
(refresh-title-bar))
@youz
Copy link
Author

youz commented Dec 23, 2010

M-x shinryaku! で侵略開始

M-x chizuru で終了

screenshot: http://gyazo.com/52a223033d218a5d1c03affac81b9ec5.png

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment