Stellen Sie im Textmodus 4 Leerzeichen in Emacs ein


159

Es ist mir nicht gelungen, Emacs dazu zu bringen, von 8 Leerzeichen-Registerkarten auf 4 Leerzeichen-Registerkarten zu wechseln, wenn die TABIn-Puffer im Hauptmodus gedrückt werden text-mode. Ich habe Folgendes zu meinem hinzugefügt .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)

Egal wie ich meine .emacsDatei (oder die lokalen Variablen meines Puffers) ändere, die TABSchaltfläche macht immer das Gleiche.

  1. Wenn oben kein Text vorhanden ist, rücken Sie 8 Leerzeichen ein
  2. Wenn sich in der vorherigen Zeile Text befindet, rücken Sie am Anfang des zweiten Wortes ein

So sehr ich Emacs liebe, das wird nervig. Gibt es eine Möglichkeit, Emacs auf mindestens 4 Leerzeichen einzurücken, wenn in der vorherigen Zeile kein Text enthalten ist?


Für eine Moduszeile C ++ oder csharp-mode habe ich (setq tab-width 4) (setq c-basic-offset 4) am Ende von (defun csharp-mode () ...) hinzugefügt und es hat den Trick gemacht, um ( 1) Tabulatoren werden als 4 statt 8 Zeichen angezeigt und (2) wenn ich die Tabulatortaste drücke, werden 4 Leerzeichen in einer neuen Zeile angezeigt.
Jared Updike

Sehr spät, aber ich habe gerade festgestellt, dass die Verwendung von (setq tab-width 4) nicht funktioniert, aber wenn Sie (setq-default tab-width 4) verwenden, müssen Sie nichts anderes tun.
Sambatyon

Siehe meine Antwort, wenn Sie Leerzeichen verwenden möchten, aber zu Tabulatoren gehen möchten.
Forkandwait

Hinweis für andere, die diese Frage gefunden haben: Ist (setq-default tab-width 4)NICHT dasselbe wie (setq tab-width 4)sicher zu gehen, dass Sie den "-Standard" nicht verpasst haben!
Zachaysan

10
Ich kann nicht glauben, dass dies so schwierig ist.
GWG

Antworten:


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

oder fügen Sie den benutzerdefinierten Variablen in der .emacs- Datei einen Tab-Stop-List- Eintrag hinzu :

