Chỉnh sửa tệp với một câu trên mỗi dòng


28

Một chút nền tảng.

Tôi đang cố gắng kiểm soát phiên bản các tài liệu latex của mình và hiệu quả của sáng kiến ​​này sẽ được cải thiện đáng kể nếu tôi áp dụng cách tiếp cận một câu trên mỗi dòng .

Ví dụ, sau đây là những gì tài liệu của tôi sẽ trông như thế nào.

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

This is another paragraph.

Câu hỏi của tôi rất đơn giản.
Bao nhiêu trong số đó tôi có thể tự động hóa / cải thiện với Emacs?

Hai điểm sau đây là những gì tôi có trong tâm trí.

  1. Câu của tôi dài , vì vậy tôi cần phải xếp hàng mà không thực sự điền chúng. Đó là, một câu rất dài cần được hiển thị trên một vài dòng trên màn hình của tôi, nhưng nó cần phải là một dòng duy nhất trong tập tin .tex . Điều này tốt nhất nên được thực hiện theo cách không bao bọc các phương trình.

    visual-line-modekết thúc ở chiều rộng cửa sổ, đó là quá rộng. Tôi cần một cái gì đó bao bọc các dòng và giới hạn chiều rộng của chúng đến 80 ký tự. Cũng giống như fill-paragraphthường làm, nhưng không thực sự phá vỡ các dòng trong tệp.

  2. Tôi có thể tự ngắt dòng sau mỗi câu, nhưng sẽ rất thích hợp nếu tôi có thể định cấu hình fill-paragraph(hoặc thậm chí auto-fill-mode) để đặt một câu trên mỗi dòng.

1
Những loại cải tiến / tự động hóa sau khi bạn chính xác? Bạn có muốn biết làm thế nào để chỉnh sửa hiệu quả trong các tập tin như thế này?
Rangi Lin

@RangiLin Vâng. Điểm đầu tiên tôi đề cập là điều quan trọng nhất đối với tôi. Nhưng bất cứ điều gì khác để làm cho điều này hiệu quả hơn đều được chào đón.
Malabarba

Các mô tả trong điểm đầu tiên trông như thế nào visual-line-mode. Nhưng ngoài cách gói dòng đó, bạn cũng cần tự động chèn một ký tự dòng mới sau mỗi câu, đúng không?
Kaushal Modi

@kaushalmodi Có, nhưng dòng mới sau mỗi câu là có thật, nó phải có trong tệp. Vấn đề với chế độ đường trực quan là mặc định nó quá rộng. Nếu có một cách để giảm bớt nó, nó sẽ rất tuyệt.
Malabarba

@Malabarba: Bạn có biết tại sao không? Đối với tôi, đó là chế độ gói hữu ích nhất cho đến nay ...
Tikhon Jelvis

Câu trả lời:


11

Nếu bạn chỉ muốn một cái gì đó giống như visual-line-modenhưng có thể cấu hình, bạn có thể thử longlines-modeđó là những gì tôi sử dụng cho hầu hết văn xuôi của tôi. longlines-modekết thúc văn bản của bạn tương tự như visual-line-modevới chiều rộng được cấu hình bởi fill-column.

Đây là một ảnh chụp màn hình với fill-columnthiết lập 70(cửa sổ thực sự mở rộng hơn nữa ở bên phải).

Một ví dụ về văn bản gói chế độ dài dòng.

Cấu hình fill-paragraphsẽ gọn gàng, nhưng tôi không biết làm thế nào để làm điều đó. Thay vào đó, đây là một cách hack tạm thời hợp lý: làm cho .nhân vật của bạn hoạt động ở chế độ TeX, chèn một dòng mới. Điều này chỉ liên quan đến việc đóng lại nó trong bất kỳ hook chế độ thích hợp nào:

