やっぱり良かったpeco + ghq

やっぱり良かったpeco + ghq

2ヶ月前にzshからfishに乗り換えたんですよ。その時に手引き系の記事を漁っていたらghqっていうツールをちらほら見かけたんです。その時は「は?んなもん要らん!」って思ってスルーしたんですね。あの時の俺、青かったよ。蒙古斑モノ。というわけで、ghqのお陰で作業が幾ばくか効率化したのでオススメしたい、という記事です。

蛇足。fishに乗り換えて2ヶ月経つけど、すごくいいですよ。特に補完。過去に打ったコマンドを前方一致で出してくれんの。「ああ、それそれ。」ってなったら、右キーを押せば入力される仕組みです。それと、シンタックスハイライト。存在しないコマンドをエンター打つ前に色で教えてくれたりするから、ターミナルの履歴を汚さなくていい。ただbashとかと一部構文が大きく違ったりする点があまり好きじゃないです。

閑話休題。

ghqはgitリポジトリのクローンを楽にしつつ、クローン先を統一するツールです。例えば以下のように実行します:

<span id="353c" class="pz om io pk b gz qa qb m qc qd">ghq get <a class="ag hb" href="https://github.com/motemen/ghq" rel="noopener ugc nofollow" target="_blank">https://github.com/motemen/ghq</a></span>

そうすると、~/.ghq/github.com/motemen/ghq にクローンされます。勝手にディレクトリを分けて管理してくれる訳です。デフォルトのクローン先はもちろん設定で変えられます。

で、これだけなら別にイラネェじゃんって思ってたんですよ。ただ最近、これ無いと辛いなと思うことがちょくちょくあったんです。ライブラリを改造したりコントリビュートするためにクローンしたリポジトリが、色んな所に散在して収集がつかなくなりつつあったためです。

ghqを使えば、どこにクローンするか・したか迷う必要がありません。そこが良いなと気づきました。しかしghqはqwertyで打ちにくいよ。エイリアス張れってか。

んで、ghqで整理できるようになったものの、問題があります。大量にクローンしたリポジトリを探すのがめんどいじゃないですか。pecoさんはそれを解決してくれるツールです。とりあえず騙されたと思ってインストールしてください:

<span id="7c23" class="pz om io pk b gz qa qb m qc qd">brew install peco # on macOS<br></br>choco install peco # on Windows</span>

pecoはリストをフィルタする汎用的なツールです。なので色々なことに使えます。例えばコマンド履歴を部分一致で探したりとか、超便利な使い方ですね。fishでは以下のように設定します。.config/fish/functions/peco_select_history.fish:

<span id="6cdf" class="pz om io pk b gz qa qb m qc qd">function peco_select_history<br></br> if test (count $argv) = 0<br></br> set peco_flags --layout=bottom-up<br></br> else<br></br> set peco_flags --layout=bottom-up --query "$argv"<br></br> end</span><span id="4b66" class="pz om io pk b gz qf qb m qc qd">history|peco $peco_flags|read foo</span><span id="8a1c" class="pz om io pk b gz qf qb m qc qd">if [ $foo ]<br></br> commandline $foo<br></br> else<br></br> commandline ''<br></br> end<br></br>end</span>

.config/fish/config.fish:

<span id="9be6" class="pz om io pk b gz qa qb m qc qd">function fish_user_key_bindings<br></br> bind \cr peco_select_history # Bind for peco select history to Ctrl+R<br></br>end</span>

これで Ctrl+Rでhistory コマンドの履歴をpecoでフィルタできるようになりました。

じゃあghqでクローンしたリポジトリ群もpecoで探せるようにしましょう。.config/fish/functions/peco_change_directory.fish:

<span id="d909" class="pz om io pk b gz qa qb m qc qd">function _peco_change_directory<br></br> if [ (count $argv) ]<br></br> peco --layout=bottom-up --query "$argv "|perl -pe 's/([ ()])/\\\\$1/g'|read foo<br></br> else<br></br> peco --layout=bottom-up |perl -pe 's/([ ()])/\\\\$1/g'|read foo<br></br> end<br></br> if [ $foo ]<br></br> builtin cd $foo<br></br> else<br></br> commandline ''<br></br> end<br></br>end</span><span id="8654" class="pz om io pk b gz qf qb m qc qd">function peco_change_directory<br></br> begin<br></br> echo $HOME/.config<br></br> ls -ad */|perl -pe "s#^#$PWD/#"|egrep -v "^$PWD/\."|head -n 5<br></br> sort -r -t '|' -k 3 ~/.z|sed -e 's/\|.*//'<br></br> ghq list -p<br></br> ls -ad */|perl -pe "s#^#$PWD/#"|grep -v \.git<br></br> end | sed -e 's/\/$//' | awk '!a[$0]++' | _peco_change_directory $argv<br></br>end</span>

.dotfiles/.config/fish/config.fish:

<span id="281b" class="pz om io pk b gz qa qb m qc qd"># peco<br></br>function fish_user_key_bindings<br></br> bind \cr peco_select_history # Bind for peco select history to Ctrl+R<br></br> bind \cf peco_change_directory # Bind for peco change directory to Ctrl+F<br></br>end</span>

