アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

Mac OS X おすすめキーバインド

こんにちは。MacBookAirで仕事している坂本です。

自分はショートカットキーが大好きです。
ただアプリによってはショートカットキーが動かずイライラすることがあります。
今回はそんなようなことがないようにアプリを使ったオススメのキーバインドを紹介しようと思います。。

まずキー割り当てを変更するアプリにはKeyRemap4MacBookを使用します。


KeyRemap4MacBook


https://pqrs.org/macosx/keyremap4macbook/

こちらからお使いのOSXバージョンに合ったインストーラーをダウンロードしてインストールしてください。
LaunchpadまたはアプリケーションディレクトリにKeyRemap4MacBookというアプリが出てくるのでダブルクリックで起動させましょう。

するとChange Keyというタブで利用できるキーバインドの一覧が表示されます。
この中から使いたいキーバインドにチェックすれば良いというわけです。


ホームポジションのままフロントスペースを!!


まずはフロントスペースです。
フロントスペースはバックスペースが前の文字を消すことに対して後ろの文字を消すためのキーです。
WindowsではBSキーがBackSpaceでDeleteキーがフロントスペースですね。

Macのデフォルトでもcontrol+Dでカーソルの後ろの文字を削除することができますが一部の対応していないMicrosoft Wordなどで動きません。
そこでFn+deleteではなくcontrol+deleteにキーを割り当てることでタイムロスを防ぐことにします。



▼ Change Delete Key
  □ Control + Delete to Forward Delete


になります。
これで文字を削除する時は右手の小指は迷わずにdeleteへ向かうことができ前の文字を消すか次の文字を消すかはcontrolキーでコントロールできるわけです。

非常に便利です。


ホームポジションのままカーソル移動!!


次にカーソルキーです。

カーソルを動かすため頻繁に使うキーなのですがどうやっても右手がホームポジションから離れてしまいます。
ホームポジションへ右手を戻す時に人差し指でJキーの凹凸を探す手間が増えます。
そこでcontrolキーと合わせてカーソルを移動させるキーバインドを設定しましょう。

私はサーバでファイルを編集する時はViコマンドを使っているのでViの設定をキーバインドに持ち込みます。

KeyRemap4MacBookキーバインド一覧に



▼ Vi Mode
  □ Control_L + hjkl to Left/Down/Up/Right


にチェックを入れましょう。
するとViの操作と一緒にhキーを押すと左へ、jキーを押すと下へとカーソルが動くようになります。

Emacs派の方は



▼ Emacs Mode
  □ Control + PNBF to Up/Down/Left/Right

があるのでこちらを使ってください。
最初は違和感がありますが、慣れてくるとプログラミングでもメールでも驚くほど早くなります。


キーリピート速度アップ!!


最後にキーを押しっぱなしにした時のキーリピート速度を早めたいと思います。
これもKeyRemap4MacBookで変更することができます。

Key Repeatタブ内の



▼ Basic Configurations
 ▼ Key Repeat
   Key Repeat


こちらのvalue値を小さくすることでキーリピート速度が早くなります。
おすすめは23msくらいでしょうか。

以上の3つだけですが自分はこれだけでかなり業務を効率化できています。
デメリットとしてはViを開いた時にカーソル移動でちょっと混乱する程度でしょうか。

キーバインド方法は人それぞれです。
Controlキーにバックスペースを割り当ててcapsキーにControlキーを割り当てる人もいます。

KeyRemap4MacBookを使ってどんどん使いやすい環境を整えましょう。

emacsを少し便利に使う設定

今回は、自分が.emacsに追加してちょっと便利になったスクリプトを公開したいと思います。

自分はアシアルで唯一emacsを使っていますが、なぜか社内では「エディタと言ったらvimの事だよね?えまくす()」という風潮になっており、不人気どころか存在が無いエディタですが、vimと同じく"慣れれば"便利なエディタです。
もし、vimの方が一方的に優れていたらemacsや他のエディタは消滅しているはずなので、どちら使うかは個人の趣味です。

話がそれました。つまりは好き嫌いせずに一度使ってみてください。

さて、では早速本題の方へ行きましょう。

