Emacs の shell で動作するユティリティコマンド群です。
本コマンドを作成した後、emacs lisp のみで動作する次の設定を考えました。こちらの方が お手軽に使えると思いますので、併せて確認ください。
emacs 上の shell で peco もどきを実現するコマンドです。データの絞り込みに helm を 利用しています。
WSL で peco を利用するには Windows 10 1803 以降が必要なようですが、本コマンドには この制限はありません。
emacs が emacsclient と通信できるようになっており、helm が設定されていれば利用 可能です。同期バージョンと非同期バージョンがあり、それぞれ以下の特徴があります。
コマンド名称 | 動作種別 | 特徴 |
---|---|---|
epeco-async | 非同期 | ・入力するデータを全て取り込む前にコマンドが起動します |
〃 | 〃 | ・migemo は使えません |
〃 | 〃 | ・emacs を起動しているホストでのみ利用できます |
epeco-sync | 同期 | ・入力するデータを全て取り込んでからコマンドが起動します |
〃 | 〃 | ・migemo が使えます(要 cmigemo) |
〃 | 〃 | ・tramp で接続した先でも利用できます(emacsclient は必要) |
使うコマンドを epeco という名称でシンボリックリンクしてお使いください。
epeco [-q query] [file] epeco -h
絞り込み文字列の初期値を設定するオプションです。
tramp の接続先から epeco-sync や以降で紹介する einp を使う場合は、以下の設定を行ってください。
1)emacs を起動しているホストの ~/.ssh/config に以下のような設定を行う
Host <aliasname> HostName <hostname> Port <portno> # 必要であれば User <username> RemoteForward /tmp/server /tmp/emacs1000/server # 1000 の数字は、id -u の値に置き換える
※ OpenSSH 6.7 でサポートされた Unix domain socket forwarding の機能を使っています
2)tramp の接続先の ~/.bashrc に以下の設定を行う
if [ -S /tmp/server ]; then mkdir -p /tmp/emacs$(id -u) mv /tmp/server /tmp/emacs$(id -u) fi
3)以下のコマンドを発行してコネクションをクリアしてから、<aliasname> に tramp で再接続し、 M-x shell で shell を起動する
M-x tramp-cleanup-all-connections
4)コマンドパスの通ったディレクトリ(~/bin 等)に epeco-sync と einp(以降で説明)を複写し、 以下のコマンドにより、epeco コマンドを利用できるようにする
cd ~/bin ln -s epeco-sync epeco
5)以降の使用例を参考に、コマンドを利用する
注)接続先への ssh 接続は、tramp を介して行うようにしてください。(dired でリモートホストを 開き、そこで M-x shell を実行する。)ローカルホストで起動した shell から ssh コマンドで リモートホストに接続しても、本コマンドは利用できません。また、ssh コマンドでリモートホスト に接続してしまった場合は、3)を再実行してください。
sleep 1000 & sleep 2000 & sleep 3000 & ps -ef | epeco | awk '{print $2}' ps -ef | epeco | awk '{print $2}' | xargs -r kill find . -type d -name '.*' -prune -o -type d -print | epeco find . -type d -name '.*' -prune -o -type d -print | epeco | xargs -i emacsclient -n {} history | tac | epeco | cut -b8- eval "$(history | tac | epeco | cut -b8-)" # xargs を使うと、cd などが上手く実行できない ghq list | epeco | cut -d '/' -f 2,3 ghq list | epeco | cut -d '/' -f 2,3 | xargs -r -L 1 hub browse docker ps -a | epeco | awk '{print $1}' docker ps -a | epeco | awk '{print $1}' | xargs -r docker rm docker images | epeco | awk '{print $3}' docker images | epeco | awk '{print $3}' | xargs -r docker rmi
helm は M-a で全選択が機能しますので、候補を絞った後に利用すると便利です。
epeco-sync は ansi-term など shell-mode 以外の shell では動作しません。 epeco-async は shell-mode 以外の shell でも動作しますが、以降で紹介する einp と組み合わせて 利用する場合、shell-mode の shell が必要となります。
helm の source の設定方法については、以下を参照してください。
ghq、hub の説明は以下のあたりを参照してください。 hub browse で利用する BROWSER 環境変数の設定は、cygstart、wslstart、xdg-open などを指定する のが便利かと思います。
外部端末で peco を動かすラッパーが以下で紹介されています。emacs の環境下で peco そのものを使いたい場合は、こちらの利用を検討ください。
emacs でコマンドヒストリを使う方法としては以下の方法もあります。tramp の接続先でも 動作しますし、接続先に emacsclient が必要なく、tramp の接続であれば ssh の接続に 限らない(docker-tramp.el による docker exec の接続でも利用可能)などのメリットも あります。こちらの利用も検討ください。
- https://www49.atwiki.jp/ntemacs/pages/35.html
- https://qiita.com/kai2nenobu/items/7af012e327b8dd078ba4
emacs 上の shell-mode で動作する、コマンド入力を支援するコマンドです。コマンドが標準入力で 受け付けた文字列を次に実行するコマンドとして登録します。
epeco と組み合わせて利用することを想定して作成しました。emacs が emacsclient と通信できる ようになっていれば利用可能です。
einp [-s] einp -h
標準入力から受け付けた文字列が複数行の場合、一行のコマンドに変換して登録します。
echo ls | einp echo -e "ls\nls" echo -e "ls\nls" | einp echo -e "ls\nls" | einp -s sleep 1000 & sleep 2000 & sleep 3000 & ps -ef | epeco | awk '{print $2}' | xargs -r echo kill ps -ef | epeco | awk '{print $2}' | xargs -r echo kill | einp history | tac | epeco | cut -b8- history | tac | epeco | cut -b8- | einp history | tac | epeco | cut -b8- | einp -s ghq list -p | epeco | xargs -r -L 1 echo cd ghq list -p | epeco | xargs -r -L 1 echo cd | einp ghq list | epeco | cut -d '/' -f 2,3 | xargs -r -L 1 echo hub browse ghq list | epeco | cut -d '/' -f 2,3 | xargs -r -L 1 echo hub browse | einp docker ps -a | epeco | awk '{print $1}' | xargs -r echo docker rm docker ps -a | epeco | awk '{print $1}' | xargs -r echo docker rm | einp docker images | epeco | awk '{print $3}' | xargs -r echo docker rmi docker images | epeco | awk '{print $3}' | xargs -r echo docker rmi | einp
よく使うコマンドを alias 設定しておくのが良いと思います。
alias ek="ps -ef | epeco | awk '{print \$2}' | xargs -r echo kill | einp" alias eh="history | tac | epeco | cut -b8- | einp -s" alias egc="ghq list -p | epeco | xargs -r -L 1 echo cd | einp" alias egb="ghq list | epeco | cut -d '/' -f 2,3 | xargs -r -L 1 echo hub browse | einp" alias edp="docker ps -a | epeco | awk '{print \$1}' | xargs -r echo docker rm | einp" alias edi="docker images | epeco | awk '{print \$3}' | xargs -r echo docker rmi | einp"
helm は M-a で全選択が機能しますので、候補を絞った後に利用すると便利です。
ansi-term など shell-mode 以外の shell では動作しません。