2010-05-21 2 views
37

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

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

Для того, чтобы обеспечить контекст я настроил ANSI-термина следующим образом:

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

ответ

60

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

+0

Отличный совет, спасибо! +1 – danlei

+0

Это не слишком хорошо работает с выровненной справа подсказкой, что такие вещи, как zsh. – l0st3d

+14

В Emacs 24, кажется, что в терминале вам нужно нажать «C-c C-j», чтобы перейти в режим линии, а затем вернуться, это «C-c C-k», как указано выше. – djhaskin987

5

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 задержит. Тем не менее, это один из них, и вы не можете перебирать свой буфер-убийцу. Это можно сделать, но я еще не реализовал его.

+0

Цените свой ответ. A ")" в конце концов не было. К сожалению, это не работает для меня. Я получаю ошибку C-c C-y не определен. – Sandeep

+0

Хм, я попробовал запустить «emacs -q» с emacs 23.2, и (после исправления отсутствующего парнера, который вы указали), я оценил, скопировал какой-то случайный текст, а затем начал ansi-term. Нажатие C-c C-y действительно вставило его. Так как это использование крюка, убедитесь, что вы перезапустили ansi-term после его оценки. если это не работает, попробуйте использовать emacs, начинающийся с -q. Вы также можете попробовать нажать C-c C-h, какие перечни списков начинаются с C-c. C-c C-y должен быть указан с помощью (?? потому что мы используем неназванный лямбда). – user347585

+0

Привет. Я попытался перезапустить emacs как с, так и без -q. Но он все еще не работает. Я использую emacs 23.1 на ubuntu. R C-c C-h не показывает привязки, когда я запускаю emacs в обычном режиме. С -q у меня есть несколько привязок, но у C-c C-y нет.Есть ли журнал или отладочный вывод, который я могу посмотреть, чтобы увидеть, что отсутствует. Спасибо. -Sandeep – Sandeep

5

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

0

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

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

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

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

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