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

StackOverflow https://stackoverflow.com/questions/69934

  •  09-06-2019
  •  | 
  •  

Вопрос

Мне не удалось заставить Emacs переключаться с 8 пробелов на 4 при нажатии кнопки ВКЛАДКА в буферах с основным режимом 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 файл (или локальные переменные моего буфера) ВКЛАДКА кнопка всегда делает одно и то же.

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

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

Это было полезно?

Решение

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

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

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

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

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

Объяснение:

От Отступы контролируются основным режимом @ emacs вручную:

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

[...]

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

[...]

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

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

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

[...]

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

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

Обновить: Начиная с 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))

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

M-x customize-group

В самом Customize group: запрос ввода indent.

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

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

(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)
(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 есть (новый?) Метод табуляции под названием indent-relative, который, похоже, предназначен для выравнивания табличных данных.Клавиша TAB сопоставляется методу indent-for-tab-command, который вызывает любой метод, на который установлена переменная indent-line-function, которая является методом, зависящим от отступа, для текстового режима.Я не нашел хорошего способа переопределить переменную indent-line-function (хук текстового режима не работает, так что, возможно, он сбрасывается после запуска хуков режима?) но один простой способ избавиться от этого поведения - просто отключить метод intent-for-tab-command, установив TAB в более простой метод tab-to-tab-stop:

(определить текстовый режим ключа-карта (kbd "TAB") 'переход от табуляции к табуляции-стоп)

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

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

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

Вы можете добавить эти строки кода в свой файл .emacs.Это добавляет возможность для текстового режима использовать insert-tab вместо indent-relative .

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

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

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

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

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

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

Лучшие ответы не работали, пока я не написал это в файле .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 tab-width 4)
(setq-default indent-tabs-mode nil)

Кстати, для 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 
               )))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top