2023-10-22追記
現在は、ターミナルエミュレータで右側に別ペインを作り、記事内にある C-o (_repeat-last-command) を使う方法が良いと思っている。
必要に応じてmakeを利用する。
背景
自分は例えば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-mはaccept-lineにバインドされている。
C-p Enterの代わりにC-p C-mとタイプする方が楽かもしれない(人によると思う。試してみてほしい)。
代替案: 別ウィンドウを使う
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-o(operate-and-get-next)を使うと同じことが出来る。ただしこの仕様は「現在の行を実行し、 履歴内の現在の行の次の行を編集用に取得します」なので、厳密には同じではない。
あるいは下記を~/.zshrcに書いておくと、C-oで前回のコマンドを実行できる:
_repeat-last-command() {
zle up-line-or-history
zle accept-line
}
zle -N _repeat-last-command
bindkey '^O' _repeat-last-command
しかしこの方法、どうも自分の作業スタイルとして定着しづらい。
常にエディタのウィンドウの隣にコマンド実行用のウィンドウがある状態をキープしなければいけないし、screenが入っていないマシンで作業することもあるだろうし…
Railsで開発するときはscreenでvim、rails 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で下記の設定をしているようだ:
# 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というコマンドもある。使っている人はほとんどいないと思うが…
- ちなみに、Vimにはこれらを設定する
など、色々な方法があると思う。
自分もquickrunと同じような自作スクリプトを使っているが、どうしてもC-z fgのスタイルを払拭するには至らない。
- シェルの上で直接実行する安心感
- 後から出力を見返しやすい
といった理由があるのだと思う。
C-zでfgできるようにする(zsh)
次のように書いておくと、zsh上でC-zを押すだけでfgできるようになる。
bindkey -s "^Z" "^Ufg^M"
タイプ量がfg<Enter>の3キーから2キーに減り、片手だけで押せるようになるので少し楽になるが、この設定がされていない端末で作業するとき戸惑うと思うので、実際には導入していない。
makeを利用する
コンパイルが必要な言語や実行コマンドが複雑になる場合などは、Makefileを作ってmakeで実行するようにするといいかもしれない。
実行時にプログラムに引数を渡したい場合は、下記のように書いておく。
run:
ruby -e 'p ARGV' ${arg}
するとmake arg=fooのように渡せる。
# 引数を2個渡す
$ make arg="11 22"
ruby -e 'p ARGV' 11 22
["11", "22"]
# スペースを含む引数を1個渡す
$ make arg="'11 22'"
ruby -e 'p ARGV' '11 22'
["11 22"]
参考: https://qiita.com/tortuepin/items/9861c75853b516c8a279
ご意見募集
ということで、他にedit-compile-runサイクルを快適にするTipsがありましたらご意見を頂きたいです。