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

Для строки режима C++ или csharp-mode я добавил (setq tab-width 4) (setq c-basic-offset 4) в конец (defun csharp-mode () ...), и это помогло сделать ( 1) вкладки отображаются как 4 вместо 8 символов и (2) когда я нажимаю вкладку, я получаю 4 пробела в новой строке.

Jared Updike 17.07.2009 10:13

Очень поздно, но я только что понял, что использование (setq tab-width 4) не работает, но если вы используете (setq-default tab-width 4), вам больше ничего делать не нужно.

Sambatyon 15.04.2014 10:00

См. Мой ответ, если вы хотите использовать пробелы, но переходите к позициям табуляции.

forkandwait 10.10.2014 02:30

Обратите внимание на других, кто нашел этот вопрос: (setq-default tab-width 4) НЕ то же самое, что (setq tab-width 4), убедитесь, что вы не пропустили "-default"!

zachaysan 24.01.2015 23:03

Не могу поверить, что это так сложно сделать.

gwg 09.12.2017 23:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
161
5
148 267
20
Перейти к ответу Данный вопрос помечен как решенный

Ответы 20

Ты пытался

(setq  tab-width  4)

У них есть это в их вопросе, так что да, можно с уверенностью предположить, что они пробовали это.

ryanpcmcquen 20.02.2017 21:53
Ответ принят как подходящий

Do not confuse variable tab-width with variable tab-stop-list. The former is used for the display of literal TAB characters. The latter controls what characters are inserted when you press the TAB character in certain modes.

- Руководство по GNU Emacs

(customize-variable (quote 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))))

Другой способ изменить поведение вкладки - использовать M-x edit-tab-stops.

См. Руководство GNU Emacs по позициям табуляции для получения дополнительной информации о edit-tab-stops.

Требуются как ширина табуляции, так и стоп-лист табуляции. tab-width используется при ОТОБРАЖЕНИИ вкладок, а tab-stop-list необходим для определения позиций табуляции при ДОБАВЛЕНИИ вкладок.

Michael Ratanapintha 16.09.2008 11:59

Обратите внимание: stackoverflow.com/questions/69934/…

phils 04.05.2012 00:59

Слава богу за этот ответ. В другом месте просто укажите ширина табуляции, который не имеет никакого отношения к количеству вставленных пробелов!

talles 14.08.2014 06:34

Неужели нет ничего короче '(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)))? Ну, пока это работает, я думаю ...: P

HelloGoodbye 30.08.2014 01:29

Согласно документации, вам не нужны все эти должности. Просто сделайте 4 8 12, и он будет распространяться на все остальные (продолжайте добавлять 4). Очевидно, если вы просто используете 1 или 2 элемента вместо 3, он просто будет использовать ширину табуляции в качестве последнего шага. Итак, теоретически, если бы я хотел сделать табуляцию на четыре пробела и моя ширина табуляции была установлена ​​на 4. Я мог бы написать '(tab-stop-list (quote (4))).

Nicholas Peterson 02.11.2016 16:27

@NicholasPeterson, спасибо, что заметили это! Однако может показаться, что на практике quote требуется два числа для продолжения последовательности до бесконечности. См .: stackoverflow.com/a/42148697/2662028

ryanpcmcquen 20.02.2017 21:47

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

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

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

Я думаю, что OP хочет пробелов вместо вкладок (поэтому нажатие Tab вставляет 4 пробела).

mipadi 12.04.2009 04:55

В сочетании с Aquamacs 2.4 этот конкретный ответ дает мне символы на другом языке вместо табуляции: 렔. Если клавиша табуляции нажата более одного раза, результат будет: 렔렔 (без разделения). И то же самое верно для каждого последующего нажатия табуляции.

lawlist 21.04.2013 06:38

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

M-x customize-group

В командной строке Customize group: введите indent.

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

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

Мне нужно вспомнить M-x customize-group - очень удобный ярлык!

Nick Bolton 27.01.2011 18:54

Отступ кажется 4, но все же применяется 2 между \begin{tikzpicture} и \end{tikzpicture}

alper 05.03.2021 01:35

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

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

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

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

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

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

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

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

Объяснение:

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

An important function of each major mode is to customize the key to indent properly for the language being edited.

[...]

The indent-line-function variable is the function to be used by (and various commands, like when calling indent-region) to indent the current line. The command indent-according-to-mode does no more than call this function.

[...]

The default value is indent-relative for many modes.

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

Indent-relative Space out to under next indent point in previous nonblank line.

[...]

