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

160

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

Cristian
источник
Для строки режима C ++ или csharp-mode я добавил (setq tab-width 4) (setq c-basic-offset 4) в конец (defun csharp-mode () ...), и это помогло сделать ( 1) табуляция отображается как 4 вместо 8 символов и (2) когда я нажимаю вкладку, я получаю 4 пробела в новой строке.
Джаред Апдайк
Очень поздно, но я только что понял, что использование (setq tab-width 4) не работает, но если вы используете (setq-default tab-width 4), вам больше ничего не нужно делать.
Самбатйон
Смотрите мой ответ, если вы хотите использовать пробелы, но перейдите на табуляции.
форкэнд в ожидании
Примечание для других, которые нашли этот вопрос: (setq-default tab-width 4)это не то же самое, что (setq tab-width 4)быть уверенным, что вы не пропустили "-дефо"!
Зачайсан
10
Я не могу поверить, что это так сложно сделать.
GWG

Ответы:

30
(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))))
Берт F
источник
9
Нужны и tab-width, и tab-stop-list. Ширина табуляции используется при отображении вкладок, в то время как список табуляций необходим для определения позиций табуляции при добавлении вкладок.
Майкл Ратанапинта
3
Обратите внимание, что stackoverflow.com/questions/69934/…
phils
5
Неужели нет ничего короче '(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
5
Согласно документации, вам не нужны все эти позиции. Просто сделайте 4 8 12, и он распространится на все остальные (продолжайте добавлять 4). Очевидно, что если вы просто используете 1 или 2 элемента вместо 3, он будет использовать ширину табуляции в качестве последнего шага. Таким образом, теоретически, если бы я хотел табулировать четырьмя пробелами, а моя ширина табуляции была установлена ​​на 4. Я мог написать '(tab-stop-list (quote (4))).
Николас Петерсон
1
@NicholasPeterson спасибо, что заметили это! Казалось бы, однако, что на практике quoteнужны два числа, чтобы продолжить последовательность до бесконечности. См .: stackoverflow.com/a/42148697/2662028
ryanpcmcquen
138

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

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

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

Объяснение:

Из отступа, управляемого основным режимом @ emacs manual :

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

[...]

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

[...]

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

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

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

[...]

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

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

alcortes
источник
10
У меня та же проблема, что и у ОП, ваше решение у меня не работает.
Готье
Пожалуйста, уточните дальше. Вы имеете в виду, что использование приведенных выше строк в качестве единственного содержимого вашего .emacs и вызов «Mx indent-based-to-mode» не вставят 4 пробела?
alcortes
3
ваша конфугурация вставляет 8 пробелов для меня.
Владимир Михайленко
4
Я использую emacs версии 23.3.1, и короткий ответ не меняет его на пробелы. этот ответ вводит в заблуждение.
VNarasimhaM
2
@BruceBarnett Я в текстовом режиме, и эти инструкции до сих пор не работают.
солнечно
66

Обновление: начиная с 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))
Phils
источник
Это единственный ответ, который я смог получить на моей системе.
Карпов
Emacs отступы страница подгоняет говорит список Вкладка «неявно простирается до бесконечности через повторение последнего шага» - что означает список (4 : 8) должно быть достаточно хорошим, без явного номера последовательности
James Waldby - jwpat7
@ JamesWaldby-jwpat7 Действительно, это произошло в 24.4 (2014). NEWS говорит: « tab-stop-listтеперь неявно расширяется до бесконечности. Его значение по умолчанию изменяется на ноль, что означает остановку табуляции в каждом tab-widthстолбце». - так что на самом деле вы можете просто использовать значение по умолчанию nil.
phils
21

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

M-x customize-group

По Customize group:подсказке введите indent.

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

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

Дэйв Уэбб
источник
Мне нужно запомнить Mx customize-group - очень удобный ярлык!
Ник Болтон
11
(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)

источник
10
(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)
lawlist
источник
Это сработало для меня, когда другие на этой странице не сделали.
Майкл Терри
Работает в emacs26.3
Saurabh
9
(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 ++ и комментария внутри тоже

user2318996
источник
Поздно на вечеринку, но спасибо. Я не могу понять, почему в emacs потребуются специальные инструкции для применения правил отступа к коду C / C ++. Я буду следить за Vim в будущем ...
MegaWidget
Я хочу задать этот вопрос сам, просто, чтобы я мог принять этот ответ. Я бы дал ему награду, если бы мог. Я был очень, очень расстроен, что изменение, сделанное emacs, не желающим переходить на вкладку 4, проходило через все решения на этой странице, и вы сэкономили мне огромное количество работы!
Топологическая сортировка
7

Эта проблема не вызвана отсутствием табуляции; Дело в том, что в 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)


источник
6

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

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

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

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

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

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

gigilibala
источник
4

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

dividebyzero
источник
4

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

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

qwerty9967
источник
Не соответствует как минимум 4 пробелам в вопросе.
Кмарш
2

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

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

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

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

M-i

ryanpcmcquen
источник
2

Настройки могут быть теневыми, (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)
Yary
источник
1

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

(global-set-key (kbd "TAB") 'self-insert-command)
user1009285
источник
0

Ты пробовала

(setq  tab-width  4)

источник
2
У них есть это в их вопросе, так что да, можно с уверенностью предположить, что они попробовали это.
ryanpcmcquen
0
(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
Dason
источник
0

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

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

Модифицировал этот ответ без всякого хука:

(setq-default
  indent-tabs-mode t
  tab-stop-list (number-sequence 4 200 4)
  tab-width 4
  indent-line-function 'insert-tab)
Саурабх
источник