Я хочу переопределить плохую схему табуляции по умолчанию в emacs, чтобы она работала как большинство других редакторов (eclipse, notepad ++). Я хочу настроить его так, чтобы независимо от режима вкладка вставляла вкладку, а нажатие клавиши ввода сохраняло мою текущую глубину вкладки.
Я пробовал это, но ничего не дает:
(global-set-key (kbd "TAB") 'tab-to-tab-stop)
(setq default-tab-width 4) ;; 8 is way too many
Я действительно стремлюсь получить его для всех сред. Меня действительно раздражает, когда он решает, что знает лучше меня, и отказывается позволить мне делать отступы, как мне заблагорассудится. например. в конфигурации apache это позволяет мне вкладка 1, 8 символов и не более того. режим elisp нормален, но несовместим с обычным.
Если он допускает только одну 8-символьную вкладку, исправление состоит в том, чтобы изменить который, изменить то, что является его позициями табуляции. (Или измените функцию отступа.)





C-j выполняет функцию перехода на новую строку + отступ, которую вы хотите отключить при нажатии Enter.
Чтобы клавиша Enter переводила вас на следующую строку и автоматически делала отступ, вы можете поставить
(global-set-key (kbd "RET") 'newline-and-indent)
в вашем .emacs. [Или вы можете нажать C-j вместо Enter.] Как только вы это сделаете, вам никогда не придется вставлять табуляции вручную, потому что Emacs автоматически увеличивает отступ новой строки до дополнительной глубины после открывающей скобки и т. д. отступ, вы можете нажимать TAB, пока он не переместит вас к нужному отступу, а затем начните вводить оттуда. [И когда вы вводите закрывающую скобку, Emacs достаточно умен, чтобы переместить эту скобку на один уровень отступа назад.]
Вы должны удалить (global-set-key (kbd "TAB") 'tab-to-tab-stop), чтобы это работало.
Многие основные режимы отменяют связывание TAB, например, cc-режим связывает TAB с 'c-indent-to-column.
Предлагаемый 'global-set-key ничего не делает, поскольку почти каждый основной режим переопределяет TAB.
Один из приемов, который может сработать для вас, - скопировать подход, который использует 'pabbrev, и определить глобальный второстепенный режим, связанный с TAB. Сделать это можно так:
(defvar just-tab-keymap (make-sparse-keymap) "Keymap for just-tab-mode")
(define-minor-mode just-tab-mode
"Just want the TAB key to be a TAB"
:global t :lighter " TAB" :init-value 0 :keymap just-tab-keymap
(define-key just-tab-keymap (kbd "TAB") 'indent-for-tab-command))
Однако это отключает все завершение TAB. Вы, вероятно, получите лучшие результаты, переопределив каждый из основных режимов один за другим (чтобы избежать путаницы с завершением TAB).
На самом деле очень немногие основные режимы повторно связывают TAB, и еще меньше должны это делать. Вместо этого им следует полагаться на indent-line-function.
Меня это тоже беспокоило, когда я только начал использовать Emacs. Хотя я полюбил это. Если я хочу сделать соответствующий отступ, я нажимаю <tab>;, если я хочу вставить буквальную табуляцию, я нажимаю M-i (Meta и 'i' или <Alt> - <i> на некоторых языках), который привязан к tab-to-tab-stop.
Я думаю, что ответ Трея Джексона, вероятно, то, что вы хотите, за исключением, возможно, использования 'self-insert-command вместо 'indent-for-tab-command. Лично я предпочитаю поведение emacs по умолчанию, но self-insert-command делает то, что он говорит, вместо того, чтобы пытаться делать что-нибудь необычное, например, проверять, правильно ли отформатирован ваш код.
Несколько раз я на самом деле хочу, чтобы вставить табуляцию (а не отступ), я нажимаю M-i.
M-i !!!! Сэр, вы лично спасли меня от запястного канала ... Control-q <TAB> начал сказываться на моей левой руке.
M-i - это tab-to-tab-stop, который вставляет символ табуляции только в том случае, если значение indent-tabs-mode истинно. Однако вам может показаться, что C-q C-i легче набирать, чем C-q TAB (особенно, если у вас есть клавиша Caps Lock, настроенная как клавиша Ctrl).
Возможно, вас заинтересует этот второстепенный режим, который я создал на http://github.com/vohrta/regtab.
Это делает так, что, когда вы нажимаете клавишу табуляции, либо символ табуляции (если indent-tabs-mod не равен nil), либо пробелы ширины табуляции будут помещены в точку. Этот режим также может обрабатывать то, что вы можете считать обычным поведением в области выделенного текста, и использовать сдвиг с табуляцией для удаления табуляции в начале строки (или набора строк).
Вы можете включить или отключить его в любое время, нажав M-x regtab-mode.
Некоторые основные режимы могут отменять это. Не могли бы вы рассказать больше об окружающей среде?