Редактирование файлов с одним предложением на строку

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) поставить также одно предложение в каждой строке.
Malabarba
источник
1
Какого рода усовершенствование / автоматизация вам нужны? Хотите знать, как эффективно редактировать в таких файлах?
Ранги Лин
@RangiLin Да. Первый пункт, который я упомянул, является самым важным для меня. Но все остальное, чтобы сделать это более эффективным, можно только приветствовать.
Малабарба
Описание в первом пункте выглядит так visual-line-mode. Но в дополнение к переносу строк вам также необходимо автоматически вставлять символ новой строки после каждого предложения, верно?
Каушал Моди
@kaushalmodi Да, но перевод строки после каждого предложения является реальным, он должен быть в файле. Проблема с режимом визуальной линии заключается в том, что по умолчанию он слишком широкий. Если есть способ уменьшить это, было бы здорово.
Малабарба
@Malabarba: Знаете ли вы, почему? На мой
взгляд

Ответы:

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
Большое спасибо за указание на ярусный режим! Мне удалось заставить его не переносить уравнения и даже не исправлять вид линий с отступами. Вот суть gist.github.com/c532f77144ddf86b4ea4.git
Малабарба
@ Малабарба: Круто. Я, наверное, сам буду использовать некоторые из этих изменений! Ваша ссылка не работает должным образом, хотя; Вот веб-версия: gist.github.com/Bruce-Connor/c532f77144ddf86b4ea4
Тихон Джелвис
Спасибо. Также, забыл упомянуть, что этот совет использует функцию из пакета latex-extra.
Малабарба
Кстати, стоит отметить, что ярусный режим помечен как устаревший в 24.4 (не то, чтобы у него была эквивалентная альтернатива),
Малабарба
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)))) 
ffevotte
источник
Заполнение абзаца работает отлично, хотелось бы принять два ответа. Просто замените unfill-paragraphна ospl/unfill-paragraph. Поля также работают, но текст с отступом выглядит плохо, и они также переносят уравнения, в то время как мне удалось взломать метод ярусов ниже, чтобы решить эти две проблемы.
Малабарба
Исправлено, спасибо. Как я уже сказал, у меня есть unfill-paragraph(без префикса) в моем init.elв течение длительного времени. Я просто добавил префикс вчера для согласованности и представил ошибку ....
ffevotte
Да, я подумал, что это было что-то подобное. Я также понял , что мы можем , вероятно , unfill пункта, просто делать что - то подобное (let ((fill-column 1000000)) (fill-pragraph)). Пока не проверял это.
Малабарба
Да, такое решение работает. Мне просто не нравится иметь магические константы (но мой код тоже не очень красив, поэтому можно поспорить, что лучше ...)
ffevotte
1
Люблю это решение. Есть ли простой способ избежать разбиения закомментированных строк на несколько строк?
Рампрасад
9

Будут ли ваши проблемы с управлением версиями избегаться / решаться, если вы используете git diff --color-words или 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

Андерс Йоханссон
источник