El enlace Cx Cj para dired-jump dejó de funcionar

7

Solía ​​tener un atajo de teclado para la siguiente acción:

"Abra la carpeta que contiene este archivo en Dired + y coloque el punto (cursor) en el archivo"

Creo que fue C-x C-j, y no recuerdo haberlo configurado manualmente. Parece que se fue. ¿Los cambios recientes en Dired + quizás cambiaron esto?

De cualquier manera, ¿hay alguna función interactiva incorporada de Dired o Dired + que pueda usar para esto? Si no, ¿cómo puedo construir una?

Puedo correr M-x dired-jump. El problema parece ser que la combinación de teclas se ha ido. Cuando lo hago C-h k C-x C-j RET, ya veo C-x C-j RET (translated from C-x C-j <return>) is undefined.

Amelio Vazquez-Reina
fuente
2
¿Usas jabber?
Malabarba
@Malabarba Realmente tengo instalado Jabber (pero no lo estoy cargando directamente en Emacs directamente). ¿Podría seguir siendo el problema? Voy a ver.
Amelio Vazquez-Reina
1
jabber une Cx Cj como prefijo. Puede que se esté cargando sin que te des cuenta. Intente desinstalar (simplemente muévalo a un directorio diferente, puede volver a moverlo más tarde)
Malabarba
1
FWIW: Library dired + .el no cambia dired-jumpni se vincula ninguna tecla. dired-jumpNi siquiera se menciona en Dired + .
Dibujó el
2
En un caso como este ("X dejó de funcionar"): (1) Intenta reprobar emacs -Q. (2) Si no puede reproducir desde emacs -Qentonces, bisecte recursivamente su archivo de inicio para ver qué parte está causando el problema. Para hacer eso, comente 1/2, luego 3/4, luego 7/8 ... Puede usar comment-regionpara hacer eso ( C-ucomentarios). Después de intentar todo eso, si necesita más ayuda (y probablemente no la necesite), pregunte aquí.
Dibujó el

Respuestas:

8

El problema

jabber.ely dired-xdesafortunadamente conflicto en esta combinación de teclas. Jabber lo usa C-x C-jcomo prefijo para todas sus claves, mientras que dired lo configura para su amado dired-jump(probablemente es por eso que este último se hace opcional a través de la dired-bind-jumpvariable).

Para complicar más las cosas, si Jabber está instalado con package.el él, vincula esta clave dos veces. Primero en el inicio de Emacs, luego al cargar jabber.el.

La solución

Enlazar dired-jumpantes y después de cargar Jabber. Asegúrese de que esto suceda después (package-initialize)en su archivo de inicio (si lo usa).

(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))

O, si está utilizando Emacs 24.4, lo siguiente es un poco preferido:

(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))

Para continuar usando el mapa de teclas jabber, puede vincularlo a una secuencia de teclas diferente, como en

(global-set-key (kbd "C-c C-j") jabber-global-keymap)
Malabarba
fuente
¿Qué significa el #antes 'dired-jump? También he visto que se usa al agregar funciones a los ganchos.
Kaushal Modi
55
@kaushalmodi Es una functioncita. Es casi lo mismo que una cita regular, pero le dice al compilador de bytes que este símbolo es una función (que puede usar para dar advertencias útiles). Es irrelevante en su archivo init, pero es relevante en los paquetes, así que trato de motivar las buenas prácticas.
Malabarba
4

Como otros ya han notado, está pensando en la función dired-jump, que es proporcionada por Dired-x (no Dired +), y está vinculada C-x C-jcuando se carga la biblioteca Dired-x. (Se puede desactivar esta unión mediante el establecimiento dired-bind-jumpde nilantes de cargar Dired-x).

Dado que C-x C-jhace algo, en lugar de quejarse de que C-x C-jno está definido, lo que está sucediendo es que algo más ha definido un vínculo para ello. Quien haya definido el último enlace gana.

