Android開発におけるshellとvimの個人的な活用方法について

Android開発では高機能なAndroid Studioという開発環境があります。そのため、shellやvimを使わなくてもGUIでほとんどのことができてしまいます。ショートカットも豊富にあるので、shellやvimを使わなくても効率的な開発ができます。

開発現場でも、gitのコマンドを使わずにAndroid StudioのGUIから操作している方をよく見かけます。アンケートを取ったわけではないのですがほぼGUIのみで開発している方も多い気がします。

しかし私は積極的にshellやvimを使うことにしています。

今回はAndroid開発において、なぜ高機能なGUIがあるのにshellやvimを使うとよいのか、また私がどのように使っているのかをご紹介します。


## なぜshellやvimを使うのか、学ぶのか

仕事でAndroid開発しかやらない、ということはないからです。現状ほとんどの業務をAndroid Studioからやっているにしても、メモを取ったり、データを処理したりするような、IDEを使わない作業もやっていると思います。

ExcelやNortionを使ったりする方も多いと思いますが、shellやvimを手段として持っていると、効率がはるかに違います。

さらに、ずっとキャリアの中でAndroid開発だけをやり続けるとは限りません。バックエンドやiOS開発など別の技術の門を開くかもしれません。またAndroid開発を本流でやっていくとしても、他の技術を触ったりすることは多々あります。

Android開発で習得した技術は基本Android開発でしか役に立ちませんが、shellやvimは他の開発ばかりか、開発でない仕事でも役に立ちます。それなりに学習コストはありますが、コストに見合う以上の見返りがあります。必須とは言い切れないですが、それらを学び、使うことは、必須並に強く推奨したいところです。


## 自分の環境

shellはfish、vimはAndroid StudioではIdeaVim、それ以外ではNeovimを使っています。

[IntelliJ IDEA の Vim \| IntelliJ IDEA ドキュメント](https://pleiades.io/help/idea/using-product-as-the-vim-editor.html)

Android StudioでIdeaVimのプラグインをインストールすると、IDEのエディタでvimのキーバインディングが使えるようになります。

shellはfishを入れていますが他のものでも良いと思います。自分もあまり深く考えずfishにしたので、機会があれば見直そうかと考えています。

Neovimでなく普通のVimでも最初は良いと思います。慣れてきたらNeovimに乗り換えるのを検討しても良さそうです。


## これからshellやvimを使っていきたい方へ

gitでバージョンコントロールをしているのであれば、手始めにここからコマンドを扱うのに慣れていきましょう。

GUIからマウスクリックでチェックアウトしているところを、`git checkout main`のようなコマンドを打つことで、チェックアウトします。

GUIからでもできますが前述のようにコマンドだと他の開発環境でも同じ操作感でタスクを実行することができます。

gitに関して言うと、aliasを設定すると楽になります。

```shell
vi ~/.gitconfig
```

```:~/.gitconfig
[alias]
	br = branch
	ps = push
	pl = pull
	co = checkout
    cm = commit
```

こうするとチェックアウトのコマンドを`git co main`のように実行できるようになります。

またfishでは過去に実行したコマンドの補完が表示され、途中まで入力すると右方向キーによって一発で入力できるようにできます（予測変換みたいなイメージ）。

またfishでabbreviationsを設定すると、`g`と入力してタブキーを押すだけで、`git `という入力が自動で展開されます。

コマンドを使っていくとGUIよりも少ない手数でやりたいことを実現できるようになります。またマウスを使わなくてもよくなくなるので実行スピードと楽さが全然違います。


## adbコマンドを簡単に入力する
shellスクリプトやfish functionを使えば、adbコマンドを楽に実行できます。

私は`screenshot`というfunctionを作っているので、コマンドラインに`screenshot ファイル名`と入力するだけで、接続された端末のスクショをPC内に転送できるようにしています。

```
function screenshot
  adb shell screencap -p /sdcard/$argv.png
  adb pull /sdcard/$argv.png ~/Documents/screenshot/
  open ~/Documents/screenshot/
end
```

（接続デバイスが一つのときに動作します）

シェルスクリプトを活用するとこうしたツールを簡単に作れるので、やはりGUIでなくコマンドに慣れていったほうがよいですね。


## IdeaVim


Vimは義務教育にするべきなのではないかと思うくらい、文字入力を楽に、仕事を生産的にしてくれます。

Vimの使い方をこの記事で扱うのはボリューム的に厳しいので、IdeaVimの活用について記載します。

基本的には通常のVimと同じようにキーバインディングを享受していけば良いと思います。
vimrcについては、`~/.ideavimrc`で設定するようです。

検索や置換はGUIかVimのどちらを使えばよいか？という問題があります。

前述の方針だと他の技術でも応用が効くVimを使っていきたいところですが、
最初はVimの検索・置換を使いこなすのは難しいと思います。
また自分の環境ではVimの置換が重くなったりして動きがもっさりしてしまうことがあります。

私はできるだけVimの機能を使うようにして、ちょっと難しいと思ったときはAndroid Studioの検索・置換機能を使うようにしています。そして余裕があるときにVimでトライしています。

また初期設定だとVimの検索・置換はやりづらいですが、`~/.ideavimrc`に設定を加えるとやりやすくなります。

[こちらの記事様 RubyMine：ideavimの設定 & ideavimrcについて \#IdeaVim \- Qiita](https://qiita.com/iwaseasahi/items/4b19bdf1885801649460))を参考にすると使いやすくなります。例えば検索対象のハイライトやインクリメンタル検索は使いやすさが全然違いますね。


## Neovim


Android開発以外のメモや文書はNeovim環境で作成しています。markdown形式のものを作成しています。

開発メモは、最終的にnortionにまとめていますが、Neovimで作ったローカルのテキストをコピペして貼っています。


## さいごに


shellとvimについて、ほんの一部しか紹介できていません。氷山の一角のさらに一角であり、shellとvimの恩恵は本当に大きいです。

機会があれば、またこのテーマで書きたいと思います。