아무것도하지 않았더라도 채우기 단락 표시 파일이 변경된 것으로 표시됩니다.


11

내가 호출 할 때마다 fill-paragraph명령이 효과가 없어도 (즉, 단락이 이미 채워진 경우) 버퍼는 항상 수정 된 것으로 표시됩니다. 또한 빈 실행 취소 가능한 작업 (으로 쉽게 감지 undo-tree-mode)을 만듭니다. 들여 쓰기 명령과 같이 변경할 가능성이있는 다른 명령은 버퍼를 수정 된 것으로 표시하지 않거나 아무것도 변경되지 않은 경우 실행 취소 할 수없는 작업을 만듭니다. fill-paragraph버퍼를 수정 한 것으로 표시하고 실제로 변경 한 경우에만 실행 취소 가능한 조치를 작성하는 방법이 있습니까?


나는 이것이 옳지 않다고 생각합니다 M-q. 적어도 테스트에서 버퍼가 기본적으로 변경된 것으로 표시하지 않습니다. 어떤 모드를 사용하고 있습니까? fill-paragraph어떤 방식으로 모드를 덮어 쓰는 것 같습니다 .
shosti

@ shosti 기본 모드를 사용하고 있습니다. 단락은 한 줄 이상이어야합니다 (적절하게 채워진 경우).
Lily Chung

아 알았어 이제 봤어
shosti

답변:



10

문제는 즉 fill-paragraph(또는 오히려, fill-region-as-paragraph그것은 당신의 단락을 나누는 동안)를 제거하고 다시 삽입 줄 바꿈됩니다. 한 줄만 있으면 버퍼를 수정하지 않습니다. 실행 취소 목록의 no-op는 fill-paragraph개행을 제거하고 다시 삽입하는 것입니다.

이것을 피하는 것은 사소한 일이 아닙니다. 다음은 꽤 나쁜 해킹이며 큰 버퍼에는 매우 비효율적이지만 어쩌면 당신에게 효과적 일 수 있습니다. 이 명령 은 버퍼를 호출하기 전에 버퍼의 내용을 저장한다는 점을 제외하고 동일한 동작으로 fill-paragraph( M-q)을 모방 한 다음, 내용이 동일하게 유지되면 변경 전부터 수정 상태와 실행 취소 목록을 복원합니다. 이렇게하려면 버퍼 내용의 사본 (실제로는 두 개)이 필요하므로 실제로 이것은 매우 비효율적입니다. :-)

(defun my/fill-paragraph (&optional justify region)
  (interactive (progn
                 (barf-if-buffer-read-only)
                 (list (if current-prefix-arg 'full) t)))
  (let ((old-text (buffer-string))
        (old-modified (buffer-modified-p))
        (old-undo-list buffer-undo-list))
    (fill-paragraph justify region)
    (when (equal old-text (buffer-string))
      (setq buffer-undo-list old-undo-list)
      (set-buffer-modified-p old-modified))))

에 바인딩 할 수 있습니다 M-q.


1
예, 이것은 오랫동안 고통 스럽습니다. ;-) 이것에 대한 수정이 이전에 요청되었는지 궁금합니다. 그랬던 것 같습니다.
Drew

흠. 전체 버퍼를 확인할 필요가없는 더 나은 솔루션이 있는지 궁금합니다. 어쩌면 선택한 단락 만 어떻게 든 확인할 수 있습니까?
Lily Chung

fill-paragraph활성 영역, 기존 채우기-단락 함수 등에 따라 다양한 경우 사이에 약간의 차이가 있습니다. 실제로 버퍼의 어떤 부분이 변경 될지 알아 내기 위해 해당 동작을 복제해야합니다. 가능하지만 까다 롭습니다. :-)
Jorgen Schäfer


@ dkim : 예, 지금 기억합니다. 그리고 아무것도 그것에서 온 적이 없습니다 ...
Drew

1

늦은 답변이지만 텍스트가 변경되지 않으면 버퍼를 수정하지 않는 간단한 버전이 있습니다.

(defun my-fill-paragraph (&optional justify region)
  "Fill paragraph, but don't modify the buffer if filling doesn't
change the text.  See `fill-paragraph' for details."
  (interactive (progn
                 (barf-if-buffer-read-only)
                 (list (if current-prefix-arg 'full) t)))
  (if (buffer-modified-p)
      ;; if modified: use standard fill-paragraph
      (fill-paragraph justify region)
    ;; if unmodified: get a candidate filled version
    (save-excursion
      (let* ((col fill-column)
             (beg (progn (forward-paragraph -1)
                         (skip-syntax-forward " >")
                         (point)))
             (end (progn (forward-paragraph 1)
                         (skip-syntax-backward " >")
                         (point)))
             (old (buffer-substring-no-properties beg end))
             (new (with-temp-buffer
                    (setq fill-column col)
                    (insert old)
                    (fill-paragraph justify region)
                    (buffer-string))))
        ;; don't modify unless the old and new versions differ
        (unless (string-equal old new)
          (delete-region beg end)
          (insert new))))))

@ JorgenSchäfer의 답변에있는 아이디어 중 일부를 적용하지만 현재 단락에서만 간단하고 공백으로 분리 된 방식으로 만 작동합니다 (후드에서 합병증에 대한 @ JorgenSchäfer의 답변에 대한 의견 참조).

이것은 내 목적과 관련된 유일한 유스 케이스에 관한 것입니다 (즉, "정상"산문을 사용하는 대화 형 사용, 활성 영역 없음). 누군가가 그것을 사용하거나 더 복잡한 유스 케이스를 위해 개선하려는 경우에 게시하고 있습니다. .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.