質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

LISP

LISPはプログラミング言語の一種であり、関数型言語に分類されています。 特徴として、括弧を多様する独特の構文を持ちます。

Q&A

解決済

2回答

1030閲覧

emacs SLIMEモード  永久ループ(?)の脱出方法

tf2014

総合スコア75

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

LISP

LISPはプログラミング言語の一種であり、関数型言語に分類されています。 特徴として、括弧を多様する独特の構文を持ちます。

0グッド

0クリップ

投稿2022/11/01 16:21

common lisp の支援にemacsのプラグインSLIMEを使用しているのですが、永久ループからの脱出方法を教えてください。

common_lisp

1(format t "forever! (~{ a, ~}): " '("taro" "jiro" "hanako"))

という(不完全な)コードを走らせると、",a "が永久に出力されます。

ターミナル上のSBCLであればC-cでキャンセルできますがemacs のプラグインSLIMEの中では当然C-cはマイナーモード(?)のエスケープなので次のコマンドを待つことになります。

検索してみるとslime-interrupt (C-c C-c)というコマンドがあるようです。試してみるとリカージョンなどに終了条件がないときには使えるようですが、この状況では使えないようです。

当分はemacsを終了という方法をとっていますが、何かいい方法がありましたら教えて下さい。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

大抵の環境(マルチスレッド)ではワーカースレッドが立ち上がりジョブを実行していますので、ジョブが実行されているスレッドを終了させれば、目的は達成できるかと思います。

M-x slime-list-threadsでスレッドの一覧が出せますが、該当スレッドの行にカーソルを持っていき、k(kill)を押下することでスレッドを終了可能です。
左端がジョブ番号ですが、大抵の場合は、一番大きい番号のworkerを終了させることになるかと思います。

下記の例でいうと、9 worker Running の行の上で、kを押下します。

9 worker Running 2 repl-thread Running 4 control-thread Running 5 swank-indentation-cache-thread Running 3 auto-flush-thread Running 6 Swank Sentinel Running 7 main thread Running 8 reader-thread Running

https://www.quicklisp.org/beta/UNOFFICIAL/docs/slime/doc/Multiple-connections.html#Multiple-connections

なお、Common Lisp処理系がシングルスレッド実行の場合は、*slime-repl*バッファで、C-c C-cでジョブを中断できた筈です。

投稿2022/11/01 17:17

g000001

総合スコア65

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tf2014

2022/11/02 15:14

ご返答ありがとうございます。  スレッドのことについては知らなかったので、勉強になりました。 しかし、emacsが遅くなっているせいか、空白のバッファーが出てくるだけでした。 永久ループでない状態では、スレッドのリストが出てきます。 C-c C-c も仕事が終わるまで待機なのでしょうか…うまくいかないようです。
g000001

2022/11/02 16:04

OSのタスクマネージャーで応答しないプロセスをキルするのと同様に、スレッドがタイトループ等で忙しくなっている場合、周りも引き摺られて、なかなか割り込めないこともあるかと思います。 試しに ```cl (loop (princ 'a) (sleep 1/2)) ``` のような隙間のある永久ループを止めてみると、使い方が大体掴めるのではないでしょうか。 また今回のような場合は、replバッファに文字が何十万文字も出力されている場合に描画が遅くなっていることも考えられます。 この場合は、replバッファで、`C-c M-o` (M-x slime-repl-clear-buffer) するとバッファの内容が消去されて軽くなります。 この隙にタスクをkillするようなこともよくやります。 また、別の切り口の話になりますが、実験的なコードを走らせる際に永久ループにならないように予め`(break)`を入れておく、ということも良く行ないます。 > emacsを終了という方法をとっていますが、何かいい方法がありましたら ということでしたら、この辺り位かなと思います。
tf2014

2022/11/06 20:04

丁寧な説明、ありがとうございます。ここ、数日、説明をもとに、実験していました。 ```cl (loop (princ 'a) (sleep 1/2)) ``` の場合は問題なく、動くようです。`C-c M-o`も私が書いていたこーどでは効果がないようでした。しかし、ここで教えていただいたことは、他の場面でよく使えそうなのでとても勉強になりました。 ありがとうございます。
guest

0

C-gでQuitできませんか?

投稿2022/11/01 17:16

dark-eater-kei

総合スコア1248

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tf2014

2022/11/02 15:09

ご返答ありがとうございます。 試してみましたができませんでした。 
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問