Всякий раз, когда я вызываю fill-paragraph
, буфер всегда помечается как измененный, даже если команда не имела никакого эффекта (то есть, если абзац уже был заполнен). Он также создает пустое отменяемое действие (легко обнаруживается с помощью undo-tree-mode
). Другие команды, которые могут вносить изменения, такие как команды отступа, не помечают буфер как измененный или создают отменяемое действие, если ничего не было изменено. Есть ли способ fill-paragraph
пометить измененный буфер и создать отменяемое действие, только если оно действительно что-то изменило?
fill-paragraph
Лили Чунг
источник
источник
M-q
- не помечает буфер, измененный по умолчанию, по крайней мере, из моего тестирования. Какой режим вы используете? Я предполагаю, что режим перезаписываетсяfill-paragraph
каким-то образом.Ответы:
Обратите внимание, что это исправлено для более новой версии Emacsen (v.26 и выше).
источник
Проблема в том, что
fill-paragraph
(или, скорее,fill-region-as-paragraph
) удалит и повторно вставит новые строки, пока он разбивает ваш абзац. Он не изменит буфер, если будет только одна строка. Нет в списке отмены, свидетелем которого вы являетесь, - это простоfill-paragraph
удаление и повторная вставка новых строк.Это не тривиально, чтобы избежать этого. Следующее является довольно плохим хаком и крайне неэффективно для больших буферов, но, возможно, оно работает для вас. Команда mimics
fill-paragraph
(M-q
) действует идентично, за исключением того, что она сохраняет содержимое буфера до его вызова, а затем, если содержимое остается прежним, восстанавливает состояние изменения и список отмены до изменения. Для этого ему нужна копия (фактически две) содержимого буфера, так что на самом деле это довольно неэффективно. :-)Вы можете связать это с
M-q
.источник
fill-paragraph
делает некоторые различия между различными случаями, то есть ведет себя по-разному в зависимости от активной области, существующих функций заполнения абзаца и т. д. Вам придется повторить это поведение, чтобы выяснить, какие части буфера действительно будут изменены. Возможно, но сложно. :-)Поздний ответ, но вот простая версия, которая не изменяет буфер, если текст не изменяется.
Он адаптирует некоторые идеи из ответа @ JorgenSchäfer, но работает только с текущим абзацем и только простым, разделенным пробелами способом (см. Комментарии @ JorgenSchäfer об осложнениях под капотом).
Это касается единственного варианта использования, который подходит для моих собственных целей (то есть интерактивного использования с «нормальной» прозой, без активной области), поэтому я публикую его на тот случай, если кто-то захочет использовать его или улучшить для более сложных вариантов использования. ,
источник