でらうま倶楽部

バカってゆうか、ゲームを作る事しか能の無いプログラマの、面白おかしな日々を綴ってみる実験。

マクロ

[emacs] grepバッファをさらに便利にする小粒なマクロ

photo
こんにちは!!

暑っいねー。今日もコード書いとる??

emacs の grep (M-x rgrep と M-x lgrep) が超便利!! 超便利…なのですが、いったんgrepした後、grepバッファを見失ってしまう事が多かったので、自分でlisp書いてみた。
 
(defun my-switch-grep-buffer()
  "grepバッファに切り替える"
  (interactive)
	(if (get-buffer "*grep*")
			(pop-to-buffer "*grep*")
		(message "No grep buffer")))

こんだけw

grepバッファがあればそれをpop-upして、無ければ「無いよ〜」って表示するだけの超単純なプログラムなのですが、なかなかこれがどうして。キーバインド一発でgrepバッファがpop-upするのはかなり便利。これ…実は標準であったり…しないよね…??(汗)

grepバッファを全画面で使うのがお好みでしたら、pop-to-bufferをswitch-to-bufferに変えてみてちょ!!

ではまた次回!!

Emacs23 カーソル位置の単語をいきなりisearch…とか。

photo
先月Emacs22.3から乗りかえたEmacs23.3ですがかなり慣れました。ので、前回の続きで色々知った事や判った事をブログに書いときます。

ではダイジェストでお楽しみください。

OSX版Emacs23.3で、org-modeの挙動が微妙なのは、以下の設定をinit.elに追加したら直りました。やっぱマウス要らないw
(defun org-agenda-mode-hooks()
  (local-unset-key [mouse-2])
  (local-unset-key [mouse-3]))
(add-hook 'org-agenda-mode-hook 'org-agenda-mode-hooks)

(defun org-mode-hooks()
  (local-unset-key [mouse-2])
  (local-unset-key [mouse-3]))
(add-hook 'org-mode-hook 'org-mode-hooks)

