Traitez les symboles comme des mots dans les modes prog

12

Il existe un certain nombre de commandes dans Emacs qui s'appliquent aux «mots». Les exemples incluent forward-word, kill-word, upcase-word, mark-word, transpose-words, etc. La définition de « mot » semble varier un peu entre les commandes. Par exemple, forward-words'arrêtera à un trait de soulignement dans un mot (par exemple foo_bar) mais mark-wordne s'arrêtera pas au trait de soulignement.

Est-il possible de changer la définition de "mot" lorsque je suis en mode prog pour qu'Emacs utilise les limites de mots appropriées pour la syntaxe de la langue actuelle?

Quand je suis que c-modeje veux forward-wordsauter sur underscores, et quand je suis lisp-modeje veux forward-wordsauter sur les deux traits d' union, etc. et underscores

nispio
la source

Réponses:

4

Emacs devrait déjà utiliser " les limites de mots appropriées pour la syntaxe de la langue actuelle ". Si ce n'est pas le cas, déposez un bogue pour le mode principal pour cette langue.

Mais peut-être que vous ne voulez pas vraiment dire des mots . Peut-être que vous voulez dire la syntaxe des symboles , pas la syntaxe des mots. Emacs les distingue.

Pour la syntaxe des symboles, utilisez les commandes de symboles, pas les commandes de mots:, forward-symboletc. D'après votre description, c'est ce que vous voulez vraiment.

Si vous sentez que vous voulez vraiment utiliser une fonction de mot sur un symbole, vous pouvez changer la catégorie de syntaxe de caractères particuliers pour avoir une syntaxe de constituant de mot au lieu d'une syntaxe de constituant de symbole. Mais en général, ce n'est pas ce que vous voulez faire et vous ne devriez pas avoir besoin de le faire.

Voir le manuel Elisp pour plus d'informations sur la syntaxe des caractères. Et voir le manuel Emacs et le manuel Elisp pour les commandes et autres fonctions qui opèrent sur les symboles (pas les symboles Lisp, mais le texte avec la syntaxe des symboles, dans n'importe quelle langue).

Et gardez à l'esprit que les opérations sur sexps sont souvent utiles également pour agir sur les symboles: C-M-f( forward-sexp), C-M-t( transpose-sexps), etc.

A dessiné
la source
C-M-fest lié à forward-sexpet ne se comporte en rien comme ce que vous décrivez. Vous avez raison de dire que ce que je veux, c'est naviguer par symboles, mais je ne vois pas cette option.
nispio
@nispio forward sexpest essentiellement la forward-symbolplupart du temps, avec la polyvalence supplémentaire de passer également en revue les accolades correspondantes. Tu devrais lui donner une chance.
Malabarba
@Malabarba Je ne suis pas du tout d'accord pour forward-sexpdire qu'il s'agit d'une approximation proche de forward-symbol. Pour commencer, il peut vous sauter de manière confuse sur des fonctions entières, vous faisant atterrir des centaines de lignes d'où vous avez commencé. Il saute également sur les listes d'arguments, etc. Et essayez ceci: étant donné le code lisp suivant, (global-set-key [remap list-buffers] 'ibuffer)placez votre curseur au milieu du mot remapet exécutez forward-sexp-le plusieurs fois. Il déclenche une erreur lorsqu'il atteint la fermeture ]. Non merci.
nispio
@nispio J'utilise toujours une combinaison de sexp et de navigation par mots. De cette façon, je peux éviter l'un de ces problèmes, tout en ayant la polyvalence des deux. Mais c'est une question de préférence. ;-) Si vous savez que vous ne manquerez jamais la navigation dans les mots, c'est superword-modepeut-être votre gars.
Malabarba
Désolé, je n'aurais pas dû suggérer cela C-M-fet C-M-tagir sur les symboles (ils agissent sur sexps). Je vais modifier pour corriger cette impression. Mais vous pouvez certainement vous lier forward-symbolà n'importe quelle touche que vous aimez, si vous la trouvez particulièrement utile. Il n'y en a pas transpose-symbols, mais vous pouvez encore en écrire un, si vous pensez que c'est utile.
Drew
11

Jetez un oeil à superword-modeet subword-mode. Superword traite les traits de soulignement comme faisant partie d'un mot au lieu d'une limite, il foo_bar serait donc traité comme un seul mot .
Subword fait le contraire, mais pour camelCase, il fooBarest donc traité comme deux mots au lieu d'un.

Cela ressemble au comportement que vous souhaitez cc-modeutiliser superword-mode.

(add-hook 'c-mode-common-hook 'superword-mode)

Je recommanderais de lire la source car subword-mode, même si ces deux modes ne font pas exactement ce que vous voulez, ils devraient vous montrer comment changer le comportement de détection des mots.

Discussion plus longue sur emacsredux et ergomacs .

dgtized
la source
Est-il possible de rendre le superword-modejeu agréable avec paredit? Par exemple, paredit-forward-kill-wordne supprime pas le mot entier (contenant des traits de soulignement) lorsque superword-modeest activé.
Renan Ranelli
Il change la définition d'un mot et pareditrespecte cela, alors je pense qu'il fait ce qu'on lui demande.
organisé
Le fait est que le paredit ne respecte pas cela. paredit-forward-kill-wordne tue pas le même mot défini par superword-mode.
Renan Ranelli
Oh j'ai mal lu. Hmm. Je viens de jeter un coup d'œil paredit-forward-kill-wordet on dirait qu'il fait sa propre analyse. Donc, vous pourriez peut-être échanger cela, mais probablement pas.
organisé
3

Si j'ai compris votre question, vous pouvez modifier la table de syntaxe du langage, par exemple pour c ++:

(modify-syntax-entry ?_ "w" c++-mode-syntax-table)

M-x apropos alors la recherche de table de syntaxe devrait aussi vous aider.

Nsukami _
la source