自分好みのVim環境を作っていく（第1回 Defx編）

# 初めに

記事中にはdein.vimによるプラグイン管理が含まれていますが，
当方dein.vimの使用は初心者のため書き方等ご容赦をください．
また，vim script及び設定にはそこまで詳しくないので悪しからず．


# Defxとは
Defxとはdeinの作者であり，暗黒美夢王であるShougoさん(様？)作のファイルブラウザ．
他のファイルブラウザとの違いはそのカスタマイズ性？だと思っている．
デフォルトというか設定しないとファイルの選択とか何もできない．

# 完成物
初めに完成状態のDefxを
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204702/aa126e7f-9288-3ba1-fb31-a72e3f5ce6e9.png)
今のところの拘りはFloating window　そしてプレビュー画面．
(実はまだこの環境作ってから本格的に開発してない)

# インストール
deinのプラグインはtomlで管理．また，defxの設定はdefx.rc.vimにするとする．

```toml:dein.toml
[[plugins]]
repo = 'Shougo/defx.nvim'
depends = ['defx-git', 'defx-icons', 'vim-choosewin']
hook_add = '''
source ~/.config/nvim/plugins/defx.rc.vim
'''

[[plugins]]
repo = 'kristijanhusak/defx-icons'

[[plugins]]
repo = 'kristijanhusak/defx-git'

[[plugins]]
repo = 't9md/vim-choosewin'
hook_add = '''
let g:choosewin_overlay_enabled = 1
let g:choosewin_overlay_clear_multibyte = 1
'''
```
defx以外のプラグインは依存するカスタムを行っているからです．
defx以外のプラグインの依存プラグインは省略．

- defx-icons
    - 名前からわかるかもしれないが，filetypeに応じてアイコンを変えてくれるプラグイン
- defx-git
    - Defx上でファイルごとにgitの状態を教えてくれるプラグイン
- vim-choosewin
    - ファイルのOpen時やwindow操作を直感的にしてくれるプラグイン
    - 今回はFloating windowにした場合の問題点克服用に導入　できる人なら入れなくていいと思う

# 設定
前述したとおり今回のポイントはFloating windowとpreview

## floating windowにする
`call defx#custom#option`でDefx起動時のwindowの設定が可能．
`g:floatin_win_{width, height}\_percent`はinit.vimにてfloating windowを使用するときの全体の定数として設定，1以下の小数)
設定を細かく見ていく．
`'split': 'floating'`　windowをfloatingに．
`'vertical_preview'`, `'floating_preview'`  previewをfloating window上で分割表示して
その他位置サイズ設定．
defxリポジトリ内のhelpファイル？には'_'でなく'-'で記載されていたので苦戦...

```vim:defx.rc.vim
" Defx config
nnoremap <silent>ff :<C-u>Defx -listed -columns=mark:indent:git:icons:filename:type<CR>

call defx#custom#option('_', {
      \ 'split': 'floating',
      \ 'vertical_preview': v:true,
      \ 'floating_preview': v:true,
      \ 'preview_width': float2nr(&columns * g:floating_win_width_percent / 2),
      \ 'preview_height': float2nr(&lines * g:floating_win_height_percent),
      \ 'wincol': float2nr((&columns - (&columns * g:floating_win_width_percent)) / 2),
      \ 'winrow': float2nr((&lines - (&lines * g:floating_win_height_percent)) / 2),
      \ 'winwidth': float2nr(&columns * g:floating_win_width_percent / 2),
      \ 'winheight': float2nr(&lines * g:floating_win_height_percent),
      \ })
```
↑だけでfloating window化は達成！
## floating windowにしたことによる問題...
- floating windowを使用し，ファイルを開こうとするとそのままfloating window上で開こうとしてしまう．
- floating windowが開いたままになってしまう．

この2つの問題が発生．
1つ目は通常のopenであるとdefxと同じバッファ，つまりfloating window上に開こうとするのだ．
floating window上で開く問題に対し，今回はvim-choosevimプラグインを使用した．
この時，`<CR>`はディレクトリを開く動作も兼任していることがポイントとなる．
三項演算子を用いて該当ファイルがディレクトリであった場合，通常のopen操作(下位ディレクトリへ移動)を
ファイルであった場合，choosewinを使用してファイルを開く様になっている．
2つ目はファイルをsplitで開く場合，floating windowが残り続けてしまう問題である．
正直原因はわかっていないが何はともあれmulti actionにてquitを追加することで回避した．

## preview画面
preview画面の設定はfloating windowとともに完了したはずであった...
いや完了はしているのだが求めていたものと違っていた．
それは公式のバインドだと`P`を押さないとプレビューが表示されないことである．
理想はファイル選択時に常にプレビューされていることだ．
そこでDefxの公式リマップ`j`と`k`に追記を施す.
追記したのは`. defx#do_action('preview')`である．
これは`j`,`k`を押した際に`P`を押したのと同じようにPreviewを表示させる機能を追加している．

```vim:defx.rc.vim
autocmd FileType defx call s:defx_my_settings()
function! s:defx_my_settings() abort
  " Define mappings
  nnoremap <silent><buffer><expr> <CR>
        \ defx#is_directory() ?
        \ defx#do_action('open') :
        \ defx#do_action('multi', [['open', 'choose'], 'quit']) 
  nnoremap <silent><buffer><expr> E
        \ defx#do_action('multi', [['open', 'vsplit'], 'quit'])
  nnoremap <silent><buffer><expr> j
        \ line('.') == line('$') ? 'gg' : 'j' . defx#do_action('preview')
  nnoremap <silent><buffer><expr> k
        \ line('.') == 1 ? 'G' : 'k' . defx#do_action('preview')
endfunction
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204702/4fd1826e-f5dc-8df9-5dc5-972b32568ce3.png)
↑choosewinを使用している時の様子, この状態でaを押すと後ろの全画面に表示される．

# あとがき
長々と纏まりのない文章を読んでいただきありがとうございます
今後defxそしてvim script自体への理解度が深まったらより良いDefxを目指そうかなと思います

最後にこのdefxのconfigを含めたdotfilesのgitリポジトリを載せておきます．
[dotfiles - github](https://github.com/SeitaHigashi/dotfiles)