A ligação Cx Cj para o salto em direção parou de funcionar

7

Eu costumava ter um atalho de teclado para a seguinte ação:

"Abra a pasta que contém este arquivo em Dired + e coloque o ponto (cursor) no arquivo"

Acredito que sim C-x C-j, e não me lembro de configurá-lo manualmente. Parece ter sumido. Alterações recentes em Dired + talvez tenham alterado isso?

De qualquer forma, existem funções interativas internas Dired ou Dired + que eu poderia usar para isso? Caso contrário, como posso construir um?

Eu posso correr M-x dired-jump. O problema parece ser que a combinação de teclas se foi. Quando eu faço C-h k C-x C-j RET, eu vejo C-x C-j RET (translated from C-x C-j <return>) is undefined.

Amelio Vazquez-Reina
fonte
2
Você usa jabber?
Malabarba 14/10
@ Malabarba Na verdade, tenho o Jabber instalado (mas não estou carregando diretamente no Emacs). Ainda poderia ser o problema? Eu vou verificar.
Amelio Vazquez-Reina
11
jabber liga Cx Cj como um prefixo. Pode estar sendo carregado sem você perceber. Tente desinstalar (basta movê-lo para um diretório diferente, você pode voltar mais tarde).
Malabarba 14/10
11
FWIW: A biblioteca direcionada + .el não altera dired-jumpou nenhuma ligação de chave a ela. dired-jumpnem é mencionado no Dired + .
Tirou
2
Em um caso como este ("X parou de funcionar"): (1) Tente reproduzir novamente emacs -Q. (2) Se você não conseguir reproduzir emacs -Qnovamente, divida o arquivo init de forma recursiva, para ver qual parte está causando o problema. Para fazer isso, comente 1/2, depois 3/4 e 7/8 ... Você pode usar comment-regionpara fazer isso ( C-udescomentar). Depois de tentar tudo isso, se precisar de mais ajuda (e provavelmente não precisará), pergunte aqui.
Tirou

Respostas:

8

O problema

jabber.ele dired-xinfelizmente entra em conflito com este atalho de teclado. O Jabber usa C-x C-jcomo prefixo para todas as suas chaves, enquanto o dired o define como seu amado dired-jump(é provavelmente por isso que o último é opcional através da dired-bind-jumpvariável).

Para complicar ainda mais, se o Jabber estiver instalado, package.el ele vincula essa chave duas vezes! Primeiro na inicialização do Emacs, depois no carregamento jabber.el.

A solução

Vincule dired-jumpantes e depois do carregamento do Jabber. Certifique-se de que isso aconteça depois (package-initialize)no seu arquivo init (se você o usar).

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

Ou, se você estiver usando o Emacs 24.4, o seguinte é um pouco 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 o mapa de teclas jabber, você pode vinculá-lo a uma sequência de teclas diferente, como em

(global-set-key (kbd "C-c C-j") jabber-global-keymap)
Malabarba
fonte
O que o #antes 'dired-jumpsignifica? Eu também vi isso sendo usado ao adicionar funções aos ganchos.
precisa
5
@kaushalmodi É uma functioncitação. É quase o mesmo que uma cotação regular, mas informa ao compilador de bytes que este símbolo é uma função (que pode ser usada para fornecer avisos úteis). É irrelevante no seu arquivo init, mas é relevante nos pacotes, por isso tento motivar as boas práticas.
Malabarba 14/10
4

Como outros já observaram, você está pensando na função dired-jump, que é fornecida pelo Dired-x (não Dired +), e é vinculada a C-x C-jquando a biblioteca Dired-x é carregada. (É possível desactivar esta ligação, definindo dired-bind-jumpa nilantes Dired-x é carregado).

Dado que C-x C-jfaz algo, em vez de reclamar que C-x C-jé indefinido, o que está acontecendo é que algo mais definiu um vínculo para ele. Quem definiu a última ligação ganha.

Portanto, você precisa rastrear qual outro pacote que você está carregando está substituindo C-x C-j. Esse pacote é carregado após o Dired-x, portanto, se você está carregando dired-xno seu arquivo init, é algo que você está carregando mais adiante ou algo que é carregado automaticamente em algum momento.

Como C-x C-jnão faz nada por si só, mas espera que outra tecla seja pressionada, é uma tecla de prefixo. Pressione C-x C-j C-hpara ver uma lista de ligações que começam com esse prefixo. Isso deve lhe dar uma boa idéia do pacote responsável. A hipótese de Malabarba de que é o modo Jabber é plausível. Depois de identificar uma sequência de teclas que começa com o prefixo C-x C-j, pressione C-h kseguido por essa sequência de teclas. Isso mostrará o texto de ajuda para esse comando e o pacote que fornece o comando. É provável que o pacote que fornece o comando seja o mesmo que define a ligação.

É improvável que você precise ir tão longe, mas, se houver alguma ligação de chave que você não possa rastrear, consulte Como posso descobrir em qual mapa de chave uma chave está vinculada?

Se você deseja carregar o pacote que substitui C-x C-j, mas não deseja que ele assuma essa ligação, veja se há uma opção para ignorar essa ligação. Caso contrário, você pode recuperar a ligação: organize para executar (global-set-key "\C-x\C-j" 'dired-jump)após o carregamento do pacote incorreto. Pode ser o suficiente para colocar isso no final do seu arquivo init. Caso contrário, você pode usar

(eval-after-load " NAME-OF-OFENDING-PACKAGE " '(chave de conjunto global "\ Cx \ Cj"' dired-jump))
Gilles 'SO- parar de ser mau'
fonte
2

O que você vê quando faz C-hkC-xC-jRET?

Você deve ver que está vinculado dired-jump. Se não for, então você não quer ter feito requirede dired-xou você / algum outro pacote cancelou que a ligação com outra coisa.

Se você pode fazer M-x dired-jumpe apenas precisa dessa ligação, pode fazer

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

Mas se dired-bind-jumpfor te se você tiver (require 'dired-x), esse pacote definirá essa ligação para você.

Kaushal Modi
fonte
Obrigado - eu vejo C-x C-j RET (translated from C-x C-j <return>)é indefinido.
Amelio Vazquez-Reina
Você pode fazer M-x dired-jump? Caso contrário, você não terá o dired-xpacote carregado.
precisa
Obrigado @kaushalmodi - Sim, eu posso fazer M-x dired-jump. Esqueceu de mencionar que no OP
Amelio Vazquez-Reina
Dado que o comando existe e o problema é que minhas ligações estão desarrumadas, talvez seja melhor fazer isso em uma pergunta diferente "Como posso depurar uma ligação de teclado ausente?" ou similar?
Amelio Vazquez-Reina
11
Essa ligação deve funcionar como esperado se você iniciar emacs -Qe fizer exatamente (require 'dired-x). Se isso funcionar, preencha gradualmente sua conta init.elaté que a ligação desapareça mais uma vez; Dessa forma, você encontrará o culpado. Outra maneira é fazer grep / ag / ack recursivo C\-x\s+C\-jna sua pasta .emacs.d.
precisa
1

Eu uso isso regularmente. Apenas testei emacs -Q, é tudo o que você precisa:

(require 'dired-x)

A funcionalidade é fornecida por dired-x, que é diferente de dired+. O primeiro é fornecido com o Emacs principal, o último é uma biblioteca de extensões de terceiros.

páprica
fonte
Verifique também se dired-bind-jumpestá definido como seu valor padrão t.
legoscia
Obrigado @legoscia Acabei de verificar e dired-bind-jumpé t. Eu também estou carregando (require 'dired-x). Strange
Amelio Vazquez-Reina