한 줄에 한 문장으로 파일 편집


28

약간의 배경.

라텍스 문서를 버전 관리하려고하는데 한 줄에 한 문장 씩 접근 하면이 계획의 효과가 크게 향상 될 것 입니다.

예를 들어, 다음은 내 문서 모양입니다.

Some text here.
New stencence on the same paragraph.
Some more text, still on the same paragraph.

This is another paragraph.

내 질문은 간단하다.
Emacs로 얼마나 많은 부분을 자동화 / 개선 할 수 있습니까?

다음 두 가지 사항을 염두에 두어야합니다.

  1. 내 문장은 길기 때문에 실제로 줄을 채우지 않고 줄 바꿈해야합니다. 즉, 매우 긴 문장이 화면의 여러 줄에 표시되어야하지만 “.tex” 파일 의 한 줄이어야 합니다. 이것은 바람직하게는 방정식을 감싸지 않는 방식으로 수행됩니다.

    visual-line-mode창 너비로 줄 바꿈되어 너무 넓습니다. 줄을 감싸고 너비를 80 자 정도로 제한하는 것이 필요합니다. fill-paragraph일반적으로하는 것처럼 파일에서 실제로 줄을 바꾸지 않습니다.

  2. 각 문장마다 줄을 수동으로 끊을 수는 있지만 한 줄에 한 문장을 넣도록 구성 fill-paragraph(또는 가능 하면)하는 것이 좋습니다 auto-fill-mode.

1
정확히 어떤 종류의 개선 / 자동화를하고 있습니까? 이와 같은 파일을 효과적으로 편집하는 방법을 알고 싶습니까?
Rangi Lin

@RangiLin 예. 내가 언급 한 첫 번째 요점은 나에게 가장 중요한 것입니다. 그러나이를보다 효과적으로하기위한 다른 어떤 것도 환영합니다.
Malabarba

첫 번째 설명은 다음과 같습니다 visual-line-mode. 그러나 줄 바꿈 외에도 각 문장마다 줄 바꿈 문자를 자동 삽입해야합니까?
Kaushal Modi

@kaushalmodi 네, 그러나 각 문장 이후의 줄 바꿈은 실제이므로 파일에 있어야합니다. 비주얼 라인 모드의 문제점은 기본적으로 너무 넓다는 것입니다. 줄일 방법이 있다면 좋을 것입니다.
Malabarba

@ 말라 바바 : 왜 그런지 아십니까? 나에게, 그것은 가장 유용한 포장 모드입니다 ...
Tikhon Jelvis

답변:


11

visual-line-mode구성 가능하지만 원하는 것을 원한다면 longlines-mode대부분의 산문에 사용하는 것을 시도해 볼 수 있습니다 . longlines-modevisual-line-mode구성된 너비와 유사하게 텍스트를 줄 바꿈합니다 fill-column.

여기에 fill-column설정된 스크린 샷이 있습니다 70(창은 실제로 오른쪽으로 더 확장됩니다).

긴 줄 모드 줄 바꿈 텍스트의 예입니다.

구성 fill-paragraph은 깔끔하지만 어떻게 해야할지 모르겠습니다. 대신, 합리적인 임시 해킹이 있습니다. .TeX 모드에서 캐릭터를 전기로 만들어 줄 바꿈을 삽입하십시오. 이것은 적절한 모드 후크가 무엇이든간에 리 바인드를 포함합니다.

(defun my-electric-dot ()
  (interactive)
  (insert ".\n"))
