Копировать / Вставить в оболочку от Emacs - PullRequest
49 голосов
/ 22 мая 2010

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

Буду признателен за любые идеи или решение.

Для обеспечения контекста я настроил следующий термин:

(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")))

Ответы [ 5 ]

78 голосов
/ 19 июля 2010

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

8 голосов
/ 01 апреля 2016

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

5 голосов
/ 22 мая 2010

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)

Когда вы сделаете это, Cc Cy будет дергать.Тем не менее, он выполняет только один рывок, и вы не можете перебрать свой буфер уничтожения.Это можно сделать, но я еще не реализовал.

1 голос
/ 14 октября 2016

Вышеуказанные решения хорошо работают для копирования текста из некоторого буфера в ANSI-термин, но они не могут скопировать текст из ANSI-термина в другой буфер (например, скопировать команду, которую вы только что выполнили, в сценарий оболочки, который вы редактирование). Добавление этого в мой файл .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-термина (по умолчанию Cc и Cx), и хотите, чтобы это работало в маловероятном случае, если эти изменения изменятся, вы можете вместо этого определить ваши нажатия клавиш (без начального выхода) на term-raw-escape-map, как это сделано в ответе пользователя 347585.

0 голосов
/ 13 июля 2016

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

    (eval-after-load "ansi-term"
    '(define-key ansi-term-raw-map (kbd "C-c C-y") 'term-paste))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...