Kopiuj/Wklej w Emacs ANSI-term shell

Skonfigurowałem mój emacs do uruchamiania zsh shell w ramach ANSI-term. Jednak kopiowanie / wklejanie nie działa, tzn. nic nie jest wklejane z kill-ring do terminala. Zmiana terminu na vt100 lub eterm nie rozwiązuje problemu.

Będziemy wdzięczni za wszelkie pomysły i rozwiązania.

Aby podać kontekst skonfigurowałem ansi-term w następujący sposób:

(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")))
 55
Author: mpm, 2010-05-21

6 answers

Możesz po prostu przełączać się między trybem znakowym i liniowym podczas korzystania z terminala. C-c C-j uruchomi term-line-mode, który traktuje bufor terminala bardziej jak zwykły bufor tekstowy, w którym można przesuwać kursor i przesuwać tekst. Możesz wrócić do trybu znakowego, uruchamiając term-char-mode z C-c C-k .

 97
Author: Kirk Kelsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-11 14:53:44

Jak opisano w ten piękny fragment bloga , istnieje funkcja, term-paste, w term.el, która robi dokładnie to, co chcesz. Domyślnie jest to związane tylko z S-insert, ale blog jest zalecany C-c C-y wydaje się dobrą sugestią.

 12
Author: Glyph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-31 21:49:44

ansi-term, w char-mode, pobiera zwykłe wiązania dla emulacji terminala. Potrzebujesz nowego wiązania oraz sposobu na poprawne wyjście ansi-term. Używam tego:

(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)
Kiedy to zrobisz, C-c-Y będą szarpać. Robi tylko jedno szarpnięcie, a ty nie możesz przechodzić przez swój bufor śmierci. Jest to możliwe, ale jeszcze tego nie wdrożyłem.
 5
Author: user347585,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-06 14:42:50

Powyższe rozwiązania dobrze sprawdzają się przy kopiowaniu tekstu z jakiegoś bufora do ANSI-term, ale nie są w stanie skopiować tekstu z ANSI-term do innego bufora (np. skopiuj polecenie, które właśnie uruchomiłeś do edytowanego skryptu powłoki). Dodaję to do mojego .plik emacs rozwiązał ten problem dla mnie (w 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)

Zauważ, że jeśli chcesz powiązać kill / yank z naciśnięciem klawisza, który zaczyna się od znaków escape ANSI-term (domyślnie C-C i C-x), i chcesz, aby to działało w mało prawdopodobnym przypadku, gdy te Zmień, możesz zamiast tego zdefiniować swoje naciśnięcia klawiszy (bez wiodącej ucieczki) na term-raw-escape-map, Jak to jest zrobione w odpowiedzi user347585.

 1
Author: charliegreen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-14 03:17:24

Te inne rozwiązania nie działają dobrze dla mnie, przełączanie między trybem znakowym i liniowym powoduje, że ansi-term przestaje działać poprawnie losowo, a ustawienie term-paste ANSI-term na C-c C-y( na podstawie łącza glifu), nie zadziałało fragment kodu był dla term, a nie ANSI-term:

    (eval-after-load "ansi-term"
    '(define-key ansi-term-raw-map (kbd "C-c C-y") 'term-paste))
 0
Author: junkgui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-13 18:14:17

Włączyłem xterm-mouse-mode, potem mogłem wybrać tekst za pomocą myszy i skopiować za pomocą standardowego przycisku Mac command C w ansi-term w Emacs GUI W Mac OS X,

 0
Author: ahsankhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-25 00:37:44