센터에서 팝업 미니 버퍼
요청한 내용을 정확하게 수행하는 방법은 다음과 같습니다 . 화면 중앙에 미니 버퍼를 표시합니다 .
- 미니 버퍼를위한 별도의 프레임이 있습니다
- 중앙에 배치
- 미니 버퍼에 포커스가있을 때마다이 프레임을 올리십시오.
이는 비교적 달성하기 쉽고 oneonone.el
@Drew가 지적한 것처럼 패키지로 얻을 수있는 것
입니다. 이 접근법의 문제점은 미니 버퍼가 메시지에도 사용되므로 숨겨두는 것이 매우 편리한 것은 아니라는 것입니다. 걱정 마세요! 다른 해결책을 생각해 냈습니다.
- 이 두 번째 미니 버퍼 별도의 프레임에 표시합니다.
- 중앙에 배치하십시오.
- 대화식 명령에는 두 번째 프레임을 사용하고 원본 (첫 번째) 미니 버퍼는 메시지 에코에 사용합니다.
이행
이를 구현하려면 emacs 시작시 미니 버퍼 프레임을 만들어야합니다.
(defvar endless/popup-frame-parameters
'((name . "MINIBUFFER")
(minibuffer . only)
(height . 1)
;; Ajust this one to your preference.
(top . 200))
"Parameters for the minibuffer popup frame.")
(defvar endless/minibuffer-frame
(let ((mf (make-frame endless/popup-frame-parameters)))
(iconify-frame mf) mf)
"Frame holding the extra minibuffer.")
(defvar endless/minibuffer-window
(car (window-list endless/minibuffer-frame t))
"")
그런 다음 read-from-minibuffer
원래 프레임의 미니 버퍼 대신이 두 번째 미니 버퍼를 사용하도록 패치 합니다.
(defmacro with-popup-minibuffer (&rest body)
"Execute BODY using a popup minibuffer."
(let ((frame-symbol (make-symbol "selected-frame")))
`(let* ((,frame-symbol (selected-frame)))
(unwind-protect
(progn
(make-frame-visible endless/minibuffer-frame)
(when (fboundp 'point-screen-height)
(set-frame-parameter
endless/minibuffer-frame
'top (point-screen-height)))
(select-frame-set-input-focus endless/minibuffer-frame 'norecord)
,@body)
(select-frame-set-input-focus ,frame-symbol)))))
(defun use-popup-minibuffer (function)
"Rebind FUNCTION so that it uses a popup minibuffer."
(let* ((back-symb (intern (format "endless/backup-%s" function)))
(func-symb (intern (format "endless/%s-with-popup-minibuffer"
function)))
(defs `(progn
(defvar ,back-symb (symbol-function ',function))
(defun ,func-symb (&rest rest)
,(format "Call `%s' with a poupup minibuffer." function)
,@(list (interactive-form function))
(with-popup-minibuffer
(apply ,back-symb rest))))))
(message "%s" defs)
(when (and (boundp back-symb) (eval back-symb))
(error "`%s' already defined! Can't override twice" back-symb))
(eval defs)
(setf (symbol-function function) func-symb)))
;;; Try at own risk.
(use-popup-minibuffer 'read-from-minibuffer)
;;; This will revert the effect.
;; (setf (symbol-function #'read-from-minibuffer) endless/backup-read-from-minibuffer)
;; (setq endless/backup-read-from-minibuffer nil)
이것은 절대적으로 모든 것을 작동하지 않을 수 있습니다,하지만 그것은 내가 지금까지 시도 모두에 근무 --- find-file
, ido-switch-buffer
,
eval-expression
. 예외 가 발견 되면 해당 함수를 호출 use-popup-minibuffer
하여 사례별로 패치 할 수
있습니다.
포인트 근처 위치
이 미니 버퍼 프레임을 포인트 높이 근처에 위치 시키려면 다음 함수와 같이 간단히 정의하십시오. 완벽하지는 않지만 (실제로 많은 경우에 끔찍하지만) 포인트 높이를 추정하는 적절한 작업을 수행합니다.
(defun point-screen-height ()
(* (/ (face-attribute 'default :height) 10) 2
(- (line-number-at-pos (point))
(line-number-at-pos (window-start)))))