Windowsは諸々文字コードはSJISかと思ってましたが、厳密にはSJISを拡張したCP932だそうで…。のでファイル名の文字コードはその設定に変更。これで「~」とかの文字化けが直った…ような。
(setq file-name-coding-system 'cp932)

ついでに、デフォルトの文字コードはUTF-8でも、新規ファイル作成の時だけ文字コードをCP932にするようなマクロも書いた。
自分、Windowsでプログラムを書く場合にUTF-8やEUC-JPにできない故の特殊仕様^^;
(defun my-find-file ()
  "新規ファイル作成時だけcp932-unix"
  (interactive)
  (and (not buffer-read-only)
       (or (eq this-command 'auto-insert)
           (and (bobp) (eobp)))
       (set-buffer-file-coding-system 'cp932-unix nil t)))
(add-hook 'find-file-hook 'my-find-file)

OSXのファイルの文字コードはUTF-8とビミョーに違うくて、Shellでlsした時にファイル名が化ける。みんな無茶しやがって…!これはこんな感じに設定すれば回避できる。
(defun mac-shell-mode-hooks()
  (set-buffer-process-coding-system 'utf-8-nfd 'utf-8-nfd))
(add-hook 'shell-mode-hook 'mac-shell-mode-hooks)

他の人の書いたelispや内蔵elispが何かの弾みで動かなくなった場合、エラー箇所を特定するのは(自分的に)難しい。
でもこうすると実行中のelispでエラーが発生した時にバックトレースできる。
(setq debug-on-error t)

今更ながら、割と初心者向きなgrepを発見。grepの難しいコマンドを覚えなくても対話的に入力するだけでgrep。

lgrep …カレントディレクトリでgrep
rgrep …カレントディレクトリ以下のディレクトリ全てでgrep

ただしWindowsだと初期設定状態の動作が微妙なので、以下のように再設定。ありえるえりあの記事に多謝。いつもお世話になっています^^;
(setq grep-host-defaults-alist nil) ;; これはおまじないだと思ってください
(setq grep-template "grep -nH <C> <R> <F>")
(setq grep-find-template "find . <X> -type f <F> -exec grep -nH <C> <R> '{}' +")
(setq grep-find-ignored-files nil)

去年あたりに書いたカーソル位置の単語をisearchをすっきり手直し。
範囲選択中なら、その文字列でいきなしisearch-forwordします。これ便利ですよ。自画自賛。
(defun my-isearch-get-word()
  "カーソル位置の単語をisearch"
  (interactive)
  (if(not isearch-mode)
      (progn
        (call-interactively 'isearch-forward)
        (let ((string
               (if (and transient-mark-mode mark-active)
                   (buffer-substring (region-beginning) (region-end))
                 (thing-at-point 'symbol))))
          (deactivate-mark)
          (isearch-yank-string string)))))

自分的にはisearch中でもC-gで問答無用にisearchを抜けて欲しいのでそう設定。
(define-key isearch-mode-map "\C-g" 'isearch-cancel)

EmacsいいよねEmacs。

ではまた次回!

[Emacs]スクラッチバッファを自動保存したり行末コメントをまとめて削除したりな小粒マクロ集

久々Emacsネタです。

普段使いで「欲しいな」と思った機能をネットで見つけたり自作したり。稚拙だとは思いつつも再び記事にしてみました。

今回は3つほど。どれも非常に限定かつマニアックな内容ですが、興味のある人は5分ほどお時間を頂ければ幸いでっす。


1. スクラッチバッファを保存する

メモ帳的に使えて便利なスクラッチバッファ。URLメモやら引用テキストメモやらマクロの実験やらと大活躍!でもうっかりEmacsを終了してしまって痛い目を見た人も多いと思います。…私もかなり痛い目みました。

ので、「終了時に保存→起動時に自動的に読み込み」するマクロを探してみたら…ありました!こんな感じ。

;;; auto save and restore scratch buffer
(defun save-scratch-data ()
  (let ((str (progn
               (set-buffer (get-buffer "*scratch*"))
               (buffer-substring-no-properties
                (point-min) (point-max))))
        (file "~/.emacs.d/.scratch"))
    (if (get-file-buffer (expand-file-name file))
        (setq buf (get-file-buffer (expand-file-name file)))
      (setq buf (find-file-noselect file)))
    (set-buffer buf)
    (erase-buffer)
    (insert str)
    (save-buffer)
    (kill-buffer buf)))

(defadvice save-buffers-kill-emacs
  (before save-scratch-buffer activate)
  (save-scratch-data))

(defun read-scratch-data ()
  (let ((file "~/.emacs.d/.scratch"))
    (when (file-exists-p file)
      (set-buffer (get-buffer "*scratch*"))
      (erase-buffer)
      (insert-file-contents file))
    ))


(read-scratch-data)    ;; ←これは初期設定ファイルの最後に追加

すっげぇ!これを考えた人は神。コードを読めば確かにそう実装すればいい事はわかるんだけど…それをゼロから考えるまでには至ってないなぁ。

そうそう、上のマクロでは保存用のファイルは「~/.emacs.d/.scratch」になってます。これは各自の環境に合わせて変更してちょ。


2. スクラッチバッファ以外をキル

事務所で作業してる時のバッファ構成を覚えておくのに、こちらのrevive.elを利用しています。これを「自分のタイミングで呼び出してバッファ内容を保存→自分のタイミングで復元」的な。で、これまでは「バッファ内容を保存→全バッファ破棄」というマクロを自作してましたが、上で紹介したマクロに対応させるため「バッファ内容を保存→スクラッチバッファ以外のバッファを破棄」に変更しました。まあこんな感の簡単なマクロです。

(defun my-kill-all-buffers ()
  "scratch bufferを除く全てのバッファをkillして、復元情報を作成"
  (interactive)
  (save-current-configuration)
  (dolist (buf (buffer-list))
    (if(not (string= "*scratch*" (buffer-name buf))) (kill-buffer buf))))

revive.elはバッファの分割状態まで保存→復帰してくれてホント便利なマクロです。普段ノートパソコンを使っていると作業場所に応じてファイルを開いたりしてメンドーだったのですが、それが一気に解消。また複数の状態を保存できるので、仕事、趣味、マクロ開発など、幾つかの状態を保存しておいてショートカット一発で切り替えられる環境はもっと広まって欲しい。


3. 行末コメント削除(リージョン対応版)

コードを書いてる時に、行末コメントをまとめて消したい状況があったりします。まあ主に人の書いたコードをコピペした時なんですが。で、範囲選択してcomment-kill …なんも反応なし。みたいな。ええー!comment-dwimは範囲指定対応してるのにー。という訳で自力で調べてマクロを書いたのがコチラ。

(defun my-comment-kill(arg)
  "コメント削除(リージョン対応)"
  (interactive "p")
  (if mark-active
      (let ((start (region-beginning)) (end (region-end)))
        (if (> (point) (mark))
              (goto-char (mark)))
        (comment-kill (count-lines start end))
        (if (= (point) (mark))
              (goto-char start))
        (deactivate-mark))
    (comment-kill arg)))

あぁ…そうそうこんな感じ。とりあえず気分が落ち着きました(笑)


気づけばinit.elも1200行を超えて順調に育っております(*^_^*)

日々の使用で「これ欲しいなぁ」とか「ちょっと振る舞いを変えたいんだけど…」という要求が、(ちょっと頑張れば)実現可能だというのがEmacs。プログラム開発向けに便利な統合環境も数多く存在する中、当分手放せそうにありません(笑)

Emacs ゲームプログラマなら必須。操作性と機能を両立させたポケット電卓

phoo1詳しい人には当たり前すぎる話だけど、Emacs にも電卓機能があります。

M-x calc
で起動するんだけど…これが、Emacsらしいというか操作感が独特というか多機能すぎるというか。どーにも部長的には使い辛い。なんか、F-1マシンでコンビニにポテチ買い物に行く感じ。

なんかこう…もっとシンプルでいいんだって!普段使ってる電卓的な。

という訳であらためてグーグルせんせに聞いてみた。
ら、こちらのサイトで素晴らしい機能を発見!

M-x calculator
で起動する電卓機能。
まさに、電卓をEmacsで実現しちゃいました~的な。
入力方法とか、マジまんま電卓(笑)

でもなにげに三角関数とか16進数モードとか、プログラマ的に欲しい機能は全部入ってる。でもあくまで操作感はポケット電卓そのもの。
操作に困ったらいつでも「?」でヘルプ画面。これがまたシンプルでよい。

やればできるじゃん!Emacs!!

電卓ソフトに切り替えたり机の上の電卓に手を伸ばしたりする事無く、全てをEmacs内で完結できるなんて素晴らしすぎるぜ。


ちなみに写真のは部長の電卓じゃないっす。こんな電卓欲しいよね~と思って。

Emacs カスタマイズ10番勝負!的な

photo1NTEmacs23.1や、NTEmacs23.1.94が配布されとるね。日本語をインライン入力できるようにパッチを当てた有志の方々にはホント、頭が下がりっぱなしです。

Emacs22.3のWindows版公式ビルドだと日本語がインライン入力できなくて若干不便な思いをしとって、自分でパッチ当てたの使っとるんだけど、次期Emacs(23.2)だと、どうやらWindows版も標準でインライン入力が可能な模様。これでWindows版の普及にますますはずみがつくといいね。


んで、標準機能でついてるカスタマイズ機能。
M-x customize
で、ほぼ全ての機能の振る舞いを設定できるんだけど、目的のカスタマイズを探すのがえらいしんどくてそんなに使ってなかったんだけど…やっぱりちゃんと存在してました。

M-x customize-group
実行すると、グループ名の入力を求められるので、re-builderとかorgとか入力すると、そのカスタマイズ機能が一発で表示される。今までの苦労はなんだったんだ!ってくらい便利。

ちなみに
M-x customize-apropos
で、入力した文字列に引っ掛かる項目をバラバラっと表示してくれるよ。

それぞれ適当にキーバインドを割り当てとくと幸せになれそうな予感。


そうそう、Emacs23~ではview-mode関連がautoloadに変更されてるっぽくて、初期状態だと変数が存在しない。
ので、前回紹介した方法でキーバインドを変更しようとすると怒られるー!

これは以下のようにhookにすれば解決。

(defun view-mode-hooks()
  (define-key view-mode-map "q" 'my-quit-view-buffer))
(add-hook 'view-mode-hook 'view-mode-hooks)


式の評価を行うマクロ(eval-~)。いつもどれを使えばいいか迷ってたので、状況から一番最適なマクロを選んで実行するマクロを作った。

(defun my-eval-buffer(arg)
  "式を評価\n\n・リージョンが有効なら eval-region\n・文末なら evanl-buffer\n・行末なら eval-last-sexp\n・それ以外は eval-defun\nを実行"
  (interactive "P")
  (cond (mark-active (eval-region (region-beginning) (region-end)))
        ((eobp) (eval-buffer))
        ((eolp) (eval-last-sexp arg))
        (t (eval-defun arg))))


一発でスクラッチバッファを表示するマクロ。なんか、ちょくちょく出番があるんだよね。

(defun my-switch-scratch-buffer()
  "スクラッチバッファに切り替える"
  (interactive)
  (switch-to-buffer "*scratch*"))


つぃでに、あんまし使わないだろうとは思ったんだけど、re-builderのsyntaxをトグルするマクロ。
C-c C-t に割り当ててみたら、これがいがいと便利。

(defun my-toggle-syntax()
  "syntaxをreadとstringでトグル"
  (interactive)
  (let ((syntax (if (eq reb-re-syntax 'string) 'read 'string)))
    (reb-change-syntax syntax)))


こうして細かいマクロが積み上がり、気づけばinit.elは1000行越え。なのに、今度はanythingに手を出しかねない勢い(笑)
だって、便利そーなんだよね。

Emacs 便利なisearchにもうひと工夫。さらに便利になる小技は如何?

photo1前回の続きで、isearch中に検索文字列を消去したり、単語単位で削除したりできたら便利?と思ってマクロを書いてみました。

(define-key isearch-mode-map "C-q" 'my-isearch-backword)
(defun my-isearch-backword()
  "isearch中の先方単語削除"
  (interactive)
  (let ((len (length isearch-string)))
    (if (= 0 len)
        (ding)
      (setq isearch-string (replace-regexp-in-string "\\w+$" "" isearch-string))
      (if (= len (length isearch-string))
          (setq isearch-string (replace-regexp-in-string "\\W+$" "" isearch-string)))
      (setq isearch-message (mapconcat 'isearch-text-char-description isearch-string ""))))
  (if isearch-other-end (goto-char isearch-other-end))
  (isearch-search)
  (isearch-push-state)
  (isearch-update))

(define-key isearch-mode-map "C-w" 'my-isearch-clear)
(defun my-isearch-clear()
  "isearch文字列の消去"
  (interactive)
  (setq isearch-string "")
  (setq isearch-message (mapconcat 'isearch-text-char-description isearch-string ""))
  (if isearch-other-end (goto-char isearch-other-end))
  (isearch-search)
  (isearch-push-state)
  (isearch-update))


Emacsに標準添付の isearch.el を参考にしました。
相変わらずキーバインドだけは変態仕様なので(笑)、適時読み変えて頂ければ。

細かい事だけど、なにげにキー入力の回数が減っていい感じ!
(でも標準機能でフォローされてたら恥ずかしい…)

Emacsのインクリメンタルサーチをさらに加速するプチマクロ

logo

ここに書いたったhack。
これを思い付いた人は、かなりのEmacs通だね。

で、ちょこっと直しつつありがたく使わせてもらいなす。

リージョンがあればその文字列、なければカーソル位置の単語をいきなりisearchするマクロ。ブログをいつも読んでくれてる人なら、パッと見て処理内容が把握できる規模なんじゃないかな。


(global-set-key (kbd "C-\\") 'my-isearch-get-word)
(defun my-isearch-get-word()
  "カーソル位置の単語をisearch"
  (interactive)
  (if(not isearch-mode)
      (call-interactively 'isearch-forward)))

(defun my-isearch-get-word-hook()
  (when (equal this-command 'my-isearch-get-word)
    (let ((string
           (if (and transient-mark-mode mark-active)
               (buffer-substring (region-beginning) (region-end))
             (thing-at-point 'symbol))))
      (deactivate-mark)
      (setq isearch-string string
            isearch-message
            (concat isearch-message
                    (mapconcat 'isearch-text-char-description
                               string ""))
            isearch-yank-flag t)
      (isearch-search-and-update))))
(add-hook 'isearch-mode-hook 'my-isearch-get-word-hook)


Emacs-lisp的なロジックとはかけ離れているであろう記述はご愛敬。
でも超便利。なんでこの機能がEmacs標準に無いのかが不思議。

っていうか、あるのに気づいてない…?

キーバインドが C-\ なのは、Vzからの名残。お好きに変更してちょ。


オマケ
特定モードのキーバインドを無効にする簡単な書き方~。

(define-key isearch-mode-map (kbd "\C-\\") nil)
記事検索
電子書籍発売中

「チュートリアル形式で始めるOpenAL」
サウンド怖くない。C++による8つのチュートリアルで始めるOpenALプログラミング。さああなたも、自作アプリに魅力的な音効を添えてみませんか??
⇒Kindle版 ⇒iBooks版


「iPhoneアプリ『ういろう』のレシピ」
ゲームってどうやって作ってるの?? 拙アプリ『ういろう』の製作過程を本にまとめました。もちろんソースコードつき
⇒Kindle版 ⇒iBooks版


『チュートリアル形式で始めるOpenGL[2D編]』
OpenGL怖くない。C++による16のチュートリアルで始めるOpenGLプログラミング[2D編]。さああなたも、ゲーム作りを始めてみませんか?
⇒Kindle版 ⇒iBooks版
自作ゲーム配信中

『Puzzle & Monarch』
「君主候補となって国作り!! ただし制限時間は90秒。」森を作って道をつないで...あなただけの国を作ってみませんか??
⇒AppStore


『BRICK & TRIP』
咄嗟の判断に、あなたの指先はついてこれるか?! 爽快フリックアクション!! 様々な難関をくぐり抜けて旅の終着点を目指そう!!
⇒AppStore


『ういろう』
名古屋土産ういろうがiPhoneで大活躍?! 白ういろうを守れるのはあなただけ。ひゅーん、ぼよよーん!!
⇒AppStore ⇒LITE版


『こなへん』
ヒマラヤ山脈、大西洋、世界で一番深い湖… それって地球のどこにあるのか知ってるかな?『全方位直感地理クイズ』という新ジャンルに挑戦!あ、それ。地球をくーるくるw
⇒AppStore ⇒LITE版


『GEOSPOT』
ヒマラヤ山脈、大西洋、世界で一番深い湖… それって地球のどこにあるのか知ってるかな?『全方位直感地理クイズ』という新ジャンルに挑戦!あ、それ。地球をくーるくるw
⇒Windows ⇒Mac


『TieGunner』
マウス片手に大宇宙へ飛び立とう!『しっぽシューティング』というジャンルを作って頂きました^^; WinでもMacでも動きます。ソースもあるでよw
⇒Windows ⇒Mac
QRコード
QRコード
  • ライブドアブログ