@alan-kilborn said:
How exactly does the script do this? Does it invoke the menu commands for styling? I ask because, since you are apparently adept at scripting, you could do the styling in a more manual way, and thus avoid limitations about case sensitive/insensitive that you are seeing. Had this not occurred to you?
Due to not knowing how to do it (newbie in PythonScript/Scintille), and having found an example that used the MENUCOMMAND.SEARCH_MARKALLEXT1…5, I originally came up with next:
# Code in startup.py
# not shown: some code to read the keywords from the top of the result-file...
# then next (dirty) code performed the coloring, albeit case sensitive:
iColorIndex = 1
for keyword in lstKeywords:
editor.gotoPos(startpos)
editor.setAnchor(startpos+len(keyword))
exec('notepad.menuCommand( MENUCOMMAND.SEARCH_MARKALLEXT%d )' % iColorIndex) # color 1..cnst_MaxColors
iColorIndex += 1
if iColorIndex > cnst_MaxColors:
break
startpos += len(keyword) + 1 # +1 for the space
Your tip about the SendKeys Python library: I definitely will check this out (on my todo-list).
I probably mis-wrote my point: as @alan-kilborn said, I liked to have it done w/o any manual intervention.
But thx for your neat comments anyway:)
Didn’t know about the functionality of the editor.XXX_indicator_XXX() Scintilla commands.
So I tested your “example”: it DOES THE JOB perfectly!
In your code, we are not dependent anymore of any settings bit, because “re.I” is specified explicitly, brilliant!
So you supplied the perfect solution and I am very grateful for this!
To explain how my piece of the startup.py code works, here a shot of the first few lines of a “result-file” I mentioned earlier, though I couldn’t achieve the formatting like it is shown in my launched Notepad++:
(note: my apologies for the bad formatting, but I have no skills on this whatsoever, read little in the help, then came up with next)
##LANGUAGE=SERESULTS
Runtime: 0.10 s
SE.py version V01.01
User arguments: script python startup
Used arguments: script python startup
TotalMatches = 631 (displayed = 44)
SkipsFor(+) = 0
SkipsFor(-) = 0
-------------------------------------------------------------------
#Header
#Date 2018/12/14
#Title
#Keywords ORGIIIEGB IIITTIMMERS warning Notepad++ plugins PythonScript PluginManager PythonScript_1.0.8.0.msi specialties features files NiceToKnows problems startup
#Body
2015/09/11:
NEVER install pythonScript using the PluginManager, because that gives problems!
Instead, use the installer PythonScript_1.0.8.0.msi (Stop Notepad++, execute this .msi, then start Notepad++ again))
` Configfile:` ` C:\Users\borne\AppData\Roaming\Notepad++\plugins\config\PythonScriptStartup.cnf` ` startup.py:` ` C:\Program Files (x86)\Notepad++\plugins\PythonScript\scripts\startup.py`
#EndBody
-------------------------------------------------------------------
#Header
#Date 2018/12/21
#Title todo Turning a python script into a website
#Keywords ORGIIIEGB todo Turning a python script into a website
#Body
todo: try this out:
https://blog.pythonanywhere.com/169/
#EndBody
-------------------------------------------------------------------
#Header
#Date 2018/12/20
#Title
#Keywords ORGIIIEGB C:\db\Python_Sources\Notepad++PluginPythonScript\Examples\ BracketHighlighter.py ColumnLexer.py CTags Based Autocompletion.py Disable Virtual Space.py Enable Virtual Space.py EnhancedPythonLexer.py Event Handler Demo.py Formatter.py HideLines.py InsertRuler.py LogfileLexer.py MultiEdit.py Python Regex Replacements.py RegexTester.py Remove and Modify selected lines.py ReplaceDefaultReplaceDialog.py Sorter.py StartWithLocalPython.py Swap2Words.py
#Body
C:\db\Python_Sources\Notepad++PluginPythonScript\Examples\
BracketHighlighter.py
ColumnLexer.py
CTags Based Autocompletion.py
(note that the structured database text file is almost the same:
strip off the part before the first ‘-------------’ and replace all lines ‘-----------’ with empty lines)
And here is the resulting startup.py containing your EXCELLENT solution:
# The lines up to and including sys.stderr should always come first # Then any errors that occur later get reported to the console # If you'd prefer to report errors to a file, you can do that instead here. import sys from Npp import * import traceback import re # Set the stderr to the normal console as early as possible, in case of early errors sys.stderr = console # Define a class for writing to the console in red class ConsoleError: def __init__(self): global console self._console = console; def write(self, text): self._console.writeError(text); # Set the stderr to write errors in red sys.stderr = ConsoleError() # This imports the "normal" functions, including "help" import site # This sets the stdout to be the currently active document, so print "hello world", # will insert "hello world" at the current cursor position of the current document sys.stdout = editor #def switch_language_view(args): # notepad.activateBufferID(args["bufferID"]) # lineone = editor.getLine(0) # if '##' in lineone: # #lineone = lineone[lineone.rfind('##'):].replace('##', '') # language = lineone[lineone.rfind('=')+1:] # #lineone = "MENUCOMMAND." + lineone.upper() # try: # #notepad.menuCommand( eval(lineone) ) # #notepad.menuCommand(lineone) # notepad.runMenuCommand("Language", language) # except: # pass def style(x): return 26 - x def match_found(m): editor.indicatorFillRange(m.span(0)[0], m.span(0)[1] - m.span(0)[0]) ##command to link notification #notepad.callback(switch_language_view, [NOTIFICATION.FILEOPENED]) #editor.indicatorClearRange(0, editor.getTextLength()) skip this, as nothing is colored yet try: sFirstLinesOfDoc = editor.getTextRange(0,255) sTarget1 = '##LANGUAGE=SERESULTS' sTarget2 = 'Used arguments: ' pos = sFirstLinesOfDoc.find(sTarget1) if pos == 0: # ok, we are probably dealing with a results file, so continue processing cnst_FirstStyle = 1 cnst_MaxStyles = 5 # 5 Token Styles (== Scintilla indicators, thx @Alan-Kilborn) pos = sFirstLinesOfDoc.find(sTarget2) if pos >= 0: # also found this, so way to go startpos = pos + len(sTarget2) endpos = sFirstLinesOfDoc.find('\r\n', startpos) lstKeywords = sFirstLinesOfDoc[startpos:endpos].split() currentStyle = cnst_FirstStyle for keyword in lstKeywords: editor.setIndicatorCurrent(style(currentStyle)) editor.research(r'\Q' + keyword, match_found, re.I) currentStyle += 1 if currentStyle > cnst_MaxStyles: break except: # next error processing code doesn't work: # - no error can be seen afterwards, even not in the console when it is instructed to open automatically when an error occurs # (note: the console then opens correctly, but no error appears) # - also editor.insertText() doesn't work from this exception-block strError = r'Exception in file C:\Program Files (x86)\Notepad++\plugins\PythonScript\scripts\startup.py' strError += '\n' + traceback.format_exc(100) + '\n' editor.insertText(0, strError) # insert the error at top of file print strError@alan-kilborn said:
…Scintilla is not to blame for any case-sensitive problems…
Of course, you’re right.
I never want to blame anything or anybody, not to mention the fact, that my interpretation often differs from authors’ intention, so I rather play it safe and fair with the gap in between :)
Recap: I am very grateful for your help, gentleman! I am glad that there are people like you, reading problems and react very professionally! (payed services are often worse!)
As a thank you, if you would like to test the searchtool out yourself, let me know how and I’m glad to send you a copy!