Vim:1行ずつ貼り付け

Vim:1行ずつ貼り付け

以下を含むファイルがあるとしましょう。

xxx
yyy
zzz

そして他のファイル:

kkk
qqq
ppp

私は欲しい:

xxxkkk
yyyqqq
zzzppp

Vimでこれを達成するためのコマンドはありますか? (私はVISUAL BLOCKを試してみましたが、成功しませんでした。)

私の特別なケースでは、2つの大きなファイルを貼り付ける行が多いので、答えはいくつかのシェルコマンドかもしれませんが、同じファイルでこれを行う方法があるかどうか疑問に思います。

答え1

コマンドラインで試してみてください。

paste -d '\0' file1 file2 > file3

これがまさにあなたが望むものです。

Visual Blockモードvimもこの操作に非常に適しています。ちゃんとしたことは確実ですか?あなたはする必要があります

  • ビジュアルブロッキングモードに切り替える
  • テキストを選択して押してyドラッグします。
  • データを貼り付ける左上隅(最後のファイル)の別のファイルに移動し、xキーを押しますp

答え2

編集するときに自分でやってくださいfile1。 vimに:切り替えたいものを入力してください。command mode次に、次のように入力します。

%!paste -d '' - file2

答え3

Vimだけを使用して同じファイルでこれを行う方法は次のとおりです。

これにはいくつかのキーマッピングが含まれます。簡単なテキストで複数のリストを表のような構造にまとめたいと思ったとき、このような気がしました。

これは次のように異なります。}段落境界をスキップするには、キー(右中括弧)を押します。 (中括弧はミラーリングされています。btw:{ファイルの一番上に移動して}最後まで。 )

だから...このようなデータファイルがあるとします。 (ライン#が次のように開いているとします。:設定ニュー):

+---------------  
| 1 xxx    (cursor on line#1)  
| 2 yyy  
| 3 zzz  
| 4   
| 5 kkk  
| 6 qqq  
| 7 ppp  
+---------------  

重要なのは、4行目が空行(空白なし)ですが、その理由は後で説明します。

次のコマンドを実行します。地図注文する:
:map q mw}jdd'wpkJj

これは「q」キーを12文字のプログラムにバインドします。これについては以下で詳しく説明します。

「q」をクリックするとプログラムが実行されます。 1行目から始まるカーソルが次の行にあり、「q」をもう一度クリックする準備ができていることを確認してください。 「xxx kkk」の間に空白文字があることに気づいたでしょう。これを望まない場合は、以下の「追加の空白文字はどうですか?」を参照してください。

+---------------
| 1 xxx kkk
| 2 yyy   (cursor on line #2)
| 3 zzz
| 4 
| 5 qqq
| 6 qqq
| ~
+---------------

マッピングの分析は次のとおりです。

   :map q mw}jdd'wpkJj
   ^

コロンは "map"コマンドを実行できるようにコマンドモードに切り替えます。

   :map q mw}jdd'wpkJj
    ^^^^^

マップQqを次の文字シーケンスにバインドします。 「q」は、私がよく使う「マッピング先」キーです。他のキーを使用することもできます。デフォルトの小文字 q はマクロ記録を開始するためにマップされます。私はほとんど(全く?)使用しないので、ワンタイムユーティリティマクロに「q」がより役に立つと思います。大文字のQ(マップQなど)やfnctキーなどを使用することもできます。

ナビゲーションモードで「q」を押すたびに、vimは次の一連のキーストロークを実行します。

   mw}jdd'wpkJj

もちろん、これは完全な横説説のように見えるので、何が起こっているのかをより簡単に理解できるように行動別に(下記^^を使って)分解します。

mw}jdd'wpkJj
^^

これメガワット名前の付いた場所を表示します。この場合、名前は「w」です。デフォルトは「w」(私は「作業場所」だと思います)です。
カーソルをこの行に戻したい場合は、azまでの名前付き位置はすべて可能です。

mw}jdd'wpkJj
  ^

ここに正しいカールがあります。}カーソルを次の段落境界に移動します。つまり、カーソルを次の空行(この例では4行目)に移動します。 (これがライン4が空のラインでなければならない理由です。空白がなければなりません。}境界とは見なされません。 )

mw}jdd'wpkJj
   ^

これジェイ1行下に移動します。これは古いvi "hjkl"ナビゲーションです。ここでは下向き矢印を使用することもできます。 「j」は読みやすく使いやすいです(さまざまなブランドのノートパソコンとデスクトップキーボードの間で矢印キーが常に同じ位置にあるわけではありませんが、「hjkl」」はQWERTYキーボードのホーム行の右側に常にあるように保証されています(タイプスピードに役立ちます)、
この時点でカーソルはとにかく行5にあります。

+---------------  
| 1 xxx
| 2 yyy  
| 3 zzz  
| 4   
| 5 kkk   (cursor on line#5)
| 6 qqq  
| 7 ppp  
+---------------  

mw}jdd'wpkJj
    ^^

これDD「行削除」編集コマンドなので、現在の行、つまり「kkk」を含む5行目を削除します。行を削除すると、デフォルトの貼り付けバッファにも入り、この攻撃を使用して「kkk」を行1の「xxx」の横にある場所に戻します。

mw}jdd'wpkJj
      ^^

これ'と(二重引用符w)シーケンスは、カーソルを行1に配置する「w」のブックマークに戻ります。

mw}jdd'wpkJj
        ^

