Редагування файлів одним реченням на рядок


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
Яке вдосконалення / автоматизацію ви точно шукаєте? Ви хочете знати, як ефективно редагувати такі файли?
Рангі Лін

@RangiLin Так. Перший момент, про який я згадав, є для мене найважливішим. Але все інше, щоб зробити це більш ефективним, вітається.
Малабарба

Опис у першій точці виглядає так visual-line-mode. Але крім перенесення рядка, вам також потрібно автоматично вставити символ нового рядка після кожного речення, правильно?
Каушал Моді

@kaushalmodi Так, але новий рядок після кожного речення справжній, він повинен бути у файлі. Проблема в режимі візуальної лінії полягає в тому, що він за замовчуванням занадто широкий. Якщо є спосіб зменшити його, було б чудово.
Малабарба

@Malabarba: Ти знаєш чому? Для мене це найкорисніший режим обгортання на сьогоднішній день ...
Tikhon Jelvis

Відповіді:


11

Якщо ви хочете щось подібне, visual-line-modeале не налаштоване, ви можете спробувати, longlines-modeщо саме я використовую для більшої частини своєї прози. longlines-modeзагортає ваш текст аналогічно visual-line-modeширині, налаштованій fill-column.

Ось скріншот із fill-columnвстановленим значенням 70(вікно насправді розширюється ще більше праворуч).

Приклад обгортання тексту в режимі паралельних рядків.

Налаштування fill-paragraphбуло б акуратним, але я не впевнений, як це зробити. Натомість, ось розумний тимчасовий злом: зробіть свого .персонажа електричним в режимі TeX, вставляючи новий рядок. Це просто пов'язане з повторним перев’язуванням його в будь-якому відповідному режимі гачка:

(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
Велике спасибі за вказівку режиму "longlines"! Мені вдалося домогтися того, щоб не перетворити рівняння і навіть виправити вигляд відступних ліній. Ось gist gist.github.com/c532f77144ddf86b4ea4.git
Малабарба

@Malabarba: Класно. Я, мабуть, сам буду використовувати деякі з цих змін! Хоча ваше посилання не працює належним чином; ось веб-версія: gist.github.com/Bruce-Connor/c532f77144ddf86b4ea4
Tikhon Jelvis

Спасибі. Крім того, забув згадати, що порада використовує функцію з пакету латекс-додатковий.
Малабарба

До речі, варто відзначити, що режим
longlines

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. Поля також працює, але відрізний текст виглядає погано, і вони також містять рівняння, тоді як мені вдалося зламати метод довгих рядків, щоб виправити ці дві проблеми.
Малабарба

Виправлено, спасибі. Як я вже говорив, я мав давно unfill-paragraph(нефіксований) у своєму init.el. Я лише вчора встановив це за послідовність і ввів помилку ....
ffevotte

Так, я зрозумів, що це щось подібне. Я також зрозумів, що, ймовірно, ми можемо не виконати абзац, зробивши щось подібне (let ((fill-column 1000000)) (fill-pragraph)). Ще не перевірили.
Малабарба

Так, таке рішення працює. Мені просто не подобається мати магічні константи (але і мій код не дуже гарний, тому можна заперечити, що краще ...)
ffevotte

1
Любіть це рішення. Чи є простий спосіб уникнути розбиття коментованих рядків на кілька рядків?
Рампрасад

9

Чи вдасться уникнути / вирішити ваші проблеми з контролем версій, якщо ви використовуєте git diff --color-слова або latexdiff? Потім ви можете переглянути змінені слова.


2
Розмальовки слів справді корисні! Але мені все ж потрібен підхід olps, щоб уникнути конфліктів під час злиття внеску інших людей та повернення старих комісій.
Малабарба

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.