2016-05-05 1 views
4

La case à cocher "Smart caractères" dans la section "Code Completion" Paramètres navigateur (au moins) deux choses:Pharo: personnalisation des personnages intelligents

1) Il double des caractères une fois dactylographié: », », (, [{

2) Il permet que je peux choisir un morceau de code, appuyez sur ( (c.-à-Shift+9), et le code sélectionné devient entouré par des parenthèses. () Je peux également supprimer entre parenthèses en appuyant de nouveau ( moi aussi. peut le faire avec [] en appuyant sur [ et avec {} en appuyant sur {, soit Shift+[. Je n'aime pas le premier de ces choses, donc je veux le désactiver, mais j'aime la deuxième chose et je veux le garder. Comment puis-je atteindre cet objectif? Désactiver la case à cocher désactivera les deux.

P.S. Je sais que lorsque la case est désactivée, ajouter/supprimer des parenthèses fonctionne par Cmd+Shift+9 (ce qui est moins pratique que Shift+9) et que Cmd+[ fonctionne pour [], bien que je ne connaisse aucun raccourci de travail pour ajouter/supprimer {} lorsque la case à cocher est désactivée.

Répondre

3

Le paramètre s'appelle "Smart Characters", ce qui devrait vous donner une idée de l'endroit où chercher. Ouvrez un Finder, tapez smartCharacters et appuyez sur Entrez. Vous devriez voir quelques correspondances partielles ainsi qu'une correspondance exacte pour NECController et NECPreferences class (et le premier appelle simplement le dernier). Si vous étudiez les classes impliquées un peu, vous verrez que smartCharacters stocke un booléen et que smartCharactersMapping renvoie un dictionnaire mappant certains caractères à leurs "homologues", c'est-à-dire $[ à $] et ainsi de suite. Maintenant, regardez les expéditeurs de smartCharactersMapping, et vous verrez d'où il est appelé.

L'appelant qui vous intéresse le plus serait le NECController>>smartCharacterWithEvent. Alors mettez un point d'arrêt dans cette très laide méthode pour voir ce qu'il fait. Vous ne vous souciez pas des deux premiers cas (l'éditeur ayant une sélection et pas un mappage intelligent), puisque vous voulez empêcher l'insertion du second caractère correspondant. Donc, le bit intéressant pour vous est ce bit:

self newSmartCharacterInsertionStringForLeft: char right: opposite 

La méthode n'a qu'un seul implementor et que l'un expéditeur, il devrait donc être sûr de commenter la méthode originale et juste retourner le caractère « gauche », à savoir:

newSmartCharacterInsertionStringForLeft: left right: right 
    ^String with: left 

En d'autres termes, au lieu de créer une chaîne avec les caractères à gauche et à droite, et peut-être des espaces entre eux, il suffit de retourner une nouvelle chaîne avec le caractère que vous avez saisi. Peut-être pas la manière la plus élégante de résoudre cela, mais cela devrait fonctionner, et devrait vous montrer comment résoudre des problèmes similaires à l'avenir.

(Idéalement, vous trouverez une meilleure solution, poster ici comme une réponse alternative, et contribuez au Pharo codebase -. Pharo est open source, après tout)

+0

Merci. La substitution que vous avez proposée 'newSmartCharacterInsertionStringForLeft: left right: right ^ Chaîne avec: left' rend le nom de la méthode trompeur, donc au lieu de changer l'implémentation de cette méthode j'ai commenté l'appel de cette méthode (' self newSmartCharacterInsertionStringForLeft: char right: opposé '), en le remplaçant simplement par' String with: char'.

+0

Mais cela était encore trop profond (tout un tas de code qui en résultait est devenu inutile mais était toujours en cours d'exécution), alors j'ai grimpé et commenté toute la seconde partie de 'smartCharacterWithEvent:' méthode, en commençant par 'opposite: =', à travers la fin, et l'a substitué par '^ nil'. –

+0

Pourquoi diable je ne peux pas éditer mon commentaire après 5 minutes? :( Et 600 caractères par limitation de commentaire semble trop restrictif ... Et comment puis-je insérer un saut de ligne ici? –