При работе с максимизированным фреймом Emacs содержимое отображения области минибуфера / эха в нижней части экрана может быть трудно различимым, но также приводит к потере фокуса на текст, редактируемый при вводе команды, что довольно вопрос с точки зрения юзабилити.
Есть ли способ переместить область минибуфера / эха в центр текущего буфера Emacs, поверх текста, редактируемого, когда минибуфер активен, или, что лучше, захватить содержимое минибуфера и отобразить его также в центре текущего буфера при наборе команды?
minibuffer
Себастьян Ле Каллоннек
источник
источник
Ответы:
Всплывающий минибуфер в центре
Вот способ сделать именно то, что вы просили: отобразить минибуфер в центре экрана .
Этого относительно легко достичь, и это то, что вы получите с
oneonone.el
пакетом (как указывает @Drew). Проблема этого подхода заключается в том, что минибуфер также используется для сообщений, поэтому скрывать его не очень удобно. Не беспокоиться! Я придумал другое решение.Реализация
Чтобы реализовать это, нам нужно создать фрейм минибуфера при запуске emacs.
Затем мы исправляем
read-from-minibuffer
использование второго минибуфера вместо минибуфера оригинального кадра.Это не может работать абсолютно со всем, но он работал на все , что я пытался до сих пор ---
find-file
,ido-switch-buffer
,eval-expression
. Если вы делаете найти какое - либо исключение, вы можете исправить эти функции на индивидуальной основе случая, позвонивuse-popup-minibuffer
на них.Положение рядом с точкой
Чтобы расположить эту рамку минибуфера рядом с высотой точки, просто определите что-то вроде следующей функции. Он не идеален (на самом деле, он ужасен во многих случаях), но он отлично справляется с оценкой высоты точки.
источник
(setf (symbol-function function) ...)
тобой, лучше использоватьadvice-add
(или старшееad-add-advice
).Минибуфер наверху
Отображение минибуфера в середине экрана является сложным. Разумная альтернатива (которую вы можете или не можете найти более читабельной) - переместить ее наверх.
Вы можете настроить местоположение (или существование) минибуфера
minibuffer
фрейма с параметром фрейма вinitial-frame-alist
переменной.Отдельная рамка
Если
nil
задать для этого параметра значение, у фрейма не будет минибуфера, а Emacs автоматически создаст для вас отдельный фрейм минибуфера. Вы можете расположить эти два фрейма, используя оконный менеджер вашей ОС, или вы можете сделать это из Emacs.В следующем фрагменте приведен пример размещения рамки минибуфера сверху, с обычной рамкой чуть ниже нее, но вам определенно придется изменить числа, чтобы учесть размер монитора.
Самый быстрый способ изменить это - изменить размеры фреймов в вашем оконном менеджере, а затем
(frame-parameters)
выполнить оценку, чтобы увидеть значения параметров, которые у вас есть.Та же рамка
Другая возможность - установить
minibuffer
параметр в окно. К сожалению, я не смог заставить это работать для окна в том же кадре.источник
Библиотека
oneonone.el
дает вам это из коробки.Просто настройте опцию
1on1-minibuffer-frame-top/bottom
в положение, которое вы хотите для автономной рамы минибуфера. Значение - это количество пикселей сверху (если неотрицательно) или снизу (если отрицательно) вашего дисплея. Например, установите значение высоты дисплея, деленное на 2, чтобы расположить его вертикально по центру.Если вместо этого вы хотите, чтобы он был расположен динамически, скажем, в вертикальном центре текущего кадра, то вы можете сделать это, (a) оставив
1on1-minibuffer-frame-top/bottom
=nil
и (b) посоветовав функции1on1-set-minibuffer-frame-top/bottom
динамически связать эту переменную с соответствующей позицией. Например:(Определите функцию
my-dynamic-position
для расчета желаемой позиции на основе любых критериев, которые вы хотите (текущий размер окна / рамки и положение, фаза луны, ...).источник