(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
Es werden sowohl die Tab-Breite als auch die Tab-Stop-Liste benötigt. Die Tabulatorbreite wird beim ANZEIGEN von Tabulatoren verwendet, während die Tabulatorstoppliste benötigt wird, um Tabulatorstopps beim Hinzufügen von Tabulatoren zu bestimmen.
Michael Ratanapintha


5
Gibt es wirklich nichts kürzeres als '(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)))? Nun, solange es funktioniert, denke ich ...: P
HelloGoodbye

5
Laut Dokumentation benötigen Sie nicht alle diese Positionen. Tun Sie einfach 4 8 12 und das wird sich auf alle anderen erstrecken (fügen Sie weitere 4 hinzu). Wenn Sie nur 1 oder 2 Elemente anstelle von 3 verwenden, wird anscheinend nur die Tabulatorbreite als letzter Schritt verwendet. Wenn ich also theoretisch um vier Leerzeichen tippen wollte und meine Tab-Breite auf 4 gesetzt war, konnte ich schreiben '(tab-stop-list (quote (4))).
Nicholas Peterson

1
@NicholasPeterson, danke, dass du das bemerkt hast! Es scheint jedoch, dass in der Praxis quotezwei Zahlen benötigt werden, um die Sequenz ad infinitum fortzusetzen. Siehe: stackoverflow.com/a/42148697/2662028
ryanpcmcquen

138

Kurze Antwort:

Der wichtigste Punkt ist, emacs anzuweisen, beim Einrücken alles einzufügen, was Sie wollen. Dies erfolgt durch Ändern der Einrückungslinienfunktion. Es ist einfacher, es zu ändern, um eine Registerkarte einzufügen, und dann die Registerkarten in 4 Leerzeichen zu ändern, als es zu ändern, um 4 Leerzeichen einzufügen. Die folgende Konfiguration löst Ihr Problem:

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

Erläuterung:

Aus dem vom Major Mode @ emacs-Handbuch gesteuerten Einzug :

Eine wichtige Funktion jedes Hauptmodus besteht darin, die Taste so anzupassen, dass sie für die zu bearbeitende Sprache richtig eingerückt wird.

[...]

Die Variable für die Einrückungszeilenfunktion ist die Funktion, die von (und verschiedenen Befehlen, z. B. beim Aufrufen der Einrückungsregion) zum Einrücken der aktuellen Zeile verwendet wird. Der Befehl Einzug nach Modus ruft nur diese Funktion auf.

[...]

Der Standardwert ist für viele Modi einrückungsrelativ.

Aus dem indent-relative @ emacs-Handbuch:

Einzugsrelativer Abstand bis unter den nächsten Einrückungspunkt in der vorherigen nicht leeren Zeile.

[...]

Wenn die vorherige nicht leere Linie keine Einrückungspunkte hat, die über den Spaltenpunkt hinaus beginnen, wird stattdessen "Tab-to-Tab-Stop" ausgeführt.

Ändern Sie einfach den Wert der Einrückungslinienfunktion in die Funktion zum Einfügen von Registerkarten und konfigurieren Sie das Einfügen von Registerkarten als 4 Leerzeichen.


10
Ich habe das gleiche Problem wie das OP, Ihre Lösung funktioniert bei mir nicht.
Gauthier

Bitte erläutern Sie weiter. Meinen Sie damit, dass die Verwendung der obigen Zeilen als einziger Inhalt Ihrer .emacs und der Aufruf von "Mx indent-to-mode" keine 4 Leerzeichen einfügt?
Alcortes

3
Ihre Konfiguration fügt 8 Leerzeichen für mich ein.
Vladimir Mihailenco

4
Ich verwende Emacs Version 23.3.1 und die kurze Antwort ändert es nicht in Leerzeichen. Diese Antwort ist irreführend.
VNarasimhaM

2
@BruceBarnett Ich bin im Textmodus und diese Anweisungen funktionieren immer noch nicht.
sonnig

66

Update: Seit Emacs 24.4:

tab-stop-listwird nun implizit auf unendlich erweitert. Der Standardwert wird geändert, nilwas bedeutet, dass alle tab-widthSpalten mit einem Tabulator versehen werden .

Dies bedeutet, dass keine Einstellungen mehr tab-stop-listauf die unten gezeigte Weise erforderlich sind, da Sie diese Einstellung beibehalten können nil.

Die ursprüngliche Antwort folgt ...


Es schmerzt mich immer leicht, Dinge zu sehen, wie (setq tab-stop-list 4 8 12 ................)wenn die number-sequenceFunktion dort sitzt und darauf wartet, verwendet zu werden.

(setq tab-stop-list (number-sequence 4 200 4))

oder

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

Dies ist die einzige Antwort, die ich bekommen könnte, um an meinem System zu arbeiten.
Karpov

emacs indent customize page sagt, dass die Tab-Liste "implizit durch Wiederholung des letzten Schritts bis ins Unendliche reicht" - was bedeutet, dass eine Liste (4 8) ohne explizite Nummernfolge gut genug sein sollte
James Waldby - jwpat7

@ JamesWaldby-jwpat7 In der Tat geschah dies in 24.4 (2014). NEWS sagt: " tab-stop-listwird jetzt implizit auf unendlich erweitert. Der Standardwert wird auf null geändert, was bedeutet, dass alle tab-widthSpalten mit einem Tabulator versehen werden ." - Sie können also einfach den Standardwert von verwenden nil.
Phils

21

Möglicherweise ist es einfacher, Ihre Registerkarten wie folgt einzurichten:

M-x customize-group

Customize group:Geben Sie an der Eingabeaufforderung ein indent.

Sie sehen einen Bildschirm, in dem Sie alle Einrückungsoptionen festlegen und für die aktuelle Sitzung festlegen oder für alle zukünftigen Sitzungen speichern können.

Wenn Sie dies auf diese Weise tun, möchten Sie eine Anpassungsdatei einrichten .


Ich muss mich an Mx customize-group erinnern - eine sehr praktische Verknüpfung!
Nick Bolton

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)

Dies funktionierte für mich, als andere auf dieser Seite dies nicht taten.
Michael Terry

Arbeitet in 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)

Dies funktioniert auch für C ++ - Code und den darin enthaltenen Kommentar


Spät zur Party, aber danke. Ich kann mir nicht vorstellen, warum Emacs spezielle Anweisungen benötigen, um ihre Einrückungsregeln auch auf C / C ++ - Code anzuwenden. Ich werde in Zukunft vim beobachten ...
MegaWidget

Ich möchte diese Frage selbst stellen, damit ich diese Antwort annehmen kann. Ich würde es ein Kopfgeld geben, wenn ich könnte. Ich war sehr, sehr verärgert darüber, dass eine Änderung dazu führte, dass Emacs nicht bereit waren, bei 4 zu tippen, alle Lösungen auf dieser Seite durchging und Sie mir eine enorme Menge Arbeit erspart haben!
Topologische Sortierung

7

Dieses Problem wird nicht durch fehlende Tabulatoren verursacht. Emacs hat eine (neue?) Tab-Methode namens Indent-Relative, die darauf ausgelegt zu sein scheint, Tabellendaten auszurichten. Die TAB-Taste ist der Methode indent-for-tab-command zugeordnet, die die Methode aufruft, auf die die Variable indent-line-function eingestellt ist. Dies ist eine einrückungsrelative Methode für den Textmodus. Ich habe keinen guten Weg gefunden, um die Einrückungsfunktionsvariable zu überschreiben (Textmodus-Hook funktioniert nicht, also wird er möglicherweise zurückgesetzt, nachdem die Mode-Hooks ausgeführt wurden?), Aber einen einfachen Weg, dies zu beseitigen Das Verhalten besteht darin, nur die Intent-for-Tab-Befehlsmethode zu verwenden, indem TAB auf die einfachere Tab-to-Tab-Stop-Methode gesetzt wird:

