Подтвердить что ты не робот

Копировать/Вставить в emacs ansi-term shell

Я настроил emacs для запуска оболочки zsh в ansi-term. Однако копирование/вставка больше не работает, т.е. Ничего не вставлено с kill-ring на терминал. Изменение TERM на vt100 или eterm не решает проблему.

Поблагодарили бы за любые идеи или решения.

Чтобы предоставить контекст, я настроил ansi-term следующим образом:

(global-set-key "\C-x\C-a" '(lambda ()(interactive)(ansi-term "/bin/zsh")))
(global-set-key "\C-x\ a" '(lambda ()(interactive)(ansi-term "/bin/zsh")))
4b9b3361

Ответ 1

Вы можете просто переключаться между режимом символа и режимом линии при использовании терминала. C-x C-j активирует режим term-line-mode, который обрабатывает буфер терминала больше как обычный текстовый буфер, в котором вы можете перемещать курсор и yank-текст. Вы можете переключиться в режим символов с помощью C-c C-k.

Ответ 2

ansi-term, в char-mode, принимает обычные привязки для эмуляции терминала. Вам нужна новая привязка, а также способ вывода на ansi-term правильно. Я использую это:

(defun ash-term-hooks ()
  ;; dabbrev-expand in term
  (define-key term-raw-escape-map "/"
    (lambda ()
      (interactive)
      (let ((beg (point)))
        (dabbrev-expand nil)
        (kill-region beg (point)))
      (term-send-raw-string (substring-no-properties (current-kill 0)))))
  ;; yank in term (bound to C-c C-y)
  (define-key term-raw-escape-map "\C-y"
    (lambda ()
       (interactive)
       (term-send-raw-string (current-kill 0)))))
  (add-hook 'term-mode-hook 'ash-term-hooks)

Когда вы это сделаете, C-c C-y задержит. Тем не менее, это один из них, и вы не можете перебирать свой буфер-убийцу. Это можно сделать, но я еще не реализовал его.

Ответ 3

Как описано в этом прекрасном фрагменте блога, есть функция term-paste, в term.el, которая делает именно то, что вы хотите. По умолчанию он привязан только к S-insert, но рекомендуемый блог C-c C-y кажется хорошим предложением.

Ответ 4

Эти другие решения не работают хорошо для меня, переключение между режимом символов и режимом линии приводит к тому, что ansi-term перестает работать правильно случайным образом и устанавливает ansi-term term-paste на Cc Cy (на основе ссылки Glyph), didn 't работа фрагмента кода была для термина, а не ansi-term:

    (eval-after-load "ansi-term"
    '(define-key ansi-term-raw-map (kbd "C-c C-y") 'term-paste))

Ответ 5

Вышеупомянутые решения хорошо подходят для копирования текста из некоторого буфера в ansi-term, но они не могут копировать текст из ansi-term в другой буфер (например, скопировать команду, которую вы только что запускали в оболочку script, вы редактирование). Добавление этого файла в мой файл .emacs решило эту проблему для меня (в Emacs 24.4):

(defun my-term-mode-hook ()
  (define-key term-raw-map (kbd "C-y") 'term-paste)
  (define-key term-raw-map (kbd "C-k")
    (lambda ()
      (interactive)
      (term-send-raw-string "\C-k")
      (kill-line))))
(add-hook 'term-mode-hook 'my-term-mode-hook)

Обратите внимание, что если вы хотите связать kill/yank с нажатием клавиши, которая начинается с символа escape-символов ansi-term (по умолчанию Cc и Cx), и хотите, чтобы это работало в маловероятном случае, когда эти изменения изменяются, вы можете вместо этого определить ваши нажатия клавиш (без ведущего выхода) до term-raw-escape-map, как это сделано в ответе user347585.