2008/02/11

スクロールバッファの空白ではない始めの行に移動する方法

screenで大きめのスクロールバッファを確保したときに、有効な先頭行に移動する方法のヒントを見つけたのでメモしておく。

screen-usersに件の投稿があったのでそれをヒントにした。
How to go to the beginning of the scrollback buffer
ここでは自己レスとして次の様な解があがっていた。
bindkey -m b stuff "g/e^["
  • bindkeyでコピーモードに「b」と言うキーを
  • 先頭行に移動して(g)
  • 「e」で始まる行を検索(/g^[)
なるほど、「g」で1行目に移動して、出現頻度の高い文字「e」で検索すれば最初の有効な先頭行になるだろうと言うことですか。

コピーモードの検索において正規表現が使えれば楽なんでしょうけど、こういう方法があるんですね。それ以前にstuffなるコマンドを初めて知りました。結構manは読んだつもりだったのですが...

自分の環境では「e」で検索してもあまり意図したところに飛んでくれないので次の様にしてみた。
bindkey -m -t ;b stuff "g/:^M^F^B"
  • b」だとコマンドモード中に入力している「b」に反応してしまうので「;b」に変更
  • 改行は「^[」ではなく「^M」に変更
  • 検索文字は「e」ではなく「:」に変更
  • ヒットした行を画面最上部に持ってきたいので「^F」「^B」でページ移動
検索文字を「:」にした理由は、普段「verbose on」で使っているため、新規ウィンドウ「C-a c」の先頭は次の様になるからです。
:screen (zsh): /usr/bin/zsh
yoshikaw@hoge[4] ~%
スクロールバッファが全て満たされているときにこのコマンドを実行すると意図しない行に移動してしまいますが、それはそれでまた「g」すればいいだけなので我慢します。

2009/08/29 追記
screenrc中にコントロールキャラクタを入れるとコピペ時に面倒なので8進数で表記する。
bindkey -m ;b eval 'stuff g/:\015\006\002'
  • 入力中のタイムアウトは気にしないので「-t」は削除

2010/11/27 追記
screen-usersに目から鱗な回答がありました。コレを覚えておけば、ここまで書いてきた無駄なbindせずにすみますね。
Re: Question Regarding Navigating the Buffer
Enter scrollback mode then hit "g w"

0 件のコメント:

コメントを投稿