Wie ändere ich den Inhalt eines Pakets (header2.el)?

7

Ich fand das Paket Automatic File Headers , jubelte und installierte es mit MELPA. Ich habe festgestellt, dass Datei-Header in der Projektentwicklung sehr wertvoll sind. Ich weiß immer, wer wo war und wie oft sie dort waren. Meistens weiß ich auch, was sie getan haben. Die Anzahl der Aktualisierungen und das Datum der letzten Änderung sind sehr nützlich, um die richtige Version einer zu verwendenden Datei zu bestimmen.

Es gibt eine Sache, die ich nicht herausfinden konnte.

header2Deklarieren Sie es beispielsweise nach der Installation von MELPA in Ihren Dot-Emacs:

;; To have Emacs update file headers automatically whenever you save a
;; file, put this in your init file (~/.emacs):

(autoload 'auto-update-file-header "header2")
(add-hook 'write-file-hooks 'auto-update-file-header)

;; To have Emacs add a file header whenever you create a new file in
;; some mode, put this in your init file (~/.emacs):

(autoload 'auto-make-header "header2")
(add-hook 'emacs-lisp-mode-hook 'auto-make-header)
(add-hook 'c-mode-common-hook   'auto-make-header)

Wenn Sie also eine neue Datei in Emacs erstellen, zum Beispiel foobar.el. Sie sehen einen Header. Und es wird automatisch aktualisiert, wenn Sie die Datei schreiben. Okay, nehmen wir an, ich möchte den Text Last-Updated:in ändern Foo-Last-Updated.

Also habe ich ein Grep on Last-Updatedaus dem Paket gemacht header2und alle Vorkommen durch ersetzt Foo-Last-Updated. Ich habe Emacs neu gestartet, um sicherzugehen. Und Last-Updatedstattdessen wird immer noch angezeigt Foo-Last-Updated.

Irgendwelche Vorschläge, um den Header-Inhalt zu ändern? Ich habe nichts in den Handbüchern gefunden.

ReneFroger
quelle
Sie sollten den Paketinhalt nicht ändern müssen. Sie können das gewünschte Material neu definieren, nachdem Sie das Paket benötigt haben. Ich werde mein Beispiel in einer Antwort veröffentlichen, sobald ich an einem PC angekommen bin. Es wird immer noch das alte Zeug geladen, da Sie die .elc-Datei nicht im selben Ordner aktualisiert haben. Löschen Sie die .elc-Dateien für das Paket, und Ihre Änderungen in der .el-Datei werden wirksam.
Kaushal Modi
@kaushalmodi danke für deinen Vorschlag. Ich habe die kompilierten * .elc-Dateien entfernt. Und Emacs neu gestartet. Bisher ändert sich nichts ... ein weiterer Vorschlag?
ReneFroger
Haben Sie es mit einer brandneuen Datei versucht? Wenn Sie einen alten verwenden, der bereits einen Header enthält, würde ich mich fragen, ob Ihre Änderung den bereits vorhandenen Header nicht aktualisiert.
Dan

Antworten:

4

Customizing - header2Header

Aus der Dokumentation in header2.el:

Definieren Sie einzelne Header-Elemente. Dies sind die Bausteine, mit denen ein standortspezifischer Header erstellt wird. Sie können Ihre eigenen Funktionen entweder in dieser Datei oder in Ihrer .emacsDatei hinzufügen . Die Variable make-header-hookgibt die Funktionen an, die tatsächlich aufgerufen werden.

Hier ist ein Beispiel, wie Sie den Header nach Ihren Wünschen anpassen können:

(require 'header2)

(defsubst my/header-timestamp ()
  "Insert field for timestamp"
  (insert header-prefix-string  "Time-stamp: <>\n"))

(defsubst my/header-projectname ()
  "Insert Project Name"
  (insert header-prefix-string "Project    : "
          (when (featurep 'projectile)
            (replace-regexp-in-string "/proj/\\(.*?\\)/.*"
                                      "\\1"
                                      (projectile-project-root)))
          "\n"))

(defsubst my/header-description ()
  "Insert \"Description: \" line."
  (insert header-prefix-string "Description: \n"))

(defsubst my/header-dash-line ()
  "Insert dashed line"
  (insert header-prefix-string)
  (insert-char ?- fill-column)
  (insert "\n"))

(setq make-header-hook '(my/header-timestamp
                         header-blank
                         my/header-dash-line
                         my/header-projectname
                         header-file-name
                         header-author
                         my/header-description
                         my/header-dash-line))

(add-hook 'emacs-lisp-mode-hook #'auto-make-header)

Pakete direkt ändern

Im Allgemeinen wird dies nicht empfohlen, da Ihre Änderungen beim Aktualisieren des Pakets verloren gehen, wenn Sie die Pakete mit dem Paketmanager aktualisieren möchten.

Ab Version 24.4 von emacs können Sie Ihrem emacs init gleich zu Beginn Folgendes hinzufügen, bevor Sie mit dem Laden von Paketen beginnen. Dadurch wird sichergestellt, dass immer die neueste Datei geladen wird (sei es eine .el- oder .elc-Datei).

(setq load-prefer-newer t)

Wenn Sie das nicht haben, wird standardmäßig die .elc-Datei geladen, falls vorhanden (und die .el wird ignoriert).

Versuchen Sie jedoch erneut, die .el-Dateien des Pakets nicht direkt zu bearbeiten.

Mehr Info

Kaushal Modi
quelle
Vielen Dank für Ihre sehr klare Erklärung, es ist jetzt klar. Ich werde die Änderungen anhand Ihres Beispiels anwenden. Und ich werde nicht mehr versuchen, das Paket zu bearbeiten.
ReneFroger
Ich habe den Inhalt meines benutzerdefinierten Headers in Last changed : on 30-04-2015 Version : 2 Wie kann ich das Standardverhalten von überschreiben header2, dass er den Inhalt der zuletzt geänderten Version ersetzt?
ReneFroger