(前半)少なくとも一つは知らないvimのトリック

Hillel Wayne    
フォーマルメソッド、ソフトウェア歴史家、『実践TLA+』の著者。
この記事は、著者の許可を得て配信しています。
https://hillelwayne.com/post/intermediate-vim/

私はVimを使い始めて8年になりますが、今でも新しい発見があります。一般的に、こういう新しい発見が度々あることが、Vim の長所だと思われています。しかし、私の頭の中では、これは発見の可能性の失敗だと思っています。Vim は何が利用可能なものなのかがなかなか分からないようになっているので、私は新しいものを常に発見し続けています。

モーダル編集やテキストオブジェクトの美しさについて話す人はたくさんいますが、私はそれが Vim の本質を捉えているものだとは思いません。Vimはサブシステムのパッチワークのようなもので、あらゆるスペースに特別な目的のためのツールが詰め込まれています。通常モードだけでも100種類以上のキーストロークコマンドがあります。Vimがとても便利なのは、この密度の濃さのおかげです。「キーワードに一致するすべてのタグを表示する」のがただの g] であれば、実際にそれを使う可能性が高くなります。

発見できないシステムでは、便利なものを見つけるためにガイドに頼らざるを得ません。しかし、Vim の場合はそういうことは、それほど頻繁にはありません。ciaなどの初心者向けの記事や、サブシステムに関して深く掘り下げた内容が載っている専門家向けの記事があります。しかし、そういった特別な目的のトリックについては語ってくれる人は誰もおらず、過去6年間ずっと必要としていたもので失敗をしてしまった人もいます。

この記事では、私がVimで使っているちょっとしたトリックのいくつかを紹介します。どれも深く掘り下げたものではありませんので、興味を持ったら、自分でももっと勉強してみてください。また、今からご紹介するトリックは相関関係があるものではありません。でも、それでいいんです。総合的に見れば、これらのトリックはとても役に立つものとなるはずでしょう。

組織

Vimのユーザーは、大まかに言って2つのカテゴリーに分けられます。本格的なユーザーは、Vim の小さなサイズとユビキタス性を高く評価しています。慣れていないコンピュータで使う必要がある場合(sshの時など)に備えて、コンフィギュレーションは最小限にとどめておくようにしています。一方、Exobrain派は、Emacs を使っていることにして、プラグインや関数、自作のマッピングを Vim に詰め込んでいます。Exobrainからvimrcを取ってしまったら、Exobraiは完全に役に立たなくなるでしょう。

お察しの通り、私は本格的なユーザーというよりも、Exobrain派です。私はこのトリックを Vim にマッピングの追加をするかどうかや、設定を追加するかどうかに基づいて、2つのセクションに分けました。

本格的なVim

モーダルコマンドには標準的な Vim のヘルプを使いました。ie <cr>はエンターを押すことを意味します。例えば :h E676 のように、特定の文字列を :h してヘルプを取得しなければならない場合は、ヘルプ文字列を括弧で囲みます。

Misc ノーマルコマンド

":, @:

":は最後に実行したコマンドを格納するレジスタです。バッファにプリントするには ":p と書くことができます。@:は最後のコマンドを再実行します。

"=

これは、expressionレジスタです。ここに任意のvimL expressionを入力して貼り付けたり、ctrl-Rなどと使用したりことができます。"=strftime("%c")<cr>p と入力することで、ローカルのタイムスタンプを貼り付けることができます。

mA, 'A

m{letter}はカーソルの位置にマークを設定します。すると '{letter} はその行にジャンプします。小文字の場合はバッファごとに設定されるので、ナビゲーションに使うことができます。大文字の場合はグローバルです。 A マークのあるファイルにいない場合、'A はそのファイルにジャンプします。:marks:.を伴ったセットマークを全て見ることができます。

ctrl-A and ctrl-X

カーソルから、行内の次の数字をインクリメント、デクリメントします。その数字にジャンプするので、どこからでも使えます。10c-Aの方がwwwwwwciw20より断然簡単です。

q:

過去のコマンドの履歴を開きます。他の Vim テキストと同様に操作できますが、変更は保存されません。しかし、変更したコマンドを <CR> で実行することはできます。これにより、コマンドを素早く修正して再実行したり、古いコマンドを検索して再利用したりすることが非常に簡単になります。

q/q?

検索以外はq:と同じです。

ctrl-I, ctrl-O​

ジャンプリスト内の次の場所または前の場所に移動します。ちょっと確認して、すぐに元の位置に戻るのに便利です。ヘルプファイルを読むのに便利です。

マクロ

マクロの詳しい使い方についてはこちらの記事を参照してください。

ビジュアルモード

gv

前のビジュアルを選択します。

v_o

ビジュアルブロックの反対側に移動します。1 行の開始位置が低すぎる場合などに便利です。ブロックモードでは、対角線上の反対側のコーナーに移動します: v_O を使って反対側の水平コーナーに移動します。

g ctrl-A / ctrl-X

ビジュアルモードでは、ctrl-Aはすべての行の最初の数字をインクリメントします。 一方、g ctrl-Aは、一致する行ごとに1つずつインクリメントします。これを説明する場合はテーブルを使って説明する方が簡単です。

演算子:v, V, c-v (:h o_v)

ビジュアルモードについてはご存知の方も多いと思いますが、vは文字単位、Vは線単位、ctrl-Vはブロック単位となっています。しかし、この3つはモーション演算子としても使え、モーションを通信単位にすることができます。例えば、次のようなものがあるとします。

