Установить 4 пробела в Emacs в текстовом режиме - PullRequest
151 голосов
/ 16 сентября 2008

Мне не удалось заставить Emacs переключаться с 8 пробелов на 4 пробела при нажатии TAB в буферах с основным режимом text-mode. Я добавил следующее к своему .emacs:

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)

;;; And I have tried
(setq indent-tabs-mode nil)
(setq tab-width 4)

Независимо от того, как я изменяю свой .emacs файл (или локальные переменные моего буфера), кнопка TAB всегда делает то же самое.

  1. Если текст выше отсутствует, отступ 8 пробел
  2. Если в предыдущей строке есть текст, отступ в начале второго слова

Насколько я люблю Emacs, это раздражает. Есть ли способ сделать Emacs по крайней мере отступом в 4 пробела, если в предыдущей строке нет текста?

Ответы [ 19 ]

132 голосов
/ 30 ноября 2009

Краткий ответ:

Ключевым моментом является указание emacs вставлять в отступ все, что вы хотите, это делается путем изменения функции indent-line. Проще изменить его, чтобы вставить вкладку, а затем изменить вкладки на 4 пробела, чем изменить их на вставку 4 пробелов. Следующая конфигурация решит вашу проблему:

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)

Пояснение:

С Отступ, управляемый основным режимом @ руководство по emacs :

Важная функция каждого крупного Режим состоит в том, чтобы настроить ключ к правильно сделать отступ для языка отредактированный.

[...]

Переменная indent-line-function равна функция, которая будет использоваться (и различные команды, например, при вызове indent-region) для отступа текущего линия. Команда отступ в соответствии с режимом больше не чем вызвать эту функцию.

[...]

Значением по умолчанию является отступ для многих режимов.

Из руководства по отступу @ emacs:

Относительно отступа относительно нижнего точка отступа на предыдущей непустой линии.

[...]

Если предыдущая непустая строка не имеет точки отступа за точкой столбца начинается с «tab-to-tab-stop» вместо этого.

Просто измените значение indent-line-function на функцию insert-tab и настройте вставку tab как 4 пробела.

65 голосов
/ 04 мая 2012

Обновление: Начиная с Emacs 24.4:

tab-stop-list теперь неявно распространяется на бесконечность. Его значение по умолчанию изменяется на nil, что означает остановку табуляции каждые tab-width столбцов.

, что означает, что больше не нужно настраивать tab-stop-list способом, показанным ниже, так как вы можете сохранить его на nil.

Оригинальный ответ следует ...

<Ч />

Мне всегда немного больно видеть такие вещи, как (setq tab-stop-list 4 8 12 ................), когда функция number-sequence сидит там в ожидании использования.

(setq tab-stop-list (number-sequence 4 200 4))

или

(defun my-generate-tab-stops (&optional width max)
  "Return a sequence suitable for `tab-stop-list'."
  (let* ((max-column (or max 200))
         (tab-width (or width tab-width))
         (count (/ max-column tab-width)))
    (number-sequence tab-width (* tab-width count) tab-width)))

(setq tab-width 4)
(setq tab-stop-list (my-generate-tab-stops))
28 голосов
/ 16 сентября 2008
(customize-variable (quote tab-stop-list))

или добавьте tab-stop-list запись в пользовательские переменные набора в .emacs файл:

(custom-set-variables
  ;; custom-set-variables was added by Custom.
  ;; If you edit it by hand, you could mess it up, so be careful.
  ;; Your init file should contain only one such instance.
  ;; If there is more than one, they won't work right.
 '(tab-stop-list (quote (4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120))))
21 голосов
/ 16 сентября 2008

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

M-x customize-group

В приглашении Customize group: введите indent.

Вы увидите экран, где вы можете установить все параметры отступа и установить их для текущего сеанса или сохранить их для всех будущих сеансов.

Если вы сделаете это таким образом, вы захотите настроить файл настроек .

11 голосов
/ 23 января 2009
(setq tab-width 4)
(setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80))
(setq indent-tabs-mode nil)
9 голосов
/ 25 апреля 2013
(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)
(setq c-default-style "linux") 
(setq c-basic-offset 4) 
(c-set-offset 'comment-intro 0)

это работает для кода C ++ и комментария внутри

9 голосов
/ 21 апреля 2013
(defun my-custom-settings-fn ()
  (setq indent-tabs-mode t)
  (setq tab-stop-list (number-sequence 2 200 2))
  (setq tab-width 2)
  (setq indent-line-function 'insert-tab))

(add-hook 'text-mode-hook 'my-custom-settings-fn)
7 голосов
/ 12 апреля 2009

Эта проблема не вызвана отсутствием табуляции; Дело в том, что в emacs есть метод табуляции (new?), называемый indent -lative, который, кажется, предназначен для выстраивания табличных данных. Клавиша TAB отображается на метод indent-for-tab-command, который вызывает любой метод, на который установлена ​​переменная indent-line-function, который является относительным к отступу методом для текстового режима. Я не нашел хороший способ переопределить переменную indent-line-function (перехват текстового режима не работает, так что, возможно, он сбрасывается после запуска перехватчиков режима?), Но один простой способ избавиться от этого Поведение состоит в том, чтобы просто бросить метод команды intent-for-tab-command, установив TAB на более простой метод tab-to-tab-stop:

(определение ключа-text-mode-map (kbd "TAB") 'tab-to-tab-stop)

6 голосов
/ 29 октября 2012

Вы можете добавить эти строки кода в ваш файл .emacs. Он добавляет ловушку для текстового режима, чтобы использовать вставку-вкладку вместо относительного отступа.

(custom-set-variables
 '(indent-line-function 'insert-tab)
 '(indent-tabs-mode t)
 '(tab-width 4))
(add-hook 'text-mode-hook
      (lambda() (setq indent-line-function 'insert-tab)))

Надеюсь, это поможет.

6 голосов
/ 16 сентября 2008

Попробуйте это:

(add-hook 'text-mode-hook
  (function
   (lambda ()
     (setq tab-width 4)
     (define-key text-mode-map "\C-i" 'self-insert-command)
     )))

Это позволит TAB всегда вставлять буквенный символ TAB с остановками табуляции каждые 4 символа (но только в текстовом режиме). Если это не то, о чем вы просите, опишите, пожалуйста, поведение, которое вы хотели бы видеть.

...