>> 古い記事: (solved) zipruby: symbol lookup error
<< 新しい記事: 対訳: Lingro: オープンな翻訳とオープン・コンテンツの利用

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Emacs メモ

適当なメモ。

.emacs


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; リージョンがアクティブな場合: 選択した文字列(正規表現)をハイライト
;; リージョンがアクティブでない場合: ハイライトを取り消し
(defvar my-highlight-pattern nil)
(defun my-highlight ()
  "選択した文字列をハイライト"
  (interactive)
  (if mark-active
      ;; 選択範囲の文字列をハイライト
      (progn
        (if my-highlight-pattern
            (unhighlight-regexp my-highlight-pattern))
        (setq my-highlight-pattern
              (buffer-substring (region-beginning) (region-end)))
        (highlight-regexp my-highlight-pattern)
        (deactivate-mark)
        )
    ;; ハイライトを解除
    (unhighlight-regexp my-highlight-pattern)))
(global-set-key (kbd "C-<f3>") 'my-highlight)

(global-set-key (kbd "<f3>")
  '(lambda () (interactive)
  (forward-char 1)
  (search-forward my-highlight-pattern nil t)
  (search-backward my-highlight-pattern nil t)))
(global-set-key (kbd "S-<f3>")
    '(lambda () (interactive)
    (search-backward my-highlight-pattern nil t)))


■ 括弧に色を付ける

→ 横着プログラミング 第10回: scmail: Scheme によるメールフィルタ


■ エンコーディングを指定して開き直す

* 今開いているファイルを一旦閉じる
* C-x RET c <エンコーディングを指定>
  <エンコーディングを指定>のとこは utf-8-unix など
  または C-x RET c の代わりに universal-coding-system-argument
* C-x C-f で開き直す。

■ shell-mode のエンコーディングを変更する

set-buffer-process-coding-system
C-x RET p
Windows の場合 sjis を指定


■ カーソル位置の単語を検索

単語の先頭にカーソルを置いて C-s C-w [C-w ...] C-s
C-r でも同じ。

ファイル開く・別名で保存をダイアログで

Windows XP 用。


// file-select-dialog.js
var dialog = WScript.CreateObject("UserAccounts.CommonDialog");

dialog.Filter = "All Files|*.*";
dialog.InitialDir = ".";

if (!dialog.ShowOpen()) {
  WScript.Quit();
}

WScript.Echo( dialog.FileName.replace( /\\/g, "/" ) );

(defun select-file-using-dialog-and-apply (proc)
  (labels
      ((select-file
        ()
        (with-temp-buffer
          "*select-file-using-dialog-temp*"
          (call-process "C:/windows/system32/cscript.exe"
                        nil t nil
                        "//Nologo"
                        "C:/foo/file-select-dialog.js") ; パスを修正してください
          (if (= (point) 1)
              nil                   ; ファイル選択をキャンセルした場合
            (progn (backward-delete-char 1)
                   (buffer-string))))))
    (let ((filename (select-file)))
      (if filename
          (funcall proc filename)
        (message "canceld")))))

