Як я можу розділити абзац на один рядок за реченням, але все ще зберігати його візуально?


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
Я співчуваю цьому запиту, але вважаю, що описаний ОП мінорний режим не є правильним рішенням. Основна проблема полягає в тому, що diff не працює добре для тексту, як це було розроблено для коду. Подолати цю проблему в Emacs - це можливе, але не чисте рішення з різних причин. Було б набагато краще вдосконалити різну роботу з текстом.
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); у нашому випадку він є нульовим, що означає додавати правило лише для поточного буфера.
  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властивість з " "(рядок, що складається з єдиного пробілу) як значення для нових рядків, які ви хочете відображати по-іншому.

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