Shift + Up не распознается Emacs в терминале

15

Очень часто я использую Shift+, Up/Downчтобы выбрать регион в Emacs. Он отлично работает в режиме GUI, но когда emacsвызывается с -nwопцией, я могу выбрать строки только с Shift+ Down. Shift+ UpНе работает, я получаю сообщение об ошибке в минибуфере:

<select> is undefined

Как я могу решить эту проблему?

WeSenseASoulInSearchOfAnswers
источник

Ответы:

13

Текстовый терминал передает только символы (точнее, байты), а не ключи. Ключи и цепочки ключей (ключи с модификаторами) кодируются как последовательности символов. Ключи, которые вставляют печатаемые символы, отправляются как они сами; функциональные клавиши отправляются как escape-последовательности. Большинство escape-последовательностей состоят из символа Escape ( ?\eв синтаксисе Emacs), за которым следуют два или более печатных символа. См. Управление и клавиши вверх / вниз на терминале для использования emacs и Как работает ввод с клавиатуры и вывод текста? Чтобы получить больше информации.

В Emacs есть механизм для перевода escape-последовательностей в собственное представление о ключах. Таблица перевода input-decode-mapинициализируется при запуске Emacs (или, точнее, при открытии нового фрейма: эта переменная имеет разные значения на каждом терминале). Иногда Emacs не знает всех escape-последовательностей, отправленных терминалом.

В вашем случае кажется, что Emacs имеет неверную интерпретацию для escape-последовательности, отправленной Shift+ Up. Вы должны сказать это, чтобы интерпретировать это как, S-upа не select. Сначала выясните, что такое escape-последовательность. В *scratch*буфере нажмите Ctrl+, Qзатем Shift+ Up. Команда C-qзаставляет следующий символ, который является escape-символом, вставляться буквально, сопровождаемый остальной частью escape-последовательности. Допустим, что Shift+ Upотправляет \e[1;2Aв нашу систему, тогда вам нужно переопределить соответствующую запись в input-mode-map:

(define-key input-decode-map "\e[1;2A" [S-up])

В принципе, input-decode-mapдолжен быть установлен для каждого терминала. На практике очень редко иметь два терминала, в которых одна и та же escape-последовательность кодирует разные ключи, поэтому глобальная настройка будет работать нормально.

Жиль "ТАК - перестань быть злым"
источник
Ваш ответ, кажется, отвечает на мой вопрос здесь - emacs.stackexchange.com/questions/33988 . Are the (define-key ...)команды должны идти в init.el? Есть ли где-нибудь подробный пример, на который я могу посмотреть?
vfclists
define-keyКоманды @vfclists входят в ваш файл инициализации. Это может быть ~/.emacs.d/init.elили несколько других мест. Вы найдете множество примеров использования define-keyпутем поиска define-key, но поиск карты для привязки - это другой вопрос. Несколько карт участвуют: global-map, input-decode-map, function-key-map, keyboard-translate-map. Я не знаю, как ответить на ваш вопрос, потому что я не знаю Spacemacs. Я не рекомендую использовать такие пакеты, как Spacemacs, которые беспорядочно переопределяют стандартные интерфейсы.
Жиль "ТАК - перестань быть злым"
Я перешел на обычный emacs для изучения режима org, и мне удалось начать работать input-decode-mapпосле нахождения некоторых примеров. Можно ли считать, что это input-decode-mapприменимо, когда пользователь вводит текст в буфер?
vfclists
@vfclists input-decode-map- одна из применяемых комбинаций клавиш . Смотрите руководство для деталей.
Жиль "ТАК - перестань быть злым"
5

В emacs область ограничена точкой (курсор) и меткой (некоторая предыдущая позиция курсора, которая была «помечена»).

Таким образом, чтобы «выбрать регион», вам нужно разместить эту отметку, а затем переместить свою точку вокруг.

Самый простой способ разместить отметку - нажать C-SPC. Затем просто переместите курсор, и вы увидите, что «регион» расширяется, как и вы.

Чтобы «отменить выбор региона», вы можете нажать еще C-SPCраз.

Поскольку «shift + движение» - это обычное связывание клавиш в других программах, по умолчанию оно эмулирует это поведение «выбора региона». Однако, это не работает в терминале, потому что shift не может быть отправлено в emacs как ключ-модификатор.

Обратите внимание, что, как правило, этот C-SPCметод является гораздо более мощным, чем другие методы выбора региона: вы не ограничены движением вверх / вниз / влево / вправо (вы можете использовать поиск, например ...), и он не требует что вы сохраняете неудобную комбинацию клавиш в течение длительного времени.

Т. Веррон
источник