Skip to content

Instantly share code, notes, and snippets.

@Hamayama
Last active February 13, 2020 01:50
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Hamayama/37a7c766dca2fd0f3ee42c0147530f94 to your computer and use it in GitHub Desktop.
Save Hamayama/37a7c766dca2fd0f3ee42c0147530f94 to your computer and use it in GitHub Desktop.
lem の r7rs-swank 対応
<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