Exibir o início de um escopo quando estiver fora da tela

12

Gostaria de exibir a parte inicial de um escopo quando este sair da tela.

Exemplo:

namespace a  
{  
...  
--------------------- <- display frame 
...                 |  
}*                  | * when cursor is here display "namespace a" in the minibuffer
---------------------   or on screen

Isso poderia funcionar para muitas linguagens de programação, mas estou pensando principalmente em C ++.

Para esclarecer um pouco mais e para quem conhece o VS, eu gostaria de um recurso semelhante ao que existe para o Visual Studio. ou seja, posicionar o cursor no final de um escopo exibe o início do escopo na parte superior do buffer de edição.

Esse recurso já existe em algum lugar?

log0
fonte
Estou curioso, minha resposta ajudou?
Tu Do
@TuDo yes! Eu só tive tempo de dar uma olhada. Eu já tinha semântica e apenas ativar o modo global semântico-pegajoso funcionou bem. Obrigado. Meu problema agora é que a cor não faz a leitura headerline ..
log0

Respostas:

14

Se você estiver escrevendo C / C ++ / Java / Emacs Lisp / Python, o modo semântico-função-pegajosa fará o que você deseja.

NOTA : Isso parece estar funcionando com o CEDET do Git, não com o estoque CEDET atualmente no Emacs 24.4. Para obter o Emacs no Git:

git clone http://git.code.sf.net/p/cedet/git cedet

E carregue o CEDET primeiro acima de tudo no seu arquivo init:

(load-file (concat user-emacs-directory "/cedet/cedet-devel-load.el"))
(add-to-list 'load-path (concat user-emacs-directory "cedet/contrib"))
(load-file (concat user-emacs-directory "cedet/contrib/cedet-contrib-load.el"))

Quando ativado, este modo mostra que o ponto de função está atualmente na primeira linha do buffer atual. Isso é útil quando você tem uma função muito longa que se espalha mais que uma tela e não precisa rolar para cima para ler o nome da função e, em seguida, rolar para baixo até a posição original.

Ele exibe a interface completa da função (tipo de retorno, nome da função e parâmetros), não apenas o nome da função.

Para habilitá-lo, coloque este código no seu arquivo init:

(require 'semantic)
(semantic-mode 1)
(global-semantic-stickyfunc-mode 1)

ATUALIZAÇÃO : Um dos problemas com a corrente semantic-stickyfunc-modeé que ela não exibe todos os parâmetros espalhados em várias linhas. Para resolver esse problema, criei o pacote stickyfunc-enhancer .

DEMO :

Aqui está uma demonstração em C:

semântico-pegajoso-func-modo-c

Aqui está uma demonstração no Emacs Lisp:

semântico-pegajoso-func-modo-elisp

ATUALIZAÇÃO : Como alternativa, você pode usar leme-semântico-ou-imenu . Quando você está dentro de uma função e executa o comando, o cursor é colocado diretamente na função da lista, para que você sempre possa ver a interface completa da função. DEMO:

  • Primeiro, eu uso helm-semantic-or-imenupara mover para a função helm-define-key-with-subkeyse mover o ponto para lá.

  • Então, começo helm-semantic-or-imenunovamente e helm-define-key-with-subkeysé pré-selecionado.

  • Então, movo o ponto para a variável helm-map e executo helm-semantic-or-imenunovamente em duas funções: helm-next-source e helm-previous-source. Desta vez, em vez de mostrar a marca semântica atual em que estou operando (que é o mapa do leme), ela mostra as outras duas marcas no buffer semântico de leme. Isso ocorre porque eu forneci um argumento de prefixo antes de executar o comando.

Além disso, esta demonstração está no Emacs Lisp, funciona também com C / C ++ e é mais flexível se você tiver uma interface de função realmente longa.

leme-semântico-ou-imenu

Tu Do
fonte
Como você conseguiu que isso funcionasse para o Lisp (Elisp em particular)? Avaliei seu código, emacs -Qmas não entendo o comportamento que você descreve quando navego, por exemplo org.el,.
itsjeyd
Eu atualizei a resposta. Você deve experimentá-lo com o Semantic da bzr.
Tu Do
1
Totalmente fora do tópico. Obrigado por me apresentar o modo Nyan. Minha codificação nunca mais será a mesma.
purple_arrows
6

Você pode ligar which-function-modefazendo

M-x which-function-mode RET

Para tornar a configuração permanente, adicione

(which-function-mode 1)

para o seu arquivo init.

A partir da documentação:

Alterna a exibição da linha de modo da função atual (modo de função). [...]

Qual modo de função é um modo secundário global. Quando ativado, o nome da função atual é exibido continuamente na linha de modo , em certos modos principais.

Nota : O nome realmente não sugere, mas isso funciona não apenas para "funções", mas também para outros tipos de escopos. Por exemplo, em org-mode, which-function-modeexibe o cabeçalho da subárvore atual.

itsjeyd
fonte
Obrigado! Eu gosto do nome da função sendo exibido na linha de modo. Alguns casos não estavam funcionando muito bem. Como método em um struct em um namespace, o nome do namespace só foi exibida
log0