2016-07-08 7 views
1

Я пытаюсь правильно связать C-a в term-mode, чтобы перейти к началу текста в командной оболочке, а не к началу Подсказка. Я использую пакет prelude, в дополнение к этому коду, выбитому из других здесь, на SO и в другом месте.Не удается привязать ключ к term-send-home в режиме term-mode в Emacs 24.x и Prelude

Это моя последняя итерация term-mode код, играющий с этим.

(require 'term) 
(require 'multi-term) 

(defcustom term-unbind-key-list 
    '("C-z" "C-x" "C-c" "C-h" "C-y" "<ESC>") 
    "The key list that will need to be unbind." 
    :type 'list 
    :group 'multi-term) 

(defcustom term-bind-key-alist 
    '(("C-c C-c" . term-interrupt-subjob) 
    ("C-c C-j" . term-line-mode) 
    ("C-c C-k" . term-char-mode) 
    ("C-m" . term-send-raw) 
    ("C-p" . previous-line) 
    ("C-n" . next-line) 
    ("C-s" . isearch-forward) 
    ("C-r" . isearch-backward) 
    ("M-f" . term-send-forward-word) 
    ("M-b" . term-send-backward-word) 
    ("M-o" . term-send-backspace) 
    ("M-p" . term-send-up) 
    ("M-n" . term-send-down) 
    ("M-M" . term-send-forward-kill-word) 
    ("M-N" . term-send-backward-kill-word) 
    ("M-r" . term-send-reverse-search-history) 
    ("M-," . term-send-input) 
    ("M-." . comint-dynamic-complete)) 
    "The key alist that will need to be bind. 
If you do not like default setup, modify it, with (KEY . COMMAND) format." 
    :type 'alist 
    :group 'multi-term) 

(add-hook 'term-mode-hook 
      (lambda() 
      (add-to-list 'term-bind-key-alist '("A-M-[" . multi-term-prev)) 
      (add-to-list 'term-bind-key-alist '("A-M-]" . multi-term-next)))) 

(add-hook 'term-mode-hook 
      (lambda() 
      (define-key term-raw-map (kbd "C-y") 'term-paste) 
      (define-key term-raw-map (kbd "C-a") 'term-send-home))) 

(define-key term-mode-map (kbd "C-a") 'term-send-home) 

Каждый раз, когда я пытаюсь добавлять привязки к term-mode-map и/или удвоение его в term-raw-map, я eval-buffer его перезагрузить. Когда я запрашиваю keybinding для C-a, он ВСЕГДА ссылается на crux-beginning-of-line, часть библиотеки crux, которая является подкомпонентом пакетов prelude. Это глобальный второстепенный режим, и я должен как-то его убить? Это началось со связывания в term-unbind-key-list, это решение и другие, и независимо от того, что я пробую C-a, всегда отправляется в crux. Функция.

ответ

2

Я не использую prelude и понятия не имею о crux, но я использовал multi-term. Обычно вы не хотите использовать defcustom в своем init.el; вы должны либо использовать customize, либо обычный способ установить переменную типа setq или setq-default. Ниже я использую add-to-list.

Вам необходимо выяснить, как prelude и/или crux устанавливает привязку (второстепенный режим, крючок, define-key, ...), а затем обходной путь. Это может быть так же просто, как добавить крючок в term-mode.

(defun jpk/term-mode-hook() 
    (local-set-key (kbd "C-a") 'term-send-raw)) 
(add-hook 'term-mode-hook 'jpk/term-mode-hook) 

Вот мой старый multi-term конфигурации:

(with-eval-after-load "multi-term" 
    (defun term-send-C-x() 
    "Type C-x in term-mode." 
    (interactive "*") 
    (term-send-raw-string "\C-x")) 

    (dolist 
     (bind '(("C-<right>"  . term-send-forward-word) 
       ("C-<left>"  . term-send-backward-word) 
       ("C-<backspace>" . term-send-backward-kill-word) 
       ("C-<delete>" . term-send-forward-kill-word) 
       ("C-k"   . term-send-raw) 
       ("C-y"   . term-send-raw) 
       ("C-c C-z"  . term-stop-subjob) 
       ("C-c C-x"  . term-send-C-x) 
       ("C-z"   . term-stop-subjob) 
       ("C-c C-y"  . term-paste) 
       ;; work like urxvt tabbed 
       ("<S-down>"  . multi-term) 
       ("<S-left>"  . multi-term-prev) 
       ("<S-right>"  . multi-term-next) 
      )) 
    (add-to-list 'term-bind-key-alist bind)) 
) 

я теперь использовать sane-term, со следующим:

(with-eval-after-load "term" 
    (defun term-send-reverse-search-history() 
    "Search history reverse." 
    (interactive) 
    (term-send-raw-string "\C-r")) 

    (defun term-send-esc() 
    "Send ESC in term mode." 
    (interactive) 
    (term-send-raw-string "\e")) 

    (defun term-send-return() 
    "Use term-send-raw-string \"\C-m\" instead term-send-input. 
Because term-send-input have bug that will duplicate input when you C-a and C-m in terminal." 
    (interactive) 
    (term-send-raw-string "\C-m")) 

    (defun term-send-backward-kill-word() 
    "Backward kill word in term mode." 
    (interactive) 
    (term-send-raw-string "\C-w")) 

    (defun term-send-forward-kill-word() 
    "Kill word in term mode." 
    (interactive) 
    (term-send-raw-string "\ed")) 

    (defun term-send-backward-word() 
    "Move backward word in term mode." 
    (interactive) 
    (term-send-raw-string "\eb")) 

    (defun term-send-forward-word() 
    "Move forward word in term mode." 
    (interactive) 
    (term-send-raw-string "\ef")) 

    (defun term-send-reverse-search-history() 
    "Search history reverse." 
    (interactive) 
    (term-send-raw-string "\C-r")) 

    (defun term-send-quote() 
    "Quote the next character in term-mode. 
Similar to how `quoted-insert' works in a regular buffer." 
    (interactive) 
    (term-send-raw-string "\C-v")) 

    (defun term-send-M-x() 
    "Type M-x in term-mode." 
    (interactive) 
    (term-send-raw-string "\ex")) 

    (defun term-send-C-x() 
    "Type C-x in term-mode." 
    (interactive "*") 
    (term-send-raw-string "\C-x")) 

    (dolist 
     (bind '(;; from multi-term 
       ("C-z" . nil) 
       ("C-x" . nil) 
       ("C-c" . nil) 
       ("C-h" . nil) 
       ("C-y" . nil) 
       ("<ESC>" . nil) 
       ("C-c C-c" . term-interrupt-subjob) 
       ("C-c C-e" . term-send-esc) 
       ("C-p" . previous-line) 
       ("C-n" . next-line) 
       ("C-s" . isearch-forward) 
       ("C-r" . isearch-backward) 
       ("C-m" . term-send-return) 
       ;;("C-y" . term-paste) 
       ("M-f" . term-send-forward-word) 
       ("M-b" . term-send-backward-word) 
       ("M-o" . term-send-backspace) 
       ("M-p" . term-send-up) 
       ("M-n" . term-send-down) 
       ("M-M" . term-send-forward-kill-word) 
       ("M-N" . term-send-backward-kill-word) 
       ("<C-backspace>" . term-send-backward-kill-word) 
       ("M-r" . term-send-reverse-search-history) 
       ("M-," . term-send-raw) 
       ("M-." . comint-dynamic-complete) 

       ;; personal 
       ("C-<right>" . term-send-forward-word) 
       ("C-<left>" . term-send-backward-word) 
       ("C-<backspace>" . term-send-backward-kill-word) 
       ("C-<delete>" . term-send-forward-kill-word) 
       ("C-k" . term-send-raw) 
       ("C-y" . term-send-raw) 
       ("C-c C-z" . term-stop-subjob) 
       ("C-c C-x" . term-send-C-x) 
       ("C-z" . term-stop-subjob) 
       ("C-c C-y" . term-paste) 
       ("C-c C-u" . universal-argument) 
       ("<S-down>" . sane-term-create) 
       ("<S-left>" . sane-term-prev) 
       ("<S-right>" . sane-term-next))) 
    (define-key term-raw-map 
     (read-kbd-macro (car bind)) (cdr bind))) 
    ) 
+0

Очень в глубине ответа. Копия-макароны от ~ .el ~ других людей могут иметь неприятные последствия, иногда я полагаю. Теперь, когда рабочая неделя закончится, я попробую это и отметю правильно, если она сработает. Сожалею. – songei2f

+0

Оказывается, это была прочная помощь, но я должен отключить привязки 'crux', глобально определенные прелюдией, так как это не сработает. https://github.com/bbatsov/prelude/issues/1009 – songei2f

 Смежные вопросы

  • Нет связанных вопросов^_^