Deaktivieren Sie alle automatischen Einrückungen vollständig

18

Wie deaktiviere ich alle automatischen Einrückungen in Emacs vollständig? Ich muss es zumindest für den Fundamental-Modus deaktivieren, aber ich bin damit einverstanden, dass es für die aktuelle Sitzung global deaktiviert wird.

Bitte lesen Sie den Rest dieser Frage, bevor Sie sie als Duplikat deklarieren. Alle anderen Antworten, die ich gefunden habe, beziehen sich auf ein viel gezielteres Deaktivieren der Einrückung. Ich möchte wirklich alle automatischen Einrückungen für die gesamte Sitzung deaktivieren.

Einstellen electric-layout-modeauf nilfunktioniert nicht.

Einzelheiten

Manchmal schreibe ich gerne große Git-Commit-Nachrichten mit meinem Windows-ASCII-Texteditor. Diese Nachrichten enthalten häufig Aufzählungszeichen, Codeblöcke oder andere Elemente, bei denen die genaue Formatierung in meinem Quelldokument von Bedeutung ist. Meine Codebasis ist unter Linux und ich verbinde mich mit der Box über einen Nur-Text-SSH-Client. Wenn Git Emacs zum Bearbeiten der Festschreibungsnachricht aufruft, möchte ich die Quellfestschreibungsnachricht in die Windows-Zwischenablage kopieren und dann mit Windows-Einfügebefehlen einfügen können. Aus der Sicht von Emacs schreibe ich, was in der Windows-Textdatei gefunden wurde. Wenn Emacs eingerückte Linien sieht, fügt er leider eine eigene automatische Einrückung hinzu, sodass ich dieses riesige Dreieck aus Leerzeichen am linken Rand des Puffers erhalte.

Ich benutze GNU Emacs 24.3.1.

Umgehung

Meine derzeitige Problemumgehung besteht darin, meine Windows-Textdatei auf ein Dateisystem zu übertragen, das von meinem Linux-Host bereitgestellt wird, die Datei in Emacs zu laden und dann mit kill und yank den Inhalt zu übertragen. Das ist ein bisschen klobig.

Beispiel

Hier ist ein Beispiel-Textblock:

a

  - b
    c
    d

So sieht es aus, wenn ich das mit MSWin paste in Emacs-under-ssh einfüge:

a

  - b
      c
          d

Wenn ich C-h lnach dem Einfügen drücke , sehe ich Folgendes. Beachten Sie, dass die Zeilenumbrüche mit C-j, nicht eingegeben werden RET.

a C-j C-j SPC SPC - SPC b C-j SPC SPC SPC SPC c C-j
SPC SPC SPC SPC d C-j C-h l
Herr Fooz
quelle
Soweit einige der Gedankenstrich verbundenen Variablen sind zwischen lokal, es müsste etwas sein , das läuft nach dem Major-Modus Haken - zum Beispiel vielleicht [?] hack-local-variables-hook- im Wesentlichen ungeschehen machen , was andere Haupt-Modi als Teil ihrer Standardinitialisierung. fundamental-modeist nur eine kleine Funktion im Inneren simple.el- dh (kill-all-local-variables) (run-mode-hooks). M-x find-function RET fundamental-mode RET- Sie können Ihre eigenen nach Bedarf ändern / erstellen; Wenn Sie jedoch den Namen ändern, wird er von einigen Funktionen nicht verwendet. Daher sollten Sie in Betracht ziehen, den gleichen Namen beizubehalten.
Gesetzesliste
Hat der Emacs ein Äquivalent zum Vim :set paste? Grundsätzlich heißt das: "Berühren Sie den eingefügten Text in keiner Weise". Dazu gehört auch die automatische Einrückung.
Omair Majid

Antworten:

21

Emacs ≤24,3

Das Drücken von RET rückt nicht standardmäßig ein (außer in einigen Programmiermodi, für die Sie die modusspezifische Konfiguration überprüfen müssen, z. B. „elektrische“ Einstellungen).

Unix-Terminals fügen normalerweise ein Wagenrücklaufzeichen ein, wenn der Inhalt der Zwischenablage eine neue Zeile enthält (dargestellt durch das Zeilenvorschubzeichen). In Emacs, ein Wagenrücklauf sieht aus wie der RETSchlüssel (in der Tat RET ist die Wagenrücklaufzeichen), während ein Zeilenvorschub aussieht (ist) C-j.

