「実践Vim」2週目を読んで気になった機能

これはAizu Advent Calendar 2018の6日目?の記事です。

adventar.org

前の人は id:ywkw1717さんで、次は id:culumn さんです。

体はVimで出来ている

実践VimKindle版を買いました。

実践Vim 思考のスピードで編集しよう! (アスキー書籍)

実践Vim 思考のスピードで編集しよう! (アスキー書籍)

 

 そしてipad proを買いました。

 なので、自分にしては珍しく、本のlogが残っているのでまとめてみようと思います。特に初心者向けとか玄人向けとかガチガチ技術記事とかエロ同人誌とか自己啓発ではなく、備忘録として適当に書くので、長くなるし参考程度に読んでくださいw(Vimに興味ない人は読まないほうがいいかも)

この本について

自分がこの本を初めて読んだのは、

あれは今から36万・・・いや、1万4000年前だったか、

うん、確か1、2年前です。図書館で借りて二週間かけて一通り読んだ気がしますが、あの頃の自分には情報量が多すぎて取りこぼしたものを2週目で何個か拾えた気がします。つまり2週目でも為になる本だし、多分3週目でも新しいものを得られると思う。この本は、

文字で説明するのではなく、実例を示すことで、その何かについて語っている。

ので、機能の説明だけでなく、どう実践で使えるかまで理解できます。Vimを使っていればすぐに試すことができるし、慣れていれば頭の中で再現することもできますw。とても実践的Vim本来の良さを味わえる最高の一冊です。 以下に読んで気になった部分を抜粋していきます。

Vimを学ぶのは、タッチタイプを身につけてからにしよう

 

タッチタイプができないと、Vimを学んでも、その長所はなかなか現れない。タッチタイプができるようになろう。これは必須だ。

Vimの起源は、古の時代のUnixエディタ、viとedにまで遡ります。これらのエディタはマウスとポイント、クリック的なあらゆるインターフェイスよりも前に生まれたものです。Vimはあらゆることがキーボードで行える。

 

おそらくここで言っているタッチタイプとは、記号も含めた全ての文字をキーボードを見ずに打つことを言っている。記号も含めるとなると、自分も出来ているのかかなり怪しい。振り返ってみると、*や$などチラ見して打っている気がする。少し意識して、真のタッチタイプを身につけようと思います。

TIP37:引数リストを使ってバッファをコレクションにまとめる

引数リストは管理も簡単で、これを使うと、ファイルをコレクションにして、ファイル間を簡単に移動できるようになる。コマンドを `:argdo`コマンドを使えば、引数リストの中の各要素にExコマンドも実行できる。

引数リストはvimコマンドの起動時に引数として渡されたファイルのリストを表します。Vimでよく困るのはファイルの管理です。1つのプロジェクトで複数のファイルを管理することはよくありますが、vimはモダンなエディタと違って左にファイルツリーが表示されたりしません(しようと思えば出来ます)。どのように管理するかは人それぞれですが、自分はバッファで管理していました。しかしバッファ管理はごちゃごちゃするしなと考えていたときに、この引数リストが使えるということを知りました。

:args {arglist}

:argadd

主に使うのは:argadd %で現在開いているカレントバッファをarglistに追加できます。

引数リストはバッファよりも管理が簡単で、バッファをコレクションするための場所としては理想的だ。筆者が思うにバッファリストは机みたいなものだ。つまり、いつもごちゃごちゃしている。引数リストは独立した作業場所で、広々と作業したいときのためにいつでも綺麗になっている。

argdoでgit addとかformatかけるのもいいかもしれない。

TIP53:場所をマークして、そこにサッと戻る 

Vimのマークを使うと、ドキュメント内できになるところにサッと戻れる。マークは自分でも設定できるが、開発者が気にしている箇所をVimが自動的に管理してくれる。

VimConf2018でBram氏のkeynoteを聞いているときに使おうと思い、ちょくちょく使っていたが、開発者が気にしている箇所をVimが自動的に管理してくれる。 こんな便利な機能を見逃していた。

f:id:dennougorilla:20181221160710j:plain

