Edycja plików z jednym zdaniem na wiersz

28

Trochę tła.

Staram się kontrolować wersję moich dokumentów lateksowych, a skuteczność tej inicjatywy zostałaby znacznie poprawiona, jeśli zastosuję podejście jedno zdanie na linię .

Na przykład poniżej będą wyglądać moje dokumenty.

Some text here.
New stencence on the same paragraph.
Some more text, still on the same paragraph.

This is another paragraph.

Moje pytanie jest proste.
Ile z tego mogę zautomatyzować / ulepszyć za pomocą Emacsa?

Mam na myśli następujące dwa punkty.

  1. Moje zdania są długie , więc muszę zawijać wiersze bez ich wypełniania. To znaczy, bardzo długie zdanie musi być wyświetlone w kilku liniach na moim ekranie, ale musi to być pojedyncza linia w pliku „.tex” . Najlepiej byłoby to zrobić w sposób, który nie zawija równań.

    visual-line-modeowija się przy szerokości okna, która jest zbyt szeroka. Potrzebuję czegoś, co zawija linie i ogranicza ich szerokość do około 80 znaków. Tak jak fill-paragraphzwykle, ale bez przerywania linii w pliku.

  2. Mogę ręcznie przełamać linię po każdym zdaniu, ale byłoby bardzo dobrze, gdybym mógł skonfigurować fill-paragraph(a może nawet auto-fill-mode), aby wstawić również jedno zdanie w linii.
Malabarba
źródło
1
Jakiego rodzaju ulepszeń / automatyzacji szukasz? Czy chcesz wiedzieć, jak skutecznie edytować w takich plikach?
Rangi Lin,
@RangiLin Tak. Pierwszy punkt, o którym wspomniałem, jest dla mnie najważniejszy. Ale cokolwiek innego, aby uczynić to bardziej efektywnym, jest mile widziane.
Malabarba
Wygląda opis w pierwszym punkcie visual-line-mode. Ale oprócz tego zawijania linii musisz także automatycznie wstawiać znak nowego wiersza po każdym zdaniu, prawda?
Kaushal Modi
@kaushalmodi Tak, ale nowy wiersz po każdym zdaniu jest prawdziwy, powinien znajdować się w pliku. Problem z trybem linii wizualnej polega na tym, że domyślnie jest on po prostu zbyt szeroki. Jeśli istnieje sposób, aby to zmniejszyć, byłoby świetnie.
Malabarba
@Malabarba: Czy wiesz dlaczego? Dla mnie jest to jak dotąd najbardziej przydatny tryb owijania ...
Tikhon Jelvis

Odpowiedzi:

11

Jeśli chcesz czegoś podobnego, visual-line-modeale konfigurowalnego, możesz spróbować, z longlines-modeczego korzystam przez większość mojej prozy. longlines-modeotacza tekst podobnie do visual-line-modeszerokości skonfigurowanej przez fill-column.

Oto zrzut ekranu z fill-columnustawionym na 70(okno faktycznie rozciąga się jeszcze bardziej w prawo).

Przykład zawijania tekstu w trybie takli.

Konfiguracja fill-paragraphbyłaby fajna, ale nie jestem pewien, jak to zrobić. Zamiast tego jest rozsądny tymczasowy hack: zmień .postać w tryb TeX, wstawiając nową linię. Polega to na ponownym związaniu go w dowolnym odpowiednim trybie haka:

(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)
Tikhon Jelvis
źródło
1
Wielkie dzięki za wskazanie trybu takli! Udało mi się sprawić, że nie zawija równań, a nawet naprawia wygląd linii wcięć. Oto sedno gist.github.com/c532f77144ddf86b4ea4.git
Malabarba
@Malabarba: Cool. Prawdopodobnie sam wykorzystam niektóre z tych zmian! Twój link nie działa jednak poprawnie; oto wersja dostępna w Internecie
Tikhon Jelvis
Dzięki. Zapomniałem też wspomnieć, że ta rada wykorzystuje funkcję z pakietu lateksu.
Malabarba
Nawiasem mówiąc, warto zauważyć, że tryb takli jest oznaczony jako przestarzały w 24.4 (nie że ma równoważną alternatywę),
Malabarba
2
Kropka elektryczna nie będzie działać dobrze, ponieważ kropki służą nie tylko do kończenia zdań, ale także do wszelkiego rodzaju innych celów. Lepiej byłoby zamienić kropkę, a następnie dwie spacje kropką, a następnie nową linię.
tmalsburg
13

Dla (1) użyłbym powiększonego marginesu, aby visual-line-modeowijał linie w pożądany sposób fill-column. Wpłynie to jednak na linie tekstu i równania.

Jeśli chodzi o (2), można zdefiniować niestandardowe polecenie wypełniania, które będzie wiązane M-qi poprawnie wypełniać akapity. Nie udało mi się jeszcze napisać polecenia z prawidłowym zachowaniem do automatycznego wypełniania.

Opakowanie tego wszystkiego w mniejszym trybie może wyglądać następująco. Nie jest to bardzo piękny kod, ale powinien działać w większości przypadków. (Miałem tę unfill-paragraphfunkcję init.elod dłuższego czasu, nie zauważając problemów).

(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
źródło
Wypełnianie akapitu działa świetnie, chciałbym zaakceptować dwie odpowiedzi. Wystarczy wymienić unfill-paragraphz ospl/unfill-paragraph. Marginesy również działają, ale tekst wcięty wygląda źle i zawijają równania, podczas gdy udało mi się zhakować poniższą metodę taktów, aby rozwiązać te dwa problemy.
Malabarba
Naprawiono, dziękuję. Jak powiedziałem, mam unfill-paragraph(bez prefiksu) w sobie init.elod dłuższego czasu. Właśnie wczoraj
dodałem
Tak, pomyślałem, że to coś takiego. Uświadomiłem sobie również, że prawdopodobnie możemy wypełnić akapit, po prostu robiąc coś takiego (let ((fill-column 1000000)) (fill-pragraph)). Jednak jeszcze tego nie przetestowałem.
Malabarba
Tak, takie rozwiązanie działa. Po prostu nie lubię magicznych stałych (ale mój kod też nie jest zbyt piękny, więc można się spierać, co jest lepsze ...)
ffevotte
1
Uwielbiam to rozwiązanie. Czy istnieje prosty sposób na uniknięcie dzielenia komentowanych linii na wiele linii?
Ramprasad
9

Czy można uniknąć problemów z kontrolą wersji / rozwiązać je, jeśli użyjesz git diff --color-words lub latexdiff? Następnie możesz spojrzeć na zmienione słowa.

Sacha Chua
źródło
2
Kolorowanie słów jest naprawdę pomocne! Ale wciąż potrzebuję podejścia olps, aby uniknąć konfliktów podczas łączenia wkładów innych ludzi i cofania starych zobowiązań.
Malabarba
2

Jednym ze sposobów ulepszenia tego, z którego korzystałem (czasami) od kilku lat, jest wyświetlanie zdań z podziałami linii jako przepływających jeden za drugim poprzez składanie podziałów linii za pomocą udogodnień tex-fold(część AUCTeX).

Oznacza to, że to

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.

jest złożony do

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⁎

Niedawno umieściłem to jako niewielki tryb w pakiecie. Być może ktoś inny również uzna to za przydatne: https://github.com/andersjohansson/tex-fold-linebreaks

Anders Johansson
źródło