1・tramp


リモートサーバののファイルを編集することが出来ます。
ローカルの環境から直接編集することが出来るので、いちいち.emacsをコピーや、環境の違いに悩まされません。
C-xC-fでファイルを開く時に、下記のように入れてやれば使うことが出来ます。


/ssh:10.0.0.1:
/ssh:www@10.0.0.1: ;もちろん、ユーザ名を入れることも出来ます

あとはリモートサーバでemacsを開いたように使えます。
さらに、shell-commandもリモートに送ってくれる優れもの。
例えば、M-!で、php -l をしたらリモートのphpを実行してくれます。

さて、次に踏み台サーバを経由しないとアクセス出来ないサーバのファイルを編集する場合には、.emacsに下記のように追記すれば踏み台サーバも問題なく使えます。


(add-to-list 'tramp-default-proxies-alist
             '("192.168.1.1" nil "/ssh:10.0.0.1:"))

上記は192.168.1.1サーバに入るには、10.0.0.1に入ってから接続しろという設定。
で、下記のように普通に接続すればOKです。


/ssh:192.168.1.1:

trampはsshがつながる範囲ならどこでも接続出来ます。便利ですね。

実は、ログイン後にsudoやsuすることも出来ます。
192.168.1.1にてrootユーザにsudoする場合には下記のように追記します。


(add-to-list 'tramp-default-proxies-alist
             '("192.168.1.1" "\\`root\\'" "/ssh:192.168.1.1:"))

192.168.1.1のrootになるには、192.168.1.1に入れという命令です。



/sudo:192.168.1.1:

上記のように、/sudo:を指定してやれば接続後sudoしてくれます。

※なお、上記の設定は~/.ssh/configを設定してssh側で解決しても似たようなこと出来ます。


2・after-save-hook


ファイルをセーブした時にプログラムを実行出来るので、セーブと同時に実行できたら便利な機能を書いておくといいと思います。
先程のtrampと組み合わせると便利に使えます。

■ 構文チェック
下記のようにすれば保存した時にphpの構文チェックをして、エラー行を出してくれます。
要は、shell-commandでphp -lを実行しているだけですが。


(add-hook 'after-save-hook
	  '(lambda ()
             (when (buffer-file-name) ;; 念のためファイル名があるかチェック
	       (and (string-match ".php" (buffer-file-name)) ;; ファイル名がphpで終わっていたら
	       ;; php -l を実行してエラー行のみ取り出す
		    (shell-command (concat "php -l `basename '" (buffer-file-name) "'` 2> &1 | grep 'on line ' | grep -v ' in Unknown on line '")))
               )))


構文チェックだけなら、もっと便利なflymakeもありますが、今回は割愛でします。

■ nginx再起動
開発環境で頻繁にnginxの設定を変更するとします。
毎回編集後に再起動するのが面倒なので、/etc/nginx/nginx.confを変更したあと即再起動させる場合。


(and (string-match "/etc/nginx/nginx.conf" (buffer-file-name))
  (shell-command "/etc/init.d/nginx restart"))

これだとどのサーバでも再起動させてしまうので、


(string-match "host:/etc/nginx/nginx.conf" (buffer-file-name))

上記ののようにホスト名書いておくと安心かもしれません。

3・change-major-mode-hook


メジャーモードが変更された時に呼ばれます。

bgex-patch( http://umiushi.org/~wac/bgex/ )と組み合わせて、特定のサーバに接続したときはこの壁紙を表示とか書いておくと壁紙で違いがわかるため、間違いが少なくなるかもしれません。



(add-hook 'change-major-mode-hook
		  '(lambda ()
			 (when (buffer-file-name)
			   (setq imagepath nil)
			   (when (string-match ":192.168.1.1:" (buffer-file-name))
				 (setq imagepath "~/.termwallpaper/2284956.jpg"))

			   (when imagepath
				 (condition-case err
					 (when (bgex-set-image (buffer-name) 'bgex-identifier-type-buffer-name imagepath))
				   (error (message "my error"))))
)))


その他、便利なhook設定はたくさんありますので、ぐぐってみてください。

3・その他


細々便利だと思った設定の紹介です。

metaタグの内容で文字コードを自動判別しないように設定
htmlを開いた時にmetaタグの中身などをみて自動で文字コードを判別してくれる機能がありますが、
古いwebシステムを変更する場合、metaタグと実際の文字コードが違うことがよくあるので、全部無視します。


(setq auto-coding-functions nil)


/android/を含むディレクトリの場合は、F5を押すと自動でantを実行してくれるプログラム。


(defun andrcompile ()
  (interactive)
  (or (and (buffer-file-name)
		   (string-match "\\(^.*/android/.*?/\\)" (buffer-file-name))
		   (setq compile-command (concat "cd " (match-string 0 (buffer-file-name)) ";"
										 "ant -emacs clean s-deploy;"
										 ))
		   (compile compile-command)
		   )
	  (message "Faild"))
  )
(global-set-key (kbd "<f5>") 'andrcompile)


4・まとめ


要は、elispさえ使えれば便利なhookやコマンドを作成出来るという紹介でした。
少しコードを書くだけで面倒な処理を解決できるのでぜひカスタマイズしてみてください。
せっかく目の前に高性能なコンピュータがあるのに、それを使わないのは損以外の何者でも無いので。

おまけ
vim使っている人ならvimscriptとかpythonでもカスタマイズ出来ます。
あと、自分はemacsファンではありますが、vimアンチでは無いので。

EmacsでDvorak配列を使う

キーボード配列といえばqwerty配列デファクトスタンダードですね。
市場に出回る製品でqwerty以外を搭載したものは無いと言っても過言ではないほどです。
普通に使う分にはqwertyだけで十分。他の配列は邪道。qwerty最強!な雰囲気がありますが、
自分はあえて「Dvorak配列」に手を出してみました。



理由は単純で、効率があがる・・・らしい。
ググってみると左右交互打鍵だの連続打鍵などの効率が云々と書いてありますが、読んだところでよくわかりません。
「百聞は一見にしかず」ということで実際に練習してみました。

Dvorakを入力出来ないと話にならないので、$ setxkbmap dvorak を実行して、全体をDvorakにしてみましたが、全然打てないので仕事にならなかったのでシステム全体は諦めました。
多少遅くても問題無い環境と言えば、コーディング中ということで、EmacsだけどうにかしてDvorakか出来ないかとググってみると、

http://dvorak.mwbrooks.com/

このサイトの

http://dvorak.mwbrooks.com/qwerty.el

にたどり着きました。

これをロードして M-x dvorak で実行すれば見事にDvorak配列に。
M-x qwerty でqewrtyにもどります。
(ただし、英語キーボード用なので、日本語キーボード用に少し修正する必要があります)

時間に余裕のある時はちまちまとDvorak練習。時間が無いときはqwertyに切り替えて・・・と繰り返しているうちに、1ヶ月程度で普通に使う分には問題ない速度になりました。
ただし、途中で"r","l"の配置に疑問を感じたときから「どうせ他でDvorak打つことも無いので、普段使いに最適化しよう」と思い立ちカスタマイズしました。

anti-qewrtyの行を編集して、


 (anti-qwerty "';hpykgcu.,:>Zaoeridltnvzq-jfxbmws/\"=$PYKGCUH{}AOERIDLTN^@_*JFXBMWV?[]<SQ+!`"
  "qwertyuiop@:*=asdfghjkl.-zxcvbnm,;/QWERTYUIOP{}ASDFGHJKL'\"_XCVBNM<>?[]`+Z^!$"))

こんな感じに。



こうなった理由は、文字の出現頻度の差です。とあるシステム全体で使用している文字をカウントしたところ、


   5490 Z       64070 D
   6699 J       64229 N
   8022 X       74286 2
   8117 K       78768 .
   8133 \       79870 R
   9733 Q       79955 1
  11526 z       85729 I
  15956 q       86880 S
  15968 V       88447 T
  16066 W       93242 b
  19486 Y       94484 A
  20686 7       98135 E
  21690 9      100104 y
  22641 8      112122 *
  22838 j      137194 ,
  22896 6      151408 g
  25659 G      157805 f
  28387 H      163209 m
  29118 B      169050 (
  30923 U      169075 )
  31112 5      176303 =
  31609 4      194718 '
  35662 M      198600 u
  42190 3      214832 d
  42562 F      226900 h
  47464 }      227166 p
  47497 {      258600 c
  50118 x      260312 $
  51508 L      306474 l
  52031 w      390661 o
  52757 P      406657 n
  54886 k      429489 s
  57478 v      478070 r
  59704 "      503466 i
  61102 O      522085 a
  62715 0      616784 t
  63463 C      760272 e

以上の様になったので、出現頻度の高いものを中段に、それ以外を上段下段の打ちやすい位置に配置。
基本的に大文字と小文字は同じキーですが、"$"だけはHと入れ替えています。
PHPは事あるごとに"$"を打つので良い位置に。

使用感としては、若干効率が上がったかどうははよく分かりませんが、打つのは楽です。
指を動かす距離が明らかに減って、タイプミスも少なくなったような、そうでもないような・・・。(でも、中段に揃っているのはかなり便利ですね)

ちなみに、かな入力の方は全然試していません。(普段がNICOLAなので)

一通り打てるようになったので、出来れば全てDvorakにしたいのですが、vimキーバインドを初め、様々なキーバインドが訳分からなくなるので、Emacs以外はqwertyのまま使っています。
以上、(変則)Dvarakの使用感でした。


余談ですが、私が現在打てる配列は以下6つに。
qwerty
dvorak
qwertyローマ字
・(多分)dvorakローマ字
・JISかな
NICOLA

これだけ打てて何か意味があるかと言うと、全然無いかと。
はっきり言って無駄だとは思いますが、楽しければいいと思います。

つぎは、飛鳥配列でも試してみようかと思っていますので、その時はまた似たようなネタを書くかもしれません。


おまけ「練習方法」

1・よく使うキーを数個ほど覚えてからコーディングなどで練習します。
  (時間制限のあるソフトなどを使うと打てないので嫌になりますので、マイペースに練習出来るものを)
2・一通りキーの配置を覚えたら、一つの単語を一気に打つ指の運びをイメージして打っていきます。

これが出来るようになれば普段使いは問題ないと思いますが、さらに高みを目指すなら、
3・文字を見た瞬間に指が動くまで練習。
(音楽にあわせて歌詞を打っていくのが楽しくていいかもしれません)

以上、自分が練習したときに感じたコツでした。

PHP開発で追加しておきたいEmacs Lisp 8選

はじめまして、アシアルで働くようになってまだ三週間ほどの高橋と申します。
ブログを書くのもはじめてのことなので、何か至らないところがありましたら、ご指摘くださると助かります。

さて、皆さんはPHPで開発を行う際、エディタは何を使っていますか?
私はEmacsというエディタを使っています。Emacsは使いはじめこそとっつきにくいのですが、慣れてしまうと離れられない魅力が一杯詰まった素敵なエディタです。

今回はそんなEmacsPHPの開発環境を作る場合に、追加しておくと開発がより便利になるelispを8個選んで紹介してみたいと思います。
なお、標準のEmacsに含まれているものは除外しています。


1. PHP mode for Emacs

EmacsPHPのコードを書くなら、やはりこれが必須です。そのためか、追加インストールしなくても使えるようになってるディストリビューションも多いです。
このモードを使うと、コードの色付け、関数名の入力補完、PEARコーディング規約に準拠した編集などが行えます。

なお、入力補完を行うには、PHPのHTMLマニュアルをダウンロードして、/usr/local/share/php/docなどへ展開しておく必要があります。



; 設定例
(autoload 'php-mode "php-mode")
(setq auto-mode-alist
      (cons '("\\.php\\'" . php-mode) auto-mode-alist))
(setq php-mode-force-pear t)
(add-hook 'php-mode-user-hook
	  '(lambda ()
	     (setq php-manual-path "/usr/local/share/php/doc/html")
	     (setq php-manual-url "http://www.phppro.jp/phpmanual/")))



2. A CSS editing mode for emacs

HTMLと一緒によく書くものといえば、スタイルシートですね。そのCSSを編集するためのモードです。
コードの色付けはもちろんのこと、M-TABでプロパティ名の補完ができるようになり、入力するのがとても楽になります。



; 設定例
(autoload 'css-mode "css-mode")
(setq auto-mode-alist
      (cons '("\\.css\\'" . css-mode) auto-mode-alist))
(setq cssm-indent-function #'cssm-c-style-indenter)



3. Major mode for editing JavaScript source code

Ajaxを使うサイト開発に必要なJavaScriptを編集するためのモードです。ただ、いつの間にか配布していたサイトが404 Not Foundになってました……。
一応こちらの方の記事によると、Internet Archiveからダウンロードできるようですが、何か問題でもあったんでしょうか?

トラックバックで教えていただいたのですが、こちらのURLでサイトが復活したようです(2007年5月9日追記)



; 設定例
(add-to-list 'auto-mode-alist (cons "\\.js\\'" 'javascript-mode))
(autoload 'javascript-mode "javascript" nil t)
(setq js-indent-level 4)



4. MMM Mode

例えば、HTMLファイルを編集する際、styleタグで囲まれているところはcss-mode、他はhtml-modeといったように、カーソルの位置にあわせて複数のモードを自動的に切り替えてくれます。



; 設定例
(require 'mmm-auto)
(setq mmm-global-mode 'maybe)
;(set-face-background 'mmm-default-submode-face nil) ;背景色が不要な場合

(mmm-add-classes
 '((embedded-css
    :submode css-mode
    :front "<style[^>]*>"
    :back "</style>")))
(mmm-add-mode-ext-class nil "\\.html\\'" 'embedded-css)



5. Mule-UCS

最近では、PHPエンコーディングUTF-8として開発している方も多いのではないでしょうか。
Mule-UCSをいれることで、UTF-8JIS X 0213などの文字コードを扱えるようになります。

なお、現在オフィシャルサイトにアクセスできないのですが、Hideyuki SHIRAI's Web pageからダウンロードできます。



; 設定例
(require 'jisx0213)
(set-language-environment "Japanese")



6. Subversion Interface for emacs
PHP開発に限ったことではありませんが、ソースコードのバージョン管理は大切ですね。アシアルでもSubversionを使って管理しています。
psvnはそのSubversonのインターフェースとなり、手動でsvnコマンドを実行するよりも手軽な操作性を提供してくれます。
実際に操作する場合は、チェックアウトしたファイルのあるところでM-x svn-statusを実行します。



; 設定例
(autoload 'svn-status "psvn" nil t)



7. ElScreen

バッファを複数に分割して作業をしていると、そのバッファの状態を保ったまま、別のバッファへ切り替えたくなることが多々あります。
window環境であれば別フレームを開くことで対応できますが、フレームが多くなると切り替えが大変ですし、ターミナル環境ではそうはいきません。

ElScreenを使えば、ひとつのフレーム内で複数のスクリーンを素早く切り替えることができ、慣れると手放せなくなります。



; 設定例
(require 'elscreen)
(if window-system
    (define-key elscreen-map "\C-z" 'iconify-or-deiconify-frame)
  (define-key elscreen-map "\C-z" 'suspend-emacs))



8. TRAMP

さて、これまで紹介してきたelispをインストールして快適な開発環境を構築したとしても、作業マシンが変わってしまったら、もうその環境は使えません。かといって、マシン毎に開発環境を構築するのは非常に手間がかかって面倒ですね。
TRAMPを使うと、



C-x C-f /user@host:/path/to/remote/file
C-x d   /user@host:/path/to/remote/dir


といった操作で、別のマシンにあるファイルを、まるでローカルマシンにあるかのように編集したり、diredで移動したりといったことができるため、お気に入りのEmacs環境をひとつ作るだけで大丈夫になります。



; 設定例
(require 'tramp)



以上、駆け足の紹介となりましたが、如何だったでしょうか?
8個選ぶならこの8個のほうがいいとか、他にPHPの開発が便利になるelispをご存知でしたら、ぜひぜひお教えください。