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

カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

Vimの環境を晒してみる(2013)

プログラミング プログラミング-Vim

あっという間に三が日も終わろうとし、時の切なさを感じている@masudaKです。

そこまで目新しいネタもないため、自分のVimの環境を晒してみたいと思います。

この記事はVim Advent Calendar 2013の1月3日分の記事となります。

説明は以下の.vimrcがベースとなるので、何かあればそこを見て頂くか、コメントとかでお願いします。@masudaKにメンションでも構いませんので、いくらでもツッコミお願いします。
https://raw.github.com/masudaK/dotfiles/master/.vimrc

初期化

まず新しい環境を構築する際にはGithubから初期化用の簡単なファイルを走らせます。
以下のスクリプトで既存ファイルをまず退避させます。

#/bin/sh
readonly BASHRC=$HOME/.bashrc
readonly ZSHRC=$HOME/.zshrc
readonly VIMRC=$HOME/.vimrc
readonly GVIMRC=$HOME/.gvimrc

# create original .basrc
if [ -e ${BASHRC} ]; then
    mv ${BASHRC} ${BASHRC}.orig
else
    echo "There is no ${BASHRC}"
fi

# input source command
cat <<-\_EOT_ > ${BASHRC}
  if [ -f $HOME/dotfiles/.bashrc ]; then
    source $HOME/dotfiles/.bashrc
  fi
_EOT_

# create original .zshrc
if [ -e ${ZSHRC} ]; then
    mv ${ZSHRC} ${ZSHRC}.orig
else
    echo "There is no ${ZSHRC}"
fi


# input source command
cat <<-\_EOT_ > ${ZSHRC}
  [ -f $HOME/dotfiles/.zshrc ] && source $HOME/dotfiles/.zshrc
_EOT_



# create original .vimrc
if [ -e ${VIMRC} ]; then
    mv ${VIMRC} ${VIMRC}.orig
else
    echo "There is no ${VIMRC}"
fi

# input source command
cat <<-\_EOT_ > ${VIMRC}
  if filereadable(expand('$HOME/dotfiles/.vimrc'))
    source $HOME/dotfiles/.vimrc
  endif
_EOT_


# create original .gvimrc
if [ -e ${GVIMRC} ]; then
    mv ${GVIMRC} ${GVIMRC}.orig
else
    echo "There is no ${GVIMRC}"
fi

# input source command
cat <<-\_EOT_ > ${GVIMRC}
  if filereadable(expand('$HOME/dotfiles/.gvimrc'))
    source $HOME/dotfiles/.gvimrc
  endif
_EOT_

https://github.com/masudaK/init-scripts/blob/master/masquarade_dotfiles.sh

以下のスクリプトで必要なファイルをcloneし、環境を整えます。

#!/bin/sh

readonly VIMCOLORS=${HOME}/.vim/colors
readonly SSHCONFIG=${HOME}/.ssh/config
readonly GITPRIVATEKEY=${HOME}/.ssh/id_rsa@github

ssh -T git@github.com
# check status with connecting to github
ELEVEL=$?
if [ $ELEVEL -ne 1 ]; then
    echo -e "\033[40m\033[1;31mFailed: clone from github \033[0m"

    echo "Check whether you run ./make_gitenv.sh AND then PUT public key into GITHUB !!!"
    exit
fi

# clone dotfiles and neobundle for shell and vim
cd ${HOME}
git clone git@github.com:/masudaK/dotfiles.git
git clone git@github.com:/Shougo/neobundle.vim $HOME/.vim/bundle/neobundle

# download colorscheme for vim
mkdir -p ${VIMCOLORS}
cd ${VIMCOLORS}
curl -o desert.vim "http://www.vim.org/scripts/download_script.php?src_id=2038"
curl -o desert256.vim "http://www.vim.org/scripts/download_script.php?src_id=4055"

cd ${HOME}


https://github.com/masudaK/init-scripts/blob/master/make_gitclone_env.sh

他にもGithub用の鍵を作ったりする準備も自動化してますが、とりあえずdotfilesをGithubから持ってきます。今見るとカラースキーマのレポジトリ化とか、全体的に関数化したりとかまだまだスマートにできそうですが………
(こういうのを見るたび、昔の自分のコードの酷さに嘆きたくなりますな…)

あとはVimを立ちあげて、:NeobundleInstallをして、必要なプラグインを入れて終わり。NeoBundle使うようになってから、この辺はめちゃ楽になりました。Shougoさんに感謝。

