Emacs не вставляет в визуальном режиме Зла с каждым буфером обмена ОС

19

Настроить:

Версия графического интерфейса GNU Emacs 25.0.50.1 (x86_64-w64-mingw32) 2015-07-25 для KAEL Скомпилировано из EmacsW64.

Пакет Evil, использующий последнюю версию Evil от MELPA

Windows 7 x64 бит.

Ситуация:

Протестировано с пустой конфигурацией Emacs с включенным только Evil. Я копирую текст из приложения Windows. Потом вставить его в Emacs внутри normal modeс p. Я вижу текст.

Затем я переключаюсь в приложение Windows, выбираю другой текст, копирую его. Вернитесь к Emacs, визуально выделите текст и вставьте его внутрь visual mode. Но текст внутри региона не будет заменен текстом из буфера обмена Windows.

Это не по умолчанию Vim. Как я могу настроить его так, чтобы визуальный текст заменялся последним действием копирования, в данном случае буфером обмена Windows?

ReneFroger
источник
1
Мне известны обе темы, но я думаю, что это больше связано со Злом, чем с буфером обмена. Функция буфера обмена работает нормально в обычном режиме. И не для визуального режима.
ReneFroger
Ах, я понимаю, что вы говорите. Что бы это ни стоило, оно не специфично для Windows: оно также не выдергивается из буфера обмена ОС в визуальном состоянии в Linux (Fedora, если это имеет значение).
Дан
Спасибо за обновление, я изменил название, чтобы оно не зависело от ОС.
ReneFroger
Это просто злая ошибка? Есть ли шанс, что вы можете сообщить об этом?
PythonNut

Ответы:

28

Здесь нет ошибки . Так как меня это тоже раздражало, я просто прочитал злой код, чтобы узнать, почему это происходит. Итак, вот прямая копия / вставка хорошо прокомментированной однострочной строки из моей конфигурации Emacs, которая устраняет эту проблему:

;; Imagine the following scenario.  One wants to paste some previously copied
;; (from application other than Emacs) text to the system's clipboard in place
;; of some contiguous block of text in a buffer.  Hence, one switches to
;; `evil-visual-state' and selects the corresponding block of text to be
;; replaced.  However, one either pastes some (previously killed) text from
;; `kill-ring' or (if `kill-ring' is empty) receives the error: "Kill ring is
;; empty"; see `evil-visual-paste' and `current-kill' respectively.  The
;; reason why `current-kill' does not return the desired text from the
;; system's clipboard is because `evil-visual-update-x-selection' is being run
;; by `evil-visual-pre-command' before `evil-visual-paste'.  That is
;; `x-select-text' is being run (by `evil-visual-update-x-selection') before
;; `evil-visual-paste'.  As a result, `x-select-text' copies the selected
;; block of text to the system's clipboard as long as
;; `x-select-enable-clipboard' is non-nil (and in this scenario we assume that
;; it is).  According to the documentation of `interprogram-paste-function',
;; it should not return the text from the system's clipboard if it was last
;; provided by Emacs (e.g. with `x-select-text').  Thus, one ends up with the
;; problem described above.  To solve it, simply make
;; `evil-visual-update-x-selection' do nothing:
;; (fset 'evil-visual-update-x-selection 'ignore)

Последнее предложение является ответом на вопрос о том, как « настроить его так, чтобы визуально текст заменялся последним действием копирования, в данном случае буфером обмена Windows? »

(fset 'evil-visual-update-x-selection 'ignore)

Наслаждаться.

Александр Шукаев
источник
Спасибо, Александр, я также наслаждался твоими скомпилированными Emacs Harroogan. Хорошая находка, я пометил твой ответ как правильный. Как мне кажется, я могу только подтвердить и пометить это как право без какой-либо награды. Что печально, вы действительно это заслужили. :-)
ReneFroger
1
Возьми этот баг! Это настолько раздражало меня, что я снова переключился на vim, чтобы избавиться от этого поведения. Я искал везде и также сообщал злому следопыту, но, к сожалению, никто не ответил на мою проблему. Александр, ты мой герой!
dvcrn
1
КРАСИВЫЙ! Это должно быть по умолчанию в spacemacs.
Джастингордон
Кажется подлый, как это поведение по умолчанию. Мне потребовалось время, чтобы осознать, что происходит, и тот факт, что нет возможности отключить его с помощью установки переменной. Этот обходной путь работает хорошо :)
Хорхе Исраэль Пенья