w.vimをつくっています

vim

f:id:yuhei_kagaya:20140803125117p:plain:w798

https://github.com/violetyk/w.vim

メモの管理

w.vimはメモを管理するためVimプラグインです。

僕はメモを書くときは単純に記録の他、考えるときや作業するときの頭の整理のためにも書くことが多いのですが、そのメモを管理するツールは今までいろいろなものを使ってきました。
今回w.vimは、自分が欲しいものを自分で作ってみようと思ったことがきっかけで始めてみました。

どんなメモ管理ツールが欲しかったか

次のようなことを考えていました。

  • 紙copiぽいのが良い
    • メモ本体は単純なテキストファイルで残したい。
    • タイトル一覧のサイドバーが見えている安心感が欲しい
  • タグで管理したい
  • 開き直すメモのほとんどが最近使ったメモなので、最近のメモを簡単にすぐに開きたい
  • プログラムを書くときにVimが多いので、Vimでメモを取りたい
  • メモ管理ツールで書いたメモをそのまま簡単にアウトプットしたい(Qiita、Qiita::Team、はてなブログ、Gistなどへ)
  • Dropboxとかにおいてシンクしたい
  • Vimで書いたメモをiPhoneアプリでも見たい、すこし編集したい


簡単に言うと紙copiVim+書いてそのままアウトプットしたい、です。


このうち、Qiita等へのアウトプット機能やスマホアプリ連携はまだできていません。
Qiita等へのアウトプット機能は、w.vimのメニュー部分をプラガブルに作ったのでそれにのっけようと思っています。「Qiitaへ投稿する」のようなメニューを提供するプラグインをつくるイメージです。

セットアップ

NeoBundle 'violetyk/w.vim'

メモのファイルパスとタイトル紐付けとタグの管理用途でSQLiteを使っているので、別途SQLiteが必要です。全部テキストファイルで管理できれば良かったのですが、将来的にスマホ連携ができたときに扱いやすいかなあと思ってSQLiteにしてみました。Macだと最初から入っているかもしれません。

使い方

:WSidebarOpenコマンドを実行すると、サイドバーを開きます。

:WSidebarOpen

サイドバー上でキーを押して操作します。

キー 操作
c 新しいメモを作成する
<CR> カーソル行上のメモやタグを開く
m カーソル行上のメモでメニューを開く
s 語句を入力してメモを検索する
メモの作成

サイドバーの右側に新しいバッファが作成されるので、メモを書きます。
このとき簡単なルールがあって、

  • 1行目がタイトル
  • 2行目の [括弧囲った部分] が [タグ]

になります。タグはなくても、何個つけても良いです。
メモを保存すると、サイドバーに作成したメモの情報が表示されます。

サイドバーでの選択

サイドバー上でエンターを押すと、選択になります。

  • カーソル行にメモのタイトルがあるとき、メモを開きます。
  • カーソル行にタグがあるとき、選択されたタグのメモの一覧をサイドバーに絞り込み表示します(~で元のサイドバーへ戻る)
メニュー機能

サイドバー上でmを押すと、コマンド部分にメニューが表示されます。メニューはj、kで移動してエンターで選択、qやESCでキャンセルです。今は削除しかないです。

NERDTree

w.vimをつくる際、scrooloose/nerdtree · GitHubのソースを良く読みました。
あのとても便利なサイドバーUIを作るのにかなり地道で大変なことを丁寧にやっているのがわかって、とても勉強になりました...。NERDTreeすごい。

今後

QiitaやGistへ投稿するメニューを作っていきたいと思います。

リストの同一性

vim

リストが入った変数を別の変数へ代入すると、参照になる。

知らなかったー。

copy()でリストのコピーを作ればOKと思ったが、
"浅いコピー"になるので要素がリストだとコピー元も変更される。
完全にコピーを作ろうと思ったら、deepcopy()を使えばOK。

:help list-identity
Vim documentation: eval

let a = [1,2,3]
let b = a
call add(b, 4)

echo a
" [1, 2, 3, 4]
let a = [1,2,3]
let b = a
call extend(b, [4,5,6])