Vimは最新版をコンパイルして使ってますが、既にパッケージで提供されているもので困らない人はそれでもいいでしょう。バージョンとかは最初は考えなくてもいいかと。

環境晒し

あとはプロジェクトとか特定のディレクトリでvimと叩くだけです。そうして、ファイル開いたり、最初に必要なことをやると以下のような感じ。

なんか色々設定詰め込んでるので、最初に知っておくと楽になりそうな部分をざっくりと説明してみます。

外枠としてのnerdtreeやバッファ操作

The NERD Treeを使って、まず左サイドバーにそのディレクトリのファイルを表示させます。

んで、右にファイルを表示させます。開かれたファイルはバッファとして開いてるので、「,1」「,2」みたいな感じで,とバッファ番号を使って、ファイルを移動できるようにしてあります。vimrcとしては以下のような記述しておくと幸せになれるかと。

" バッファ切り替え
nmap [space]n :<C-U>bnext<CR>
nmap [space]p :<C-U>bprevious<CR>
nnoremap <Leader>1   :e #1<CR>
nnoremap <Leader>2   :e #2<CR>
nnoremap <Leader>3   :e #3<CR>
nnoremap <Leader>4   :e #4<CR>
nnoremap <Leader>5   :e #5<CR>
nnoremap <Leader>6   :e #6<CR>
nnoremap <Leader>7   :e #7<CR>
nnoremap <Leader>8   :e #8<CR>
nnoremap <Leader>9   :e #9<CR>
" バッファ一覧
nmap ,b :buffers<CR>
"

また、Ctrl+hやlを使って、ウィンドウを移動できるようにしておきます。そうすると、ディレクトリ一覧の部分(左サイドバー)と、ファイル表示してる部分を簡単に移動できるようになります。vimrcでは以下のような感じ。

" CTRL-hjklでウィンドウ移動
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
nnoremap <C-h> <C-w>h

僕の場合は「nt」と叩くとディレクトリ一覧が表示され、再度叩くと非表示になるようにしてあります。vimrcだと以下のような感じ。

" ntでトグル
noremap nt :NERDTreeToggle<CR>

この辺は好みもあるので、使いやすいようにキーバインドの設定をしておけばよいかと。このような感じで、まず外枠を作ってます。

また、カレントディレクトリと、一階層下ぐらいのファイルまではnerdtreeで移動しますが、それ以上は階層深いので、それ以上はctrlp.vimを使っています。

僕の場合は「ctrl+p」押すと以下ような感じでファイル名で絞込みが行われるようにしてあります。これは「u」という文字列でファイル名を絞り込んだ場合です。

情報表示

最初に示したスクリーンショットにあるように、ファイルタイプとか、改行コード、文字コード、ファイル名をフッターに表示するようにしています。

昔は文字数なども表示してましたが、ctrlp.vimと競合してしまったので、今はやってなかったりします。この辺の表示はvimrcだと以下のような感じ。

set laststatus=2 " 常にステータスラインを表示
"カーソルが何行目の何列目に置かれているかを表示する
set ruler

"ステータスラインに文字コードと改行文字を表示する
set statusline+=[%n][TYPE=%Y]\[FORMAT=%{&ff}]\[ENC=%{&fileencoding}]%m%r%w%{expand('%:p:t')}\%<\(%{SnipMid(expand('%:p:h'),80-len(expand('%:p:t')),'...')}\)

" Right StatusLine
set statusline+=%=\ %=[%{GetB()}]" Get Hex
set statusline+=%{g:HahHah()}" HahHah plugin
set updatetime=500

※ snipMid関数とかも必要なので、そのままコピーしても動かないです…
Githubのを見てもらうかそこを削除してもらえると。Right
StatusLineのように整理しとけばよかた…

終わりに

実際はここに載せた以外も色々プラグイン使っていたり、tmuxを使ったりしてるので、完全に晒せてわけるわけではないですが、最低限以上述べたような感じで動かしています。

そこまで大きくないプロジェクトであれば、今のところすごい不便を感じることもなく、最低限の環境はできているかと思います。その分、2012年はあまりライフチェンジになるような改善してないので、2013年はもうちょっと環境変化できたらとなと。
ぱっと思いつくだけでも

  • Escはほんと最適なのか。もっと楽な設定あるのかもしれない
  • そういえばタグジャンプ入れてない…
  • もうちょっと言語ごとに最適化できる気がする

とかとか色々できる気がします。ひとまず、晒すDrivenで今年は改善していければと。
ということで、この抱負とともに1月3日分の記事を終えたいと思います。

明日の記事は、@choplinさんになります。よろしくお願いします。