การแก้ไขไฟล์ด้วยหนึ่งประโยคต่อหนึ่งบรรทัด


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

@Malabarba: คุณรู้ไหมว่าทำไม? สำหรับฉันมันเป็นโหมดการห่อที่มีประโยชน์มากที่สุดในตอนนี้ ...
Tikhon Jelvis

คำตอบ:


11

หากคุณต้องการอะไรvisual-line-modeแต่สามารถกำหนดค่าได้คุณสามารถลองlonglines-modeใช้สิ่งที่ฉันใช้กับงานประพันธ์ส่วนใหญ่ของฉัน longlines-modeตัดข้อความของคุณในทำนองเดียวกันกับที่มีความกว้างที่กำหนดค่าโดยvisual-line-modefill-column

ต่อไปนี้เป็นภาพหน้าจอพร้อมfill-columnตั้งค่าเป็น70(จริง ๆ แล้วหน้าต่างขยายไปทางขวามากขึ้น)

ตัวอย่างของข้อความการตัดโหมด Longlines

การกำหนดค่าfill-paragraphจะเรียบร้อย แต่ฉันไม่แน่ใจว่าจะทำอย่างไร แต่นี่คือการแฮ็กชั่วคราวที่เหมาะสม: สร้าง.ตัวละครของคุณขึ้นมาในโหมด TeX โดยแทรกบรรทัดใหม่ สิ่งนี้เกี่ยวข้องกับการรีมันในสิ่งที่ hook ของโหมดที่เหมาะสมคือ:

(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
ขอบคุณมากสำหรับการชี้ให้เห็นถึงโหมดแนวยาว! ฉันจัดการเพื่อให้มันไม่ห่อสมการและแก้ไขลักษณะของเส้นที่เยื้อง นี่คือส่วนสำคัญgist.github.com/c532f77144ddf86b4ea4.git
Malabarba

@Malabarba: เจ๋ง ฉันอาจใช้การเปลี่ยนแปลงเหล่านั้นด้วยตัวเอง! ลิงค์ของคุณทำงานไม่ถูกต้อง นี่เป็นรุ่นที่เหมาะกับเว็บ: gist.github.com/Bruce-Connor/c532f77144ddf86b4ea4
Tikhon Jelvis

ขอบคุณ นอกจากนี้ลืมที่จะพูดถึงคำแนะนำที่ใช้ฟังก์ชั่นจากแพคเกจเสริมลาเท็กซ์
Malabarba

โดยวิธีการมันเป็นที่น่าสังเกตว่าโหมด longlines ถูกทำเครื่องหมายเป็นล้าสมัยใน 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

ใช่ฉันคิดว่ามันเป็นอย่างนั้น ฉันยังตระหนักว่าเราสามารถวรรคอาจ unfill (let ((fill-column 1000000)) (fill-pragraph))โดยเพียงแค่ทำสิ่งที่ต้องการ ยังไม่ได้ทดสอบ
Malabarba

ใช่วิธีการแก้ปัญหาดังกล่าวทำงาน ฉันไม่ชอบที่จะมีค่าคงที่เวทย์มนตร์ (แต่รหัสของฉันก็ไม่ได้สวยมากเช่นกันดังนั้นใครจะเถียงว่าไหนดีกว่า ... )
ffevotte

1
รักทางออกนี้ มีวิธีง่าย ๆ ในการหลีกเลี่ยงการแบ่งบรรทัดที่คอมเม้นต์ออกเป็นหลายบรรทัดหรือไม่?
Ramprasad

9

ปัญหาการควบคุมเวอร์ชันของคุณจะหลีกเลี่ยง / แก้ไขได้หรือไม่ถ้าคุณใช้ git diff --color-word หรือ latexdiff? จากนั้นคุณสามารถดูคำที่เปลี่ยนแปลง


2
คำระบายสีเป็นสิ่งที่มีประโยชน์แน่นอน! แต่ฉันยังต้องการวิธีการolpsเพื่อช่วยหลีกเลี่ยงความขัดแย้งเมื่อรวมการมีส่วนร่วมของผู้อื่นและเมื่อคืนค่าคอมมิชชันเก่า
Malabarba

2

วิธีหนึ่งในการปรับปรุงสิ่งนี้ที่ฉันได้ใช้ (เป็นบางครั้ง) เป็นเวลาหลายปีคือการแสดงประโยคที่มีการขึ้นบรรทัดใหม่เหมือนกันโดยการพับการแบ่งบรรทัดโดยใช้สิ่งอำนวยความสะดวกของtex-fold(ส่วนหนึ่งของ AUCTeX)

ซึ่งหมายความว่าสิ่งนี้

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.