(Define-Key-Textmodus-Map (kbd "TAB") 'Tab-to-Tab-Stop)


6

Versuche dies:

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

Dadurch fügt TAB immer alle 4 Zeichen ein wörtliches TAB-Zeichen mit Tabulatoren ein (jedoch nur im Textmodus). Wenn Sie nicht danach fragen, beschreiben Sie bitte das Verhalten, das Sie sehen möchten.


4
Ich denke, das OP möchte Leerzeichen anstelle von Tabulatoren (wenn Sie also die Tabulatortaste drücken, werden 4 Leerzeichen eingefügt).
Mipadi

In Verbindung mit Aquamacs 2.4 gibt mir diese spezielle Antwort Zeichen in einer anderen Sprache anstelle eines Tabulators: 렔. Wenn die Tabulatortaste mehrmals gedrückt wird, lautet das Ergebnis: 렔렔 (ohne Trennung). Gleiches gilt für jeden aufeinanderfolgenden Tab-Druck.
Lawlist

6

Sie können diese Codezeilen zu Ihrer .emacs-Datei hinzufügen. Es wird ein Hook für den Textmodus hinzugefügt, um die Registerkarte "Einfügen" anstelle von "Einzug relativ" zu verwenden.

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

Ich hoffe, es hilft.



4

Fügen Sie dies Ihrer .emacs-Datei hinzu:

Dadurch wird die Breite, in der eine Registerkarte angezeigt wird, auf 2 Zeichen festgelegt (ändern Sie die Nummer 2 nach Ihren Wünschen).

(setq default-tab-width 2)

So stellen Sie sicher, dass emacs tatsächlich Tabulatoren anstelle von Leerzeichen verwendet:

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

Abgesehen davon besteht die Standardeinstellung für Emacs beim Zurücksetzen über eine Registerkarte darin, sie in Leerzeichen zu konvertieren und dann ein Leerzeichen zu löschen. Das kann ärgerlich sein. Wenn Sie möchten, dass nur die Registerkarte gelöscht wird, können Sie Folgendes tun:

(setq c-backspace-function 'backward-delete-char)

Genießen!


Erfüllt nicht die mindestens 4 Leerzeichen in der Frage.
kmarsh

2

Dies ist die einzige Lösung, die verhindert, dass ein Tab jemals für mich eingefügt wird, ohne dass eine Reihenfolge oder Konvertierung von Tabs in Leerzeichen erfolgt. Beides schien angemessen, aber verschwenderisch:

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

Beachten Sie, dass quotezwei Zahlen benötigt werden, um zu funktionieren (aber nicht mehr!).

In den meisten Hauptmodi ( Pythonzum Beispiel) erfolgt die Einrückung in Emacs automatisch. Wenn Sie außerhalb des automatischen Einzugs einrücken müssen, verwenden Sie:

M- -i


2

Anpassungen können Schatten verwenden, (setq tab width 4)also entweder verwenden setq-defaultoder Customize wissen lassen, was Sie tun. Ich hatte auch ähnliche Probleme wie das OP und habe es allein damit behoben, musste keine Anpassungen vornehmen tab-stop-listoder irgendwelche insertFunktionen:

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

Fand es nützlich, dies sofort danach hinzuzufügen (ein Tipp von emacsWiki):

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

1

Die besten Antworten haben nicht funktioniert, bis ich dies in die .emacs-Datei geschrieben habe:

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

0

Hast du es versucht

(setq  tab-width  4)

2
Sie haben dies in ihrer Frage, also ist es sicher anzunehmen, dass sie es versucht haben.
Ryanpcmcquen

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


0

Anders als in meiner Init-Datei, weil ich Leerzeichen anstelle von Tabulatoren wollte:

(Add-Hook 'SQL-Mode-Hook
          (Lambda ()
             (Prognose
               (setq-default tab-width 4)
               (setq indent-tabs-mode nil)
               (setq indent-line-function 'Tab-to-Tab-Stop) 
               (Änderungs-Syntax-Eintrag? _ "w"); jetzt wird '_' nicht als Worttrennzeichen betrachtet
               (Änderungs-Syntax-Eintrag? - "w"); jetzt wird '-' nicht als Worttrennzeichen betrachtet
               )))

0

Diese Antwort ohne Haken geändert :

(setq-default
  indent-tabs-mode t
  tab-stop-list (number-sequence 4 200 4)
  tab-width 4
  indent-line-function 'insert-tab)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.