LINUX.ORG.RU

Центровка буфера в Emacs c помощью полей

 ,


0

1

Здравствуйте!

Проблема такая: пишу свою функцию для центровки листа. Это очень удобно особенно на широкоформатных мониторах. Получилась такая простая toggle-функция:

(defun fringe-toggle ()
  (interactive)
  ;; use a property “state”. Value is t or nil
  (if (get 'fringe-toggle 'state)
      (progn
		(fringe-mode nil)
		(put 'fringe-toggle 'state nil))
    (progn 
	  (fringe-mode '(200 . 200))		
	  (put 'fringe-toggle 'state t))))

И вот ударила меня мысль в голову, сделать такую функцию, чтобы не вводить точные значения 200 . 200, а сначала определить ширину окна, после чего рассчитать ширину поля от ширины окна, тогда функция будет универсальной и пропорционально центровать буфер.

Беда в том, что я не могу никак понять. как можно заменить числа выражениями и как узнать ширину окна в emacs. Попытки поставить выражения вместо чисел приводя к ошибки формата. А вариант:

(defun my-set-margins ()
  "Set margins in current buffer."
  (setq left-margin-width 200)
  (setq right-margin-width 200))

(add-hook 'text-mode-hook 'my-set-margins)

не работает вообще.

как можно заменить числа выражениями

(fringe-mode (cons (expr-1) (expr-2))), если expr-1 и expr-2 — функции. Или (fringe-mode (cons left-margin-width right-margin-width)), если подставлять значения.

как узнать ширину окна в emacs

(x-display-pixel-width)

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

С функцией спасибо. Решение работает. Но возник вопрос. А разве (x-display-pixel-width) не ширина экрана? И насколько я знаю emacs > 23 оно содержит объединенную ширину всех экранов. А есть ли возможность получить именно ширину окна буфера? Оно же может быть любым в пределах всего монитора.

knigolaz
() автор топика

Решение

Всем спасибо за помощь. Получилась такая функция, которую я назначил на комбинацию <C-w>

(defun fringe-toggle ()
  (interactive)
  (if (get 'fringe-toggle 'state)
      (progn
	(fringe-mode nil)
	(put 'fringe-toggle 'state nil))
      (progn 
	(fringe-mode (cons (/ (window-pixel-width) 5)
		           (/ (window-pixel-width) 5)))
		(put 'fringe-toggle 'state t))))

Решил использовать (window-pixel-width) так, как это наиболее адекватный способ определить ширину экрана. К сожалению определять по ширине окна буфера так и не получилось, но у меня все равно emacs открыт на весь экран.

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