Ctrl+F でディレクトリの移動履歴とghqのリストがpecoに流れます。確定と同時にchdirされます。とても・・便利です。これで「あれ〜?あれどこにクローンしたっけ」とディレクトリを彷徨うことが無くなりました。

ちなみにどちらも作者は日本人です。凄いですね。尊敬します。

Read more

ノート駆動AIコーディング術の提案

ノート駆動AIコーディング術の提案

どうもTAKUYAです。みなさんはAIエージェントを普段のコーディングで活用されていますか。ちょっと面白いワークフローを思いついたのでシェアします。それは、ノート駆動のエージェンティック・コーディング・ワークフローです。最近Claude Codeのプランモードを使っていたら、ターミナル内で生成されたプランを読むのが辛かったんです。それで、じゃあMarkdownノートアプリであるInkdropをプランの保存先バックエンドとして使えば解決するんじゃないかと思って、 試してみました。こちらがそのデモです(英語): こちらがClaude Codeの設定ファイル群です: GitHub - inkdropapp/note-driven-agentic-coding-workflow at devas.lifeComplete Claude Code configuration collection - agents, skills, hooks, commands, rules, MCPs. Battle-tested configs from an Anthropic hackathon w

By Takuya Matsuyama
2025年個人開発活動の振り返り

2025年個人開発活動の振り返り

どうもTAKUYAです。もう1月も半ばに差し掛かっているけど、2025年の自分の活動の振り返りをしたい。去年を一言で言うなら、本厄を満喫した年だった。 厄年とは、人生の節目にあたって、体調不良や災難が起こりやすいと経験的に言われる年齢のこと。数え年で42歳、確かにもう若さに任せた事は出来ないなと痛感した年だった。(ところであなたの国ではこのような年はありますか?) 夏に体調を崩して2~3ヶ月動けなくなった 暖かくなり花粉が飛び出した頃に、持病のアトピーが悪化しだして、まともに生活出来なくなってしまった。酷さで言うと、2019年に脱ステした時と同じぐらい。 脱ステに無事成功したから、この地獄は二度と味わうことはないだろうと高を括っていたが、まさか7年後にまた味わうとは思わなかった。当時の独身時代と違い、妻も子供もいる中で、周りに多大な迷惑をかける事となった。夏の子供との思い出が全く無い。悲しい。 現在はQoLもほとんど元の状態まで復活できた。写真を撮って症状の変化を記録したので、機会があればシェアしたい。食事療法など色々試したが、結局歩くのが一番自分に効いた。それ以来、一日一万歩

By Takuya Matsuyama
書いて、歩け!なぜノートアプリはシンプルで充分なのか

書いて、歩け!なぜノートアプリはシンプルで充分なのか

どうもTAKUYAです。今回はノートやメモから新しい発想を生むための考え方についてシェアします。 自分はシンプルさをウリにした開発者向けのMarkdownアプリInkdropを作っています。なので、どうしても「ノートアプリの作者」としてのポジショントークが含まれてしまいますが、逆に言えば、「ノートアプリを約10年間作り続けてきた人間が、どうやってアイデアを生み出しているのか」 という実際的な体験談として読んでもらえれば幸いです。 結論から言うと、僕は「アプリ上でノート同士を連携させる必要はない。繋げるのはあなたの脳だ」と考えています。本稿では、ノートアプリの機能に溺れずユニークなアイデアを考え出すために僕が実践している事をシェアします。 TL;DR * ノート整理に時間をかけるな。グループ化で充分だ * すごい人はアイデアが「降りてくる」のを待つ * プログラミング × 料理動画 という有機的な掛け合わせ * ノートは「忘れる」ために書く * 歩け! ノート整理に時間をかけるな。グループ化で充分だ 巷ではZettelkastenなどが流行っているようですね。これ

By Takuya Matsuyama
貫禄を捨てて愛嬌で生き延びろ!40代オッサンの生存戦略

貫禄を捨てて愛嬌で生き延びろ!40代オッサンの生存戦略

どうもTAKUYAです。 つい先週(11月19日)に誕生日を迎え、41歳になりました。40代と言うのは若い頃には想像もしなかった年代で、どう生きれば良いのかというイメージがあまり具体的に湧かない、曖昧な年齢ではないでしょうか?自分の父親を想像するも、日中はいつも仕事でいなかったのであまり参考になりません。 自分は個人開発で生計を立てていて20代、30代で積み上げて来たものが上手く実を結んだおかげで今の生活があります。育児にも、いわゆるサラリーマンよりかは柔軟に参加できていて、子供との時間も沢山取れています。ママ友も出来ました(迷惑かけっぱなしですが)。 本記事では、そんなライフスタイルを送る自分が40代で大事にしたいことについて書きたいと思います。タイトルにもある通り、結論から言うとそれは「愛嬌」だと思います。以下、中年男性の愛嬌の重要性について説明します。 TL;DR * 「貫禄が出てきたね」と言われたら注意 * 笑顔を作れ。オッサンがムスッとしてたら普通に怖い * 謙虚に振る舞え。実績を積むと周りが萎縮する * ギャップ萌えを活用しろ 「貫禄が出てきたね」と言わ

By Takuya Matsuyama