If the previous nonblank line has no indent points beyond the column point starts at, `tab-to-tab-stop' is done instead.

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

У меня та же проблема, что и у ОП, ваше решение у меня не работает.

Gauthier 19.04.2010 18:51

Пожалуйста, уточните подробнее. Вы имеете в виду, что использование приведенных выше строк в качестве единственного содержимого вашего .emacs и вызов «M-x indent-согласно-режиму» не приведет к вставке 4 пробелов?

alcortes 07.05.2010 04:46

Вместо того, чтобы переключать функцию indent-line-function с indent-relative на insert-tab, вы можете просто редактировать позиции табуляции с помощью M-x edit-tab-stop. Это приведет к тому, что поведение относительного отступа будет больше похоже на то, что вы, вероятно, хотите.

Ryan M 17.08.2010 18:11

ваша конфигурация вставляет для меня 8 пробелов.

Vladimir Mihailenco 03.06.2011 17:58

Я использую emacs версии 23.3.1, и короткий ответ не меняет его на пробелы. этот ответ вводит в заблуждение.

VNarasimhaM 15.07.2013 23:02

Если это не сработает, убедитесь, что вы работаете в текстовом режиме или режиме программирования и т. д. Это не работает в основном режиме. Режим может автоматически определяться расширением имени файла.

Bruce Barnett 03.01.2014 20:01

@BruceBarnett Я нахожусь в текстовом режиме, и эти инструкции все еще не работают.

sunny 22.05.2015 01:32

Для тех, кто не знает ... Добавьте строки из блока кода, показанного выше, в ~/.emacs. Если у вас нет файла, вы можете просто создать его.

spencer.sm 02.07.2018 04:37

Самый элегантный ответ от человека, который действительно читал руководство.

count0 07.02.2019 03:08

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

kmarsh 14.06.2018 15:39

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

tab-stop-list is now implicitly extended to infinity. Its default value is changed to nil which means a tab stop every tab-width columns.

Это означает, что больше нет необходимости настраивать 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))

Это единственный ответ, который я мог заставить работать в моей системе.

Karpov 05.07.2015 10:40

На странице настройки отступа emacs говорится, что список вкладок «неявно расширяется до бесконечности за счет повторения последнего шага» - что означает, что список (4 8) должен быть достаточно хорошим, без явной числовой последовательности

James Waldby - jwpat7 22.04.2019 18:33

@ JamesWaldby-jwpat7 Действительно, это произошло в 24.4 (2014 г.). NEWS сообщает: «tab-stop-list теперь неявно расширен до бесконечности. Его значение по умолчанию изменено на nil, что означает табуляцию в каждом столбце tab-width». - так что на самом деле вы можете просто использовать значение по умолчанию nil.

phils 23.04.2019 02:36

Отступ кажется 4-м, но emacs применяет 2 пробела между \ begin {tikzpicture} и \ end {tikzpicture}

alper 05.03.2021 01:40

@alper: Функциональность отступов может сильно различаться от режима к режиму - разные языки могут иметь совершенно разные правила и требования. Вам нужно будет прочитать о том, как Emacs конкретно выполняет отступы в LaTeX (я полагаю).

phils 05.03.2021 05:31

У вас есть руководство для начала чтения? Я просто пытался применить отступ в 4 пробела к фрагменту кода примера здесь (tex.stackexchange.com/q/585896/127048); но я перепробовал все ансеры в этой ветке, и все делает 2 пробела независимо от того, что

alper 05.03.2021 14:27

Переменная tex-indent-basic кажется самой важной. Также есть tex-indent-item, tex-indent-item-re, tex-indent-allhanging, latex-noindent-environments, latex-noindent-commands. Очень хорошими первыми шагами всегда являются M-x customize-group для рассматриваемой библиотеки и M-x apropos-variable RET indent\|offset RET.

phils 05.03.2021 17:44

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

Я надеюсь, что это помогает.

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

Это сработало для меня, когда другие на этой странице - нет.

Michael Terry 28.02.2015 00:35

Работает в emacs 26.3

Saurabh 14.04.2020 23:46

(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++ и комментария внутри тоже

Поздно на вечеринку, но спасибо. Я не могу понять, зачем emacs нужны специальные инструкции для применения правил отступов и к коду C / C++. Я буду присматривать за vim в будущем ...

MegaWidget 09.02.2018 06:30

Я хочу задать себе этот вопрос ТОЛЬКО, ЧТОБЫ ПРИНЯТЬ ЭТОТ ОТВЕТ. Я бы наградил его, если бы мог. Я был очень, очень расстроен тем, что изменение привело к тому, что emacs не захотел вкладывать в 4, перебирал все решения на этой странице, и вы сэкономили мне огромное количество работы!

Topological Sort 04.06.2019 00:52

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

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


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

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

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

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

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

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

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

M-i

Настройки могут затенять (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)

Модифицированный этот ответ без какого-либо хука:

(setq-default
  indent-tabs-mode t
  tab-stop-list (number-sequence 4 200 4)
  tab-width 4
  indent-line-function 'insert-tab)

Другие вопросы по теме