単発: MacのVimでLand of Lisp
ビックウェーブに乗り遅れました
Land of Lispの翻訳が発売されて3ヶ月くらい経ってしまいましたが、Common Lisp使いたいけどVim派なんだよねの人用です。以前それっぽいものを投稿しましたが、今回はclispを使う場合で、MacのVimでLand of Lispです。
Macが必要です
Macがない場合はMacを買ってきます。MacBook Airがおすすめです。キーボード配列はUS配列がいいと思います。最近では、Apple StoreではFr配列も買えます。UK配列はお勧めしません。
Windowsの場合は、下の .vimrc を適当に変えたらいいと思います。
環境はclispです
Land of Lispは、clispで説明されているのでhomebrew使ってclispを入れます。
brew install clisp
ついでにbrew install git, brew install mercurialも使うので忘れずに入れてください。
neobundleを入れます
$ mkdir -p ~/.vim/bundle
$ cd ~/.vim/bundle
$ git clone https://github.com/Shougo/neobundle.vim.git
上記操作を行った後に、MacVimとかVimを起動して :NeoBundleInstall!すれば準備は完了です。
.vimrcの設定
slimv
ファイル形式がLISPの場合に反応します。 ,cで接続します。,dでカーソルがあるS式を評価します。
let g:paredit_electric_return = 0 は、初期値の1だと (|) のときにReturnすると、) だけ次の行になるのが嫌なのでこうしました。
let g:slimv_repl_split = 4 は、connected swank serverの際、対話窓が縦分割の右側に出てきます。
let g:slimv_repl_simple_eval = 0 にしてるので、評価する画面ではCtrl-Returnをすることで評価されます。Returnで評価したい場合は、コメントアウトしてしまうか0以外にしてください(改行されたりされなかったりしたのでこうしました)。
slimvにctagsの設定があったので、:GenerateLispTagsRecursive を定義して現在のディレクトリから再帰で .vim/tags/lisp.tags に追加するようにしました。:GenerateLispTags では、そのファイルだけが追加されます。<Esc><C-]>で、カーソルが上にある文字列が定義された文字列の場合、定義箇所に移動します(複数ある場合のために<C-]>をg<C-]>にするのがいいかも)。ctags の戻る方法が<C-t>と書かれているものが多いのですが、別件で使っているためか効かないので、<C-o>の戻る、<C-i>の進むを使っています。
アップした .vimrc は他のものが何もないので、MacVimで表示するとこんな感じになります。
最新のslimvだと、分割画面が複数存在していてもちゃんと表示されるようになっています。作者さんすごいです。Unite.vimでjumpするとかneocomplcacheでctagsの補完候補を表示させるようにするとかありますが、VimでLand of Lispを動かすにはこれが一番楽だと思います。slimvのhelpが充実しているので、分からないことがあったら :help slimv, :help paredit してみると良いと思います。
Mac Tips その13 〜Terminal.app〜
Terminalでなんだったかなーと思ったら…
Terminal.appで補完候補を表示する場合は タブ2回
$ osa[tab][tab]
osacompile osadecompile osalang osascript
※1 何も無い状態でタブ2回押すと「Display all 1747 possibilities? (y or n)」と心の準備を求められる
※2 Shift-Esc, ?の順に押してもタブ2回と同じ効果がある
※3 pathもタブで補完できて、cd /App[tab]で cd /Applications/ が補完され、補完が複数あるときはもう一度タブ押すと候補が表示されます
Terminal.appでどこのコマンド呼び出してるか場所を表示する場合は which
$ which ctags
/usr/local/bin/ctags
※ /usr/bin/ctagsはしょぼいから…
Terminal.appで探したいファイル名がどこの場所にあるか調べる場合は find 場所 -name pattern
$ sudo find /private /Library -name .GlobalPreferences.plist
/private/var/root/Library/Preferences/.GlobalPreferences.plist
/Library/Preferences/.GlobalPreferences.plist
※ 例のように複数指定も可能
Terminal.appで使うコマンドのマニュアルが見たい場合は man
$ man ctags
表示されたマニュアルは、j,kで下上、Ctrl-D,Ctrl-Uで半ページ下上、Ctrl-F, Ctrl-Bで1ページ下上
qで終了
ね、簡単でしょ?
MacVimで辞書を呼び出す話
承前
コマンドラインやvimから言語を指定してDash.appを呼び出すという記事を読みました。私も結構前にDash.appを買って使っているので、早速、.vimrcに入れました。Dashは、open dash://[language]:[word]で呼び出せるとのことですが、Macに入っている辞書も open dict://[word]という形式で呼び出すことができます。どうやら、MacVimでは3本指タップも[Ctrl-Cmd-D]もできないみたいなので、これを使って分からない単語を辞書で調べてみましょう。
効果
使い方は同じで、単語にカーソルがある状態で :Dict とすると、Dictionary search: [word] と表示されます。Returnすると、辞書が呼び出され、検索結果が表示されます。
コードはコチラ
また、:Dict [word]<CR>とすることでも入力できます。ちなみに、open -a /Applications/Dictionary.app dict://[word] が、厳密な意味での呼び出しになります。
Mac Tips その12 〜アプリ毎のショートカットキーを設定する〜
Webページ、お前は何を言っているんだ?
※画像は茶番のための自作自演です
Macには、ユーザーがショートカットキーの割り当てを行う機能があります。たとえば、最近は減りましたがWebページを見ていて文字化けしているサイトがあったりすると、Safariの場合、[View] - [Text Encoding] - [Japanese (Shift JIS)]と選択することでエンコーディングをShift JISに変更できます。たいてい、euc-jpであるJapanese (EUC)かUTF-8にしたら文字化けが直るわけです。
ショートカットキーを設定してみよう
こういう問題は、日本語のWebページ特有の問題なので特別にショートカットキーがあるわけでもなく View 選んで Text Encoding 選んでというのは大変面倒なわけです。
というわけで、今回は、[Japanese (Shift JIS)]と[Japanese (EUC)]と[Unicode (UTF-8)]にショートカットキーをつけてみましょう。
やり方は簡単。環境設定画面でキーボードを選択して[Keyboard Shortcuts] - [Application Suports]にした後、[+]を押して、メニュータイトルに[Japanese (Shif JIS)], [Japanese (EUC)], [Unicode (UTF-8)]とそれぞれ入れてショートカットキーを設定するだけ。
([Safari] - [Services] - [Service Preferences...]からでも表示できます)
余談: Hide Reading Listがうっすらと見えますが、Show&Hide Reading Listは設定を一度設定を変更した後に設定を削除すると、Shift-Cmd-LではなくCmd-Lになってしまうため再設定する必要がありました…
設定が完了したら即反映するので見てみると…
無事、設定されていることが確認できます。
タイトルメニューの入力文字は、場所が深くても文字列さえあっていれば問題ないようです。ただし、アプリによっては階層が違うだけで完全に一致した文字列がある場合があり、そうなると意図していない方にショートカットキーが割り当てられたりします。そういうときは、「下手なメニュー名の設定をすな! 」とアプリ作成者を罵ってあげましょう。
使い方が広がります?
当たり前のことですが、ショートカットキーの設定は Safari に限ったことでなく他のアプリでも設定できます。他には、メニュー画面だけでなく印刷ページにある [Save as PDF...] にもショートカットキーが設定できたので、わりとどこでも設定できるようです(Applicationは、All Applicationsにしました)。
しかしながらメニューに存在していないもの、たとえば「Safariでも Ctrl-[ が、Escキーだったらなー」とかは設定できないので、諦めて KeyRemap4MacBook で設定してあげましょう。
Mac Tips その11 〜冬季限定MacBook Airの充電事情〜
暖かくなりました
少し前まで寒かったです。最近では暖かくなったため忘れてる人もいるかと思いますが、MacBook Airを充電しようとしてコネクターのケーブルが光らなくなったことがあるかと思います。
この原因についてネットで調べると、10度以下になるとどうやら充電が開始されないみたいな記述が見つかったわけですが、具体的にどこが10度以下なのか気になったので調べてみました。
結果としては、MacBook Air本体ではなくアダプターの方が10度以下になっていると充電が開始されないみたいです。単純に、アダプターをホットカーペットで温めるとういことをやって確かめました。
というわけで、半年以上先の冬にでも活用してください!!
Mac Tips その10 〜ログイン画面のトラックパッドのクリックをタップにしたかった…〜
ログイン画面のトラックパッドが辛抱ならん
Macのログイン時のカーソル移動速度が気になってしまったので調べたらAppleコミュニティー(Mouse Speed at Login)にあったのですが、OS X Mountain Lionでは使えなかったです。ログイン画面での、トラックパッドの速度を設定する"com.apple.trackpad.scaling"の値がどこを参照しているのか分かりませんでした。/var/root/Library/Preferences/.GlobalPreferences.plist を参照していると思ったのですが、ここを変更しても変わらず。というわけで、Macのログイン画面のここが気に入らない! をあげると、2点
- トラックパッドの速度が遅すぎる
- トラックパッドのクリックをタップにしたい
Terminalにて、
$sudo defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -int 1
とすれば、無線のトラックパッドは、次からログイン時に反映されてタップするだけでクリックになります。この設定は、/var/root/Library/Preferences/com.apple.driver.AppleBluetoothMultitouch.trackpad.plist にあるClickingに1が変更されます。iMacで使っていたトラックパッドではうまく言ったのですが、残念なことにMacBook Airのトラックパッドはタップが有効になりませんでした。もう少し調査しようかと思います…
ご存知の方がいたらご一報を。
MacでClozure CLを使ったGUIの作成 〜その1 サンプルを動かしてみよう〜
久々すぎて自分がどんなテンションで書いていたか忘れました。
唐突にMacintosh Common Lisp(MCL)について
Macintosh Common Lispは、Macで動くCommon Lispの実装です。2009年にオープンソースになって、Clozure CLが派生しました。MCLについては、『プログラミング言語Lisp入門からマルチメディアまで』をパラパラめくるとMacに特化されたトピック盛りだくさんで面白いのですが、当然、OS X Mountain Lionなんかでは動かないので歴史的資料みたいなことになってます。
Clozure CLでGUI
Macでアプリケーションを作りたいと思った場合は、Xcodeを使ってObjective-Cが一番楽だと思います。しかし、Common Lispで作ってみたいという思ったりするわけで、今回は、MCLの派生であるClozure CLに添付されたサンプルを使ってGUIを呼び出して喜んでみるのが目的です。ついでに、いちいちLispを使って呼び出すのは面倒なので、アプリ作成までやっていきたいと思います(Clozure CLのバージョンは1.9です)。
色々制限はあると思いますが。Common LispでGUIつきのMacのアプリを作成するには、多分これが一番楽だと思います。
Mac限定なのは、名目的に汎用性のあるCommonQtを使おうとしたけどClozure CLでは動かなかったし、QtのGUIが好きじゃなかったからです。
さっそく動かしてみる
今回はClozure CLに入っているexamplesの中のCurrencyConverterを動かしてみましょう。MacVimのSlimvで試したところですが、SilmeでもTerminalでもいいと思います。Clozure CL ver.1.9をHomebrewでいじらずに入れた場合は、/usr/local/Cellar/clozure-cl/1.9/ccl/examples/cocoa/currency-converter/にあります。
上のコード(2つのうち上)をccl64で実行すると、同じディレクトリにCurrencyConverter.appが作成されます。最後まで実行するとccl64は終了して60MB弱のファイルができます。
ちなみに、2番目であるccl::build-applicationのキーワードに「:directory #P"/Users/ユーザー名/Desktop/"」を追加したものを実行するとデスクトップに作成されます。
ccl::build-applicationのキーワードに、nibファイルというものをでてきましたが、アプリ画面の表示を設定するファイルでXcodeで作るものです。Xcodeでnibファイルを作成する場合、直接nibファイルを作成することはできないみたいなので、一度、xibファイルを作成して、それをエクスポートすることでnibファイルが作成できます。また、アプリのContentsを見ると、OpenMCLという単語が出てきますが、Clozure CLと同じものと受け取っていいみたいです。
CurrencyConverter.appを開いてみるとアプリが表示されます。22ドルを円換算(98.8924051)してみました。
解説が本家サイトのBuilding the Applicationにありますが、場所が違ったりして動かなかったり、(require :COCOA)がなかったりしますので注意してください。
cf. 5.6. The Application Builder
ロードしたcurrency-converter.lispの中身を見ると、objc:defmethodで、Objective-Cのmethodを#/に続ける形で定義しているのが分かります。ccl::build-applicationは、/usr/local/Cellar/clozure-cl/1.9/ccl/cocoa-ide/build-appcation.lispにあるので、これを眺めてもいいかもしれません。
cf. 14.6. Defining Objective-C Methods
問題点は、単純なアプリでも60MB弱あるということでしょうか。Objective-CとClozure CLとの連携がどのようになっているのかよくわかっていないので、今後、何か分かったらアップしたいと思います。Common LispファイルでObjective-Cの補完候補をどうやって出そうかな。