Копировать/Вставить в 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")))
Ответы
Ответ 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.