Wie lege ich die Emacs-Zeichenkodierung für Dateien in einem Verzeichnis fest?

Wie lege ich die Emacs-Zeichenkodierung für Dateien in einem Verzeichnis fest?

Ich verwende Aquamacs, eine Distribution von GNU Emacs 23.3.50.1.

Ich schaue mir einige Quelldateien an, die einige Kommentare auf Griechisch enthalten und in CP1253 codiert sind.

Und ich kann entweder mit der richtigen Kodierung zurückkehren oder eine dateilokale Variable hinzufügen:

/* -*- mode: c-mode; tab-width: 4; coding: cp1253-unix; -*- */

Damit kann ich sie ordnungsgemäß öffnen. Außerdem könnte ich jeder Datei Dateivariablen anhängen.

Aber ich möchte die Kodierung für das gesamte Verzeichnis festlegen. Anstatt .dir-locals.el manuell zu bearbeiten, dachte ich, ich mache einfach Folgendes:

M-x copy-file-locals-to-dir-locals

Aus der Datei, die korrekt geöffnet wurde. Und die Folgendes erzeugt:

;;; Directory Local Variables
;;; See Info node `(emacs) Directory Variables' for more information.

((c-mode
  (tab-width . 4)
  (coding . cp1253-unix)))

Nichts da. Aber die neue Tabulatorbreite wird eindeutig erkannt, also wird die Datei gelesen.

Irgendwelche Ideen, warum? Und gibt es ein Protokoll, während Emacs die A-Liste verarbeitet?

Antwort1

Leider scheint es so, dass der Coding-Header konstruktionsbedingt nicht aus den lokalen Verzeichnissen von Emacs weitergegeben wird. Ich hatte Probleme mit Ihrem Setup und konnte das Problem ebenfalls reproduzieren.

Später bin ich auf diese Quelle gestoßen, die Ihre Ergebnisse zu bestätigen scheint: http://www.emacsmirror.org/package/dir-locals.html

Ich bin nicht sicher, ob es ein Protokoll für die Verarbeitung der A-Liste gibt, aber falls Sie mit dieser Variable nicht vertraut sind, können Sie Ihre Kodierung nach dem Aufrufen einer Datei mit Folgendem überprüfen:

C-h v buffer-file-coding-system RET

oder

M-x describe-variable RET buffer-file-coding-system RET

Persönlich glaube ich, dass für Sie das Beste ist, was bei Ihnen bereits funktioniert – dateilokale Variablen.

Alternativen, die mir einfallen (die erste ist ungetestet), wären, einen Blick auf einige der Elisp-Funktionen zu werfen:

(coding-system-priority-list)
(set-coding-system-priority &rest coding-systems)

ODER zweitens: (vorausgesetzt, Ihre Verzeichnisstruktur ist /irgendwas/bla/greekcode/file.c)

(add-to-list 'auto-coding-alist 
     '("/greekcode/[^/]+.c\\'" . cp1253-unix))

Dies hat sogar Vorrang vor lokalen Dateivariablen. Ändern Sie den regulären Ausdruck nach Bedarf und experimentieren Sie, indem Sie Folgendes auswerten:

(find-auto-coding "/home/brian/greekcode/garbage.c" 1) <= C-x C-e

kehrt zurück:

(cp1253-unix . auto-coding-alist)

Hoffentlich hilft das! Würde gerne hören, welche Lösungen andere Emacs-Benutzer vorschlagen.

verwandte Informationen