LoginSignup
0
1

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

Last updated at Posted at 2017-08-11

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-maccept-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-ooperate-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で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キーに減り、片手だけで押せるようになるので少し楽になるが、この設定がされていない端末で作業するとき戸惑うと思うので、実際には導入していない。

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がありましたらご意見を頂きたいです。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1