Function list for Caml



  • I agree, it might have been too complicated but I wanted to treat every case.

    As I say, my problem is not with the regex but how do you change the functionList.xml in order to implement a new language parser. As you said, I already included the assiociation map. That’s why I don’t know where the problem could be 'cause there is a problem : it doesn’t work at all with a .ml file. Nothing is displayed as if it doesn’t know there is a new parser.
    Do you think I did not install NPP well ? Is it normal to have two functionList.xml files which are not related or linked ? One is in AppData\Roaming\Notepad++ and the other one is in Program files\Notepad++

    Thanks you 2 for helping me
    (Tu peux parler en français, je le suis ^^).



  • @Tom-Saury

    Only ONE functionList.xml file will matter for you.

    Do this: Select ? (menu) -> Debug Info… and read the result.

    If Local Conf mode is ON, then the active functionList.xml (and other configuration files) will be in the same folder as notepad++.exe

    If Local Conf mode is OFF, then the active functionList.xml (and other configuration files) will be in %APPDATA%\Notepad++



  • Salut, @tom-saury,

    La fois dernière, j’avais simplement ouvert un nouvel onglet copié ton exemple CAML et choisi the langage Caml pour tester ma solution.

    Cette fois, j’ai copié ton code Caml dans un fichier, nommé test.ml, et, une fois encore, les résultats étaient corects. Dans la fenêtre de Function List, les 4 fonctions n, amis, ncadeau et cadeau étaient bien présentes !

    Personnellement, j’utilise N++ v7.5.8, en configuration locale, placé dans le répertoire D:\@@\758 => Tous les fichiers de configuration se trouvent dans ce dossier ou les ses sous-dossiers :-))

    Si j’étais toi, je testerai la méthode de Scott mais si tu as un peu peur de faire des bêtises, tu peux simplement renommer un des deux fichiers functionList.xml, disons : functionList.tom et de faire le test ( A propos, c’est chouette, d’avoir un prénom de trois lettres comme toi et moi, pour changer l’extension d’un fichier ! )

    Je pense que tu as installé N++ de manière traditionnelle, avec l’“Installer”. Dans ce cas, le fichier, du répertoire C:\Program files\Notepad++, n’est sûrement pas utilisé !

    Maintenant, je te conseille, également, de renommer le répertoire AppData\Roaming\Notepad++ en AppData\Roaming\Old_N++ ( bien sûr, après avoir fermé toutes les instances de N++ ouvertes ! )

    A la prochaine ouverture de N++, une nouvelle arborescence de travail AppData\Roaming\Notepad++ devrait être créée, avec les sous-répertoires adéquats. Tu verras bien si FunctionList fonctionne, cette fois !

    Si ce n’est pas mieux ( ou même pire !), tu pourras toujours renommer AppData\Roaming\Old_N++ en AppData\Roaming\Notepad++. Rien ne sera perdu ;-))

    A+ ( For non-French speakers, it’s a very-common shortcut of the French expression “À plus tard”, which could be translated as “See you later” ! )

    guy038



  • Thanks all of you !

    Problem solved with @guy038’s method making a backup of the Notepad++ folder in AppData and delenting this one. Maybe you have you have to restart NPP to refresh the functionList rules. I don’t know why, but it was as if it kept the old functionList.xml even if I had modified it. Weird… Now, I will improve the regex selector, I will share here the code for those who are interested.

    Merci à toi @guy038, j’ai fait exactement ce que tu m’as dit et ça a marché. J’avoue que je réchignais un peu à faire ça car j’avais pas mal customisé NPP mais j’ai juste à copier-coller le contenu donc aucun problème. ^^



  • @Tom-Saury said:

    Maybe you have you have to restart NPP to refresh the functionList rules

    Yes! If you manually-edit any of Notepad++'s configuration files (and for functionList.xml that is the only way), changes aren’t going to be picked up until you restart Notepad++. I really think this is obvious, even if you aren’t all that familiar with Notepad++.

    And FYI, be careful when manually editing other config files, because upon shutdown Notepad++ may need to overwrite them with its own changes, blowing away any manual edits you may have done.



  • Wasn’t obvious to me, my bad. This post wouldn’t be there if I knew this. :
    It’s written no where, how can you know that the refresh button doesn’t refresh the rules ?



  • @Tom-Saury

    Wasn’t obvious to me

    That’s fine, we all have different levels of experience with computers in general. I hope you didn’t spend a lot of time thinking your expressions must be wrong if the right stuff didn’t happen right when you saved the xml file!

    Later thought: Actually, I don’t know what the refresh button in the Function List window does. For all I know it may do what you originally thought and something else was wrong?



  • The refresh-button refreshes the function list i.e. re-parses the active buffer/source file which isn’t saved yet. When saving a file the refresh is automatically triggered.
    To refresh the parser itself after changing functionList.xml you have to restart Notepad++.



  • Hey everyone !
    Could someone tell me why does “for” match here ?
    Here is my function parser :

                    mainExpr="(?x)                                              # free-spacing (see `RegEx - Pattern Modifiers`)
                            let                                                 # start-of-function indicator...
                            \s+                                                 # ...should be followed by at least one white-space
    						(rec\s+)?
                            \K                                                  # discard text matched so far
                            [a-z_]\w*                                           # valid character combination for identifiers
                            \s+                                                 # start-of-parameters indicator
                            ([a-z_]\w*(\s+[a-z_]\w*)*\s+                        # several parameters are optional
                            )|(\(\s*\)\s+)                                         # parameters are optional
                            =                                                   # function-header-body separator
                            .+                                                  # whatever, until...
                            \s+in\s                                             # ...end-of-function indicator
                        "
    

    and here is my source code :

    let boatGenO () =
    	for boat=0 to 4 do
    		let length = boatLength.(boat) in
    		let isPlaced = ref false in
    		while not !isPlaced do
    			if (Random.bool()) then begin
    				let x = Random.int (10-length) and
    					y = Random.int 10 in
    				let canBePlaced = ref true in
    				for i=0 to pred length do
    					if plateauO.(x+i).(y)<>" " then canBePlaced := false;
    				done;
    				if !canBePlaced then begin
    					for d=0 to pred length do
    						plateauO.(x+d).(y) <- (boatSymbol.(boat));
    					done;
    					tabBateauO := Array.concat [!tabBateauO; [|(x, y, (boat, false), 1)|]];
    					isPlaced := true;
    				end;
    			end else begin
    				let y = Random.int (10-length) and
    					x = Random.int 10 in
    				let canBePlaced = ref true in
    				for i=0 to pred length do
    					if plateauO.(x).(y+i)<>" " then canBePlaced := false;
    				done;
    				if !canBePlaced then begin
    					for d=0 to pred length do
    						plateauO.(x).(y+d) <- (boatSymbol.(boat));
    					done;
    					tabBateauO := Array.concat [!tabBateauO; [|(x, y, (boat, false), 0)|]];
    					isPlaced := true;
    				end;
    			end;
    		done;
    	done;
    	Array.iter (fun ligne -> begin
    		print_string "|";
    		Array.iter (fun symb -> print_string (symb^"|");) ligne;
    		print_string "\n";
    		end;) plateauO;
    in
    

    I expected that only boatGenO matchs but it’s not the case and I can’t figure out why.

    Cheers



  • Make sure you have whitespace at the end of your source file e.g. newline.



  • Have a good look at how you parse for (optional) function parameters e.g. are the parentheses optional or mandatory?



  • Furthermore, I presume

    ([a-z_]\w*(\s+[a-z_]\w*)*\s+)|(\(\s*\)\s+)
    

    is intended as

    ([a-z_]\w*(\s+[a-z_]\w*)*\s+|\(\s*\)\s+)
    


  • Indeed, the whitespace at the end was a problem so I replaced \s+in\s with \sin$
    Still the problem with “for”. I noticed that it happend only with functions which has no parameters, but why…



  • Did also remove the superfluous parentheses?


Log in to reply