echo a
" [1, 2, 3, 4, 5, 6]
let a = [1,2,3]
let b = copy(a)
call extend(b, [4,5,6])

echo a
" [1, 2, 3]
let a = [1,2,[3,4,5]]
let b = copy(a)
let b[2][2] = 'hoge'

echo a
" [1, 2, [3, 4, 'hoge']]
let a = [1,2,[3,4,5]]
let b = deepcopy(a)
let b[2][2] = 'hoge'

echo a
" [1, 2, [3, 4, 5]]

Vim Scriptテクニックバイブル

絶対買う!

Amazon.co.jp: Vim Script テクニックバイブル: VimScriptサポーターズ: 本

Vim Script テクニックバイブル

Vim Script テクニックバイブル

quickrun.vimでgraph-easyを動かす

vim

graph-easy

graph-easyはアスキーアートでグラフを描画するツール
簡単なテキストの記述でネットワーク図などが書けるのでとても便利。

install

CPANでインストール。

$ sudo cpan Graph::Easy

:GraphEasyコマンド

作成されるグラフを確かめながら書きたかったので、quickrun.vimで動かすようにしてみた。

" graph-easy
function! s:GraphEasy(...) range
  if !neobundle#is_sourced('vim-quickrun') || !executable('graph-easy')
    return 0
  endif
  let range = a:firstline . ',' . a:lastline
  echo range
  let tmp = @@
  silent exec range . 'yank'
  let src = @@
  let @@ = tmp
  call quickrun#run({
        \ 'runner': 'vimproc',
        \ 'command': 'graph-easy'
        \})
endfunction
command! -nargs=0 -range GraphEasy :<line1>,<line2>call s:GraphEasy(<f-args>)

:GraphEasyするとバッファ内のテキストの情報でgraph-easyの結果が出力される。
また、テキストを選択してコマンドを実行(:'<,'>GraphEasy)すると選択範囲でできる。

quickrun便利〜。

追記

すみません、上のようなめんどくさいことしなくても

:'<,'>QuickRun graph-easy

でできます。

id:thincaさん、教えてくださってありがとうございました!

Vim scriptのselfについて

vim

Vim scriptでは関数を辞書(PHPでいう連想配列)変数に代入することができます。
その関数のなかでselfを使うと、呼び出し元の辞書を参照できます。

let s:test = {'name' : 'hogefuga'}
function! s:test.func()
  echo self.name
endfunction

call s:test.func()

" 実行結果
hogefuga

普通の関数にもdict属性をつけると、selfで呼び出し元の辞書を参照できます。

function! Sum() dict
  return eval(join(self.data, '+'))
endfunction
let list = {'data': range(1, 10), 'sum': function("Sum")}
echo list.sum()

" 実行結果
55

ヘルプ

:h self

Vim script でオブジェクト指向プログラミング

"関数を代入した辞書を戻す"関数を作れば、オブジェクト指向のクラスっぽいものが作れるので、上で習ったとおり、cake.vimでもやってみています。

macvim生活始めました

vim

Vagrant生活を始めたので、ターミナルで開発サーバにsshしてvimで開発するのをいったんお休みし、Vagrantmacvimを使って開発することにしました。

感想

  • 表示が速い!快適!
  • コマンド叩きたいときにCtrl + zじゃなくて⌘+TABでiTermのウィンドウに移動する操作がちょっとアレ
  • ソースの文法チェックとかでPHP使ってたりするので、結局VagrantVMだけじゃなくてローカルのMacにも少し環境構築する必要があった


まとめると、速くてよいです。

macvimインストール

brewで入れています。更新も楽ですね。

# neocomplete.vimを使っているのでlua入りでインストール
# pythonを有効にしてるのはvdebugを使うため
brew install macvim --HEAD --enable-pythoninterp --with-lua
brew linkapps

# 更新
brew update

macvimの起動

基本ターミナルでコマンド操作しているので、いままでvimと打っていたのをmvimとして起動するだけです。

カラースキーマ探し

