Jak mogę podzielić akapit na jeden wiersz na zdanie, ale nadal zawijać go wizualnie?

14

Jest to podobne do edytowania plików z jednym zdaniem na wiersz (zarówno pod względem funkcji, jak i motywu), ale chcę mieć pełny, płynny akapit zamiast wizualnych przerw w każdym zdaniu.

Chciałbym mieć mniejszy tryb, który, gdy jest aktywny, wizualnie łączy linie z tego samego akapitu (nie oddzielone przez \n\nlub paragraph-separatelub ...), a następnie aktywuje zachowanie (być może wyprowadzone z visual-line-mode), które zawinie linię bez faktycznego wstawiania \n.

Czy taki tryb istnieje? Jeśli nie, jak powinienem przejść przez proces zmiany właściwości wyświetlania akapitu, aby osiągnąć wynik? (W końcu jest to sedno takiego trybu i można go rozwinąć z fragmentu).

Sean Allred
źródło
[...] wizualnie dołączy [...]. Czy masz na myśli zachowanie bazy \n(jeśli jest obecna), czy też chcesz, aby faktycznie usunęła nowe wiersze, aby zapewnić 1 akapit na wiersz?
Jonathan Leech-Pepin,
1
Być może możesz użyć tego, buffer-display-tableaby nowe wiersze \nwyglądały jak spacje lub coś - zobacz następujący przykład w łączu: stackoverflow.com/a/24842771/2112489 Zaletą tego jest to, że tekst w dokument nie jest modyfikowany. Nowa linia może obejmować prawie wszystko - np. Uśmiechniętą twarz, spacje, symbol pilcrowa itp. Efektem wizualnym jest to, że nastąpi zawijanie.
prawnik
@ JonathanLeech-Pepin Chcę zachować nowe linie tam, gdzie są obecne. W rzeczywistości chciałbym wymusić wprowadzenie nowego wiersza na końcu zdania, ale można to zrobić za pomocą osobnego haka.
Sean Allred,
1
@lawlist efekt wizualny polega na tym, że nowe linie znikną wszędzie, prawda? Czy wszystkie akapity nie zostaną połączone w jeden?
Malabarba,
1
Popieram tę prośbę, ale uważam, że tryb pomniejszy opisany przez OP nie jest właściwym rozwiązaniem. Podstawowym problemem jest to, że diff nie działa dobrze dla tekstu, ponieważ został zaprojektowany dla kodu. Obejście tego problemu w Emacsie jest możliwym, ale nie czystym rozwiązaniem z różnych powodów. O wiele lepiej byłoby poprawić diff, aby działał dobrze z tekstem.
tmalsburg

Odpowiedzi:

3

Jak powiedział Tom, umieszczenie właściwości wyświetlania w nowej linii będzie rodzajem pracy.

Problem polega na ustaleniu, które linie należy zawijać.

Oto przykład na początek:

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

(visual-line-mode 1)

Spowoduje to „usunięcie” nowych linii, jeśli jest poprzedzone znakami graficznymi, a następny wiersz nie jest wcięty ani pusty. Będziesz musiał eksperymentować, aby znaleźć coś, co działa dla Ciebie.

Kilka dodatkowych wyjaśnień:

  1. font-lock-add-keywordsdodaje listę reguł do blokowania czcionek (więc blokada czcionek musi być włączona. Pierwszym argumentem może być tryb (np. text-mode); w naszym przypadku jest to zero, co oznacza dodanie reguły tylko dla bieżącego bufora.
  2. Nasza „reguła” jest (,eol-regexp 1 '(face default display " ")). Pierwszym elementem jest wyrażenie regularne, które zbudowaliśmy wcześniej; drugi to podwyrażenie, którym jesteśmy zainteresowani; trzeci to „twarz”, którą chcemy zastosować.
  3. Chociaż używanie twarzy dla nowych linii nie jest dla nas przydatne, możemy również dodawać właściwości tekstu. Używamy więc domyślnej ściany i dodajemy właściwość display, która zastępuje podłańcuch 1 (tj. Nową linię) spacją.
  4. Jeśli zastrzelisz się w stopę, usuń bufor lub usuń słowo kluczowe za pomocą font-lock-remove-keywords.
  5. Możesz także dodać displaydo font-lock-extra-managed-props(nie próbowałem tego).
  6. Trudną częścią jest poprawne wyrażenie regularne. „\ (\ n \) [^ \ n]” pasuje do każdego nowego wiersza, po którym nie następuje bezpośrednio kolejny. „. \ {30, \} \ (\ n \)” pasuje tylko do nowych linii poprzedzonych co najmniej 30 znakami.
olaf b
źródło
Implementację powyższego można znaleźć w pakiecie na github.com/andersjohansson/tex-fold-linebreaks
zakkak
0

Jeśli dobrze rozumiem problem, oznacza to, że chciałbyś zachować wszystkie znaki nowej linii w buforze w takiej postaci, w jakiej są; ale chcesz wyświetlić niektóre z nich jako spacje. Następnie chcesz zawijać słowa.

Do zawijania słów myślę, że możesz użyć visual-line-mode.

Do radzenia sobie z nowymi liniami, myślę, że możesz umieścić displaywłaściwość " "(ciąg składający się z pojedynczej spacji) jako wartość w nowej linii, którą chcesz wyświetlać inaczej.

Tom Tromey
źródło