世界を動かす技術を、日本語で。

HNを表示: Janetで書かれたWindows用タイル型ウィンドウマネージャー

概要

  • Jwno はWindows 10/11向けの高いカスタマイズ性を持つ タイル型ウィンドウマネージャ です
  • Janet言語 で構築され、 Lispランタイム とWin32 APIラッパーを搭載しています
  • キーボード操作 主体で、スクリプトによる自由な拡張が可能です
  • UIヒント機能 やREPL、Emacsとの連携など高度な機能を提供します
  • ドキュメントは現在 執筆中 で、一部リンクは未完成です

Jwno: Windows向け高度カスタマイズ型タイル型ウィンドウマネージャ

概要と特徴

  • Jwno はWindows 10/11専用の タイル型ウィンドウマネージャ であることを明示
  • Janet言語 で開発されており、Lisp系の 括弧表現 による柔軟な構成が可能
  • 完全なLispランタイム を内蔵し、 Win32 API の薄いラッパー(jw32)を利用できることを強調
  • キーボード駆動 で、マウスをほとんど使わずにウィンドウ管理を実現することを提案
  • スクリプトによる拡張 やカスタマイズが容易で、ユーザー独自のワークフロー構築を推奨

UIヒント機能とインタラクション

  • UIヒント機能 を使い、画面上のUI要素と直感的に インタラクション することが可能
  • Emacsフレーム やJwno自身のREPLウィンドウを効率的に管理することを確認
  • キーボードショートカット やヒントによる素早いウィンドウ切り替えを推奨
  • 可愛い猫の画像 など、遊び心のあるUIも導入可能であることを示唆
  • 作業効率向上 と楽しさの両立を目指すことを提案

開発背景とコミュニティ

  • Janet言語 のコミュニティの熱意と言語自体に感銘を受けて開発を開始したことを説明
  • Windows向けの 理想的なタイル型ウィンドウマネージャ を求めてJwnoを独自開発した経緯を共有
  • Linux環境では StumpWM を利用していることを補足
  • コミュニティ参加 やフィードバックを歓迎する姿勢を表明
  • ドキュメントは 進行中 であり、未完成ページが存在することを注意喚起

関連リンク

今後の展望

  • ドキュメント整備 や機能追加を継続すること
  • ユーザーからの提案・フィードバック を積極的に受け入れること
  • Windows環境での生産性向上 とカスタマイズ性の追求を続けること
  • Janetコミュニティ との連携を強化すること
  • 新機能や拡張例 の共有を推進すること

Hackerたちの意見

ちょっと気になるんだけど、JanetやLisp風の言語だからこそやりやすいことってあった?それとも単に使ってみたかっただけ?(もちろんそれも全然アリだけど!)いろんなLispの方言を試してみたけど、今使ってる他の言語に対して特別な特徴を見つけられなかったんだ。自分が使ってる言語の理由は説明できるんだけど、わかるかな。

REPLとインタラクティブな開発ワークフローは本当に貴重だと思う。ウィンドウマネージャは本質的に長時間動作するバックグラウンドサービスで、たくさんのランタイム状態が蓄積されるからね。プロセスが動いている間に中を覗いてデバッグできる能力は、Jwnoを作るときにすごく助けになった。JwnoのREPLモジュールはすごく重要だと思ってて、動かすためにアーキテクチャを一度変更したこともあるよ。

他の言語に対して特別な特徴を見つけられなかったんだ。冗談か釣りなの?構造編集とREPLはLispの最高の特徴だよ。どんな式でもつかんで動かせる能力は、コーディングやリファクタリングをすごく簡単にしてくれる。接続されたREPLを使えば、その場で何でも評価できるから、コーディングの体験がまるでビデオゲームみたいになるんだ — リンターやリンカー、コンパイラを待つ必要がなくて、ただ実行するだけ。保存すらしなくてもいいことが多いよ。「いろんなLispの方言を試した」と言っても、構造編集や接続されたREPLを使わなかったんじゃないかな?よく人はLispのREPLを他のプログラミング言語のREPL(例えばPython)と混同するけど、通常はコードの塊をコピー&ペーストしないといけないからね。LispのREPLは、Read-Eval-Print-Loopの各ステップが違うって意味で違うんだ — Lispでは、通常その場でタイプしたところで評価して、接続されたREPLに全体の式を送るから、リモートでも可能なんだ。私たちのは(例えば)Kubernetesクラスターで動かしていて、ポッドで実験したり、「リアル」なDBテーブルに対してクエリを実行したり、サービスを「ライブ」でテストしたりできるんだ。

カスタムコマンドやフックを実装してトリガーすることができるよ。自分の実装の中でネイティブのWin32 APIを呼び出すことも可能だよ。例えば、Notepadのウィンドウを常に画面の(100, 100)座標に移動させるために、低レベルのSetWindowPos関数を使うことができる。素晴らしい仕事だね。すごく興味深くて役に立ちそう。Lispを書くいい口実にもなるし。APIが高レベルの機能を提供しつつ、必要なときには低レベルのAPIも使えるようにしてくれるのは本当にありがたいよね。

