Last active
February 13, 2020 01:50
-
-
Save Hamayama/37a7c766dca2fd0f3ee42c0147530f94 to your computer and use it in GitHub Desktop.
lem の r7rs-swank 対応
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<lem の r7rs-swank 対応> | |
関連プルリクエスト: https://github.com/cxxxr/lem/pull/435 | |
https://github.com/cxxxr/lem/pull/438 | |
(1)ファイル | |
scheme-mode | |
scheme-mode.lisp process にも swank にも無関係なもの(上位層)(※) | |
repl.lisp process にも swank にも関係があるもの(上位層)(主に lisp-mode の repl.lisp からコピー) | |
eval.lisp process に関係があるもの(下位層) | |
swank-connection.lisp swank に関係があるもの(上位層)(主に lisp-mode の lisp-mode.lisp からコピー) | |
syntax-parse.lisp swank の autodoc 用(下位層)(lisp-syntax の parse.lisp からコピー) | |
swank-protocol.lisp swank の通信関係(下位層)(lisp-mode からコピー) | |
errors.lisp swank の通信関係(下位層)(lisp-mode からコピー) | |
util.lisp swank の通信関係(下位層)(lisp-mode からコピー) | |
(※) ここでの process とは、async-process (https://github.com/cxxxr/async-process) で | |
repl を起動する (既存の) 機能のこと | |
また swank とは、r7rs-swank (https://github.com/ecraven/r7rs-swank) の | |
swank-server を起動/接続して repl を実現する (今回追加した) 機能のこと | |
(2)内容 | |
scheme-mode の設定 → 完了 | |
エディタ変数 | |
xref-mode-tag 追加 | |
find-definitions-function 追加 | |
find-references-function 追加 | |
completion-spec | |
scheme-completion を completion-symbol に変更 | |
キーバインド | |
scheme-mode に 12個追加 | |
scheme-repl-mode に 2個追加 | |
設定 | |
*scheme-swank-server-run-command* で swank-server の起動コマンドを指定 | |
ポート番号の指定は ,port とする (lem が内部で実際のポート番号に置換する) | |
*use-scheme-slime* で scheme-slime 系のコマンドの有効/無効を選択可能にする | |
t : 有効 | |
:auto : scheme-slime と scheme-slime-connect だけ有効 | |
他のコマンドは、これらのコマンドの実行後に有効になる | |
nil : 無効 | |
*use-scheme-set-library* で scheme-set-library コマンドの有効/無効を選択可能にする | |
t : 有効 (バッファごとに設定) | |
:repl : repl バッファのみ有効 | |
nil : 無効 | |
*use-scheme-autodoc* ミニバッファに関数情報を表示する | |
t : 有効 | |
nil : 無効 | |
*use-scheme-repl-shortcut* でショートカットコマンドの有効/無効を選択可能にする | |
通信まわり → 完了 | |
WSAResetEvent の戻り値の定義見直し | |
message-waiting-p で、ストリームバッファをまずチェックするようにする | |
read-message-string で、wait-for-input をやめる | |
read-string で、受信文字列内の \n と \t を改行とタブに変換する | |
with-swank-syntax で、リテラル表記への変換に問題がある | |
→ *print-readably* を nil に設定するようにした | |
(文字列が #a((8) common-lisp:base-char . "filepath") のように | |
変換されてしまい、Scheme 処理系がそれを解釈できなくてエラーになる) | |
swank:quit-lisp が swank/backend:quit-lisp に変換されてしまいエラーになる | |
→ とりあえず exit にした | |
swank:autodoc が swank::autodoc に変換されてしまいエラーになる | |
→ 無理やり export するようにした | |
swank-server の起動 → 完了 | |
M-x scheme-slime | |
run-swank-server | |
エラーチェック (handler-case) を追加 | |
self-connect 関係 → 削除(未対応) | |
repl の起動 → 完了 | |
M-x start-scheme-repl | |
ファイルのロード → 完了 | |
M-x scheme-load-file (C-c C-l) | |
r7rs-swank に不具合があり、以下のプルリクエストを送った | |
https://github.com/ecraven/r7rs-swank/pull/11 | |
シンボルの補完 → 完了 | |
M-x complete-symbol (C-M-i) | |
M-x indent-line-and-complete-symbol (Tab) | |
グローバル環境のみ | |
autodoc による関数シグネチャのミニバッファへの自動表示 → 完了 | |
エラーが出ることがある → エラーチェックを追加した | |
引数にリストがあると、シグネチャのハイライト表示がずれる → 修正した | |
Gauche の拡張シグネチャ ( :optional :key :rest ) に部分的に対応 (:key はハイライト表示なし)。 | |
マクロおよびジェネリック関数については、クラス情報が表示されるのみ | |
ローカル関数には未対応 | |
マクロの展開 → 完了 | |
M-x scheme-macroexpand-all | |
範囲の切り出しが変? | |
(展開したいマクロの括弧の前にカーソルを置いてから実行) | |
→ カーソル位置が開き括弧以外のときは、一段外側のリストに移動してから切り出すようにした | |
(symbol 置換系のマクロがある処理系 (Racket等) だと、まずいかも) | |
結果が1行になるので見にくい | |
→ r7rs-swank-Gauche-custom で対応 | |
pprint の結果を受け取れるようにした | |
describe による symbol の説明の表示 → 完了 | |
M-x scheme-describe-symbol | |
▲ 説明は表示されないが、bind 情報だけは表示される | |
▲ apropos 関係 → 保留(未対応) | |
▲ inspector 関係 → 保留(未対応) | |
▲ debugger 関係 → 保留(未対応) | |
▲ compile 関係 → 保留(未対応) | |
定義位置へのジャンプ → 完了 | |
M-x find-definition | |
→ r7rs-swank-Gauche-custom で対応 | |
一部のグローバルな手続きのみ対応(プリコンパイルされたものは不可) | |
現状、グローバル変数 (手続き以外)、クラス、マクロ、ジェネリック関数、ローカル関数には未対応 | |
▲ 参照情報の一覧表示 (xref?) → 保留(未対応) | |
▲ ローカル環境の情報取得 → 保留(未対応) | |
▲ インデント情報の更新 → 保留(未対応) | |
カレントライブラリの切り換え → 完了 | |
M-x scheme-set-library | |
→ R7RS には存在しない概念? | |
→ r7rs-swank-Gauche-custom で対応 | |
▲ repl の interrupt → 保留(未対応) | |
repl 関係 → 完了 | |
swank と process のどちらを選択するか → 完了 | |
scheme-repl-type | |
条件1 :initial (初期化時に使用) | |
(connected-p) ==> swank | |
(boundp '*scheme-process*) ==> process | |
条件2 :current (repl入力時に使用) | |
バッファ *scheme-repl* がカレントバッファならば swank | |
バッファ *scheme-process* がカレントバッファならば process | |
条件3 :その他 (eval や load 時に使用) | |
バッファ *scheme-repl* が存在すれば swank | |
バッファ *scheme-process* が存在すれば process | |
ハイライトは listener-mode が無効にしている → 完了 | |
(setf (variable-value 'enable-syntax-highlight) nil) は無駄なので削除 | |
コマンド → 完了 | |
swank と process の両対応 | |
scheme-eval-last-expression | |
scheme-eval-region | |
scheme-load-file | |
その他 | |
scheme-repl-interrupt | |
(check-connection) を追加 | |
scheme-repl-shortcut | |
カンマで始まるショートカットコマンド → 完了 | |
,sayonara で固まる。C-g で抜けられるが、その後も操作が困難 → 改善した | |
*write-string-function* に write-string-to-repl をセット → 完了 | |
completion-spec | |
repl-completion | |
scheme-completion を completion-symbol に名称変更 → 完了 | |
repl-eval | |
▲ *repl-compiler-check* を t にするとコンパイル? → 保留(詳細未確認) | |
listener-eval | |
空文字列を送信するとエラーになる | |
→ 空文字列は (values) に変換して送信するようにした | |
(exit) 後の Enter でエラーになる | |
→ エラーチェックを追加した | |
▲ r7rs-swank が、swank-repl:listener-eval の :window-width 引数に | |
未対応のためエラーになる | |
→ (repl-buffer-width) をコメントアウトした | |
eval 関係 → 完了(なるべくそのまま使う) | |
scheme-rex | |
emacs-rex | |
emacs-rex-string | |
scheme-eval-internal | |
emacs-rex-fun | |
scheme-eval-from-string | |
scheme-eval-internal | |
emacs-rex-string | |
scheme-eval | |
scheme-eval-internal | |
emacs-rex | |
scheme-eval-async | |
scheme-rex | |
eval-with-transcript | |
scheme-rex | |
re-eval-defvar → 現状未使用 | |
eval-with-transcript | |
interactive-eval | |
eval-with-transcript | |
eval-print → 現状未使用 | |
scheme-eval | |
read-package-name | |
scheme-eval | |
scheme-set-library | |
scheme-eval | |
scheme-interrupt | |
send-message-string | |
scheme-eval-string | |
interactive-eval | |
scheme-eval-define | |
re-eval-defvar → コメントアウト | |
interactive-eval | |
scheme-echo-arglist | |
scheme-eval-async | |
autodoc | |
scheme-eval-async | |
scheme-compile-and-load-file | |
scheme-eval-async | |
scheme-compile-region | |
scheme-eval-async | |
macroexpand-internal | |
scheme-eval-async | |
symbol-completion | |
scheme-eval-from-string | |
find-definitions-default | |
scheme-eval | |
find-references | |
scheme-eval | |
completion-symbol | |
scheme-eval-from-string | |
scheme-eval-describe | |
scheme-eval-async | |
dispatch-message | |
send-message-string | |
scheme-slime-quit | |
scheme-rex → コメントアウト | |
interactive-eval | |
features → 完了(r7rs-swankは未対応) | |
indentation-update → コメントアウト(未対応) | |
indent-spec → 削除(未対応) | |
scheme-set-library → 完了 | |
r7rs-swank にコマンドはあるのでエラーにはならないが、 | |
カレントライブラリは切り換わらない | |
→ r7rs-swank-Gauche-custom で対応 | |
read-package-name → 完了 | |
scheme-listen-in-current-library → 削除(未対応) | |
▲ scheme-interrupt → 保留(r7rs-swankは未対応) | |
scheme-eval-string → 完了 | |
scheme-eval-define → 完了 | |
scheme-echo-arglist → 完了 | |
scheme-autodoc-with-typeout → 完了 | |
scheme-autodoc → 完了 | |
swank:autodoc が swank::autodoc に変換されてしまいエラーになる | |
→ 無理やり export するようにした | |
*suppress-error-disp* でエラー表示を抑制 | |
空文字列のときは通信しないようにした ← これは止めた | |
▲ scheme-remove-notes → 保留(r7rs-swankは未対応) | |
▲ scheme-compile-and-load-file → 保留(r7rs-swankは未対応) | |
ファイル名が #a リテラルになるのを回避 (*print-readably*) | |
:return の :abort チェック追加 | |
scheme-compile-region → 完了 | |
scheme-compile-define → 完了 | |
scheme-macroexpand → 完了 | |
swank-macroexpand-1 は swank-expand-1 に変更 | |
scheme-macroexpand-all → 完了 | |
symbol-completion → 完了 | |
find-local-definition → コメントアウト(未対応) | |
▲ find-definitions → 完了 | |
M-. は ESC-. で操作する必要がある(PDCurses関連) | |
M-, は ESC-, で操作する必要がある(PDCurses関連)(元の位置に戻る操作) | |
:return の :abort チェック追加 | |
r7rs-swankは未対応 | |
→ r7rs-swank-Gauche-custom で対応 | |
一部のグローバルな手続きのみ対応(プリコンパイルされたものは不可) | |
現状、グローバル変数 (手続き以外)、クラス、マクロ、ジェネリック関数、ローカル関数には未対応 | |
▲ find-references → 保留(r7rs-swankは未対応) | |
M-_ は ESC-_ で操作する必要がある(PDCurses関連) | |
:return の :abort チェック追加 | |
completion-symbol → 完了 | |
scheme-describe-symbol → 完了 | |
▲ show-source-location → 保留(詳細未確認) | |
▲ source-location-to-xref-location → 保留(詳細未確認) | |
▲ location-buffer-to-buffer → 保留(詳細未確認) | |
▲ move-to-bytes → 保留(詳細未確認) | |
▲ move-to-location-position → 保留(詳細未確認) | |
impl 関係 → 削除(未対応) | |
prompt-for-impl → 削除(未対応) | |
scheme-slime → 完了 | |
scheme-slime-quit → 完了 | |
swank:quit-lisp が swank/backend:quit-lisp に変換されてしまいエラーになる | |
→ とりあえず exit にした | |
scheme-slime-restart → 完了 | |
▲ scan-current-package → 保留(現状未使用) | |
▲ update-buffer-package → 保留(現状未使用) | |
scheme-idle-function → 完了 | |
update-buffer-package は現状未使用 | |
▲ highlight-region → 保留(詳細未確認) | |
▲ highlight-compilation-region → 保留(詳細未確認) | |
▲ highlight-evaluation-region → 保留(詳細未確認) | |
(3)検討 | |
r7rs-swank を fork して、Gauche 用の機能を追加するとよいかも | |
→ r7rs-swank-Gauche-custom を作成中 | |
(2019-10-2)(2019-10-3)(2019-10-4)(2019-10-5)(2019-10-17) | |
(2019-10-19)(2020-2-11)(2020-2-13) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment