Mengedit file dengan satu kalimat per baris

28

Sedikit latar belakang.

Saya mencoba untuk mengontrol versi dokumen lateks saya, dan keefektifan inisiatif ini akan sangat meningkat jika saya mengadopsi pendekatan satu kalimat per baris .

Sebagai contoh, berikut ini adalah seperti apa dokumen saya nantinya.

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

This is another paragraph.

Pertanyaan saya sederhana.
Berapa banyak dari itu yang dapat sayaotomatiskan / tingkatkan dengan Emacs?

Dua poin berikut adalah apa yang ada dalam pikiran saya.

  1. Kalimat saya panjang , jadi saya harus membungkus garis tanpa benar-benar mengisinya. Artinya, kalimat yang sangat panjang perlu ditampilkan pada beberapa baris di layar saya, tetapi perlu satu baris dalam file ".tex" . Ini lebih disukai dilakukan dengan cara yang tidak membungkus persamaan.

    visual-line-modemembungkus lebar jendela, itu terlalu lebar. Saya perlu sesuatu yang membungkus garis dan membatasi lebarnya hingga 80 karakter. Sama seperti fill-paragraphbiasanya, tetapi tanpa benar-benar melanggar garis dalam file.

  2. Saya dapat mematahkan baris secara manual setelah setiap kalimat, tetapi akan sangat disukai jika saya dapat mengkonfigurasi fill-paragraph(atau bahkan mungkin auto-fill-mode) untuk meletakkan satu kalimat per baris juga.
Malabarba
sumber
1
Perbaikan / otomasi apa yang Anda cari sebenarnya? Apakah Anda ingin tahu cara mengedit secara efektif dalam file seperti ini?
Rangi Lin
@RangiLin Ya. Poin pertama yang saya sebutkan adalah hal terpenting bagi saya. Tetapi hal lain untuk menjadikan ini lebih efektif adalah disambut.
Malabarba
Deskripsi di poin pertama terlihat seperti visual-line-mode. Namun selain pembungkus baris itu, Anda juga perlu menyisipkan karakter baris baru setelah setiap kalimat juga, benar?
Kaushal Modi
@kaushalmodi Ya, tapi baris baru setelah setiap kalimat itu nyata, harus ada dalam file. Masalah dengan mode garis visual adalah bahwa itu terlalu lebar secara default. Jika ada cara untuk menguranginya, itu akan bagus.
Malabarba
@Malabarba: Tahukah Anda mengapa? Bagi saya, ini adalah mode pembungkus yang paling berguna sejauh ini ...
Tikhon Jelvis

Jawaban:

11

Jika Anda hanya ingin sesuatu seperti visual-line-modetetapi dapat dikonfigurasi, Anda dapat mencoba longlines-modeapa yang saya gunakan untuk sebagian besar prosa saya. longlines-modemembungkus teks Anda dengan cara yang sama visual-line-modedengan lebar dikonfigurasi oleh fill-column.

Berikut screenshot dengan fill-columnset to 70(jendela sebenarnya meluas lebih ke kanan).

Contoh teks pembungkus mode garis panjang.

Konfigurasi fill-paragraphakan rapi, tetapi saya tidak yakin bagaimana melakukannya. Alih-alih, inilah peretasan sementara yang masuk akal: menjadikan .karakter Anda elektrik dalam mode TeX, menyisipkan baris baru. Ini hanya melibatkan rebinding dalam apa pun mode hook yang sesuai:

