SlideShare une entreprise Scribd logo
1  sur  13
Télécharger pour lire hors ligne
Emacs の tramp-mode が
FreeBSD CURRENT で使えない
2020 年 4 月 27 日
(株)創夢 内藤 祐一郎
tramp-mode とは
●
Emacs のモードの一つ。
●
リモートサーバにあるファイルを指定のプロトコルでアク
セスし、ローカルで編集することができます。
– プロトコルの例: ssh ftp smb sudo など
●
Ctl-x Ctl-f から “ /< プロトコル名 >:< ホスト名 >:< パス名
> “ を打ち込むと使えます。
●
dired-mode にも対応しています。
●
アクセス手段さえあれば、リモートに Emacs をインス
トールする必要がないので、手元にある好みの emacs で
編集できます。
問題点
●
tramp-mode のターゲットに FreeBSD CURRENT のホ
ストを指定し、プロトコルに ssh を選択すると、 tramp-
mode が無応答となり使えなくなります。
●
dired-mode へも移行しません。
●
クライアントの OS は何でも構いません。
– FreeBSD, Linux, MacOS
●
クライアントの emacs バージョンも何でも良いです。
– Emacs 26, 24 で確認しました。
原因
●
端的に言えば libedit のバージョンが上がったから。
●
tramp-mode が予期せぬ動作をするようになったから。
●
libedit の新しい版は既に stable/12 にも入っており、この
まま行けば FreeBSD 12.2 でも同じ問題がおきます。
回避策
●
~/.editrc に以下を書きます。
edit off
●
これで編集モードを OFF にすると回避できます。
●
しかし、 /bin/sh をログインシェルとして常用している人
には辛いかもしれません。
元ネタ
●
以上の話は既にバグレポートが上がっています。
●
Bugzilla
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=243807
●
debbugs.gnu.org
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=39399
●
レポータは tramp-mode の次の版で直ると言っているけれ
ども、場当たり的に見えるため、もう少し根本的に直した
いです。
tramp-mode の動き
1.ssh でログインする
exec ssh -o ControlMaster=auto -o ControlPath='tramp.%C' -
o ControlPersist=no -e none <hostname>
2.sh を起動する。
exec env TERM='dumb'
INSIDE_EMACS='26.3,tramp:2.3.5.26.3' ENV=''
HISTFILE=~/.tramp_history PROMPT_COMMAND='' PS1=#
$ PS2='' PS3='' /bin/sh
3.端末環境を設定する( -echo があることに留意)
stty -inlcr -onlcr -echo kill '^U' erase '^H'
tramp-mode の動き(続き)
4.エコーモードを確認する
echo foo
5.エコーモードではない (-echo が効いていない ) ので編集
モードに移行する
_echo^H^H^H^H^Hstty icanon erase ^H cols
32767_echo^H^H^H^H^H
6.ここで sh が編集モードだと libedit が一文字づつ処理を行
い、 ^H に対して CR と再描画文字列を送出します。
tramp-mode の誤動作
●
すると次のような結果が返ります。
_echo^M
#$ _ech ^H^M
#$ _ec ^H^M
#$ _e ^H^M
#$ _ ^H^M
#$ ^Hstty icanon erase ^H cols 32767_echo^M
#$ stty icanon erase ^H cols 32767_ech ^H^M
#$ stty icanon erase ^H cols 32767_ec ^H^M
#$ stty icanon erase ^H cols 32767_e ^H^M
#$ stty icanon erase ^H cols 32767_ ^H^M
#$ stty icanon erase ^H cols 32767 ^H^M
→ 返ってきた文字列を解釈できずに止まってしまいます。
tramp-mode の期待
●
tramp-mode としては “ stty -echo” を実行しているので sh
は入力文字列をエコーバックしないことを期待していると
思います。
●
“stty -echo” で sh がエコーバックしなければ、
” _echo^H^H^H^H ・・・” というコマンドは送られませ
ん。(前述の edit off の場合)
●
FreeBSD 12 以前では行の処理が tty に任されていたため
” _echo^H^H^H^H ・・・” の入力から ^H の処理が行われ
た結果を sh が受け取っていました。
なぜ stty が効かないのか?
●
コマンドとしては呼び出されています。
●
libedit の中の el_wgets() 関数の中で一行を読み終えるごと
(read_finish() 関数 ) に libedit が持っている端末モードに設
定し直すため、 stty の設定が無効になってしまいます。
修正方法は?
●
libedit は真面目に仮想画面を持っており、それに準拠した
動きをしたがるので、 ^H の挙動を元に戻すのは難しそう
です。
●
ざっくり次のような案を考えてみました。
1.環境変数 INSIDE_EMACS があったら libedit を編集モー
ドにしない。
2.sh に csh の setty のようなコマンドを実装して emacs
にはそちらを呼び出してもらう。
3.emacs がきちんと再描画を理解するようにする。
ご意見お待ちしています
●
他に何か良い案がありましたら教えてください。

