Various Vim editor TIPS for “old body” vi users.
私が以前の勤務先で働いていたとき、自分のことを英文メールで “old body(老体)” を称している先輩がいました。「That’s a strict demand on my old body! Stop it!」みたいな感じです。ま、実はそれは謙遜で、誰よりもタフな先輩だと知っているので、みんなニヤニヤ笑ってました。
Bill Joy 時代の vi ユーザーのための、Vim 入門
2022年11月29日に、少し加筆しました。
Sun OS や BSD Unix 時代に vi(あるいは elvis, stevie)を使い始めて、それからずっと vi を使い続けている old body(あるいは old timer?)プログラマさんは大勢いらっしゃるかと思います。私も何を隠そう、若い人が、Atom とか Notepad++ などを使っているのを横目で見ながら、いまでも vi や Emacs を使っています。(前者は主にプログラムコードの編集、後者は日本語テキストの編集。)
最近の Vim は、かつての vi に比べて極めて多機能ですが、いまでも私のように、
- recording @q ってなんだ〜、ESC キーも効かないぞ!(パニック)
- :'<,'> ってなんだ〜!!(呆然実質)
というような方も多いのではないかと思います。
私はちょうどいま、比較的大きなコードを Python で書く仕事をしているのですが、今日は休日ですので、コーディング作業はやめ、Vim の勉強に勤しむことにしてみました。Vim をもう少し覚えれば、コーディングの効率も上がるかも知れません。
今日は、以下のようなことを勉強してみました。いずれも、ネット上を探すと詳しく説明しているウェブサイトがありますので、詳細はそちらにお任せします。私としてはあくまでも、Vim って、そんなことができるんだ。知らなかったなぁという、私のようなオジサンのための「とっかかり」を紹介するに留めたいと思います。
アンドゥ・リドゥ
vi エディタでアンドゥ(undo)は u ですね。行全体の undo は U です。Vim の undo が昔の vi と違うのは、u キーを繰り返し操作することで、(Emacs のように)undo を遡って実行できることです。(昔の vi では、u を繰り返し操作すると、undo と redo の反復になる。)
Vim でリドゥ(redo)をするには、Ctrl-r と操作します。
バッファの話
正直、昔の vi でもバッファという概念はあったように思いますが、せいぜい :e# コマンドくらいしか記憶にありません。
Vim でのバッファの説明は、こちら Vim Tips Wiki: Buffers にあります。以下のようなコマンドを覚えておくと、役立ちそうです。
- バッファの一覧表示 :ls
- 番号を指定してバッファを切替え :Nb(:1b, :2b など。:b 1 でも良いようです。)
- 直前のバッファに切り替え Ctrl-^
マルチウィンドウの話
われわれ old body にとって、ちょっと取り付きにくいのがマルチウィンドウです。Emacs では当然のようにマルチウィンドウ(マルチバッファ)を活用していても、Vim でマルチウィンドウを使っている方は少ないのではないでしょうか。
Vim のマルチウィンドウは、正直言って Emacs ほど洗練されていないようにも思いますが、記憶力の下がってきた私などにとっては、あるソースコードを見ながら、別のソースコードを編集できたほうが便利ですので、これは利用すべき機能だと思いました。こちら How To Use VIM Split Screen – Linux Hint が参考になりそうです。
- 現在のファイルを(垂直/水平)方向の別ウィンドウに split(分割) Ctrl-w {s, v}
- ウィンドウ間の移動 Ctrl-w {h, j, k, l}
- ウィンドウのスワップ Ctrl-w r あるいは Ctrl-w Ctrl-r
- ウィンドウを閉じる Ctrl-w c
- 現在のウィンドウ以外を閉じる Ctrl-w o
- 前のウィンドウに戻る Ctrl-w ^
- 現在のウィンドウを最大化 Ctrl-w _
- ウィンドウサイズを均等に戻す Ctrl-w =
- ウィンドウのサイズを変更する :resize N, :resize +10 など
- 新しいウィンドウでファイルを開く :new ファイル名
- バッファ番号を指定してウィンドウで開く :1sb, :2sb など
加筆
2022年11月29日
- 全てのバッファを一度にクローズするには?
- vi – How do I exit Vim? – Stack Overflow
私は、:qa が便利だと思いました。
- vi – How do I exit Vim? – Stack Overflow
- ウィンドウに割り当てられているバッファを簡単なキー操作で切り替えるには?
- ウィンドウでなく、タブ(Tab キーではなく)を使ってバッファを切り替えるには?
- editor – Using Vim’s tabs like buffers – Stack Overflow
- Vim: Open each buffer in a new tab – Stack Overflow
- linux – In vim, how can I quickly switch between tabs? – Super User
- Beginners Guide to Tabs in Vim – Web dev etc – my software development blog
- How can I map Ctrl-TAB to something in Vim? – Stack Overflow
これも便利ですが、Ctrl-Tab では、タブ間を行ったり来たりするほうが嬉しいかもです。gt、gT は、Ctrl-Tab ほど頻繁には使わなさそう。
- マルチウィンドウ時に、gvim の画面サイズを大きくするには?
- How do I set the default window size in vim? – Super User
具体的には、:set columns=161 とかして、2つソースファイルを並べて編集したりできそうです。
- How do I set the default window size in vim? – Super User
2024年4月1日
- 行のフォーマッティング(gqq)
- ウィンドウのスワップ(Ctrl-w r あるいは Ctrl-w Ctrl-r)
効率的なカーソル移動の話
こちら End of python block motion – Vi and Vim Stack Exchange が参考になります。
- 前後の段落に移動(昔の vi にもあるかも) {, }
- トップレベルの定義(クラスなど)の移動 [[, ]]
- 関数などモジュール間の移動 [m, ]m
- 移動後に前の場所に戻る Ctrl-o
こんなプラグイン GitHub: jeetsukumaran/vim-indentwise: A Vim plugin for indent-level based motion. もあります。
ファイルを開いたとき、最後の編集位置にジャンプして欲しい
こちら In vim, how do I get a file to open at the same line number I closed it at last time? – Stack Overflow に説明があります。
なお、自動的にジャンプさせたくはないけど、手動で最後の編集位置にジャンプしたいという場合には、' "(アポストロフィ + ダブルクオート)や、` "(バッククオート + ダブルクオート)でジャンプできます。
Visual Line モード
vi では、行範囲を指定してコマンドを実行することが良くありますが、行範囲を調べるのが面倒なことがあります。いちいち、:set nu とかしたくないですよね。
そのようなときに役立つのが Visual Line モードです。コマンドで V と操作すると Visual Line モードになります。vi のキー操作でカーソルを移動して範囲を指定した後、例えば x コマンドを実行すると範囲を削除できます。さらに、: と操作すると「:'<,'>」という表示が出ますので、例えばここで s/foo/bar/g と実行すると、選択した範囲内で一括置換ができます。
今まで勉強しなかったことが悔やまれる機能です。
タグと ctags の話
Python のプログラミングをしている限りでは、以下の jedi-vim があったらこれは不要なのではないかと思いますが、他の言語ではそうも行かないのですし、Vim ではタグを知らないとヘルプ画面を活用するのも困難なので、紹介しておきます。
Vim でヘルプ画面を見るには、:help を実行します。その中で、色つきのタグ(ハイパーリンクみたいなもの)に飛ぶには、タグ上で Ctrl-] と操作します。前の画面に戻るには、Ctrl-t です。
プログラムソースコードの上でもタグは利用できます。その場合には、ctags というコマンドを使って tags という名前のファイルを生成しておく必要があります。
クラスや関数の一覧を見る話
Eclipse 統合環境などを使っていると、ソースコードの編集中にクラス名や関数名の一覧表示が見られて便利だなあ、と思うことがあります。Vim でこれを利用するには、GitHub: preservim/tagbar: Vim plugin that displays tags in a window, ordered by scope というのが非常に便利です。
ただし、vi で右側に画面を広げてウィンドウを開かれるのは邪魔です。編集中のクラス名と関数名が分かるだけで十分なこともあるでしょう。その場合は、日本語で書かれたこちらの Tagbarでどの関数内に居るかを知る – Engineer in garage も非常に参考になります。なお、Neobundle というところは、B を大文字にして NeoBundle としないといけないかも知れません。
私は ~/.vimrc の中で次のように設定し、\ Ctrl-T で :TagbarToggle(とウィンドウ切替え) となるようにしました。
nmap <Leader><C-T> :TagbarToggle<CR><C-W>l
パッケージマネージャの話
さて。このような拡張機能を Vim ではプラグインと呼びますが、プラグインを管理するためのパッケージマネージャのようなソフトがあります。私は GitHub: Shougo/neobundle.vim: Next generation Vim package manager を使っています。
文法ハイライティングの話
Vim でプログラムコードの文法をハイライトするには、:syntax on というコマンドを使います。~/.vimrc ファイルに、次のように書いておくと便利でしょう。
syntax on
ハイライティングの色の変え方
こちらに説明があります。
- linux – Setting the Vim background colors – Stack Overflow
- editor – how to disable bold font in vim? – Stack Overflow
スペルチェックの話
プログラムのソースコード中で、文字列やコメント中の英語のスペルが間違っているとカッコ悪いです。そのようなときは、:set spell コマンドを使うとスペルチェッカを利用できます。
特定の拡張子のファイルを開くときに自動的にスペルチェッカを有効にするには、~/.vimrc に以下のように記述すると良いでしょう。
autocmd BufRead,BufNewFile *.c,*.h,*.cpp,*.py setlocal spell
また、スペルチェッカに単語を追加する方法は、こちら How To Use Spell Check Feature In Vim Text Editor – OSTechNix に説明があります。
jedi-vim の話
Eclipse 統合環境などを使っていると、関数名の上でキー操作をすることで、関数の定義、変数の定義、ある関数や変数をどこから参照しているのか、などを見られて便利に思うことがあります。これを Vim でも利用可能にするのが、この GitHub: davidhalter/jedi-vim: Using the jedi autocompletion library for VIM. です。先ほどのパッケージマネージャでインストールすることができます。
なお、説明 README.rst を読んでいくと <leader> というキーワードが出てきて「?」となりましたが、Vim のデフォルトでは、バックスラッシュ(\)が leader だそうなので、例えば <leader> g とあったら、\ g と操作すれば OK です。
gvim(GUI 版 Vim)の話
私は普段 Mac OS X(macOS)を使ってますが、ターミナル上で vi を使うと、文法ハイライティングの色などを見づらく思うことがあります。若い人なら平気かも知れませんが、私のように老眼が進んでくると、目を酷使するのはつらいので、やっぱり gvim を使ったほうが良いかな、と思うようになりました。
私は HomeBrew で macvim をインストールしました。gvim の表示は、やっぱり目に優しいように思います。
レコーディング機能
説明はこちら What is Vim recording and how can it be disabled? – Stack Overflow にあります。
この機能を使うか使わないかに関わらず、昔からの vi ユーザーが Vim でハマる機能の一つがこれだと思います。誤ったキー操作などで q とタイプすると、このモードになります。慌てて ESC キーなど押しても元には戻りません。はっきり言って私はよくパニックになります。
もし間違えてレコーディングモードになったら、慌てず騒がず、再度 q とタイプすれば、レコーディングから抜けられます。
行のフォーマッティング
- 行が 80 文字以内に入るように成形 gqq
(参考: In VIM, how do I break one really long line into multiple lines? – Stack Overflow)
カンニングシート
Markdown でもそうでしたが、Vim のキー操作を全部暗記するのはしんどいです。ネットを探すと便利なカンニングシート(カンペ)があります。私は、こちら Vim Cheat Sheet を利用させて頂いています。
いろいろと御紹介してきましたが、昔からの vi ユーザーが、Vim の機能に少しでも馴染んで頂ければ幸いです。
今日はここまで。