読者です 読者をやめる 読者になる 読者になる

KATOエンジニヤリング開発日誌

「アウトプット無きエンジニアにインプットもチャンスも無い」の精神で書いています

vimrcをカスタムしてnode.jsの開発環境を作る

f:id:masayuki_kato:20170304222102j:plain

先週から新しいプロジェクトに配属されたのですが、使用できるソフトウェアが制限されている関係で、VirtualBoxで作成したOracle Linuxの仮想マシン内でvimを使用してnode.jsの開発を行う必要がでてきました。

現在のシステム開発でIDEを使用せずにプログラミングをするのはしんどいので、以前から導入しようと考えていた「vimrc」の設定を調べました。

vimで実現したかったこと

node.jsの効率のよい開発環境を考えてみました。

普段は開発環境としてAtomを利用することが多いので、それに近い機能を実現しようと探してみました。

ディレクトリのツリー表示

画像の左側にあるディレクトリやファイル名を一覧で表示できる機能です。

開発中にファイルのPATHをひと目で判別できるのが便利なのでこれは欲しい機能です。

f:id:masayuki_kato:20170304235844p:plain

開いているファイルのタブ化

画像の上部にある開いているファイルをタブで表示できる機能です。

現在開いているファイルがわかり、ファイル間を移動して素早く編集できるので効率が上がる機能です。

f:id:masayuki_kato:20170305000909p:plain

ツリー表示とタブ化を実現したvimの開発環境

ディレクトリのツリー表示と開いているファイルのタブ化を実現したvimの画面がこちらです。

f:id:masayuki_kato:20170305002015p:plain

私の「.vimrc」ファイル

下記リンクを参考にvimrcファイルを作成しました。

事前にmkdirコマンドでNeoBundleのプラグインを格納するディレクトリを作成しておく。

mkdir -p ~/.vim/bundle

「~/.vimrc」に配置するファイル

" vimの基本的な設定
set tabstop=4
set fenc=utf-8
set showcmd
set number
set cursorline
set showmatch
set laststatus=2
set wildmode=list:longest
set list listchars=tab:\▸\-
set ignorecase

"---------------------------
" Start Neobundle Settings.
"---------------------------
" bundleで管理するディレクトリを指定
set runtimepath+=~/.vim/bundle/neobundle.vim/

" Required:
call neobundle#begin(expand('~/.vim/bundle/'))

" NERDTreeを設定
NeoBundle 'scrooloose/nerdtree'

" autoclose
NeoBundle 'Townk/vim-autoclose'

" grep.vim
NeoBundle 'grep.vim'

" Nyan-modoki
NeoBundle 'drillbits/nyan-modoki.vim'

call neobundle#end()

" Required:
filetype plugin indent on

" インストールされていないプラグインがある場合にインストールするかどうか尋ねる設定
NeoBundleCheck

"-------------------------
" End Neobundle Settings.
"-------------------------

" controlキーとeを押すことNERDTreeコマンドのショートカットキーとして作動する
nnoremap <silent><C-e> :NERDTreeToggle<CR>

" Nyan-modokiの設定
set laststatus=2
set statusline=%F%m%r%h%w[%{&ff}]%=%{g:NyanModoki()}(%l,%c)[%P]
let g:nyan_modoki_select_cat_face_number = 2
let g:nayn_modoki_animation_enabled= 1

" Anywhere SID.
function! s:SID_PREFIX()
    return matchstr(expand('<sfile>'), '<SNR>\d\+_\zeSID_PREFIX$')
    endfunction

" Set tabline.
function! s:my_tabline()  "{{{
    let s = ''
    for i in range(1, tabpagenr('$'))
        let bufnrs = tabpagebuflist(i)
        let bufnr = bufnrs[tabpagewinnr(i) - 1]  " first window, first appears
        let no = i  " display 0-origin tabpagenr.
        let mod = getbufvar(bufnr, '&modified') ? '!' : ' '
        let title = fnamemodify(bufname(bufnr), ':t')
        let title = '[' . title . ']'
        let s .= '%'.i.'T'
        let s .= '%#' . (i == tabpagenr() ? 'TabLineSel' : 'TabLine') . '#'
        let s .= no . ':' . title
        let s .= mod
        let s .= '%#TabLineFill# '
    endfor
    let s .= '%#TabLineFill#%T%=%#TabLine#'
    return s
endfunction "}}}
let &tabline = '%!'. s:SID_PREFIX() . 'my_tabline()'
set showtabline=2 " 常にタブラインを表示

" The prefix key.
nnoremap    [Tag]   <Nop>
nmap    t [Tag]

" Tab jump
for n in range(1, 9)
    execute 'nnoremap <silent> [Tag]'.n  ':<C-u>tabnext'.n.'<CR>'
endfor

" t1 で1番左のタブ、t2 で1番左から2番目のタブにジャンプ
map <silent> [Tag]c :tablast <bar> tabnew<CR>
" tc 新しいタブを一番右に作る
map <silent> [Tag]x :tabclose<CR>
" tx タブを閉じる
map <silent> [Tag]n :tabnext<CR>
" tn 次のタブ
map <silent> [Tag]p :tabprevious<CR>
" tp 前のタブ