WMの中にスクリプト言語があることで、SwayスタイルのIPCではなくてどんな自動化が可能になるの?新しいWindowsのWMが純粋なワークフローの進化が起こる場所だと聞いたから、Linuxでも再現できるのか気になるな。

Janetは本当に素晴らしいね。このプロジェクトもすごくクールだ。Windowsはもっと強力なビルトインマネージャが絶対に必要だよ。マウスをずっと使うのは馬鹿げてる。

後のPowerToysのアップデートの一つが「ファンシーゾーン」で正しい方向に一歩踏み出してるよ。厳密にはネイティブのWindowsではないけど、Microsoftが開発したもので、全てのユーティリティにキーボードショートカットを追加してる。

Windowsはもっと強力なビルトインマネージャーが絶対必要だよ。いつもマウス使うのは馬鹿げてる。でも、Windowsのウィンドウ管理はmacOSよりずっと進んでると思う。最近まで、macOSはサードパーティのアプリを使わないと基本的な最大サイズ機能すらなかったなんて、ほんとにおかしいよね。

ウィンドウを移動させるのにマウスは使わないよ。Windowsキー + 矢印キーで十分だし、マルチモニターでも問題ない。画面を半分や4分の1に分けられるしね。フォーカスを変えるのはAlt + Tabで。

うわ、めっちゃクールだね。WMが大好きだし、Lispも大好き、でもWindowsは大嫌い。これが自分のフラストレーションに対する完璧な「薬」みたいだ。

タイルマネージャーではないけど、ちょっと関連してる話:前にSpectacle/Rectangle(macOSアプリ)をWindowsで再現して、ウィンドウを端や隅、2/3や1/3にスナップできるようにしたんだ。興味があったらどうぞ: https://github.com/ahmetb/RectangleWin/blob/main/README.md

Rectangle大好き!絶対チェックしてみるよ!

長いことStumpWMを使ってたけど、数年前にWindowsに戻ったんだ。これを見るのはすごくワクワクするし、試してみるつもり。ウィンドウの配置や切り替えに関する大きな不満を解消してくれるかもしれない。モニターの形や解像度が標準のWindowsの分割には最適じゃないみたいなんだ。(特にブラウザは、フルスクリーンで使うことがどんどん少なくなってる。すべてを短い行に詰め込む「可読性のために」っていうイライラするトレンドは、画面スペースを無駄にしてるだけだし、ズームすると全部大きすぎるし、開くページごとにユーザースタイルやユーザースクリプトを書くのに疲れちゃったから、2、3カラムのウィンドウを使うことに戻ったよ。)それに、もっとLispを使う理由があるのはいいね。スクリーンショットを見る限り、素晴らしい感じだし、もし思った通りに動けばすぐに乗り換えるつもり。

同じくStumpWMユーザーだね!でも、私のStumpWMはかなりカスタマイズしてるから、Jwnoの挙動は自分の設定を参考にしてるんだ。だから、君が期待してたものとは全然違うかもしれない。でも、それがLispやLispで作られたものの好きなところの一つなんだ:すごく柔軟で、元のものに基づいて何かを作ることができるけど、元のものとは全然違う感じになることもある。> 私のモニターは標準のWindowsの分割には最適じゃないみたいだね。ウルトラワイドを使ってるの?その場合、Jwnoにはウルトラワイドのサポートはないけど、クックブックに調整するセクションがあるよ。[1]: https://agent-kilo.github.io/jwno/cookbook/adjust-top-level-...

あのUIヒント機能は最高だね。他にこのリポジトリ以外で似たようなものはあるの?

同意するよ、すごい印象的だね。初期のWindowsを思い出させる。あの頃はキーボード操作がUIの一級市民で、ほとんどの機能にダイアログごとに専用のAltキーのコンボがあったから。

Janetを学ぶためにどんなリソースを使ったの?それとも、前からLispは知ってたの?PythonやPHPから来た自分には「Janet for mortals」がめっちゃ難しかったよ。クロージャーやマクロが何か知ってるのが前提みたいだったし。

タイル型ウィンドウマネージャーを使った経験から言うと、確認ボックスみたいなモーダル画面や、GIMPのインターフェースみたいなデタッチャブル/ドッカブルのミニコンテナを判断するのが難しいんだよね。そういうのを新しいタイル可能なウィンドウとして考えると、逆に生産性が下がることが多い気がする。

LinuxでAwesomeWMを使ってもう10年以上になるよ。例えば、GIMPは全く問題なく動くし、生産性の向上がすごい。もう他の作業をするのが難しいくらい。あまり害になるプログラムに出くわさないしね。特に、異なる名前の複数のデスクトップを持ってると、手動で何十個もターミナルを探すよりも、ウィンドウをすごく早く整理できるんだ。今は、1メール、2ウェブ、3ギンプ、4チャット、5ノート、6ターミナル、7SSHクラスターって感じだよ。