X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=its.el;h=2596049ee39e903240e2fd1057bb92ff0f94afec;hb=f9fd651340223348e2a285a454f7ac11d2b7df23;hp=d651451b18a8231e9f3c6d4239269fa3f26481d9;hpb=918ba29ce6f7a775f27fe20929d8a9869fe0bde2;p=elisp%2Ftamago.git diff --git a/its.el b/its.el index d651451..2596049 100644 --- a/its.el +++ b/its.el @@ -31,7 +31,9 @@ ;;; Code: -(require 'cl) +(eval-when-compile + (require 'cl)) + (require 'egg-edep) (defgroup its nil @@ -47,7 +49,13 @@ :group 'its :type 'boolean) (defcustom its-delete-by-keystroke nil - "*Delete characters as if cancel input keystroke, if nin-NIL." + "*Delete characters as if cancel input keystroke, if nin-NIL. +This variable is overriden by `its-delete-by-character'." + :group 'its :type 'boolean) + +(defcustom its-delete-by-character nil + "*Delete a character as a unit even if just after input, if nin-NIL. +This variable override `its-delete-by-keystroke'." :group 'its :type 'boolean) (defcustom its-fence-invisible nil @@ -93,7 +101,7 @@ (make-variable-buffer-local 'its-previous-select-func) (put 'its-previous-select-func 'permanent-local t) -(defvar its-current-language) +(defvar its-current-language nil) (make-variable-buffer-local 'its-current-language) (put 'its-current-language 'permanent-local t) @@ -239,7 +247,7 @@ (if (consp (cdr syl)) (cons (its-get-output syl) (its-get-keyseq-syl syl)) syl)) - + ;; ;; @@ -267,8 +275,8 @@ (define-key map "\M-y" 'its-yank-pop) (define-key map [backspace] 'its-delete-backward-SYL) (define-key map [delete] 'its-delete-backward-SYL) - (define-key map [M-backspace] 'its-delete-backward-SYL-by-keystroke) - (define-key map [M-delete] 'its-delete-backward-SYL-by-keystroke) + (define-key map [(meta backspace)] 'its-delete-backward-SYL-by-keystroke) + (define-key map [(meta delete)] 'its-delete-backward-SYL-by-keystroke) (define-key map [right] 'its-forward-SYL) (define-key map [left] 'its-backward-SYL) (while (< i 127) @@ -314,7 +322,7 @@ (let ((p (point)) (str (copy-sequence "!"))) (set-text-properties 0 1 (list 'read-only t - 'invisible t + 'invisible 'egg 'intangible 'its-part-2 'its-cursor cursor 'point-entered 'egg-enter/leave-fence @@ -352,6 +360,7 @@ (error "invalid fence")) ;; Put open-fence before inhibit-read-only to detect read-only (insert (if its-context its-fence-continue its-fence-open)) + (egg-setup-invisibility-spec) (let ((inhibit-read-only t)) (setq p1 (point)) (add-text-properties p p1 open-props) @@ -360,7 +369,7 @@ (insert its-fence-close) (add-text-properties p1 (point) close-props) (if its-fence-invisible - (put-text-property p (point) 'invisible t)) + (put-text-property p (point) 'invisible 'egg)) (put-text-property p (point) 'read-only t) (goto-char p1) (its-define-select-keys its-mode-map t) @@ -825,7 +834,7 @@ Return last state." (setq state next-state)) ((null build-if-none) (error "No such state (%s)" input)) - (t + (t (if (not (or brand-new (= i 1) (its-get-kst/t state))) (its-set-interim-terminal-state state)) (setq state (its-make-next-state state key @@ -1010,7 +1019,7 @@ Return last state." (cursor (get-text-property (point) 'its-cursor))) (if (null syl) (signal 'beginning-of-buffer nil) - (if (eq cursor t) + (if (or (eq cursor t) (and cursor its-delete-by-character)) (its-delete-backward-SYL-internal n killflag) (its-delete-backward-within-SYL syl n killflag))))) @@ -1073,7 +1082,7 @@ Return last state." (signal 'beginning-of-buffer nil)) (delete-region p (point)) (if (> len n) - (its-state-machine-keyseq (substring keyseq 0 (- len n)) + (its-state-machine-keyseq (substring keyseq 0 (- len n)) 'its-buffer-ins/del-SYL) (its-set-cursor-status (if (or (null its-delete-by-keystroke) @@ -1547,5 +1556,31 @@ Return last state." (princ (documentation 'its-mode)) (help-setup-xref (cons #'help-xref-mode (current-buffer)) (interactive-p)))) +;; The `point-left' hook function will never be called in Emacs 21.2.50 +;; when the command `next-line' is used in the last line of a buffer +;; which isn't terminated with a newline or the command `previous-line' +;; is used in the first line of a buffer. +(defun its-next-line (&optional arg) + "Go to the end of the line if the line isn't terminated with a newline, +otherwise run `next-line' as usual." + (interactive "p") + (if (= (line-end-position) (point-max)) + (end-of-line) + (next-line arg))) + +(defun its-previous-line (&optional arg) + "Go to the beginning of the line if it is called in the first line of a +buffer, otherwise run `previous-line' as usual." + (interactive "p") + (if (= (line-beginning-position) (point-mim)) + (beginning-of-line) + (previous-line arg))) + +(substitute-key-definition 'next-line 'its-next-line + its-mode-map global-map) +(substitute-key-definition 'previous-line 'its-previous-line + its-mode-map global-map) + (provide 'its) -;;; its.el ends here. + +;;; its.el ends here