gvimにしたら白い背景がいいかもと前から思っていたのでsolarizedのset background=lightにしてみました。
でもちょっとコントラストが低くて目が慣れませんでした。いきなり白くしたので明るすぎる気もしました。

:SolarizedOptions

コマンドで調整値を確認して、

let g:solarized_contrast="high"

にしてみたのですが、やっぱり今までどおり黒系のカラースキーマにすることにしました。

しっくりくるカラースキーマを探すには、unite-colorschemeでプレビューしながらが便利です。

# 俗にいうユナイトビューティフルアタック!!(http://d.hatena.ne.jp/osyo-manga/20130307/1362621589)
:Unite colorscheme -auto-preview


solarizedのdark、大人気のjellybeansと迷ったんですが、最終的にhybridにしました。

GUI用の追加設定

いつものCUIvimも使うので、設定は.vimrcにこんな感じで書きました。
カラースキーマ、マウス、GUIウィンドウ、クリップボード連携、フォントの設定を追加しました。

guioptions=cの設定は次のような意味です。デフォルトはguioptions=egmrLでした。cだけつけています。

  • メニューを表示しない(m)
  • 左右の垂直バーを表示しない(l, r, L)
  • 下のスクロールバーを表示しない(b)
  • ポップアップの確認ダイアログではなくコンソールダイアログを使う(c)

参考:http://vim-jp.org/vimdoc-ja/options.html#'guioptions'

if has('gui_running')

  " カラースキーマ
  set background=dark
  silent! colorscheme hybrid

  " マウスを使う。
  set mouse=a
  set ttymouse=xterm2

  " キータイプ時にマウスポインタを隠す (nomousehide:隠さない)
  set mousehide

  " GUIの設定。m:メニュー、r:右垂直バー、b:下のスクロールバー、l:左垂直バー
  set guioptions=c

  " ヤンクの内容や、選択した内容をクリップボードに格納する。
  set clipboard=unnamed,autoselect
  
  if has('mac')
    " フォントはRicty for Powerlineの13
    set guifont=Ricty\ Regular\ for\ Powerline:h13

    " 起動したときに最大化
    autocmd BufEnter * macaction performZoom:
  endif
else
  " CUIのvimのときに使っているカラースキーマ
  silent! colorscheme mrkn256
endif

カーソルの移動速度を上げる

mvimのカーソル移動速度を上げるために、@ に教えてもらったKeyRemap4MacBookをインストールして、キーリピートの速度を変更しました。

f:id:yuhei_kagaya:20140218211825p:plain
デフォルトの1/10ほどにしました。速すぎです。

Vagrant生活始めました

Vagrant。2013年に単語を聞きまくっていたのに手をつけていなかったものをようやく触り始めました。
とりあえず、登場してくるものの概要を理解。

VirtualBox 仮想マシンを立ち上げるソフト(環境)。他にはVMWareAWS
Vagrant 仮想マシンを立ち上げるソフトのCLIラッパーのようなもの。
Chef 仮想マシンのプロビジョニングツール。他にはPuppet、Ansible、普通のShellスクリプトなど。
Box 仮想マシンのテンプレート。
Vagrantfile 仮想マシンの構築設定ファイル。
Berkshelf Chefのパッケージ管理ツール(yum, apt-get, bundle, Composerのようなものっぽい)

VirtualBoxVagrantをインストール

Mac(10.9.1)にVirtualBoxVagrantをダウンロードしてインストーラでインストールしました。

boxの追加

有志の方々がつくられているVagrantbox.esにいろいろアップされています。
CentOS6.4にしました。

# vagrant box add title url の形式
vagrant box add centos64 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box

追加したboxファイルは~/.vagrant.d/boxes/に入っています。

boxの操作

# 一覧
vagrant box list
# 削除
vagrant box remove 名前

boxを使って仮想マシンを起動

mkdir vm
cd vm
vagrant init centos64
vagrant up

実際にVirtualBoxを起動してみると、起動しているのが分かります。

仮想マシンの操作

vagrant upしたディレクトリ内で実行します。

