逆引きxyzzy lisp(GUI) - circleratio/xyzzy GitHub Wiki

目次

文字入力

バッファ内で入力プロンプト

(defvar *prompt* "> ")

(defun eval-line ()
  (interactive)
  (if (save-excursion
	(goto-bol)
	(looking-at (concat "^ *" *prompt*)))
      (let ((cmd (buffer-substring (match-end 0)
				   (progn
				     (goto-eol)
				     (point)))))
	(insert (concat "\n"
			(eval-cmd cmd)))))
  (insert (concat "\n" *prompt*)))

(defun eval-cmd (cmd) ; 実際に使うときは書き換えること!
  cmd)

ミニバッファで入力

(defun minibuf-prompt (prompt display-as-password)
  (let ((ans ""))
    (loop
      (minibuffer-prompt (concat prompt
				 (if display-as-password
				     (substitute-string ans "." ".")
				   ans)))
      (let ((c (read-char *keyboard*)))
	(case c
	  ((#\RET #\C-j) (return ans))
	  ((#\C-h #\C-?) (if (> (length ans) 0)
			     (setq ans (subseq ans 0 (1- (length ans))))))
	  (#\C-g (quit))
	  (t (setq ans (format nil "~A~C" ans c))))))))

(minibuf-prompt "test:" t)

ミニバッファで補完入力+履歴管理をする(デフォルトの履歴に間借り)

(setq foo-history '("abc" "def" "ghi"))
=> ("abc" "def" "ghi")

(defun foo ()
  (interactive)
  (list
   (let ((*minibuffer-default-history* foo-history))
     (prog1
	 (completing-read
	  "foo: "
	  '("foo" "bar" "baz")
	  :must-match nil
	  :case-fold t)
       (setq foo-history *minibuffer-default-history*)))))

ミニバッファで補完入力+履歴管理をする(履歴管理用の変数を定義する)

(setq *test-history* '("history1" "history2" "history3"))
=> ("history1" "history2" "history3")

(setf (get 'test-minibuf 'ed::minibuffer-history-variable) '*test-history*)
=> *test-history*

(defun test-minibuf ()
  (interactive)
  (completing-read "cmd: "
		   '("cmd1" "cmd2" cmd3 cmd4)
		   :case-fold t
		   :default "default"
		   :history 'test-minibuf
		   :must-match nil))

変数の定義に setq でなく define-history-variable を使うと、xyzzy の終了時にファイルに履歴を保存してくれるようになる。

ダイアログ

ダイアログでのボタン選択を case で場合分け

(case (message-box "Are you ready?" nil
		   '(:yes-no-cancel :question :button1))
  (:yes "yes")
  (:no "no")
  (:cancel "cancel")
  (t "Not to be reached"))
=> "yes"

対話的な Yes/No の問い合わせ

(yes-or-no-p "yes or no?")
=> t

情報ダイアログを表示

(msgbox "buf: ~A" (selected-buffer))
=> :ok

ポップアップ

ポップアップリストを呼び出す

(defun func ()
  (popup-list
   '("123" "abc" "xyz")
   #'(lambda (x) (msgbox "\"~A\" selected" x))))

文字列のポップアップ表示

ツールチップ風の表示。

(popup-string "test!" (point) 1)

最後の引数(表示時間)は省略可。

⚠️ **GitHub.com Fallback** ⚠️