Termux (Android版)にPowerline-Goを導入する

初めてのQiita投稿になります。
文才がないのでおかしな文章になる場合がありますが、ご了承ください。 
また、Markdown記法に慣れていないのでデザイン的におかしいところもございます。ご了承ください。 

# 今回行うこと
* AndroidにTermuxを導入する
* Termuxのシェルをzshに変更する
* Powerline-Goを導入する

# このような方におすすめ
Androidでシェル使うし普段LinuxとかでPowerline-Go使ってるけど、わざわざQemuとかでLinux仮想立ててするほどでもないなー－－と思ってる人

# 必要なもの
* Androidスマートフォン or タブレット
※今回はXperia XZ (SO-01J、Android 7.0、root未取得)を使用しました。
* Termux **(Google Play版ではなく必ず公式GitHub or F-Droidのものを使うこと)**
※ 公式GitHub Releases：https://github.com/termux/termux-app/releases

※以下root権限がある場合
* ファイルマネージャー (root直下が見えるもの)

root権限があると各種ファイルの確認、編集が楽になる。

# 導入方法
## ・Termuxの導入

1. 公式GitHub or F-DroidからTermuxをダウンロードする。
Google Playにも公開されているが、**長期間メンテナンスされておらず不具合が多々あるので使用すべきではない。**

2. Androidの設定で提供元不明のアプリインストールを許可しておく。

3. ダウンロードしたapkを通常通りインストールする。

4. Termuxを起動する。
初回はbootstrapのインストールが入る。

5. ソースをアップデートする
```
$ pkg update
$ apt update
$ apt upgrade
```
Termuxではソース管理にAPTを使用しているため、Debian系列のLinuxディストリビューションを使用したことのある人は使い勝手はわかると思う。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508393/e9c9b031-2744-e38c-cc77-1ff07573519d.png width=25%>

なおpkgとaptで2回ソース・パッケージ更新を行っているが、Termux上ではどうもpkgで更新されるソースとaptで更新されるソースがわずかに違うようで、パッケージをインストールする際にaptでは見つからないのにpkgでは見つかる、なんてことがある。そのため、念のため2回更新を行っている。
大半の場合は1回目のpkg updateで更新が終わる。

これでTermux自体の最低限の導入が完了した。

## ・シェル変更
正直シェルなんて人の好みなので無理にデフォルトのbashから変える必要はない。
しかし、macOSもCatalinaからzshだし、最近の流れ的にも主流はzshらしいので今回の場合は変更しておく。
bashでもPowerline-Goは使えるので問題ない(いじるファイルが変わるだけ)。

### zshをインストールする
```
$ apt install zsh
```
### デフォルトのシェルをzshに変更する
```
$ chsh -s zsh
```

この状態で一度Termuxを終了する。

再度起動させるとシェルがzshに変更されている。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508393/78038ce6-972c-4e9d-d6fb-d53f71c2a450.png width=25%>

## ・Powerline-Goを導入する
### 内部ストレージへアクセスできるようにする
```
$ termux-setup-storage
```
ストレージへの許可を求められるので許可して再度コマンドを実行する。  
/data/data/com.termux/files/homeに/sdcardへのシンボリックリンクが作成される。

### GoとGit、vimをインストールする
```
$ apt install golang git vim
```
vimに関しては好みのエディタがあればそれでも大丈夫。
`which go`で確認できるが、通常`/data/data/com.termux/files/usr/bin/go`にGoはインストールされる。

### PATH、GOPATHを通す
```
$ touch ~/.zshrc
$ vim ~/.zshrc

# 記述内容
export GOPATH=/data/data/com.termux/files/home/go
export PATH=$GOPATH/bin:$PATH

# 適用
source ~/.zshrc
```
ここではvimを用いて記述していますが、echo等で直接記述しても構わない。
~~(echoで記述する方法に慣れていないんです...)~~

また、正しく`.zshrc`が作成されたかどうかは`ls -a`で確認できる(基礎中の基礎だが...)。

### Powerline-Goをインストールする
```
$ go install github.com/justjanne/powerline-go@latest
```
`GOPATH/bin`(今回の場合だと`/data/data/com.termux/files/home/go/bin`)にインストールされる。

