Comment faire des séparateurs en mot
Maintenant, vous me faites vérifier le code :-)
Voici la partie pertinente du fichier CharClassify.cxx:
annuler CharClassify :: SetDefaultCharClasses (Bool includeWordClass) // Initialiser toutes les classes char aux valeurs par défaut
for (int ch = 0; ch < 256; ch++) if (ch == '\r' || ch == '\n')
charClass [ch] = ccNewLine;
else if (ch < 0x20 || ch == ' ')
charClass [ch] = ccSpace;
else if (includeWordClass - (ch> = 0x80 || isalnum (ch) || ch == '_'))
charClass [ch] = ccWord;
autre
charClass [ch] = ccPunctuation;
>
>
vide CharClassify :: SetCharClasses (const unsigned char de caractères, cc newCharClass) // Appliquer le newCharClass aux caractères spécifiées
si (caractères) while (caractères) charClass [* caractères] = static_cast
caractères ++;
>
>
>
word_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"
for i in range (129257):
word_chars + = chr (i)
editor.setWordChars (word_chars)
Code devrait être assez clair, des choses ASCII (<128) goes into first line, this is what you should edit to set desired result. High values (>128) sont simplement annexés dans la chaîne. Vous pouvez obtenir de meilleures performances en Python si vous utilisez list.append et méthodes string.join de concaténation de chaîne (mieux exécuter encore qu'une fois et copie résultat dans la chaîne hardcoded, boucle éliminant donc tout à fait), mais je considère cela comme un gain trivial laisse ainsi le garder comme ça.
Je l'ai fait une recherche sur « setWhitespaceChars » et ils disent ce sujet:
« Régler le jeu de caractères constituant des espaces pour lors du déplacement ou en sélectionnant par mot. Devrait être appelé après SetWordChars »
Je trouve aussi qu'il ya un getWhitespaceChars () et donc pour ne pas salir avec quoi que ce soit, mais le $, ne serait-il préférable de faire quelque chose comme ceci:
white_chars = Editor.getWhitespaceChars ()
retirer $ de white_chars
Editor.setWhitespaceChars (white_chars)
Je n'ai pas la moindre idée sur la façon d'écrire, de sorte que Notepad ++ comprend. Ou où mettre en sorte que Notepad ++ va agir sur elle. Je suis tout à fait nouveau pour Notepad ++ et normalement j'utiliser C ++ Builder, je n'utiliser que Notepad ++ pour php et xml.
Post-scriptum Comment obtenez-vous ces boîtes de code gris.
Merci à la fois cchris et Loreia
Meilleures salutations
Asger-P
voici l'affaire. Pensez Notepad ++ comme une enveloppe autour du composant d'édition Scintilla. C'est une simplification, mais assez bon pour cette conversation. Scintilla fonctionne avec des chaînes UTF-8. Ainsi, Notepad ++ ne définit pas « WordChars » directement, il envoie simplement SCI_SETCHARSDEFAULT à Scintilla.dll.
Ceci est le code qui est exécuté sur le côté Scintilla:
cas SCI_SETCHARSDEFAULT:
pdoc-> SetDefaultCharClasses (true);
Pause;
ce qui conduit à cela en fait:
vide CharClassify :: SetCharClasses (const unsigned char de caractères, cc newCharClass) // Appliquer le newCharClass aux caractères spécifiées
si (caractères) while (caractères) charClass [* caractères] = static_cast
caractères ++;
>
>
>
Avant de nous passons à Python, voici ce qui fait SCI_SETWHITESPACECHARS:
Ainsi, editor.setWhitespaceChars (white_chars) est inutile pour vous, car il ne peut définir la définition de « whiteSpace » caractères, vous devez étendre la définition de « WordChars ». Au fond, il n'y a pas moyen de tricher. vous devez définir la valeur absolue pour « WordChars ». Vous ne pouvez pas ajouter ou supprimer des trucs de définition par défaut.
Et nous revenons au même code Python:
Cette fois, j'ajouté signe dollar à la liste. Copiez ce, l'exécuter, et il fonctionne (je l'ai testé quelque chose de très similaire, il ne fonctionne :-))
il y a quelque temps j'ai eu la même question et je ne comprend toujours pas résolu en réglant la
mot carbonise lors du démarrage uniquement. Il était bizarre, il a travaillé si le script php était
déjà ouvert (en disant qu'il était connu comme un fichier qui a été ouvert après le démarrage NPP automatiquement) mais quand j'ai ouvert un nouveau script php, il ne fonctionne pas.
Ma solution est similaire à Loreias sauf que j'enregistrer un rappel lorsque
NPP est prêt et s'activé tampon. Soit dit en passant, il y a une petite erreur
dans le script, il doit être
voici donc le code de mon startup.py (utilisateur)
Donc, créer un nouveau script appelé startup.py, copiez le code, définissez la
initialition à atstartup, comme cela a déjà expliqué par Loreia et redémarré NPP.
Depuis lors - Je n'ai pas plus de problème. BTW. la question / problème avec cette solution est,
que chaque commutateur d'un document déclenche un événement activé tampon, mais comme déjà dit,
ce fut la seule façon que je pouvais eu le temps de cela.
L'utilisation callbacks n'est pas nécessaire, je crois que votre problème est ici:
Un tel script existe déjà et il est, par défaut, placé ici (sur ma machine Win 7):
C: \ Program Files (x86) \ Notepad ++ \ plugins \ PythonScript \ scripts
Et après le redémarrage, un double-clic inclut signe dollar.
Pouvez-vous répéter les mêmes étapes et vérifier que cela fonctionne pour vous?
Salut Loreia
Merci d'avoir pris le temps d'aider.
J'ai mis le code dans mon startup.py il ressemble maintenant à ceci:
Dans: Plugin -> Scripts Python -> Configuration j'ai choisi ATSTARTUP au lieu de LAZY.
Je ne comprends toujours pas sélectionné $ dans la variable $ seule variable lorsque je double clic sur le mot. (J'utilise la version 6.6.3 NPP).
Merci encore
Meilleures salutations
Asger
vous avez raison, il y a déjà un startup.py. D'après ce que je comprends, Dave a présenté
un script startup.py « spécifique à la machine », qui est celui que vous faites référence à et a donné la
utilisateurs la possibilité de créer leur propre startup.py. Ce script « spécifique à l'utilisateur », une fois
créé, est situé sous
Je l'utilise de cette façon parce que je ne voulais pas déranger avec le script Daves et en plus
Je ne peux pas être sûr qu'il le change contenu avec, disons, la prochaine mise à jour.
En utilisant votre chemin, il ne fonctionne que si le script php s'ouvre automatiquement au cours
NPP statup. Chaque fois que j'ouvre un nouveau script php, il est cassé à nouveau.
Pouvez-vous ajouter une ligne à votre startup.py? Juste quelque chose qui imprime « Je suis un message vivant », dire quelque chose comme ceci:
Puis, après vérification de redémarrage si vous pouvez voir ce message dans la console PythonScript. Je veux juste déterminer ce script approprié est exécuté.
Si cela ne fonctionne toujours pas, vous pouvez télécharger la version ZIP et essayer de là? De cette façon vous permettra d'éliminer les éventuels problèmes dans vos paramètres de configuration actuels, tant en plug-in et l'application principale.
Je vois cela dans ma fenêtre de la console:
Mais comme la première ligne. Il se pourrait que Claudia a un point.
Aaaaah, a juste fait un chèque, j'essayé de mettre en un mot de $ dans le startup.py et dans ce fichier le $ se sélectionné avec le mot, mais pas dans mes fichiers php.
Est-ce que ça fonctionne dans les fichiers php sur votre configuration?
Y a-t-il un moyen de contourner ceci ?
Merci pour ton aide
Meilleures salutations
Asger-P
Donc, de mon point il ressemble à Scintilla / NPP crée le mot à chaque fois que les caractères
une mémoire tampon doit être activé. Unfortunattely, l'interface brillante script python
ne pas les SCI_GETWORDCHARS sinon nous pourrions mis en œuvre facilement proove mon hypothèse.
vous avez raison, ce code doit être exécuté une fois par tampon. Il est pas au niveau de l'application applicable, elle affecte le tampon actif (fichier ouvert) uniquement.
Ainsi, les callbacks sont la seule façon de le faire, nous avons juste besoin de trouver des notifications qui couvrent toutes les possibilités: les nouveaux fichiers ouverts, ouvrir des fichiers existants et dossiers ouverts par l'application principale après le redémarrage.
Ensuite, nous pouvons simplifier votre code comme ceci:
def extendWordChar (args):
word_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_ $"
for i in range (128256):
word_chars + = chr (i)
editor.setWordChars (word_chars)
notepad.callback (extendWordChar, [NOTIFICATION.NOTIFICATION1, NOTIFICATION.NOTIFICATION3, NOTIFICATION.NOTIFICATION3])
BTW. Nous vous remercions de UDL2 - travail très agréable.
Il ressemble à BUFFERACTIVATE est la seule solution pour ce problème. FILEOPENED fonctionne pour les fichiers qui sont ouverts après le démarrage de l'application, mais il semble que Notepad ++ charge les anciens fichiers avant initialisées PythonScript.
Cela laisse BUFFERACTIVATE comme le seul moyen sûr d'envoyer ce message à Scintilla pour chaque tampon.
Longue histoire courte, voici le code qui fonctionne:
def extendWordChar (args):
word_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_ $"
for i in range (128256):
word_chars + = chr (i)
editor.setWordChars (word_chars)
notepad.callback (extendWordChar, [NOTIFICATION.BUFFERACTIVATED, NOTIFICATION.READY])
Je ne sais pas pourquoi vous avez inclus NOTIFICATION.READY. Selon la documentation de cette notification ne comprend même pas « bufferid ». Je pense que celui-ci pourrait être redondant. Peut-on vous deux tests code ci-dessus avec juste [NOTIFICATION.BUFFERACTIVATED]?
Je pense que cela devrait être la version finale.
.
BTW. Nous vous remercions de UDL2 - travail très agréable.
Je vous en prie. Gardez un oeil sur prochaine version, il devrait être prêt cette dernière année. UDL 3.0 sera beaucoup améliorée. En fait, la seule raison pour laquelle j'ai remarqué ce fil était parce que je travaillais sur l'ajout de cette même fonctionnalité dans la nouvelle UDL. Avec UDL 3.0, ce fil deviendra obsolète :-)
nous avons besoin de la notification READY pour un seul cas, ce qui est quand le script php est le dernier document actif avant NPP près. Au prochain démarrage du document php est celui qui est actif
mais nous obtenons seulement un événement READY et non un événement BUFFERACTIVATED.
Je reçois maintenant, merci.
Ce fil pourrait devenir obsolète, mais maintenant il est un fil d'or.
Je suis d'accord, il m'a aidé à apprendre quelques petites choses. Je vous remercie.
La prochaine chose serait de le faire selon le type de fichier .;)
vérification du type de fichier en Python est vraiment facile. Pour être honnête tout est facile en Python :-)
def extendWordChar (args):
si "bufferid" args:
nom de fichier, extension = os.path.splitext (notepad.getBufferFilename (args [ "bufferid"]))
si l'extension pas ( "php", "txt", "xyz"):
revenir
word_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_ $"
for i in range (128256):
word_chars + = chr (i)
editor.setWordChars (word_chars)
notepad.callback (extendWordChar, [NOTIFICATION.BUFFERACTIVATED, NOTIFICATION.READY])
Est-ce ce que tu avais en tête?