Подтвердить что ты не робот

Как отключить альтернативный Enter с помощью Ctrl + M в Linux

Почему Ctrl + M привязана для входа в Ubuntu Jaunty? Как отключить его?

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

4b9b3361

Ответ 1

Я думаю, что ваш вопрос обратный. Это не 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 Enter, вы увидите что-то вроде "RET (translated from <return>) runs the command ...". См., Enter интерпретируется emacs как <return> и затем этот ключ переводится на C-m.

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

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

Ответ 2

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

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

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

Попробуйте C-h k <return>, и вы увидите

RET (перевод с <return> )

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

Поучительно играть со следующим кодом:

(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 после каждой строки (чтобы оценить sexp). Затем играйте с помощью клавиш Enter/Return и C-m.

Ответ 3

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])

Ответ 4

(глобальный набор-ключ (kbd "C-m" ) 'cmd);

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

Как для ctrl + m обязательно ввести. Я считаю, что это как-то связано с какой-то старой клавиатурой, не имеющей ввода, вкладки, backspace и т.д. (Я мог бы грубо ошибиться)

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

Ответ 5

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

Ответ 6

Неясно, разрешили ли предыдущие ответы этот вопрос, так что здесь на него снова накручивается:

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

Цитата wikipedia:

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

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

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

RET runs the command newline

Если я набираю вместо C-h c C-m (т.е. удерживая управление и нажав M), я получаю:

RET runs the command newline

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

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

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

  • Live, не имея C-m, означает что-то другое, чем return/enter

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

Ответ 7

Собственно, это очень сложный вопрос, с которым вы не справитесь: (глобальная-set-key (kbd "") 'новая строка)

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

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

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

Ответ 8

Некоторые очень хорошие объяснения здесь в отношении характера проблемы, и я не буду излагать эти проблемы. Однако я хочу напрямую обратиться к первому вопросу. Я решил проблему для изменения последовательности (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)