0

这是我的 .emacs 的摘录

案例 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 下 Cc Cc 将成功启动 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-completion和Cc Cc来启动perl编译,它只是以那个perl-结束完成可以正常工作,而 Cc Cc 根本不起作用(emacs 说 Cc Cc 未定义。)

如何使这两个操作在 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)
4

1 回答 1

1

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

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

我使用以下内容对此进行了测试,并将 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-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 本身与模式编译有一些兼容性,但不确定它是否添加了任何绑定。

于 2014-07-31T00:34:41.797 回答