Vimのカスタマイズ Tips

Untitled今回は、私が使っているVimプラグインやカスタマイズをまとめてみようと思います。
photo credit: Harm Rhebergen


Blogger.vim

Blogger.vimを導入することで、Vim EditorからBloggerへの投稿ができます。また、Blogger.vimは、Markdownで書いたものをHTMLに変換して投稿できるので、非常に便利です。ここでは、Bloggerへの投稿方法と投稿した記事を編集する方法、そして、Markdown記法について紹介していきたいと思います。

sudo port install pandoc

gem install nokogiri

gem install net-https-wrapper

sudo port install git


なお、MacPortというパッケージ管理システムをインストールしていない場合は、MacPortをダウンロードし、インストールします。また、MacPortの動作には、Xcodeが必要になることがあります。よって、Xcodeをインストールしておきましょう。さらに、Xcodeを起動して、「Preferences…」→「Downloads」→「Command Line Tools」と進み、インストールしておくと便利です。

その他、RubyGemsがインストールされていない場合は、以下のようにします。
sudo port install rb-rubygems


後は、Vim Pluginのインストールと設定です。必要なプラグインをVundleを使ってインストールしていきます。
git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle
 
echo "source ~/.vim/bundle/vundle/test/minirc.vim" >> ~/.vimrc
 
vim ~/.vim/bundle/vundle/test/minirc.vim


そして、~/.vim/bundle/vundle/test/minirc.vimを以下のように編集します。

set nocompatible
syntax on
filetype off
set rtp+=~/.vim/bundle/vundle/
call vundle#rc()
" プラグインの管理
Bundle 'gmarik/vundle'
 
" gitリポジトリの内容を参照する
Bundle 'kana/vim-metarw'
 
" bloggerに投稿する
Bundle 'ujihisa/blogger.vim'
 
" プラグインの読み込みパスを変更
Bundle 'tpope/vim-pathogen'
 
filetype plugin indent on


最後に、Vimコマンドである:BundleInstallを実行すれば、Vim Pluginがインストールされます。

後は、プラグインに必要な設定を行なっていきます。具体的には、Blogger.vimの動作に必要なBloggerアカウント情報などを設定ファイルに書いていきます。~/.vimrcに以下を追記します。なお、your_blogid_hereの部分、つまりブログIDは、ブログの管理画面のURLを見れば分かると思います。

let g:blogger_blogid = 'your_blogid_here'
let g:blogger_email = 'your_email_here'
let g:blogger_pass = 'your_blogger_password_here'


もし起動しない場合は、以下の手順を試してみましょう。
git clone https://github.com/ujihisa/blogger.vim.git

cd blogger.vim

mkdir -p ~/.vim/autoload/metarw/

cp autoload/metarw/blogger.vim ~/.vim/autoload/metarw/ && cp autoload/metarw/blogger.rb ~/.vim/autoload/metarw/

which ruby

echo "let g:blogger_ruby_path = '[which ruby]で調べたパスを記入する'" >> ~/.vimrc


使い方は簡単です。以下のコマンドを入力するだけです。Vim上からBloggerへの投稿や過去の記事を取得し、編集ができたりします。



#Bloggerに投稿する
:w blogger:create

#Bloggerのリストを取得する
:e blogger:list


Gist.vim

Gist.vimを使用することで、Codeを簡単に投稿したり、ブログに埋め込んだりすることができます。ここでは、Gist.vimを使って、GistにCodeを投稿し、それをブログに埋め込むまでを紹介していきたいと思います。

ただし、Gistを利用するには、GitHubへの登録が必要になります。GitHubのアカウントをお持ちでない方は、登録しておきましょう。

Bundle 'mattn/gist-vim'


:BundleInstallも忘れずに。以下この手順については、省略します。

次に、ドキュメントにあるように、必要な物を用意します。以下のコマンドを実行してください。

% mkdir ~/.vim/cookies && touch ~/.vim/cookies/github

そして、設定ファイルに以下を追記します。
let g:gist_clip_command = 'pbcopy'
let g:gist_detect_filetype = 1
let g:github_user = 'usrename'