(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
Cảm ơn rất nhiều vì đã chỉ ra chế độ dài dòng! Tôi quản lý để có được nó để không bao bọc các phương trình và thậm chí sửa chữa các giao diện thụt lề. Đây là ý chính của gist.github.com/c532f77144ddf86b4ea4.git
Malabarba

@Malabarba: Tuyệt. Có lẽ tôi sẽ sử dụng một số trong những thay đổi đó cho mình! Liên kết của bạn không hoạt động đúng; đây là phiên bản thân thiện với web: gist.github.com/Bruce-Connor/c532f77144ddf86b4ea4
Tikhon Jelvis

Cảm ơn. Ngoài ra, quên đề cập, lời khuyên đó sử dụng một chức năng từ gói latex-Extra.
Malabarba

Nhân tiện, đáng chú ý là chế độ đường dài được đánh dấu là lỗi thời trong 24.4 (không phải là nó có một sự thay thế tương đương),
Malabarba

2
Dấu chấm điện sẽ không hoạt động tốt bởi vì dấu chấm không chỉ được sử dụng để kết thúc câu mà còn cho tất cả các loại mục đích khác. Sẽ là tốt hơn để thay thế một dấu chấm theo sau bởi hai khoảng trắng bằng một dấu chấm theo sau là một dòng mới.
tmalsburg

13

Đối với (1), tôi sẽ sử dụng lề mở rộng, để visual-line-modekết thúc các dòng theo ý muốn fill-column. Điều này sẽ ảnh hưởng đến cả dòng văn bản và phương trình, mặc dù.

Đối với (2), người ta có thể định nghĩa một lệnh điền tùy chỉnh được ràng buộc M-qvà điền chính xác các đoạn. Tôi chưa quản lý để viết một lệnh với hành vi chính xác để tự động điền.

Gói tất cả trong một chế độ nhỏ có thể trông như sau. Nó không phải là mã rất đẹp, nhưng nên hoạt động trong hầu hết các trường hợp. (Tôi đã có unfill-paragraphchức năng trong init.elmột thời gian khá lâu mà không nhận thấy vấn đề gì).

(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)))) 

Đoạn văn làm việc tuyệt vời, tôi ước tôi có thể chấp nhận hai câu trả lời. Chỉ cần thay thế unfill-paragraphbằng ospl/unfill-paragraph. Các lề cũng hoạt động, nhưng văn bản thụt lề có vẻ xấu và chúng cũng bao bọc các phương trình, trong khi tôi quản lý để hack phương thức longlines dưới đây khắc phục hai vấn đề này.
Malabarba

Đã sửa, cảm ơn. Như tôi đã nói, tôi đã có unfill-paragraph(không được chuẩn bị) trong init.elmột thời gian dài. Tôi vừa mới bắt đầu ngày hôm qua để thống nhất và giới thiệu một lỗi ....
ffevotte

Vâng, tôi đoán nó là một cái gì đó như thế. Tôi cũng nhận ra rằng chúng ta có thể hoàn thành đoạn văn chỉ bằng cách làm một cái gì đó như thế (let ((fill-column 1000000)) (fill-pragraph)). Chưa được thử nghiệm mặc dù.
Malabarba

Đúng, một giải pháp như vậy hoạt động. Tôi chỉ không thích có các hằng số ma thuật (nhưng mã của tôi cũng không đẹp lắm, vì vậy người ta có thể tranh luận cái nào tốt hơn ...)
ffevotte

1
Yêu giải pháp này. Có một cách đơn giản để tránh phá vỡ các dòng nhận xét thành nhiều dòng?
Ramprasad

9

Các vấn đề kiểm soát phiên bản của bạn sẽ được tránh / giải quyết nếu bạn sử dụng git diff --color-words hoặc latexdiff? Sau đó, bạn có thể nhìn vào các từ thay đổi.


2
Màu chữ là gan thực sự! Nhưng tôi vẫn cần cách tiếp cận olps để giúp tránh xung đột khi hợp nhất các đóng góp của người khác và khi hoàn trả các cam kết cũ.
Malabarba

2

Một cách để cải thiện điều này mà tôi đã sử dụng (đôi khi) trong vài năm là hiển thị các câu có ngắt dòng như nhau bằng cách gấp các ngắt dòng bằng cách sử dụng các phương tiện của tex-fold(một phần của AocateeX).

Điều này có nghĩa là

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.

được gấp lại để

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⁎

Gần đây tôi đã kết hợp nó như một chế độ nhỏ trong một gói. Có lẽ ai đó cũng sẽ thấy điều này hữu ích: https://github.com/andersjohansson/tex- Fold-linebreaks

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.