(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)
Tikhon Jelvis
sumber
1
Terima kasih banyak telah menunjukkan mode longline! Saya berhasil membuatnya tidak membungkus persamaan dan bahkan memperbaiki tampilan garis indentasi. Inilah intisari gist.github.com/c532f77144ddf86b4ea4.git
Malabarba
@Malabarba: Keren. Saya mungkin akan menggunakan beberapa perubahan itu sendiri! Tautan Anda tidak berfungsi dengan baik; inilah versi ramah-web: gist.github.com/Bruce-Connor/c532f77144ddf86b4ea4
Tikhon Jelvis
Terima kasih. Juga, lupa menyebutkan, bahwa saran menggunakan fungsi dari paket lateks-tambahan.
Malabarba
Ngomong-ngomong, perlu dicatat bahwa mode longline-ditandai sebagai usang dalam 24,4 (bukan bahwa ia memiliki alternatif yang setara),
Malabarba
2
Titik listrik tidak akan berfungsi dengan baik karena titik-titik tidak hanya digunakan untuk mengakhiri kalimat tetapi juga untuk semua jenis keperluan lainnya. Akan lebih baik untuk mengganti titik diikuti oleh dua spasi dengan titik diikuti oleh baris baru.
tmalsburg
13

Untuk (1), saya akan menggunakan margin yang diperbesar, sehingga visual-line-modemembungkus garis pada yang diinginkan fill-column. Ini akan memengaruhi garis teks dan persamaan.

Adapun (2), seseorang dapat mendefinisikan perintah pengisian kustom untuk terikat M-qdan benar mengisi paragraf. Saya belum berhasil menulis perintah dengan perilaku yang benar untuk pengisian otomatis.

Membungkus ini semua dalam mode minor bisa terlihat seperti berikut. Ini bukan kode yang sangat indah, tetapi harus berfungsi dalam banyak kasus. (Saya telah memiliki unfill-paragraphfungsi di saya init.elselama beberapa waktu tanpa memperhatikan masalah).

(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)))) 
ffevotte
sumber
Pengisian paragraf berfungsi dengan baik, saya berharap saya bisa menerima dua jawaban. Ganti saja unfill-paragraphdengan ospl/unfill-paragraph. Marginnya juga berfungsi, tetapi teks lekukan terlihat buruk dan mereka juga membungkus persamaan, sedangkan saya berhasil meretas metode garis panjang di bawah ini memperbaiki dua masalah ini.
Malabarba
Tetap, terima kasih. Seperti yang saya katakan, saya sudah unfill-paragraph(tidak diperbaiki) di saya init.eluntuk waktu yang lama. Saya baru saja mengawalnya kemarin untuk konsistensi dan memperkenalkan bug ....
ffevotte
Ya, saya pikir itu seperti itu. Saya juga menyadari bahwa kita mungkin dapat mengisi paragraf dengan melakukan sesuatu seperti (let ((fill-column 1000000)) (fill-pragraph)). Belum mengujinya.
Malabarba
Yap, solusi seperti itu berhasil. Saya hanya tidak suka memiliki konstanta sihir (tapi kode saya juga tidak terlalu indah, jadi orang bisa berpendapat mana yang lebih baik ...)
ffevotte
1
Cintai solusi ini. Apakah ada cara sederhana untuk menghindari memecah baris komentar menjadi beberapa baris?
Ramprasad
9

Apakah masalah kontrol versi Anda akan dihindari / diselesaikan jika Anda menggunakan git diff --color-words atau latexdiff? Kemudian Anda bisa melihat kata-kata yang diubah.

Sacha Chua
sumber
2
Kata-kata mewarnai memang menyenangkan! Tetapi saya masih membutuhkan pendekatan OLP untuk membantu menghindari konflik ketika menggabungkan kontribusi orang lain dan ketika mengembalikan komitmen lama.
Malabarba
2

Salah satu cara untuk meningkatkan ini yang telah saya gunakan (kadang-kadang) selama beberapa tahun adalah dengan menampilkan kalimat dengan jeda baris yang saling mengalir dengan melipat jeda baris menggunakan fasilitas tex-fold(bagian dari AUCTeX).

Ini artinya begini

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.

dilipat ke

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⁎

Saya baru-baru ini menempatkan ini bersama sebagai mode minor dalam sebuah paket. Mungkin orang lain juga akan menemukan ini berguna: https://github.com/andersjohansson/tex-fold-linebreaks

Anders Johansson
sumber