Bagaimana memformat / mengisi item-item bullet yang tidak diformat dengan baik dalam mode-org?

9

T: bagaimana saya bisa memformat / mengisi item berformat buruk dalam org-modedaftar berpoin?

Saya mencoba mencari cara untuk fill-paragraphbekerja pada item berpoin yang berformat buruk dalam org-modedaftar. Dengan "format yang buruk," Maksudku peluru panjang yang menggunakan banyak baris tetapi perlu dibersihkan untuk membuatnya bisa dibaca. Kesulitannya adalah bahwa org-modetampaknya tidak mengenali garis-garis berikutnya sebagai bagian dari peluru yang sama ketika karakter non-spasi pertama berada di kolom yang sama dengan peluru itu sendiri.

Karenanya, dalam contoh di bawah ini, peluru (1) tidak perlu diisi, peluru (2) dan (3) perlu diisi dan direspon seperti yang diharapkan. fill-paragraph , tetapi peluru (4) dan (5) tidak mengisi seperti yang diharapkan:

* 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

Pertama-tama, mengapa ini terjadi? Kedua, dan lebih tepatnya, bagaimana saya bisa meyakinkan org-modeuntuk memperlakukan semua garis hingga peluru berikutnya sebagai bagian dari peluru yang sama untuk fill-paragraphtujuan?

Dan
sumber

Jawaban:

10

Itu terjadi karena Org menggunakan lekukan untuk mendefinisikan teks sebagai milik suatu item.

(info "(org)Plain lists")

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

Untuk meyakinkan Org untuk melakukan apa yang Anda inginkan, Anda perlu memasukkan teks ke level item. Anda dapat menggunakan C-x r t( string-rectangle) atau C-x C-i ( indent-rigidly) untuk melakukan ini dan kemudian mengisi akan berfungsi seperti pada # 2 dan # 3.

Jika Anda berada di baris item dan ingin memasukkan teks di bawahnya, Anda dapat menggunakan C-j( org-return-indent) untuk berpindah ke lekukan yang sama pada baris berikutnya. Dengan begitu, Anda dapat menghindari pemformatan seperti di # 4 dan # 5.

Kyle Meyer
sumber
2

Seperti yang dijelaskan oleh @KyleMeyer dalam jawabannya, org-modetidak menganggap teks sebagai bagian dari item daftar jika tidak melewati indentasi tingkat peluru yang sesuai. Jadi pada dasarnya, kita perlu cara untuk menyerap paragraf ke dalam daftar item .

Dengan titik diposisikan di dalam item daftar, perintah berikut memungkinkan Anda melakukan itu tanpa harus mengurus lekukan secara manual:

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

Gagasan utamanya adalah mengganti kemunculan \ndengan SPCdalam item daftar untuk diisi sebelum memanggilnya org-fill-paragraph.

Perhatikan bahwa jika Anda memiliki lebih dari satu paragraf di dalam item daftar:

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

Anda dapat membuat Some more text(paragraf kedua) menjadi bagian dari item daftar dengan memanggil perintah seperti ini:

M-2 C-M-q

Lebih khusus lagi, org-fill-paragraph-handle-listsakan menyerap satu paragraf di bawah item daftar secara default, tetapi dapat diinstruksikan untuk menyerap sejumlah paragraf dengan menyebutnya dengan awalan angka numerik.

itu hanya
sumber
Pintar! Ada satu hal yang belum berfungsi. Jika titik ada dalam teks yang org, secara default, tidak akan mempertimbangkan bagian dari item (misalnya, jika kita berada di baris "BUKAN ..." dalam contoh), itu tidak mengisi seperti yang dimaksudkan - yaitu, itu mengisi sebagai paragraf terpisah dan menyeruput item 5) juga. Masalahnya adalah bagaimana org-mark-elementmemilih elemen. Akan memikirkannya lagi.
Dan
@Dan Masalah ini dapat diatasi dengan mendefinisikan fungsi yang mengarah kembali ke item daftar sebelumnya, dan memanggilnya sebelum menandai paragraf. Lihat kode yang diperbarui dalam jawaban saya.
itsjeyd