これで、コードを書いて、:Gistなどとすると、Gistへの投稿が完了し、URLがクリップボードに取得されます。



また、以下を設定ファイルに書くことで、クリップボードにGistへのURLが保存されている状態で:PasteGistを実行すれば、GistへのURLが埋め込みコードに変換されます。これに関しては、Gist.vimの導入とヘルパースクリプトの作成がとても参考になります。ここに載っているコードを簡単にではありますが、改良してみました。

" PasteGist
func! s:paste_gist_tag()
  let mx = 'http[s]\?://gist.github.com/\([0-9]\+\)'
  " +または"レジスタの中身を検索する
  let regs = [@+,@"]
  for r in regs
    let mlist = matchlist(r, mx)
    if ( len(mlist) > 2 )
      "カーソル行に挿入
      exe "normal! O<script src='https://gist.github.com/" . mlist[1] . ".js'></script>"
      return
    endif
  endif
endfunc
command! -nargs=0 PasteGist     call paste_gist_tag()


これで、Vim上からGistへコードを投稿し、ブログへの埋め込みコードを取得することができるようになります。



Zencoding-vim

Zencoding-vimとは、省略記法でHTMLへの変換を実現するVim Pluginのことです。Zencoding-vimは、ブログをやっている人なら便利に使えると思います。

Bundle 'mattn/zencoding-vim'


私がよく使う記法は、以下のものです。記法を入力した後に、C-y-,を入力すると、記法がHTMLに変換されます。
span:code

↓

<span class="code"></span>


TweetVim

TweetVimは、`Twitter Client`です。導入は少しばかり面倒ですが、`Vim`上で動作するためかなり便利だと思います。また、Command Lineで動作する`Twitter Client`としては、tなどもあります。



"TweetVimとその依存関連
Bundle 'basyura/TweetVim'
Bundle 'mattn/webapi-vim'
Bundle 'basyura/twibill.vim'
Bundle 'tyru/open-browser.vim'
Bundle 'h1mesuke/unite-outline'
Bundle 'basyura/bitly.vim'


ファイルを保存した後は、:BundleInstallとすると、プラグインがインストールされます。

VimFiler

VimFilerとは、`Vim`で動くファイルマネージャーのことです。brew install mcmcを入れてもいいのですが、Vimの操作に慣れている方は、VimFilerがお勧めです。

"VimFilerと依存関連
Bundle 'Shougo/vimfiler'
Bundle 'Shougo/unite.vim'
Bundle 'Shougo/vimproc'


そして、以下の設定をしておくと、VimFilerを普通に使えるようになります。

"VimFilerエクスプローラーの設定
let g:vimfiler_as_default_explorer=1

"VimFilerセーフモードの設定
let g:vimfiler_safe_mode_by_default=0


VimShell

VimShellとは、`Vim`で動くシェルエミュレータです。導入しておくと、開発環境が便利になります。

Bundle 'Shougo/vimshell'


コンパイルと必要なファイルの移動





cd ~/.vim/bundle/vimproc/

make -f make_mac.mak

cp vimproc_mac.so ~/.vim/bundle/vimproc/autoload


デバッガなどのインストール



実行可能バイナリを検査するためのツールなどを入れていきます。

brew install binutils

brew install cgdb


VimShellの使用例



`Vim`を起動し、:VimShellを実行します。

echo "int main(void) {return 0;}" > hello.c

gcc hello.c

gobjdump a.out

cgdb ./a.out


vim-quickrun

vim-quickrunは、`Vim`で編集中のプログラムの実行結果を確認できる`Vim Plugin`です。

Bundle 'thinca/vim-quickrun'


デフォルトでは、<Leader>rを押すと、実行結果を確認できます。

teol.vim

`C`などを書くときに行末につける;を忘れてしまうことはありませんか。そんな時は、teol.vimが便利です。

Bundle 'vim-scripts/teol.vim.git'


例えば、<Leader>;を入力すると、行末に;が挿入されます。

vim-smartchr

見栄えを良くするために半角スペースを使用することは多くありませんか。そんな時は、vim-smartchrを使って設定を行なっておくと便利ですよ。

Bundle 'kana/vim-smartchr'


参考:Shougo/shougo-s-github

例えば、=と入力すると、スペースを含めた = が入力されるようにSettingしてみます。

inoremap <expr> = smartchr#loop(' = ', ' == ', ' === ', '=')


viewoutput.vim

今回は、コマンドの出力結果を読みやすい形で表示してくれるプラグインを紹介します。viewoutput.vimとは、コマンドの出力結果を読みやすい形で表示してくれるプラグインです。特に、 :let , :map などのコマンドの出力結果をじっくり読みたい時には便利です。


curl -o viwoutput.vim http://www.vim.org/scripts/download_script.php?src_id=2722

mv viewoutput.vim ~/.vim/plugin



これで、 :VO の後にコマンドを入力し実行することで、その結果を読みやすい形で表示することができます。


vimplugin_viewoutput

neocomplcache.vim

neocomplcache でスニペットを自作する方法を紹介します。スニペットとは、補完関数のようなもので、ブログの更新にも便利です。まずは、必要なプラグインをインストールします。


Bundle 'Shougo/neocomplcache-snippets-complete'



そして、 :NeoComplCacheEditSnippets というコマンドを実行します。すると、スニペットを編集できます。


スニペットの書き方は、以下のようになります。


snippet code
abbr <pre class="brush: html;">
prev_word
<pre class="brush: shell; highlight: [0]; title: '${1}';"></pre>


neocomplcache_snippets


まず、 snippet で補完に必要なキーワードを指定します。そして、 abbr で表示される文字を指定します。 prev_word 以下に展開される内容を指定します。なお、 ${1,2,3} を入れることで、展開後の移動先を指定します。

また、設定ファイルに以下の様な内容を書いておくと、更に便利にスニペット補完が使えます。


" ユーザー定義スニペット保存ディレクトリ
let g:neocomplcache_snippets_dir = $HOME.'/.vim/snippets'

" スニペット
imap <silent>LK <Plug>(neocomplcache_snippets_expand)
smap <silent>LK <Plug>(neocomplcache_snippets_expand)

" :NeoComplCacheEditSnippets
noremap es :<C-u>NeoComplCacheEditSnippets<CR>



これで、指定したキーワードを入力し、 LK を押すと、指定した文字列が展開されます。


neocomplcache_snippets


excitetranslate.vim


Vim上から翻訳を行うには、 excitetranslate.vim が一番のオススメです。おすすめの理由はそのシンプルさです


Bundle 'mattn/excitetranslate-vim'


ここで、バッファにあるものを :ExciteTranslate で翻訳できます。また、ビジュアル選択することで 翻訳範囲を広げることもできます。 :'<,'>ExciteTranslate

Google_Translate_vim


Google Translate


Google Translate は、APIが有料になってしまったため、関係ある シェルスクリプトRubyプログラムVimプラグインが使いにくくなってしまいました。

ただし、それでも Google Translate は有効な翻訳手段です。

Bing Translate


Google Translate のAPIが有料になってから、 Bing Translate が注目された時期がありました。 bing-translate.vim というものがあります。

Bundle 'KazuyaHayashi/bing-translate.vim'


これについては、 Bing AppID が必要になります。しかし、以前は、AppIDをAPI呼び出しに使用していたようですが、Azure DataMarketから取得した Access Token を使ったAPI呼び出しに変更されました。また、登録方法が相当複雑になっていますので、個人的にはこの方法を使った翻訳手段は、おすすめできません。`Vim Plugin`はいい感じなので、非常に残念です。



simplenote.vim

私はメモ帳にSimplenoteを多用しています。`Cloud`に保存されることと、端末向けのSimplenote Clientが用意されていることや、URLを手軽にクリップできるのも大きいです。今回は、`Vim`上で動作するSimplenote.vimの紹介です。

Bundle 'mrtazz/simplenote.vim'


あとは、~/.vimrcSimplenoteのアカウント情報を入力しましょう。

" Simplenote アカウント情報
let g:SimplenoteUsername = "your simplenote username"
let g:SimplenotePassword = "your simplenote password"


これで例えば、:Simplenote -lとすると、リストが表示され、直感的な操作でメモを閲覧、編集できます。



~/.vimrc

VimのキーバインドをEmacs風にする



`Vim`とは、`Plugin`が豊富な`Editor`のことです。私は、`Keybind`は基本的にはEmacsのほうが好きなのですが、`Plugin`は`Vim`だと思っています。よって、最初に、Emacs風のkeybindを設定ファイルに書いてみます。

" 矢印キーの使用
inoremap <C-p> <Up>
inoremap <C-n> <Down>
inoremap <C-b> <Left>
inoremap <C-f> <Right>
inoremap <C-e> <End>
inoremap <C-a> <Home>
inoremap <C-h> <Backspace>
inoremap <C-d> <Del>
" カーソル位置の行をウィンドウの中央に来るようにスルロール
inoremap <C-l> <C-o>zz
" カーソル以前の文字を削除
inoremap <C-u> <C-o>d0
" カーソル以降の文字を削除
inoremap <C-k> <C-o>D
" アンドゥ
inoremap <C-x>u <C-o>u
" 貼りつけ
inoremap <C-y> <C-o>P
" カーソルから単語末尾まで削除
inoremap <F1>d <C-o>dw
" ファイルの先頭に移動
inoremap <F1>< <Esc>ggI
" ファイルの末尾に移動
inoremap <F1>> <Esc>GA
" 下にスクロール
inoremap <C-v> <C-o><C-f>
" 上にスクロール
inoremap <F1>v <C-o><C-b>
" Ctrl-Space で補完
" Windowsは <Nul>でなく <C-Space> とする
inoremap <Nul> <C-n>


参考:vimのインサートモード時のキーバインドをemacsに似せる 2

私の場合、カーソル1文字移動は`Vim`風の`Keybind`のほうが好きなので、そこら辺は変更してあったりと、上の設定とはちょっとばかり異なります。

コマンドモードへの移行



" insert mode でjjでesc
inoremap jj <Esc>


参考:yuroyoro/dotfiles

自動的な移動


" カッコやクオートなどを入力した際に左に自動で移動します
inoremap {} {}<Left>
inoremap [] []<Left>
inoremap () ()<Left>
inoremap "" ""<Left>
inoremap '' ''<Left>
inoremap <> <>


参考:Vimでキーバインドを設定する


Vimの日本語入力を快適にする設定


Vimには、ノーマルモードとインサートモードというものがあります。特に、文章を書く場合、インサートモードで日本語入力を行うことが多いかと思いますが、ノーマルモードでは、日本語入力を止めて、IMEをOFFにする場合が多いかと思います。


このような事情があるため、初期設定では、インサートモードからノーマルモードに移行する際や移行した後、頻繁に っj:あ などといったことが起こります。


そして、そういうことが連続すると、非常にがっかりしてしまうことも事実です。


そんな時は、 日本語入力固定モード を利用できるプラグインを入れたり、以下の設定をすると、インサートモードからノーマルモードに移行した際、がっかりすることも少なくなるともいます。


"### C-jでノーマルモードに移行する
inoremap <silent> <C-j> <ESC>

"### jfでノーマルモードへ移行する
"^^^ Tips
"^^ jfを入力する際は、jff<BS>とでもします。それが面倒なら、jffをjfに自動変換する設定を書きます
"^^ IMEで日本語入力ON時にアルファベット半角の設定をしておくと、jf+Enterでノーマルモードに移行できます
inoremap <silent> jf <ESC>

"### Tera TermでIME制御
" http://ttssh2.sourceforge.jp/manual/ja/usage/tips/vim.html
"## 挿入モードから抜けた時に IME をオフにし、再度挿入モードに入った時に IME の状態を元に戻す
let &t_SI .= "\e[<r" let &t_EI .= "\e[<s\e[<0t" let &t_te .= "\e[<0t\e[<s" set timeoutlen=100
"## 挿入モードでの ESC キーを押した後の待ちを無くす
let &t_SI .= "\e[?7727h"
let &t_EI .= "\e[?7727l"
inoremap <special> <Esc>O[ <Esc>
"## GNU Screenとの併用
if &term == "screen"
let &t_SI .= "\eP\e[3 q\e\\"
let &t_EI .= "\eP\e[1 q\e\\"
else
let &t_SI .= "\e[3 q"
let &t_EI .= "\e[1 q"
endif

"### gVim IME常時無効化設定
" http://blog.blueblack.net/item_393
"## 「imdisable」オプション
augroup InsModeAu
autocmd!
autocmd InsertEnter,CmdwinEnter * set noimdisable
autocmd InsertLeave,CmdwinLeave * set imdisable
augroup END
"## IME状態に応じたカーソル色を設定
if has('multi_byte_ime')
highlight Cursor guifg=#000d18 guibg=#8faf9f gui=bold
highlight CursorIM guifg=NONE guibg=#ecbcbc
endif



もし、Macで1段目の設定を採用したなら、 KeyRemap4MacBook を使うと便利です。


システム環境設定 >
vim_ime


<?xml version="1.0"?>
<root>
<list>
<item>
<name>LeaveInsMode with EISUU(Terminal)</name>
<identifier>private.app_terminal_esc_with_eisuu</identifier>
<only>TERMINAL</only>
<autogen>--KeyToKey-- KeyCode::ESCAPE, KeyCode::ESCAPE, KeyCode::JIS_EISUU</autogen>
<autogen>--KeyToKey-- KeyCode::J, VK_CONTROL, KeyCode::J, VK_CONTROL, KeyCode::JIS_EISUU</autogen>
</item>
</list>
</root>



vim_ime


これで、Terminal上で EscCtrl+j を押した場合、IMEがOFFになります。


Twitterに上げた情報を検索する



#!/bin/zsh
vim -c "TweetVimSearch from:PSP_T '$1'" +/http



tsで自身のツイートを検索できます。


alias tu='vim -c "TweetVimUserTimeline PSP_T" +/http'



tuで自身のツイートを表示できます。


プレビューを行う


まず、自身のページを以下のようにしてダウンロードします。どのページでもいいです。


cd ~/blog/ && curl -o temp_gen.html http://mba-hack.blogspot.jp/2012/08/blogicat.html



そして、先ほどダウンロードしたページを編集します。具体的には、 <a name='xxxxxxxxxxxxxxxx'></a> 以下を削除し、保存します。ただし、これは、テンプレートによって異なるかもしれませんので、自身の環境にあわせてください。


あとは、以下の設定を施すと、Vimで編集中に <Leader>br を押すと、 Safari でプレビューされます。


#!/bin/zsh
cd ~/blog/ && cp -f temp_gen.html temp.html && touch id234.test && rm *.test && sed -e "s/^$/<br\/>/g" blogpost.html > post.test && cat post.test >> temp.html && open -a Safari temp.html



" <Leader>br でHTMLをプレビューする
nnoremap <Leader>br <Esc>:!mba_hack_preview<CR>



safari



なお、完璧なプレビューを行いたい場合は、テンプレートを上下に分けてコンテンツに挟み込んで保存する手法を採用してください。


#!/bin/zsh
cd ~/blog/ && cp -f temp_gen.html temp.html && touch id234.test && rm *.test && sed -e "s/^$/<br\/>/g" blogpost.html > post.test && cat post.test >> temp.html && cat temp_gen2.html >> temp.html && open -a Safari temp.html



" テンプレート(上)
temp_gen.html

" 記事 (~/blog/blogpost.html の改行を < br/ > に変換したもの)
post.test

" テンプレート (下)
temp_gen2.html

" すべてを結合する
temp.html


結合方法

cp -f temp_gen.html temp.html && cat post.test >> temp.html && cat temp_gen2.html >> temp.html

これで、カラムやフッターなどを含む完璧なプレビューを行えると思います(たぶん...)。私は簡易プレビューしか行いませんので、実はこの方法を使ってなかったり...。