Как я могу разбить абзац на одну строчку за предложение, но при этом сохранить его визуально?

14

Это похоже на редактирование файлов по одному предложению на строку (как по функциям, так и по мотивам), но я хотел бы иметь полный плавный абзац, а не визуальные разрывы в каждом предложении.

Я хотел бы иметь второстепенный режим, который, когда активен, будет визуально соединять строки из того же абзаца (не разделенные \n\nили paragraph-separateили или ...), а затем активировать поведение (возможно, полученное из visual-line-mode), которое будет переносить строку без фактической вставки \n.

Существует ли такой режим? Если нет, то как бы я изменил свойства отображения абзаца для достижения результата? (В конце концов, это суть такого режима, и его можно разработать из фрагмента.)

Шон Оллред
источник
[...] визуально присоединится к [...]. Вы имеете в виду сохранить базовый \n(если он есть) или вы хотите, чтобы он фактически удалял символы новой строки, чтобы обеспечить 1-абзац на строку?
Джонатан Лич-Пепин
1
Возможно, вы могли бы использовать, buffer-display-tableчтобы новые строки \nвыглядели как что-то вроде пробелов или чего-то еще - см. Следующий пример в ссылке: stackoverflow.com/a/24842771/2112489 Преимущество этого заключается в том, что текст в документ не изменен Новая строка может быть чем угодно - например, смайликом, пробелами, символом пикапа и т. Д. Визуальный эффект заключается в том, что произойдет перенос.
юрист
@ JonathanLeech-Pepin Я хочу сохранить новые строки там, где они есть. На самом деле, я хотел бы использовать перенос строки в конце предложения, но это можно сделать с помощью отдельного хука.
Шон Оллред
1
@lawlist, визуальный эффект в том, что новые строки будут отсутствовать везде, не так ли? Разве все параграфы не будут объединены в один?
Малабарба
1
Я сочувствую этому запросу, но думаю, что описанный OP дополнительный режим не является правильным решением. Основная проблема заключается в том, что diff не работает хорошо для текста, так как он был разработан для кода. Обойти эту проблему в Emacs - возможное, но не чистое решение по разным причинам. Было бы намного лучше улучшить diff, чтобы хорошо работать с текстом.
tmalsburg

Ответы:

3

Как сказал Том, размещение свойства отображения на новых строках будет своего рода работой.

Проблема состоит в том, чтобы выяснить, какие строки обернуть.

Вот пример для начала:

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

(visual-line-mode 1)

Это «удалит» новые строки, если им предшествуют графические символы, а следующая строка не имеет отступа или не пуста. Вам придется экспериментировать, чтобы найти то, что работает для вас.

Еще несколько объяснений:

  1. font-lock-add-keywordsдобавляет список правил к блокировке шрифта (поэтому блокировка шрифта должна быть включена. Первым аргументом может быть режим (например text-mode); в нашем случае это nil, что означает добавление правила только для текущего буфера.
  2. Наше «правило» таково (,eol-regexp 1 '(face default display " ")). Первый элемент - это регулярное выражение, которое мы создали ранее; второе - это подвыражение, которое нас интересует; третье - это лицо, которое мы хотим применить.
  3. Хотя использование грани для новых строк бесполезно для нас, мы также можем добавить свойства текста. Поэтому мы используем грань по умолчанию, а затем добавляем свойство отображения, которое заменяет подстроку 1 (т. Е. Новую строку) пробелом.
  4. Если вы выстрелите себе в ногу, удалите буфер или удалите ключевое слово с помощью font-lock-remove-keywords.
  5. Вы также можете добавить displayк font-lock-extra-managed-props(я не пробовал).
  6. Самое сложное - получить правильное выражение. «\ (\ n \) [^ \ n]» будет соответствовать любой новой строке, за которой сразу не следует другая. ". \ {30, \} \ (\ n \)" будет соответствовать только символам новой строки, за которыми следует не менее 30 символов.
олаф б
источник
Можно найти реализацию выше как пакет на github.com/andersjohansson/tex-fold-linebreaks
zakkak
0

Если я правильно понимаю проблему, то вы хотите сохранить все новые строки в буфере как они есть; но вы хотели бы отобразить некоторые из них как пробелы. Тогда вы хотели бы перенос слов.

Для переноса слов я думаю, что вы можете использовать visual-line-mode.

Для работы с новыми строками, я думаю, вы, возможно, могли бы поместить displayсвойство с " "(строка, состоящая из одного пробела) в качестве значения на новых строках, которые вы хотите отображать по-другому.

Том Тромей
источник