【问题标题】:How can I configure so that I can define multiple actions in cperl-mode-hook in .emacs?如何配置以便我可以在 .emacs 中的 cperl-mode-hook 中定义多个操作?
【发布时间】:2014-07-26 14:10:37
【问题描述】:

这是我的 .emacs 的摘录

CASE 1:使用下面的配置,perl-completion 模式可以完美运行。

;;-------------------------------------------------------
;; -*-- CPerl mode
;;-------------------------------------------------------

(defalias 'perl-mode 'cperl-mode)
(add-to-list 'auto-mode-alist '("\\.[apP][Llm]$" . cperl-mode))
(add-to-list 'auto-mode-alist '("\\.al$" . cperl-mode))
(add-to-list 'auto-mode-alist '("\\.t$" . cperl-mode))
(add-to-list 'interpreter-mode-alist '("perl" . cperl-mode))

(defun my-cperl-hook-func()
  (add-to-list 'load-path "~/.emacs.d/elpa/perl-completion-20090527.2336")
  (require 'perl-completion)
  (perl-completion-mode t)
  ;; (make-local-variable 'compile-command)
  ;;  (setq compile-command
  ;;        (concat "perl " (buffer-file-name)))
  ;;  (cperl-define-key "\C-c\C-c" 'compile)
  )

(add-hook 'cperl-mode-hook 'my-cperl-hook-func)

CASE 2:使用下面的配置,在 cperl-mode 下 C-c C-c 将成功启动 perl 编译。

;;-------------------------------------------------------
;; -*-- CPerl mode
;;-------------------------------------------------------
(defalias 'perl-mode 'cperl-mode)

(add-to-list 'auto-mode-alist '("\\.[apP][Llm]$" . cperl-mode))
(add-to-list 'auto-mode-alist '("\\.al$" . cperl-mode))
(add-to-list 'auto-mode-alist '("\\.t$" . cperl-mode))
(add-to-list 'interpreter-mode-alist '("perl" . cperl-mode))

(defun my-cperl-hook-func()
  ;; (add-to-list 'load-path "~/.emacs.d/elpa/perl-completion-20090527.2336")
  ;; (require 'perl-completion)
  ;; (perl-completion-mode t)
  (make-local-variable 'compile-command)
  (setq compile-command
        (concat "perl " (buffer-file-name)))
  (cperl-define-key "\C-c\C-c" 'compile)
  )

(add-hook 'cperl-mode-hook 'my-cperl-hook-func)

案例 3:但是,下面的代码通过取消注释钩子函数 (my-cperl-hook-func) 中的所有行来启用 perl 完成和 C-c C-c 来启动 perl 编译,它只是以perl-completion 可以正常工作,而 C-c C-c 根本不起作用(emacs 说 C-c C-c 未定义。)

如何在 cperl-mode-hook 中使这两个操作都有效?

;;-------------------------------------------------------
;; -*-- CPerl mode
;;-------------------------------------------------------
(defalias 'perl-mode 'cperl-mode)

(add-to-list 'auto-mode-alist '("\\.[apP][Llm]$" . cperl-mode))
(add-to-list 'auto-mode-alist '("\\.al$" . cperl-mode))
(add-to-list 'auto-mode-alist '("\\.t$" . cperl-mode))
(add-to-list 'interpreter-mode-alist '("perl" . cperl-mode))

(defun my-cperl-hook-func()
  (add-to-list 'load-path "~/.emacs.d/elpa/perl-completion-20090527.2336")
  (require 'perl-completion)
  (perl-completion-mode t)    
  (make-local-variable 'compile-command)
   (setq compile-command
         (concat "perl " (buffer-file-name)))
   (cperl-define-key "\C-c\C-c" 'compile)
  )

(add-hook 'cperl-mode-hook 'my-cperl-hook-func)

【问题讨论】:

    标签: emacs cperl-mode


    【解决方案1】:

    首先,如果你使用elpa和包系统安装perl-completion,它会自动添加到加载路径,所以add-to-list load-path是不必要的。不幸的是,该软件包不包含perl-completion-mode 的自动加载功能,因此(require 'perl-completion) 是必需的。

    在检查http://www.emacswiki.org/emacs/perl-completion.elperl-completion 库后,它似乎使用C-c C-c 作为前缀。不幸的是,通过使用它作为前缀,它破坏了在perl-mode 中为compile 绑定C-c C-c 的能力。

    我使用以下内容对此进行了测试,并将编译绑定到C-c C-c c

    (require 'package)
    (add-to-list 'package-archives
      '("melpa" . "http://melpa.milkbox.net/packages/") t)
    
    (package-initialize)
    
    (package-refresh-contents)
    (package-install 'anything)
    (package-install 'perl-completion)
    
    ;;-------------------------------------------------------
    ;; -*-- CPerl mode
    ;;-------------------------------------------------------
    
    (defalias 'perl-mode 'cperl-mode)
    
    (add-to-list 'auto-mode-alist '("\\.[apP][Llm]$" . cperl-mode))
    (add-to-list 'auto-mode-alist '("\\.al$" . cperl-mode))
    (add-to-list 'auto-mode-alist '("\\.t$" . cperl-mode))
    (add-to-list 'interpreter-mode-alist '("perl" . cperl-mode))
    
    (defun my-cperl-hook-func()
      (require 'perl-completion)
      (perl-completion-mode t)
      (make-local-variable 'compile-command)
       (setq compile-command
             (concat "perl " (buffer-file-name)))
       (cperl-define-key "\C-c\C-cc" 'compile)
      )
    
    (add-hook 'cperl-mode-hook 'my-cperl-hook-func)
    

    保存为cperl-init.el,并使用emacs -q -l cperl-init.el在没有其他包的情况下运行。

    如果您想使用C-c C-c 进行编译,我认为您必须取消绑定它在 perl-completion 中的使用。看起来 cperl 本身与 mode-compile 有一些兼容性,但不确定它是否添加了任何绑定。

    【讨论】:

    • 嗨,dgtized,感谢您的回答。我已经尝试用我的 vanilla emacs 加载你的“cperl-init.el”,它对我来说工作得很好,正如预期的那样,使用 C-c C-c c 启动 perl 编译。凉爽的!我真的很感激。
    猜你喜欢
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    相关资源
    最近更新 更多