;;; -*- Emacs-Lisp -*- ;;; $Id: irex-input.el,v 3.0 1998/11/19 07:10:24 tsuchiya Exp $ ;; This file is part of IREX tools. ;; Please refer "Copyright file" at the root directory. ;; (C) IREX committee IREX実行委員会. All rights reserved. ;;; 依存関係に関する宣言 (provide 'irex-input) (require 'irex-judge) (require 'irex-tougou) ;;; 定数 / 変数の宣言 (defconst irex-input-buffer-name " *IREX-INPUT*") (defconst irex-input-prompt "# ---- この行よりも下に入力して下さい ----\n") (defvar irex-input-comment-docno nil "\ 入力中のコメントの対象となっている記事番号 irex-input-commebt / irex-input-comment-exit から参照されている") (defvar irex-input-keyword-list nil "\ 入力された単語のリストを保持する変数 irex-input-keyword / irex-input-keyword-exit から参照されている") ;;;---------------------------------------------------------------------- ;;; 自由文を入力するための関数 ;;;---------------------------------------------------------------------- (defun irex-input-string (prompt string exit-function quit-function &optional lisp-mode) "\ バッファ経由でコメントなどの自由文を入力するための関数 irex-input-mode のバッファを生成して、 PROMPT irex-input-prompt STRING から初期文字列を生成して、表示する。 C-c C-c に、EXIT-FUNCTION をバインドして、入力から抜けるためのコマンドを設定する。 C-c C-g に、QUIT-FUNCTION をバインドして、入力を中断するためのコマンドを設定する。 LISP-MODE が nil 以外の場合は、major-mode として、text-mode から派生した irex-input-text-mode の代わりに emacs-lisp-mode から派生した irex-input-lisp-mode を利用する。また、LISP-MODE の場合、ウインドウの分割状態も変更している。 " (let ((b (get-buffer-create irex-input-buffer-name)) (w (if lisp-mode (irex-judge-split-window) (irex-judge-split-window-2)))) (set-window-buffer w b) (select-window w) (set-buffer b) (erase-buffer) (cond (lisp-mode (irex-input-lisp-mode) (define-key irex-input-lisp-mode-map "\C-c\C-c" exit-function) (define-key irex-input-lisp-mode-map "\C-c\C-g" quit-function)) (t (irex-input-text-mode) (define-key irex-input-text-mode-map "\C-c\C-c" exit-function) (define-key irex-input-text-mode-map "\C-c\C-g" quit-function))) (insert (concat (or prompt "") (or irex-input-prompt "") (or string ""))) (set-buffer-modified-p nil) )) (define-derived-mode irex-input-text-mode text-mode "IREX-INPUT-TEXT" "Major mode to input strings from buffer. \\{irex-input-text-mode-map}") (define-derived-mode irex-input-lisp-mode lisp-mode "IREX-INPUT-LISP" "Major mode to input lists from buffer. \\{irex-input-lisp-mode-map}") (defun irex-input-exit () (and (get-buffer irex-input-buffer-name) (kill-buffer irex-input-buffer-name)) (setq irex-input-comment-docno nil irex-input-keyword-list nil)) ;;;---------------------------------------------------------------------- ;;; コメントを入力するためのコマンド ;;;---------------------------------------------------------------------- (defun irex-input-comment () "コメントを入力するためのコマンド" (interactive) (or irex-input-comment-docno (setq irex-input-comment-docno (irex-list-get-docno))) (irex-input-string "\ # コメントの入力が終ったら、C-c C-c と入力して下さい。(Ctrl キーを押しながら c を2回押す) # コメントの入力を中断する場合は、C-c C-g と入力して下さい。 " (irex-tougou-get-comment-string irex-input-comment-docno) 'irex-input-comment-exit 'irex-input-comment-quit)) (defun irex-input-comment-exit () "コメントの入力を終了するためのコマンド" (interactive) (cond ((and (equal (buffer-name) irex-input-buffer-name) irex-input-comment-docno) (goto-char (point-min)) (cond ((search-forward irex-input-prompt nil t) (or (eobp) ; 何も入力されていない場合は、何もしない。 (irex-tougou-write-comment irex-input-comment-docno (point-marker) (point-max-marker))) (setq irex-input-comment-docno nil) (irex-judge-split-window) (select-window (get-buffer-window (get-buffer irex-list-buffer-name) t))) (t (message "指示された場所に入力して下さい") (irex-input-comment)) )))) (defun irex-input-comment-quit () "コメントの入力を中断するためのコマンド" (interactive) (setq irex-input-comment-docno nil) (irex-judge-split-window) (select-window (get-buffer-window (get-buffer irex-list-buffer-name) t))) ;;;---------------------------------------------------------------------- ;;; 単語のリストを入力するためのコマンド ;;;---------------------------------------------------------------------- (defun irex-input-keyword () "強調表示したい単語のリストを入力するためのコマンド" (interactive) (irex-input-string "\ # 強調表示したい単語を改行で区切って入力して下さい。 # ただし、指定された単語が複数行にまたがって表示されている場合は強調表示されません。 # 入力が終ったら、C-c C-c と入力して下さい。(Ctrl キーを押しながら c を2回押す) # 入力を中断する場合は、C-c C-g と入力して下さい。 " (and irex-input-keyword-list (mapconcat '(lambda (w) w) (append irex-input-keyword-list '("")) "\n")) 'irex-input-keyword-exit 'irex-input-keyword-quit)) (defun irex-input-keyword-exit () "強調表示したい単語のリストの入力を終了するためのコマンド" (interactive) (cond ((equal (buffer-name) irex-input-buffer-name) (goto-char (point-min)) (cond ((search-forward irex-input-prompt nil t) (let (s l) (while (progn (setq s (buffer-substring (point) (progn (end-of-line) (point)))) (or (= (length s) 0) (setq l (cons s l))) (goto-char (1+ (point))) (not (eobp)) )) (setq irex-input-keyword-list (reverse l))) (message "%d個の単語が強調表示されました。" (irex-article-highlight-word irex-input-keyword-list)) (irex-judge-split-window) (select-window (get-buffer-window (get-buffer irex-list-buffer-name) t))) (t (message "指示された場所に入力して下さい") (irex-input-keyword)) )))) (defun irex-input-keyword-quit () (interactive) (irex-judge-split-window) (select-window (get-buffer-window (get-buffer irex-list-buffer-name) t)))