O que aconteceu com a função ido-imenu no modo Ruby no Emacs24?
Pergunta
Emacs23.2 no emacs-starter-kit v1 tem C-x C-i
(ou ido-imenu
) (semelhante ao Cmd+R do Sublime Text). Emacs24 no emacs-starter-kit v2 não possui esta função.eu encontrei esse problema do github e um conserto, que tentam recriar a funcionalidade.Enquanto isso ido-imenu
trabalha em elisp-mode
, ele parou de funcionar em ruby-mode
.Eu recebo:
imenu--make-index-alist: No items suitable for an index found in this buffer
- Alguém descobriu como fazer isso funcionar?
- Por que isso foi retirado do Emacs24?
- Existe um novo substituto para esta função?
Solução 2
Então eu finalmente descobri, depois de ler o Definindo um menu Imenu para um modo seção no emacs-wiki novamente.
Resposta curta:você precisa adicionar esse bit à sua personalização.Sinta-se livre para adicionar mais tipos para a lista (estou feliz apenas com métodos).
(add-hook 'ruby-mode-hook
(lambda ()
(set (make-local-variable imenu-generic-expression)
'(("Methods" "^\\( *\\(def\\) +.+\\)" 1)
))))
Resposta mais longa:Primeiro tentei definir um ruby-imenu-generic-expression
função e configure-a para imenu-generic-expression
usando o ruby-mode-hook
:
(defvar ruby-imenu-generic-expression
'(("Methods" "^\\( *\\(def\\) +.+\\)" 1))
"The imenu regex to parse an outline of the ruby file")
(defun ruby-set-imenu-generic-expression ()
(make-local-variable 'imenu-generic-expression)
(make-local-variable 'imenu-create-index-function)
(setq imenu-create-index-function 'imenu-default-create-index-function)
(setq imenu-generic-expression ruby-imenu-generic-expression))
(add-hook 'ruby-mode-hook 'ruby-set-imenu-generic-expression)
No entanto, isso não funcionou (eu receberia o mesmo erro de antes).Mais leitura do Definindo um menu Imenu para um modo seção me mostrou o caminho.Agora, eu não sou um elisp
especialista, então aqui está minha hipótese:basicamente, o método acima funciona para modos onde o
O modo principal suporta uma cópia local de buffer da variável “real”, ‘imenu-generic-expression’.Se o seu modo não funcionar, você terá que confiar em um gancho.
O exemplo para foo-mode
deixou claro como fazer isso ruby-mode
.Então parece que ruby-mode
não possui uma cópia local do buffer do real imenu-generic-expression
variável.Ainda não consigo explicar por que funcionou no Emacs 23.2 (com ESK v1), mas não no Emacs24, mas ei, pelo menos encontrei uma solução funcional.
Outras dicas
Como a função faz parte do ESK (ao contrário de algo desenvolvido com o Emacs), você provavelmente faria melhor em relatar o bug no upstream.Por falar nisso, o principal concorrente da ESK, o Emacs Prelude, oferece a mesma funcionalidade (vinculada a C-c eu por padrão) e parece estar funcionando bem com o modo Ruby no Emacs 24. Aqui você pode encontrar mais em ido-imenu
.