Using a user-defined language as default?



  • I’ve been googling this for the last ~20 minutes and it looks like no one’s found a definitive answer yet. I downloaded a Game Maker language for Notepad ++ and would like to set it as the default language for new documents, but unfortunately no user-defined languages appear in the Settings > Preferences > New Document > Default Language dropdown menu. Anyone know how to make this work? Thanks. =)



  • Hello @Travis-Farris,

    as you already said, this cannot be achieved by npp natively.
    My solution to the porblem would involve the python script plugin
    and this little script.

    def callback_BUFFERACTIVATED(args):
        if 'new' in notepad.getBufferFilename(args['bufferID']):
            notepad.runMenuCommand('Language','HERE_THE_NAME_OF_THE_UDL')
    
    notepad.clearCallbacks([NOTIFICATION.BUFFERACTIVATED ])
    notepad.callback(callback_BUFFERACTIVATED, [NOTIFICATION.BUFFERACTIVATED ])
    

    Current version has some disadvantages like, every time you activate a new… document it calls
    the runMenuCommand to set the udl, even if it was already set and if you chose a different lexer but keep
    the name of the document new… it will reset it once you reactivate it.

    So it’s up to you to

    a) decide if you wanna go this way and if so
    b) how you would handle the mentioned disadvantages. E.g. we could modify it like
    providing some property which indicates that this file has been already set or something else.

    Cheers
    Claudia



  • Hi there,

    This is a feature I’ve been hoping for for a very long time. The python script looks like an ideal workaround. I’m a bit unskilled with Python, but, would this work if I knew a specific pattern for the file I was opening? For example if I knew the path to the file had the string ‘/bank/*/src/[0-9]*’ (almost a regex but not quite).

    Thanks in advance!
    Rich G.



  • Hello @Rich-Goldman,

    in general, yes but of course not with the provided example.
    I would use fnmatch to make the pattern comparison, so something like

    from fnmatch import fnmatch
    
    def callback_BUFFERACTIVATED(args):
        _file = notepad.getBufferFilename(args['bufferID'])
        if fnmatch(_file, '*\Notepad++\plugins\Con*\Python*\*\*.py'):
            current_bufferID = str(args['bufferID'])
            if editor.getProperty(current_bufferID) != '1':
                editor.setProperty(current_bufferID, '1')
                notepad.runMenuCommand('Language','ttp')
    
    notepad.clearCallbacks([NOTIFICATION.BUFFERACTIVATED ])
    notepad.callback(callback_BUFFERACTIVATED, [NOTIFICATION.BUFFERACTIVATED ])
    

    Example makes no sense but is provided to see that it can be done.
    fnmatch works as dir within cmd shell.
    get and setProperty are used to set lexer only once.
    Of course you need to modify

    if fnmatch(_file, '*\Notepad++\plugins\Con*\Python*\*\*.py'):
    

    and

    notepad.runMenuCommand('Language','ttp')
    

    In addition you can also use regex to match certain files.

    Cheers
    Claudia



  • Thanks Claudia Seems great. However… for an idiot like me, how and where do i put this code in order to make it work.
    I really want to make this function happend but i need an idiotproof tutorial how to set it up :))

    Idiot questions:
    Where do i copy paste this code to?
    How do i make this code run as autostart?

    Ofcourse? i need to modify the directory to?
    “language” and ttp should be changed to?

    XD

    Thats my level. Thanks would be great to get this done.
    For myself and for my friend at work who prepares fixtures for a huge ass fiber cutter that cut through 8mm steel np and he also asked me if i could help him with loading his language as autostart default.



  • Hello Adam,

    first you need to have python script plugin installed.
    In case that you haven’t installed python script plugin yet, I would propose to use the MSI package instead of using the plugin manager.

    Once installed, goto
    Plugins->Python script->Configration
    and change Initialisation from LAZY to ATSTARTUP
    Close.

    Plugins->Python script->New Script

    copy and paste the code

    def callback_BUFFERACTIVATED(args):
        if 'new' in notepad.getBufferFilename(args['bufferID']):
            notepad.runMenuCommand('Language','HERE_THE_NAME_OF_THE_UDL')
    
    notepad.clearCallbacks([NOTIFICATION.BUFFERACTIVATED ])
    notepad.callback(callback_BUFFERACTIVATED, [NOTIFICATION.BUFFERACTIVATED ])
    

    save it as startup.py

    Within script replace HERE_THE_NAME_OF_THE_UDL with the name of your UDL.

    Save and restart npp.

    What does the code?
    Everytime a new tab gets opened the function callback_BUFFERACTIVATED gets called.
    It first checks if the tab has a new in its name, if so it selects the proper lexer.

    That’s it - I hope so.

    Cheers
    Claudia



  • Hi There,
    I finally got around to implementing the python script solution. The good news is - it works! The bad news is - it doesn’t seem to work if I open a file from the command line. For example: I have a cygwin script that launches notepad++ and passes a file or list of files on the command line, it basically looks like:

    C:/Program Files (x86)/notepad++/notepad++.exe D:/Users/bank/file.map

    When NPP opens - the file is shown with plain text formatting. If I open a new file that matches my pattern, it works properly, and when I switch back to the first file it gets formatted at that moment. But it seems the initial launch of a file from the command line isn’t sending the BUFFERACTIVATED notification, or the user-defined startup.py runs after the very first BUFFERACTIVATED notification is pushed out.

    I found this on 6.9 and upgraded to 7.1 and I see the same behavior there as well.

    How should I work around this? Is it a bug, or something I’m doing out of sequence?

    Thanks,
    Rich



  • @Rich-Goldman

    When Notepad++ starts up, it has to load up and activate the plugins (e.g. Pythonscript) as well as load the files you specify on the command-line. I’m no expert on it, but I strongly suspect that your command line file(s) get loaded a lot earlier than when all the Pythonscript stuff is in place. Thus, it can’t catch that something special should happen.



  • @Scott-Sumner Thanks - that’s exactly what I was wondering. Sounds like I’m on the right track. The question then becomes, can I somehow trigger the BUFFERACTIVATED signal with a python script so that the auto-UDL piece above will trigger correctly?



  • @Rich-Goldman

    I’m not very familiar with the UDL task you’re trying to accomplish; however, it seems like after your “BUFFERACTIVATED” stuff gets set up in your startup.py, you could trigger it with some code like this, which activates all the files currently in the editor tabs one by one:

    files_tups_list = notepad.getFiles()
    curr_file = notepad.getCurrentFilename()
    for tup in files_tups_list:
        file = tup[0]
        if file != curr_file:
            notepad.activateFile(file)
    notepad.activateFile(curr_file)


  • @Rich-Goldman

    If I understand the function @Claudia-Frank wrote, even if you can somehow get the BUFFERACTIVATED notification from a command line invocation, you would still have to have ‘new’ as part of the file’s name.

    If that is correct and problematic, maybe you could use a simpler Python function that simply sets the language of the current file and is triggered by some hotkey? It wouldn’t be automatic, but it doesn’t seem too painful (to me).

    BTW, you can’t possibly be the Rich Goldman I worked with at TI in the late 80s, right? If so, you must be using an old, old picture for your avatar, or you’ve found the fountain of youth! :)



  • @Jim-Dailey
    sorry for late answer - well it depends, first version of the script
    looks for new files as user was asking for any new file feature.
    The modified version for Rich Goldman uses fnmatch as he was asking
    for a way to look pattern specific.

    @Rich-Goldman
    beside the solution Scott mentioned you might think of
    checking only the current file if it matches your pattern and run
    the MenuCommand to enable your UDL. All other files get set
    once switched to them - as you already stated.

    So something like

    if fnmatch(notepad.getCurrentFilename(), 'YOUR_PATTERN'):
         ... do your stuff ...
    

    before or after your callback definition.

    Cheers
    Claudia


Log in to reply