Как я могу настроить так, чтобы я мог определить несколько действий в cperl-mode-hook в.emacs?

Вот выдержка из моего.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-c\C-c" 'compile)
  )

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

СЛУЧАЙ 2: С помощью приведенной ниже конфигурации Cc Cc в режиме cperl успешно запустит компиляцию 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: Однако, с помощью приведенного ниже кода, в котором есть и Perl-Завершение, и Cc Cc для запуска компиляции perl, раскомментировав все строки в функции ловушки (my-cperl-hook-func), он просто заканчивается этим 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)

1 ответ

Решение

Прежде всего, если вы используете elpa и систему пакетов для установки perl-completion, он автоматически добавит его в путь загрузки, поэтому add-to-list load-path не нужно К сожалению, пакет не включает автозагрузку для perl-completion-mode, Итак (require 'perl-completion) является необходимым.

После изучения perl-completion библиотека на http://www.emacswiki.org/emacs/perl-completion.el, похоже, она использует C-c C-c в качестве префикса. К сожалению, используя его в качестве префикса, он теряет способность связывать C-c C-c за compile в perl-mode,

Я использовал следующее, чтобы проверить это и связать компиляцию с 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-завершении. Похоже, что сам cperl имеет некоторую совместимость с mode-compile, но не уверен, добавляет ли он какие-либо привязки.

Другие вопросы по тегам