+ (interactive "p")
+ (let ((inhibit-read-only t)
+ (syl (get-text-property (1- (point)) 'its-syl))
+ (cursor (get-text-property (point) 'its-cursor))
+ keyseq len)
+ (cond
+ ((null syl)
+ (signal 'beginning-of-buffer nil))
+ ((eq cursor t)
+ (if (and (= n 1) (get-text-property (1+ (point)) 'its-end))
+ (progn
+ (its-backward-SYL 1)
+ (setq syl (get-text-property (1- (point)) 'its-syl))
+ (if (null syl)
+ (signal 'beginning-of-buffer nil))))
+ (its-buffer-delete-SYL syl)
+ (while (> n 0)
+ (if (get-text-property (1+ (point)) 'its-end)
+ (progn
+ (its-buffer-ins/del-SYL syl nil t)
+ (signal 'end-of-buffer nil)))
+ (its-forward-SYL 1)
+ (setq n (1- n)))
+ (while (< n 0)
+ (if (get-text-property (1- (point)) 'its-start)
+ (progn
+ (its-buffer-ins/del-SYL syl nil t)
+ (signal 'beginning-of-buffer nil)))
+ (its-backward-SYL 1)
+ (setq n (1+ n)))
+ (its-buffer-ins/del-SYL syl nil t))
+ (t
+ (setq keyseq (its-get-keyseq-syl syl)
+ len (length keyseq))
+ (cond
+ ((or (> n 1) (<= len 1))
+ (signal 'end-of-buffer nil))
+ ((>= (- n) len)
+ (signal 'beginning-of-buffer nil))
+ (t
+ (setq n (if (> n 0) (- -1 n) (1- n)))
+ (setq keyseq (concat (substring keyseq 0 n)
+ (substring keyseq -1)
+ (substring keyseq n -1)))
+ (if (and its-barf-on-invalid-keyseq
+ (null (its-keyseq-acceptable-p keyseq)))
+ (its-input-error))
+ (delete-region (- (point) (length (its-get-output syl))) (point))
+ (its-state-machine-keyseq keyseq 'its-buffer-ins/del-SYL)))))))
+
+(defun its-yank (&optional arg)
+ (interactive "*P")
+ (let ((inhibit-read-only t))
+ (its-input-end)
+ (its-put-cursor t)
+ (yank arg)
+ (its-setup-yanked-portion (region-beginning) (region-end))))
+
+(defun its-yank-pop (arg)
+ (interactive "*p")
+ (let ((inhibit-read-only t))
+ (its-input-end)
+ (its-put-cursor t)
+ (yank-pop arg)
+ (its-setup-yanked-portion (region-beginning) (region-end))))
+
+(defun its-setup-yanked-portion (start end)
+ (let ((yank-before (eq (point) end))
+ syl lang source no-prop-source len i j l)
+ (setq source (buffer-substring start end)
+ no-prop-source (buffer-substring-no-properties start end)
+ len (length source))
+ (remove-text-properties 0 len '(intangible nil) source)
+ (egg-separate-languages source (get-text-property (1- start) 'egg-lang))
+ (setq i 0)
+ (while (< i len)
+ (setq lang (get-text-property i 'egg-lang source))
+ (if (and
+ (or (eq lang 'Chinese-GB) (eq lang 'Chinese-CNS))
+ (setq l (egg-chinese-syllable source i)))
+ (setq j (+ i l))
+ (setq j (+ i (egg-char-bytes (egg-string-to-char-at source i)))))
+ (setq syl (substring no-prop-source i j))
+ (put-text-property i j 'its-syl (cons syl syl) source)
+ (setq i j))
+ (if its-fence-face
+ (let (its-current-language)
+ (setq i 0)
+ (while (< i len)
+ (setq j (egg-next-single-property-change i 'egg-lang source len)
+ its-current-language (get-text-property i 'egg-lang source))
+ (egg-set-face i j (its-get-fence-face) source)
+ (setq i j))))
+ (delete-region start end)
+ (if yank-before
+ (progn
+ (add-text-properties 0 len '(read-only t intangible its-part-1) source)
+ (insert source))
+ (delete-region (point) (1+ (point)))
+ (add-text-properties 0 len '(read-only t intangible its-part-2) source)
+ (insert source)
+ (goto-char start)
+ (its-put-cursor t))))