Contenu connexe

Tendances

Seccan2012 secure os
Seccan2012 secure osSeccan2012 secure os
Seccan2012 secure os
Chiharu Usui
 
Hadoop HDFS: The Ultimate Storage
Hadoop HDFS: The Ultimate StorageHadoop HDFS: The Ultimate Storage
Hadoop HDFS: The Ultimate Storage
SATOSHI TAGOMORI
 
Bsd daemon read
Bsd daemon read Bsd daemon read
Bsd daemon read
geek_alice
 
How to read linux kernel
How to read linux kernelHow to read linux kernel
How to read linux kernel
Naoya Ito
 

Tendances (10)

【学習メモ#6th】12ステップで作る組込みOS自作入門
【学習メモ#6th】12ステップで作る組込みOS自作入門 【学習メモ#6th】12ステップで作る組込みOS自作入門
【学習メモ#6th】12ステップで作る組込みOS自作入門
 
【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門 【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門
 
ハイパフォーマンスブラウザネットワーキング 12章「HTTP 2.0」と現在の仕様
ハイパフォーマンスブラウザネットワーキング 12章「HTTP 2.0」と現在の仕様ハイパフォーマンスブラウザネットワーキング 12章「HTTP 2.0」と現在の仕様
ハイパフォーマンスブラウザネットワーキング 12章「HTTP 2.0」と現在の仕様
 
Trend Micro CTF Asia Pacific & Japan -defensive100-
Trend Micro CTF Asia Pacific & Japan -defensive100-Trend Micro CTF Asia Pacific & Japan -defensive100-
Trend Micro CTF Asia Pacific & Japan -defensive100-
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
 
Seccan2012 secure os
Seccan2012 secure osSeccan2012 secure os
Seccan2012 secure os
 
hpingで作るパケット
hpingで作るパケットhpingで作るパケット
hpingで作るパケット
 
Hadoop HDFS: The Ultimate Storage
Hadoop HDFS: The Ultimate StorageHadoop HDFS: The Ultimate Storage
Hadoop HDFS: The Ultimate Storage
 
Bsd daemon read
Bsd daemon read Bsd daemon read
Bsd daemon read
 
How to read linux kernel
How to read linux kernelHow to read linux kernel
How to read linux kernel
 

Plus de Yuichiro Naito

Plus de Yuichiro Naito (20)

Reporting AsiaBSDCon 2024 in Taipei for FreeBSD NetBSD
Reporting AsiaBSDCon 2024 in Taipei for FreeBSD NetBSDReporting AsiaBSDCon 2024 in Taipei for FreeBSD NetBSD
Reporting AsiaBSDCon 2024 in Taipei for FreeBSD NetBSD
 
Bmd
BmdBmd
Bmd
 
WireGurad in the FreeBSD kernel
WireGurad in the FreeBSD kernelWireGurad in the FreeBSD kernel
WireGurad in the FreeBSD kernel
 
FreeBSD Capsicum
FreeBSD CapsicumFreeBSD Capsicum
FreeBSD Capsicum
 
Xrdp
XrdpXrdp
Xrdp
 
Bhyve debug-server
Bhyve debug-serverBhyve debug-server
Bhyve debug-server
 
HandBrake with QSV
HandBrake with QSVHandBrake with QSV
HandBrake with QSV
 
FreeBSD 12.1 RELESE
FreeBSD 12.1 RELESEFreeBSD 12.1 RELESE
FreeBSD 12.1 RELESE
 
Modern fonts
Modern fontsModern fonts
Modern fonts
 
FreeBSD 12.0 RELEASE!
FreeBSD 12.0 RELEASE!FreeBSD 12.0 RELEASE!
FreeBSD 12.0 RELEASE!
 
Psql & proctitle
Psql & proctitlePsql & proctitle
Psql & proctitle
 
Iocage
IocageIocage
Iocage
 
FreeBSD 11.2 RELEASE!
FreeBSD 11.2 RELEASE!FreeBSD 11.2 RELEASE!
FreeBSD 11.2 RELEASE!
 
How to use PTI & IBRS patch
How to use PTI & IBRS patchHow to use PTI & IBRS patch
How to use PTI & IBRS patch
 
FreeBSD Desktop
FreeBSD DesktopFreeBSD Desktop
FreeBSD Desktop
 
FreeBSD Ports Flavors
FreeBSD Ports Flavors FreeBSD Ports Flavors
FreeBSD Ports Flavors
 
Bsdtw repo
Bsdtw repoBsdtw repo
Bsdtw repo
 
How to use blacklistd
How to use blacklistdHow to use blacklistd
How to use blacklistd
 
Custom Package Building with Poudriere
Custom Package Building with PoudriereCustom Package Building with Poudriere
Custom Package Building with Poudriere
 
Ruby build
Ruby buildRuby build
Ruby build
 

Tramp mode