Fernに関するちょっとした話


Fernの作者によるこれを読んで、VimのファイラーをNERDTreeからFernに変えてみようと思った時に起こったちょっとした話

https://github.com/lambdalisue/fern.vim

.vimrc

call jetpack#begin()
Jetpack 'lambdalisue/fern.vim'
call jetpack#end()

syntax on
filetype plugin indent on

""" Fern
" Show hidden files
let g:fern#default_hidden=1

" Show file tree with Ctrl+n
nnoremap <C-n> :Fern . -reveal=% -drawer -toggle -width=40<CR>

" Color
colorscheme abstract

FernはCtr + n[1]でドロワーとして開くようにしている。

ツリーのノードに^_がくっつく

Macのターミナルだとなんかこんな感じでファイルツリーの最後に^_が表示される。

  home
  |- Projects/^_
   |+ specreq/^_
   |- tools/^_
    |  myip.sh^_                                                           
    |  pass.rb^_

理由はMacのデフォルトのvimはconcealを無効にしてビルドされているから。ビルドし直せば^_は消える[2]。私はHomebrewで以下のように。vim --versionすれば何が有効になっているかはわかる。vimのパスが変わるので注意。

brew intall vim --build-from-source 

ツリーの左側の色

カラースキームによってはツリーの左側の色に違和感があるかもしれない。どこのことを言ってるのかわかりやすくするためにわざと白くしてみた。

ひとまず今の定義を確認してみる。vimを開いて:hiとやるだけ。

これ自体は~/.vim/colorsにあるカラースキームの定義ファイル(ハイライトグループというらしい)を表示しているだけのはず。でも、ツリーの横の部分ってどこを書き換えたらいいの...?

と思っていたら、カーソルのあるところのカラースキームの定義を教えてくれるvim関数に出会った。以下を.vimrcに書いて、色ついているところにカーソル合わせて、:SyntaxInfoを叩くと下の方にハイライトグループが表示されるのでそこを書き換えればよい。

function! s:get_syn_id(transparent)     
  let synid = synID(line("."), col("."), 1)
  if a:transparent
    return synIDtrans(synid)            
  else
    return synid
  endif
endfunction
function! s:get_syn_attr(synid)
  let name = synIDattr(a:synid, "name")
  let ctermfg = synIDattr(a:synid, "fg", "cterm")
  let ctermbg = synIDattr(a:synid, "bg", "cterm")
  let guifg = synIDattr(a:synid, "fg", "gui")
  let guibg = synIDattr(a:synid, "bg", "gui")
  return {
        \ "name": name,
        \ "ctermfg": ctermfg,
        \ "ctermbg": ctermbg,
        \ "guifg": guifg,
        \ "guibg": guibg}
endfunction
function! s:get_syn_info()
  let baseSyn = s:get_syn_attr(s:get_syn_id(0)) 
  echo "name: " . baseSyn.name .
        \ " ctermfg: " . baseSyn.ctermfg .
        \ " ctermbg: " . baseSyn.ctermbg .
        \ " guifg: " . baseSyn.guifg .
        \ " guibg: " . baseSyn.guibg
  let linkedSyn = s:get_syn_attr(s:get_syn_id(1))
  echo "link to"
  echo "name: " . linkedSyn.name .
        \ " ctermfg: " . linkedSyn.ctermfg .
        \ " ctermbg: " . linkedSyn.ctermbg .
        \ " guifg: " . linkedSyn.guifg .
        \ " guibg: " . linkedSyn.guibg
endfunction
command! SyntaxInfo call s:get_syn_info()    

ちなみに出典はここ

https://qiita.com/sff1019/items/3f73856b78d7fa2731c7

これはめっちゃ便利な関数だったが、なぜかツリーの左側の部分だけはカーソルで選択できないので使えなかった。その後、いろいろ触っていてここのハイライトグループはSignColumnだとわかった。

ということで、今回かえたのはターミナルのツリーの左端のカラムの色とディレクトリの色

"hi Directory ctermfg=62 ctermbg=NONE cterm=NONE guifg=#5A5AE6 guibg=NONE gui=NONE
hi Directory ctermfg=229 ctermbg=NONE cterm=NONE guifg=#FEF29E guibg=NONE gui=NONE
"hi SignColumn ctermfg=246 ctermbg=235 cterm=NONE guifg=#909194 guibg=#2E2F31 gui=NONE
hi SignColumn ctermfg=246 ctermbg=0 cterm=NONE guifg=#909194 guibg=#2E2F31 gui=NONE

ちなみにこれらはvimのコマンドなので、:hi Directory ctermfg=**とかで色を一時的にあてて試してみることができる。

あと、いじっているとカラースキームがおかしくなることがある。その場合はカラースキームを以下のようにリロードするとよい。

:source ~/.vim/colors/molokai.vim

Fernのよく使うショートカット

  • j k - ツリー上でカーソルを上下に動かす
  • l - ノードを選択、h - もとに戻る
  • N - 新しいファイルを作成
  • K - 新しいディレクトリを作成
  • R - ノードをリネーム

... 習得中

その他の参考になりそうなサイト

これもいい情報が満載

https://qiita.com/youichiro/items/b4748b3e96106d25c5bc

まとめ

Fernはいいぞ。

脚注
  1. NERDTreeの時からCtr + nだったから慣れているのと、これまでお世話になったNERDTreeに敬意を払い、使い続ける。 ↩︎

  2. 作者の方に教えてもらった。感謝。 ↩︎