Làm cách nào để định dạng / điền các mục đạn có định dạng kém trong chế độ org?


9

H: làm cách nào tôi có thể định dạng / điền các mục có định dạng kém vào org-modedanh sách dấu đầu dòng?

Tôi đang cố gắng tìm ra cách để thực hiện fill-paragraphcông việc trên các mục được định dạng kém trong một org-modedanh sách. Bởi "định dạng kém", ý tôi là những viên đạn dài sử dụng nhiều dòng nhưng cần được làm sạch để chúng có thể đọc được. Khó khăn là org-modedường như không nhận ra các dòng tiếp theo là một phần của cùng một viên đạn khi ký tự không phải khoảng trắng đầu tiên nằm trong cùng một cột với chính viên đạn.

Do đó, trong ví dụ dưới đây, đạn (1) không cần điền, đạn (2) và (3) cần điền và đáp ứng như mong đợi fill-paragraph, nhưng đạn (4) và (5) không lấp đầy như mong đợi:

* a header

  1) a simple bullet
  2) a bullet that responds nicely
     to
     fill-paragraph
     (try it!)
  3) another bullet that also responds nicely
    to
     fill-paragraph
    even though the "t" in "to" and the
     "e" in "even" line up with the space
         in between the "4)" and the start of the bullet
  4) a bullet that does
  NOT respond to fill-paragraph
  because the "N" in "NOT" is in the same column
  as the start of the bullet
  5) a similar problem:
the text is flush entirely to the left

Trước hết, tại sao điều này xảy ra? Thứ hai, và hơn thế nữa, làm thế nào tôi có thể thuyết phục org-modeđể coi tất cả các dòng cho đến viên đạn tiếp theo là một phần của cùng một viên đạn cho các fill-paragraphmục đích?

Câu trả lời:


10

Nó xảy ra bởi vì Org sử dụng thụt lề để định nghĩa văn bản là thuộc về một mục.

(info "(org)Plain lists")

Items belonging to the same list must have the same indentation on
the first line.

Để thuyết phục Org làm những gì bạn muốn, bạn cần phải lấy văn bản thụt vào mức của mục. Bạn có thể sử dụng C-x r t( string-rectangle) hoặc C-x C-i( indent-rigidly) để làm điều này và sau đó điền sẽ hoạt động như trong # 2 và # 3.

Nếu bạn đang ở trên dòng mục và bạn muốn nhập văn bản bên dưới nó, bạn có thể sử dụng C-j( org-return-indent) để di chuyển đến cùng một vết lõm trên dòng tiếp theo. Bằng cách đó, bạn có thể tránh định dạng như trong # 4 và # 5.


2

Như @KyleMeyer giải thích trong câu trả lời của mình, org-modekhông coi văn bản là một phần của một mục danh sách nếu nó không được thụt vào quá mức của viên đạn tương ứng. Vì vậy, về cơ bản, chúng ta cần một cách để hấp thụ các đoạn văn vào các mục danh sách .

Với điểm được định vị bên trong một mục danh sách, lệnh sau cho phép bạn làm điều đó mà không cần phải chăm sóc thụt lề bằng tay:

(defun org-back-to-item ()
  (re-search-backward "^ *[-+*]\\|^ *[1-9]+[)\.] " nil nil 1))

(defun org-fill-paragraph-handle-lists (&optional num-paragraphs)
  (interactive "p")
  (save-excursion
    (let ((bound (if mark-active
                     (- (region-end) 2)
                   (progn
                     (org-back-to-item)
                     (while (>= num-paragraphs 0)
                       (call-interactively 'org-mark-element)
                       (setq num-paragraphs (1- num-paragraphs)))
                     (- (region-end) 2)))))
      (while (search-forward "\n" bound t)
        (replace-match " ")))
    (org-fill-paragraph)))

(define-key org-mode-map (kbd "C-M-q") 'org-fill-paragraph-handle-lists)

Ý tưởng chính là thay thế các lần xuất hiện \nvới SPCtrong mục danh sách để điền trước khi gọi org-fill-paragraphnó.

Lưu ý rằng nếu bạn có nhiều hơn một đoạn trong một mục danh sách:

  ...
  4) a bullet that does
  NOT respond to fill-paragraph
  because the "N" in "NOT" is in the same column
  as the start of the bullet

  Some more text
  5) ...

bạn có thể làm cho Some more text(đoạn thứ hai) trở thành một phần của mục danh sách bằng cách gọi lệnh như thế này:

M-2 C-M-q

Cụ thể hơn, org-fill-paragraph-handle-listssẽ hấp thụ một đoạn duy nhất bên dưới một mục danh sách theo mặc định, nhưng có thể được hướng dẫn để hấp thụ bất kỳ số lượng đoạn nào bằng cách gọi nó bằng một tiền tố số arg.


Tài giỏi! Có một điểm chưa thực sự hiệu quả. Nếu điểm nằm trong văn bản org, theo mặc định, sẽ không xem xét một phần của mục (ví dụ: nếu chúng tôi ở dòng "KHÔNG ..." trong ví dụ), thì nó không điền như dự định - nghĩa là, nó cũng điền vào như một đoạn riêng biệt và làm lu mờ mục 5). Vấn đề dường như là ở cách org-mark-elementchọn yếu tố. Sẽ cho nó thêm một số suy nghĩ.
Dân

@Dan Vấn đề này có thể được giải quyết bằng cách xác định chức năng di chuyển điểm trở lại mục danh sách trước đó và gọi nó trước khi đánh dấu các đoạn. Xem mã cập nhật trong câu trả lời của tôi.
itjeyd
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.