(define-key global-map (kbd "C-c C-f")
  (lambda () (interactive)
    (select-file-using-dialog-and-apply 'find-file)))

(define-key global-map (kbd "C-c C-w")
  (lambda () (interactive)
    (select-file-using-dialog-and-apply 'write-file)))

もっと早く知ってれば良かったシリーズ/脱初心者向け?

■ apropos

困ったら apropos。
「ある操作を実行するにはどのキーバインドを使えばいいか」
が知りたい場合もとりあえずこれで。


■ M-x help-for-help RET k (任意のキーストローク)
または F1 k (任意のキーストローク)

あるキーストロークがどの関数に対応しているか調べる。

たとえば「C-x r t」だったら、
F1 k C-x r t と入力すると string-rectangle が対応していると分かる。

F1 k 自体を調べると、describe-key だということが分かる。

動作単位にそれぞれ関数名が対応しているというのが地味に嬉しくて、
たとえばウェブ検索のときに助かったりする(それだけではありませんが……)。

逆に関数名からキーストロークを知りたい場合は apropos-command 
または F1 w <コマンド名> RET 。


■ re-builder

「この正規表現でちゃんとマッチするのか?」といった場合の確認用。
一時的に特定単語をハイライトさせて目立たせたいという場合にも使えるが、
そういう目的なら hi-lock がおすすめ。


■ occor

color-moccur の方が良かったりするけど、occur は標準で使えるので
まず occur を使ってみるといいのでは。


■ shell-command (M-!)

シェルでコマンドを実行。 C-u M-! とするとコマンドの出力を
カーソル位置に挿入できる。

Emacs Lisp メモ


(defun dirname (path)
  (replace-regexp-in-string "/[^/]+?$" "" path))

(dirname "~/foo/bar/baz.txt") => "~/foo/bar"


;; ファイルの各行を要素とするリストを得る
(with-temp-buffer
    (insert-file-contents-literally "foo.txt")

    ;; 行頭・行末の空白を削除
    (beginning-of-buffer)
    (replace-regexp "^ +" "")
    (beginning-of-buffer)
    (replace-regexp " +$" "")

    ;; 空行は除外
    (remove-if (lambda (line) (= (length line) 0))
               (split-string (buffer-string) "\n")))


;; ウィンドウをpopして何かを表示させ、元のウィンドウに戻る
;; (開いたウィンドウに移動しない)
(setq buf (get-buffer-create "foo"))
(save-selected-window
  (pop-to-buffer buf)
  ;; (current-buffer) ;=> "foo"
  (insert "Here is buffer foo.") ; 開いたバッファをカレントバッファにして処理
  )

JavaScript との対応

pop, push, shift, unshift


var x = [1, 2, 3];
var shifted = x.shift();
// x => [2, 3]
// shifted => 1
x.unshift(11);
// x => [11, 2, 3]

(setq x '(1 2 3))
(setq shifted (car x))
(setq x (cdr x))
x ;=> (2 3)
shifted ;=> 1
(setq x (cons 11 x))
x ;=> (11 2 3)

var x = [1, 2, 3];
var poped = x.pop();
// x => [1, 2]
// poped => 3
x.push(4);
// x => [1, 2, 4]

;; こういうのはたぶん良くない方法です。。。

(defun push (elem list)
  (setq list (reverse (cons elem (reverse list)))))
(defun pop (list)
  (let ((poped (car (reverse list))))
    (setq list (reverse (cdr (reverse list))))
    (list poped list)))

(setq x '(1 2 3))
(let ((result (pop x)))
  (setq poped (car result))
  (setq x (cadr result)))
x ;=> (1 2)
poped ;;=> 3
(setq x (push 4 x))
x ;=> (1 2 4)

見ての通り、Emacs Lisp では shift, unshift に対応する処理は簡単で自然である一方、 pop, push に対応する処理は煩雑ですごく不自然です。

(require 'cl) すると Emacs Lisp でも pop, push が使えるのですが、 名前に反して(?) JavaScript での shift, unshift のような動作をします。

これはそもそもの言語の特性によるものなので、 そういうものだと思って扱う方が良さそうです。 移植したい場合はちょっと困りそうですが。

オブジェクト / 連想配列(alist)


x = { a: 11, b: 22 };
x["a"]; //=> 11
x["a"] = 33;
x["a"]; //=> 33

(setq x '(("a" . 11)
          ("b" . 22)))
(assoc-default "a" x) ;=> 11
(setcdr (assoc "a" x) 33)
(assoc-default "a" x) ;=> 33

setTimeout, setInterval


var timer1 = setTimeout(func, 1000);
clearTimeout(timer1);

var timer2 = setInterval(func, 1000);
clearInterval(timer2);

(setq timer1 (run-with-timer 1 nil 'func))
(cancel-timer timer1)

(setq timer2 (run-with-timer 1 1 'func))
(cancel-timer timer2)

;; (run-with-timer secs repeat func)
;; repeat が nil: 一度だけ呼び出す
;; repeat が 数:  repeat 秒ごとに呼び出す

;; キー入力などによる割り込みでタイマーがリセットされる
;; run-with-idle-timer もある。
;; repeat が nil:      run-with-idle-timer を評価した後に一度だけ func を実行
;; repeat が non-nil:  キー入力などがされるたびに一度だけ func を実行

lambda, 無名関数


var func = function(arg){ alert(arg); };
func; //=> function() (関数オブジェクト)
func(123); // 関数を実行

// setTimeout( func(123), 1000 );
// これではだめ。func(123) を実行した結果が setTimeout に渡されている。

setTimeout( function(){ func(123); }, 1000 );

(setq func (lambda (arg) (print arg)))
func ;=> (lambda arg (print arg))
(funcall func 123) ; 関数を実行

;; (run-with-timer 1 nil (funcall func 123))
;; これではだめ。(funcall func 123) を実行した結果が run-with-timer に渡されている。

(run-with-timer 1
                nil
                (lambda () (funcall func 123)))

参考書籍

とりあえず目を通しておくと良いもの、 または分からない・忘れたときに調べるのに引っ張り出す本など。


逆引き、便利機能紹介。 anything.el の解説に 2章(使い方+拡張の書き方など)を割いている。

Emacsテクニックバイブル ~作業効率をカイゼンする200の技~
Emacsテクニックバイブル ~作業効率をカイゼンする200の技~るびきち

技術評論社 2010-08-03
売り上げランキング : 410


Amazonで詳しく見る
by G-Tools

必要なことが一通り載っていてレイアウトも見やすいです。

Emacs 辞典 (DESKTOP REFERENCE)
Emacs 辞典 (DESKTOP REFERENCE)
翔泳社 2006-05-11
売り上げランキング : 336422

おすすめ平均 star
star索引がないのが致命的
starEmacs自由自在(への第一歩)

Amazonで詳しく見る
by G-Tools

おすすめ。 自分はこれを読んで「あー、Emacs Lisp ってこういう風に使うんだ」みたいなとっかかりがつかめた気がします。 メジャーモードの書き方など。 10年近く前の本ですが、内容はほとんどそのまま今(2010年現在)でも通用すると思います。

やさしいEmacs‐Lisp講座
やさしいEmacs‐Lisp講座
カットシステム 1999-01
売り上げランキング : 287067

おすすめ平均 star
star実践的な本

Amazonで詳しく見る
by G-Tools
索引(一部):
call-process  167
current-window-configuration  190
hook  188
interactive  14
process-exit-status  172
process-send-string  173
save-window-excursion  190
set-process-filter  175
set-process-sentinel  171
set-window-configuration  190
start-process  169
フック  188

Emacs を「使う」だけではなく、積極的に Emacs Lisp を書きたい人向け。 ですが、一旦「作る」側に回ると見えてくるものも多いので 「使う専」の人も機会があれば目を通しておくと役立つかも。

GNU Emacs拡張ガイド―Emacs Lispプログラミング
GNU Emacs拡張ガイド―Emacs Lispプログラミングボブ グリックステイン Bob Glickstein

オライリー・ジャパン 1998-12
売り上げランキング : 283055


Amazonで詳しく見る
by G-Tools
索引(一部):
call-process  189
defvar  41
make-keymap  146
make-sparse-keymap  146
process-connection-type  197
start-process  193

その他

あるモードを派生させて新しいモードを作る
define-derived-mode

関連記事

参考(外部リンク)

>> 古い記事: (solved) zipruby: symbol lookup error
<< 新しい記事: 対訳: Lingro: オープンな翻訳とオープン・コンテンツの利用
** ホームに戻る

コメント

コメントの投稿

管理者にだけ表示を許可する

|
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。