Size: a a a

Emacs — русскоговорящее сообщество

2021 May 18

SD

Sergey D in Emacs — русскоговорящее сообщество
atomic-change-group уже делает всё, что нужно. Единственное, чего не хватает, это вызова undo-amalgamate-change-group с нужным хэндлом в нужном месте. Т.е. можно его целиком скопировать и добавить нужный вызов, как сделано по ссылке на стэкэксчейндж, но это не круто. Я хочу с адвайсом.

Точнее, это уже спортивный интерес.
источник

A

Aragaer in Emacs — русскоговорящее сообщество
гм. А нельзя сделать prepare-change-group, undo-amalgamate-change-group, activate-change-group, accept-change-group?
источник

SD

Sergey D in Emacs — русскоговорящее сообщество
ну вот, оно там всё так и делает

https://github.com/emacs-mirror/emacs/blob/3af9e84ff59811734dcbb5d55e04e1fdb7051e77/lisp/subr.el#L2932-L2962

мне только надо, чтобы после (accept-change-group ,handle) вызвался ещё и (undo-amalgamate-change-group ,handle)

с макросами еще не до конца разобрался, поэтому сразу не понимаю, можно ли это как-то сделать, или принципиально нерешаемо
источник

A

Aragaer in Emacs — русскоговорящее сообщество
собссно даже так
prepare
activate
действия
amalgamate
accept
источник

A

Aragaer in Emacs — русскоговорящее сообщество
по-моему не после, а до
источник

SD

Sergey D in Emacs — русскоговорящее сообщество
ну или так. но это разница между :before и :after. я в целом не понимаю, возможно ли это сделать через advice
источник

A

Aragaer in Emacs — русскоговорящее сообщество
я не очень понимаю, зачем тут адвайсы
источник

SD

Sergey D in Emacs — русскоговорящее сообщество
есть готовый макрос, который делает всё, что нужно

кроме вызова амальгамации. Я думаю, что если добавить адвайс к accept, а потом вызвать существующий макрос, то оно сделает вообще всё, что мне надо

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

___
"вызвать существующий макрос" - не уверен, что корректная формулировка, но думаю идея понятна
источник

A

Aragaer in Emacs — русскоговорящее сообщество
а, понял. Ты хочешь взять существующий atomic-change-group, но в нем нет undo-amalgamate
источник

A

Aragaer in Emacs — русскоговорящее сообщество
все, понял. Ну наверно да, можно адвайс повесить
источник

SD

Sergey D in Emacs — русскоговорящее сообщество
да, всё верно. Этот atomic-change-group решает только задачу атомарности. Если ошибка, то всё отменяем. Если ок, то действия остаются. Но в undo "буфере" изменения отдельными остаются. Нужно амалгамировать
источник

A

Aragaer in Emacs — русскоговорящее сообщество
беда в том, что тебе в amalgamate нужен handle, но его нельзя вроде получить
источник

SD

Sergey D in Emacs — русскоговорящее сообщество
ага, только осталось разобраться, как.

внутри atomic-change-group создаётся handle... да, вот ты написал. В этом и вопрос. Т.е. это теоретически невозможно?
источник

A

Aragaer in Emacs — русскоговорящее сообщество
а, не, можно, ну и собссно тогда все просто же
источник

A ß in Emacs — русскоговорящее сообщество
Sergey хелп add-function посмотри
источник

A

Aragaer in Emacs — русскоговорящее сообщество
(advice-add 'accept-change-group :after #'undo-amalgamate-change-group)
источник

SD

Sergey D in Emacs — русскоговорящее сообщество
вопрос не совсем в использовании адвайсов, а в получении объявленного внутри макроса значения из внешней функции (надеюсь понятно :D)
источник

SD

Sergey D in Emacs — русскоговорящее сообщество
это же будет вызов без параметров?
источник

A

Aragaer in Emacs — русскоговорящее сообщество
с параметром
источник

A ß in Emacs — русскоговорящее сообщество
а я говорил
источник