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
  1. Alguém descobriu como fazer isso funcionar?
  2. Por que isso foi retirado do Emacs24?
  3. Existe um novo substituto para esta função?
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top