abc
abc
abc

一番上のbにカーソルを置いてd2jを押すと、3行全てが削除されます。これは j が行単位のモーションだからである。d2j ではなくd<c-V>2jを押すと、モーションがブロック単位に変換され、bの真ん中の列だけが削除されます。

私が使っていた方法の一つに検索への削除がありました。通常d/は排他的な文字モーションです。なので、dV/を使って行単位にして、検索行を削除に含めます。これ以外の方法もあります。

/regex/{n}

モーションをマッチの下の n 番目のラインに移動させます。n が負の場合も同様です。すると、行単位のモーションをするという意外なことも起きます。つまり、正規表現にマッチする最初の行を削除してその行を含めたい場合は、d/regex//0を実行します。

Ex コマンド

Ex コマンドは :s のようにコマンドモードから書くものです。置換以外にも、ex を使う便利な方法はたくさんあります。これらの例はすべて % のような範囲が必要です。

:g/regex/ex

Ex コマンドは正規表現にマッチした行上でのみ実行されます。例えば、g/regex/dを使って正規表現にマッチする行をすべて削除することができます。vはgと似ていますが、正規表現にマッチしないすべての行上でexを実行するという点だけが違います。

norm や friends を一緒に使うとよりパワフルになります。

norm {Vim}

これは、範囲内のすべての行に対して{Vim}を実行したかのように動作します。例えば、g/regex/norm f dw は、正規表現に一致するすべての行の最初のスペースの後の最初の単語を削除します。この方法は、マクロを使うよりもはるかに簡単です。

normはすべてのマッピングに従います。例えば、jkを挿入モードで<esc>にマッピングした場合、norm I jk$diwは行頭にスペースを挿入し、挿入モードを解除してから、その行の最後の単語を削除します。私はこの機能をとても気に入っていますが、マッピングを使わない方が好きと言う方は、代わりに normを使っても大丈夫です!

:co .

範囲を現在の行にコピーします。.,の代わりに +3 や 'aのような任意のポイントでもOKです。

:y {reg}

範囲をレジスタ{reg}にコピーします。レジスター{reg}が大文字の場合、既存のレジスターに追加されます。例えば、

let @a = '' | %g/regex/y A

ファイル全体の正規表現にマッチするすべての行を a にコピーします。ファイルから分解されたテキストを抽出してシステムのクリップボードにコピーするには便利です (let @+ = @a とします)。

:windo {ex}

全てのウィンドウでexを実行します。bufdo, cdo, tabdo などもあります。:windo $を実行すると、すべてのウィンドウを下にスクロールします。bufdo, cdo, tabdo などもあります。

これはgやsとの相性がとてもよいです。AA のインスタンスをすべて BB に置き換えたいけれども、各置換を最初にチェックしたい場合は、vimgrep AA を使ってすべてのマッチをクイックフィックスにロードし、cdo s/AA/BB/cge を使ってすべてのマッチを検索して再置換することができます。


コメントを読む

新着ピック  






















新着ニュース

SQL レベルのメトリクス をサポートしたパフォーマンスインサイトで高負荷状態のDB稼働を確認してみた | Developers.IO

『それ、楽しくしましょ ちょっとだけ』~ファシリテーションで自分の強みを探してみた!~ | Developers.IO

[備忘録] Kinesis FirehoseのLambdaによるデータ変換について | Developers.IO

ECS Task DefinitionをActionsで自動更新する | Developers.IO

ECS Task DefinitionをActions...

DevelopersIO / 5時間前


アップル、Apple 名古屋栄と福岡の営業を5月27日より再開--客もスタッフもマスク着用で

「4Gスマホ」おすすめ3選ソフトバンク編 人気機種はもちろん2画面やコスパ重視モデルも【2020年春最新版】

「Yahoo! MAP」、最短20分前の街の混雑状況をヒートマップで表示可能に

【小ネタ】服にバーチャル動画を映す時の注意点 #zoom | Developers.IO

Fin-JAWS 第13回 PCI DSS と AWS の混ぜご飯レポート #finjaws #jawsug | Developers.IO

Fin-JAWS 第13回 PCI DSS と AWS...

DevelopersIO / 8時間前


首相「接触確認アプリ使って」 “緊急事態宣言解除後のカギ”と呼びかけ

マーベラス、中国テンセントの子会社が筆頭株主に--資本業務提携を締結

[Amazon SageMaker] イメージ分類(Image Classification)において、データセットの解像度が、学習及び、検出結果に与える影響について確認してみました | Developers.IO

東京ディズニーリゾート、グッズのネット販売に対応 チケットなしでも購入可 イベント限定品は「方法を模索中」

伊藤忠、ラズパイ活用の体温検知デバイスを発売 AIによる顔認識も

shellで学ぼう!プログラミングがちょっと上手になる(かも)Tips集!! | Developers.IO

ソニー、ドコモらが医療分野のIT活用で協業へ VRを使った“バーチャル面会”など検討

楽天ペイ、アプリ内で「Suica」が利用可能に--楽天カードからのチャージで0.5%還元

マストドン「mstdn.jp」、6月30日に終了 「中傷に対する法制強化に対応できない」

「CEATEC 2020」もオンライン開催へ

Amazon QuickSight へのアクセスをアクセス元で制限する場合の対応方法 | Developers.IO

もっと見る
記事をPICKする
会員登録
Register
記事をPICKする

会員登録すると、もっと便利に利用できます。