これが無いと個人的に業務が辛いツール紹介(fzf, vim, tmux) ~ひきこもりターミナルライフ~


# はじめに


「[Applibot Advent Calendar 2020](https://qiita.com/advent-calendar/2020/applibot)」 2日目の記事になります。

前日は @growsic さんの
[【git tag】プッシュしたtag名を削除・変更してはいけない理由〜manコマンドで読めるgitメンテナの怒り〜](https://qiita.com/growsic/items/60928fc67c9efe373a73) という記事でした!



# これが無いと個人的に業務が辛いツール紹介(fzf, vim, tmux)

普段の業務で**これがないと辛いツール**を紹介していこうと思います。

- fzf (ファジーファインダー)
- vim (エディタ)
- tmux (端末多重化)

以上の３つを用いることで快適なターミナルライフを送れています＼(^_^)／
１つずつ紹介させてください。



## fzf

ファイル検索する際、完全なファイル名を覚えていることなんてあまりないと思います。
こちらは**なんとなくこんな名前だったな~**みたいな名前でファイルやフォルダを検索することを可能にする**CLIツール**になります。
https://github.com/junegunn/fzf




お使いのPCへのインストールは以下のページを参考に
https://github.com/junegunn/fzf#installation

macなら以下のコマンドで導入できます。

```sehell:shell
brew install fzf

# To install useful key bindings and fuzzy completion:
$(brew --prefix)/opt/fzf/install
```


### コマンド

#### 基本

ターミナルで`fzf`と打つと実行されます。
デフォルトでは**配下のファイルを検索**してくれるようなコマンドになっています。


```shell
fzf
```

[vimリポジトリ](https://github.com/vim/vim)で`main.c`を検索する例です。
![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260131/0078b700-5440-1283-7bab-c9f849b7d7d4.gif)

fzfと打った後にフォルダ配下のファイルを曖昧検索して一番近しいファイルが予測として出てきています。
しかし、この例では標準出力にpathが出力されるだけであまり便利感がないです。

#### 応用

fzfコマンドだけでは検索したあと、標準出力されるだけのため、**他のコマンドと組み合わせる**ことで**威力を発揮**します。
`$()`を用いることで実行結果を展開することができるので、以下の例でvimで開くことができます。

```shell
vim $(fzf)
```

上記のコマンドを打ち、開きたいファイル名を検索した後は、
`ctrl-n`で下へ, `ctrl-p`で上へ選択移動できます。

![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260131/6f1dddc3-f011-3e95-69e7-95a213aa851d.gif)

完全なpathを打つことなく、曖昧に検索してファイルを開くことができました。
なんとなくのファイル名を打つだけでファイルを開けてしまうのがファジーファインダー最高といった感じです...!



### wiki

以上のような`fzf`を活用した例がfzfの**wikiにたくさん**のっています＼(^o^)／
https://github.com/junegunn/fzf/wiki/Examples


.bashrcや.zshrcに記載することでターミナルでいつでも使えるようになります。


**お気に入り**

```shell:.zshrc
# fbr - checkout git branch
fbr() {
  local branches branch
  branches=$(git --no-pager branch -vv) &&
  branch=$(echo "$branches" | fzf +m) &&
  git checkout $(echo "$branch" | awk '{print $1}' | sed "s/.* //")
}
```
ローカルブランチをあいまい検索してチェックアウトするやつです。

![3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260131/fb4d78e2-ff65-a721-4e47-d060a9b62343.gif)

`fbr`と打った後にcheckoutしたいブランチ名を入力することで選択したブランチにcheckoutすることができます。
少ないブランチだとありがたみが少ないですが、開発が進み、ブランチが増えてくるとなんとなくの名前でブランチを検索できるのがすごく嬉しいです。

## vim

vimは言わずもがな最高なので特に紹介はないです...。
自分が使っているプラグインと今回紹介した`fzf`に因んで`vim-fzf`の紹介をしようと思います。


### simeji/winresizer

windowのリサイズが高速/手軽にできるようになります。
ctrl-e [h/j/k/l] で高速にリサイズ！

https://github.com/simeji/winresizer

### neoclide/coc.nvim

vimがIDEになってしまうプラグイン。
補完やら定義ジャンプほんとすごい。
[vim-lsp-settings](https://github.com/mattn/vim-lsp-settings)から乗り換えたがこちらも良い感じ。

https://github.com/neoclide/coc.nvim


### mechatroner/rainbow_csv

色がついてcsvが見やすくなるプラグイン。
sqlっぽいクエリで絞り込むこともできるが扱いこなせていない...。

https://github.com/mechatroner/rainbow_csv


### junegunn/fzf.vim
先ほどのfzfをvim上から使えるようにしたプラグインになります。
- https://github.com/junegunn/fzf.vim


#### 導入
vimプラグインマネージャの[vim-plug](https://github.com/junegunn/vim-plug)を利用している場合の導入例です。


```vimscript:vimrc

call plug#begin('~/.vim/plugged')
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
call plug#end()


" fzf settings
let $FZF_DEFAULT_OPTS="--layout=reverse"
let $FZF_DEFAULT_COMMAND="rg --files --hidden --glob '!.git/**'"
let g:fzf_layout = {'up':'~90%', 'window': { 'width': 0.8, 'height': 0.8,'yoffset':0.5,'xoffset': 0.5, 'border': 'sharp' } }

let mapleader = "\<Space>"

" fzf
nnoremap <silent> <leader>f :Files<CR>
nnoremap <silent> <leader>g :GFiles<CR>
nnoremap <silent> <leader>G :GFiles?<CR>
nnoremap <silent> <leader>b :Buffers<CR>
nnoremap <silent> <leader>h :History<CR>
nnoremap <silent> <leader>r :Rg<CR>

```

導入することでvim上からfzfを扱えるようになります(T_T)/!



上記の設定で

- `space+f`でファイル検索
- `space+g`でgitファイル検索
- `space+r`でgrep検索
- ...

のようなキー設定になっています。


#### 操作例
以下、実際の画面と操作コマンドです。


![5 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260131/9c4d15df-d0f7-b992-5404-1629fb32261d.gif)



```shell:shell
# とりあえずvim開く
vim

# ファイル検索 (ここからはvimでの操作)
space + f
# ファイル名入れる
main.c
# 開く
Enter

# もうひとつ開きたいファイルがあるのでファイル検索
space + f
# ファイル名入れる
change.c
# ファイル開く(画面分割-横)
ctrl-v

# ファイル上にあるこの関数使っているとこ調べたいのでgrep
space + r
# 関数名いれる
change_warning
# ファイル開く(画面分割-縦)
ctrl-x
```

fzfのおかげでvim上から目的のファイルへ簡単にたどり着くことができます...!


## tmux

端末の画面を分割したり、複数タブで管理できたり、セッションをデタッチできたりと便利なやつです!
特に設定はしていなく、初期設定(prefix: Ctrl+B)で使用しています。

### 導入
macでのインストールなら以下で!

```
brew install tmux
```

### 操作
一度ターミナルで`tmux`と打つと起動し、
そのあと、コマンドやプレフィックスと呼ばれる `Ctrl+b` を押した後、
特的のキーを入力することで操作ができます。



よく使うコマンド チートシート


|コマンド  |ショートカット  |概要  |
|---|---|---|
|tmux new-window  |ctrl-b + c  |ウィンドウ作成|
|tmux kill-window  |ctrl-b + &  |ウィンドウ破棄|
|tmux next  |ctrl-b + n  |ウィンドウ次移動|
|tmux prev  |ctrl-b + p  |ウィンドウ前移動|
|tmux split  |ctrl-b + "  |ペイン分割 横 |
|tmux split -h |ctrl-b + %  |ペイン分割 縦 |
|tmux kill-pane |ctrl-b + p  |ペイン破棄|
|tmux detach |ctrl-b + d  |デタッチ|
|tmux attach |-|アタッチ|

tmuxがあるおかげでvimでファイル編集している際に
ビルドしたいなーて思ったりgit操作したいなーって時に適当に画面分割してそちらのターミナルで操作することができて便利です。



以下はソースファイルを開いているときに
`git pull` して`make`する時の例です。


![6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260131/5bf1060e-5d9e-9464-acb1-8e9277fae387.gif)


操作コマンド

```
# とりあえずvim開く
vim

# ファイル検索 (ここからはvimでの操作)
space + f
# ファイル名入れる
main.c
# 開く
Enter

# git使いたいから上下に画面分割したい
ctrl+b "
# git操作
git status
git pull origin master

# コンパイルしたいから左右に画面分割したい
ctrl+b %

# コンパイル
make
```

ターミナルを複数開いて、画面が散らかってしまうことが少なくなったのですごく重宝しています。



# おわりに

以上のfzf, vim, tmuxの三種の神器のおかげで膨大なソースコードを相手に戦えている気がします＼(^o^)／

ターミナル内で業務を完結!...させているとカッコ良いのですが、

JetBrainsさんの強大な力には及ぶことが出来ず、
Intellij等に頼っている部分もあるため、
**軽いコード調査・修正や設定ファイル編集・git操作・コンパイル等はターミナル**、
**ガッツリコード書いたりデバッグする場合はIDE**を使用するという使い分けをしています。

いつかはターミナルに引きこもれると夢見て**精進**していこうと思います!


「[Applibot Advent Calendar 2020](https://qiita.com/advent-calendar/2020/applibot)」 2日目の記事でした！
明日は @taratarai さんです！