• Login
Community
  • Login

UDL: Suffix Mode

Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
54 Posts 8 Posters 18.0k 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.
  • M
    Michael Miller31
    last edited by Feb 14, 2019, 2:09 PM

    https://imgur.com/a/eQyqiwM

    1 Reply Last reply Reply Quote 0
    • M
      Michael Miller31
      last edited by Feb 14, 2019, 2:12 PM

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

      A 1 Reply Last reply Feb 14, 2019, 2:17 PM Reply Quote 0
      • E
        Eko palypse
        last edited by Feb 14, 2019, 2:17 PM

        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
        • A
          Alan Kilborn @Michael Miller31
          last edited by Feb 14, 2019, 2:17 PM

          @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
          • M
            Michael Miller31
            last edited by Feb 14, 2019, 2:24 PM

            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
            • E
              Eko palypse
              last edited by Feb 14, 2019, 2:54 PM

              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
              • E
                Eko palypse
                last edited by Feb 14, 2019, 3:00 PM

                @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
                • M
                  Michael Miller31
                  last edited by Feb 14, 2019, 3:06 PM

                  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
                  • E
                    Eko palypse
                    last edited by Feb 14, 2019, 3:16 PM

                    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
                    • M
                      Michael Miller31
                      last edited by Feb 14, 2019, 3:18 PM

                      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
                      • E
                        Eko palypse
                        last edited by Feb 14, 2019, 3:20 PM

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

                        1 Reply Last reply Reply Quote 0
                        • M
                          Michael Miller31
                          last edited by Feb 14, 2019, 3:23 PM

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

                          1 Reply Last reply Reply Quote 1
                          • M
                            Michael Miller31
                            last edited by Michael Miller31 Feb 14, 2019, 3:29 PM Feb 14, 2019, 3:28 PM

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

                            1 Reply Last reply Reply Quote 0
                            • E
                              Eko palypse
                              last edited by Feb 14, 2019, 3:30 PM

                              So this is what we are looking for, right?

                              1 Reply Last reply Reply Quote 0
                              • M
                                Michael Miller31
                                last edited by Feb 14, 2019, 3:31 PM

                                exactly

                                1 Reply Last reply Reply Quote 0
                                • E
                                  Eko palypse
                                  last edited by Feb 14, 2019, 4:07 PM

                                  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
                                  • E
                                    Eko palypse
                                    last edited by Feb 14, 2019, 4:08 PM

                                    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
                                    • E
                                      Eko palypse
                                      last edited by Feb 14, 2019, 4:16 PM

                                      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
                                      • M
                                        Michael Miller31
                                        last edited by Feb 14, 2019, 5:04 PM

                                        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

                                        E 1 Reply Last reply Feb 14, 2019, 5:06 PM Reply Quote 1
                                        • E
                                          Eko palypse @Michael Miller31
                                          last edited by Feb 14, 2019, 5:06 PM

                                          Yes, as I’m using x64 version as well.
                                          Where did you download pythonscript plugin from?
                                          Why didn’t you use Plugin Manager?
                                          The official release channel for python script plugin is here .

                                          1 Reply Last reply Reply Quote 2
                                          14 out of 54
                                          • First post
                                            14/54
                                            Last post
                                          The Community of users of the Notepad++ text editor.
                                          Powered by NodeBB | Contributors