it-swarm-eu.dev

Stellen Sie in Emacs im Textmodus 4 Leerzeichen ein

Es ist mir nicht gelungen, Emacs dazu zu bringen, beim Drücken der Taste von 8 Leerzeichen auf 4 Leerzeichen umzuschalten TAB in Puffern mit dem Hauptmodus text-mode. Ich habe meinem .emacs Folgendes hinzugefügt:

(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 .emacs - Datei (oder die lokalen Variablen meines Puffers) ändere TAB Taste macht immer das gleiche.

  1. Befindet sich kein Text darüber, rückt 8 Leerzeichen ein
  2. Wenn sich in der vorherigen Zeile Text befindet, rücken Sie ihn an den Anfang des zweiten Wortes ein

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

154
Cristian
(customize-variable (quote tab-stop-list))

oder füge tab-stop-list eintrag zu custom-set-variables in .emacs datei 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))))
28
Bert F

Kurze Antwort:

Der entscheidende Punkt ist, Emacs anzuweisen, beim Einrücken einzufügen, was immer Sie wollen. Dies geschieht durch Ändern der Einrückungslinienfunktion. Es ist einfacher, es zu ändern, um einen Tabulator einzufügen und dann Tabulatoren 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:

From Einzug gesteuert durch Major Mode @ emacs manual :

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

[...]

Die Indent-Line-Funktionsvariable ist die Funktion, die von (und verschiedenen Befehlen, wie beim Aufrufen von Indent-Region) zum Einrücken der aktuellen Zeile verwendet wird. Der Befehl indent-according-to-mode ruft diese Funktion lediglich auf.

[...]

Der Standardwert ist für viele Modi relativ zum Einzug.

Aus dem indent-relative @ emacs-Handbuch:

Relativer Einzug Abstand bis unter den nächsten Einzugspunkt in der vorherigen nicht leeren Linie.

[...]

Wenn die vorherige nicht leere Linie keine Einrückungspunkte hat, die über den Spaltenpunkt hinausgehen, wird stattdessen "Tab-zu-Tab-Stopp" ausgeführt.

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

133
alcortes

pdate: Seit Emacs 24.4:

tab-stop-list Ist jetzt implizit auf unendlich erweitert. Der Standardwert wird in nil geändert, was bedeutet, dass alle tab-width - Spalten durch einen Tabulator gestoppt werden.

das bedeutet, dass es nicht länger erforderlich ist, tab-stop-list wie unten gezeigt einzustellen, da Sie es auf nil setzen können.

Originalantwort folgt ...


Es schmerzt mich immer ein wenig, Dinge wie (setq tab-stop-list 4 8 12 ................) Zu sehen, wenn die Funktion number-sequence Dort sitzt und darauf wartet, benutzt 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))
64
phils

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

M-x customize-group

Bei der Customize group: Eingabeaufforderung indent eingeben.

Es wird ein Bildschirm angezeigt, in dem Sie alle Einrückoptionen 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 .

21
Dave Webb
(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)
11
Yan Li
(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 für C++ - Code und den darin enthaltenen Kommentar

9
user2318996
(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)
9
lawlist

Dieses Problem wird nicht durch fehlende Tabulatoren verursacht. Es ist so, dass Emacs eine (neue?) Tab-Methode namens Indent-Relative hat, die dafür gedacht zu sein scheint, tabellarische Daten auszurichten. Die TAB-Taste ist der Methode indent-for-tab-command zugeordnet, die die Methode aufruft, auf die die Variable indent-line-function gesetzt ist. Dies ist die indent-relative Methode für den Textmodus. Ich habe keine gute Möglichkeit gefunden, die Indent-Line-Funktionsvariable zu überschreiben (Textmodus-Hook funktioniert nicht, wird also möglicherweise zurückgesetzt, nachdem die Mode-Hooks ausgeführt wurden?), Aber eine einfache Möglichkeit, dies zu beheben Das Verhalten besteht darin, die Intent-for-Tab-Befehlsmethode durch Setzen von TAB auf die einfachere Tab-to-Tab-Stop-Methode zu verwerfen:

(Definiere-Taste-Text-Modus-Map (kbd "TAB") 'Tab-zu-Tab-Stop)

7
Glenn

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 ein literales TAB-Zeichen mit Tabstopps alle 4 Zeichen ein (jedoch nur im Textmodus). Wenn Sie nicht danach fragen, beschreiben Sie bitte das Verhalten, das Sie sehen möchten.

6
cjm

Sie können diese Codezeilen zu Ihrer .emacs-Datei hinzufügen. Es wird ein Hook für den Textmodus hinzugefügt, um die Einfügetabelle anstelle der Einrückung 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.

6
gigilibala

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

Dadurch wird die Breite, in der eine Registerkarte angezeigt wird, auf 2 Zeichen festgelegt (ändern Sie die Zahl 2 in eine beliebige Zahl).

(setq default-tab-width 2)

So stellen Sie sicher, dass emacs 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 nur die Registerkarte löschen möchten, können Sie dies tun:

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

Genießen!

4
qwerty9967

Es hat mir gereicht, den Stil mit c-set-style zu ändern.

4
dividebyzero

Anpassungen können (setq tab width 4) Schattieren. Verwenden Sie also entweder setq-default Oder lassen Sie Customize wissen, was Sie tun. Ich hatte auch ähnliche Probleme wie das OP und behebte dieses Problem. Ich musste weder tab-stop-list Noch insert Funktionen anpassen:

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

Es hat sich als nützlich erwiesen, dies unmittelbar nach (ein Tipp von emacsWiki) hinzuzufügen:

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

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

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

Dies ist die einzige Lösung, die verhindert, dass jemals ein Tabulator für mich eingefügt wird, ohne dass eine Sequenz oder Umwandlung von Tabulatoren in Leerzeichen erforderlich ist. Beides schien angemessen, aber verschwenderisch:

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

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

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

M-i

1
ryanpcmcquen

Aus meiner Init-Datei, anders, weil ich Leerzeichen anstelle von Tabulatoren haben wollte:

 
 (add-hook 'sql-mode-hook 
 (lambda () 
 (progn 
 (setq-default tab-width 4) 
 (setq Einrückung-Tabulator-Modus Null) 
 (setq Einrückung-Zeilenfunktion 'Tab-zu-Tabulator-Stopp) 
 (Syntax-Eingabe ändern? _ "w "); jetzt wird '_' nicht als Worttrennzeichen 
 (Syntaxeintrag ändern? -" w "); jetzt wird '-' nicht als Worttrennzeichen 
)) ) 
0
forkandwait

Hast du es versucht

(setq  tab-width  4)
0
GrokCode

Übrigens füge ich für C-Mode (setq-default c-basic-offset 4) zu .emacs. Siehe http://www.emacswiki.org/emacs/IndentingC für Details.

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