Vim / MacVim の Esc 代替キーのお話。
正式タイトル: Vim (iTerm2 を併用) での Esc 代替キーと、 MacVim (Karabiner を併用) での Esc 代替キーのお話。
代替キー
自分は Esc の代替キーとして Command + . を利用している
理由
Dvorak 配列では、緑枠の "U" がホームボジションキー
Vim (iTerm2)
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 について纏める
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 データベースの参照先は、以下の順で変更される。
- 引数指定した場合: 指定された magic データベースファイル
- 引数指定しなかった場合: 環境変数$MAGIC に設定されたパスの先にある magic データベースファイル
- 引数指定せず、$MAGIC 未使用の場合: PHP 組み込みの magic データベース
基本的には引数も環境変数も使用せず、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 自体の利用頻度が下がってて、そんな所で購読中のはてなブログの更新メールが割りと便利ではてなブログについては購読機能で賄っちゃおうと思ったのに「読者になる」ボタン非表示にしてるサイトがあって困る人向けだよ。
を押したいんだよ。
具体的には最近企業のエンジニアブログがはてなブログでやってて購読したいのにみんな読者になるボタン隠してて一々atomのURL取得してfeedlyに登録するのが面倒くさいんだよ。
1. スマホからアクセスしてフッターにある読者になるリンクから購読する
はい。
2. ブラウザの開発者ツールからUAを書き換えて 1. をする
はい。
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 コーディング規約でチェックするお話。
Vim で PHP 書く時に PSR-2 コーディング規約に則ったチェックを行う方法。 Syntastic はインストール済み前提。
PHP_CodeSniffer をインストール
pear で PHP_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 コーディング規約のチェックが可能になります。