### Powerline-Goの設定を書き込む
`~/.zshrc`に設定を書き込む。
```
$ vim ~/.zshrc

# 記述内容
function powerline_precmd() {
    PS1="$($GOPATH/bin/powerline-go -error $? -jobs ${${(%):%j}:-0})"

    # Uncomment the following line to automatically clear errors after showing
    # them once. This not only clears the error for powerline-go, but also for
    # everything else you run in that shell. Don't enable this if you're not
    # sure this is what you want.

    #set "?"
}

function install_powerline_precmd() {
  for s in "${precmd_functions[@]}"; do
    if [ "$s" = "powerline_precmd" ]; then
      return
    fi
  done
  precmd_functions+=(powerline_precmd)
}

if [ "$TERM" != "linux" ] && [ -f "$GOPATH/bin/powerline-go" ]; then
    install_powerline_precmd
fi

# 適用
$ source ~/.zshrc　
※Termuxの再起動でも可。
```
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508393/05e1fc3f-ac0a-03b9-9e14-dc3e44f93f8a.png width=25%>

※Go導入以降のここまでの手順は公式にのっとったものなので、「俺はbashなんだ」とか「私fishなんですけど」って人は公式GitHubを参考にして記述を変えてほしい。
・公式GitHub：https://github.com/justjanne/powerline-go

すると文字化けする。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508393/16580622-295e-cb79-bd2f-fa0186f53dd9.png width=25%>
Powerline-Goを使ったことがある人ならわかると思うが、これは単純に適したフォントが適用されていないからである。
Termuxの場合、Termux-Styleを導入することでフォントを指定できる。

### フォントの指定
```
$ cd

# termux-styleのリポジトリをクローン。
$ git clone https://github.com/adi1090x/termux-style
$ cd termux-style

# インストールスクリプトを実行。
$ ./install

# 作業フォルダの削除
$ cd ..
$ rm -rf termux-style
```
Termux-styleをインストールしたら実行してフォントを変更する。
Source-Code-Proがおすすめ。
```
$ termux-style

    ┌──────────────────────────────────────────────────┐
    │░▀█▀░█▀▀░█▀▄░█▄█░█░█░█░█░░░░░█▀▀░▀█▀░█░█░█░░░█▀▀░░│
    │░░█░░█▀▀░█▀▄░█░█░█░█░▄▀▄░▄▄▄░▀▀█░░█░░░█░░█░░░█▀▀░░│
    │░░▀░░▀▀▀░▀░▀░▀░▀░▀▀▀░▀░▀░░░░░▀▀▀░░▀░░░▀░░▀▀▀░▀▀▀░░│
    └──────────────────────────────────────────────────┘
    [*] By- Aditya Shakya // adi1090x

    [C] Colors (89)
    [F] Fonts (20)
    [R] Random
    [I] Import
    [A] About
    [Q] Quit
    
    [Select Option]: F
 
    [1] Anonymous-Pro
    [2] Courier-Prime
    [3] DejaVu
    [4] Fantasque
    [5] Fira
    [6] FiraCode
    [7] GNU-FreeFont
    [8] Go
    [9] Hack
    [10] Hermit
    [11] Inconsolata
    [12] Iosevka
    [13] LiberationMono
    [14] Meslo
    [15] Monofur
    [16] Monoid
    [17] OpenDyslexic
    [18] Roboto
    [19] Source-Code-Pro
    [20] Ubuntu

    [Select font (1 to 20)]: 19
    
    [*] Applying Fonts...
    [*] Reloading Settings...
    [*] Applied Successfully.
```

すると文字化けが解消されている。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508393/6c666b4f-9a95-076c-23a9-4f85ac09d567.png width=25%>

# Android 7以下の環境での対処法について
先ほどのスクリーンショットでは
```
WARNING: linker: /data/data/com.termux/files/home/go/bin/powerline-go: unsupported flags DT_FLAGS_1=0x8000001 
```
と警告が表示されてしまっているが、これはAndroid 7以下で動作させると表示されるエラーメッセージのようだ。
elfとかいうものが悪さをしているらしく、Android 7以下の環境では対処する必要がある。
※該当Issue：https://github.com/termux/termux-packages/issues/4894

## 対処法
```
$ pkg install termux-elf-cleaner
$ termux-elf-cleaner ~/go/bin/powerline-go
```
これでエラーメッセージが表示されなくなる。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508393/024fd1e8-4042-27ef-fe61-3b581eceaa23.png width=25%>

# まとめ
今回はAndroid上のTermuxにPowerline-Goを導入する方法を紹介した。
ググってもなかなかPowerline-GoをTermuxに導入している事例は少なく、またPowerline-Goの公式GitHubを見てもAndroid上のTermuxだとうまくいかない点などがあり、備忘録もかねて今回記事にまとめた。

Powerline-Go愛用者の皆様のお役に立てれば幸いだ。