M-x imenu
permite saltar para funções no mesmo arquivo. Liguei-o ao Super-i para facilitar o acesso.
Como navegar rapidamente / pular entre funções no emacs? Eu estou procurando uma maneira de saltar rapidamente para funções no emacs. Estou usando a pesquisa do emacs para fazer isso, mas é muito lenta e falha. Por exemplo, eu preciso certificar-se de digitar uma string que não corresponda ao protótipo de função ou à chamada de função. Eu preciso incluir o tipo de função e implorando de tipo de parâmetros para ele .. e dependendo do estilo de sintaxe de codificação usado no programa, é difícil / inviável fazer. O que exatamente eu estou procurando: algo que eu digito apenas o nome da função e pulo para implorar. Meu idioma atual é o C no linux. Mas se houver tal recurso para outras linguagens de programação e plataformas, por favor me mostre também. Será muito apreciado.
Por favor: não sugira "use um IDE" Eu estou bem com o emacs.
Eu tenho usado cscope
integrado ao Emacs, e funciona muito bem para procurar por funções, variáveis, etc, e pular entre eles.
Editar: em .emacs (ou .xemacs / init.el) eu tenho:
(require 'xcscope)
(setq cscope-do-not-update-database t)
Então, eu apenas corro o cscope manualmente nos arquivos de origem, conforme necessário (para o kernel do Linux, make cscope
, que também funciona em muitos outros grandes projetos).
Como já sugerido por outros, também uso Imenu
exclusivamente para navegar no buffer. Eu acho muito útil fazer isso com uma interface ido
para o Imenu. aqui está minha configuração para ido-imenu
. (esta é uma versão ligeiramente modificada da função que você encontra na página do emacswiki)
(defun ido-imenu ()
"Update the imenu index and then use ido to select a symbol to navigate to.
Symbols matching the text at point are put first in the completion list."
(interactive)
(imenu--make-index-alist)
(let ((name-and-pos '())
(symbol-names '()))
(flet ((addsymbols
(symbol-list)
(when (listp symbol-list)
(dolist (symbol symbol-list)
(let ((name nil) (position nil))
(cond
((and (listp symbol) (imenu--subalist-p symbol))
(addsymbols symbol))
((listp symbol)
(setq name (car symbol))
(setq position (cdr symbol)))
((stringp symbol)
(setq name symbol)
(setq position
(get-text-property 1 'org-imenu-marker symbol))))
(unless (or (null position) (null name))
(add-to-list 'symbol-names name)
(add-to-list 'name-and-pos (cons name position))))))))
(addsymbols imenu--index-alist))
;; If there are matching symbols at point, put them at the beginning
;; of 'symbol-names'.
(let ((symbol-at-point (thing-at-point 'symbol)))
(when symbol-at-point
(let* ((regexp (concat (regexp-quote symbol-at-point) "$"))
(matching-symbols
(delq nil (mapcar
(lambda (symbol)
(if (string-match regexp symbol) symbol))
symbol-names))))
(when matching-symbols
(sort matching-symbols (lambda (a b) (> (length a) (length b))))
(mapc
(lambda (symbol)
(setq symbol-names (cons symbol (delete symbol symbol-names))))
matching-symbols)))))
(let* ((selected-symbol (ido-completing-read "Symbol? " symbol-names))
(position (cdr (assoc selected-symbol name-and-pos))))
(push-mark)
(if (overlayp position)
(goto-char (overlay-start position))
(goto-char position)))))
(global-set-key (kbd "C-x C-i") 'ido-imenu)
E eu posso usar C-x C-i em muitos modos de idiomas que suportam imenu