In Ihrem Fall führt das Einfügen einer neuen Zeile jedoch zu einem C-j, der in Emacs an den Befehl gebunden ist newline-and-indent. Wie der Name schon sagt, wird dieser Befehl eingerückt. Ich weiß nicht, ob PuTTY eine Einstellung hat, die Sie ändern können. Wenn Sie das Problem auf dem Emacs Ende fixieren wollen, dann ist es eine einfache Abhilfe , die ich denke , Sie werden nichts dagegen: bind C-jzu newline(gleich wie RET).

(global-set-key "\C-j" 'newline)

Emacs ≥24.4

In Emacs 24.4 ist der E-Indent-Modus standardmäßig aktiviert. Dies ist ein globaler Nebenmodus. Sie können ihn also überall durch Aufrufen (electric-indent-mode 0)deaktivieren und interaktiv damit umschalten M-x electric-indent-mode RET.

Sie finden diese Informationen im Handbuch oder in der Dokumentation des Befehls, der durch Drücken von Return(Drücken von C-h k RET) aufgerufen wird .

Sie können es in einem bestimmten Puffer mit einschalten electric-indent-local-mode. Einige Programmiermodi (insbesondere solche von Drittanbietern) verfügen möglicherweise über eigene automatische Einrückungsfunktionen, die nicht den Einstellungen des elektrischen Einrückungsmodus entsprechen.

Gilles 'SO - hör auf böse zu sein'
quelle
electric-indent-modeist standardmäßig deaktiviert (dies stimmt mit Ihren Angaben überein, da ich Emacs 24.3.1 verwende). Ein- und Ausschalten hilft nicht. electric-indent-local-modesteht mir nicht über zur Verfügung M-x. Hilfe auf RETerwähnt drei Einstellungen: use-hard-newlines, auto-fill-function, und fill-column. Makeln oder Modifizieren diejenigen über M-x use-hard-lines, M-x auto-fill-modeund M-x set-fill-column RET 0 RETnicht helfen.
Herr Fooz
@MrFooz Oh, sorry, ich habe in Ihrer Frage nicht auf die Emacs-Version geachtet. Aber dann frage ich mich, warum Sie automatische Einrückung bekommen. Hmmm. Erhalten Sie automatische Einrückung mit emacs -q? Bitte fügen Sie einen kurzen Text mit einer neuen fooZeile barin Emacs ein und drücken Sie C-h l. Was sehen Sie? … f o o RET b a roder … f o o C-j b a roder … f o o RET C-j baroder was anderes? Auf welchem ​​Terminal führen Sie den SSH-Client aus?
Gilles 'SO- hör auf böse zu sein'
Ich habe dem ursprünglichen Beitrag einen Beispieltext hinzugefügt. Hinzufügen -qhilft nicht (zB emacs -q -nw --no-desktop). Ich sehe C-jstatt RET. Ich verwende PuTTY 0.63 als SSH-Client. Ich sehe das gleiche Verhalten mit TERMSatz screenund xterm.
Herr Fooz
@MrFooz Ok, da PuTTY eher eine LF als eine CR sendet, müssen Sie Emacs anweisen, nicht in eine LF einzurücken. Das ist global einfach zu deaktivieren, ich habe meine Antwort bearbeitet.
Gilles 'SO- hör auf böse zu sein'
Danke, der global-set-keyHack hat das Problem behoben. Ich werde eine Möglichkeit finden, meine EDITORAliase so einzurichten, dass sie beim Bearbeiten von Git-Commit-Nachrichten beim Start automatisch aufgerufen werden. Zeilenumbrüche werden anstelle von Zeilenumbrüchen eingefügt, da ich meinen bevorzugten Windows-Texteditor so konfiguriert habe, dass anstelle von Windows-Zeilenenden Zeilenenden im UNIX-Stil verwendet werden.
Herr Fooz
1

Sie können auch den Einfügemodus in Klammern verwenden. Dies ist eine Funktion Ihres Terminal-Emulators (PuTTY in diesem Fall, Version 0.63 und höher), die Escape-Sequenzen verwendet, um zu signalisieren, dass der Benutzer etwas einfügt, und dann erneut, wenn das Einfügen endet. Es gibt ein Emacs-Paket, bracketed-pastedas Sie installieren können. Es ermöglicht Emacs, die Escape-Sequenzen zu erkennen und für die Dauer des Einfügens zu einer sichereren Keymap überzugehen. Dies verhindert nicht nur, dass der Einzug durcheinander gerät, sondern auch, dass eine falsche Paste Befehle in Ihrer Emacs-Sitzung mit ausführt M-x.

db48x
quelle