
В Windows 10 я установил Subsystem for Linux Bash. Но у меня проблема с сочетанием клавиш в Emacs Ctrl+ spaceне устанавливается точка отметки.
Что я пробовал и что не помогло:
Я попытался снять флажок «Включить сочетания клавиш Ctrl» в меню свойств консоли Windows.
Я пробовал использовать другой терминал ConEmu, но безуспешно.
Интересно, связано ли это как-то с Ubuntu, у которого есть похожие проблемы с Ctrl + Space, а Windows Linux Bash использует репозитории Ubuntu.
решение1
Нет никакихрешенияк этому, с точки зрения передачи Ctrl-Space через терминал Bash, на момент написания этой статьи (1 сентября 2016 г.) — но есть обходной путь, который может быть достаточным для многих пользователей: используйте PuTTY для подключения через SSH, что принудительно обрабатывает Ctrl-Space. (В режиме tty невозможно отличить Ctrl-Space от Ctrl-@, поскольку это один и тот же код символа, но это не должно быть проблемой, поскольку по умолчанию Emacs настроен на обработку set-mark-command
таким образом.)
- Установите сервер OpenSSH с помощью
sudo apt-get install openssh-server
. Если он уже установлен, удалите его (sudo apt-get remove openssh-server
), а затем переустановите, чтобы сбросить файлы конфигурации. Редактировать/etc/ssh/sshd_configфайл (с sudo), как показано ниже:
- Если есть незакомментированная строка настройки
PermitRootLogin
, закомментируйте ее. Добавьте строкуPermitRootLogin no
. - Добавьте строку
AllowUsers USERNAME
, заменив USERNAME на свое имя пользователя Linux (если вы не знаете, что это такое, выполните командуwhoami
в командной строке Bash). - В идеале вам следует настроить беспарольную аутентификацию с использованием ключей SSH, но как это сделать, выходит за рамки этого вопроса (есть много руководств; поищите в Интернете "passwordless ssh-keygen"). Тем временем добавьте или раскомментируйте строку
PasswordAuthentication yes
. - Установите
UsePrivilegeSeparation no
; скорее всего, вы найдете строку в файле, в которой говоритсяUsePrivilegeSeparation yes
; просто изменитеyes
наno
и сохраните/etc/ssh/sshd_configфайл.
Если что-то пойдет не так, вы можете восстановить файл, повторив шаг №1.
- Если есть незакомментированная строка настройки
- Запустите SSH-сервер с помощью команды
sudo service ssh --full-restart
. - Использование PuTTY (скачатьздесь), войдите
localhost
в поле Hostname, все остальное оставьте по умолчанию. Вам будет предложено ввести имя пользователя Linux и пароль. - Выполнить
emacs
. Ctrl-пробел установит желаемую отметку.
(Обратите внимание, что шаги, описанные выше,нет, сами по себе делают вашу систему способной принимать SSH-подключения отдругойхосты. Для этого вам также придется изменить правила брандмауэра Windows, чтобы разрешить входящий TCP-порт 22.)
Вдругой ответвы сказали: "но putty не локальный терминал". Я не уверен, не знали ли вы, что можете использовать его localhost
таким образом, или вы отвергали PuTTY из-за больших накладных расходов по сравнению с локальным терминалом. Если последнее, я бы не беспокоился, интерактивный сеанс SSH - это чрезвычайно легкая нагрузка. (Это, конечно,много(Меньшая нагрузка, чем при работе в X Window System, поэтому вы можете запустить графический интерфейс Emacs или xterm!)
Единственным реальным недостатком такого способа работы по сравнению с обычным терминалом является то, что события вставки отправляются побуквенно, как если бы вы очень быстро вводили содержимое буфера обмена, что может привести к срабатыванию электрических пар, отступов, расширения фрагментов и т. д. (Вставка должнанет(заставляют срабатывать команды сочетания клавиш, поскольку существует логика для обнаружения выполняемой вставки и отключения сочетаний клавиш до завершения вставки.)
И есть, по крайней мере, одно очень большое преимущество перед стандартным терминалом Bash: события мыши поддерживаются PuTTY в форме, на которую может реагировать Emacs, так что, по иронии судьбы, вы можете перемещать точку с помощью мыши в PuTTY, даже если вы не можете этого сделать с помощью локального терминала.
решение2
Я использую ConEmu. Элегантного способа нет, но можно решить с помощью макроса.
- Откройте «Настройки» (нажмите на
☰
значок вверху). - Нажмите «Клавиши и макросы».
- С правой стороны прокрутите вниз, пока не увидите параметры «Макрос 01»... «Макрос 32», и выберите любой доступный вариант (не имеет значения).
ДавайтеМакрос 01для этого примера. - В первом выпадающем меню выберите «Пробел».
- Выберите «Ctrl» во втором выпадающем меню.Оставьте оставшиеся два раскрывающихся меню нетронутыми.
Вставьте ниже вМакрос графического интерфейсаполе:
keys("\e");keys("x");keys("s");keys("e");keys("t");keys("-");keys("m");keys("a");keys("r");keys("k");keys("-");keys("c");keys("o");keys("m");keys("m");keys("a");keys("n");keys("d");keys("\n")
Вышеприведенный код по сути отправляет
M-x select-mark-command
строку в emacs.Теперь нажмите «Сохранить настройки».
В итоге должно получиться так:
решение3
Этот проект позволяет использовать MinTTY в качестве альтернативного терминала:https://github.com/mintty/wsltty. Он получен из PuTTY, но не требует SSH. И как PuTTY, он отлично обрабатывает Ctrl-пробел.
решение4
Эта проблема теперь исправлена вWindows 10 сборка 14965. Проверять:
[Environment]::OSVersion
И установите обновления, если вы этого еще не сделали!