序文
この手の話をすると、「TeraTerm」「文字化け」の単語だけに反応し、「Linux側の文字コードの設定ガー」「TeraTerm 側の漢字受信コードの設定ガー」と早とちりする人がいる。
それはTeraTerm
上での(日本語)表示の文字化けの話では。そんなことは 1ドットも言ってないという。
あくまでも表示は正常。しかし、それをマウスで選択コピーし、テキストエディタに張り付けると文字化けすることが、って話ね。
前回の投稿でpstree
コマンドを多用したけど、ツリー表示のコピーでちょっと躓いて色々と調べたので備忘録として残す。ぐぐれば断片的に情報は見つかるけど、総合的なものは無かったので。
環境は前回の投稿同様。
現象
Linux
側の文字コードとTeraTerm
の漢字受信コードの設定は以下の通り。(UTF8)
pstree
コマンドでのツリー表示は正常。
しかし、TeraTerm
上をマウスで選択コピーしテキストエディタに貼り付けると文字化け。(厳密には文字化けとは違うらしいけど)
ログファイル上も同様。
原因
公式に書いてある。
ターミナルエミュレーション (Tera Term 設定ファイル)
UnicodeからDEC特殊文字へのマッピングを設定する
日本語環境ではTera Termは罫線や一部の記号を2カラム幅で表示します。
ただし、マウスで選択した時にクリップボードにコピーされるのが本来とは別の文字になってしまうという副作用があります
。
対応方法1 - TeraTerm の設定変更
上記の公式に書いてある通りで、デフォルトの設定はUnicodeToDecSpMapping=3
となっている。
これをUnicodeToDecSpMapping=0
等に変更し、変換設定を止める。
因みに、TeraTerm
の実行形式が配置されているフォルダ上のTERATERM.INI
を変更しても反映されないので注意。(TeraTerm
あるある)
ユーザー毎の設定ファイル側を変更すること。
参考URL:
Teratermの設定ファイル _ らぼらとり・ちー
C:\Program Files\teraterm\TERATERM.INI
を変更したのに、反映されない。
実は
C:\Users\chisaya\AppData\Local\VirtualStore\Program Files\teraterm
にあるファイルが優先されていて先のファイルをいくらいじってもダメというおちでした。64bit windowsだと次の通り
C:\Users\chisaya\AppData\Local\VirtualStore\Program Files (x86)\teraterm
設定を変更し、pstree
コマンドを再実行した結果が以下。
うーん、表示がずれているし。罫線の縦棒も隙間が空いている。しかし、クリップボードへのコピーで文字化けは無くなる。
それにしてもデフォルトの設定では巧みに表示が補正されていたんだねぇ。今更気付くTeraTerm
のありがたみ。
対応方法2 - ファイルに書き出す
TeraTerm
の設定変更は表示が少し残念になってしまう。表示はそのままで(設定は変更せず)、文字化けを回避したい。
ということで原始的だけどファイルに書き出す方法もある。これなら表示設定に左右されない。
サーバー側でファイルに出力。
クライアント側からサーバーのファイルを参照。
今回の罫線の問題に限らず、汎用的な方法。
対応方法3 - 他のSSH
クライアントを利用
TeraTerm
を使わなければならない、という法律がある訳でもなく。Windows10
ならSSH
クライアントがデフォルトで利用可。
Windows10に標準搭載されたSSHコマンドの基本的な使い方 _ 4thsight.xyz
SSH を使用して接続する _ Microsoft Docs
以下はコマンドプロンプト上からの接続例。
しかし表示がちょっと残念。横棒が文字に突き刺さっているし。それでもコピペに問題はない模様。
TeraTerm
に次いで人気が高いのがRLogin
かな。
rlogin_telnet_ssh(クライアント)ターミナルソフト
こちらでも確認。(設定はデフォルト)
画面表示、コピペに問題は無かった。RLogin
に乗り換えますかねぇ。
対応方法4 - サーバーサイドからクライアントのクリップボードへコピー
そもそも論として、TeraTerm
の標準設定ではクリップボードへのコピーで文字化けすることが原因。TeraTerm
自体のコピー機能は通さずクリップボードにコピーする方法はないか。ぐーぐる先生の御神託が以下。
Tera Term でクリップボードにコピー - skaji's blog
Tera Term を使ってリモートで作業してるとき、Mac の pbcopy のようにクリップボードに標準入力から受け取ったデータをコピーしてくれるコマンドがあったら便利だなと思う事がしょっちゅうある。
リモートの tmux でコピーした内容のローカルのクリップボードへの反映 | doda's blog
によるとクリップボード設定用制御文字列というのがすでにTera Termで使えるらしく、実際簡単にpbcopyコマンドっぽいのが作れた。
GitHub上でも公開されている。
TeraTerm でクリップボードにコピー
へー、こんなことが出来るんだね。勿論、サーバーサイドが接続元のクライアントのメモリ(クリップボード)に直接アクセスできる訳はない。
それこそ、
みたいな話で。なわけねぇだろっていう。
「クリップボード設定用制御文字列」なるものがサーバーから送信電文として送られてくると、それを受信したTeraTerm
がクリップボードに吐き出す、という理屈と思われ。
実際に試してみたのが以下。
上記のように実行するとクライアント側(Windows上)で以下が表示されるのが目印。
テキストエディタ上でペースト。
凄いよこれ。チョー便利なんですけど。
但し欠点も。上記サイトにあるように上限が 4 KB (4096 Byte)。
多分 encode_base64 した後の 4 KB (4096 Byte) までのデータしかコピーできない。
それとscreen
コマンドのセッション上では正しく動かない。
上記サイトを受けてPHP
版を公開している方も居た。
TeraTermでリモートからローカルのクリップボードにコピー by PHP - Software Defined Laboratory
こちらも確認したけど、やはり同様の上限だった。仕様上の制限っぽいですな。
更に色々と確認していると、もっと上限が低いケースも。うーん。謎。
その他 - vim
vi
(vim
)でもクリップボードコピーができるんだね。以下参照。
リモートのVimからssh越しにクリップボード書き込み - tateren’s diary
わりと皆やりたがるやつ。
OSC52という端末の制御シーケンスでクリップボードアクセスができるらしい。
こちらも試してみたらPi OS
環境ではエラーを吐いて動かず。以下によるとcompact version
(簡易版)だかららしい。
vimrc エラー Ubuntu _ Awesome Blog
vimカスタマイズエラー対応
現在のvimを確認
「vim-tiny」行の最後に「- compact version」の記載があるのがわかると思います。
ubuntuにデフォルトで入っているvimはこの簡易版のためエラーがでたということです。
Pi OS
の環境は以下。確かに簡易版だね。Pi OS
もUbuntu
もDebian
系だから同じ話。
$ which vi
/usr/bin/vi
$ ls -la /usr/bin/vi
lrwxrwxrwx 1 root root 20 10月 30 21:28 /usr/bin/vi -> /etc/alternatives/vi
$ ls -la /etc/alternatives/vi
lrwxrwxrwx 1 root root 17 10月 30 21:28 /etc/alternatives/vi -> /usr/bin/vim.tiny
$ dpkg -l | grep vim
ii vim-common 2:8.2.2434-3+deb11u1 all Vi IMproved - Common files
ii vim-tiny 2:8.2.2434-3+deb11u1 arm64 Vi IMproved - enhanced vi editor - compact version
今まで漠然とvi
(vim
)と思っていたけど実はvim-tiny
だったでござる。
自分もここら辺の仕組みは分かっていなかったので、この件も改めて調べ確認してみた。
上記サイトでは、わざわざ明示的に簡易版vim
(vim-tiny
)をアンインストールし、通常版vim
を入れたりしているけど、実は単にsudo apt install vim
で追加インストールすれば良いだけだった。
そもそもパッケージ自体、通常版はvim
、簡易版はvim-tiny
と異なる名称で管理されている。
$ apt-cache search vim | grep ^vim
vim - Vi IMproved - 強化版 vi エディタ <-- 通常版
vim-common - Vi IMproved - 共通ファイル
vim-doc - Vi IMproved - HTML ドキュメント
vim-gui-common - Vi IMproved - GUI 共通ファイル
vim-runtime - Vi IMproved - ランタイムファイル
vim-tiny - Vi IMproved - 強化版 vi エディタ - コンパクト版 <-- 簡易版
(以下略)
そして同一カテゴリ(今回の場合はテキストエディタ)で複数のパッケージを管理する仕組みがあり、更に言えば同一ツール(今回の場合はvi
)で複数の実行ファイル、複数のバージョンを管理する仕組みがあり、既存のvim
(vim.tiny
)はそのままで、追加インストールされたvim
(vim.basic
)と共存され、追加インストール版の優先順位が上になる。元に戻したければupdate-alternatives
コマンドで再設定できる。
$ sudo update-alternatives --config vi
リンクグループ vi に 1 つの alternative のみがあります (/usr/bin/vi が提供): /usr/bin/vim.tiny
設定は行いません。
$ sudo update-alternatives --config vi
alternative vi (/usr/bin/vi を提供) には 2 個の選択肢があります。
選択肢 パス 優先度 状態
------------------------------------------------------------
* 0 /usr/bin/vim.basic 30 自動モード
1 /usr/bin/vim.basic 30 手動モード
2 /usr/bin/vim.tiny 15 手動モード
現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください:
※ vim.basic
が通常版vim
テキストエディタの選択肢。
$ update-alternatives --list editor
/bin/ed
/bin/nano
/usr/bin/vim.tiny
$ update-alternatives --list editor
/bin/ed
/bin/nano
/usr/bin/vim.basic
/usr/bin/vim.tiny
リンクはシステムが設定してくれる。というか手動で操作するべきではない。
$ ls -la /etc/alternatives/vi
lrwxrwxrwx 1 root root 18 4月 10 02:57 /etc/alternatives/vi -> /usr/bin/vim.basic
$ dpkg -l | grep vim
ii vim 2:8.2.2434-3+deb11u1 arm64 Vi IMproved - enhanced vi editor
ii vim-common 2:8.2.2434-3+deb11u1 all Vi IMproved - Common files
ii vim-runtime 2:8.2.2434-3+deb11u1 all Vi IMproved - Runtime files
ii vim-tiny 2:8.2.2434-3+deb11u1 arm64 Vi IMproved - enhanced vi editor - compact version
そしてvim
上からのクリップボードコピーを試してみた。確かにTeraTerm
ではcp932変換が必要だった。TeraTerm
用osc52.vim(osc52_for_teraterm.vim)はGitHub
上に置いた。
$ wget https://github.com/god1964/RaspberryPi/raw/main/TeraTerm/osc52_for_teraterm.vim
$ ls -la osc52_for_teraterm.vim
-rw-r--r-- 1 pi pi 4310 4月 10 08:14 osc52_for_teraterm.vim
$ cat ~/.vimrc
" source ~/osc52.vim
source ~/osc52_for_teraterm.vim
vmap <C-c> y:call SendViaOSC52(getreg('"'))<cr>
それと、screen
コマンドのセッション上でかつ一定以上の文字数の場合、コピーできない模様(TeraTerm
、RLogin
共に)。どうもクリップボードコピーはscreen
コマンドと相性が悪い。セッション上ではなくてもやはり上限はあり。
今回も色々と勉強になったよ。
参考URL:
update-alternatives(8) — dpkg — Debian jessie — Debian Manpages
update-alternativesの使い方(vimをeditorグループに登録する) - やってみる
How can I add my desired editor to the update-alternatives interactive menu_ - Ask Ubuntu