Установите 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 всегда делает то же самое.

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

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

Ответ 1

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

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

Ответ 2

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

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

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

Объяснение:

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

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

[...]

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

[...]

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

Из руководства по относительным относительным @emacs:

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

[...]

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

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

Ответ 3

Мне всегда немного больно видеть такие вещи, как (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))

Ответ 4

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

M-x customize-group

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

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

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

Ответ 5

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

Ответ 6

(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

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

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

Ответ 8

Попробуйте следующее:

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

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

Ответ 9

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

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

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

Ответ 10

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

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

Ответ 11

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

Ответ 12

Добавьте это в файл .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)

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

Ответ 13

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

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

Ответ 14

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

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

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

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

M - i

Ответ 15

Настройки могут теневое (setq tab width 4), поэтому либо используйте setq-default, либо пусть Customize знает, что вы делаете. У меня также были проблемы, похожие на 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)

Ответ 16

Вы пробовали

(setq  tab-width  4)

Ответ 17

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

Ответ 19

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

(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")       ; now '_' is not considered a word-delimiter
               (modify-syntax-entry ?- "w")       ; now '-' is not considered a word-delimiter 
               )))