2013-08-19 3 views
3

В coffee-modeRET привязан к coffee-newline-and-indent, который отлично работает.Как переназначить функцию другому в Emacs?

Я также использую evil-mode для эмуляции Vim. evil-mode использует стандарт newline-and-indent, поэтому отступ недействителен для некоторых команд vim, таких как o или O.

Что было бы лучше всего перестроить newline-and-indent на coffee-newline-and-indent?

Я все еще новичок в ELisp и пробовал линию ниже, но это не работает.

(add-hook 'coffee-mode-hook 
      (lambda() 
      (setq newline-and-indent '(funcall coffee-newline-and-indent)))) 
+0

Вместо переназначения функций вы, вероятно, будете точным отображать RET обратно на 'coffee-newline-and-indent'. Узнайте, как это сделать. – Thomas

+0

@ Thomas 'coffee-mode' уже привязывает RET к правильной функции. Но в эмуляции vim 'evil-mode' использует стандартный' newline-and-indent'. – mtgred

+0

Конечно, но вы можете повторно привязать его к 'coffee-newline-and-indent' в' coffee-mode', даже если 'evil-mode' активен. Это то, что я имел в виду. – Thomas

ответ

1

Вот моя попытка. Он должен работать, но мне это не очень нравится.

(add-hook 
'coffee-mode-hook 
(lambda() 
    (defalias 
     'newline-and-indent 
     (lambda() 
     (interactive) 
     (if (eq major-mode 'coffee-mode) 
      (coffee-newline-and-indent) 
      (delete-horizontal-space t) 
      (newline) 
      (indent-according-to-mode)))))) 

Я хотел бы использовать что-то более элегантное, что просто скопировать источник из newline-and-indent, но make-variable-buffer-local не работает в этом случае, и я не мог получить полную копию для symbol-function либо. Я был бы счастлив увидеть лучший метод.

+0

Вместо псевдонима, вы можете связать ret в злобном режиме с вашим лямбдой. Тогда вы сможете бесплатно вызывать новый-отступ и внутри вашего лямбда. – Malabarba

+0

Дело не в этом. Я пытался заменить функцию без изменения привязки. Сначала я хотел не копировать код 'newline-and-indent', а хранить его где-то и называть его позже. Как 'virtual' в C++. Но тогда у меня возникла проблема с бесконечной рекурсией, , потому что я не мог глубоко скопировать тело 'newline-and-indent'. –

+0

Позвольте мне решить все ваши проблемы. '(символьная функция 'newline-and-indent)' возвращает действительную функцию (лямбда). Затем вы можете вызвать эту функцию с помощью funcall или call-interactive in внутри вашего псевдонима без какой-либо проблемы с рекурсией. – Malabarba

1

Стандартный способ сделать то, что вы, кажется, просят это

(autoload 'coffee-newline-and-indent "coffee-mode") ; (or whatever) 
(define-key evil-mode-map (kbd "RET") 'coffee-newline-and-indent) 

EDIT: для того, чтобы coffee-newline-and-indent только в coffee-mode:

(define-key evil-mode-map (kbd "RET") 
    (lambda() 
    (interactive) 
    (if (eq major-mode 'coffee-mode) 
     (coffee-newline-and-indent) 
     (newline-and-indent)))) 
+0

Это повредит везде, вам нужен способ привязать его только к кофейным скриптам. – Malabarba

+0

@BruceConnor: спасибо, отредактирован – sds

0

Попробуйте следующее:

(define-key evil-mode-map (kbd "RET") nil) 

Я знаю, что это выглядит слишком просто, но если злой режим работает так, как я думаю, он делает тогда он должен работать.

  1. Это протирает ключ ret из вашей карты зла-режима, что позволит проследить привязку карты режима кофе.
  2. В буферах, не содержащих кофе, ключ ret по-прежнему будет работать, поскольку он все еще привязан к глобальной карте.
0

Я нашел решение.

Evil-mode фактически используется coffee-indent-line. Проблема исходит от coffee-indent-line, которая не имеет отступ правильно. Evil-режим работает правильно после того как пропатчен его вести себя как coffee-newline-and-indent:

(defadvice coffee-indent-line (after wants-indent activate) 
    (let ((tabs-needed (- (/ (coffee-previous-indent) coffee-tab-width) 1))) 
    (when (> tabs-needed 0) 
     (insert-tab tabs-needed))) 
    (when(coffee-line-wants-indent) 
    (insert-tab))) 
0

если вы хотите переназначить на FUNC, но только если некоторые основной режим является активным - создать FUNC, которая определяет псевдоним и запустить FUNC (A) - другие вызовы func (B) (A) - наконец, основной режим может помочь func A установить правильную функцию . Он должен проверить основной режим.

скажем А определить-мой-отступ-е то говорит (defalias моего отступ «новой строка-и-отступ) FUNC б запускает затем запустить команду моего отступа. наконец кофе режим делает defadice А сказать (если эк основной режим кофе defalais моего отступа «кофе-переводы строки и отступ)

, конечно, это очень тяжело определить, но затем - каждый основной режим может добавьте его часть - только загруженный основной режим будет советом