NeoBundle からの卒業

Vim 8.0 がリリースされて、 プラグインを管理するための Package 機能が追加されたので、 Vim をアップデートするついでに NeoBundle から移行することにした。 WindowsMac、どちらも使っているのは香り屋版。

www.kaoriya.net

github.com

試しに NERDTree でやってみる。 Package 機能でプラグインは管理できるけど、 プラグインをダウンロードすることはできないから、 自分でダウンロードしないといけない。 数が多いとかなり手間だろうな。

github.com

ダウンロードして展開したら、 NERDTree フォルダごと下記の場所に配置。 mypack のところは適当な名前でいいみたい。

# Windows の場合
%HOMEPATH%\vimfiles\pack\mypack\start

# Mac の場合
~/.vim/pack/mypack/start

プラグインGithub で公開されているなら、 start 下にリポジトリgit clone してもよさそうだ。

Vim を起動して NERDTree を表示。

f:id:griefworker:20161026093956p:plain

NERDTree を NeoBundle から Vim 標準の Package 機能に移行できた。 この調子で残りのプラグインも移行しよう。 幸いなことに、使っているプラグインは少ないから、全部スンナリ移行できそうな予感。 移行できないやつがもしあったら、そのときは、そのプラグインを使うのやめよう。

Vim を更新したら undofile が作成されるようになっていた

久しぶりに Windows 版の Vim を更新したら、 編集したファイルと同じディレクトリに .{ファイル名}.un~ というファイルが作成されるようになっていた。

これは undo の情報をセッションを越えて保持できるようにするためのファイルのようだ。 どうも、Vim は 7.4.227 からデフォルトでこのファイルが作成される設定になったらしい。

ファイルを開きなおした後もアンドゥできるのは便利機能だけど、 今のところ必要としていないので、.vimrc に

set noundofile

を追加して無効にしておく。

Vim script テクニックバイブル

自分は .vimrc に設定を記述する程度の、ドが付く Vim script 初心者。 Vim プラグインは使うのみで、書いたことも無ければ、ソースコードもほとんど読んでない。 だけど、Vim を使っているからには、Vim script を書けるようになった方がいいな、 とは思っていた。

そんな中、Vim script だけを扱ったマニアックな書籍がついに発売され、 ようやく重い腰を上げた。 テクニックバイブルという名前が付いていて、300ページ超あるけど、 内容は Vim script 初心者向け。 文字が大きいので、プログラミング経験がある人ならスラスラ読める。

本書の構成はざっと

  • Vim script の基本的な構文と Vim での使い方
  • Vim プラグイン開発実践
  • Vim 組み込み関数リファレンス、
  • デバッグ手法やライブラリといった実践テクニック

となっていて、Vim script 入門書であり、クックブックでもあり、API リファレンスでもある。 1 冊で 3 度おいしい。

中でも一番の注目は、Vim プラグイン開発の章。 実はこれが目的で購入してたりする。 「保存時に自動的に行末の空白スペースを削除するプラグイン」を題材に

  • ユーザー設定による副作用を回避する定型コード
  • 関数でプラグインの機能を実装
  • Exコマンドを実装
  • キーマッピングを実装
  • オプション変数を用意
  • ヘルプを作成

といった、Vim プラグインを作って公開するまでの一連の流れが掴めた。

実践テクニックの章では、Vim にデバッガ機能が搭載されていて、 ブレークポイントをセットできることを知れたのが大きい。 :echomesg を使ったプログラマお馴染みプリントデバッグでやるしかないと、 勝手に思い込んでいた。 デバッグが捗るに違いない。

本書を読めば、簡単なプラグインを書けるところまではたどり着ける。 実用的なプラグインを書くためには、そこからさらに勉強が必要。 公開されている Vim プラグインソースコードを読むのが一番良さそうだ。

まだアイデアが無いけど、Vim プラグインを書いてみたくなった。 利用している Vim プラグインソースコードを手本に勉強して、 アイデアが閃いたときに備えるとしよう。

Vim scriptテクニックバイブル?Vim使いの魔法の杖

Vim scriptテクニックバイブル?Vim使いの魔法の杖

Vim で ^M を一括削除

Rails でジェネレーターを実行したら、ファイルの末尾に余分な改行コード ^M が追加されてしまったので、Vim でまとめて削除する方法をメモしとく。

コマンドモードに切り替えて

:%s/^M//g

を実行すればいい。 なお、^MCtrl-V Ctrl-M を押して入力する。

Vimmer のための Xcode プラグイン『XVim』

Objective-C で書いた iOS アプリを保守するために Xcode を強いられているんだ!

