如何配置才能在.emacs中的perl-mode-hook中定义多个操作?



这是我的。emacs的摘录

案例1:使用下面的配置,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-cC-c" 'compile)
  )
(add-hook 'cperl-mode-hook 'my-cperl-hook-func)

案例2:使用下面的配置,C-c - C-c在perl模式下将成功启动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-cC-c" 'compile)
  )
(add-hook 'cperl-mode-hook 'my-cperl-hook-func)

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

如何在perl-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-cC-c" 'compile)
  )
(add-hook 'cperl-mode-hook 'my-cperl-hook-func)

首先,如果您使用elpa和软件包系统来安装perl-completion,它会自动将其添加到加载路径中,因此add-to-list load-path是不必要的。不幸的是,这个包不包括perl-completion-mode的自动加载,所以(require 'perl-completion)是必需的。

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

我使用下面的代码来测试这一点,并将compile绑定到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-cC-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完成中的使用。看起来perl本身与mode-compile有一定的兼容性,但不确定它是否添加了任何绑定。

最新更新