Emacs的;重复定义的自定义函数,如何使用dolist或其他方法

时间:2014-06-29 01:31:39

标签: emacs foreach elisp repeat

Emacs的书签很棒,浏览缓冲区列表也是如此。但是我觉得用更短的和弦直接到达我想去的地方是件好事。所以我为所有我喜欢的文件和文件夹累积了一组重复的函数和键绑定。

我想知道我是否可以使用dolist来处理这种重复性,但我不是一个优秀的程序员。

这是(七个和上升的)重复定义的函数之一,以及写下dolist以下的微弱尝试:

(defun jump-to-main ()
  (interactive)
  (find-file main))
(global-set-key (kbd "C-c m") 'jump-to-main)

这可能几乎没有资格作为伪代码:

(dolist (x '(("m" main)
             ("t" tech))
           (defun (concat 'jump-to- (cdr x)) ()
             (interactive)
             (find-file (cdr x)))
           (global-set-key (kbd (concat "C-c " (car x))) 
                           '(concat 'jump-to- (cdr x)))
           ))

优雅的初始化文件中的回报,以及我在解决Lisp问题时的速度...希望Stackoverflow可以拯救我。

赞赏其他策略和方法。

编辑:

根据法律清单的建议,我的问题可能会以下列方式减少并更加明确。我想减少以下一系列键绑定中的重复。

(global-set-key (kbd "C-c A") 
                (lambda () 
                  (interactive) 
                  (find-file fileA)))

(global-set-key (kbd "C-c B") 
                (lambda () 
                  (interactive) 
                  (find-file fileB)))

...

(global-set-key (kbd "C-c Z") 
                (lambda () 
                  (interactive) 
                  (find-file fileZ)))
例如,

fileK扩展为"~/fileK.txt"

编辑:

所以这是另一次尝试:

(dolist (x '(("m" main)
             ("t" tech))
           (global-set-key (kbd (concat "C-c " (car x)))           
                           (lambda ()
                             (interactive)
                             (find-file (cdr x))
                             ))))

键绑定部分似乎没问题,但是(find-file (cdr x))没有做我需要的,而且我无法用少量的谷歌搜索工具来修复它。

以下是我用来关注破碎部分的表达式:

(setq somefile "~/somefile.txt")
(setq x '("s" . somefile))
(concat "C-c " (car x))
(find-file (cdr x))

最后一行不起作用,因为(cdr x)显然评估为(main)。我尝试在eval中滑动以展开main变量,但似乎并不...

现在阅读菲尔的答案,这可能需要一段时间。

1 个答案:

答案 0 :(得分:1)

FWIW,你的伪代码的直接翻译是:

(defvar my-file-main (expand-file-name "~/main") "My main file")
(defvar my-file-tech (expand-file-name "~/tech") "My tech file")

(dolist (x '(("m" . my-file-main)
             ("t" . my-file-tech)))
  (let* ((sym (cdr x))
         (func (intern (concat "jump-to-" (symbol-name sym)))))
    (defalias func `(lambda ()
                      ,(format "Jump to file `%s'." (symbol-name sym))
                      (interactive)
                      (find-file ,sym)))
    (global-set-key (kbd (concat "C-c " (car x))) func)))