Edited at

Microsoft製 OpenSSHでemacs

More than 1 year has passed since last update.

2017年8月24日 追記 v0.0.19.0で、ここに書いた方法で対策されたようです


はじめに

2017年7月8日、Microsoft製のOpenSSH、Win32-OpenSSHのバージョンはv0.0.17.0です。

Windows10のPowerShellからssh.exeを起動してLinuxマシンに接続してemacsを実行すると下から2行目の表示が崩れる問題がありました。

Win32-OpenSSHのソースコードをちょっと直したら正しく表示されるようになったのでメモ。

やってみたらうまくいってる感じという状態なので、試される方は、そのあたりを注意してください。

Anniversary Update for Windows 10以降でしか動作しないかもしれません。


修正方法

ソースコードを展開してフォルダ

Win32-OpenSSH-0.0.17.0\Win32-OpenSSH-0.0.17.0\contrib\win32\win32compat

の中にあるconsole.cを次のように修正します。

dwAttributes |= (DWORD)ENABLE_VIRTUAL_TERMINAL_PROCESSING | 0x0008;

0x0008は、DISABLE_NEWLINE_AUTO_RETURN とdefineされるものですがWin32-OpenSSHはVisual Studio 2015でないとコンパイルできないので定義されていないようです。


公式のGitで提案してみた

https://github.com/PowerShell/Win32-OpenSSH/issues/802

投稿の最初で説明したconsole.cへの僕のpatchが、そのまま使われた(DISABLE_NEWLINE_AUTO_RETURNがdefineでなく直接の値になっていますが)

文字数にして数十文字だけど、このpatchを作るのに原因の調査開始から僕は5日も、かかりました。ただ、正しい保証はありませんでしたが。

次のバージョンの0.0.18.0で僕のpatchのDISABLE_NEWLINE_AUTO_RETURN は、他と干渉するから使いたくないということで、使わずに対策したとあった。ソースコードをコンパイルすると、直っていないのに、バイナリだけ直るという、不思議な現象が起きた。不思議に思って対策したというソースコードの開示を言ってみたが、開示してくれなかった。

結局、次のバージョンの0.0.19.0でDISABLE_NEWLINE_AUTO_RETURNを使って対策したようです。

2017年7月16日 追加

Linux上ではexport TERM=vt100としてTERMを設定するとうまくいきます。

Ctrl-Spaceはset-mark-commandですが、ただのSpaceになるようです。私はCtrl-@でset-mark-commandを使うようにしました。

Emacsで現在のキーバインドを確認する方法は、こちらの投稿にあるようです。

2017年7月20日 追加

vt100よりもxtermのほうがemacs以外でも、画面が崩れずに動作するようです。TeraTermと比較すると完全ではないですが。

TeraTermではできないICカードによる認証が可能なのでMicrosoft製 OpenSSHを使いたい場合があると思います。

2017年12月17日 追加

Windows 10バージョン1709、オプション機能でOpenSSHベータ版が利用可能になっているようです。

スラド記事

Win32-OpenSSHの0.0.24.0でも、この投稿のパッチが使われていることを確認。