Podczas pracy na zmaksymalizowanej ramce Emacsa trudno jest zobaczyć zawartość obszaru minibufora / echa na dole ekranu, ale powoduje także utratę koncentracji na edytowanym tekście podczas wpisywania polecenia - co jest dość problem pod względem użyteczności.
Czy istnieje sposób na przesunięcie obszaru minibufora / echa w środku bieżącego bufora emacs, nad tekstem edytowanym, gdy minibufor jest aktywny, lub, lepiej, aby uchwycić zawartość minibufora i wyświetlić go również na środku bieżącego bufora podczas wpisywania polecenia?
minibuffer
Sébastien Le Callonnec
źródło
źródło
Odpowiedzi:
Wyskakujący minibufor w centrum
Oto sposób na wykonanie dokładnie tego, o co prosiłeś: wyświetl minibufor na środku ekranu .
Jest to stosunkowo łatwe do osiągnięcia i właśnie to otrzymasz wraz z
oneonone.el
pakietem (jak wskazuje @Drew). Problem z tym podejściem polega na tym, że minibufor jest również używany do przesyłania wiadomości, więc ukrywanie go nie jest zbyt wygodne. Nie martwić się! Wymyśliłem inne rozwiązanie.Realizacja
Aby to zaimplementować, musimy utworzyć ramkę minibufora podczas uruchamiania emacsa.
Następnie łatamy,
read-from-minibuffer
aby używać tego drugiego minibufora zamiast oryginalnego minibufora ramki.To może nie działać z absolutnie wszystko, ale to działało na wszystko próbowałem dotąd ---
find-file
,ido-switch-buffer
,eval-expression
. Jeśli zrobić znaleźliśmy żadnych wyjątków, można załatać te funkcje na zasadzie case-by-case wywołującuse-popup-minibuffer
na nich.Ustaw blisko punktu
Aby ustawić tę ramkę minibufora w pobliżu wysokości punktu, wystarczy zdefiniować coś w rodzaju następującej funkcji. To nie jest idealne (w rzeczywistości jest okropne w wielu przypadkach), ale porządnie szacuje wysokość punktu.
źródło
(setf (symbol-function function) ...)
, lepiej użyćadvice-add
(lub starszegoad-add-advice
).Minibufor na górze
Wyświetlanie minibufora na środku ekranu jest skomplikowane. Rozsądną alternatywą (którą możesz lub nie możesz znaleźć bardziej czytelną) jest przeniesienie jej na górę.
Możesz skonfigurować lokalizację (lub istnienie) minibufora ramki za pomocą
minibuffer
parametru ramki winitial-frame-alist
zmiennej.Oddzielna ramka
Ustawienie parametru na
nil
skonfiguruje ramkę tak, aby nie miała minibufora, a Emacs automatycznie utworzy dla ciebie osobną ramkę minibufora. Możesz ustawić te dwie ramki za pomocą menedżera okien swojego systemu operacyjnego lub możesz to zrobić za pomocą Emacsa.Poniższy fragment kodu ilustruje sposób umieszczenia ramki minibufora u góry, ze zwykłą ramką tuż pod nią, ale na pewno będziesz musiał zmienić liczby, aby uwzględnić rozmiar monitora.
Najszybszym sposobem na dostosowanie tego jest zmiana rozmiaru ramek w menedżerze okien, a następnie ocena w
(frame-parameters)
celu sprawdzenia posiadanych wartości parametrów.Ta sama rama
Inną możliwością jest ustawienie
minibuffer
parametru na okno. Niestety nie udało mi się sprawić, aby działało to dla okna w tej samej ramce.źródło
Biblioteka
oneonone.el
daje to od razu po wyjęciu z pudełka.Po prostu dostosuj opcję
1on1-minibuffer-frame-top/bottom
do żądanej pozycji dla samodzielnej ramy minibufora. Wartością jest liczba pikseli od góry (jeśli nieujemna) lub na dole (jeśli ujemna) wyświetlacza. Na przykład ustaw wartość wysokości wyświetlania podzieloną przez 2, aby wyśrodkować ją w pionie.Jeśli zamiast tego chcesz, aby była dynamicznie pozycjonowana, powiedzmy w pionowym środku bieżącej klatki, możesz to zrobić poprzez (a) pozostawienie
1on1-minibuffer-frame-top/bottom
=nil
i (b) funkcji doradczej,1on1-set-minibuffer-frame-top/bottom
aby dynamicznie powiązać tę zmienną z odpowiednią pozycją. Na przykład:(Zdefiniuj funkcję
my-dynamic-position
do obliczania żądanej pozycji na podstawie dowolnych kryteriów (aktualny rozmiar i pozycja okna / ramy, faza księżyca, ...).źródło