以前にgetpassというコマンドを用意して、パスワード管理を行える簡単なコマンドラインツールを動かせるようにしました。クリップボードにコピーされました。クリップボードにコピーされました。IDやパスワードが得られます。2つの引数はaddpassという別のコマンドで任意に指定しています。手に馴染んでお気に入りなのですが、使い込むうちに不便も感じるようになってきました。キーボードを打つのが面倒くさいのです。個人のアカウントならば問題ないのですが、プロジェクトなどで用いると問題が浮上しました。ある場合がほとんど、それらを毎度覚えないとならないのです。学生時代の先輩が「ターミナルでは1文字打つごとにタブを押す!」と言っていたことを思い出し、タブ補完に挑戦することにしました。タブ補完ことはじめ以下のサイトが大いに参考になります。何かの間違いで先に私のサイトを訪れてしまった方は、今すぐ参考サイトへどうぞ。Qiita中心的役割を担うのはcompleteというコマンド。ビルトインコマンドのようです。my_commandタブ補完をさせたいコマンドmy_commandに対して、任意の関数_my_command_completionを作成して作用させる仕組み。my_commandしょうもないコマンドmy_commandを用意しました。これを使って進めることにします。補完用の関数では、変数COMPREPLYへ補完したい単語を配列で渡してあげる。tonikakuもうこれだけで候補が表示されます。候補はアルファベット順に並べ替えがされるみたいですね。補完させるここまででは候補を表示するだけで、補完して入力まではしてくれません。そこで次の3つを使います。入力内容から絞り込みを行なってくれる。補完関数の中で使える。ターミナルに入力された文字の配列。補完関数の中で使える。今カーソルをあてている単語の順番。compgenを単体で使ってみます。する、という意味でしょうか。始まるものを探して」といったところかな。タブ補完にグッと近づいた気がしてきました。これを補完関数の中に放り込み、かつ現在入力されている文字を受け取れりたいところですが、そこで$COMP_WORDSと$COMP_CWORDの出番。my_command${COMP_WORDS[COMP_CWORD]}で「現在入力されている文字」を受け取れます。私はここで少し戸惑い、腑に落ちるまで時間がかかりました。nanika"の部分を可変にします。my_command別段難しいことはなく、変数にしてあげれば良いですね。タブ補完とは本来的には関係のない話ですらありますね。ファイルだけを候補にする例を思い浮かびましたが、シェルで出来ることならなんでも良いと思います。ここで私が学んだことは、bashの変数はデフォルトでグルーバル変数だということです。ビルトインコマンドのlocalを使ってあげましょう、ということ。引数の順番にあわせて候補リストを変える今回は1つ目と2つ目の引数で補完させる内容を変えたいです。その時は$COMP_CWORDで条件分岐をさせればいけそうです。my_commandまったく実用性のない例になってしまいましたがご容赦。完成させる一般的なお話はここまで。今回の動機に則したgetpass用の処理をしていきます。完全にタブ補完と関係がありません。希望のデータをどうやって得るかという話。存在は知っていましたが、使わずに済ませたい気分だったので奮闘しました。getpassやりたいのは次のこと。欲しい前者はさらりと済みました。{を含む行だけを抜き出しました。後者はズブズブと沼にはまり時間がかかりました。awkを試したりheadとtailを組み合わせたり暗中模索。sedもawkも、覚えた端から忘れてしまいいつまで経っても身につかないのはなぜでしょう。最終的に、次のようにすれば、行をまたぎ最短一致で取得できることを知りました。"/ここから/,/ここまで/p"終わりに今回はまるで始めての試みでした。コピペで済ませず、ステップバイステップで進めたことで原理をしっかりと理解できました。おかげで、タブ補完の自作そのものはとても簡単シンプルだとわかりました。使っていこうと思います。素敵なコマンドライフを。