haskell-jp / beginners #25 at 2024-10-09 11:59:24 +0900

ghci のコマンドについて質問させてください。

いつも (Windows) teraterm を使って ssh 接続した linux 上で ghci コマンドを実行しています。
(oracle-cli) ubuntu@vm1:~$ ghci
GHCi, version 9.6.6:   :? for help
Loaded GHCi configuration from /home/ubuntu/.ghci
ghci>

この状態でマウスのホイール操作を行うと、キーボードの [↑] [↓] を押したときと同じ動作となり、コマンド履歴が選択できるようになります。
ghci> :main

そのせいで、ターミナル自体をスクロールさせることができず、不便だなと思っています。
この ghci の動作を変更することは可能でしょうか ?
念のため確認ですが、bashとかvimとか他のアプリでは同様の問題は発生してないんですよね?
@igrep
vim ではターミナルのスクロールはせず、[Ctrl]+f や [Ctrl]+b のようなページのアップダウンの操作と同じような動作になります。

bash では普通に (というのも変ですが)、teraterm の右側にあるスクロールバーを操作したときのような動作となっています。

古い macOS も使っているのですが、こちらの場合は ターミナルから ssh して ghci を実行した状態でも、マウスのホイール操作はコマンド履歴ではなく、ターミナルのスクロール操作になっています。
前に調べて
(oracle-cli) ubuntu@vm1:~$ cat ~/.inputrc
# ignore mouse wheel
"\e[<64>": ""
"\e[<65>": ""

というような設定をしてみましたが、効果はありませんでした orz
> 古い macOS も使っているのですが、こちらの場合は ターミナルから ssh して ghci を実行した状態
同じLinuxにログインしている時の話ですよね?
ということはTeraTermとGHCiの組み合わせによる問題のようですが、いずれにせよ対症療法として、https://github.com/haskell/haskeline/wiki/CustomKeyBindings を参考に ~/.haskeline を編集して見てください。
マウスのホイールがどのキーに相当するかは
ghc -e "getChar"

などを実行した状態でマウスホイールを上下させれば分かるのではないかと思います。
同じLinuxにログインしている時の話ですよね?
はい。同じホストに同じアカウントで接続しています。

~/.haskeline を編集して見てください。
ありがとうございます。
とても参考になりました。

資料を参考に、いろいろと試してみます。
そもそも TeraTerm がマウスホイールをキーボードに変換してるのが悪いと思うのですよ
https://blog.dameninngenn.com/entry/20100714/1279035712
; Translate mouse wheel to cursor key when application cursor mode
> ; TranslateWheelToCursor=on
> TranslateWheelToCursor=off

デフォルトonのTranslateWheelToCursorをoffにするだけでした。
ちなみに、これ以外に
; Disable wheel to cursor translation when Control-Key is pressed.
DisableWheelToCursorByCtrl=on

という設定もあるようで、こちらはデフォルトが on なので、つまり「Ctrlキーを押しながらマウスホイールを操作すればいい」という動作がデフォルトのようですね
@koyama41
bash も ghci もコマンド履歴の機能があるのに、bash と ghci では動作が異なるので不思議でした。

教えていただいた方法も試してみます。
ありがとうございました。
@igrep @koyama41
教えていただいた方法を試してみました。

ghc -e "getChar"

の状態で [↑] (pageup) [↓] (pagedown) のキーボードを押すと "^[[A" "^[[B" などの文字が表示されますが、マウスのホイールについては反応がありませんでした。

このため ".haskeline" でのコントロールは無理だと思ったので、Teraterm のほうを試してみました。

なぜか INI ファイルの編集では反映されませんでしたが、同様の効果があるメニューからの GUI 操作(メニューバー → 設定(S) → キーボード(K)... により表示されるダイアログ) にてアプリケーションカーソルを無効化したところ、想定される動作となりました。

いろいろと考えていただき、ありがとうございました。
どうやら、 GNU readline ライブラリ(シェルや repl などの一行分の編集機能をサポートするライブラリ)が、プロンプトを表示するたびに「アプリケーションカーソルモード」を指示する escape sequence code ESC [ ? 1 h を出力しているようで、それを検出した tera term が(上記の「アプリケーションカーソル」の設定が有効であれば)マウスホイールを矢印操作に翻訳するモードに遷移するようです。この readline の挙動を無効化する方法も探してみたのですがちょっと見つかりませんでした。
まあ、なので、 Tera Term 側で「アプリケーションカーソル」を無効化するというのは、わりと正解っぽいですね
よかった :relieved:
そうそう、前から言いそびれていたんですが、リプライの都度メンションするのは、よほど急いでいる場合を除いて止めてください。こちらにはそれなりにおおきな通知が来てうるさいので :pray:
それでなくても私は間違いなく気づくので。
ご指摘ありがとうございます。

メンションは通知されてしまうのですね。
仕事で使っているときの癖で、指定するものと思い込んでいました。
ご迷惑をおかけしてしまい、申し訳ありませんでした。

今後は返信するときにメンションは設定しないようにいたします。