Afficher le début d'une étendue lorsqu'elle est hors écran

12

Je voudrais afficher la partie d'ouverture d'une lunette lorsque celle-ci sort de l'écran.

Exemple:

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

Cela pourrait fonctionner pour de nombreux langages de programmation, mais je pense principalement au C ++.

Pour clarifier un peu plus et pour ceux qui connaissent VS, je voudrais une fonctionnalité similaire à celle qui existe pour Visual Studio. c'est-à-dire que le positionnement du curseur à la fin d'une étendue affiche le début de l'étendue en haut du tampon d'édition.

Cette fonctionnalité existe-t-elle déjà quelque part?

log0
la source
Je suis curieux, ma réponse a-t-elle aidé?
Tu Do
@TuDo oui! J'ai juste eu le temps de jeter un œil. J'avais déjà une sémantique et l'activation du mode global-semantic-stickyfunc fonctionnait bien. Merci. Mon problème est maintenant que la couleur ne rend pas la ligne d'en-tête lisible.
log0

Réponses:

14

Si vous écrivez C / C ++ / Java / Emacs Lisp / Python, alors le mode sémantique-collant-func fera ce que vous voulez.

REMARQUE : Cela semble fonctionner avec CEDET de Git, pas en stock CEDET actuellement dans Emacs 24.4. Pour obtenir Emacs de Git:

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

Et chargez d'abord CEDET au-dessus de tout le reste dans votre fichier 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"))

Lorsqu'il est activé, ce mode montre que le point de fonction est actuellement dans la première ligne du tampon actuel. Cela est utile lorsque vous avez une fonction très longue qui s'étale sur plus d'un écran, et que vous n'avez pas à faire défiler vers le haut pour lire le nom de la fonction, puis vers le bas jusqu'à sa position d'origine.

Il affiche une interface de fonction complète (type de retour, nom de fonction et paramètres), pas seulement le nom de fonction.

Pour l'activer, mettez ce code dans votre fichier init:

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

MISE À JOUR : L'un des problèmes du courant semantic-stickyfunc-modeest qu'il n'affiche pas tous les paramètres dispersés sur plusieurs lignes. Pour résoudre ce problème, j'ai créé le package stickyfunc-enhancement .

DÉMO :

Voici une démo en C:

sémantique-collant-func-mode-c

Voici une démo dans Emacs Lisp:

sémantique-collant-func-mode-elisp

MISE À JOUR : Alternativement, vous pouvez utiliser helm-semantic-or-imenu . Lorsque vous êtes à l'intérieur d'une fonction et exécutez la commande, le curseur est placé directement sur la fonction dans la liste, de sorte que vous pouvez toujours voir l'interface complète de la fonction. DÉMO:

  • Tout d'abord, j'utilise helm-semantic-or-imenupour passer à la fonction helm-define-key-with-subkeyset y déplacer le point.

  • Ensuite, je recommence helm-semantic-or-imenuet helm-define-key-with-subkeysest présélectionné.

  • Ensuite, je déplace le point vers la variable helm-map et exécute à helm-semantic-or-imenunouveau sur deux fonctions: helm-next-source et helm-previous-source. Cette fois, au lieu d'afficher la balise sémantique actuelle dans laquelle j'opère (qui est helm-map), elle montre les deux autres balises dans le tampon Helm Semantic. En effet, j'ai fourni un argument préfixe avant d'exécuter la commande.

Cette démo est également dans Emacs Lisp, elle fonctionne également pour C / C ++ et elle est plus flexible si vous avez une interface de fonction très longue.

helm-semantic-or-imenu

Tu Do
la source
Comment avez-vous fait en sorte que cela fonctionne pour Lisp (Elisp en particulier)? J'ai évalué votre code emacs -Qmais je n'obtiens pas le comportement que vous décrivez lorsque je navigue, par exemple org.el.
itsjeyd
J'ai mis à jour la réponse. Vous devriez l'essayer avec Semantic de bzr.
Tu Do
1
Totalement hors sujet. Merci de m'avoir présenté le mode Nyan. Mon codage ne sera plus jamais le même.
purple_arrows
6

Vous pouvez allumer which-function-modeen faisant

M-x which-function-mode RET

Pour rendre le paramètre permanent, ajoutez

(which-function-mode 1)

dans votre fichier init.

De la documentation:

Basculer l'affichage en ligne du mode de la fonction actuelle (mode quelle fonction). [...]

Quel mode Function est un mode mineur global. Lorsqu'il est activé, le nom de la fonction actuelle est affiché en continu dans la ligne de mode , dans certains modes principaux.

Remarque : Le nom ne le suggère pas vraiment, mais cela fonctionne non seulement pour les "fonctions", mais aussi pour d'autres types de portées. Par exemple, dans org-mode, which-function-modeaffiche l'en-tête de la sous-arborescence actuelle.

itsjeyd
la source
Merci! J'aime que le nom de la fonction soit affiché dans la ligne de mode. Cependant, certains cas ne fonctionnaient pas très bien. Comme la méthode dans une structure dans un espace de noms, seul le nom de l'espace de noms était affiché
log0