わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

Ubuntu 18.04でscreenとemacsとmigemo

あるノートPCについて,Live USB(Ubuntu 18.04 LTS 日本語 Remix)で起動する*1ことを確認したのち,インストールを行い(Windowsのディスク領域も取り壊して),Ubuntu専用で使えるようにしました.
さしあたりの目標を,

  • LinuxまたはWindows (WSL,Cygwin)からこのPCにSSHでログインし,GNU Screenで複数のシェルを起動し行き来*2できるようにすること
  • Emacsを起動し,migemoによるバッファ内の検索ができるようにすること

と設定して,作業をしていると,いくつも障害にぶつかりました.
まずはSSH関連です.SSHサーバの導入は,「sudo apt install openssh-server」を実行するだけです.接続するPCのIPアドレスを知るのに,従来の「ifconfig」は使えませんでしたが,代わりに「ip addr」のコマンドで,表示されました.
これでLinuxマシンからはログインできるようになりましたが,最もよく使うWindows PCのWSL (Windows Subsystem for Linux)からは,次の内容の1行エラーが出て,接続できませんでした.

Host key verification failed.

直訳すると「ホスト鍵の検証に失敗しました.」で,ホスト認証においてサーバ鍵が違っているよ(変わったよ)というエラーで見かけるものです.しかし~/.ssh/known_hostsを開いて見ても,今回のノートPCのIPアドレスについて,以前の登録はありません.
検索すると,英語で書かれたやりとりの中に,未知のオプションが出てきました.

「$ ssh -o StrictHostKeyChecking=no user@something.example.com uptime」と書かれているコマンドです.自分のWSL環境からの接続でも,「ssh -o StrictHostKeyChecking=no (以下略)」と書いて実行すると,サーバ鍵を登録したよという通知*3のあと,ログイン成功を示すメッセージとプロンプトが表示されました.
GNU Screen (screen)とzshも導入して,設定ファイルはこれまでのLinux環境のをもとに編集しました.Zshの環境は,rsyncコマンドによる従来設定のコピーなので詳細は割愛します.GNU Screenについてはコピーではなく,以下のコマンドを実行しました.

cp /etc/screen ~/.screenrc
cat >> ~/.screenrc
shell zsh
escape ^p^p
msgwait 2
defscrollback 10000

これで快適になりました.
すべきことを「Emacsを起動し,migemoによるバッファ内の検索ができるようにすること」に切り替えます.これまで(Ubuntu 16.04)は,「sudo apt-get install emacs apel emacs-mozc emacs-mozc-bin ibus-mozc migemo」のコマンドで,emacsその他のパッケージを導入していまた.
しかし今回,「E: パッケージ 'migemo' にはインストール候補がありません」というエラーが出ました.migemoのパッケージ名が,なくなっています.
「apt-cache search migemo」を実行して結果を眺めると,apel-migemoというパッケージ名が出てきました.「ローマ字を使った Eamcs 環境用の日本語インクリメンタル検索」と続きます.
そこで,「sudo apt-get install emacs apel emacs-mozc emacs-mozc-bin ibus-mozc apel-migemo」を実行しました.プロンプトが出るまで,待ったのち,「emacs -nw」のコマンドで,Emacsが使えるようになりました.C-\による日本語入力も,できました.
migemoを使うための,設定は…以前の~/.emacsでは,「(require 'migemo)」のみを書いていました.しかしscratchバッファにこれを貼り付け,行末でC-jにより評価しても,なぜかC-sが機能しません.
ここでまた検索しました.

migemo.elの設定は,こうなっています.

;;
;; migemo.elの設定 (for Linux)
;;
(when (and (executable-find "cmigemo")
           (require 'migemo nil t))
  (setq migemo-command "cmigemo")
  (setq migemo-options '("-q" "--emacs"))

  (setq migemo-dictionary "/usr/share/cmigemo/utf-8/migemo-dict")

  (setq migemo-user-dictionary nil)
  (setq migemo-regex-dictionary nil)
  (setq migemo-coding-system 'utf-8-unix)
  (load-library "migemo")
  (migemo-init)
)

念のため自分の(sshで入り込んだPCの)シェル上で「which cmigemo」「ls /usr/share/cmigemo/utf-8/migemo-dict」を実行し,それぞれコマンドやファイルがあるのを確認してから,scratchバッファに貼り付けて,最後でC-jです.
それでもC-sはダメでした.もう少し,挙動を見ると,C-sをしてもミニバッファに何も出ません.その後,abcと打ち込んで,表示が変わらないのも不可解です.screenの端末を変更して,emacsに戻ると,バッファにabcが打ち込まれた状態になっています.
ここで候補に挙がったのが,端末による「スクリーンロック」です.Emacs表記のC-sは,しばしばCtrl+Sと書かれるキー操作です.以下にて対策が書かれています.

これを参考に,~/.bashrcに「stty stop undef」を書いて,リモートログインをやり直しました.Screenの端末も取り壊して作り直しました.でもダメでした.
端末ではなくScreen固有の問題かなと思いながら,調査すると,新たな情報を得ました.

そこではC-tをScreenのプレフィクスキーにしていますが,自分の環境では(「escape ^p^p」と書いたとおり)C-pです.Emacsを起動した状況で,C-p fを押すと,端末の下には「-flow」と表示されました.その状況で,C-sを押したところ,やっと,「[MIGEMO] I-search:」が出て,検索できるようになりました.
~/.screenrcを開いて,上から見ていくと,以下の設定がありました.

#defflow on # will force screen to process ^S/^Q

デフォルトがonであり,上記のページで言う「"+flow"で"C-s"がきかない時」になっていたわけです.そしてこの指定は,従来Linux環境の/etc/screenrcには,書かれていませんでした.
ともあれ,「defflow off」を~/.screenrcに書き加えて保存し,screenの端末をすべて終了させてから作り直しまた.これでやっと,Ubuntu 18.04を入れたノートPCで,screenとemacsmigemoがスムーズに動くようになりました.

*1:起動時にF9でブート方法の選択,F10でBIOS画面でした.

*2:http://d.hatena.ne.jp/takehikom/20100304/1267649969

*3:yes/noで鍵を了承するか(~/.ssh/known_hostsに鍵を登録してよいか)どうかの質問が,ありませんでした.