Ruby
pry

pryで特定の入力やコマンドを履歴に追加しない方法 (histignoreオプション)

More than 3 years have passed since last update.

pryにもbashやzshのように行頭スペースで書いたコマンドやコードを無視してくれる設定がないものかと思い調べてみました。


histignoreオプション

Pry.config.history.histignoreというオプションを.pryrcに設定することで、入力内容をpry_historyに記録しないようにすることができるそうです。


.pryrc

Pry.config.history.histignore = [

/hist*/,
"ls",
"exit"
]

文字列や正規表現をArrayとして指定して、それらのどれか一つに入力行が合致すれば履歴への記録が行われません。下記のコードはpryが入力行を無視するかどうかを判定している部分のコードです。


lib/pry/history.rb

def should_ignore?(line)

hist_ignore = Pry.config.history.histignore
return false if hist_ignore.nil? || hist_ignore.empty?

hist_ignore.any? { |p| line.to_s.match(p) }
end



インストール

2016/02/12にpryのmasterブランチにマージされた機能なので、rubygemsからインストールできる現時点の最新版(0.10.3)にはまだ含まれていません。そのためgithubからインストールする必要があります。

自分でcloneしてビルドしてインストールしてもいいのですが、1コマンドで全部やってくれるspecific_installというgemを使いました。(gitプロトコルには対応してないのでhttpsを指定して下さい)

gem install specific_install

gem specific_install 'https://github.com/pry/pry'

Bundlerの環境だけにインストールしたい場合は、Gemfileにgithubのリポジトリを指定してbundle installもしくはbundle updateして下さい。


Gemfile

gem 'pry', :git => 'git://github.com/pry/pry'



設定

行頭にスペースを入力した行は、履歴に記録されないようにしたいと考え、下記のような設定を試してみました。


.pryrc

Pry.config.history.histignore = [

/^\s.*$/
]

しかし、これだけでは行頭にスペースを入力しても履歴にしっかり記録されます。pryが自動インデントのために行頭スペースを削除した後、histignoreオプションの判定が行われているからのようです。

auto_indentをオフにすることで上記問題は回避可能だったのですが、私の場合は自動インデントを捨ててまで、行頭スペースにこだわりがあるわけじゃなかったので、行頭にセミコロンを入力した時に履歴を記録しないように設定しました。その他にhistoryコマンドやlsコマンドも無視するようにしています。


.pryrc

Pry.config.history.histignore = [

/^\s*;.*$/,
/^(hist|history)(\s|$)/,
/^ls(\s|$)/,
"exit"
]

一つ注意点としては、行頭にセミコロンを入力した場合、その行はRubyのコードとして認識されるため、セミコロンに続いてpryコマンドを入力してもSyntax Errorになります。(詳しくはこちら)  そのため上記設定では、特定行のpryコマンドだけ履歴に保存しないということは残念ながら出来ません。


参考資料

Feature/add histignore by bronzdoc · Pull Request #1484 · pry/pry

Command system (pry/pry Wiki)

rdp/specific_install