LINUX.ORG.RU

Единый mod-line для всех окон

 


0

3

Hi, folks!

Можно ли сделать в emacs единый mod-line на все окна? Имеется ввиду ситуация когда фрейм разрезан на несколько окон, но при этом mod-line остается один единственный внизу фрейма, а его содержимое динамически меняется для активного окна. При этом сами окна своих mod-line не имеют.

в теории - да, отключить modeline, сделать дополнительно окно высотой с modeline внизу и в нем включить modeline. Но так лучше не делать, это пятое колесо у собаки.

Лучше отключить modeline и установить отображение того, что в modeline в `frame-title-format`.

Та же можно отображать modeline только в активном буффере

Nicholass ★★★
()
Ответ на: комментарий от Nicholass

Суть в том, что у меня в modline много инфы отображается и в случае, если фрейм разбит по вертикали, вся информация в «половинный» размер каждого окна не влезает.

В любом случае, спасибо за ответ.

trancefer ★★
() автор топика

Хмм...

(defvar default-modeline-format (default-value 'mode-line-format))
(defvar my-selected-window nil)
(defvar modeline-window nil)
(defun my-after-window-change-adv (&rest args)
  (setq my-selected-window (selected-window))
  (when (window-live-p modeline-window)
    (select-window modeline-window))
  (select-window my-selected-window)
  (setq mode-line-format nil))

(defun set-single-window-modeline ()
  (interactive)
  (let ((win (display-buffer-in-side-window
              (get-buffer-create " *modelinewindow*")
              '((side . bottom)))))
    (setq modeline-window win)
    (with-selected-window win
      (setq-local window-size-fixed nil)
      (set-window-parameter win 'no-other-window t)
      (setq-local window-min-height 1)
      (setq-local window-safe-min-height 0)
      (setq-local mode-line-format '( "" (:eval (format-mode-line default-modeline-format nil my-selected-window))))
      ;;(minimize-window)
      (shrink-window-if-larger-than-buffer)
      (window-resize win 10 nil t t)
      (setq-local window-size-fixed t))
    (my-after-window-change-adv))
  ;; (add-hook 'window-configuration-change-hook #'my-after-window-change-adv)
  ;; (advice-add #'other-window :after #'my-after-window-change-adv)
  (add-hook 'post-command-hook #'my-after-window-change-adv))



После этого M-x set-single-window-modeline RET

Bad_ptr ★★★★★
()
Ответ на: Хмм... от Bad_ptr

Или даже так

(defvar default-modeline-format (default-value 'mode-line-format))
(defvar my-selected-window nil)
(defvar modeline-window nil)
(defun my-after-window-change-adv (&rest args)
  (setq my-selected-window (selected-window))
  (when (window-live-p modeline-window)
    (select-window modeline-window)
    (with-current-buffer " *modelinewindow*"
      (erase-buffer)
      (insert (format-mode-line default-modeline-format 'mode-line my-selected-window))
      (goto-char (point-min))))
  (select-window my-selected-window)
  (setq mode-line-format nil))

(defun set-single-window-modeline ()
  (interactive)
  (let (window-configuration-change-hook)
    (let ((win (display-buffer-in-side-window
                (get-buffer-create " *modelinewindow*")
                '((side . bottom)))))
      (setq modeline-window win)
      (with-selected-window win
        (setq-local window-size-fixed nil)
        (set-window-parameter win 'no-other-window t)
        (setq-local window-min-height 1)
        (setq-local window-safe-min-height 1)
        (shrink-window-if-larger-than-buffer)
        (setq-local window-size-fixed t))
      (my-after-window-change-adv)))
  (add-hook 'post-command-hook #'my-after-window-change-adv))
Bad_ptr ★★★★★
()
Ответ на: Или даже так от Bad_ptr

Что в первом, что во втором варианте у меня все раком становится. Вплоть до того что перестает работать выделение текста. Emacs 24.3.1 на Centos 7. К сожалению не знаток elisp для того чтобы понять что тут не так.

trancefer ★★
() автор топика
Ответ на: комментарий от trancefer

Мне идея понравилась. На выходных может попробую сделать пакет для емакса. Думаю как назвать, пока что остановился на common-mode-line.)
Возможно, тебе поможет во втором варианте закомментировать (select-window).

Bad_ptr ★★★★★
()
Ответ на: комментарий от Bad_ptr

Cool. Готов записаться в бета-тестеры ;)

trancefer ★★
() автор топика
Ответ на: комментарий от Bad_ptr

Попробовал - сначала режет пополам по горизонтали, только в нижней половине чистое белое пространство без интерфейса окна.

Исправимо конечно командой delete-other-windows, но в остальном поведение mode-line'ов при разделении фрейма на окна не изменилось. Вот только шрифт текста mode-line'ов стал неадекватно маленьким. GNU Emacs 24.5.1.

Всё так и задумано?

ados ★★★★★
()
Ответ на: комментарий от ados

Emacs 24.5

Попробуй в Emacs 26)
А я попробую в 24.
Ещё (require 'cl) забыл добавить, оказывается заюзал там функцию delete-if и не заметил.

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Ответ на: комментарий от Bad_ptr

Стало лучше:

http://i.imgur.com/Lq78PB2.png

А нельзя ли убрать разделяющие горизонтальные разделяющие полоски между окнами? Убрать в смысле - сделать такими же как и вертикальные разделители, а точнее такими же тонкими. А над mod-line вообще полоску убрать.

ados ★★★★★
()
Ответ на: комментарий от Bad_ptr

Попробуй в Emacs 26)

Извини, нет.

Можешь просто сказать что 24.* поддерживать не будешь и я отстану.

ados ★★★★★
()
Ответ на: комментарий от ados

Убрать в смысле - сделать такими же как и вертикальные разделители

Эти полоски, как ты наверное уже догадался — это mode-line'ы окон.
Пробуй крутить шрифты, те что у тебя на скриншоте, параметр height.
Я этот способ взял из https://github.com/dandavison/minimal
Так что по-идее можешь сделать их настолько тонкими насколько хочешь.
В принципе их можно вообще убрать, но это неудобно т.к. непонятно где границы(верх, низ) окон.

Bad_ptr ★★★★★
()
Ответ на: комментарий от Bad_ptr

Так что по-идее можешь сделать их настолько тонкими насколько хочешь.

В принципе их можно вообще убрать, но это неудобно т.к. непонятно где границы(верх, низ) окон.

У меня минимум 0.1 px. Ниже не опускается:

set-face-attribute: Face height does not produce a positive integer: 0
ados ★★★★★
()
Ответ на: комментарий от Bad_ptr

Что-то как-то глючно всё. pop-to-buffer стал криво работать.

С этим (window-in-direction 'below ...) полоски остаются если фокус не на самом нижнем окне. А если на самом нижнем - горизонтальные разграничители вообще исчезают.

ados ★★★★★
()
Ответ на: комментарий от ados

Ну, видимо, это минимум.
Как по-другому сделать — не знаю. Единственный вариант, который приходит в голову — у окон mode-line-format поставить в nil, и рисовать границу окна в буфере текстовым оверлеем(как company-mode рисует меню с вариантами).

Bad_ptr ★★★★★
()
Ответ на: комментарий от ados

pop-to-buffer стал криво работать.

Запросто. Я так понимаю, что у тебя буфер открывается в окне mode-line'а, так? Есть какой-то вариант указать pop-to-buffer'у не использовать окно? (это конечно можно сделать через display-buffer-alist, но это уже каждый сам для себя настраивать должен)

полоски остаются если фокус не на самом нижнем окне

Ну да. Чтобы убрать полоски сразу, тебе придётся пробежаться по всем окнам, и у тех окон, у которых below окно с mode-line выставить mode-line-format в nil.(впринципе это можно повесить на хук common-mode-line-mode-hook)

А если на самом нижнем - горизонтальные разграничители вообще исчезают.

А вот это странно, по-идее такого быть не должно. Ну или попробуй вместо setq поставить setq-local. Завтра посмотрю.

Bad_ptr ★★★★★
()
Ответ на: комментарий от Bad_ptr

common-mode-line

Может single-mode-line? А идея любопытная, подписался.

grazor ★★
()
Ответ на: комментарий от Bad_ptr

Вообще у меня все работает шикарно (Emacs 25.1.1)! Только таббар сломался. Вечерком попробую глянуть.

А почему не полноценная репа? Эта отличная, годная вешь! Ее надо двигать в массы! ;)

Kostafey
()
Последнее исправление: Kostafey (всего исправлений: 1)
Ответ на: комментарий от Kostafey

А почему не полноценная репа?

Потому что ещё есть некоторые вопросы
В том числе и

Только таббар сломался.

логично сделать такую же вещь и для «таббара», причём там всего лишь в паре мест нужно поменять mode-line-format на header-line-format
Вот я и думаю, как бы это совместить.

Bad_ptr ★★★★★
()
Ответ на: комментарий от Bad_ptr

Коллеги, как продвигается? Смотрю тут не только мне одному интересна эта тема. Уже можно тестить код по ссылке? Или ожидается допиливание и пока не стоит?

trancefer ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.