# 確認
vagrant status
# 停止
vagrant halt
# 一時停止
vagrant suspend
# 再開
vagrant resume
# 破棄
vagrant destroy
# 設定再読込
vagrant reload

sshを使って仮想マシンへログイン

vagrant ssh

vagrantという名前のユーザでログインできます。
ホストOSとは、/vagrantを共有しています。

IPアドレスの固定

Vagrantfileの以下の場所のコメントを外します。

config.vm.network :private_network, ip: “192.168.33.10"

設定を再読込します。

vagrant reload

Saharaプラグイン

Vagrantプラグインで、Sandboxモードという仕組みが使えるようになります。
これはRDBMSトランザクションのようなものです。
コミットするまで設定が反映されないのでいろいろやって失敗したらロールバック
これでよければコミット、ということができるようになるようです。

# プラグインのインストール
vagrant plugin install sahara
# プラグインの一覧
vagrant plugin list
# プラグインのアンインストール
vagrant plugin uninstall sahara
# Sandboxモード開始
vagrant sandbox on
# 状態確認
vagrant sandbox status
# ロールバック
vagrant sandbox rollback
# コミット
vagrant sandbox commit
# Sandboxモード終了
vagrant sandbox off

Packer

boxファイルを自分で作りたい場合、Vagrant作者のPackerを使うと良いみたいです。
OSのイメージファイルからboxファイルを作成できます。

参考にさせていただいたサイト

Pakerのインストール

Downloads - Packerからダウンロードしてパスを通せばオッケーみたいですが、
brewの方が楽だったので、brewでインストールしました。

brew tap homebrew/binary
brew install packer

shiguredo/packer-templates

今回Ubuntuが使いたくてjsonファイルを書いていったのですが、たくさん設定があって大変...。
心が折れそうだったとき、時雨堂Packerテンプレートに出会うことができたので、使わせていただきました。
最高です。本当にありがとうございます。

shiguredo/packer-templates · GitHub

git clone https://github.com/shiguredo/packer-templates
cd packer-templates/ubuntu-13.10/
packer build -only=virtualbox-iso template.json
vagrant box add ubuntu-13.10  ubuntu-13-10-x64-virtualbox.box


これで楽に仮想マシンが作れるようになったので、次はChefだなー!

neocomplete-php.vimを作っています

PHPの関数を補完するneocomplete用source

f:id:yuhei_kagaya:20140119234515p:plain
neocomplete-php.vimneocomplete.vimPHP用sourceです。

補完時に、関数と一緒に短い説明が欲しかったので作り始めました。

今のところはPHPの組み込み関数の補完しかできないのですが、
これから次のような機能を実装しようかなぁと思っています。

  • インサートモード時に、statsulineにリファレンスを表示する機能
  • 組み込みクラスの補完
  • メンバ変数やメソッド名や定数の補完
  • CakePHPへの対応

セットアップ

プラグインをneobundleでインストールします。

NeoBundle 'Shougo/neocomplete.vim'
NeoBundle 'violetyk/neocomplete-php.vim'


日本語の説明にする場合には、.vimrcなどにロケールを設定します。
デフォルトは英語のenです。

let g:neocomplete_php_locale = 'ja'

vim起動後に1度だけ、次のコマンドを実行します(以下は日本語の辞書を作成する場合)

:PhpMakeDict ja

この処理は、http://svn.php.net/viewvc/からPHPマニュアルのXMLソースコード
svn checkout(またはsvn update)して辞書ファイルを作成します。
数分かかることがあります。

finish.と表示されたら完了です。
~/.neocomplete-php/配下に辞書のキャッシュが作成されます。

vital.vim

このプラグインで、vimscriptの汎用ライブラリ集であるvital.vimを使い始めました。
すごく便利です。
いままで自分で書いていたプラグインのautoload配下util.vimとかなんだったんだろう。。。
何か処理をしようと思ったとき、まずvital.vimでないかなーと探すようになりました。
vital.vimの導入から使い方までは、こちらのページがとても参考になります。


自分のプラグインにvital.vimを組み込んで使う方法は、ヘルプで確認しました。

:help vitalizer