テキストブロックをより高速に移動する方法


25

テキストまたはコードのブロックを通常コピーする方法は次のとおりです。

  1. ビジュアルモード(V)でブロックを選択し、d;で削除し ます。または、1行だけの場合は、を使用します dd
  2. 私はテキストになりたい場所に移動し、私は違いを覚えて、あまりにも愚かだpP、私は時間の約50%、この権利を取得するので、。(間違った場合は、もう一度やり直してください)。
  3. 場合によっては、インデントの調整が必要なため、Vもう一度ビジュアルモードに移動し て同じブロックを再選択し、>または <を使用して修正します。

もっと簡単な方法はありますか?一部のエディターでは、テキストブロックをそのまま「ピックアップ」し、移動できることがわかりました。Emacsの例を次に示します(ただし、他のエディターでも見ました)。

Emacs

それとも別の(さらに良い)方法がありますか?


インデントの問題についてあなたが貼り付けて、それを解決することができます]p[pではなく、pP。これにより、貼り付けたブロックは自動的にインデントされます。
ゴンサロリベイロ

vim-unimpairedの使用を推奨するDrew Neil Bubbling Textのスクリーンキャストをご覧ください
-Hotschke

回答:


13

そのためのプラグイン:dragvisuals.vimがあります。

デフォルトではキーをバインドしませんので、自分でそれを行う必要があります。私はそれらをControl+ にマッピングしたいArrow key

xmap <expr> <C-Left> DVB_Drag('left')
xmap <expr> <C-Right> DVB_Drag('right')
xmap <expr> <C-Down> DVB_Drag('down')
xmap <expr> <C-Up> DVB_Drag('up')

また、現在の選択を複製するためのボーナスキーが付属しています。

xmap <expr> D DVB_Duplicate()

他の回答に対するこのプラグインの利点:

  • 最初の行よりも上に移動しようとしても、テキストは消えません。
  • 最後の行の下に移動すると、ファイルが展開されます。
  • 左/右に移動すると少し良くなります。

これを補完する別の便利なトリックは、次のキーバインドです。

xnoremap > >gv
xnoremap < <gv

これにより>、ビジュアルモードで使用した後に最後のビジュアル選択が再選択されるため、配置をより簡単に調整できます(矢印キーも使用できますが、1つではなく1文字ずつ移動しshiftwidthます)。


1
私の提案プラグインの作者は、「私自身dragvisuals.vimの大幅に改善リワーク」と説明していること、このために別のプラグインがあります:github.com/zirrostig/vim-schleppは
ジェイ・トンプソン

8

ステップ3では、gv=代わりに使用できます(=インデントをgv意味し、「最後の視覚的選択を再選択」を意味します)。

Emacsの動作については、.vimrcにいくつかのマッピングを追加するのは非常に簡単です:

vnoremap <down> dpV`]
vnoremap <up> dkPV`]

次に、上下の矢印キーを使用して、視覚的なライン選択を移動できます。(もちろん、矢印が嫌いなら別のキーにマップすることもできます。)

(通常の視覚的な選択でこれを行い、それらを左右に移動することもできます:vnoremap <left> dhPgvhohoおよびvnoremap <right> dpgvlolo。)


gv最後のビジュアル選択に移動します。この場合、削除された段落になります。私は何が欠けていますか?
ロバートスミス

4

いくつかのキーを再マップして、行を移動できます。たとえば、を移動するのに慣れている場合は、上下の矢印を使用しますhjkl

たとえば、.vimrc

nnoremap <down> :m .+1<CR>==
nnoremap <up> :m .-2<CR>==
vnoremap <down> :m '>+1<CR>gv=gv
vnoremap <up> :m '<-2<CR>gv=gv

:m、行を移動する通常のコマンド

+1または-2、ラインのアップまたはダウンを示します(-1は同じ場所にラインを保持します)

gvVISUALモードで同じテキストを再度選択するには

このソリューションはレジスタに干渉しないため、コピーされたテキストは引き続き利用でき、コードを再フォーマットして適切なインデントなどを設定します。


これはいいことですが、私は使用=するのが好きではないので、私にとってはそうではありません(多くの場合、無関係な書式設定があまりにも多く変更されます)。
マーティントゥルノイ


3

このためのプラグインはほとんどありませんが、私はTim Popeのvim- unairaired (github)を好みます(Ingo Karkat LineJugglerも同様です)。

テキストのブロックを視覚的に選択してから]e(交換の場合はe)ブロックを下に移動します([e他の方向の場合)。を使用.してアクションを繰り返します(repeat.vimはインストールされています)。行き過ぎた場合は、で元に戻しuます。

今個人的に私は思うしpP悪い習慣を作成する前にそれらを学ぶことをお勧めするような一般的なコマンドです。次に]p、同じインデントに貼り付けるのに使用できます。障害のないものを使用している場合は>p、インデントレベルをより深く=p貼り付けるか、貼り付けて再フォーマットすることができます。

あなたが困っ思い出すを持っている場合pP、それはあなたがの面でそれらを考えるのに役立つかもしれないoO対称の一種であるコマンド。

他の人が述べたようにgv、視覚的な選択を再選択するために使用できます。ただし、テキストを貼り付けただけでは、視覚的な選択が失われます。すべての変更ので、心配しないでください(とヤンク!)を設定します'[']変更された領域の周り。したがって、インデント>'](読み取り:最後の変更の終わりまで右にシフト)を使用し.て、テキストを適切な場所に配置するまでインデントを繰り返すことができます。

詳細については、以下を参照してください。

:h p
:h P
:h ]p
:h o
:h O
:h .
:h u
:h >
:h ']
:h gv

2

テキストブロックの移動先の行番号がわかっている場合は、:moveコマンドで範囲または視覚的な選択を使用して、ブロックをそこに移動できます。

たとえば、次のファイルがある場合:

1 aaa
2 bbb
3 ccc
4 ddd

そして、aの行をcの行の後に移動したい場合、カーソルをaの行に置き、を入力:m3してから、行をシフトします。

これは、+ /-オフセットでも機能します。上記の例では、:m+22行下に移動しても同じ結果が得られます。

テキストブロックの場合、唯一の違いは範囲または選択範囲の追加です。aaa行とbbb行をファイルの末尾に移動するには、:1,2m$($ =最終行)などのコマンドを使用するか、行とを視覚的に選択します:m$


1
さらに詳しいヒントについて:moveは、vim.wikia.com / wiki / Moving_lines_up_or_downまたはヒント29 D. NeilによるBook Practical Vimの「:t」および「:m」コマンドを使用した行の複製または移動を参照してください 。
-Hotschke

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