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

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動画を作ったので、見てもらうと動きがわかりやすいかと思います。

http://gifzo.net/JEJkjm4LKP.gif

  • 基本的な挙動はf/tと同じ
  • 対象が複数存在する場合はそれぞれの位置がハイライトされ自由に移動することができる
  • 移動にはhまたはlを使用
  • エンターキーやタイムアウトで位置を確定

といった特徴を持っています。

glowshi-ft.vimのいいところ

では個人的glowshi-ft.vimのいいところベスト3を発表したいと思います。

其ノ壱.vimmerに優しい操作性

前述の通り、対象文字間の移動にはh/lが使えるのでこれ以上ない直感的な操作が可能です。
気づいたらエクセルがhjklで埋め尽くされているアナタも安心。
ストレスフリーです。

其ノ弐.移動と同時にキー入力

候補を移動中に操作できるキーはh/lのようにいくつか用意されていますが、それ以外の用途が割り当てられていないキーを押すと入力時点での位置に移動を確定しつつ、そのキーを入力した状態に移行します。
たとえばある候補の上でiを押せば移動後に即インサートモードになり、またある候補の上でdを押せば入力待ち状態になるため続けてiwと押すことでテキストオブジェクトでの削除が行えます。
これはストレスフリー。

其ノ参.ビジュアルモードやオペレータと合わせてどうぞ

もちろんビジュアルモードやオペレータにも対応しているのでvf{char}lyとかdF{char}hh<Enter>といった操作も可能です。
うーんストレスフリー。

またここでは紹介していない機能(そんなに大したものはないですが)もあるので気になった方はgithubやドキュメントをご覧ください。

最後に

glowshi-ft.vimは絶賛人柱募集中です。
興味が沸いた方は是非使ってみてください。
問題を発見したら容赦なくissuesをくださると大変助かります。

それでは、よいvimライフを!

hubotでLGTM

 
http://www.hatena.ne.jp/

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 読み込みを拒否するための正規表現 (なし)

その他

似たプラギンは他にもあります。

中身をすべて確認したわけではありませんが、今回はとりあえず動かしてみて自分にあってそうなものを選びました。

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で日付の加算/減算をする

f:id:saihoooooooo:20140130163127p:plain

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

ミリ秒とか使い道が思い浮かばない。