Режим терминала emacs: как эффективно копировать и вставлять

Мне сложно сделать этот emacs -nw эффективно работать в режиме терминала (emacs -nw). Некоторые сведения об установке: Рабочий сервер подключен через SSH, а emacs запущен на сервере. Обычно я использую SSH и "emacs -nw" для работы с моими файлами.

Конфигурация emacs выбирается из: https://hugoheden.wordpress.com/2009/03/08/copypaste-with-emacs-in-terminal/

;; make mouse selection to be emacs region marking
(require 'mouse)
(xterm-mouse-mode t)
(defun track-mouse (e)) 
(setq mouse-sel-mode t)

;; enable clipboard in emacs
(setq x-select-enable-clipboard t)

;; enable copy/paste between emacs and other apps (terminal version of emacs)
(unless window-system
 (when (getenv "DISPLAY")
  ;; Callback for when user cuts
  (defun xsel-cut-function (text &optional push)
    ;; Insert text to temp-buffer, and "send" content to xsel stdin
    (with-temp-buffer
      (insert text)
      ;; I prefer using the "clipboard" selection (the one the
      ;; typically is used by c-c/c-v) before the primary selection
      ;; (that uses mouse-select/middle-button-click)
      (call-process-region (point-min) (point-max) "xsel" nil 0 nil "--clipboard" "--input")))
  ;; Call back for when user pastes
  (defun xsel-paste-function()
    ;; Find out what is current selection by xsel. If it is different
    ;; from the top of the kill-ring (car kill-ring), then return
    ;; it. Else, nil is returned, so whatever is in the top of the
    ;; kill-ring will be used.
    (let ((xsel-output (shell-command-to-string "xsel --clipboard --output")))
      (unless (string= (car kill-ring) xsel-output)
        xsel-output )))
  ;; Attach callbacks to hooks
  (setq interprogram-cut-function 'xsel-cut-function)
  (setq interprogram-paste-function 'xsel-paste-function)
  ;; Idea from
  ;; http://shreevatsa.wordpress.com/2006/10/22/emacs-copypaste-and-x/
  ;; http://www.mail-archive.com/[email protected]/msg03577.html
 ))

Причина:

 (require 'mouse)
 (xterm-mouse-mode t)
 (defun track-mouse (e)) 
 (setq mouse-sel-mode t)

- включить выбор мыши над текстом, чтобы область текста была подсвечена так же, как "C-x SPC", обозначающая область. Затем я могу использовать "M-x w" для копирования и "C-x y" для вставки текста в emacs и между emacs и другими приложениями.

Все выглядят прекрасно, за исключением того, что любые операции, связанные с X, ДЕЙСТВИТЕЛЬНО МЕДЛЕННЫ! Мое подключение к удаленному серверу является плавным - латентность обычно составляет менее 100 мс. Но чтобы убить одну строку текста, используя "C-x k", требуется ~ 5 секунд! Чтобы вставить его, требуется еще 5 секунд!

Иногда, когда часто копируется/вставляется, это становится очень раздражающим. Я думаю, что это связано с обменом сообщениями X sever, но не уверен, что есть хороший способ исправить это.

Любые идеи? Спасибо!

Ответ 1

Это не идеальное решение как таковое, но я понял, что я чувствую себя лучше, чем предыдущий.

Идея состоит в том, чтобы избавиться от X, что вызывает серьезные проблемы с задержкой, т.е. сохранить только следующее:

;; enable clipboard in emacs
(setq x-select-enable-clipboard t)

Результаты:

  • копировать/вставлять в Emacs просто и быстро.

  • копировать из других приложений в Emacs: Ctrl + Shift + v

  • копия из Emacs в другие приложения: теперь выбор мыши выбран в X Selection, поэтому щелкните правой кнопкой мыши и скопируйте текст в Selection. Обратите внимание, что "M-w" теперь ничего не будет копировать в "Выбор" или системный буфер обмена.

Это снова компромисс, а не решение, но, учитывая тот факт, что я копирую/вставляю чаще, чем операции между приложениями, это приемлемо на данный момент.

Все еще с нетерпением жду хорошего решения!