MyEnigma

とある自律移動システムエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

Python製のフィルタリングツールpercolを使って、bashとROS生活を快適にする方法

目次

はじめに

Pythonにはpercolという、

標準出力のデータを、

簡単に選択してフィルタリングできるツールがあります。

github.com

 

このツールを使うと、

bashでの開発や、

ROSのCUIツールを便利にすることができたので、

いくつか紹介したいと思います。

 

初期設定の方法

まず初めに、percolをインストールします。

$ pip intall percol

 

続いて、

最新のLinux(自分の場合Ubuntu14.04)のbashでは不必要なのですが、

自分のMacの場合(OS X El Capitan 10.11.3)、

bashのバージョンが低くく、

percolの良い部分が使えなかったので、

下記の方法でMacのbashをアップデートしましょう。

(参考: Mac で homebrew の bash をログインシェルにする - Qiita)

 

まず、Homebrewで最新のbashをインストールします。

$ brew install bash

そして、シェルの設定をインストールしたbashに変更します。

$ echo '/usr/local/bin/bash' | sudo tee -a /etc/shells

$ chsh -s /usr/local/bin/bash

 

以上です、bashで

$ bash --version

と入力して、bashのバージョンが4.x.x以上になっていればOKです。

 

bashのhistoryをインタラクティブに検索して、入力する

f:id:meison_amsl:20160305213658p:plain

 

下記の記事のように、

通常のbashでもCtrl+rで履歴を検索出来ますが、

すこぶる使いづらいので、

percolを使って、使いやすくします。

myenigma.hatenablog.com

 

下記のコードをbashrcに貼り付けます。

#========history search=======
# 重複履歴を無視
export HISTCONTROL=ignoreboth:erasedups
#historyの保存の数を10000に
export HISTSIZE=10000

# settings for peco
_replace_by_history() {
    declare l=$(HISTTIMEFORMAT= history | sort -k1,1nr | perl -ne 'BEGIN { my @lines = (); } s/^\s*\d+\s*//; $in=$_; if (!(grep {$in eq $_} @lines)) { push(@lines, $in); print $in; }' | percol --query "$READLINE_LINE")
    READLINE_LINE="$l"
    READLINE_POINT=${#l}
}
bind -x '"\C-r": _replace_by_history'

 

すると、Ctrl+rをおした時に、

冒頭のスクリーンショットのように

自動でbashの履歴を元にpercolが開き、

あとは、一部のコマンドをタイプすれば、

リアルタイムで絞込検索してくれます。

あとは最終的なコマンドを選んで、

Enterを押せば、そのコマンドがbashに入力された状態になります。

非常に便利です。

 

rostopic listからpercolで選んで、rostopic echoする方法

f:id:meison_amsl:20160306095008p:plain

 

ROSを使っていると、rostopic echoは必須ですが、

いつもrostopic listして、

目的のtopic名を確認してから、

そのtopic名をrostopic echoの後ろに入力して、

トピックを確認していました。

 

しかし、それらの手順が面倒だったので、

percolで選んだトピックを、

即座にrostopic echoできるようにしました。

下記のコードをbashrcに追記し、

function _rostopicecho() {
    declare topic=$(rostopic list | percol --query "$READLINE_LINE")
    cmd='rostopic echo '$topic
    READLINE_LINE="$cmd"
    READLINE_POINT=${#cmd}
}
#bind しないと選んだ文字列が挿入されない
bind -x '"\C-e": _rostopicecho'

Ctrl-eを押すと、

冒頭のスクリーンショットのように

percolで現在のトピックリストが表示されるので、

表示したいトピックを選んで、Enterを押すと、

$ rostopic echo topicname

と入力された状態でbashに戻るので、

あとはEnterを押すだけで、

そのトピックをrostopic echoで見ることができます。

 

頻繁に使う機能なので、便利ですね。

下記の記事でも、zshで同様のことを実施しているので

参考になると思います。

 

参考資料

 

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com