小文字の「p」は、現在のデフォルトバッファ(記憶可能な「kkk」を含む)をカーソルの後ろに置きます。バッファには5行の前の内容が含まれているので、ファイルはおおよそ次のようになります。

+---------------
| 1 xxx
| 2 kkk    (cursor on line#2, after the freshly restored "kkk")
| 3 yyy
| 4 zzz
| 5 
| 6 qqq
| 7 ppp
+---------------

「kkk」がどのように2行目に変わるのかに注意してください。 (カーソルがどこにあるのか簡単にはわかりません。実際には2行目の先頭になければなりません。)
私たちは近いですが、まだそこまで届いていません...

mw}jdd'wpkJj
         ^^

小文字Kカーソルを行1に移動し(「hjkl」に戻ります)、大文字で始めます。ジェイファイルが次のように見えるように、次の行を現在の行にリンクします(カーソルはまだxとkの間の1行にあります)。

+---------------
| 1 xxx kkk    (cursor on line #1, between 'xxx' and 'kkk')
| 2 yyy
| 3 zzz
| 4 
| 5 qqq
| 6 ppp
+---------------


mw}jdd'wpkJj
           ^

ついにジェイ再び「hjkl」ナビゲーションはカーソルを2行目に移動します。これは私たちが適用したい次の行なので便利です。キュー到着
とにかく次のようになります。

+---------------
| 1 xxx kkk
| 2 yyy       (cursor on #2)
| 3 zzz
| 4 
| 5 qqq
| 6 ppp
+---------------

「q」をもう一度クリックすると、次のように表示されます(カーソルは3行目にあります)。

+---------------
| 1 xxx kkk
| 2 yyy qqq
| 3 zzz        (cursor on #3)
| 4 
| 5 ppp
+---------------

必要に応じてすすぎ、繰り返します。私はこの方法を使用すると、列を(かなり)簡単に作成できるので、長いリストに便利だと思います。

以下はより長い例です。行7に空の行を追加すると、最初に「ggg」が次の列に積み重ねられます。 「llll」に達したら、カーソルをライン1(左カール、{、うまく機能)に戻して、「mmm」と入力し続けます。配置方法が気に入らない場合は、長押しします。あなた(元に戻す)少し「ボーダー」線の位置を調整して再起動します。

これは説明しようとするよりも達成しやすいです。何千もの行を連結するためにこの方法を使用するとは考えていませんが、数十行または数百行を連結するのに役立つと思います。

+----------:---------------------------
|   before : after
+----------:---------------------------
|  1 aaa   :  1 aaa ggg mmm sss yyy
|  2 bbb   :  2 bbb hhh nnn ttt zzz
|  3 ccc   :  3 ccc iii ooo uuu
|  4 ddd   :  4 ddd jjj ppp vvv
|  5 eee   :  5 eee kkk qqq www
|  6 fff   :  6 fff lll rrr xxx
|  7       :-------------------------
|  8 ggg 
|  9 hhh 
| 10 iii 
| 11 jjj 
| 12 kkk 
| 13 lll 
| 14 mmm 
| 15 nnn 
| 16 ooo 
| 17 ppp 
| 18 qqq 
| 19 rrr 
| 20 sss 
| 21 ttt 
| 22 uuu 
| 23 vvv 
| 24 www 
| 25 xxx 
| 26 yyy 
| 27 zzz
+----------

余分な空白文字はどうですか?
接続コマンドの動作のいくつかは、接続された行間にスペースを入れることです。
そうでなければ考える「xxx kkk」の間にスペースがある場合は、
削除コマンド(x)を文字列に追加できます。

simple join (space char):  :map q mw}jdd'wpkJj
join + x (kills space):    :map q mw}jdd'wpkJxj
join w/comma:              :map q mw}jdd'wpkJR,^[j

以下を使用して「結合+ x」X両線を結んだ直後です。 Xナビゲーションモードでは、カーソルがあるすべての文字(この場合は問題となる空白文字)を削除します。

「コンマで結合」はスペースをコンマで置き換えます。これは基本的に同じですが、前の例とわずかに異なる最後の部分を見てみましょう。

:map q mw}jdd'wpkJR,^[j
                  ^

これ編集モード(特に交換モード)に入ります。書く私たちが入力するすべての文字)。

 :map q mw}jdd'wpkJR,^[j
                    ^

これその時点で問題のあるスペースを隠すコンマを文字通り入力します。

 :map q mw}jdd'wpkJR,^[j
                     ^^

それから^[編集モードを終了し、ナビゲーションモードに戻るエスケープ文字をシグナルとして送信します。
これで決勝戦の準備が整いましたジェイ次の行に行きます。

エスケープ文字をマップするには、^Q(windows)または^ V(linux&unix)を押してからEscキーを押す必要があります(そうしないと、Esc文字がコマンドを中断し、理由がわかります)。マッピングが複雑になり、定義が消えます。以下は、WindowsでVimに入力するために入力する必要がある順序です。

:map q mw}jdd'wpkJR,<Ctr-Q><Esc>j

だから。 Vimでこれを行うには、おそらく何十もの方法があります。
「フィールド」区切り文字が重要な場合は、通常、各行の末尾に単純な一意のシーケンスを配置し、グローバル検索と置換を実行し、必要な方法で列を接続し続け、必要なものを取得するためにすべて置き換えます。 。

とにかくこれは単なる例です。この内容が面白かったと思います。

関連情報