Встановіть 4 космічні відступи в Emacs у текстовому режимі


159

Мені не вдалося змусити 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 я додав (setq-ширина вкладки 4) (setq c-basic-offset 4) до кінця (defun csharp-mode () ...), і це зробило трюк ( 1) вкладки показують як 4 замість 8 символів і (2), коли я натискаю вкладку, я отримую 4 пробіли в новому рядку.
Jared Updike

Дуже пізно, але я просто зрозумів, що використання (setq-ширина вкладки 4) не працює, але якщо ви використовуєте (setq-типова ширина вкладки 4), вам більше нічого не потрібно робити.
Самбатіон

Дивіться мою відповідь, якщо ви хочете використовувати пробіли, але перейдіть до зупинок вкладок.
forkandwait

Зверніть увагу на інших, хто знайшов це питання: (setq-default tab-width 4)НЕ те саме, що (setq tab-width 4)будьте впевнені, що ви не пропустили "-default"!
зачаян

10
Я не можу повірити, що це так важко зробити.
gwg

Відповіді:


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

9
Потрібні як ширина вкладки, так і список зупинок. Ширина вкладки використовується під час вкладки DISPLAYING, тоді як список зупинок табуляцій потрібен для визначення зупинок вкладки під час додавання вкладок.
Майкл Ратанапінта

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потрібні два числа для продовження послідовності ad infinitum. Див: stackoverflow.com/a/42148697/2662028
ryanpcmcquen

138

Коротка відповідь:

Ключовий момент - сказати emacs вставляти все, що ви хочете під час відступу, це робиться шляхом зміни функції відступу-рядка. Його легше змінити, щоб вставити вкладку, а потім змінити вкладки на 4 проміжки, ніж змінити, щоб вставити 4 пробіли. Наступна конфігурація вирішить вашу проблему:

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

Пояснення:

З поглиблення, керованого головним режимом @ посібник emacs :

Важливою функцією кожного головного режиму є налаштування ключа для відступу належним чином для мови, що редагується.

[...]

Змінна функція відступ-рядок - це функція, яка використовується (і різними командами, наприклад, при виклику регіону відступу) для відступу поточного рядка. Командний відступ відповідно до режиму не більше, ніж викликає цю функцію.

[...]

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

З посібника з відновлення відступу @ emacs:

Відступ проміжків відпадає під наступну точку відступу в попередньому непустому рядку.

[...]

Якщо в попередньому непустому рядку немає відступів, окрім пункту стовпця, починається з пункту "замість табуляції до вкладки".

Просто змініть значення функції відступів рядка на функцію вставки-вкладки та налаштуйте вкладку вкладки як 4 пробіли.


10
У мене така ж проблема, як у ОП, ваше рішення не працює для мене.
Готьє

Будь ласка, докладніше. Ви маєте на увазі, що використання вищезазначених рядків як єдиного вмісту ваших .emacs та виклику "Mx відступ відповідно до режиму" не вставить 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))

Це єдина відповідь, яку я міг би працювати над своєю системою.
Карпов

Emacs відступи сторінка підганяє каже список Вкладка «неявно тягнеться до нескінченності через повторення останнього кроку» - що означає список (4 : 8) має бути досить хорошим, без явного номера послідовності
James Waldby - jwpat7

@ JamesWaldby-jwpat7 Дійсно, це сталося 24.4 (2014). НОВИНИ говорять: " tab-stop-listтепер неявно поширюється на нескінченність. Її значення за замовчуванням змінюється на нульове, що означає вкладку зупинки всіх tab-widthстовпців." - тому насправді ви можете просто використовувати значення за замовчуванням nil.
філс

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)

Це працювало для мене, коли інші на цій сторінці цього не робили.
Майкл Террі

Працює в emacs26.3
Саурах

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 ++ і коментаря всередині


Пізно на вечірку, але дякую. Я не можу зрозуміти, чому Emacs потребує конкретних інструкцій, щоб застосувати свої правила відступу також до коду C / C ++. Я буду придивлятися до vim у майбутньому ...
MegaWidget

Я хочу сам поставити це запитання, ЩО ТАК Я МОЖУ ПРИЙМИТИ ЦЕЙ ВІДПОВІДЬ. Я б віддавав це щедро, якби міг. Мене дуже-дуже засмутило, що зміни, які внесли emacs, не бажаючи вкладки на 4, переглядали всі рішення на цій сторінці, і ти врятував мені величезну кількість роботи!
Топологічне сортування

7

Ця проблема не викликана відсутніми зупинками вкладок; це те, що Emacs має метод (новий?) на вкладці, який називається відносним відступом, який, здається, призначений для вирівнювання табличних даних. Ключ TAB відображається в методі indent-for-tab-command, який викликає будь-який метод, для якого встановлена ​​функція змінної відступ-рядок, що є відносним відступом методом для текстового режиму. Я не з'ясував хорошого способу переопрацювання змінної функції відступів (гачок текстового режиму не працює, тому, можливо, вона скидається після запуску гаків режиму?), Але один простий спосіб позбутися цього поведінка полягає в тому, щоб просто зафіксувати метод команд "наміром для вкладки", встановивши TAB на більш простий метод "вкладка-зупинка":

(defini-key text-mode-map (kbd "TAB") "вкладка до вкладки"


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 символи (але лише в текстовому режимі). Якщо ви цього не просите, опишіть поведінку, яку ви хотіли б бачити.


4
Я думаю, що ОП хоче пробіли замість вкладок (тому натискання Tab вставляє 4 пробіли).
mipadi

У поєднанні з 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)))

Я сподіваюся, що це допомагає.



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)

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


Не відповідає принаймні 4 проміжкам, поставленим у запитанні.
кмарш

2

Це єдине рішення, яке не дозволяє мені вставляти вкладку без послідовності та перетворення вкладок у пробіли. Обидва вони здавалися адекватними, але марнотратними:

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

Зверніть увагу, що quoteдля роботи потрібні два числа (але не більше!).

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

M-i


2

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

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

Було корисно додати це відразу після (порада від emacsWiki):

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

1

Найкращі відповіді не спрацювали, поки я не написав це у файл .emacs:

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

0

Ти намагався

(setq  tab-width  4)

2
Вони мають це у своєму питанні, так що так, можна впевнено припустити, що вони спробували це.
ryanpcmcquen



0

З мого файлу init, іншого, тому що я хотів пробіли замість вкладок:

(додавання-гачок 'sql-mode-гак
          (лямбда ()
             (прогн
               (setq-типова ширина вкладки 4)
               (setq відступ-вкладки-режим нульовий)
               (setq відступ-рядок-функція 'табуляція до вкладки-стоп') 
               (modify-syntax-entry? _ "w"); тепер '_' не вважається розділювачем слова
               (modify-syntax-entry? - "w"); тепер '-' не вважається розділювачем слова
               )))

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.