[Beta] Tinkering with Pythonista's internals using objc_util
-
Another
objc_util
example (yes, I'm really excited about this module)...This one's really just for fun because I wanted to see if I could make it work at all. As the previous MapView example, this is also a custom view class, but of a completely different kind... It uses Pythonista's own code editor, syntax highlighter, and extended keyboard classes, and wraps them in a convenient
ui.View
package.Here's the code:
It supports Python, HTML, JavaScript, and Markdown for syntax highlighting (there's also a
'text'
mode that doesn't highlight anything). The type of extended keyboard is chosen automatically, and it can also be disabled entirely. Things like the "Highlight All" menu item, and automatic character pairs are supported as well.I've mentioned it in the comments, but it's worth pointing out again: Do not rely on this for anything important. It's quite likely to break in the future, but it's fun to play around with. :)
-
Thanks
-
@JonB Quick tip:
UIView
has a built-inrecursiveDescription
method that produces a tree-like representation of all subviews.
-
Oh, that's the most useful thing i've ever seen :O
-
Understanding this is for experimentation only, how would one go about modifying
OMPythonSyntaxHighlighter
or making a custom syntax highlighter class?
-
@nfmusician I don't know anything about NSRegularExpression, but, only for testing, a little modif in @omz code → Code Editor Demo.py (Gist)
allows to change rule for Python comment, from #xxxx into &xxxx
editor_view = OMTextEditorView.alloc().initWithFrame_syntaxHighlighterClass_theme_(f, SyntaxHighlighter, theme) # ============= begin # https://forum.omz-software.com/topic/2014/beta-tinkering-with-pythonista-s-internals-using-objc_util/12 rules = editor_view.syntaxHighlighter().syntaxHighlightingRules() for rule in rules: print(rule.scopeName()) if rule.regex(): print(' NSRegularExpression pattern=',rule.regex().pattern()) if str(rule.scopeName()) == 'comment': #print(dir(rule)) comment_pattern = rule.regex().pattern() comment_pattern = ns(str(comment_pattern).replace('#','&')) comment_options = rule.regex().options() regex_new = ObjCClass('NSRegularExpression').alloc().initWithPattern_options_error_(comment_pattern, comment_options, None) rule.setRegex_(regex_new) print(' NSRegularExpression pattern=',rule.regex().pattern()) print(dir(rule)) # ============= end
-
@nfmusician still only for testing: how to modify color of a rule, here the comment
PA2UITheme = ObjCClass('PA2UITheme') theme_dict = PA2UITheme.sharedTheme().themeDict().mutableCopy() theme_dict.autorelease() theme_dict['font-family'] = 'Menlo-Regular' theme_dict['font-size'] = 14 # ============= begin #print(theme_dict) new_theme_dict = {} for x in theme_dict.allKeys(): #print(x._get_objc_classname(),x) if str(x) == 'scopes': new_dict_scopes = {} for y in theme_dict[x].allKeys(): #print(' ',y._get_objc_classname(),y) if str(y) == 'comment': new_dict_comment = {} for z in theme_dict[x][y].allKeys(): #print(' ','-',z._get_objc_classname(),z) if str(z) == 'color': new_dict_comment[z] = "#DC7633" # new color else: new_dict_comment[z] = theme_dict[x][y][z] new_dict_scopes[y] = new_dict_comment else: new_dict_scopes[y] = theme_dict[x][y] new_theme_dict[x] = new_dict_scopes else: new_theme_dict[x] = theme_dict[x] theme_dict = new_theme_dict #print(theme_dict) # ============= end theme = OMSyntaxHighlighterTheme.alloc().initWithDictionary_(theme_dict) theme.autorelease()
-
Is there a way to mark Python syntax errors like
print “Hello World”
in blinkingred
?
-
@ccc It is only an editor, thus it does not check anything about Python rules. At least' that's what I think. For instance, it recognizes Python reserved words but that's all
-
@ccc Is that not what Analyze (pyflakes) tool does?
-
It is a difference between active and passive. The Pythonista editor is passive because I have to manually run pyflakes while VSCode is active because it updates the syntax highlighting as I type by running flake8. Given the speed of current iOS CPUs, active syntax highlighting might have acceptable performance.
-
@ccc Ok, I understand but I wanted to say in my answer is that current Pythonista Editor does not allow to intercept at typing, it only checks content with some easy rules.
-
@ccc Upon reflection, I think that it should be possible, via the delegate of the editor's TextView, to intercept the modifications of the source and to execute a code, like flak8, to check the syntax of the script. But it seems to be quite complex
-
It would not need be letter-by-letter, but it would be cool if fixers like "isort ; black ; pyupgrade ----py37-plus" were autorun on the code in the editor. The trick would be for the fixers to fail gracefully if the user is in mid-thought.
-
@ccc Agree but this kind of particular process in the Pythonista Editor should be for @omz only, don't you think so? And, sincerely, I don't have any hope for such functionality