Archive for the ‘Unix’ Category

terminal

ターミナルの、あるディレクトリの中で同じ接頭辞のならんだファイル群をvimで編集しようとするとき、ターミナルの予測(タブキー)を叩きまくるのが面倒です。

具体的にはこんな状態

_hoge_hoge
_hoge_fuga
_hoge_piyo
_hoge_piyo_hage

この場合、タブを押す回数は2〜3度でよいのですが、もっと名前が重複する場合もあるし、そういったファイルに何度もアクセスする場合、面倒になります。

特に括弧とかスペースを含むファイル名を選ぶのは面倒くさくてしょうがねえっていう。

(まあvim内部のヒストリー使ったりとか、シェルのヒストリー使ったりしたらって話にもなるかと思いますが、それはおいといて)

ということで、フィルタリングソフトウェアのfzyによってインクリメンタルサーチを使って開きたいファイルを指定する方法を思いついたところ、かなり使い勝手が良かったのでお知らせします。

これはenhancdを使ってるといに思いつきました。

GitHub - b4b4r07/enhancd: A next-generation cd command with an interactive filter

まず、fzyをインストールします。

GitHub - jhawthorn/fzy: A better fuzzy finder

あとは

vi `ls | fzy`

とするだけで、その階層のファイル群がリストされるので、そのままタイプするとインクリメンタルサーチが出来て、選択したものが自動的にvimに渡されます。

.zshrc(.bashrc)には

alias vi='vim `ls | fzy`'

と書いておけばviと入力するだけでfzyを使ったファイルの選択画面に入ることができます。

こんな感じ

fzy_vi2

mvとかcpとかのファイル操作系のコマンドも、全部フィルタリングを使って実行できるようになるといいのになーと思うんだけど、対話的になると意味がない(面倒くさい)し…

と思いつつ作ってみた

#!/bin/bash

file=$(ls | fzy)
read -p "destination?:" dest
cp $file $dest

動くけど使える気がしない

ってなるとせいぜいこんな感じか

cp `ls | fzy` dest
※dest:保存場所

まあ括弧とかスペースとか混ざった日本語ファイルに対しては有効そうな。

と思ってスペース付きのファイルでやってみたら、ファイルネームのスペースがデリミタと認識されて動きませんでした。IFSでデリミタを変更してもいいのかも知れませんが、ちょっとそれはどうかと

色々試した結果、一旦ファイル名を変数に保存してやれば動きました

file=$(ls | fzy);echo $file | xargs -I@ cp @ dest

なんだこれっていうw

追記

このことを
dyama's pageの管理人のdyama氏に話したところ
こういうのどうかなってことで下記のスクリプトをご提案いただきました。

$ cp "$(ls | fzy)" $(cat)

このスクリプトを実行すると、最初にカレントディレクトリのリストを選択画面に入って、その後入力待ちの状態のときに新しく設定するファイル名を入力してC-d(ctrl+d)で抜けるとそのファイル名でコピーがなされます。

catの標準入力をそのまま標準出力とする機能を用いて実現している方法なので、ディレクトリの予測補完などが使えないのが玉にキズであるとはいえ、十分にシンプルで使えそうなものになりました。ありがとうdyama氏。

これをcpe(cp-extended)コマンドとかで登録しとくと、便利なときもあるかも知れないね!

terminal

前回の記事

lftpで自動的にcdとlcdコマンドを使って環境を合わせる方法 » WisdomTrees : http://wisdomtrees.net/?p=707

の続きです。

lftpで自動的に目標のサーバーへmirror出来るようになったので、更に発展させてローカルでの編集を監視して、即座にサーバーに反映させるような仕組みを作りました。

まず前回作ったコマンドを使ってlftp mirrorをする仕組みをシェルスクリプト化します。

#target_mirror.sh
#!/bin/sh

lftp -c 'connect XXX; cd /target/Dir/; lcd ~/Dropbox/target/Dir/; mirror -R'

そしてディレクトリの監視には、fswatchというソフトを使います。

brew install fswatch

でinstallできます。

Linux環境だと似たようなのにinotify-toolsというものがあるようです。

あとは、自分が編集しているディレクトリを監視させて、変更があった場合にはtarget_mirror.shを実行する仕組みを作ります。

fswatch -o ~/Dropbox/target/Dir | xargs -n1 -I{} target_mirror.sh

これで、ファイルを保存したタイミングで自動的にlftp mirrorコマンドが実行され、ローカルの変更が即座にリモートに反映されます。

terminal

継続的に開発をするサーバーについては、lftpでsftp接続をしてMirrorコマンドを使ってやる事があります。

毎回 lftpで接続した後に指定のディレクトリに移動して、ローカルディレクトリも合わせて、

$ lftp mirror -R

などをするのがつらくなってきたので自動化の方法を探しました。

まず、lftpで通常どおりサーバーに接続し、そこをbookmarkしてあげます。

$ lftp add bookmark XXX

次に、

$ lftp -e 'connect XXX; cd /target/Dir/; lcd ~/Dropbox/target/Dir/'

と -e オプションを使う事によって、こんな風にリモート、ローカルともにディレクトリ移動を自動化できます。
-eオプションはlftpから抜けないので、そのままlftp内で操作を継続できます。
反対に、-cオプションを使うと、lftpから抜けてしまいます。

mirror -Rをするのだけが目的であれば

$ lftp -c 'connect XXX; cd /target/Dir/; lcd ~/Dropbox/target/Dir/; mirror -R'

としても良いかもしれませんね。