emacs-rime 在其他函数使用 posframe 时,候选条只能出现一个词

使用 emacs-rime 的配置如下:

其中配置了候选条的显示是使用的 posframe 这个包。

        (setq rime-show-candidate 'posframe)
(defun hurricane-misc/init-rime ()
  (use-package rime
    :ensure t
    :init
    (when (functionp 'module-load)
      (progn
        (require 'posframe)
        (setq rime-show-candidate 'posframe)
        (setq rime-posframe-properties
              (list :font "sarasa ui sc"
                    :internal-border-width 10))))
    (setq default-input-method "rime")
    (setq rime-user-data-dir rime-dir)
    (setq rime-disable-predicates
     '(rime-predicate-evil-mode-p
       rime-predicate-prog-in-code-p))

    (defun +rime-force-enable ()
      "强制 `rime' 使用中文输入状态。
  如果当前不是 `rime' 输入法,则先激活 `rime' 输入法。如果当前是
  `evil' 的非编辑状态,则转为 `evil-insert-state'。"
      (interactive)
      (let ((input-method "rime"))
        (unless (string= current-input-method input-method)
          (activate-input-method input-method))
        (when (rime-predicate-evil-mode-p)
          (if (= (+ 1 (point)) (line-end-position))
              (evil-append 1)
            (evil-insert 1)))
        (rime-force-enable)))

    (defun +rime-convert-string-at-point (&optional return-cregexp)
      "将光标前的字符串转换为中文。"
      (interactive "P")
      (+rime-force-enable)
      (let ((string (if mark-active
                        (buffer-substring-no-properties
                         (region-beginning) (region-end))
                      (buffer-substring-no-properties
                       (line-beginning-position) (point))))
            code
            length)
        (cond ((string-match "\\([a-z'-]+\\|[[:punct:]]\\) *$" string)
               (setq code (replace-regexp-in-string
                           "^[-']" ""
                           (match-string 0 string)))
               (setq length (length code))
               (setq code (replace-regexp-in-string " +" "" code))
               (if mark-active
                   (delete-region (region-beginning) (region-end))
                 (when (> length 0)
                   (delete-char (- 0 length))))
               (when (> length 0)
                 (setq unread-command-events
                       (append (listify-key-sequence code)
                               unread-command-events))))
              (t (message "`+rime-convert-string-at-point' did nothing.")))))

    :custom
    (rime-librime-root "~/.emacs.d/librime/dist")
    (rime-posframe-properties
          (list :background-color "#666666"
                :foreground-color "#dcdccc"
                :internal-border-width 10))
    :bind
    ("C-\\" . #'+rime-force-enable)
    ("M-g" . #'+rime-convert-string-at-point)
    (:map rime-mode-map
          ("M-p" . #'rime-inline-ascii)
          ("C-`" . rime-send-keybinding))))

我同时使用了 ivy-posframe。 配置如下:

(defun hurricane-ui/init-ivy-posframe ()
  (use-package ivy-posframe
    :ensure t
    :after (ivy)
    :config
    (setq ivy-posframe-display-functions-alist
        '((swiper . ivy-posframe-display-at-frame-center)
          (complete-symbol . ivy-posframe-display-at-point)
          (counsel-M-x . ivy-posframe-display-at-frame-center)
          (counsel-find-file . ivy-posframe-display-at-frame-center)
          (ivy-switch-buffer . ivy-posframe-display-at-frame-center)
          (t . ivy-posframe-display-at-frame-center)))
    (ivy-posframe-enable)))

使用 counsel-find-file 函数时就能出现 posframe。 此时就与 emacs-rime 配置的候选条冲突了? 我不知道该如何正确配置 emacs-rime了。

(setq ivy-posframe-hide-minibuffer nil) 试试,难看但管用

2 个赞

可以用了谢谢。