Xcode は補完が賢くて便利なんだけど、Vimキーバインドが体に染み付いているせいで、 つい Vim の時と同じことをしようとしてしまう。

  • 入力が終わったらつい Ctrl + [ でノーマルモードに戻ろうとしてしまう
  • dd で一行削除しようとしてしまう
  • A で行の終端から入力を開始しようとしてしまう
  • :w でファイルを保存しようとしてしまう

などなど、挙げたらキリが無い。確実に開発パフォーマンスに影響している。 かといって、Xcode を捨てて VimObjective-C を書くのは、neocomplete.vim や neosnippet を使ったとしても苦行。

そんな Vimmer の救世主になるかもしれない『XVim』

XVim は XcodeVimキーバインドが使えるようになるプラグインで、しかもオープンソース

XVim をインストール

Github からソースコードをダウンロード。

git clone https://github.com/JugglerShu/XVim.git

Xcode で XVim のプロジェクトを開いて、Xcode5 のスキーマを編集。

f:id:griefworker:20131101202654p:plain

Build Configuration を Release に変更してビルド実行。

f:id:griefworker:20131101202748p:plain

ビルド成功後 Xcode を再起動すると XVim が有効になっている。

f:id:griefworker:20131101202840p:plain

エディタ下部にステータスラインがあるのを確認できる。

Vim のチュートリアルに出てくるキーバインドはだいたい使える

だいたいであって、まだ完璧じゃない。実際に Vim のチュートリアルをコピペして試してみたけど、r で一文字置換するとき日本語入力できなかたり、R での置換が上手くいかなかったり、外部コマンドが使えなかったり。まぁ外部コマンドは仕方ない。

そうそう、テキストオブジェクトが使えたのは驚いた。スゴイ。

XVim は Vim をあまりカスタマイズせずに使っている人にオススメ

もともと自分は Vim をカスタマイズしないで使う派で、 使っているプラグインは管理用の neobundle を除けば、せいぜい neocomplete.vim と neosnippet と NERDTree くらい。

XVim で Vimキーバインドが使えるようになったし、Xcode ならコード補完が強力だし、プロジェクトナビゲーターでファイル一覧も見れるから、今のところ十分。

Vim をカスタマイズしまくって自分色に染め上げている人は……Xcode + XVim じゃなくて Vim で何とかしちゃいそうな気がする。

Homebrew で最新の Vim をインストール

neocomplete.vim を MacVim だけでなく Vim でも使いたいけど、システムにプリインストールされている Vim のバージョンは 7.3。Homebrew で最新版をインストールすることにした。

brew install vim --devel --with-lua

を実行すると、Vim 7.4.52 が /usr/local/bin にインストールされた。でもターミナルに vim と打ち込んで起動できる Vim は 7.3 のまま…。

/usr/bin ではなく /use/local/bin を先にチェックするように、PATH の設定を .zshrc に記述。

export PATH="/usr/local/bin:$PATH"

これで Homebrew でインストールした最新の Vim が使えるようになった。

Vim の入力補完プラグインを neocomplcache から neocomplete.vim に移行した

今さらながら、Vim を使う上で個人的に必須プラグインの neocomplcache に、後継の neocomplete.vim があることに気付いた。

neocomplcache はまだ保守されているみたい。でも開発の主軸は neocomple.vim に移っているようなので、遅ればせながら移行することにした。

neocomplete.vim は if_lua 対応 Vim でないと使えないため、まず最新の macvim-kaoriya をダウンロードしてインストール。

この際だし、Vim プラグインの管理も Vundle から NeoBundle に移行してしまおう。

git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim

を実行して NeoBundle をインストールし .vimrc を修正。

if has('vim_starting')
  set nocompatible               " Be iMproved
  set runtimepath+=‾/.vim/bundle/neobundle.vim/
endif

call neobundle#rc(expand('‾/vimfiles/bundle/'))

" Let NeoBundle manage NeoBundle
"  NeoBundleFetch 'Shougo/neobundle.vim'

NeoBundle "neocomplete.vim"

syntax on
filetype on
filetype plugin indent on   " Required!

NeoBundleCheck


" ...(NeoBundleとneocomplete以外の設定は省略)...


"==========================================
"neocomplete.vim
"==========================================
"use neocomplete.
let g:neocomplete#enable_at_startup = 1
" Use smartcase.
let g:neocomplete#enable_smart_case = 1
" Set minimum syntax keyword length.
let g:neocomplete#sources#syntax#min_keyword_length = 3
let g:neocomplete#lock_buffer_name_pattern = '¥*ku¥*'
" Define dictionary.
let g:neocomplete#sources#dictionary#dictionaries = {
      ¥ 'default' : '',
      ¥ 'vimshell' : $HOME.'/.vimshell_hist',
      ¥ 'scheme' : $HOME.'/.gosh_completions'
      ¥ }
" Define keyword.
if !exists('g:neocomplete#keyword_patterns')
  let g:neocomplete#keyword_patterns = {}
endif
let g:neocomplete#keyword_patterns['default'] = '¥h¥w*'
" Plugin key-mappings.
inoremap <expr><C-g>  neocomplete#undo_completion()
inoremap <expr><C-l>  neocomplete#complete_common_string()

MacVim を起動すると確認ダイアログが出て、neocomplete.vim をインストールできた。

neocomplcache のときは MacVim と相性が悪いのか、 日本語を入力しようとしたらローマ字入力に切り替わってしまい、まともに使えなかった。 neocomplete.vim は今のところそういった問題には遭遇せず、快適に使えている。