Die Cx Cj-Bindung für Dired-Jump funktioniert nicht mehr

7

Ich hatte früher eine Tastenkombination für die folgende Aktion:

"Öffnen Sie den Ordner mit dieser Datei in Dired + und platzieren Sie den Punkt (Cursor) auf der Datei."

Ich glaube es war C-x C-jund ich erinnere mich nicht daran, es manuell eingerichtet zu haben. Es scheint weg zu sein. Haben die letzten Änderungen an Dired + dies möglicherweise geändert?

Gibt es in jedem Fall integrierte interaktive Funktionen von Dired oder Dired +, die ich dafür verwenden könnte? Wenn nicht, wie kann ich einen bauen?

Ich kann laufen M-x dired-jump. Das Problem scheint zu sein, dass die Tastenkombination weg ist. Wenn ich das tue C-h k C-x C-j RET, verstehe ich C-x C-j RET (translated from C-x C-j <return>) is undefined.

Amelio Vazquez-Reina
quelle
2
Benutzt du Jabber?
Malabarba
@ Malabarba Ich habe Jabber tatsächlich installiert (lade es aber nicht direkt in Emacs). Könnte es immer noch das Problem sein? Ich werde überprüfen.
Amelio Vazquez-Reina
1
jabber bindet Cx Cj als Präfix. Es wird möglicherweise geladen, ohne dass Sie es merken. Versuchen Sie es zu deinstallieren (verschieben Sie es einfach in ein anderes Verzeichnis, Sie können es später wieder verschieben).
Malabarba
1
FWIW: Die Bibliothek dired + .el ändert sich nicht dired-jumpoder es gibt keine Schlüsselbindung. dired-jumpwird nicht einmal in Dired + erwähnt .
Drew
2
In einem Fall wie diesem ("X funktioniert nicht mehr"): (1) Versuchen Sie, eine Repro von emacs -Q. (2) Wenn Sie nicht repro können, emacs -Qhalbieren Sie Ihre Init-Datei rekursiv, um festzustellen, welcher Teil das Problem verursacht. Kommentieren Sie dazu 1/2, dann 3/4, dann 7/8 aus ... Sie können dies verwenden comment-region( C-uKommentare). Wenn Sie nach all dem mehr Hilfe benötigen (und wahrscheinlich auch nicht), fragen Sie hier.
Drew

Antworten:

8

Das Problem

jabber.elund dired-xleider Konflikt auf dieser Tastenkombination. Jabber verwendet C-x C-jals Präfix für alle seine Schlüssel, während dired es auf Ihren Geliebten setzt dired-jump(das ist wahrscheinlich der Grund, warum letzteres durch die dired-bind-jumpVariable optional gemacht wird).

Machen Sie die Sache noch komplizierter, wenn Jabber installiert ist package.el und diesen Schlüssel zweimal bindet! Zuerst beim Start von Emacs, dann beim Laden jabber.el.

Die Lösung

Binden Sie dired-jumpvor und nach dem Laden von Jabber. Stellen Sie sicher, dass dies später (package-initialize)in Ihrer Init-Datei geschieht (wenn Sie es verwenden).

(global-set-key (kbd "C-x C-j") #'dired-jump)
(eval-after-load 'jabber-keymap
  '(global-set-key (kbd "C-x C-j") #'dired-jump))

Wenn Sie Emacs 24.4 verwenden, wird Folgendes leicht bevorzugt:

