Vimでテキストを正当化できますか?


38

VimではなくPicoまたはNanoでテキストファイルを編集したことがある唯一の理由は、その「Justify」コマンド^Jでした。テキストの段落を再フォーマットし、ワードブレークで改行を作成して、テキストが固定幅の画面にうまく浮かぶようにします-事前に定義された80列に合わせてテキストをフォーマットし、ワード間でのみ改行します。機能が制限されていたため、長いコメントブロック、ドキュメントファイルをフォーマットするか、パラメータの無限の行をより読みやすいものに置き換えるだけでも、非常に便利でした。

Vimでそのようなことはできますか?

回答:


37

モーションコマンドと組み合わせてgqor gw演算子を使用できます。デフォルトでは、fmtプログラム(Linux)を使用して、指定されたテキストをフォーマットします。ただし、私の知る限り、行を正当化しないため、右マージンが不揃いになります。

私が使用する方法は、gwip(通常モード)カーソルを段落に置くことです。これは、カーソルを同じ位置に保ちながら現在の段落をフォーマットします。この方法を使用して、現在の段落のみがフォーマットされるようにします。テキストファイルを編集する場合、ファイルの先頭でgwG(通常モード)を発行すると、テキスト全体がフォーマットされます。良い習慣として、段落の間に少なくとも1つの空白行を残してください。

多くの設定を行うことができます。まず、ここではいくつかの関連助けます::h gq:h gw:h fo(フォーマットオプション)、 :h fp(フォーマットプログラム)、 :h fo-table(可能なオプションの説明)。


1
gq / gwは間違いなく道です。このメッセージに追加するには、フォーマットプログラムをparに変更して、オプションを増やすことができます。チェックアウトvimcasts.org/episodes/formatting-text-with-par
バンブー

3
デフォルトでは、Vimは外部プログラムを使用しませんが、'formatprg'オプションを設定して使用することもできます。
ジェームスサン

15

このトピックには素晴らしいVimCastがあります。

http://vimcasts.org/episodes/formatting-text-with-par/

基本的に、インストールする必要がありますpar

$ brew install par
# or
$ sudo apt-get install par

そして、列を80列にラップする必要があるため:

:set formatprg=par\ -w80

これでgq、他の回答(例gqip)のように演算子を使用でき、Vimの組み込みフォーマッタの代わりにParを使用します。

Parは非常に高度であり、次のようにコメントを適切にフォーマットします。

/* This is a long */
/* multiline comment */

11

から:help usr_25

JUSTIFYING TEXT                                                                 

Vim has no built-in way of justifying text.  However, there is a neat macro     
package that does the job.  To use this package, execute the following          
command:                                                                        

        :runtime macros/justify.vim                                             

This Vim script file defines a new visual command "_j".  To justify a block of  
text, highlight the text in Visual mode and then execute "_j".

だから、あなたがしなければならないのは実行することです

:ru macros/justify.vim

次に

_j

ファイル全体のテキストを揃えます。

(もちろん、ru macros/justify.vim毎回入力する必要がないように.vimrcに追加することもできます。)

:これは改行を追加しませ。これらを手動で追加する必要がありgqます。このためにtextwidthは、(デフォルトは0)を希望する値に設定する必要があります

set textwidth=80

および-必要にt応じて、-flagを設定してテキストを自動的に折り返す

set formatoptions+=t

必要に応じて、.vimrcでマッピングを設定して、すべてを実行できます。

nnoremap <C-j> gggqG_j

これはファイルの先頭(gg)に移動し、すべての行を(gqまでG)ラップしてから_j、テキストを有効化します。


書式設定の詳細については、次を参照してください
。VIM

:set fo+=a段落全体を自動的に再フォーマットするための非常に便利なオプションを見つけました。見て:help fo-table、他のオプションについて。ここに素敵なビデオチュートリアルもあります
Suuuehgi

完全に組み込みのソリューションの場合は+1。_jマクロによって追加のマッピングは私のためにファイル全体を正当化すると思われる、またはそれは行指向視覚的な選択を制限することができます。
チェス

5

nanoのヘルプは^Jコマンドを「Justify」と呼びますが、実際にはテキストを正当化しませんが、画面の右マージン(または構成可能な列)の前の行を分割するテキストを再フォーマットします。

あなたは、変数を設定することにより、VIMで同じことを行うことができますtextwidthから、:help 'textwidth'

挿入されるテキストの最大幅。この幅を得るために空白の後に長い行が分割されます。ゼロの値はこれを無効にします。

つまり、入力中に行がtextwidth文字より長い場合、VIMは行の長さを≤以下に保つために最初のスペースで行を折り返しtextwidthます。

これが機能するには、オプションformatoptionsに文字が含まれている必要がありますt。参照:help 'formatoptions'して:help fo-table、たとえば、あなたがに興味がある可能性があり、利用可能なオプションのためのcコメントで仕事をフォーマットにするオプション。

編集:あなたは入れてなくても、同じ操作を行うことができますtformatoptionsコマンドを使用して、gw{motion}それが現在のカーソル位置と後のカーソルの位置の間のテキストをフォーマットし、{motion}。このgwコマンドはビジュアルモードでも使用でき、選択したテキストをフォーマットします。


1
タイピングに適しています。既存のテキストに適用できますか?
SF。

3

以下に2つの簡単なオプションを示します。

  1. テキストのブロックを選択した状態で、入力します !fmt
  2. ブロックの先頭にカーソルを置いて、次を入力します !}fmt

これらは両方とも、テキストのブロックをunix fmtに送信man fmtします。オプションを参照してください。vimからオプション引数を渡すことができます。たとえば、50文字幅のブロックをフォーマットするには、と入力し!}fmt -w 50ます。


申し訳ありませんそれについては、今の固定
カーン

結果が気に入らない場合:%!fmtは、1つを入力して元に戻すことでファイル全体をフォーマットすることもできますu
ワイルドカード

-1

visualコマンドを使用してテキストをマークしてから、次を使用します。

:!par 40j 

40は列の幅で、j両端揃えを意味します。


2
当サイトへようこそ!現在使用しているツール(par)とソリューションが機能する理由についての説明が不足しているため、質問の質は低くなります。回答の品質を改善し、将来の読者にとってより役立つように、詳細を追加することもできます。
statox
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.