行ごとに1センテンスでファイルを編集する


28

背景のビット。

ラテックスドキュメントをバージョン管理しようとしていますが、行ごとに1センテンスのアプローチを採用すると、このイニシアチブの有効性が大幅に向上します。

たとえば、以下は私のドキュメントの外観です。

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

This is another paragraph.

私の質問は簡単です。
Emacsでどれだけ自動化/改善できますか?

次の2つの点は、私が念頭に置いていることです。

  1. 私の文章は長いので、実際に記入せずに行を折り返す必要があります。つまり、非常に長い文を画面上の複数の行に表示する必要がありますが、tex」ファイルでは1行にする必要があります。これは、方程式をラップしない方法で行うことが望ましいでしょう。

    visual-line-modeウィンドウ幅で折り返します。幅が広すぎます。行を折り返し、幅を80文字程度に制限するものが必要です。同じようにfill-paragraph、通常は行うだろうが、実際にファイルの行を壊すことなく。

  2. 各文の後に手動で行を分割することもできますが、行ごとに1つの文を配置するように構成できるfill-paragraph(または場合によっては)ことができれば非常に望ましいでしょうauto-fill-mode

1
どんな改善/自動化を望んでいますか?このようなファイルを効果的に編集する方法を知りたいですか?
ランギリン14

@RangiLinはい。最初に述べた点は、私にとって最も重要なことです。しかし、これをより効果的にするためのその他のものは大歓迎です。
マラバルバ14

最初のポイントの説明は次のようになりvisual-line-modeます。しかし、その行の折り返しに加えて、各文の後にも改行文字を自動挿入する必要がありますよね?
カウシャルモディ14

@kaushalmodiはい。ただし、各文の後の改行は本物です。ファイル内にある必要があります。ビジュアルラインモードの問題は、デフォルトでは幅が広すぎることです。それを減らす方法があれば、それは素晴らしいことです。
マラバルバ14

@Malabarba:理由を知っていますか?私にとって、それは...はるかに最も便利なラッピングモードだ
Tikhon Jelvis

回答:


11

visual-line-mode設定可能なものだけが欲しい場合longlines-modeは、私が散文のほとんどで使用しているものを試すことができます。longlines-modevisual-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
Tikhon Jelvis

ありがとう。また、言及するのを忘れていましたが、そのアドバイスはlatex-extraパッケージの関数を使用しています。
マラバルバ14

ちなみに、24.4では延縄モードが廃止されたとマークされていることに注意する価値があります(同等の代替手段があるわけではありません)
Malabarba 14

2
ドットは文を終わらせるためだけでなく、他のあらゆる目的にも使用されるため、電子ドットはうまく機能しません。ドットとそれに続く2つのスペースを、ドットとそれに続く改行で置き換えることをお勧めします。
マルス

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)))) 

段落の記入は非常にうまくいきます。2つの答えを受け入れたいと思います。に置き換えunfill-paragraphてくださいospl/unfill-paragraph。マージンも機能しますが、インデントされたテキストは見栄えが悪く、方程式もラップしますが、以下のはえ縄法をハックしてこれら2つの問題を修正しました。
マラバルバ14

修正済み、ありがとう。私が言ったように、私は長い間unfill-paragraph(接頭辞なしで)init.elいた。私はちょうど....一貫性のため、昨日それを接頭辞とバグを導入
ffevotte

うん、そういうものだと思った。また、のようなことをするだけでおそらくパラグラフを埋めることができることに気づきました(let ((fill-column 1000000)) (fill-pragraph))。ただし、まだテストしていません。
マラバルバ14

はい、そのような解決策は機能します。私は魔法の定数を持つのが好きではありません(しかし、私のコードもあまり美しくないので、どちらが良いかを議論することができます...)
ffevotte 14

1
このソリューションが大好きです。コメント行を複数行に分割しないようにする簡単な方法はありますか?
ランプラサド

9

git diff --color-wordsまたはlatexdiffを使用すると、バージョン管理の問題を回避/解決できますか?次に、変更された単語を見ることができます。


2
言葉を着色することは確かにたくさんあります!しかし、他の人の貢献をマージしたり、古いコミットを元に戻したりするとき、衝突を避けるためにolpsアプローチが必要です。
マラバルバ14

2

(時々)私が数年間使用してきたこれを改善する1つの方法は、(AUCTeXの一部)の機能を使用して改行を折り畳むことにより、改行tex-foldが次々に流れる文を表示することです。

つまり、これは

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.