1

コードでブロック コメントを再フォーマットするなどの作業を行っているときに、単語を 1 行上に移動する必要があることに気付くことがあります。以下の例では、「願わくば」という単語を最初の行に移動したいとします。通常、私はShift+J行全体を結合し、カーソルを「願わくば」という単語の後に移動してから、 を押しEnterて行の残りを下に移動します。

/* Line 1 of some large comment block,
   hopefully it contains well written documentation. I'd
   now like 'hopefully' to be on the first line.
 */

大したことではないように思えますが、多くの行でこの種の変更が必要になると、現在実行している一連のコマンドが退屈になります。次の行の最初の N 単語に対してのみ実行できる Join コマンドのバリエーションはありますか? 次の行の最初の 2 つの単語を結合する "2wJ" のようなものは素晴らしいでしょう。

4

3 に答える 3

4

悪い知らせ

あなたが提案したようなものが存在するかどうかはわかりませんが、確かに存在する可能性があります.Vimは毎日私を驚かせます. SOの誰かが知っていると確信しています。

良いニュース

あなたが望むものを達成するためのより良い方法があります!または、あなたが欲しいと思うもの。テキストの特定の領域に対して書式設定操作を実行するよう Vim に指示できます。あなたがしなければならないのはtextwidth、あなたが望む最大幅に設定してから、移動するgq{motion}テキストをフォーマットするために使用することだけです. {motion}あなたの例:

/* Line 1 of some large comment block,
   hopefully it contains well written documentation. I'd
   now like 'hopefully' to be on the first line.
 */

妥当な値を設定するだけですtextwidth(ここでは約 50 のように見えます)。その後、コメントをフォーマットします。最初の にカーソルを置き/

:set textwidth=50
gq%

キャッチ

しかし、待ってください、それはうまくいかなかったとあなたは言います!

おっと。あなたが正しい。ここで起こっているように見えるのは、Vim がこの形式を理解していないということです。私自身の指示に従ったとき、あなたのマイレージは異なるかもしれませんが、これを見ました:

/* Line 1 of some large comment block,
   hopefully it contains well written 
documentation. I'd now like 'hopefully' to be on 
the first line.
 */

それは正しくないように見えますが、そうではありません。ただし、Vim が認識できる形式にブロック コメントを再フォーマットすると (ブロック コメントはこのように記述します)、次のようになります。

/* 
 * Line 1 of some large comment block,
 * hopefully it contains well written documentation. I'd
 * now like 'hopefully' to be on the first line.
 */

そして、私はgq%textwidthまだ50で)私は得る:

/* 
 * Line 1 of some large comment block, hopefully 
 * it contains well written documentation. I'd now 
 * like 'hopefully' to be on the first line.
 */

それはうまくいったようです。「今」という単語も 3 行目から 2 行目に移動されましたが、それは Vim 側の適切な決定であったと私は主張します。もう 1 つ注意: 先頭の s が気に入らない場合*、Vim は次の形式でもうまく機能します。

/* 
   Line 1 of some large comment block,
   hopefully it contains well written documentation. I'd
   now like 'hopefully' to be on the first line.
 */

これを行うとgq%、次のようになります。

/* 
   Line 1 of some large comment block, hopefully 
it contains well written documentation. I'd now 
like 'hopefully' to be on the first line.
 */

少しおかしいですが、理にかなっています。私には段落のように見えます。うまくいけば、ここで何かが役に立ちます。

編集:

progo は別の回答で簡単に述べたように、上記で使用したすべてのgqap場所で使用できますgq%。ありがとう!

于 2013-07-22T15:43:12.277 に答える
0

vimに組み込まれているようなものはありません。

について2wJ考えてみると、vim は 2 語前に移動したいと考え、次に Join します。

古い方法で行うかJ2elr<cr>、マッピングを作成し、結合したい単語の数をパラメーターとして受け取り、簡単にすることができます。

nnoremap <expr> <leader>jw 'J' . nr2char(getchar()) . 'elr<CR>'

したがって、このマッピングでは、 を押す<leader>jwと、vim はさらに入力キーを待ちます。これは、「結合」したい単語の数です。ただし、これは完全な解決策ではありません。

  • 9 つ以上の単語を結合したい場合は機能しません。マッピングは単一の文字を想定しています。

  • たとえば、 を押すdと、2 つの単語が削除されます。

  • より良いソリューションを作成したい場合は、関数を作成し、それを呼び出すためのマッピングを作成できます。やる価値があるなら。

私は手動で結合してカットすることを好みます。

于 2013-07-22T15:43:23.080 に答える