端末上でedit-compile-runサイクルを快適にする方法


背景など

例えばRubyスクリプトを開発するとき、自分はvimで編集してC-zでサスペンドし、シェルからruby hoge.rbのように実行している。

$ vim hoge.rb
(C-zでvimをサスペンド)
$ ruby hoge.rb
(実行)
$ fg
(vimに戻る)

ここでvimから再度C-zしてC-pをすると、fgがコマンドラインに出てきてしまう。ruby hoge.rbが出てきてほしい。

あるいは、もっと快適にこのサイクルを回す方法はないだろうか?

Tips(bashの場合)

HISTIGNORE="fg:bg"

で自分の希望通りの動作になる。

Tips(zshの場合)

下記記事の方法で、fgがコマンドラインに出ないようにできる。

zshでC-pしたときfgが履歴に出ないようにする - Qiita

Tips Enterの代わりにC-mを使う(bash、zsh共通)

bash、zshどちらでもC-maccept-lineにバインドされている。
C-p Enterの代わりにC-p C-mとタイプする方が楽かもしれない(人によると思う。試してみてほしい)。

代替案:GNU screenを使う

edit-compile-runサイクルの代替案として、screen(またはtmux)で別ウィンドウを開いておいて、ruby hoge.rbは必ずそちらのウィンドウで実行するようにする方法がある。

この場合、zshのaccept-and-hold(デフォルトではM-aにバインド)を使うと少し楽ができる。つまり

$ ruby hoge.rb(ここでM-aを押す)
(するとコマンドラインが実行されて、さらにもう一度同じコマンドラインが現れた状態になる)
$ ruby hoge.rb(ここにカーソルが出る)

これによってM-aを押すだけで何度も同じコマンドを繰り返し実行できる。

bashではC-ooperate-and-get-next)を使うと同じことが出来る。ただしこの仕様は「現在の行を実行し、 履歴内の現在の行の次の行を編集用に取得します」なので、厳密には同じではない。

しかしこの方法、どうも自分の作業スタイルとして定着しづらい。
常にエディタのウィンドウの隣にコマンド実行用のウィンドウがある状態をキープしなければいけないし、screenが入っていないマシンで作業することもあるだろうし…

Railsで開発するときはscreenでvimrails c, rails dp -p, rails sまたはtail -fの4つのウィンドウをこの順で開いておくと決めていて、習慣として定着しているのだが。

vim and tmux with c++/c

https://youtu.be/MG91ihb0oZ0?t=3m53s
この動画では、

  • tmuxで画面分割し、左にエディタ、右にシェルを表示する
  • 左のペインにいる状態から右のペインにtmuxでキーストロークを送り、同じmakeコマンドを繰り返し実行する

という方法を紹介している。
tmuxで下記の設定をしているようだ:

tmux.conf
# repeat last shell command on right pane (if it happens to be a shell)
bind-key s select-pane -t 1 \; send-keys C-c Up C-m \; last-pane

代替案:vimの中からコマンド実行する

  • quickrun
  • vimの中で端末を開く
  • :!ruby %:!!
    • しかし:!!は実行までしてしまう。コマンド内容を確認せずに実行までするのは危険だと思う
    • それに:!!はキーストロークが多い。mapすればいいが
    • nnoremap <F5> :!<Up>として、直前のコマンドを表示するに留めておくのが良いのかなあ
  • 'errorformat''makeprg'を設定しておいて:mak
    • ちなみに、Vimにはこれらを設定する:compilerというコマンドもある。使っている人はほとんどいないと思うが…

など、色々な方法があると思う。
自分もquickrunと同じような自作スクリプトを使っているが、どうしてもC-z fgのスタイルを払拭するには至らない。

  • シェルの上で直接実行する安心感
  • 後から出力を見返しやすい

といった理由があるのだと思う。

C-zでfgできるようにする(zsh)

次のように書いておくと、zsh上でC-zを押すだけでfgできるようになる。

bindkey -s "^Z" "^Ufg^M"

タイプ量がfg<Enter>の3キーから2キーに減るので少し楽になるが、この設定がされていない端末で作業するとき戸惑うデメリットの方が勝ると思うので、実際に導入はしていない。

ご意見募集

ということで、他にedit-compile-runサイクルを快適にするTipsがありましたらご意見を頂きたいです。