有馬総一郎のブログ

(彼氏の事情)

2021年01月14日 21:14:23 JST - 5 minute read - Linux

KDE(Plasma 5) konsole上では、東アジアの曖昧な文字幅(East Asian Ambiguoush Width)が半角文字幅となるのでmltermを導入する

長ったらしいタイトルのとおり、konsole上では曖昧な文字が半角文字幅となるのでmltermを導入することにした。

skk+nvimを使っていてると、一部文字が見切れたり、残像が残ったりする。勿論、set ambiwidth=doubleの設定はしている。が

konsole East Asian Ambiguoush Width
konsole East Asian Ambiguoush Width

このとおり、曖昧な文字幅の文字が見辛い。

konsoleでの曖昧な文字幅の設定

konsole上で ○♂ を打つと正しく表示されない。

konsole East Asian Ambiguoush Width

ありがたいことに、 East Asian Ambiguous Width問題と絵文字の横幅問題の修正ロケールに、East Asian Ambiguous Widthの対応がまとまっている。

しかし、結局、konsoleでの曖昧な文字幅の設定の仕方が分からない。

Chromebookのターミナルで全角文字がズレて表示されるのを直す(東アジアの曖昧幅文字を2桁幅にする)のように、端末(ターミナル)の設定に、該当項目があったりするのだが…

mltermをインストール

konsoleには見切りをつけて、 mltermは文字化けやレイアウト崩れに強い端末エミュレータです | atominuxを参考にmltermをインストールした。

sudo apt install mlterm
sudo apt install mlterm-im-fcitx

mlterm設定

全体の設定は参考サイトを丸コピ。それにunicode_full_width_areas = U+2600-27FF,U+1F000-1FFFFを足しただけ。

~/.mlterm/main

fontsize = 14  
use_variable_column_width = false
use_anti_alias = true
not_use_unicode_font = true
use_scrollbar = false
bg_color = #242424
fg_color = #f6f3e8
letter_space = 1
line_space = 3
col_size_of_width_a = 2
unicode_full_width_areas = U+2600-27FF,U+1F000-1FFFF

col_size_of_width_a = 2
unicode_full_width_areas = U+2600-27FF,U+1F000-1FFFF

mltermの曖昧な文字幅の設定部分。

フォントの設定

~/.mlterm/aafont

JISX0208_1983 = Cica 16
JISX0201_ROMAN = Cica 16
JISX0201_KATA = Cica 16
ISO8859_1 = Cica 16
DEFAULT = Cica 16

色の設定は、 mlterm Solarized color setting · GitHubから丸コピ。

~/.mlterm/color

black = #073642
red = #dc322f
green = #859900
yellow = #b58900
blue = #268bd2
magenta = #d33682
cyan = #2aa198
white = #eee8d5
hl_black = #002b36
hl_red = #cb4b16
hl_green = #586e75
hl_yellow = #657b83
hl_blue = #839496
hl_magenta = #6c71c4
hl_cyan = #93a1a1
hl_white = #fdf6e3

ふむ。自分もmltermの設定ファイルgithubにアップしておこうかな。

とりあえず、これでmlterm経由でnvimを起動した場合、問題が解決されたことを確認。

デフォルトのターミナルをmltermに変更する

この情報がありがたかった。こんな常識的なことでも分からん人(私)には分からないから。1

sudo update-alternatives --config x-terminal-emulator
alternative x-terminal-emulator (/usr/bin/x-terminal-emulator を提供) には 2 個の選択肢があります。

  選択肢    パス            優先度  状態
  ------------------------------------------------------------
  * 0            /usr/bin/konsole   40        自動モード
    1            /usr/bin/konsole   40        手動モード
    2            /usr/bin/mlterm    20        手動モード

  現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください: 2
  update-alternatives: /usr/bin/x-terminal-emulator (x-terminal-emulator) を提供するためにマニュアルモードで /usr/bin/mlterm を使います

そして、~/.local/share/applications/mlterm.desktopを作成する。

[Desktop Entry]
Type=Application
TryExec=mlterm
Exec=mlterm
Icon=utilities-terminal
Terminal=false
Categories=System;TerminalEmulator;
Name=mlterm
GenericName=Terminal
Comment=Command line access

これは/usr/share/applications/org.kde.konsole.desktopを真似た。

それとカスタムショートカットキーで、Ctrl+Alt+tkonsole起動になっていたので、無効にする。そして、Ctrl+Alt+tmlterm起動するショートカットを作成する。

KDE mlterm ショートカット
KDE mlterm ショートカット
KDE mlterm ショートカット


追記 2021-01-16
このままだとデスクトップメニューからnvimを起動してもkonsole経由でのnvimとなってしまうので、 nvim.desktop を修正する。

command line - How do I change default terminal for executing .desktop files? - Ask Ubuntuを参考に。

cp /usr/share/applications/nvim.desktop ~/.local/share/applications/nvim.desktop 

nvim.desktop

Exec=mlterm -e nvim %F
Terminal=false

変えたのは上記項目のみ。Terminal=trueだとnvimと同時にkonsoleが残ってしまった。

追記ここまで


mltermのコピー&貼り付け

Ctrl+Shift+cCtrl+Shift+vでコピペできない。どうやるのか、ググってもそれらしきものが出てこない。しょうがないから適当にやると

コピーはマウスで選択するだけで自動でしてくれる。

貼り付けはShift+Insertだった。

man mlterm - Multi Lingual TERMinal emulator on X / Commandes / linuxのFeature Key Configuration Fileに機能キーファイル設定について書かれている。デフォルトのショートカットキーも書かれている。

~/.mlterm/key

Control+Shift+V=INSERT_SELECTION

小文字のvだと動かなかった。AeroBook Plusは Insert がFunctionキーとセットなので、面倒臭いのでCtrl+Shift+vで貼り付けられるようにした。


追記 2021-01-17
X Window Systemのクリップボードの種類,xselコマンド,履歴ツール - kakurasanに詳しいが、mltermはそのままでは CLIPBOARD (クリップボード)ではなく PRIMARY (“選択領域”)しか扱わない。

設定ファイル mainuse_clipboard = false(デフォルトは true )の場合、mltermで文字列を選択し PRIMARY にコピーされるので、 外部アプリで貼り付けても CLIPBOARD の内容が、貼り付けられることになる。

そして、use_clipboard = trueでも、外部アプリ(nvimとか)で文字列を選択してクリップボードにコピー(するように設定)しても、 PRIMARY にはコピーされていないので、mltermで “INSERT_SELECTION"しても、それは PRIMARY の内容を貼り付けることになる。

“INSERT_SELECTION"でもクリップボードから貼り付けさせるには、上の参考サイトにもあるとおり、クリップボードマネジャー(ここではklipper)で クリップボードと選択の内容を同期する にチェックする。

klipper
klipper

追記ここまで


これで快適にnvimが使える。

mlterm上で ♂○ を打つと正しく表示される。

mlterm East Asian Ambiguoush Width

OK。問題なし。


  1. うーん、これやっても、デストップメニューからnvim起動させるとkonsoleを使っちゃうなぁ。更にsudo update-alternatives --install /usr/bin/x-terminal-emulator x-terminal-emulator /usr/bin/mlterm 60で優先度変えて自動選択でmltermを使わせるようにしても駄目だ。 ↩︎