Bagaimana saya bisa membagi paragraf menjadi satu baris per kalimat tetapi tetap membungkusnya secara visual?

14

Ini mirip dengan Mengedit file dengan satu kalimat per baris (dalam fungsi dan motif), tetapi saya ingin memiliki paragraf penuh, mengalir daripada jeda visual pada setiap kalimat.

Saya ingin memiliki mode kecil yang, ketika aktif, akan secara visual bergabung dengan baris dari paragraf yang sama (tidak dipisahkan oleh \n\natau paragraph-separateatau ...) dan kemudian mengaktifkan perilaku (mungkin berasal dari visual-line-mode) yang akan membungkus baris tanpa benar-benar memasukkan \n.

Apakah ada mode seperti itu? Jika tidak, bagaimana saya akan melanjutkan proses mengubah properti tampilan paragraf untuk mencapai hasil? (Lagi pula, ini adalah inti dari mode seperti itu dan seseorang dapat dikembangkan dari cuplikan.)

Sean Allred
sumber
[...] akan bergabung secara visual [...]. Apakah maksud Anda mempertahankan yang mendasarinya \n(jika ada), atau apakah Anda ingin benar-benar menghapus baris baru untuk menyediakan 1 paragraf per baris?
Jonathan Leech-Pepin
1
Mungkin Anda bisa menggunakan buffer-display-tableuntuk membuat garis-baru \ntampak seperti sesuatu yang lain seperti spasi atau sesuatu - lihat contoh berikut di tautan: stackoverflow.com/a/24842771/2112489 Keuntungan dengan ini adalah teks di dokumen tidak diubah. Baris baru bisa apa saja - misalnya, wajah tersenyum, spasi, simbol pilcrow, dll. Efek visualnya adalah bahwa pembungkus akan terjadi.
hukum
@ JonathanLeech-Pepin Saya ingin menjaga baris baru di mana hadir. Sebenarnya, saya ingin memaksa baris baru di akhir kalimat, tetapi ini bisa dilakukan melalui kait terpisah.
Sean Allred
1
@lawlist efek visualnya adalah bahwa baris baru akan hilang ke mana-mana, bukan? Bukankah semua paragraf akan diciutkan menjadi satu?
Malabarba
1
Saya bersimpati dengan permintaan ini tetapi berpikir bahwa mode minor yang dijelaskan oleh OP bukanlah solusi yang tepat. Masalah yang mendasarinya adalah bahwa diff tidak berfungsi dengan baik untuk teks karena dirancang untuk kode. Mengatasi masalah ini di Emacs adalah mungkin tetapi bukan solusi bersih karena berbagai alasan. Akan jauh lebih baik untuk meningkatkan diff agar bekerja dengan baik dengan teks.
tmalsburg

Jawaban:

3

Seperti yang dikatakan Tom, meletakkan properti tampilan di baris baru akan cukup berhasil.

Masalahnya adalah mencari tahu garis mana yang akan dibungkus.

Berikut adalah contoh untuk membantu Anda memulai:

(let ((eol-regexp "[[:graph:]] ?\\(\n\\)[^\t\n ]"))
  (font-lock-add-keywords nil
   `((,eol-regexp 1 '(face default display " ")))))

(visual-line-mode 1)

Ini akan "menghapus" baris baru jika didahului oleh karakter grafis dan baris berikutnya tidak berlekuk atau kosong. Anda harus bereksperimen untuk menemukan sesuatu yang cocok untuk Anda.

Beberapa penjelasan lagi:

  1. font-lock-add-keywordsmenambahkan daftar aturan ke penguncian font (jadi penguncian font harus diaktifkan. Argumen pertama bisa berupa mode (misalnya text-mode); dalam kasus kami adalah nil, yang berarti menambahkan aturan hanya untuk buffer saat ini.
  2. "Aturan" kami adalah (,eol-regexp 1 '(face default display " ")). Elemen pertama adalah ekspresi reguler yang kami buat sebelumnya; yang kedua adalah subekspresi yang kami minati; yang ketiga adalah "wajah" yang ingin kita terapkan.
  3. Meskipun menggunakan wajah untuk baris baru tidak berguna bagi kami, kami juga dapat menambahkan properti teks. Jadi kami menggunakan wajah default dan daripada menambahkan penyihir properti tampilan menggantikan substring 1 (yaitu baris baru) dengan spasi.
  4. Jika Anda menembak diri sendiri di kaki, hapus buffer atau hapus kata kunci dengan font-lock-remove-keywords.
  5. Anda mungkin juga ingin menambahkan displayuntuk font-lock-extra-managed-props(saya belum mencoba ini).
  6. Bagian yang sulit adalah untuk mendapatkan regexp dengan benar. "\ (\ n \) [^ \ n]" akan cocok dengan baris baru mana pun yang tidak segera diikuti oleh yang lain. ". \ {30, \} \ (\ n \)" hanya akan cocok dengan baris baru yang didahului oleh setidaknya 30 karakter.
olaf b
sumber
Satu dapat menemukan implementasi di atas sebagai paket di github.com/andersjohansson/tex-fold-linebreaks
zakkak
0

Jika saya memahami masalahnya dengan benar, Anda ingin mempertahankan semua baris baru di buffer sebagaimana adanya; tetapi Anda ingin menampilkannya sebagai spasi. Lalu, Anda ingin pembungkus kata.

Untuk pembungkus kata, saya pikir Anda bisa menggunakannya visual-line-mode.

Untuk berurusan dengan baris baru, saya pikir Anda mungkin bisa menempatkan displayproperti dengan " "(string yang terdiri dari satu ruang) sebagai nilai pada baris baru yang ingin ditampilkan secara berbeda.

Tom Tromey
sumber