glowshi-ft.vimでストレスフリーな横移動を実現する
皆さんこんばんわ。
そろそろ梅雨も明けたでしょうか。
海開き、山開きの時期を迎え、いよいよ本格的な夏の到来となりました。
熱中症などにはくれぐれもお気をつけて、素敵なvim活をお過ごし下さい。
本日は自作プラギンの紹介をしたいと思います。
本当はmomonga.vim #3の頃にはあらかた出来ていたのですが、中途半端な状態から怒涛の放置が続いてしまいました。
最近ようやく落ち着いてきたので記事にしてみたいと思います。
vimの横移動について
皆さんはvimでどういう横移動をしていますか?
h/l?w/b?
私はやっぱりf/tが好きです。
f{char}と入力することで直近の{char}に移動できるアレです。
ただ一つ気に入らない点があって、同一行に対象の文字が複数あった場合に目的の位置に一発で移動しづらいっていう問題があります。
2faとすれば2個目のaに移動できるものの個数を数えるという作業が入るし、数えた末に間違えてた日にゃあキーボード叩き潰したろか、とか思ってしまうわけです。
最近は横移動のプラグインも出揃ってきているので色々使ったりしていましたが、自分にもいいアイデアが浮かんだので形にしてみることにしました。
glowshi-ft.vimを使う
saihoooooooo/glowshi-ft.vim
https://github.com/saihoooooooo/glowshi-ft.vim
glowshi-ftとはglow shift(光る移動)とftの動きを改善したという意味を込めて名付けました。
gif動画を作ったので、見てもらうと動きがわかりやすいかと思います。
といった特徴を持っています。
其ノ壱.vimmerに優しい操作性
前述の通り、対象文字間の移動にはh/lが使えるのでこれ以上ない直感的な操作が可能です。
気づいたらエクセルがhjklで埋め尽くされているアナタも安心。
ストレスフリーです。
其ノ弐.移動と同時にキー入力
候補を移動中に操作できるキーはh/lのようにいくつか用意されていますが、それ以外の用途が割り当てられていないキーを押すと入力時点での位置に移動を確定しつつ、そのキーを入力した状態に移行します。
たとえばある候補の上でiを押せば移動後に即インサートモードになり、またある候補の上でdを押せば入力待ち状態になるため続けてiwと押すことでテキストオブジェクトでの削除が行えます。
これはストレスフリー。
hubotでLGTM
http://www.lgtm.in/ というLGTM画像を集めたサービスがあります。
LGTMとは"Looks Good To Me"の略でコードレビューして問題がなかった時に、「良さそうに見える」という意思を伝えるための言葉です。
LGTM画像はそれを表現した画像で、サムズアップしてるgif動画なんかが多い印象です。
ただ単に「レビューOKです」と言うよりは画像があったほうが楽しい気持ちになりますよね。
というわけで、これを使ってhubot内で目出鯛気持ちをつたえ鯛と思います。
# Description: # LGTM image from http://www.lgtm.in/. # # Dependencies: # "request": "~2.27.0" # "cheerio": "~0.12.1" # # Commands: # hubot lgtm - Random LGTM image URL. # # Author: # saihoooooooo request = require 'request' cheerio = require 'cheerio' module.exports = (robot) -> robot.respond /LGTM/i, (msg) -> url = 'http://www.lgtm.in/g' request url, (error, response, body) -> if error or response.statusCode != 200 msg.send 'ERROR: 通信に失敗しました' else $ = cheerio.load body msg.send $('#imageUrl').val()
cheerioマジ便利。
使い方は
hubot lgtm
とするだけ。
これで殺伐としたレビュー窓にも華やいだフローラルの香りが!?
それではまた。
良いレビューを!
vim-localvimrcで編集するファイルパスごとに異なる設定を保持する
Vim Advent Calendar 2013 の87日目の記事になります。
今年もまだ続いてるようで安心しました。
はじめに
自分はハードタブよりもスペースでタブを表現するソフトタブの方が好きですし、今までの現場/案件も全てソフトタブでコードを書いてきました。
しかしある日突然そいつはやってきました。
某フレームワークを使った案件なのですが、フレームワーク内のコーディング規約を見てみると。
すべてのインデントはスペースではなくタブを使用すべきです。
まじかよ。。。
さすがに無視するわけにもいかないので、嫌々ながらもハードタブを使うことになったのですが、.vimrcにハードタブ用の設定(noexpandtab)を書いてしまうとプロジェクトの内外に関わらず全ての編集作業でハードタブが入り込んでしまうようになりました。
複数人で触る大量のファイルにモードラインを入れるとかありえないし。
一体どうしたもんか。
vim-localvimrcの導入
困っていたところ、ひとつのプラギンを発見しました。
embear/vim-localvimrc · GitHub
このプラギンはファイルパスを遡ってローカル用の.vimrc(デフォルトでは.lvimrc)を探し、存在すれば適用してくれます。
目的のプロジェクトのルートにバッファローカルな設定を行う.vimrcを置いてみます。
$ echo 'setlocal noexpandtab tabstop=4' > /path/to/project/.lvimrc
たったこれだけで問題はバッチリ解決しました。
またバージョン管理を使っている場合は.lvimrcを無視パターンに追加するのを忘れずに。
vim-localvimrcの設定可能な項目を以下に書いておきます。
変数 | 説明 | デフォルト |
---|---|---|
g:localvimrc_name | 対象となるローカル設定ファイルの名前 | .lvimrc |
g:localvimrc_reverse | 0: 下位ディレクトリのものほど設定を優先 1: 上位ディレクトリのものほど設定を優先 |
0 |
g:localvimrc_count | 読み込みを行う上限数 | -1(制限なし) |
g:localvimrc_sandbox | 0: 設定ファイルの評価をサンドボックスで行わない 1: 設定ファイルの評価をサンドボックスで行う |
1 |
g:localvimrc_ask | 0: 設定ファイルが見つかったら即読み込む 1: 設定ファイルが見つかったら読み込みを行うかどうかの確認を促す |
1 |
g:localvimrc_persistent | 0: g:localvimrc_askでの選択内容を保持しない 1: Y/N/Aなどの大文字の入力時にのみ保持する 2: 常に保持する |
0 |
g:localvimrc_persistence_file | g:localvimrc_persistentの情報を保持するファイル名 | $HOME/localvimrc_persistent |
g:localvimrc_whitelist | 読み込みを許可するための正規表現 | (なし) |
g:localvimrc_blacklist | 読み込みを拒否するための正規表現 | (なし) |
その他
似たプラギンは他にもあります。
- thinca/vim-localrc · GitHub
- thincaさん作。シンプルで綺麗だが、自分の環境でうまく動かなかった。
- vim-scripts/local_vimrc.vim · GitHub
- 古い上に全然更新されてない。
中身をすべて確認したわけではありませんが、今回はとりあえず動かしてみて自分にあってそうなものを選びました。
fuelphpのmigrationでカラム追加時にmysqlのafterを指定する
fuelphpはドキュメントが弱いのでイマイチわからなかった。
知ってしまうとまぁまぁ応用が効く感じ。
migrationファイルの生成時に以下のように指定する。
$ php oil generate migration add_nickname_to_users nickname:varchar\[32]:after\[id]
他にもdefaultやnullとか。
$ php oil generate migration add_status_to_users status:tinyint:default\[1]:null
以上。
Solrで日付の加算/減算をする
Solrを使っていて条件に半年先ってどう書くんだっけなー、と思い調べてみました。
http://docs.lucidworks.com/display/lweug/Solr+Date+Format
日付の加算/減算は、以下のように[日付][+/-][単位]とすればよいそうです。
opened_at:[* TO NOW+6MONTH]
NOWは現在時刻を表す書式で、この部分は日付でも構いません。
opened_at:[* TO 2014-01-30T12:34:56Z+6MONTH]
などと書くこともできます。
ついでにわかったことですが、[日付]/[単位]とすればその単位で丸めた値が取得できるようです。
opened_at:{* TO NOW+6MONTH/DAY}
で今日の6ヶ月後の午前0時未満の日付を持つドキュメントが抽出できます。
加算/減算/丸めに使える単位は以下の通りです。
単数形と複数形には特に挙動の違いはありません。
単位 | 書式 |
---|---|
年 | YEAR / YEARS |
月 | MONTH / MONTHS |
日 | DAY / DAYS / DATE |
時 | HOUR / HOURS |
分 | MINUTE / MINUTES |
秒 | SECOND / SECONDS |
ミリ秒 | MILLISECOND / MILLISECONDS / MILLI / MILLIS |
ミリ秒とか使い道が思い浮かばない。