(defun my-tex-hook ()
  (local-set-key (kbd ".") 'my-electric-dot))
(add-hook 'TeX-mode-hook 'my-tex-hook)

1
longlines-mode를 지적 해 주셔서 감사합니다! 나는 방정식을 감싸지 않고 들여 쓰기 된 선의 모양을 고칠 수있었습니다. 여기에 주요 내용 gist.github.com/c532f77144ddf86b4ea4.git
Malabarba

@ 말라 바바 : 쿨. 나는 아마도 그 변화 중 일부를 직접 사용할 것입니다! 링크가 제대로 작동하지 않습니다. 여기에 웹 친화적 인 버전이다 : gist.github.com/Bruce-Connor/c532f77144ddf86b4ea4은
티콘 Jelvis

감사. 또한 조언은 라텍스 엑스트라 패키지의 기능을 사용한다는 점을 언급하지 않았습니다.
Malabarba

그건 그렇고, longlines-mode가 24.4에서 더 이상 사용되지 않는 것으로 표시됩니다 (동등한 대안이 없음)
Malabarba

2
점은 문장을 끝내는 데뿐만 아니라 모든 종류의 다른 목적으로도 사용되므로 전기 점은 잘 작동하지 않습니다. 점 다음에 두 개의 공백과 점 다음에 개행 문자를 바꾸는 것이 좋습니다.
tmalsburg

13

(1)의 경우 확대 마진을 사용 visual-line-mode하여 원하는 줄 을 줄 바꿈합니다 fill-column. 그러나 이것은 텍스트 줄과 방정식 모두에 영향을 미칩니다.

(2) M-q와 관련하여 , 단락에 바인딩 되고 정확하게 채우기 위해 사용자 정의 채우기 명령을 정의 할 수 있습니다 . 자동 채우기에 대한 올바른 동작으로 명령을 작성하지 못했습니다.

이것을 모두 마이너 모드로 감싸면 다음과 같이 보일 수 있습니다. 매우 아름다운 코드는 아니지만 대부분의 경우 작동합니다. ( 문제를 눈치 채지 않고 꽤 오랫동안 unfill-paragraph내 기능을했습니다 init.el).

(define-minor-mode ospl-mode
  "One Sentence Per Line"
  :init-value nil
  :lighter " ospl"
  :keymap (let ((map (make-sparse-keymap)))
            (define-key map (kbd "M-q") 'ospl/fill-paragraph)
            map)

  (if ospl-mode
      (progn
        (visual-line-mode 1)
        (setq right-margin-width (- (window-body-width) fill-column)))
    (visual-line-mode -1)
    (setq right-margin-width 0))

  ;; Account for new margin width
  (set-window-buffer (selected-window) (current-buffer)))


(defun ospl/unfill-paragraph ()
  "Unfill the paragraph at point.

This repeatedly calls `join-line' until the whole paragraph does
not contain hard line breaks any more."
  (interactive)
  (forward-paragraph 1)
  (forward-paragraph -1)
  (while (looking-at paragraph-start)
    (forward-line 1))
  (let ((beg (point)))
    (forward-paragraph 1)
    (backward-char 1)
    (while (> (point) beg)
      (join-line)
      (beginning-of-line))))


(defun ospl/fill-paragraph ()
  "Fill the current paragraph until there is one sentence per line.

This unfills the paragraph, and places hard line breaks after each sentence."
  (interactive)
  (save-excursion
    (fill-paragraph)         ; takes care of putting 2 spaces if needed
    (ospl/unfill-paragraph)  ; remove hard line breaks

    ;; insert line breaks again
    (let ((end-of-paragraph (make-marker)))
      (save-excursion
        (forward-paragraph)
        (backward-sentence)
        (forward-sentence)
        (set-marker end-of-paragraph (point)))
      (forward-sentence) 
      (while (< (point) end-of-paragraph)
        (just-one-space)
        (delete-backward-char 1)
        (newline)
        (forward-sentence))
      (set-marker end-of-paragraph nil)))) 

단락 채우기가 훌륭하게 작동하므로 두 가지 답변을받을 수 있기를 바랍니다. 그냥 교체 unfill-paragraph와 함께 ospl/unfill-paragraph. 여백도 작동하지만 들여 쓰기 된 텍스트는 나빠 보이고 수식도 래핑하지만 아래의 longlines 방법을 해킹 하여이 두 가지 문제를 해결했습니다.
Malabarba

고마워 내가 말했듯이, 나는 오랫동안 unfill-paragraph접두사를 붙 init.el였습니다. 방금 어제 일관성을 유지하기 위해 접두사를 붙이고 버그를 소개했습니다.
ffevotte

네, 그런 것 같아요 또한 우리는 아마도 다음과 같은 작업을 수행하여 단락을 채우지 못할 수도 있음을 깨달았습니다 (let ((fill-column 1000000)) (fill-pragraph)). 아직 테스트하지 않았습니다.
Malabarba

그렇습니다, 그러한 해결책은 효과가 있습니다. 난 그냥 마법 상수를 좋아하지 않아 (하지만 내 코드도 매우 아름답 지 않아서 어느 쪽이 더 낫다고 주장 할 수 있는지 ...)
ffevotte

1
이 솔루션을 좋아하십시오. 주석 처리 된 줄을 여러 줄로 나누지 않는 간단한 방법이 있습니까?
Ramprasad

9

git diff --color-words 또는 latexdiff를 사용하면 버전 관리 문제를 피하거나 해결할 수 있습니까? 그런 다음 변경된 단어를 볼 수 있습니다.


2
색칠 공부는 정말 다량입니다! 그러나 다른 사람들의 기여를 합병하거나 오래된 커밋을 되돌릴 때 충돌을 피할 수 있도록 olps 접근 방식이 여전히 필요합니다 .
Malabarba

2

몇 년 동안 (때로) 사용했던 이것을 개선하는 한 가지 방법은 ( AUCTeX의 일부) 기능을 사용하여 줄 바꿈을 접어서 줄 바꿈이있는 문장을 서로 흐르게 tex-fold하는 것입니다.

이것은 이것을 의미합니다

Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Mauris pellentesque fringilla justo, quis dapibus velit tincidunt quis?
Quisque varius ligula arcu, ut imperdiet risus maximus nec.

접힌

Lorem ipsum dolor sit amet, consectetur adipiscing elit⁎ Mauris pellentesque fringilla justo, quis dapibus velit tincidunt quis❓  Quisque varius ligula arcu, ut imperdiet risus maximus nec⁎

최근에 이것을 패키지의 보조 모드로 결합했습니다. 아마도 다른 누군가도 이것이 유용하다는 것을 알 것입니다 : https://github.com/andersjohansson/tex-fold-linebreaks

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