(global-set-key (kbd "C-x C-j") #'dired-jump)
(with-eval-after-load 'jabber-keymap
  (global-set-key (kbd "C-x C-j") #'dired-jump))

Um die Jabber-Keymap weiterhin zu verwenden, können Sie sie wie in an eine andere Tastenfolge binden

(global-set-key (kbd "C-c C-j") jabber-global-keymap)
Malabarba
quelle
Was bedeutet das #vor 'dired-jumpbedeuten? Ich habe auch gesehen, dass es beim Hinzufügen von Funktionen zu Hooks verwendet wird.
Kaushal Modi
5
@kaushalmodi Es ist ein functionZitat. Es ist fast dasselbe wie ein normales Anführungszeichen, aber es teilt dem Byte-Compiler mit, dass dieses Symbol eine Funktion ist (mit der es nützliche Warnungen geben kann). Es ist in Ihrer Init-Datei irrelevant, aber in Paketen relevant, daher versuche ich, bewährte Verfahren zu motivieren.
Malabarba
4

Wie andere bereits bemerkt haben, denken Sie an die Funktion dired-jump, die von Dired-x (nicht Dired +) bereitgestellt wird und an die gebunden ist, C-x C-jwenn die Dired-x-Bibliothek geladen wird. (Sie können diese Bindung deaktivieren, indem Sie festlegen dired-bind-jump, nilbevor Dired-x geladen wird.)

Angesichts der Tatsache, dass C-x C-jdies etwas bewirkt, anstatt sich über C-x C-jundefinierte zu beschweren, geschieht, dass etwas anderes eine Bindung dafür definiert hat. Wer zuletzt die Bindung definiert hat, gewinnt.

Sie müssen also herausfinden, welches andere Paket, das Sie laden, überschreibt C-x C-j. Dieses Paket wird nach Dired-x geladen. Wenn Sie also dired-xin Ihre Init-Datei laden , wird es entweder weiter geladen oder irgendwann automatisch geladen .

Da C-x C-jes nichts alleine macht, sondern darauf wartet, dass eine andere Taste gedrückt wird, handelt es sich um eine Präfixtaste. Drücken Sie C-x C-j C-h, um eine Liste der Bindungen anzuzeigen, die mit diesem Präfix beginnen. Dies sollte Ihnen eine gute Vorstellung vom Täterpaket geben. Malabarbas Hypothese, dass es sich um den Jabber-Modus handelt, ist plausibel. Wenn Sie eine Tastenfolge identifiziert haben, die mit dem Präfix beginnt C-x C-j, drücken Sie C-h kgefolgt von dieser Tastenfolge. Dies zeigt den Hilfetext für diesen Befehl und das Paket, das den Befehl bereitstellt. Es ist wahrscheinlich, dass das Paket, das den Befehl bereitstellt, dasselbe Paket ist, das die Bindung definiert.

Es ist unwahrscheinlich, dass Sie so weit gehen müssen, aber nur für den Fall, dass Sie eine Schlüsselbindung nicht finden können, lesen Sie Wie kann ich herausfinden, in welcher Keymap ein Schlüssel gebunden ist?

Wenn Sie das überschreibende Paket laden möchten C-x C-j, aber nicht möchten, dass es diese Bindung übernimmt, prüfen Sie, ob es eine Option zum Überspringen dieser Bindung gibt. Wenn dies nicht der Fall ist, können Sie die Bindung zurückschnappen: Lassen Sie sie ausführen, (global-set-key "\C-x\C-j" 'dired-jump)nachdem das fehlerhafte Paket geladen wurde. Es kann ausreichen, dies am Ende Ihrer Init-Datei zu platzieren. Wenn nicht, können Sie verwenden

(eval-after-load " NAME-OF-THE-OFFENDING-PACKAGE " '(global-set-key "\ Cx \ Cj"' dired-jump))
Gilles 'SO - hör auf böse zu sein'
quelle
2

Was sehen Sie, wenn Sie es tun C-hkC-xC-jRET?

Sie sollten sehen, dass es gebunden ist dired-jump. Wenn dann ist es nicht , dann haben Sie entweder nicht getan requirevon dired-xoder Sie / irgendein anderes Paket overrode , dass mit etwas anderem zu binden.

Wenn Sie M-x dired-jumpdiese Bindung können und nur benötigen, können Sie dies tun

(global-set-key (kbd "C-x C-j") 'dired-jump)

Aber wenn dired-bind-jumpja tund wenn ja (require 'dired-x), dann wird dieses Paket diese Bindung für Sie festlegen.

Kaushal Modi
quelle
Danke - ich sehe C-x C-j RET (translated from C-x C-j <return>)ist undefiniert.
Amelio Vazquez-Reina
Schaffst du das M-x dired-jump? Wenn nicht, haben Sie das dired-xPaket nicht geladen.
Kaushal Modi
Danke @kaushalmodi - Ja, das kann ich M-x dired-jump. Ich habe vergessen, das im OP zu erwähnen
Amelio Vazquez-Reina
Angesichts der Tatsache, dass der Befehl vorhanden ist und das Problem darin besteht, dass meine Bindungen durcheinander sind, ist es vielleicht besser, dies in einer anderen Frage zu stellen: "Wie kann ich eine fehlende Tastaturbindung debuggen?" o.ä?
Amelio Vazquez-Reina
1
Diese Bindung sollte wie erwartet funktionieren, wenn Sie starten emacs -Qund nur tun (require 'dired-x). Wenn das funktioniert, füllen Sie Ihre nach und nach, init.elbis die Bindung wieder verschwindet. Auf diese Weise finden Sie den Täter. Eine andere Möglichkeit besteht darin, rekursives grep / ag / ack für C\-x\s+C\-jin Ihrem Ordner .emacs.d auszuführen.
Kaushal Modi
1

Ich benutze das regelmäßig. Einfach getestet mit emacs -Q, das ist alles was du brauchst:

(require 'dired-x)

Die Funktionalität wird von bereitgestellt dired-x, was sich von unterscheidet dired+. Ersteres wird mit Emacs geliefert, letzteres ist eine Erweiterungsbibliothek eines Drittanbieters.

Paprika
quelle
Stellen Sie außerdem sicher, dass dired-bind-jumpder Standardwert festgelegt ist t.
Legoscia
Danke @legoscia habe ich gerade überprüft und dired-bind-jumpist t. Ich lade auch (require 'dired-x). Seltsam
Amelio Vazquez-Reina