;;;; prime.el -- Prime 用 Emacs Lisp ;;;; ;;;; AUTHOR: 小松弘幸 ;;;; LICENSE: GPL2 ;;;; ;;;; $Id: prime.el,v 1.7 2003/05/18 22:34:32 komatsu Exp $ (defconst prime-version '("1.0.1" "2003-05-19")) (require 'poe) ;; in APEL (require 'font-lock nil t) (require 'mell) (require 'mell-event) (require 'mell-string) (require 'prime-main) (require 'prime-fund-mode) (require 'prime-conv-mode) (require 'prime-input-mode) (require 'prime-enum-mode) (require 'prime-style) (require 'prime-socialite) (require 'prime-log) (or (require 'suikyo nil t) (load "suikyo/suikyo")) ; - 汎用関数 ----------------------------------------------------------- (defun prime-set-minor-mode (name modeline &optional key-map) (make-variable-buffer-local name) (or (assq name minor-mode-alist) (setq minor-mode-alist (cons (list name modeline) minor-mode-alist))) (and key-map (or (assq name minor-mode-map-alist) (setq minor-mode-map-alist (cons (cons name key-map) minor-mode-map-alist)))) ) ;(defun prime-mode-key-binding (defun prime-make-keymap (&optional default) (let ((map (make-sparse-keymap))) (and default (if (functionp 'set-keymap-default-binding) ;; Emacs にはない. (set-keymap-default-binding map default) (setq map (append map (list (cons t default)))))) map )) ; ---------------------------------------------------------------------- ;; キーマップの設定 (defvar prime-fund-mode-map nil "PRIMEモードのキーマップ") (defvar prime-input-mode-map nil "パタン入力中のキーマップ") (defvar prime-conv-mode-map nil "候補選択中のキーマップ") (defvar prime-cand-mode-map nil "候補一覧選択のキーマップ") (defvar prime-narrow-mode-map nil "候補の AND 検索中のキーマップ") (defun prime-keymap-init (&optional forcep) (or (or prime-fund-mode-map forcep) (let ((map (make-sparse-keymap))) (substitute-key-definition 'self-insert-command 'prime-fund-keyin map global-map) (substitute-key-definition 'undo 'prime-undo map global-map) ; (define-key map prime-toggle-key 'prime-mode) ; (define-key map " " nil) (define-key map " " 'prime-fund-convert-region) (define-key map "\C-cw" 'prime-register) (define-key map "\C-cc" 'prime-language-toggle) (define-key map "\C-ce" 'prime-engine-select) (setq prime-fund-mode-map map))) ;; 入力中のキーマップの設定 (or (or prime-input-mode-map forcep) ; (let ((map (prime-make-keymap 'undefined))) (let ((map (prime-make-keymap 'prime-undefined))) (substitute-key-definition 'prime-mode 'prime-mode map global-map) (substitute-key-definition 'undo 'prime-undo map global-map) (substitute-key-definition 'self-insert-command 'prime-keyin map global-map) (define-key map " " 'prime-conv-next) (substitute-key-definition 'forward-char-command 'prime-input-forward-char map global-map) (substitute-key-definition 'backward-char-command 'prime-input-backward-char map global-map) (define-key map "\C-f" 'prime-input-forward-char) ; 本当はいらない (define-key map "\C-b" 'prime-input-backward-char) ; 本当はいらない (substitute-key-definition 'beginning-of-line 'prime-input-beginning-of-pattern map global-map) (substitute-key-definition 'end-of-line 'prime-input-end-of-pattern map global-map) (substitute-key-definition 'delete-backward-char 'prime-input-delete-backward-char map global-map) (substitute-key-definition 'delete-char 'prime-input-delete-char map global-map) (substitute-key-definition 'universal-argument 'prime-enum-mode map global-map) (substitute-key-definition 'transpose-chars 'prime-input-transpose-chars map global-map) ; (define-key map prime-toggle-key 'prime-mode) (define-key map "\C-w" 'prime-register-word) (define-key map "\C-m" 'prime-conv-decide) (define-key map [return] 'prime-conv-decide) (define-key map "\C-g" 'prime-conv-cancel) (define-key map "\C-l" 'prime-conv-cand-list) (define-key map "\C- " 'prime-space) (define-key map "\M- " 'prime-space) ; (define-key map "\177" 'prime-undo) (define-key map "\C-k" 'prime-conv-katakana) (define-key map "\M-k" 'prime-conv-katakana) (define-key map "\M-h" 'prime-conv-hiragana) (define-key map "\M-l" 'prime-conv-ascii) (define-key map "\C-s" 'prime-narrow-mode) (define-key map "\C-cc" 'prime-language-toggle) (define-key map "\C-ce" 'prime-engine-select) (define-key map [muhenkan] 'prime-conv-hiragana-without-learn) (define-key map [henkan-mode] 'prime-conv-decide) (define-key map [hiragana-katakana] 'prime-conv-katakana) (define-key map [f6] 'prime-conv-hiragana) (define-key map [f7] 'prime-conv-katakana) (define-key map [f10] 'prime-conv-ascii) (if (featurep 'xemacs) (define-key map '(control ?.) 'prime-conv-exact) (define-key map [?\^.] 'prime-conv-exact)) (setq prime-input-mode-map map) )) ;; 変換中のキーマップの設定 (prime-input-mode-map を継承) (or (or prime-conv-mode-map forcep) (let ((map (make-sparse-keymap))) ;; prime-input-mode-map の設定を無効化する. (substitute-key-definition 'prime-input-beginning-of-pattern 'undefined map prime-input-mode-map) (substitute-key-definition 'prime-input-end-of-pattern 'undefined map prime-input-mode-map) (substitute-key-definition 'prime-input-forward-char 'undefined map prime-input-mode-map) (substitute-key-definition 'prime-input-backward-char 'undefined map prime-input-mode-map) (substitute-key-definition 'prime-input-delete-char 'undefined map prime-input-mode-map) (substitute-key-definition 'prime-input-delete-backward-char 'prime-conv-prev map prime-input-mode-map) ; (substitute-key-definition 'delete-backward-char ; 'undefined map global-map) (substitute-key-definition 'previous-line 'prime-conv-prev map global-map) (substitute-key-definition 'next-line 'prime-conv-next map global-map) (define-key map "\C-q" 'prime-dict-word-delete) (define-key map "\C-l" 'prime-conv-cand-list) (define-key map [muhenkan] 'prime-conv-cancel) (setq prime-conv-mode-map map) ) ) ;; 候補一覧からの選択 (prime-input-mode-map, prime-conv-mode-map を継承) (or (or prime-cand-mode-map forcep) (let ((map (make-sparse-keymap))) (substitute-key-definition 'forward-char-command 'prime-cand-forward map global-map) (substitute-key-definition 'backward-char-command 'prime-cand-backward map global-map) (define-key map "\C-f" 'prime-cand-forward) ; 本当はいらない (define-key map "\C-b" 'prime-cand-backward) ; 本当はいらない (substitute-key-definition 'previous-line 'prime-cand-prev-line map global-map) (substitute-key-definition 'next-line 'prime-cand-next-line map global-map) (substitute-key-definition 'end-of-line 'prime-cand-end-of-line map global-map) (substitute-key-definition 'beginning-of-line 'prime-cand-beginning-of-line map global-map) ; (substitute-key-definition 'delete-backward-char ; 'prime-cand-backward ; map global-map) (setq prime-cand-mode-map map) )) (or (or prime-narrow-mode-map forcep) (let ((map (make-sparse-keymap))) (substitute-key-definition 'forward-char-command 'prime-narrow-forward-char map global-map) (substitute-key-definition 'backward-char-command 'prime-narrow-backward-char map global-map) (define-key map "\C-f" 'prime-narrow-forward-char) ; 本当はいらない (define-key map "\C-b" 'prime-narrow-backward-char) ; 本当はいらない (substitute-key-definition 'beginning-of-line 'prime-narrow-beginning-of-pattern map global-map) (substitute-key-definition 'end-of-line 'prime-narrow-end-of-pattern map global-map) (substitute-key-definition 'delete-backward-char 'prime-narrow-delete-backward-char map global-map) (substitute-key-definition 'delete-char 'prime-narrow-delete-char map global-map) (substitute-key-definition 'transpose-chars 'prime-narrow-transpose-chars map global-map) (substitute-key-definition 'self-insert-command 'prime-narrow-keyin map global-map) (define-key map " " 'prime-conv-next) (setq prime-narrow-mode-map map) )) (defconst prime-minor-mode-map-alist (list (cons 'prime-cand-mode prime-cand-mode-map) (cons 'prime-narrow-mode prime-narrow-mode-map) (cons 'prime-conv-mode prime-conv-mode-map) (cons 'prime-input-mode prime-input-mode-map) (cons 'prime-fund-mode prime-fund-mode-map)) "PRIME のキーマップのリスト") (run-hooks 'prime-keymap-init-hook) ) ;; 変換モード設定 (defcustom prime-predict-after-fix nil "nil 以外の場合, 確定した後次の単語を予測する") (defcustom prime-disp-cand-list-oneline nil "nil 以外の場合, 常に変換候補を 1 行で表示") (defcustom prime-language-list '(japanese "[PB|あ]" english "[PB|Aa]") "PRIME で入力する言語とインジケータのリスト") (defcustom prime-language-default 'japanese "デフォルトで入力される言語") (defcustom prime-language-always-hiragana t "nil の場合, 頻度に応じてカタカナが第 0 候補になる") ;; prime-enum-mode.el に移動 ;(defcustom prime-enum-char-list '(?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9 ?0) ; "prime-enum-mode 時に選択用として使用される文字のリスト") ;(defcustom prime-enum-mode-sensitive nil ; "prime-enum-mode が有効な場合, 常に適用するかどうか ;nil の場合は prime-enum-char-list の値が続く限り, prime-enum-mode は無視する.") (defcustom prime-fix-by-capital-p t "大文字入力を単語の区切りとするかどうか") (defcustom prime-direct-key-alist '((?. "。") (?, "、") (?] "」") (?[ "「")) "変換をしないで直接入力をするキー") (make-variable-buffer-local 'prime-direct-key-alist) ;; face の設定 (defcustom prime-cursor-color (mell-color-find "Pink" 6) "PRIME モード時のカーソルの色") (defcustom prime-narrow-cursor-color (mell-color-find "LightSkyBlue" 4) "PRIME 候補の AND 検索中のカーソルの色") (defconst prime-default-cursor-color (mell-color-find (mell-color-get-cursor) 7) "PRIME モードで使用する待避用のデフォルトカーソルの色") (defface prime-cand-cursor-face (list (list t (list :foreground (mell-color-get-background) :background (prime-face-find-color prime-cursor-color) ))) "PRIME cursor face") ;; 各モードの設定 (登録の順番は超重要) (defvar prime-mode nil "*Non-nil means in an PRIME mode.") (defvar prime-fund-mode nil "*Non-nil means in an PRIME fundamental mode.") (defvar prime-input-mode nil "*Non-nil means in an PRIME input mode.") (defvar prime-conv-mode nil "*Non-nil means in an PRIME conversion mode.") (defvar prime-cand-mode nil "*Non-nil means in an PRIME all candidates mode.") (defvar prime-narrow-mode nil "*Non-nil means in an PRIME all narrow mode.") (defvar prime-enum-mode nil "*Non-nil means in an PRIME all enumerative mode.") (defun prime-mode-init (&optional forcep) (prime-set-minor-mode 'prime-mode "") (prime-set-minor-mode 'prime-fund-mode "" prime-fund-mode-map) (prime-set-minor-mode 'prime-input-mode "" prime-input-mode-map) (prime-set-minor-mode 'prime-conv-mode "" prime-conv-mode-map) (prime-set-minor-mode 'prime-narrow-mode "" prime-narrow-mode-map) (prime-set-minor-mode 'prime-cand-mode "" prime-cand-mode-map) (prime-set-minor-mode 'prime-enum-mode "") (run-hooks 'prime-mode-init-hook) ) ;; 内部変数の定義. ;(defvar prime-pat "") ; 検索パタン ;(make-variable-buffer-local 'prime-pat) (defvar prime-prev-pattern nil "prime-pat とこの値が同じならばキャッシュした候補を利用する.") (make-variable-buffer-local 'prime-prev-pattern) (defvar prime-next-pattern "") ; 検索パタン (make-variable-buffer-local 'prime-next-pattern) ;(defvar prime-cands nil) ;(make-variable-buffer-local 'prime-cands) ; 前回入力時のカーソル位置. コンテキストの有効性を判定 (defvar prime-marker nil) ;; nil じゃないと local にならない. (make-variable-buffer-local 'prime-marker) ; カーソル手前の文字列. コンテキストの有効性を判定 (defvar prime-previous-substring "") (make-variable-buffer-local 'prime-previous-substring) ;(defvar prime-context nil) ; 検索候補のコンテキスト. 主に前回入力単語 ;(make-variable-buffer-local 'prime-context) ;(defvar prime-nth-cand 0) ; いくつめの候補を選択しているか ;(make-variable-buffer-local 'prime-nth-cand) (defvar prime-curstr-begin nil) (make-variable-buffer-local 'prime-curstr-begin) (defvar prime-curstr-end nil) (make-variable-buffer-local 'prime-curstr-end) (defvar prime-curstr "") ; テンポラリに選択/表示されている文字列 (make-variable-buffer-local 'prime-curstr) (defvar prime-cand-list-begin nil) (make-variable-buffer-local 'prime-cand-list-begin) (defvar prime-cand-list-end nil) (make-variable-buffer-local 'prime-cand-list-end) (defvar prime-buffer-undo-list nil) (make-variable-buffer-local 'prime-buffer-undo-list) (defvar prime-cand-column-list nil) (make-variable-buffer-local 'prime-cand-column-list) (defvar prime-cand-column-length 0) (make-variable-buffer-local 'prime-cand-column-length) (defvar prime-cand-position nil) (make-variable-buffer-local 'prime-cand-position) (defvar prime-narrow-cands nil) (make-variable-buffer-local 'prime-narrow-cands) (defvar prime-narrow-column 0) (make-variable-buffer-local 'prime-narrow-column) (defvar prime-narrow-orig-cands nil) (make-variable-buffer-local 'prime-narrow-orig-cands) (defvar prime-narrow-orig-nth-cand 0) (make-variable-buffer-local 'prime-narrow-orig-nth-cand) (defvar prime-modeline-original nil) (make-variable-buffer-local 'prime-modeline-original) (defvar prime-modeline-status "[PRIME]") (make-variable-buffer-local 'prime-modeline-status) (defvar prime-input-column 0) (make-variable-buffer-local 'prime-input-column) (defvar prime-tmp-fontify-region nil) (make-variable-buffer-local 'prime-tmp-fontify-region) (defvar prime-conv-exact-p nil "non nil の場合, 単漢字変換モード") (make-variable-buffer-local 'prime-conv-exact-p) (defvar prime-learn-p t "学習を行うかどうか (内部用)") (make-variable-buffer-local 'font-lock-fontify-region-function) ;; undefined キーを連続して叩いた回数. (ユーザのテンパリ度) (defvar prime-undefined-count 0) (make-variable-buffer-local 'prime-undefined-count) (defvar prime-keymap-init-hook nil "キーマップ設定時のフック") (defvar prime-mode-init-hook nil "モード設定時のフック") (defvar prime-init-hook nil "PRIME 初期設定時のフック") (defvar prime-mode-hook nil "PRIME モード切り替え時のフック") ;; Emacs18の場合必要 ;; (defun member (e l) ;; (if (null l) nil ;; (if (equal e (car l)) l ;; (member e (cdr l))))) (defun prime-mode (&optional arg) (interactive "P") (if (consp arg) (if (mell-transient-region-active-p) (call-interactively 'prime-fund-convert-region) (prime-convert-last-word)) (setq prime-mode (if (null arg) (not prime-mode) (> (prefix-numeric-value arg) 0))) ;; 良い方法ではないがこれしかない. (add-hook 'post-command-hook 'prime-set-cursor-color) (add-hook 'minibuffer-setup-hook 'prime-set-cursor-color) ; For XEmacs ; (prime-set-cursor-color) (if prime-mode (prime-mode-on t) (prime-mode-off t)) (run-hooks 'prime-mode-hook) (and (mell-transient-region-active-p) (call-interactively 'prime-fund-convert-region)) )) (defun prime-mode-on (&optional forcep) (if (or forcep (not prime-mode)) (progn (or (markerp prime-marker) (setq prime-marker (make-marker))) (prime-server-open) (setq prime-mode t) (prime-toggle-mode-line) (prime-reset-before-input) (prime-fund-mode-on) (and prime-style-kutouten-autochange-p (prime-style-kutouten-set-automatically)) ))) (defun prime-mode-off (&optional forcep) (if (or forcep prime-mode) (progn (prime-server-close) (setq prime-context nil) (set-marker prime-marker nil) (setq prime-mode nil) (prime-toggle-mode-line) (prime-fund-mode-off) (prime-input-mode-off) ; (prime-server-dict-save) (prime-fix prime-curstr) ))) ;;;; ------------------------------------------------------------ ;;;; prime-cand-mode ;;;; ------------------------------------------------------------ (defun prime-cand-mode (&optional arg) (setq prime-cand-mode (if (null arg) (not prime-cand-mode) (> (prefix-numeric-value arg) 0))) (if prime-cand-mode (prime-cand-mode-on t) (prime-cand-mode-off t) )) (defun prime-cand-mode-on (&optional forcep) (if (or forcep (not prime-cand-mode)) (progn (prime-conv-mode-on) (setq prime-cand-mode t) (setq prime-cand-column 0) (prime-cand-set-column-list) ; (prime-enum-mode-off) ))) (defun prime-cand-mode-off (&optional forcep) (if (or forcep prime-cand-mode) (progn ; (prime-narrow-mode-off) (setq prime-cand-mode nil) ))) ;;;; ------------------------------------------------------------ ;;;; prime-narrow-mode ;;;; ------------------------------------------------------------ (defun prime-narrow-mode (&optional arg) (interactive) (setq prime-narrow-mode (if (null arg) (not prime-narrow-mode) (> (prefix-numeric-value arg) 0))) (if prime-narrow-mode (prime-narrow-mode-on t) (prime-narrow-mode-off t) ) (prime-disp-narrow) ) (defun prime-narrow-mode-on (&optional forcep) (if (or forcep (not prime-narrow-mode)) (progn (prime-conv-mode-off) (setq prime-narrow-mode t) (prime-narrow-mode-reset) (setq prime-narrow-orig-cands prime-cands) (setq prime-narrow-orig-nth-cand prime-nth-cand) (setq prime-nth-cand 0) ))) (defun prime-narrow-mode-off (&optional forcep) (if (or forcep prime-narrow-mode) (progn (setq prime-narrow-mode nil) (setq prime-cands prime-narrow-orig-cands) (setq prime-nth-cand (prime-get-nth prime-curstr prime-pat)) ;; prime-nth-cand が nil だった場合の処理 (or (and (integerp prime-nth-cand) (>= prime-nth-cand 0) (< prime-nth-cand (length prime-cands))) (setq prime-nth-cand prime-narrow-orig-nth-cand)) ))) (defun prime-narrow-mode-reset () (setq prime-narrow-pat "") (setq prime-narrow-column 0) ) (defun prime-convert-region (beg end) (interactive "r") (let ((pattern (suikyo-convert-kana-romaji (japanese-hiragana (buffer-substring beg end))))) (if (string-match "\\cj" pattern) (message (concat "再変換に対応していない文字列が含まれています. " "(" pattern ")")) (setq prime-start-pat (buffer-substring beg end)) (setq prime-pat pattern) (prime-input-mode-on t) (delete-region beg end) (prime-disp-input)))) (defun prime-convert-last-word () (interactive) (let* ((end (point)) (skip (min (prog1 (skip-chars-backward "a-zA-Z-") (goto-char end)) (prog1 (skip-chars-backward "あ-んー") (goto-char end)) (skip-chars-backward "ア-ンー")))) (and (< skip 0) (prime-convert-region (+ end skip) end)) )) ;;;; ------------------------------------------------------------ ;;;; prime-cand-mode ;;;; ------------------------------------------------------------ ;; prime-cand-column と prime-nth-cand の整合性をチェックして ;; 現在の column を返す. (defun prime-cand-set-current-column () (let ((list prime-cand-column-list)) (while (not (eq prime-nth-cand (cdr (car list)))) (setq list (cdr list))) (or (and (>= prime-cand-column (car (car list))) (if (cdr (nth 1 list)) (< prime-cand-column (car (nth 1 list))) (< prime-cand-column (car (nth 2 list))))) (setq prime-cand-column (/ (+ (car (car list)) (car (nth 1 list))) 2)) ))) (defun prime-cand-get () (let ((list (cdr prime-cand-column-list)) (cur-data (car prime-cand-column-list)) prev-data) (while (and cur-data (>= prime-cand-column (car cur-data))) (setq prev-data (if (cdr cur-data) cur-data prev-data)) (setq cur-data (car list)) (setq list (cdr list))) (cdr prev-data))) (defun prime-cand-forward () (interactive) (setq prime-nth-cand (% (1+ prime-nth-cand) (length prime-cands))) (prime-cand-set-current-column) (prime-disp-conv) ) (defun prime-cand-backward () (interactive) (setq prime-nth-cand (% (+ (1- prime-nth-cand) (length prime-cands)) (length prime-cands))) (prime-cand-set-current-column) (prime-disp-conv) ) (defun prime-cand-next-line () (interactive) (prime-cand-set-current-column) (setq prime-cand-column (% (+ prime-cand-column (window-width)) prime-cand-column-length)) (setq prime-nth-cand (prime-cand-get)) (prime-disp-conv) ) (defun prime-cand-prev-line () (interactive) (prime-cand-set-current-column) (setq prime-cand-column (% (+ (- prime-cand-column (window-width)) prime-cand-column-length) prime-cand-column-length)) (setq prime-nth-cand (prime-cand-get)) (prime-disp-conv) ) (defun prime-cand-beginning-of-line () (interactive) (prime-cand-set-current-column) (setq prime-cand-column (- prime-cand-column (% prime-cand-column (window-width)))) (setq prime-nth-cand (prime-cand-get)) (prime-disp-conv) ) (defun prime-cand-end-of-line () (interactive) (prime-cand-set-current-column) (setq prime-cand-column (+ (- prime-cand-column (% prime-cand-column (window-width))) (1- (window-width)))) (setq prime-nth-cand (prime-cand-get)) (prime-disp-conv) ) ;;;; ------------------------------------------------------------ ;;;; prime-narrow-mode ;;;; ------------------------------------------------------------ (defun prime-narrow-keyin (&optional char) (interactive) (setq char (or char last-input-char)) (cond ((prime-enum-keyin char)) ((prime-keyin-direct char)) (prime-conv-mode (prime-fix prime-curstr) (prime-after-fix char) ) ((prime-keyin-capital char)) (t (prime-narrow-insert-char char) (prime-disp-narrow)) )) (defun prime-narrow-compare-list (list-target list-pattern) (mapcar '(lambda (target) (catch 'match (let ((list list-pattern) (target-regexp ;; ひらがな, カタカナ, 英数字と '[', ']' は除いておく (concat "[" (mell-string-delete-regexp target "[a-z0-9]\\|\\cH\\|\\cK\\|\\[\\|\\]") "]"))) (and (> (length target-regexp) 2) (while (car list) (and (string-match target-regexp (car list)) (throw 'match target)) (setq list (cdr list)))) nil ))) list-target )) (defun prime-narrow-insert-char (char &optional column) (or column (setq column prime-narrow-column)) (setq prime-narrow-pat (concat (substring prime-narrow-pat 0 column) (char-to-string char) (substring prime-narrow-pat column))) (setq prime-narrow-column (+ prime-narrow-column (length (char-to-string char)))) ) ;;;; prime-input-* とほとんどいっしょなので統合したいね. (defun prime-narrow-backward-char () (interactive) (setq prime-narrow-column (max 0 (1- prime-narrow-column))) (prime-disp-narrow) ) (defun prime-narrow-forward-char () (interactive) (setq prime-narrow-column (min (length prime-narrow-pat) (1+ prime-narrow-column))) (prime-disp-narrow) ) (defun prime-narrow-end-of-pattern () (interactive) (setq prime-narrow-column (length prime-narrow-pat)) (prime-disp-narrow) ) (defun prime-narrow-beginning-of-pattern () (interactive) (setq prime-narrow-column 0) (prime-disp-narrow) ) (defun prime-narrow-transpose-chars () (interactive) (setq prime-narrow-pat (mell-string-transpose-chars prime-narrow-pat prime-narrow-column)) (and (> prime-narrow-column 0) (< prime-narrow-column (length prime-narrow-pat)) (setq prime-narrow-column (1+ prime-narrow-column))) (prime-disp-narrow) ) ;; Think "undo" ! (defun prime-narrow-delete-char () (interactive) (or (= prime-narrow-column (length prime-narrow-pat)) (setq prime-narrow-pat (concat (substring prime-narrow-pat 0 prime-narrow-column) (substring prime-narrow-pat (1+ prime-narrow-column))))) (prime-disp-narrow) ) (defun prime-narrow-delete-backward-char () (interactive) (if prime-conv-mode (prime-conv-prev) (or (= prime-narrow-column 0) (progn (setq prime-narrow-pat (concat (substring prime-narrow-pat 0 (1- prime-narrow-column)) (substring prime-narrow-pat prime-narrow-column))) (setq prime-narrow-column (1- prime-narrow-column)))) (prime-disp-narrow)) ) ;;;; ---------------------------------------------------------------- (defun prime-set-cands (pattern &optional forcep) (if (and (string= pattern prime-prev-pattern) (not forcep)) prime-cands (setq prime-prev-pattern pattern) (setq prime-cands (prime-search pattern)) )) (defun prime-search (pattern) (prime-server-search pattern prime-context) ) (provide 'prime) (require 'prime-engine) (prime-init)