Por lo tanto, debe rastrear qué otro paquete que está cargando está anulando C-x C-j. Ese paquete se carga después de Dired-x, por lo que si está cargando dired-xen su archivo init, es algo que está cargando más adelante o algo que se carga automáticamente en algún momento.

Como C-x C-jno hace nada por sí solo, pero espera a que se presione otra tecla, es una tecla de prefijo. Presione C-x C-j C-hpara ver una lista de enlaces que comienzan con este prefijo. Esto debería darle una buena idea del paquete culpable. La hipótesis de Malabarba de que es el modo Jabber es plausible. Una vez que haya identificado una secuencia de teclas que comienza con el prefijo C-x C-j, presione C-h kseguido de esa secuencia de teclas. Esto mostrará el texto de ayuda para ese comando y el paquete que proporciona el comando. Es probable que el paquete que proporciona el comando sea el mismo paquete que define el enlace.

Es poco probable que necesite ir tan lejos, pero por si acaso, si hay algún enlace de teclas que no puede rastrear, vea ¿Cómo puedo averiguar en qué mapa de teclas está vinculada una tecla?

Si desea cargar ese paquete que anula C-x C-j, pero no quiere que se haga cargo de ese enlace, vea si tiene una opción para omitir ese enlace. Si no es así, puede recuperar el enlace: haga los arreglos para que se ejecute (global-set-key "\C-x\C-j" 'dired-jump)después de cargar el paquete ofensivo. Puede ser suficiente poner eso al final de su archivo de inicio. Si no, puedes usar

(eval-after-load " NOMBRE-DEL-PAQUETE OFENDIENTE " '(global-set-key "\ Cx \ Cj"' dired-jump))
Gilles 'SO- deja de ser malvado'
fuente
2

¿Qué ves cuando lo haces C-hkC-xC-jRET?

Deberías ver que está obligado a hacerlo dired-jump. Si no es así, entonces o bien no lo ha hecho requirede dired-xo / alguna otra overrode paquete que la unión con otra cosa.

Si puedes hacerlo M-x dired-jumpy solo necesitas ese enlace, entonces puedes hacerlo

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

Pero si dired-bind-jumpes así ty si es así (require 'dired-x), ese paquete establecerá ese enlace para usted.

Kaushal Modi
fuente
Gracias. Ya veo C-x C-j RET (translated from C-x C-j <return>)que no está definido.
Amelio Vazquez-Reina
Puedes hacer M-x dired-jump? Si no, entonces no tiene el dired-xpaquete cargado.
Kaushal Modi
Gracias @kaushalmodi - Sí, puedo hacerlo M-x dired-jump. Olvidé mencionar que en el OP
Amelio Vazquez-Reina
Dado que el comando está allí y el problema es que mis enlaces están en mal estado, quizás sea mejor que haga esto en una pregunta diferente "¿Cómo puedo depurar un enlace de teclado que falta?" ¿o similar?
Amelio Vazquez-Reina
1
Ese enlace debería funcionar como se espera si inicia emacs -Qy hace justo (require 'dired-x). Si eso funciona, entonces llene gradualmente init.elhasta que esa unión desaparezca una vez más; de esa manera encontrarás al culpable. Otra forma es hacer grep / ag / ack recursivo C\-x\s+C\-jen su carpeta .emacs.d.
Kaushal Modi
1

Yo uso esto regularmente. Solo lo probé con emacs -Q, esto es todo lo que necesitas:

(require 'dired-x)

La funcionalidad es proporcionada por dired-x, que es diferente de dired+. El primero se envía con el núcleo de Emacs, el último es una biblioteca de extensión de terceros.

pimenton
fuente
También asegúrese de que dired-bind-jumpesté configurado en su valor predeterminado t.
legoscia
Gracias @legoscia que acabo de comprobar y dired-bind-jumpes t. También estoy cargando (require 'dired-x). Extraño
Amelio Vazquez-Reina