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でも、この投稿のパッチが使われていることを確認。