Как отключить альтернативный Enter с помощью Ctrl + M в Linux - PullRequest
14 голосов
/ 19 февраля 2010

Почему Ctrl + M связан с Enter в Ubuntu Jaunty? Как его выключить?

Я использую Emacs и хотел бы связать Ctrl + M с другой командой.

Ответы [ 8 ]

32 голосов
/ 19 февраля 2010

Я думаю, что ваш вопрос задом наперед. Это не C-m , которая связана с Enter , это Enter, которая связана с C-m . И C-m совпадает с RET.

Если вы запустите C-h k C-m , вы увидите что-то вроде "RET runs the command ...". C-m отправляет RET, потому что это контрольный код, см. http://en.wikipedia.org/wiki/Control_character.

Клавиша Enter связана с C-m ; если вы запустите C-h k, введите , вы увидите что-то вроде "RET (translated from <return>) runs the command ...". Смотрите, Enter интерпретируется emacs как , а затем этот ключ переводится в C-m .

Что вы хотите сделать, это сначала удалить перевод с на RET, привязав его напрямую к тому, что он в настоящее время косвенно связан, например, (global-set-key (kbd "<return>") 'newline). Тогда вы можете привязать C-m к чему угодно, не затрагивая Enter.

Предполагается, что вы используете графический emacs. Если вы запускаете его в терминале, это не будет работать, потому что Enter будет отправлять C-m, а не . Вы можете проверить это, используя переменную window-system.

7 голосов
/ 19 февраля 2010

Примечание: Проблема не ограничивается Linux, она существует и в Windows (и, вероятно, Mac). Прочитайте другой (не переполненный стеком) источник всех знаний: Википедия по возврату каретки .

Если вы хотите выполнить повторную привязку C-m , убедитесь, что все привязки в противном случае вы рискуете больше не использовать клавишу ввода / возврата. Кроме того, в терминале Emacs не может различить два ( C-m и ).

В простом Emacs ключ Enter / Return связан с , который (по умолчанию) переводится в RET (тоже самое, что Cm ). Если вы отсканируете только C-m , это также повлияет на клавишу ввода / возврата.

Попробуйте C-ч к и вы увидите

RET (перевод с )

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

Возможно, будет полезно поиграть со следующим кодом:

(defun my-return ()
  (interactive)
  (message "return"))
(defun my-ret ()
  (interactive)
  (message "RET"))
(defun my-c-m ()
  (interactive)
  (message "C-m"))
(global-set-key (kbd "<return>") 'my-return)
(global-set-key (kbd "C-m") 'my-c-m)
(global-set-key (kbd "RET") 'my-ret)

Поместите это в свой *scratch* буфер и нажмите C-j после каждой строки (чтобы оценить пол). Затем поиграйте с клавишами ввода / возврата и C-m .

5 голосов
/ 29 ноября 2010

input-decode-map делает свое дело. Цитата из руководства по emacs:

Эта раскладка имеет ту же структуру, что и другие раскладки, но используется по-разному: она задает переводы, выполняемые при чтении последовательности клавиш, а не привязки для последовательностей клавиш.

Это тот же принцип, который я представил выше, преобразуя Ctrl + m во что-то, скажем Ctrl + 1 и сопоставьте Ctrl + 1 с вашей командой. Я использую Ctrl + m для backward-kill-word.

Вот, пожалуйста,

(global-set-key (read-kbd-macro "C-1") 'backward-kill-word)
(define-key input-decode-map "\C-m" [?\C-1])
3 голосов
/ 01 декабря 2010

Неясно, решали ли предыдущие ответы этот вопрос, поэтому вот еще один поворот:

Исторически, " return " часто означало две вещи: возврат каретки и перевод строки.

Цитата wikipedia :

Первоначально, возврат каретки был термином для механизма или рычага на пишущей машинке, который вызывал бы цилиндр, на котором держалась бумага(каретка), чтобы вернуться на левую сторону листа бумаги после того, как была напечатана строка текста, и обычно также перемещает бумагу на следующую строку.Позже он использовался для управляющего символа в коде Бодо на телетайпе для возврата конца строки к началу строки и не включал перевод строки.

Короче говоря, есть два кода ASCII, которыеотносится к концу строки (и, следовательно, потенциально к клавише возврата): CR (десятичное значение ASCII 13, или Ctrl-m ) и LF (десятичное число ASCII 10, или Ctrl-J).

Я думаю, что в наши дни общим условием является return или ввод ключей для сопоставления с ASCII 13 и, таким образом, "return" (RET в сообщениях emacs).Но если вы запускаете emacs из эмулятора терминала, это может означать, что у вас нет возможности иметь привязку Cm , которая отличается от RET.Когда я пытаюсь запустить emacs в терминале (GNU Emacs 23.2.1 на MacOS X в Terminal.app) и пытаюсь набрать Ch c (то есть нажав клавишу возврата / ввода), я получаю:

RET runs the command newline

Если я вместо этого наберу Ch c Cm (то есть, удерживая нажатой клавишу управления и нажав M), я получу:

RET runs the command newline

Другими словамиТочно так же.Emacs (и любая другая программа, запускаемая из терминала) не может определить разницу между ними.(Знание этого иногда может быть полезно - если вы вошли в систему, которая отображает вещи не так, как система, из которой вы исходите, вы можете набрать Cm или Cj дляполучить то, что вы хотите, в зависимости от того, как облажалось отображение.)

И говоря о том, что обвязка облажалась, я просто упомяну, что есть некоторые настройки stty, которые могут иметь отношение ктакие вещи: inlcr, inlcr и igncr (эти три относятся к тому, как обрабатывается ввод - есть также некоторые, связанные с выводом).Я сомневаюсь, что внесение stty изменений будет полезно для этой конкретной проблемы, но я подумал, что стоит упомянуть.

В конце я думаю, что ваш выбор:

  1. Жить, не имея См , что означает что-то отличное от return / enter

  2. Запустить графическую версию emacsвместо терминальной версии.Это должно иметь доступ к различным кодам клавиш, которые эмулятор терминала не передает (поскольку он эмулирует терминал, который не имеет таких вещей, как современные компьютеры).

2 голосов
/ 01 июня 2012

Некоторые очень хорошие объяснения здесь относительно природы проблемы, и я не буду подробно останавливаться на этих проблемах. Однако я хочу обратиться к первоначальному вопросу напрямую. Я решил проблему изменения последовательности (control m), связанной с командой 'newline, с помощью следующего кода в моем файле ~/.xemacs/custom.el:

(defun my-compile-hook-for-c-and-cpp-mode ()
  "My compile hook for C and C++ mode" 
  (local-set-key [(control m)] 'compile)
  )

(add-hook 'c-mode-hook 'my-compile-hook-for-c-and-cpp-mode)
(add-hook 'c++-mode-hook 'my-compile-hook-for-c-and-cpp-mode)

В приведенном выше примере я изменил (control m) для запуска команды 'compile (M-x compile), когда c-mode или c++-mode активен.

Обратите внимание, что вы можете изменить поведение (control m) также и глобально, без привязок, связанных с режимом. В этом случае просто добавьте в ваш файл ~/.xemacs/custom.el следующее:

(global-set-key [(control m)] 'compile)
2 голосов
/ 29 ноября 2010

На самом деле, это очень сложный вопрос, вы не поймете его правильно с: (global-set-key (kbd "") 'newline)

потому что этот возврат (RET) является новой строкой только в некоторых частных случаях. Вы увидите странность, о которой я говорю, если вы попробуете это в вашем .emacs

Я нашел уродливое, но работающее решение, используя какое-то приложение для событий KDE, и связал Ctrl + m с Ctrl + 1. Я выбрал это, потому что я не буду использовать эту комбинацию (Ctrl + 1), но вы можете выбрать что-то другое. Таким образом, в emacs (но в моей среде X) я не получаю RET (или символ перевода строки), когда нажимаю Ctrl + m, вместо этого я получаю Ctrl + 1. И тогда я сделал что-то вроде: (глобальный набор ключей "\ C-1" 'mycmd)

Проблема в том, что теперь я использую потрясающий оконный менеджер, и я не знаю, как снова сделать это X-отображение. Если вы не используете KDE, вы ищете что-то похожее в Gnome.

2 голосов
/ 19 февраля 2010

Основным источником проблемы является то, что Enter и Ctrl-M оба отображаются в один и тот же код ASCII (13).Вы сможете сопоставить их только в той системе, которая их различает.

2 голосов
/ 19 февраля 2010

(global-set-key (kbd "C-m") 'cmd);

Где cmd - ваша команда должна переназначить управление м ...

Что касается того, почему ctrl + m должен войти. Я полагаю, что это как-то связано с тем, что на старой клавиатуре не было ввода, табуляции, возврата на задний план и т. Д.

Например, ctrl + h - возврат, некоторые операционные системы Unix будут выводить ^ H, когда вы нажмете на них возврат!

...