Community
    • Login

    UDL: Suffix Mode

    Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
    54 Posts 8 Posters 17.3k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Eko palypseE
      Eko palypse @Michael Miller31
      last edited by Eko palypse

      @Michael-Miller31

      would you mind posting a sample program and describing what needs to be done, together with the name of your UDL as is shown in the first
      field of the statusbar? Which npp version are you using? (Can be seen via ? menu -> DebugInfo)

      1 Reply Last reply Reply Quote 2
      • Michael Miller31M
        Michael Miller31
        last edited by

        https://imgur.com/a/eQyqiwM

        1 Reply Last reply Reply Quote 0
        • Michael Miller31M
          Michael Miller31
          last edited by

          Variables are currently in dark green. It would be nice if I could have a different color if a variable ends with a “$”.

          Alan KilbornA 1 Reply Last reply Reply Quote 0
          • Eko palypseE
            Eko palypse
            last edited by

            Ok, you are using npp 7.5.9 which means you should be able to use
            Plugin Manger to install PythonScript plugin.
            (Just keep in mind that if you upgrade to a newer (but still betas) version
            there are a lot of changes in the plugin area!!)

            Could you just copy and paste the example - makes it easier for me to use it for testing :-D

            1 Reply Last reply Reply Quote 2
            • Alan KilbornA
              Alan Kilborn @Michael Miller31
              last edited by

              @Michael-Miller31

              Eko has offered to create something for you (I think). It would be nice if you could give him some actual text – not just a screenshot – to start working with.

              1 Reply Last reply Reply Quote 5
              • Michael Miller31M
                Michael Miller31
                last edited by

                My apologies. I thought you were looking for something visual. Thanks again!

                for index=1 to udim(ButtonNumbers)
                	if Fkey==ButtonNumbers(index) then 
                		let FnHasBeenPressed=1
                		let OrderNumber$=OrderNumbers$(FirstOrderOfPage-61+index)
                		if udim(Keys$) then
                			let UniqueKey$=Keys$(FirstOrderOfPage-61+index)
                		end if 
                	end if
                next index
                
                1 Reply Last reply Reply Quote 5
                • Eko palypseE
                  Eko palypse
                  last edited by

                  Is it always a word which ends with $ or might it be that
                  non-word characters like minus underscore etc… are part of
                  the variable as well.
                  Basically I’m asking if a regex like \w+?\$ would do the job
                  or if it is needed to have something like \b.+?\$\b

                  1 Reply Last reply Reply Quote 0
                  • Eko palypseE
                    Eko palypse
                    last edited by

                    @Eko-palypse said:

                    or maybe a better approach - what allows the language how a variable
                    can be defined

                    1 Reply Last reply Reply Quote 0
                    • Michael Miller31M
                      Michael Miller31
                      last edited by

                      Always with $. The only time $ would ever be used in this language is to end a string variable.

                      1 Reply Last reply Reply Quote 0
                      • Eko palypseE
                        Eko palypse
                        last edited by

                        No, there is a misunderstanding, if I use \w+?\$
                        then a variable like UniqueKey$ will be colored but a variable like
                        Unique-Key$ won’t be.
                        If I know what the language allows, which chars can be used for a
                        variable name, then we can find the right regex to make this work.

                        1 Reply Last reply Reply Quote 0
                        • Michael Miller31M
                          Michael Miller31
                          last edited by

                          String functions can also end with a $ but those I have listed as a keyword in my UDL with prefix mode enabled. Since every function begins with “fn”.

                          1 Reply Last reply Reply Quote 1
                          • Eko palypseE
                            Eko palypse
                            last edited by

                            Good to know - do you have a reference to the language you are using?

                            1 Reply Last reply Reply Quote 0
                            • Michael Miller31M
                              Michael Miller31
                              last edited by

                              http://brwiki2.brulescorp.com/index.php?title=Business_Rules! This is a link to the wiki.

                              1 Reply Last reply Reply Quote 1
                              • Michael Miller31M
                                Michael Miller31
                                last edited by Michael Miller31

                                I can also give you the section from my userDefineLang.xml if it’s helpful

                                1 Reply Last reply Reply Quote 0
                                • Eko palypseE
                                  Eko palypse
                                  last edited by

                                  So this is what we are looking for, right?

                                  1 Reply Last reply Reply Quote 0
                                  • Michael Miller31M
                                    Michael Miller31
                                    last edited by

                                    exactly

                                    1 Reply Last reply Reply Quote 0
                                    • Eko palypseE
                                      Eko palypse
                                      last edited by

                                      First the script

                                      # -*- coding: utf-8 -*-
                                      
                                      from Npp import editor, editor1, editor2, notepad, NOTIFICATION, SCINTILLANOTIFICATION, INDICATORSTYLE
                                      import ctypes
                                      import ctypes.wintypes as wintypes
                                      
                                      from collections import OrderedDict
                                      
                                      try:
                                          EnhanceUDLLexer().main()
                                      except NameError:
                                      
                                          user32 = wintypes.WinDLL('user32')
                                      
                                          WM_USER = 1024
                                          NPPMSG = WM_USER+1000
                                          NPPM_GETLANGUAGEDESC = NPPMSG+84
                                      
                                      
                                          class SingletonEnhanceUDLLexer(type):
                                              _instance = None
                                              def __call__(cls, *args, **kwargs):
                                                  if cls._instance is None:
                                                      cls._instance = super(SingletonEnhanceUDLLexer, cls).__call__(*args, **kwargs)
                                                  return cls._instance
                                      
                                      
                                          class EnhanceUDLLexer(object):
                                      
                                              __metaclass__ = SingletonEnhanceUDLLexer
                                      
                                              @staticmethod
                                              def rgb(r,g,b):
                                                  return (b << 16) + (g << 8) + r
                                      
                                      
                                              @staticmethod
                                              def paint_it(color, pos, length):
                                                  if pos >= 0:
                                                      editor.setIndicatorCurrent(0)
                                                      editor.setIndicatorValue(color)
                                                      editor.indicatorFillRange(pos, length)
                                      
                                      
                                              def style(self):
                                                  start_line = editor.getFirstVisibleLine()
                                                  end_line = start_line + editor.linesOnScreen()
                                                  start_position = editor.positionFromLine(start_line)
                                                  end_position = editor.getLineEndPosition(end_line)
                                                  editor.setIndicatorCurrent(0)
                                                  editor.indicatorClearRange(0, editor.getTextLength())
                                                  for color, regex in self.regexes.items():
                                                      editor.research(regex[0],
                                                                      lambda m: self.paint_it(color[1],
                                                                                              m.span(regex[1])[0],
                                                                                              m.span(regex[1])[1] - m.span(regex[1])[0]),
                                                                      0,
                                                                      start_position,
                                                                      end_position)
                                      
                                      
                                              def configure(self):
                                                  SC_INDICVALUEBIT = 0x1000000
                                                  SC_INDICFLAG_VALUEFORE = 1
                                                  # editor.indicSetFore(0, (181, 188, 201))
                                                  editor1.indicSetStyle(0, INDICATORSTYLE.TEXTFORE)
                                                  editor1.indicSetFlags(0, SC_INDICFLAG_VALUEFORE)
                                                  editor2.indicSetStyle(0, INDICATORSTYLE.TEXTFORE)
                                                  editor2.indicSetFlags(0, SC_INDICFLAG_VALUEFORE)
                                                  self.regexes = OrderedDict()
                                      
                                                  # configuration area
                                                  # self.regexes is a dictionary, basically a key=value list
                                                  # the key is tuple starting with an increasing number and
                                                  # the color which should be used, ored with SC_INDICVALUEBIT
                                                  # the value is a raw bytestring which is the regex whose
                                                  # matches get styled with the previously defined color
                                                  #
                                                  # using OrderedDict ensures that the regex will be
                                                  # always executed in the same order.
                                                  # This might matter if more than one regex is used.
                                                  self.regexes[(0, self.rgb(79, 175, 239)  | SC_INDICVALUEBIT)] = (r'fn[A-Za-z0-9_]+?\$|([A-Za-z0-9_]+?\$)', 1)
                                      
                                                  # defining the lexer_name ensures that
                                                  # only this type of document get styled
                                                  # should be the same name as displayed in first field of statusbar
                                                  self.lexer_name = 'User Defined language file - BR! Source'
                                      
                                      
                                      
                                              def get_lexer_name(self):
                                                  '''
                                                      returns the text which is shown in the
                                                      first field of the statusbar
                                                  '''
                                                  language = notepad.getLangType()
                                                  length = user32.SendMessageW(self.npp_hwnd, NPPM_GETLANGUAGEDESC, language, None)
                                                  buffer = ctypes.create_unicode_buffer(u' '*length)
                                                  user32.SendMessageW(self.npp_hwnd, NPPM_GETLANGUAGEDESC, language, ctypes.byref(buffer))
                                                  # print buffer.value  # uncomment if unsure how the lexername in configure should look like - npp restart needed
                                                  return buffer.value
                                      
                                      
                                              def __init__(self):
                                                  editor.callbackSync(self.on_updateui, [SCINTILLANOTIFICATION.UPDATEUI])
                                                  notepad.callback(self.on_langchanged, [NOTIFICATION.LANGCHANGED])
                                                  notepad.callback(self.on_bufferactivated, [NOTIFICATION.BUFFERACTIVATED])
                                                  self.__is_lexer_doc = False
                                                  self.lexer_name = None
                                                  self.npp_hwnd = user32.FindWindowW(u'Notepad++', None)
                                                  self.configure()
                                      
                                      
                                              def set_lexer_doc(self, bool_value):
                                                  editor.setProperty(self.__class__.__name__, 1 if bool_value is True else -1)
                                                  self.__is_lexer_doc = bool_value
                                      
                                      
                                              def on_bufferactivated(self, args):
                                                  if (self.get_lexer_name() == self.lexer_name) and (editor.getPropertyInt(self.__class__.__name__) != -1):
                                                      self.__is_lexer_doc = True
                                                  else:
                                                      self.__is_lexer_doc = False
                                      
                                      
                                              def on_updateui(self, args):
                                                  if self.__is_lexer_doc:
                                                      self.style()
                                      
                                      
                                              def on_langchanged(self, args):
                                                  self.set_lexer_doc(True if self.get_lexer_name() == self.lexer_name else False)
                                      
                                      
                                              def main(self):
                                                  self.set_lexer_doc(True)
                                                  self.style()
                                      
                                      
                                          EnhanceUDLLexer().main()
                                      
                                      
                                      1 Reply Last reply Reply Quote 2
                                      • Eko palypseE
                                        Eko palypse
                                        last edited by

                                        Do the following

                                        • copy the script

                                        • goto Plugins->Python Script->New Script

                                        • give it a meaningful name and press save button

                                        • paste the script into the newly ceated document

                                        • save it

                                        • open one of your BR! Source files

                                        • click on Plugins->Python Script->Scripts->NAME_OF_THE_NEWLY_CREATED_PYTHONSCRIPT

                                        If you want to know the details, let me know.

                                        1 Reply Last reply Reply Quote 1
                                        • Eko palypseE
                                          Eko palypse
                                          last edited by

                                          btw, when it works like you want and want it to be available automatically
                                          on every npp startup we need to create a USER startup.py but
                                          I guess this can be discussed it the script is useful to you at all

                                          1 Reply Last reply Reply Quote 0
                                          • Michael Miller31M
                                            Michael Miller31
                                            last edited by

                                            Thanks for putting the time into this!

                                            First, will this work on 64 bit N++?

                                            I had some trouble finding a version of Python Script that was compatible but I managed to find a beta version.

                                            also, I’m getting this error.

                                            Traceback (most recent call last):
                                            File “C:\Users\mmiller\AppData\Roaming\Notepad++\plugins\Config\PythonScript\scripts\create_strings.py”, line 4, in <module>
                                            import ctypes
                                            File “C:\Program Files\Notepad++\plugins\PythonScript\lib\ctypes_init_.py”, line 7, in <module>
                                            from _ctypes import Union, Structure, Array
                                            ImportError: No module named _ctypes

                                            Eko palypseE 1 Reply Last reply Reply Quote 1
                                            • First post
                                              Last post
                                            The Community of users of the Notepad++ text editor.
                                            Powered by NodeBB | Contributors