it-swarm-ru.tech

Установить 4 пробела в Emacs в текстовом режиме

Мне не удалось заставить 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 пробела, если в предыдущей строке нет текста?

152
Cristian
(customize-variable (quote tab-stop-list))

или добавьте tab-stop-list запись в custom-set-variable в . 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))))
28
Bert F

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

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

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

Объяснение:

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

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

[...]

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

[...]

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

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

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

[...]

Если предыдущая непустая строка не имеет точек отступа, начиная с точки, начинающейся в столбце, вместо нее выполняется `tab-to-tab-stop '.

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

132
alcortes

Обновление: Начиная с 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))
65
phils

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

M-x customize-group

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

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

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

21
Dave Webb
(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)
11
Yan Li
(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
user2318996
(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)
9
lawlist

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

(define-key text-mode-map (kbd "TAB") 'tab-to-tab-stop)

7
Glenn

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

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

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

6
cjm

Вы можете добавить эти строки кода в ваш файл .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
gigilibala

Добавьте это в ваш файл .emacs:

Это установит ширину отображаемой вкладки в 2 символа (измените число 2 на то, что вы хотите)

(setq default-tab-width 2)

Чтобы убедиться, что emacs использует табуляции вместо пробелов:

(global-set-key (kbd "TAB") 'self-insert-command)

Кроме того, по умолчанию для Emacs при возврате по вкладке является преобразование его в пробелы, а затем удаление пробела. Это может раздражать. Если вы хотите просто удалить вкладку, вы можете сделать это:

(setq c-backspace-function 'backward-delete-char)

Наслаждайтесь!

4
qwerty9967

Мне было достаточно просто изменить стиль с помощью c-set-style.

4
dividebyzero

Настройки могут скрывать (setq tab width 4), поэтому либо используйте setq-default, либо сообщите Настройке, что вы делаете. У меня также были проблемы, аналогичные OP, и я решил их с помощью одного, не нужно было настраивать tab-stop-list или какие-либо функции insert:

(custom-set-variables
 '(tab-width 4 't)
 )

Было полезно добавить это сразу после (совет от emacsWiki):

(defvaralias 'c-basic-offset 'tab-width)
(defvaralias 'cperl-indent-level 'tab-width)
2
Yary

Лучшие ответы не работали, пока я не написал это в файле .emacs:

(global-set-key (kbd "TAB") 'self-insert-command)
1
user1009285

Это единственное решение, которое предотвращает вставку вкладок для меня, без последовательности или преобразования вкладок в пробелы. Оба из них казались адекватными, но расточительными:

(setq-default
    indent-tabs-mode nil
    tab-width 4
    tab-stop-list (quote (4 8))
)

Обратите внимание, что для работы quote нужны два числа (но не больше!).

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

M-i

1
ryanpcmcquen

Из моего файла инициализации отличается, потому что я хотел пробелы вместо вкладок:

 
 (add-hook 'sql-mode-hook 
 (lambda () 
 (progn 
 (setq-default tab-width 4) 
 (setq indent-tabs-mode nil) 
 (setq indent-line-function 'tab-to-tab-stop) 
 (modify-syntax-entry? _ "w "); теперь '_' не считается разделителем слов 
 (modify-syntax-entry? -" w "); теперь '-' не считается разделителем слов 
)) ) 
0
forkandwait

Ты пытался

(setq  tab-width  4)
0
GrokCode

Кстати, для C-режима я добавляю (setq-default c-basic-offset 4) в. Emacs. Смотрите http://www.emacswiki.org/emacs/IndentingC для подробностей.

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