LINUX.ORG.RU

[emacs] Изменение аттрибутов текста

 


0

0

Захотел сделать раскрашивалку в емаксе, пытаюсь изменить бэкграунд текста в данном регионе.

(defface hl
  '((t :background "red"))
  "Default face for colorizing the region.")

(defun colorize-region (from to &optional ask-for-color)
  (interactive "r\nP")
  (progn
    (if ask-for-color
        (read-face-attribute 'hl :background))
    (put-text-property from to 'face 'hl)))

Возникло три вопроса: 1. Неужели нельзя напрямую изменить аттрибут :background для текста, а надо задавать свой фейс?

2. Как хранится аттрибут фейса в тексте? Ссылка это или значение?

3. Почему оно не работает?

>1. Неужели нельзя напрямую изменить аттрибут :background для текста, а надо задавать свой фейс?

Вместо фейса 'hl в put-text-property пропиши '(:background «red»).

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

Можешь также прописать так: '((:background «red») (:foreground «green»))

Zubok ★★★★★
()
`face'
     You can use the property `face' to control the font and color of
     text.  *Note Faces::, for more information.

     In the simplest case, the value is a face name.  It can also be a
     list; then each element can be any of these possibilities;

        * A face name (a symbol or string).

        * A property list of face attributes.  This has the form
          (KEYWORD VALUE ...), where each KEYWORD is a face attribute
          name and VALUE is a meaningful value for that attribute.
          With this feature, you do not need to create a face each time
          you want to specify a particular attribute for certain text.
          *Note Face Attributes::.

        * A cons cell with the form `(foreground-color . COLOR-NAME)'
          or `(background-color . COLOR-NAME)'.  These are older,
          deprecated equivalents for `(:foreground COLOR-NAME)' and
          `(:background COLOR-NAME)'.  Please convert code that uses
          them.

     It works to use the latter two forms directly as the value of the
     `face' property.

     Font Lock mode (*note Font Lock Mode::) works in most buffers by
     dynamically updating the `face' property of characters based on
     the context.

Как раз второй и третий вариант — твои. Читай доки — они рулез. :) With this feature, you do not need to create a face each time you want to specify a particular attribute for certain text.

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

Спасибо! Я переделал на такой вариант, но оно все равно не работает:

(defun colorize-region (from to &optional ask-for-color)
  (interactive "r\nP")
  (let ((bg-color (if ask-for-color
                   (read-color "Color:")
                 "red")))
    (put-text-property from to 'face '(:background bg-color))))

j-a-t-a
() автор топика
Ответ на: комментарий от j-a-t-a

А ты открой новый буфер (не в *scratch*) и проверь. Все должно работать.

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

Я даже открыл новый emacs, но все равно не работает! У Вас такой же код как и двумя постами выше? font-lock-mode включен. Но когда он выключен, все повторяется точь в точь.

j-a-t-a
() автор топика
Ответ на: комментарий от j-a-t-a

Сейчас проверил. А у тебя неправильно сделано. Список надо так делать:

`(:background ,bg-color) или так: (list :background bg-color)

Понятно, почему именно так?

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

Урра, на оверлеях работает!

(defun colorize-overlay (from to &optional ask-for-color)
  (interactive "r\nP")
  (let ((bg-color (if ask-for-color
                      (read-color "Color: ")
                       "red"))
        (text-to-colorize (make-overlay from to)))
    (overlay-put text-to-colorize 'face (list :background bg-color))))
j-a-t-a
() автор топика
Ответ на: комментарий от j-a-t-a

>Да, понял, подстановка значения.

Ну да, у тебя квотированный список передавался, поэтому не значение цвета передавалось, а символ bg-color. Да, во втором случае лучше ':background написать. Забыл, когда печатал.

Оно заработало, но только с выключенным font-lock.

А ты дальше в документации посмотри на специальное свойство font-lock-face (сразу после face идет).

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

Я продублировал установку фейса для font-lock-face, но оно все равно не заработало.

Однако вариант с оверлеями меня вполне устраивает.

Еще раз огромное спасибо за помощь!

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