4

emacs 内からさまざまなプロジェクトにすばやくジャンプするためのヘルパー関数を定義しようとしています。次のようにマクロを定義することから始めました

(defmacro project-alias (name path)
  `(defun ,name ()
     (interactive)
     (cd ,path)))

そして、これはうまく機能し(project-alias foo "~/bar")ます。問題はありません。このマクロをタプルのリストに適用しようとすると、問題が発生します。

(setq projects '((foo . "~/foo")
                 (bar . "~/bar")))

(dolist (p projects)
  (project-alias (car p) (cdr p)))

上記のコードエラー

Debugger entered--Lisp error: (wrong-type-argument symbolp (car p))
  defalias((car p) (lambda nil (interactive) (cd (cdr p))))

最初の引数を文字列として渡し、internシンボル表現を喜びなく取得するために呼び出しを試みました。また、文字列形式を受け入れるようにマクロを定義しようとしましたが、それも機能しません

私は何を間違っていますか?

4

5 に答える 5

1

これは、マクロも評価も行わない別の方法です。

;; -*- lexical-binding:t -*-

(defun project-alias-f (name filename)
  (defalias name (lambda () (interactive) (cd filename)))

(dolist (p projects)
  (project-alias-f (car p) (cdr p)))
于 2013-11-06T21:25:26.807 に答える
1

あなたはどちらかを行うことができます

(defun project-alias-f (name path)
  (eval `(defun ,name ()
       (interactive)
       (cd ,path))))



(dolist (p projects)
  (project-alias-f (car p) (cdr p)))

また

(dolist (p projects)
  (eval `(project-alias ,(car p) ,(cdr p))))
于 2013-11-06T16:37:43.797 に答える
0

これはマクロの問題に対する答えではありませんが、プロジェクト間を移動したいというあなたの欲求に対する代替の解決策です。

私のinit.elファイルには、(とりわけ)

(set-register ?A '(file . "~/.aliases"))
(set-register ?E '(file . "~/.emacs.d/init.el"))
(set-register ?H '(file . "~/.hgrc"))
(set-register ?T '(file . "~/.TODO.org"))

次に、ファイルを編集したいとき (またはリストにないプロジェクトの 1 つを操作したいとき) に、jump-to-register( ) を使用してこれらのファイルの 1 つにジャンプできます。C-x r jファイル/フォルダーは (ウィンドウ構成ではなく) レジスターに格納されるため、emacs はレジスターで見つけたファイルまたはフォルダーを開きます。

于 2013-11-06T15:10:57.717 に答える