LINUX.ORG.RU

проблема с emacs's overlay


0

1

Такой вод код:

(defun my-compose-region (beg end text)
  (let ((ov (make-overlay beg end)))
    (overlay-put ov 'display text)
    (overlay-put ov 'modification-hooks
		 (list (lambda (ov _ _ _)
			 (delete-overlay ov))))))

(my-compose-region 1 10 "Oo")
После удаления или модификации текста оверлея выдает в буффер *Messages* такой текст:
delete-char: Wrong number of arguments: (lambda (ov _ _ _) (delete-overlay ov)), 5
Хотя в документяции явно описано, что функции modification-hooks вызываются с 4-мя аргументами.

Я меняю код на:

(defun my-compose-region (beg end text)
  (let ((ov (make-overlay beg end)))
    (overlay-put ov 'display text)
    (overlay-put ov 'modification-hooks
		 (list (lambda (ov _ _ _ _)  ; <- только здесь добавляю пятый аргумент
			 (delete-overlay ov))))))
И опять в буффер *Messages* выдает текст:
delete-char: Wrong number of arguments: (lambda (ov _ _ _ _) (delete-overlay ov)), 4
PS: я знаю, что в данном случае можно обойтись без modification-hooks, но мне нужна именно она т.к. хочу организовать цепочку взамосвязанных оверлеев.

Я могу написать вот так:

(defun my-compose-region (beg end text)
  (let ((ov (make-overlay beg end)))
    (overlay-put ov 'display text)
    (overlay-put ov 'modification-hooks
		 (list (lambda (ov &rest unused)
			 (delete-overlay ov))))))
и это даже будет работать, но...

Хотя в документяции явно описано, что функции modification-hooks вызываются с 4-мя аргументами.

В документации написано, что и с четырьмя, и с пятью:

     When called before a change, each function receives four
     arguments: the overlay, `nil', and the beginning and end of the
     text range to be modified.

     When called after a change, each function receives five arguments:
     the overlay, `t', the beginning and end of the text range just
     modified, and the length of the pre-change text replaced by that
     range. 
Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Просто функцию вызывай так:

(lambda (ov flag begin end &optional len)...)

По значению flag (t или nil) определяешь, до или после изменения вызвана функция. А эти подчеркивания «_», кто тебя так научил делать? Не надо такого творить. Пиши нормальные переменные, какие должны передаваться, но просто их не используй.

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

В документации написано, что и с четырьмя, и с пятью

упс ^^

А эти подчеркивания «_», кто тебя так научил делать? Не надо такого творить.

А почему так нельзя делать? вроде работает... и удобно...

arte-at-marte
() автор топика
Ответ на: комментарий от yyk

не работает... ну, верней уже работает другое. А именование неиспользуемых аргументов подчеркиваниями (или, иногда, минусами) я уже давно использую и пока проблем с этим не было.

arte-at-marte
() автор топика
Ответ на: комментарий от arte-at-marte

А почему так нельзя делать? вроде работает... и удобно...

Делать-то так можно, по всей видимости, но я в первый раз в жизни увидел такое. Даже не знаю, как это пришло в голову. Если коротко, то это моветон. :)

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.