段落を再ラップするvim“ gq}”コマンド、およびLaTeX


5

このコマンドをラップしないようにするにはどうすればよい\itemですか?

例えば:

\begin{enumerate}
\item this might be a long paragraph that spans multiple lines 
\item blah
\end{enumerate}

最初のアイテム(の最初の文字this)にカーソルを置いて "gq}"を実行すると、次の出力が生成されます。

\begin{enumerate}
\item this might be a long 
paragraph that spans multiple 
lines \item blah \end{enumerate}

これは私が欲しいものです:

\begin{enumerate}
\item this might be a long 
paragraph that spans multiple 
lines 
\item blah
\end{enumerate}

トークン\itemが段落の終わりを意味することを何らかの方法でvimに認識させることができれば、それは正しく機能すると考えています。しかし、どうやってそれを行うのでしょうか?

回答:


6

段落区切りタグを含めるように設定された「formatlistpat」オプションを使用してこれを行うことができると思います。これを機能させるには、「formatoptions」に「n」を含める必要があります。見る

:help 'formatlistpat'
:help 'formatoptions'

たとえば、

:set formatlistpat=^\\s*\\\\\\(end\\\\|item\\)\\>
:set formatoptions+=n
:set textwidth=40

サンプルをフォーマットすると、これが生成されます。

\ begin {enumerate}
\ itemこれは長い段落かもしれません
     複数行にまたがる 
\ item何とか
\ end {enumerate}

最初の項目の2行目は\itemタグの長さによってインデントされているため、正確には望みどおりではありませんが、十分に近い場合があります。\zeヘルプに記載されているように実験して、Vimに後続の行をインデントせずにタグを認識させることができるかどうかを確認することもできます。私はそれを試しませんでした。

更新

'formatlistpat'は、の:let代わりにを使用して設定すると、少しわかりやすく、編集しやすくなります:set

:let&l:flp = '^ \ s * \\\(end \ | item \)\>'

このl:部分は、バッファローカル設定であることを指定します。

更新

インデントを1文字に減らすには、次の操作を行います。

:let&l:flp = '^ \ s * \\\ ze \(end \ | item \)\>'

の前に空白がある場合\item、インデントはその数値+ 1になり\zeます。


クール!特定のファイル拡張子に対してのみカスタムformatlistpatを使用する方法はありますか?私\itemは、.tex拡張子で終わるファイル内の段落区切りタグとしてのみ認識する方がきれいだと思う。また、なぜそんなに多くの\文字があるのですか?
orryowr

1
:help 'formatlistpat'オプションはバッファに対してローカルであるため、その設定を〜/ .vim / after / ftplugin / tex.vimに入れてsetlocal代わりに使用するとset、.texファイルのみに影響する可能性があります。\文字は、setコマンドのrhsで特殊文字をエスケープする方法です。私はその設定で、それ以上やった場合、私が使用してそれを設定しますlet &flp = "stuff"のではなくset flp=stuff。aのrhsでの引用とエスケープletははるかに簡単です。をご覧ください:help :let-&。分岐セパレーターは\|です。それは何らかの理由で逃げなければならない\\|setセットが必要です
garyjohn

それらのそれぞれがエスケープされるので、あなたはで終わる\\\\|。理由の良い説明がありません。
ゲイリージョン

行ったフォーマットを再現できません。vimとコマンドを使用しましたgq}か?これまで私はとをやっていますが:set tw=40:set formatlistpat=^\\s*\\\\\\(end\\\\|item\\)\\>それでも以前と同じように機能しています。(また、\\>最後に何をしますか?)
orryowr

1
OK、新しいバッファーを開いて、テキストをコピーし、上の回答から「formatlist」設定をコピーし:set fo+=n tw=40、カーソルをの前に移動して\begin、を入力しましたgq}。以前と同じように機能しました。Linuxでgvim 7.3.487を使用していました。
ゲイリージョン

0

ここに私のために働く解決策があります。ラテックステキストのフォーマットを処理する外部スクリプトを作成しました(https://github.com/elmanuelito/par-latex

vimでの使用例:

  • いくつかのテキスト(VjまたはggVG)を選択します
  • タイプ":!PAR-ラテックス"(Vimのコマンドラインは次のようになります。'<,'>!par-latex
  • 入力してください

デフォルトのオプションでは、アイテム化環境内でテキストを選択すると、サンプルが処理されます。さらにテキストを選択したときに機能するようにするにformat_inside_groupは、スクリプトの先頭でオプションをアクティブにする必要があります。

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