ゆず日記

戦う Vimmer 兼 Dvorakユーザ 兼 Kinesisユーザ 兼 おぺらー が戦わないブログ

Vim / MacVim の Esc 代替キーのお話。

正式タイトル: Vim (iTerm2 を併用) での Esc 代替キーと、 MacVim (Karabiner を併用) での Esc 代替キーのお話。

代替キー

自分は Esc の代替キーとして Command + . を利用している

理由

  • Terminal.app の Command + . が Vim 上では Esc として代用可能なのでそれに慣れてた
  • Ctrl + [ に比べ, ホームポジションから近い

f:id:Yuzuemon:20141015034126p:plain

Dvorak 配列では、緑枠の "U" がホームボジションキー

Vim (iTerm2)

f:id:Yuzuemon:20141015034247p:plain

Profiles > Keys から、Command + . に 0x03(Esc) を割り当てる

MacVim (Karabiner)

Karabiner (keyremap4macbook) の private.xml を以下の様に設定する。 Karabiner の KeyCode は Qwerty 基準になっているのに注意。

<?xml version="1.0"?>
<root>
  <appdef>
    <appname>MacVim</appname>
    <equal>org.vim.MacVim</equal>
  </appdef>

  <item>
    <name>Change Left Command + E to Escape on MacVim</name>
    <identifier>private.app_macvim_change_left_command_and_e_to_esc</identifier>
    <only>MacVim</only>
    <autogen>
      __KeyToKey__
      KeyCode::E, ModifierFlag::COMMAND_L,
      KeyCode::ESCAPE
    </autogen>
  </item>
</root>

Reload XMLして該当設定にチェックを入れるだけ。

出来ました。

Karabiner はお好みで他のキーバインドも設定するといいですね。

tig の help ビューの日本語訳を纏めてみたお話。

tig をもっと理解して使おうと tig の helpビューの内容を纏めてみた。
help ビューの内容はキーバインディングのみで説明が一切ないのでちょっとだけ補足コメント付けてみた。

共通のキーバインディング

ビュー切り替え

key name 切り替え先のビュー ビューの説明
m view-main mainビュー commit履歴を表示するメインの画面
d view-diff diffビュー 特定のコミットの差分を表示する画面
l view-log logビュー git log 相当の画面
t view-tree treeビュー ファイルツリー
f view-blob blobビュー 実ファイルの中身を確認できるビュー
b view-blame blameビュー git blame 相当の画面
r view-refs refsビュー git branch -a 相当の画面
s, S view-status statusビュー git status 相当の画面
c view-stage stageビュー stage したファイルの確認, 編集できるビュー
y view-stash stashビュー git stash 相当
g view-grep grepビュー grep
p view-pager pagerビュー 未調査
h view-help helpビュー :h

全部でビューが13種類もあるんですねー。3種類位しか使ってなかった。

操作

key name 操作
Enter enter 決定, 選択行を開く
< back 前の表示に戻る
<Down>, <Ctrl-N> next 次に進む
<Up>, <Ctrl-P> previous 前に戻る
, parent 一階層戻る
<Tab> view-next 次の view をフォーカス
R, <F5> refresh 再読み込み
O maximize 現在の view を最大化
q view-close 現在の view を閉じる
Q quit すべての view を閉じて終了

カーソル移動

key name 移動先
k move-up 一行上へ移動
j move-down 一行下へ移動
<PageDown>, <Ctrl-D>, <Space> move-page-down 1ページ下へ移動
<PageUp>, <Ctrl-U>, - move-page-up 1ページ上へ移動
<Home> move-first-line 行頭へ移動
<End> move-last-line 行末へ移動

スクロール移動

key name 移動先
<Insert>, <Ctrl-Y> scroll-line-up 一行上へスクロール
<Delete>, <Ctrl-E> scroll-line-down 一行下へスクロール
<ScrollBack> scroll-page-up 1ページ上へスクロール
<ScrollFwd> scroll-page-down 1ページ下へスクロール
| scroll-first-col 1つ目のカラムへスクロール
<Left> scroll-left 2つ左のカラムへスクロール
<Right> scroll-right 2つ右のカラムへスクロール

検索

key name 補足
/ search /hoge でこのview内のhogeを検索し、カーソル位置から最も近い次の出現箇所へ移動
? search-back ?hoge でこのview内のhogeを検索し、カーソル位置から最も近い前の出現箇所へ移動
n find-next 次の出現箇所へ移動
N find-prev 前の出現箇所へ移動

オプション操作

key name 操作
o options オプションメニューを開く

その他

key name 補足
e edit エディタで開く
: prompt プロンプトを開く
<Ctrl-L> screen-redraw 再描画
z stop-loading すべての読み込み中のviewを止める
v show-version バージョン情報を表示

そのままエディタで開けられるの今知った...

表示切り替え

key name
I :toggle sort-order
i :toggle sort-field
# :toggle line-number
D :toggle date
A :toggle author
~ :toggle line-graphics
F :toggle file-name
W :toggle ignore-space
X :toggle id
$ :toggle commit-title-overflow
% :toggle file-filter

例えば mainビューで D を押すと押す度に日付表示を切り替えることが出来る。

各キーごとに有効なviewが異なるようでちょっと使い勝手が...
使いたいものを .tigrc に書いといた方が良さげ。

メインビューのキーバインディング

表示切り替え

key name
G :toggle commit-title-graph
F :toggle commit-title-refs

コミットグラフは便利だけどコミットコメントを見る際には全角/半角記号のレンダリングが崩れてしまって、コメントが見づらい。 そんな時に G は非常に有用。

外部コマンドの実行

key name 補足
C ?git cherry-pick %(commit) git cherry-pick

diff ビューのキーバインディング

表示切り替え

key name 補足
[ :toggle diff-context -1 差分前後の表示行数を減らす
] :toggle diff-context +1 差分前後の表示行数を増やす

[, ] で差分前後の表示行数の増減が可能。あーこれ欲しかった機能だ。

内部コマンドの実行

key name 補足
@ :/^@@ 次の差分へ移動

:?^@@ も登録しておくといいかも。

refs ビューのキーバインディング

key name
C ?git checkout %(branch)
! ?git branch -D %(branch)

ブランチの checkout と削除が行える。どちらも確認が出る。

status ビューのキーバインディング

key name 補足
u status-update ファイルを stage / unstage する。 git add <file>, git reset @ <file> 相当
! status-revert revert する。実質git checkout <file> 相当?
M status-merge 外部merge ツールを起動してmerge する

外部コマンドの実行

key name 補足
C !git commit git commit します

はい。

stage ビューのキーバインディング

key name 補足
u status-update ファイルを stage / unstage する。 git add <file>, git reset @ <file> 相当
! status-revert revert する。実質git checkout <file> 相当?
1 stage-update-line 現在の行を stage / unstage する
\ stage-split-chunk 何を分割するのかちと不明

1 は便利...なのかも知れない。

表示切り替え

key name 補足
[ :toggle diff-context -1 差分前後の表示行数を減らす
] :toggle diff-context +1 差分前後の表示行数を増やす

diff ビューと一緒

内部コマンドの実行

key name 補足
@ :/^@@ 次の差分へ移動

diff ビューと一緒

stash ビューのキーバインディング

key name 補足
P ?git stash pop %(stash) git stash pop
! ?git stash drop %(stash) stash の削除

git stash list より中身が確認しやすい分楽。

纏め

他のキーで機能を使いたい場合には、機能名(name)も表に纏めたので .tigrc にお好みで設定を書くといい。 特に git push は default では出来ない仕様なので自分で .tigrc にキーバインディングを追加する必要がある。

tig を便利な git viewer 位に思ってたけど、SourceTree と同等位の機能を持っててビックリした。

TODO:

次は .tigrc について纏める

tig(1)
tigrc(5)

file, Fileinfo に依る Office 2007+ ファイルの MIME TYPE 判定のバージョン差異について

システムコマンドの file と、PHP の Fileinfo のバージョン差異に依る Office 2007+ ファイル(docx, xlsx, pptxとか)の MIME TYPE について。

結論

長いので結論から。

file - 5.06 5.07 - 5.12 5.13 -
docx application/zip application/msword application/vnd.openxmlformats-officedocument.wordprocessingml.document
xlsx application/zip application/vnd.ms-excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
pptx application/zip application/vnd.ms-powerpoint application/vnd.openxmlformats-officedocument.presentationml.presentation


php 5.4.14, 5.5.0 (libmagic 5.14) 5.4.x, 5.5.x, 5.6.0 (libmagic 5.17)
docx application/msword application/vnd.openxmlformats-officedocument.wordprocessingml.document
xlsx application/vnd.ms-excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
pptx application/vnd.ms-powerpoint application/vnd.openxmlformats-officedocument.presentationml.presentation

5.4系と5.5系のどのマイナーバージョンで libmagic 5.17に変わってるのかまで追ってないが、最新の ver. では5.17相当だった。

MIME TYPE 判定を行う fileコマンド や PHP の Fileinfo は、バージョンアップの際に Office 2007+ ファイルの判定に変化がある可能性がある。 MIME TYPE チェックを行っている環境では、docx, xlsx, pptx のテストファイルとテスト実行するコードを用意して置いて、バージョンアップ前後で変化が無いか確認できる体制を整えていた方が良さそうだ。

file コマンド

システムコマンドから MIME TYPE が調べられる file コマンド ( The Fine Free File Command )*1

Vagrant 上で試してみた。 file-5.11 は CentOS 6 用の yum パッケージが配布されてなかったので CentOS 7 でテスト。

# CentOS 6
[vagrant@localhost ~]$ file -v
file-5.04
magic file from /etc/magic:/usr/share/misc/magic

[vagrant@localhost ~]$ file --mime-type test.xlsx
test.xlsx: application/zip

# CentOS 7
[vagrant@localhost ~]$ file -v
file-5.11
magic file from /etc/magic:/usr/share/misc/magic

[vagrant@localhost ~]$ file --mime-type test.xlsx
test.xlsx: application/vnd.ms-excel

file 5.04 - 5.11間で magic データベースが更新された模様。

file/file · GitHub を見て調べてみた結果、5.07 で add msooxml stuff. · 726ddc3 · file/file · GitHub が追加されており、Office 2007+ の MIME TYPE が変わっている。

ちなみに、 fix mime types. (Thomas Ledoux) · 55feed3 · file/file · GitHub を見る限り 5.13 からはまた Office 周りの MIME TYPE が変わっているハズ。 CentOS 6 標準の yum リポジトリでは file-5.04 が最新なので、これからCentOS 7 に環境を変えた際にハマる人が多いのではないか。

とはいえ Webサービスなどで直接システムコマンドを実行することは基本やらないと思う。

PHP

PHP 5.4.14 と 5.4.29 で挙動が違う。

[vagrant@localhost ~]$ php -a
Interactive mode enabled

php > $finfo = new finfo(FILEINFO_MIME_TYPE);
php > $finfofile = $finfo->file('test.xlsx');
php > print $finfofile;
// PHP 5.4.14: "application/vnd.ms-excel"
// PHP 5.4.29: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"

PHP の Fileinfo 関数使用時の挙動と magic データベースの参照先

PHP の Fileinfo 関数で使用される magic データベースの参照先は、以下の順で変更される。

  1. 引数指定した場合: 指定された magic データベースファイル
  2. 引数指定しなかった場合: 環境変数$MAGIC に設定されたパスの先にある magic データベースファイル
  3. 引数指定せず、$MAGIC 未使用の場合: PHP 組み込みの magic データベース

PHP: finfo_open - Manual

基本的には引数も環境変数も使用せず、PHP組み込みの magic データベースを使っていることと思う。

PHP の libmagic について

PHP の magic データベース (libmagic) の更新は PHP: PHP 5 ChangeLog 内にも記載の通り、マイナーバージョンのアップでも頻繁に行われている様子。

で、PHP の libmagic だが php-src/create_data_file.php at master · php/php-src · GitHub を見るとどうやらコミッターの環境で file に含まれる magic を元に PHP 向けにカスタマイズして生成した data_file.c なるものを、 PHP 組み込みの libmagic として扱ってる模様。

しかし php-src/data_file.c at master · php/php-src · GitHub を見てもなんのこっちゃなので、どのバージョンで何が変わったのかリポジトリから追うのは難しそう。

ところが data_file.c 単体の git 履歴は殆どなく、libmagic 5.14アップデート時, 5.17アップデート時のgitコメントログがある程度である。 これは PHP: PHP 5 ChangeLog 内の libmagic 関連の記述とピッタリあってるので、丁度 libmagic 5.14, 5.17 変更時に Office 2007+ 関連の出力がこの時に変更されたとみて良さそうだ。

git コメントログ記載の libmagic ver. と ChangeLog 記載の libmagic ver. を関連付けた結果は冒頭の結論の通り。

libmagic 5.17については ChangeLog には書いてないが 5.4系, 5.5系 でも最新の MIME TYPE 判別に変更されてるようなのだが、もしどのマイナーアップデート時に変更があったかまで知りたい場合には、該当 Commit Log がどのバージョンで merge されたのか tig とか git log -p data_file.c で追えば分かりそうだが不毛なのでここまで。

ちなみに PHP では組み込みで libmagic を持っていたが、他言語ではどのようにして MIME TYPE 判別を行うライブラリの管理をしているのか非常に気になる所である。

*1:ググラビリティが低いのが特徴

「読者になる」ボタン非表示のはてなブログを購読する方法3つ

Google Reader が無くなって feedly に移ったのにちょっと使い勝手が悪くて気がついたら RSS Reader 自体の利用頻度が下がってて、そんな所で購読中のはてなブログの更新メールが割りと便利ではてなブログについては購読機能で賄っちゃおうと思ったのに「読者になる」ボタン非表示にしてるサイトがあって困る人向けだよ。

f:id:Yuzuemon:20140921033721p:plainを押したいんだよ。

具体的には最近企業のエンジニアブログがはてなブログでやってて購読したいのにみんな読者になるボタン隠してて一々atomのURL取得してfeedlyに登録するのが面倒くさいんだよ。

1. スマホからアクセスしてフッターにある読者になるリンクから購読する

はい。

2. ブラウザの開発者ツールからUAを書き換えて 1. をする

f:id:Yuzuemon:20140921031207p:plain

はい。

3. URLを直接叩く

http://blog.hatena.ne.jp/<購読したいブログのユーザid>/<購読したいURL>/subscribe
http://blog.hatena.ne.jp/hatenatech/developer.hatenastaff.com/subscribe

外部ドメインを利用している場合でも、

http://blog.hatena.ne.jp/cookpadtech/techlife.cookpad.com/subscribe

とかで行ける。 ブログのユーザ名は外部ドメインでも結局はてなブログなので

http://techlife.cookpad.com/about

のように /about 付けてaboutページを見ると確認できる。

余談: 読者になるボタンが非表示だと、PCから購読解除できない。

ダッシュボード > 購読中のブログ は購読中のブログを確認出来ても解除が出来ない。これはその内機能追加されそう。

Vim の Syntastic で PSR-2 コーディング規約でチェックするお話。

VimPHP 書く時に PSR-2 コーディング規約に則ったチェックを行う方法。 Syntastic はインストール済み前提。

PHP_CodeSniffer をインストール

pearPHP_CodeSniffer をインストールする

% pear install PHP_CodeSniffer # インストールコマンド

% phpcs --version # バージョンチェック
PHP_CodeSniffer version 1.5.4 (stable) by Squiz (http://www.squiz.net)

% phpcs -i # 利用可能なコーディング規約を出力 
The installed coding standards are MySource, PEAR, PHPCS, PSR1, PSR2, Squiz and Zend

Syntastic の設定

" for syntastic  -----------------------
let g:syntastic_mode_map = {
  \ 'mode': 'active',
  \ 'active_filetypes': ['php']
  \}
let g:syntastic_auto_loc_list = 1
let g:syntastic_php_checkers = ['phpcs']
let g:syntastic_php_phpcs_args='--standard=psr2’

php の checker はデフォルトで [‘php’, ‘phpcs’, ‘phpmd’] の計3つ。 上の .vimrc の場合は syntastic_php_checkers = [‘phpcs’] しか指定していないので PHP_CodeSniffer のみのチェックになる。

元々 phpcs コマンドは --standard=psr2 オプションでコーディング規約を指定可能。 Syntastic 実行時にこのオプションを渡す為に .vimrc 内の syntastic_php_phpcs_args をセットしている。

以上で終わり。

これで PSR-2 コーディング規約のチェックが可能になります。