例えば、import分を追加して、それを使ったmethod文を、他の場所に書いている途中で、import文が間違っていることに気づくことが偶にある(あるよね?)。そんなときに `. を押せば一瞬でそのimport行に戻れる。直前のミスにそのあとの操作で気づいた場合にとても有効な機能だと思う。g;やgiでも代用可能

TIP39:ワークスペースを分割ウィンドウにする

プロジェクトごとにタブを使って分けて、分割windowでプロジェクト内のファイル編集を行う、あるいはterminalを開くなどは以前から使っていましたが、毎回 :sp や :vsで分割していました。<C-w>sで水平分割、<C-w>vで垂直分割ができることを知りました。window移動と同じprefixでこっちの方が直感的で使いやすいです。

 

TIP40:タブページを使ってウィンドウのレイアウト管理

上記にあるように、タブは使っていましたがファイルパスの管理が曖昧だったので、:windo lcd {path} を使うことで分割ウィンドウ全体にVimのパスを指定することが出来ることを知りました。これは:eで新たにファイルを開くときや、 <C-x><C-f>でファイル補完をするとき、新たにterminal windowを開くときに重要になってきます(たぶん)。気になったけど、カレントバッファを基準にしたファイル補完とかできないのかな?

TIP70:イテレータ

Vim内部の変数とExpressionレジスタを使って数値インクリメントが出来るらしい。なにこれめちゃくちゃオシャレ✨

gist.github.com

これをマクロに挟むだけで、インクリメント出来るし、多分もっと複雑なこともできそうで、かなり興奮した。

また、「:normal @a」で選択された各行に対してマクロを実行するので、これを使えば、マクロ内に移動を挟む必要がなくなり、マクロも簡潔になるし、再利用性も高まる気がしました。

また、

qaと入力すれば、Vimはキーストロークを記録して、レジスタaにこれを保存してくれる。このとき、それまでのレジスタ内容は上書きされる。qAと入力するとキーストロークを記録して、これを今のレジスタaの内容に追記してくれる。ミスを修正できるという事だ。

大文字のレジスタ参照で追記は色々と使えそうだ。

TIP73:\v正規表現検索で「\v」パターンスイッチを使う

これで正規表現を使って検索を行えるらしい。自分は正規表現自体が怪しいのでそこから勉強して後々使えたらなと思う。

/\v#([0-9a-fA-F]{6}|0-9a-fA-F]{3})

これで16進のカラー値にマッチするものを検索できる。さらに文字クラスというのを使って、

/\v#(\x{6}|\x{3})

こんな感じで、文字集合[09afAF]を文字クラス\xで置き換えられるらしい

TIP74:\Vリテラルスイッチを使ってテキストそのものを検索

特殊記号を無視して、テキストそのものを検索できるらしい。(/\Va.k.a. など)

TIP75:カッコを使って部分マッチをキャプチャする

/\v(And|D)rewNeil

こんな感じで部分マッチを使用でき、さらに各カッコが表す部分マッチを\1, \2, ...., \9で参照できる。関係ないけど、このTIPに出てくる構文的幻想(lexical illusion)という単語がカッコよすぎる...厨二心を擽ぐるぜ。

TIP76:単語の境界を指定する

「the」を検索するとき、「these」、「they」など想定よりも多くのものがマッチしてしまう。このような単語を明確にマッチさせたいときに、単語境界デリミタというのが使えるらしい。\v (verymagic検索)では、単語デリミタは<>で表される。したがって/\v<the>とすれば、theを限定的にマッチさせることができる。

TIP97 :グローバルコマンドとは

:globalコマンドは、ExコマンドのパワーとVimのパターンマッチ機能とを結合する。これを使って、指定したパターンにマッチする各行に、Exコマンドを実行できる。

:normalが選択行に対し、:globalはパターンマッチ行で、パターンにマッチした行に対してマクロを再生できたりする。これを使うことで:normalと同じように、検索ワードのジャンプ(n)などをマクロの中に記述する必要がなくなるね!ちなみにこれは古のエディタedからあるもので、grepの起源はg/re/pでgはglobalの省略表記、reは正規表現(regular expression)を表し、pはprintの省略表記になっているらしい。

ちなみに、マッチする行以外は:vglobalを短縮して:vで表し、:gと逆のことをする。

その他

  • :Eでファイルエクスプローラーを開く、今まで:e .とかで開いてたけどもっと短いのがあった。
  • :put a 必ず現在行の下に貼り付ける。これを最近よく使う(:put "とか:put +とか)
  • :g/TODO/yankA TODOが書いてある行をaレジスタに追記する(globalコマンドと大文字レジスタ参照の併用技)
  •  let@a=substitute(@a,'\~','vU','g') これでもレジスタに追記出来る

まとめ

頭にgがつくコマンドを使いこなせていない気がした(頭文字G)。マーカー、マクロ、レジスタをもっとうまく使えるようになりたい。特に

  • 自動マーカー
  • :normal, :global, :vglobalを利用したマクロの再生
  • Expressionレジスタ

あたりをこれから積極的に使っていこうと思いました。それと正規表現をある程度覚えたいので\v縛りでもやろうかなと思いますw

最後に

ここまで読んでくれてありがとうございます!何か一つでも気になる機能があれば幸いです笑 ここまで書いといてあれですが、やはり文字だと伝わりにくいし、動画を差し込めればなと思います。自分の気分が乗ればgifかyoutubeとかでまとめて載せたいなと考えています(正直めんどくさい)。スターとかコメントで気分を上げてくれたらなとw 他にも感想とかおすすめの機能とかエディタとか本とかゲームとかアニメなどがあればコメントに書いてもらえると嬉しいです。