Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
t-sin
773 views
Common Lisp製のテキストエディタLemにフレーム多重化機能をつくった
Common Lisp製のテキストエディタにコントリビューションをしたので、その実装とかこぼれ話を発表しました。
Software
◦
Read more
1
Save
Share
Embed
Embed presentation
Download
Download to read offline
1
/ 31
2
/ 31
3
/ 31
4
/ 31
5
/ 31
6
/ 31
7
/ 31
8
/ 31
Most read
9
/ 31
10
/ 31
Most read
11
/ 31
12
/ 31
13
/ 31
14
/ 31
15
/ 31
16
/ 31
17
/ 31
18
/ 31
19
/ 31
20
/ 31
21
/ 31
22
/ 31
23
/ 31
24
/ 31
25
/ 31
26
/ 31
27
/ 31
28
/ 31
29
/ 31
30
/ 31
31
/ 31
More Related Content
PDF
Quine・難解プログラミングについて
by
mametter
PDF
RESTful Web アプリの設計レビューの話
by
Takuto Wada
PDF
現場で役立つシステム設計の原則
by
増田 亨
PDF
私にとってのテスト
by
Takuto Wada
PDF
SolrとElasticsearchを比べてみよう
by
Shinsuke Sugaya
PDF
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
by
Mikiya Okuno
PDF
Ponylangとこれからの並行プログラミング
by
matsu_chara
PDF
「Diameter勉強会 3」講義用スライド配布用 20141020
by
マジセミ by (株)オープンソース活用研究所
Quine・難解プログラミングについて
by
mametter
RESTful Web アプリの設計レビューの話
by
Takuto Wada
現場で役立つシステム設計の原則
by
増田 亨
私にとってのテスト
by
Takuto Wada
SolrとElasticsearchを比べてみよう
by
Shinsuke Sugaya
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
by
Mikiya Okuno
Ponylangとこれからの並行プログラミング
by
matsu_chara
「Diameter勉強会 3」講義用スライド配布用 20141020
by
マジセミ by (株)オープンソース活用研究所
What's hot
PDF
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
by
Koichiro Matsuoka
PDF
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
by
Recruit Technologies
PDF
オブジェクト指向の設計と実装の学び方のコツ
by
増田 亨
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
by
Koichiro Matsuoka
PDF
良い?悪い?コードコメントの書き方
by
Shigenori Sagawa
PDF
ビッグデータ処理データベースの全体像と使い分け
by
Recruit Technologies
PDF
フラグを愛でる
by
MITSUNARI Shigeo
PPTX
マルチクラウドDWH(Snowflake)のすすめ
by
Yuuta Hishinuma
PDF
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
by
Takahiko Ito
PDF
それはYAGNIか? それとも思考停止か?
by
Yoshitaka Kawashima
PDF
ドメイン駆動設計 分析しながら設計する
by
増田 亨
PDF
ドメイン駆動設計のためのオブジェクト指向入門
by
増田 亨
PDF
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
by
shinjiigarashi
PDF
MySQLの文字コード事情 2017版
by
Masahiro Tomita
PDF
例外設計における大罪
by
Takuto Wada
PDF
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
by
Koichiro Matsuoka
PDF
[AWS Summit 2012] 基調講演 Day2: Go Enterprise!
by
Amazon Web Services Japan
PDF
エンジニアという仕事を楽しみ続けるためのキャリア戦略
by
Shuichi Tsutsumi
ODP
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
by
pospome
PPTX
トランザクションをSerializableにする4つの方法
by
Kumazaki Hiroki
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
by
Koichiro Matsuoka
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
by
Recruit Technologies
オブジェクト指向の設計と実装の学び方のコツ
by
増田 亨
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
by
Koichiro Matsuoka
良い?悪い?コードコメントの書き方
by
Shigenori Sagawa
ビッグデータ処理データベースの全体像と使い分け
by
Recruit Technologies
フラグを愛でる
by
MITSUNARI Shigeo
マルチクラウドDWH(Snowflake)のすすめ
by
Yuuta Hishinuma
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
by
Takahiko Ito
それはYAGNIか? それとも思考停止か?
by
Yoshitaka Kawashima
ドメイン駆動設計 分析しながら設計する
by
増田 亨
ドメイン駆動設計のためのオブジェクト指向入門
by
増田 亨
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
by
shinjiigarashi
MySQLの文字コード事情 2017版
by
Masahiro Tomita
例外設計における大罪
by
Takuto Wada
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
by
Koichiro Matsuoka
[AWS Summit 2012] 基調講演 Day2: Go Enterprise!
by
Amazon Web Services Japan
エンジニアという仕事を楽しみ続けるためのキャリア戦略
by
Shuichi Tsutsumi
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
by
pospome
トランザクションをSerializableにする4つの方法
by
Kumazaki Hiroki
More from t-sin
PDF
続・SECDマシン
by
t-sin
PDF
SECDマシン 実装と動きとその他もろもろについて
by
t-sin
PDF
Common Lispっぽいものをつくっています
by
t-sin
PDF
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
by
t-sin
PDF
謎の言語Forthが謎なので実装した
by
t-sin
PDF
PythonでLispを実装した (evalつき)
by
t-sin
PDF
バッテリー強奪! PythonをCommon Lispから使う
by
t-sin
PDF
Common lispでグラフィックアート
by
t-sin
PDF
One - Common Lispでもワンライナーしたい
by
t-sin
PDF
Inquisitor -Common Lispに文字コード判定を-
by
t-sin
続・SECDマシン
by
t-sin
SECDマシン 実装と動きとその他もろもろについて
by
t-sin
Common Lispっぽいものをつくっています
by
t-sin
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
by
t-sin
謎の言語Forthが謎なので実装した
by
t-sin
PythonでLispを実装した (evalつき)
by
t-sin
バッテリー強奪! PythonをCommon Lispから使う
by
t-sin
Common lispでグラフィックアート
by
t-sin
One - Common Lispでもワンライナーしたい
by
t-sin
Inquisitor -Common Lispに文字コード判定を-
by
t-sin
Common Lisp製のテキストエディタLemにフレーム多重化機能をつくった
1.
Common Lisp製のテキストエディタ Lemにフレーム多重化機能をつくった t-sin (@sin_clav) 2020-08-27,
lispmeetup #89
2.
もくじ ● Lemについて ● フレーム多重化機能について ● Lemの描画関連用語について ● フレーム多重化機能対応でやったこと
3.
Lemってなんだ? ● Common Lisp製テキストエディタ
4.
Lemってなんだ? ● Common Lisp製テキストエディタ ● https://github.com/cxxxr/lem ● GNU Emacsのような操作感 ● vi-modeもある ● Common
Lispとの統合がよい
5.
フレーム多重化機能って? ● tmux ● あるいはGNU Emacsのelscreen ● 画面中のバッファ配置を複数記憶しそれらを 切り替えられる機能 ● つまりtmux
6.
フレーム多重化機能って? frame-multiplexerの ヘッダウィンドウ #付きが現在のフレーム
7.
Lemの描画関係用語 (ユーザが操作するもの) ウィンドウ モードライン バッファ ミニバッファ/エコーエリア floatingウィンドウ
8.
Lemの描画関係用語 (ユーザが操作するもの) ● ウィンドウ – 編集領域。C-x oで切り替えているアレ –
window-tree構造体により2分木で分割を表現 ● スクリーン – 各バッファの表示を抽象的に担当する構造体 ● 裏に具体的な描画を担当する「ビュー」がある(後述) – バッファとは1対他の関係(同じバッファを複数表示) ● バッファ – 編集内容を保持している構造体 – キー入力するとバッファの中身が書き換えられる
9.
Lemの描画関係用語 (実際に描画するためのもの) ● ディスプレイ – 描画している画面 – たとえば端末エミュレータなど ● ビュー –
スクリーンを実際の画面に表示するためのもの – スクリーンとは1対1の関係 ● フロントエンド – ディスプレイやビューの定義と描画を担当する – ncursesやelectronなど
10.
Lemの描画関係用語 (実際に描画するためのもの) Lem上のデータ構造 フロントエンド ビュー ビュー ビュー ビュー ディスプレイ ウィンドウ とスクリーン ウィンドウツリー
11.
フレーム多重化機能対応でやったこと ● 「フレーム」の概念をLemに追加 – ウィンドウ(つまり画面構成)を保持するもの ● Lemの描画処理をフレームに対して働くよう変更 – 起動時に1個のフレームを作成しておく ● フレームを複数持てるように拡張 –
仮想フレームって呼ぶことにした ● 切り替えコマンドを追加 – 大事
12.
フレーム多重化機能対応でやったこと ● 「フレーム」の概念をLemに追加 – ウィンドウ(つまり画面構成)を保持するもの ● Lemの描画処理をフレームに対して働くよう変更 – 起動時に1個のフレームを作成しておく ● フレームを複数持てるように拡張 –
仮想フレームって呼ぶことにした ● 切り替えコマンドを追加 – 大事
13.
フレームの概念を追加 ● 画面表示関係のグローバル変数を集約 ● frame構造体を作成 ● 以下のものを持つ – 現在操作しているウィンドウ – ウィンドウ構成(分割状態) –
ミニバッファのウィンドウ – ミニバッファのバッファ – 補完時に出てくるウィンドウ など…
14.
フレームの概念を追加 Lem上のデータ構造 フロントエンド ディスプレイ フレーム
15.
フレームの概念を追加 ● frame構造体 – 現在の「ウィンドウ」 – ウィンドウ構成(window-tree) –
ミニバッファ関連 – 補完時のfloatingウィンドウ – ヘッダウィンドウ – ウィンドウまわりのフラグ (defstruct frame ;; window current-window (window-tree nil) (floating-windows '()) (header-windows '()) (modified-floating-windows nil) (modified-header-windows nil) ;; minibuffer minibuffer-buffer echoarea-buffer (minibuffer-window nil) (minibuffer-calls-window nil) (minibuffer-start-charpos nil))
16.
フレーム多重化機能対応でやったこと ● 「フレーム」の概念をLemに追加 – ウィンドウ(つまり画面構成)を保持するもの ● Lemの描画処理をフレームに対して働くよう変更 – 起動時に1個のフレームを作成しておく ● フレームを複数持てるように拡張 –
仮想フレームって呼ぶことにした ● 切り替えコマンドを追加 – 大事
17.
フレームに対する描画処理 ● Lemの起動時に1個のフレームを作成 ● グローバル変数を使う処理が現在のフレームに 対して働くようにぜんぶ変更 ● 動作確認 – 大事
18.
フレームに対する描画処理(変更例) ● floating-windowに対する削除処理 – 前: グローバルな変数に対してsetf –
後: グローバルなフレームのスロットにsetf (defmethod %delete-window ((window floating-window)) (when (eq window (current-window)) (editor-error "Can not delete this window")) - (setf *modified-floating-windows* t) - (setf *floating-windows* - (delete window *floating-windows*))) + (setf (frame-modified-floating-windows (current-frame)) t) + (setf (frame-floating-windows (current-frame)) + (delete window (frame-floating-windows (current-frame)))))
19.
ここまでのPR ● https://github.com/cxxxr/lem/pull/500
20.
フレーム多重化機能対応でやったこと ● 「フレーム」の概念をLemに追加 – ウィンドウ(つまり画面構成)を保持するもの ● Lemの描画処理をフレームに対して働くよう変更 – 起動時に1個のフレームを作成しておく ● フレームを複数持てるように拡張 –
仮想フレームって呼ぶことにした ● 切り替えコマンドを追加 – 大事
21.
フレームを複数持てるよう拡張 ● やること – 「仮想フレーム」の用意 ● フレームを複数保持するスロット ● 現在表示中のフレームを置くスロット – 仮想フレームの描画処理の実装
22.
フレームを複数持てるよう拡張 ● 仮想フレームの用意 – フレームの配列 – 現在のフレーム –
ディスプレイ幅・高さ – 仮想フレームが変更されたかフラグ – 仮想フレームのヘッダ用バッファ ● (いまvfはvirtual-frameにリネームされてます) ● ディスプレイ-仮想フレームの対応表も追加 – ただのハッシュテーブル – キーはディスプレイ (現在は1つしかない) – Lemが複数の表示画面を持つときのため (defclass vf (header-window) ((frames) (current) (display-width) (display-height) (changed) (buffer)))
23.
フレームを複数持てるよう拡張 これが仮想フレーム 兼 ヘッダウィンドウ
24.
フレームを複数持てるよう拡張 ● vfはLemのヘッダウィンドウなので ● Lemのウィンドウ再描画メソッドを実装する必要あり ● 仮想フレームの描画処理 – ヘッダを描画 – 現在のフレームのウィンドウをぜんぶ描画 –
仮想フレームの描画フラグをnilに設定 (defmethod window-redraw ((window vf) force) ;; draw button for frames ... ;; redraw windows in current frame ... ;; clear all vf-changed to nil because of applying redraw ... (call-next-method))
25.
フレーム多重化機能対応でやったこと ● 「フレーム」の概念をLemに追加 – ウィンドウ(つまり画面構成)を保持するもの ● Lemの描画処理をフレームに対して働くよう変更 – 起動時に1個のフレームを作成しておく ● フレームを複数持てるように拡張 –
仮想フレームって呼ぶことにした ● 切り替えコマンドを追加 – 大事
26.
操作の実装とコマンドの定義 ● 基本的なフレーム操作 – フレーム多重化機能の起動・終了処理 – フレームの追加・削除 –
フレームの切り替え ● どの操作でも最後にvf-changedをtにする – 現在のフレームを変更した後に再描画させるため ● 操作用コマンド – toggle-frame-multiplexer – frame-multiplexer-create (C-z c) – frame-multiplexer-delete (C-z d) – frame-multiplexer-prev (C-z p) – frame-multiplexer-next (C-z n)
27.
操作の実装とコマンドの定義 (例) ● 仮想フレーム上のフレーム切り替え(前へ) – 仮想フレーム上の1つ前のフレームを探し、 –
そのフレームを現在のLemのフレームに設定し、 – 再描画フラグをtに設定する。 (define-command frame-multiplexer-prev () () (check-frame-multiplexer-enabled) (let* ((vf (gethash (implementation) *virtual-frame-map*)) (frame (search-previous-frame vf (virtual-frame-current vf)))) (when frame (setf (virtual-frame-current vf) frame) (lem:map-frame (implementation) frame)) (lem::change-display-size-hook) (setf (virtual-frame-changed vf) t)))
28.
ここまでのPR ● https://github.com/cxxxr/lem/pull/501 このPRのときはfm-mode という名前でした。 (いまはframe-multiplexer)
29.
こぼれ話 ● 実装にあたってLemのコードを調査した – よくできててかなり勉強になった – 描画の用語の整理結果はWikiに記載した https://github.com/cxxxr/lem/wiki/Lem's-displaying-concepts –
起動時の流れも調べた https://gist.github.com/t-sin/cc0d036e40669395fd41cfd48bb9c997 ● 最初はfm-modeという名前で作っていたが Lemのdefine-modeを使っておらず実はモードではなかった – frame-multiplexerに名称変更 – lem/modes/fm-mode/ から lem/lib/core/frame-multiplexer.lisp に – 地味にcoreに取り込まれた🎊
30.
こぼれ話 ● 現在はバッファリスト(C-x bの対象)が共有されている – elscreenの動き –
cxxxr氏より「作業を分けるためバッファリスト非共有がいい」 – ノリノリで雑ハックし、激しいバグを生む ● PR: https://github.com/cxxxr/lem/pull/504 ● Lemの非公開関数でグローバル変数をもりもり変更するマナーの悪いコードだっ たのでいったんクローズ ● 事前に設計をちゃんとしましょう ● ちなみにGNU Emacsで仮想フレームに対応するものは window-configurationというのだそう – https://www.gnu.org/software/emacs/manual/html_node/elisp/Window-Configurations.html – @conao_3 さんに教えてもらいました ● https://twitter.com/conao_3/status/1291710740294901760
31.
まとめ ● Lemにフレーム多重化機能を実装した ● Lemは読むとCommon Lispの勉強になる – clrhash関数など –
http://www.lispworks.com/documentation/HyperSpec/Body/f_clrhas.htm ● Lemは大きなソフトウェアなのでPRを投げると Common Lispチョットデキル…という気持ちになれる ● 事前の設計は大事
Download