WSL2にFcitx+Mozcを入れて日本語入力する
先日、WSL2(Windows Subsystem for Linux)環境のUbuntu 20.04でGUIアプリが動くように設定して、日本語を表示できるようにしましたが、よくよく考えたら日本語入力の設定をしてませんでした。
今回は、WSL2環境にFcitxとMozcをインストールして、日本語入力できるようにしてみたいと思います。
Windows Insider Preview 参加者の方へ(2021/7/11追記)
Windows 10やWindows 11のInsider Previewでは、WSLg(WSL GUI)のプレビュー版が配信されています。WSLg用の日本語化の仕方は別記事にまとめましたので、次のリンクをご覧ください。
現在のWindows 10通常リリース版である「21H1」ではWSLgは使えません。本ページ(次項以降)では、WSLgを使わずVcXsrvを用いた環境向けの解説です。現行Windows 10をご利用の方は、本ページの説明に従って設定を進めてください。
最初にまとめ
忙しい人向けにBashスクリプトにまとめてみました。
MicrosoftストアからインストールしたばかりのまっさらなUbuntuからスタートする場合、こちらのスクリプトを実行すれば一通り日本語入力ができるようになります。(2020/10/14に、本スクリプトを一部修正しました。詳細は後述の修正履歴をご覧ください)
ただし、GUIアプリを動かすにあたってWindows側でのVcXsrvの設定も必要です。詳細はこちらの記事の「Windows側にXサーバーをインストール」をご覧ください。
#!/bin/bash
# Copyright (c) 2020 astherier
# This software is released under the MIT License.
# http://opensource.org/licenses/mit-license.php
#
#WSL2のUbuntu 20.04にFcitx+Mozcをインストールします。
# https://astherier.com/blog/2020/07/install-wsl2-on-windows-10-may-2020/
#WSL環境の各パッケージをアップデートします。
sudo apt update -y
sudo apt upgrade -y
# https://astherier.com/blog/2020/08/run-gui-apps-on-wsl2/
#GUIアプリを動かすため、いくつかソフトを入れて設定します。
#Windows側の設定も必要です。詳細は上記リンクを見てください。
sudo apt install -y libgl1-mesa-dev xorg-dev xbitmaps x11-apps
echo 'export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '\''{print $2}'\''):0.0 #https://astherier.com/blog/2020/08/run-gui-apps-on-wsl2/' >> ~/.profile
cat << 'EOS' | sudo tee /etc/fonts/local.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<dir>/mnt/c/Windows/Fonts</dir>
</fontconfig>
<!-- Created by https://astherier.com/blog/2020/08/run-gui-apps-on-wsl2/ -->
EOS
# https://astherier.com/blog/2020/08/install-fcitx-mozc-on-wsl2-ubuntu2004/
#日本語の言語パックをインストールします。
#これにより、コマンドのエラーメッセージなども日本語になります。
sudo apt -y install language-pack-ja
sudo update-locale LANG=ja_JP.UTF8
# https://astherier.com/blog/2020/08/install-fcitx-mozc-on-wsl2-ubuntu2004/
#FcitxとMozcをインストールし、関連の設定をします。
sudo apt install -y fcitx-mozc dbus-x11
sudo sh -c "dbus-uuidgen > /var/lib/dbus/machine-id"
cat << 'EOS' | tee -a ~/.profile
#Added by https://astherier.com/blog/2020/08/install-fcitx-mozc-on-wsl2-ubuntu2004/
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export DefaultIMModule=fcitx
if [ $SHLVL = 1 ] ; then
(fcitx-autostart > /dev/null 2>&1 &)
xset -r 49 > /dev/null 2>&1
fi
#end
EOS
echo "
一旦、WSL2を終了してください。コマンド:wsl.exe -t ディストリ名
もう一度WSL2を起動して、fcitx-config-gtk3で設定の確認をしてください。
・Input Method(入力メソッド)にMozcを足す
・Global Config(全体の設定)のTrigger Input MethodにZenkakuhankakuもセットする
"
このスクリプトを使用した方は、次に「再起動して設定を確認」へ進んでください。
ここからは、一つずつコマンドを打ちながら設定していく人向けに説明します。
GUIアプリが動くところまで
まだWSL2をインストールしていない方は、こちらの記事をご覧ください。
次にGUIアプリが動くように設定していきます。GUIアプリ動作環境の構築は、こちらの記事をご覧ください。
Ubuntuを日本語化する
Ubuntuの日本語化を行います。
これは必須ではありませんが、日本語化を行っておくと、次回WSLを起動したときに自動的にMozcを使うよう設定してくれるみたいです。
$ sudo apt -y install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF8
これらのコマンドを実行すると、コマンドのエラーメッセージやChromeなども日本語表示になります。
fcitx-mozcのインストール
日本語入力ソフトのfcitx-mozcと関連ソフトをインストールします。
$ sudo apt install -y fcitx-mozc dbus-x11
次に、machine-idファイルを作成します。
$ sudo sh -c "dbus-uuidgen > /var/lib/dbus/machine-id"
続いて、環境変数などを.profileファイルに設定します。(2020/10/11と10/14に、このコマンドを修正しました。詳細は後述の修正履歴をご覧ください)
$ cat << 'EOS' | sudo tee -a ~/.profile
#Added by https://astherier.com/blog/2020/08/install-fcitx-mozc-on-wsl2-ubuntu2004/
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export DefaultIMModule=fcitx
if [ $SHLVL = 1 ] ; then
(fcitx-autostart > /dev/null 2>&1 &)
xset -r 49 > /dev/null 2>&1
fi
#end
EOS
環境変数については、参考サイト[1]を参考にしました(ただし、DISPLAY変数はGUIアプリ設定のところで設定済みなので削除しています)。if文の1行目はFcitxをスタートするコマンド、2行目は半角全角キーの連打を抑制するものです。if文の所は参考サイト[2]を参考にしました。
以上でインストール完了です。
再起動して設定を確認
インストールが完了したら、設定を反映させるため一旦WSLを再起動します。(いろいろ試したところ、WSLを再起動しないとうまく動かないみたいでした)
WSLを終了するためPowerShellかコマンドプロンプトから次のコマンドを実行します。Ubuntu-20.04
の部分はディストリビューション名です。Microsoftストアから「Ubuntu」アプリをインストールしている場合は、代わりにUbuntu
と入力してください。
PS C:\> wsl.exe -t Ubuntu-20.04
もう一度WSL2のUbuntu 20.04を起動します。
入力設定確認のため、fcitx-config-gtk3
を実行します。(警告は無視して大丈夫だと思います)
$ fcitx-config-gtk3
こちらで入力メソッドの設定をします。
まず「入力メソッド」タブでMozcが指定されているか確認してください。ない場合は、下のプラスボタンで足してください(日本語化してからインストールした方は既に設定されていると思います)
続いて、「全体の設定」タブでTrigger Input MethodにZenkakuhankakuが指定されているか確認してください。Emptyになっている場合は、そこをクリックして半角全角キーを押すと、半角全角キーで入力切り替えできるようになります。(こちらも、日本語化した人は設定済みだと思います)
設定が終わったら、×を押して閉じます。
動作の確認
以上で日本語入力の設定は完了です。
動作確認のため、試しにLXTerminalをインストールしてみます。
$ sudo apt install lxterminal
インストールが終わったら、LXTerminalを起動してみます。
$ lxterminal
半角全角キーを押して、日本語入力ができたら設定完了です。お疲れ様でした。
参考サイト
この記事は、こちらのサイトを参考にさせていただきました。
参考サイト[1]
参考サイト[2]
おまけ
Google Chromeをインストールすれば、Chrome上でも日本語が打てるようになります。
記事の修正履歴
「環境変数を.profileに書き込むコマンド」を修正(2020/10/11)
記事初出時、「fcitx-mozcのインストール」の項の、環境変数を.profileに書き込むコマンドが誤っていました。2020/10/11に、コマンド1行目を下記の通り修正しました(「EOS」をシングルクオートでくくっています)。
※最初に掲載しているシェルスクリプトは、当初から問題ありませんでした。
(誤)cat << EOS | sudo tee -a ~/.profile
(正)cat << 'EOS' | sudo tee -a ~/.profile
こちらの誤った記載でコマンドを実行した方は、.profileの記載が正しくない可能性があります。下記の確認をお願いします。
~/.profileファイルを開いて下の方にスクロールしていくと、本記事で書き足した環境変数などがあると思います。そのあたりにif [ 0 = 1 ] ; then
という行があると思います。(左辺は、人によって違う数字が入っているかもしれません)
このif文条件式の左辺を「$SHLVL」に書き換えて、if [ $SHLVL = 1 ] ; then
のようにしてください。このように変更することで、正しく動くようになると思います。
宇宙まっくす様、a_sue様、コメント欄でご指摘いただきまして、ありがとうございました!
fcitx-autostart、xsetコマンドを修正(2020/10/14)
記事初出時、.profileファイルに書き込むfcitx-autostartコマンドとxsetコマンドについて、下記の通り記載していました。
(fcitx-autostart > /dev/null 2&>1 &)
xset -r 49 > /dev/null 2&>1
この2&>1
は、2>&1
の誤りでしたので、下記のように修正しました。
(fcitx-autostart > /dev/null 2>&1 &)
xset -r 49 > /dev/null 2>&1
誤ったコマンドで実行された方は、.profileファイルを編集して、上記と同様に修正をお願いします。また、WSL起動時のワークディレクトリに「1」という名前のファイルができているかもしれません。中身が「Fcitxがどうのこうの」というファイルでしたら、それは誤ったコマンドによって生成された不要なファイルですので、削除しておいてください。
宇宙まっくす様、ご指摘いただきまして、ありがとうございました!
2020/10/17修正:この修正履歴を書き足した際、2&>1
と2>&1
がグチャグチャになっていましたので、再度修正しました(本文の方は大丈夫のはずです)。試行錯誤 様、ご指摘ありがとうございます!
ディスカッション
コメント一覧
WSL2のGUI化で参考にさせていただいております。
一か所詰まったのでご報告します。
fcitx-mozcのインストールのところの.profile 追記のコマンドですが、
そのままコピペすると if文の条件式の $SHLVL は、評価された値 0 が書き込まれていました。
正しくは、 if [ ‘$SHLVL’ = 1 ] ではないでしょうか?
ほかのところはスムーズに進めることができて快適でした☺
>宇宙まっくすさま
コメントありがとうございます、お役に立ててよかったです!
ご指摘は「シングルクオートでくくる必要があるのでは?」ということでしょうか?
シングルクオートでくくってしまうと、「$SHLVL変数の値」ではなく「$SHLVL」という文字列そのものとして認識されて、
ifの条件式が常にfalseになってしまうような気がするのですが・・・
一応、私の環境で確認したところ、
echo $SHLVL
をすると「1」が帰ってきて、多重にbashを開くたびに値が増えていきます。なので、「ログインシェルを開いた時だけif文が実行される」というような挙動になっています。
(念のため、もう一回まっさらにして再インストールしてみましたが、正常に動きました)
$SHLVLが0だった、というのが気になるのですが、スタートメニューから「Ubuntu 20.04 LTS」アプリを開いた時も0になるのでしょうか?
それとも、Windwos側から
wsl.exe -d "Ubuntu-20.04" Ubuntu上のコマンド
などを実行したときの話でしょうか?(一応、当方の環境だとどちらも$SHLVLは1になるようですが・・・)
それか、ifの中身は何回実行しても差し支えなさそうな感じですので、
if行とfiを消してしまっても良いかもしれません。
wsl2 の日本語化を検索してたどり着きました。
先週うまくいかなくて、今週再挑戦していてこの議論を見つけました。
cat .profile してみると書かれているのが下記でした。
~~~
(前略)
#Added by https://astherier.com/blog/2020/08/install-fcitx-mozc-on-wsl2-ubuntu2004/
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export DefaultIMModule=fcitx
if [ 0 = 1 ] ; then
(fcitx-autostart > /dev/null 2&>1 &)
xset -r 49 > /dev/null 2&>1
fi
#end
~~~
~~~
if [ 0 = 1 ] ; then
~~~
を
~~~
if [ $SHLVL = 1 ] ; then
~~~
に書き換えると見事動きました。
.profile に描き込むシェルスクリプトは $ をエスケープする必要があると思います。
こんな感じで。
~~~
cat < /dev/null 2&>1 &)
xset -r 49 > /dev/null 2&>1
fi
#end
EOS
~~~
ご参考まで
あああああごめんなさい!ミス発見しました!
当方、前段のシェルスクリプトで再確認したのですが、そちらは問題なくて、
後段の「fcitx-mozcのインストール」の方が間違っていました。
記事中の.profileに環境変数を設定する所の1行目が間違っていて、
(誤)
cat << EOS | sudo tee -a ~/.profile
(正)
cat << 'EOS' | sudo tee -a ~/.profile
のように「EOS」をシングルクオートでくくるのが正しかったです。
これで、ヒアドキュメント中の変数「$SHLVL」も展開されず、そのまま.profileに書き込まれるはずです。
(もちろん、$SHLVLの方をエスケープしても問題ないと思います)
シェルスクリプトの方はミスに気付いて修正して、後段は直し忘れていたようです。
宇宙まっくす様、a_sue様、ご指摘いただきまして、ありがとうございました!
ご返信&わざわざ追試までしていただきありがとうございます。
もう必要ないかもしれませんが、私の環境は、
・Windows 10 Home, ver 2004, OS build 19041.508
・コマンド実行は、スタートメニューから「Ubuntu 20.04 LTS」アプリを開いた時( echo $SHLVL では 1 が返ってくる。)
でした。
ご解決されてなによりです。
なるほど、EOSのほうをエスケープしても良いんですね!
そちらのほうが本文に環境変数を複数含む場合などにも対処できて良いですね。勉強になります☺
(あと、なぜ tee にパイプすると $SHLVL が 0 になるかは未だに理解できていません。)
すみません。追加でご報告まで。
(軽微ですが)
当該スクリプトの
> /dev/null 2&>1
の部分は、すべて
> /dev/null 2>&1
の誤記だと思われます。
bashを立ち上げるたびに、ホームディレクトリに
“1” という名前のファイルが作成されていて気づきました。
ああ、ホントだorz
実は、今回再確認したときに私も見つけて、「何このファイル」と思っていたところでした・・・
ご指摘ありがとうございます!
$SHLVLがゼロになる件、なんかUbuntu 20.04(か、bash ver5)のバグの予感がします。
ヒアドキュメントとパイプを組み合わせると、$SHLVLの値が一つ小さくなるみたいですね。
同じコマンドをWSL2+Ubuntu 18.04や、このWebサイトを動かしているCentOS 8でやってみたところ、三つとも「1」と帰ってきました。
間違ったコマンドを打ったときに誤った$SHLVLになるだけですので、気にしないのが吉かもしれませんね。
>同じコマンドをWSL2+Ubuntu 18.04や、このWebサイトを動かしているCentOS 8でやってみたところ、三つとも「1」と帰ってきました。
>間違ったコマンドを打ったときに誤った$SHLVLになるだけですので、気にしないのが吉かもしれませんね。
仰る通り、私のネイティブなUbuntu 18.04LTSの仮想端末でも、挙げられているすべてのケースで 1 となりました。
たしかに気にしてもしょうがなさそうですね。
念のため確認
xsetコマンドを修正(2020/10/14)の記事中
「この2>&1は、2&>1の誤りでした」ってあるのは
「この2&>1は、2>&1の誤りでした」の間違いですよね?
oh…何度もミスってごめんなさい! 2>&1 が正しいです
ここに記載しているコードも、間違ったコードを書いたつもりが修正後のものになってるし・・・
このとき急いで追記していたので頭が混乱していました。これから修正します。
ご指摘ありがとうございます!
ピンバック & トラックバック一覧
[…] WSL2+ubuntu20.04: GUI化 https://qiita.com/atomyah/items/887a5185ec9a8206c7c4 日本語化 https://qiita.com/myalpine/items/fb45b222924b2e61ea9f Desktop 日本語入力 https://astherier.com/blog/2020/08/install-fcitx-mozc-on-wsl2-ubuntu2004/ […]
[…] WSL2にFcitx+Mozcを入れて日本語入力する | AsTechLog (astherier.com) […]