質問: 下位スキームでインデントを有効にするにはどうすればよいですか? デフォルトの下位スキームには字下げがないようです。少なくとも、私が `M-x run-scheme` を実行すると、結果のreplは自分のコードをインデントしません。 これをどうやって変更できますか?好ましくは、ガイザー(giser)または他のラッパーのようなものは一切使用しない
回答: 問題は、 `RET` がおそらく字下げを行わない `comint-send-input` にマップされているということです。 私が行うことは、 `comint-send-input` に `RET` をマッピングしたまま `Cj` を`改行とインデント` 。したがって、改行を入力するには `C-j` を押し、新しい行をインデントするか、評価のためにフォームを実際に送信するために `RET` を押します。 (実際には `C-j` を paredit-newline にマッピングしますが、Pareditを使用していない場合は `newline-and-indent` もちろん、それらを逆にして、 `comint-send-input` の `Cj` で`改行とインデント`コード>。 これらのキーの1つをマッピングする例として、 `C-j` を`改行とインデント`にマッピングします。 ``` (with-eval-after-load 'cmuscheme (define-key inferior-scheme-mode-map (kbd "C-j") #'newline-and-indent)) ``` ( `cmuscheme` は歴史的理由から、 `inferior-scheme-mode` を実装するパッケージの名前、つまりScheme REPLです)。 **編集:** 私は広範囲にテストしていませんが、これはうまくいくようです。 ``` (defun comint-send-input-indent () (interactive) (comint-send-input) (unless (save-excursion (forward-char -1) (eq (field-at-pos (point)) 'output)) (indent-for-tab-command))) (with-eval-after-load 'cmuscheme (define-key inferior-scheme-mode-map (kbd "RET") #'comint-send-input-indent)) ``` この考え方は、 `comint-send-input` を呼び出して、ポイント(カーソル)がプロンプトの直前にあるかどうかを確認することです。そうでない場合( `comint-send-input` が改行を入力したため)、行を適切にインデントする `indent-for-tab-command` を呼び出します。 **別の編集:** 2番目の考えでは、私はこの定義がおそらくもっと理にかなっていると思う: ``` (defun comint-send-input-indent () (interactive) (let ((parens (or (car (syntax-ppss)) 0))) (if (zerop parens) (comint-send-input) (newline-and-indent)))) ``` 詳細については、 `C-h f構文-ppss RET` を参照してください(さらに、 `C-h f parse-partial-sexp RET` )。短いバージョンでは、parenのネストがどれほど深いところにあるかを教えてくれるので、これを使って`改行とインデント`か `comint-send-input <�コード>。`