Sublime Forum

Dev Build 3118

#44

I believe that should be the case with LAYOUT_BLOCK, however there may have been a reason Jon decided not to make that implementation change. I’ll update you once I discuss it with him.

0 Likes

#45

Btw, a LAYOUT_ABOVE and LAYOUT_BLOCKABOVE option would be great too. (Possibly with a better name.)

It’s not hard to simulate LAYOUT_BLOCKABOVE (except for the first line), but it’s still a trick (it does not ‘follow’ if you add a line above). And you can’t emulate LAYOUT_ABOVE.

Nonetheless, a very welcome addition, thanks!

0 Likes

#46

It may be confusing for users to not know if the phantom applies to the content above or below.

0 Likes

#47

Indeed, same as it is now. Maybe adding an arrow (like in chat bubbles), at least for non-block layouts:

For block layouts, the text is usually less ambiguous.

One use case I think of for LAYOUT_BLOCKABOVE is displaying scm information (last commit modifying a function, for example). Displaying it below the function header looks strange (even more so if you have parameters spanning over more than one line).

Just a wish anyway :slightly_smiling:

6 Likes

#48

Is there some reason I’m not seeing inline errors?
If I’m not mistaken the inline errors are supposed to appear in the file when you run exec or a build system, correct?

Right now I am building my cpp files with a python script I wrote that runs a bat file via the exec command.
But I have also tried to build with a custom build system that just runs the bat file.

If I’m understanding correctly and should be seeing the inline errors is there any information that would be helpful in finding out why I can’t see them?

0 Likes

#49

I’m seeing weird behavior with phantoms that I absolutely cannot explain. I was experimenting with the sample script in OP when I noticed that upon reloading the file, the phantoms’ contents were changed. Yet, I cannot find anything in the code that could reflect such a change.

In the following video you’ll notice that the phantom views change whenever I save the file (and cause it to be reloaded). I added a few debug prints showing that the geenrated phantoms seems to be correct.
The __del__ addition isn’t relevant as it also happens without.

https://a.desu.sh/sphapl.webm

(double-click to enlarge)

Code:

import sublime
import sublime_plugin

KEY = "phantom_test"


class ViewCalculator(sublime_plugin.ViewEventListener):
    def __init__(self, view):
        self.view = view
        self.phantom_set = sublime.PhantomSet(view, KEY)
        self.timeout_scheduled = False
        self.needs_update = False

        # view.erase_phantoms(KEY)
        self.update_phantoms()

    def __del__(self):
        self.view.erase_phantoms(KEY)

    @classmethod
    def is_applicable(cls, settings):
        syntax = settings.get('syntax')
        return syntax == 'Packages/Text/Plain text.tmLanguage'

    def update_phantoms(self):
        phantoms = []

        # Don't do any calculations on 1MB or larger files
        if self.view.size() < 2**20:
            candidates = self.view.find_all('=>')

            vals = []
            for r in candidates:
                line_region = self.view.line(r.a)
                line = self.view.substr(line_region)

                idx = r.a - line_region.a
                if idx != -1:
                    val = len(line[:idx].strip())
                    vals.append(val)

                    phantoms.append(sublime.Phantom(
                        sublime.Region(r.a + 2),
                        str(val),
                        sublime.LAYOUT_INLINE))
            print(vals)

        self.phantom_set.update(phantoms)
        print(self.view.query_phantoms([p.id for p in phantoms]))
        print([p.content for p in phantoms])

    def handle_timeout(self):
        self.timeout_scheduled = False
        if self.needs_update:
            self.needs_update = False
            self.update_phantoms()

    def on_modified(self):
        # Call update_phantoms(), but not any more than 10 times a second
        if self.timeout_scheduled:
            self.needs_update = True
        else:
            sublime.set_timeout(lambda: self.handle_timeout(), 100)
            self.update_phantoms()
1 Like

#50

not sure where the bug exactly.

0 Likes

#51

try without the CDATA

    <key>popupCss</key>
    <string>
        html {
          background-color: #42342C;
          color: #BDAE9D;
        }
        a {
          color: #43A8ED;
        }
        .error, .deleted {
          color: #D44949;
        }
        .success, .inserted {
          color: #049B0A;
        }
        .warning, .modified {
          color: #FF9358;
        }
    </string>
0 Likes

#52

Here is my Sublime-Evaluate plugin, using Phantoms:

from __future__ import division
import sublime
import sublime_plugin
import threading
import math
import datetime

sublime_version = 2

if not sublime.version() or int(sublime.version()) > 3000:
    sublime_version = 3

class EvaluateCommandPhantom(sublime_plugin.ViewEventListener):
    def __init__(self, view):
        self.view = view
        self.phantom_set = sublime.PhantomSet(view)
        self.timeout_scheduled = False
        self.needs_update = False

        self.update_phantoms()

    @classmethod
    def is_applicable(cls, settings):
        return True

    def update_phantoms(self):
        phantoms = []

        if self.view.size() < 2**20:
            candidates = self.view.find_all('=>')

            for r in candidates:
                line_region = self.view.line(r.a)

                line = self.view.substr(line_region)

                idx = r.a - line_region.a
                if idx != -1:
                    val = line[0:idx].strip()

                    op_pt = line_region.a + idx

                    thread = EvaluateCall(val, 5)
                    thread.start()

                    phantoms.append(sublime.Phantom(
                        sublime.Region(op_pt + 2),
                        '<span class="success">%s</span>' % str(thread.result),
                        sublime.LAYOUT_BLOCK))

        self.phantom_set.update(phantoms)

    def handle_timeout(self):
        self.timeout_scheduled = False
        if self.needs_update:
            self.needs_update = False
            self.update_phantoms()

    def on_modified(self):
        # Call update_phantoms(), but not any more than 10 times a second
        if self.timeout_scheduled:
            self.needs_update = True
        else:
            sublime.set_timeout(lambda: self.handle_timeout(), 100)
            self.update_phantoms()

class EvaluateCall(threading.Thread):
    def __init__(self, string, timeout):
        self.original = string
        self.timeout = timeout
        self.result = self.original  # Default result
        threading.Thread.__init__(self)

    def run(self):
        try:
            tmp_global = {
                "math": math,
                "datetime": datetime
            }
            code = compile(self.original, '<string>', 'eval')
            self.result = eval(code, tmp_global)
        except (ValueError, SyntaxError):
            pass
        return
1 Like

#53

I can confirm this strange behaviour, even with the example code posted at the top of this thread.

0 Likes

#54

nothing new :frowning:

0 Likes

#55

Maybe SulbimeLinter created (SL) variant of the color scheme?

2 Likes

#56

@wbond: Question about the improved styling (which is highly appreciated). Is it going to be possible to have a <code>...</code> section or something in tooltips etc that use the same syntax highlighting as in the ST syntax and color scheme? That would be pretty good. Maybe with something like class="Python" for Python.sublime-syntax.

5 Likes

#57

That isn’t currently on the list, but it sounds like an interesting idea.

5 Likes

#58

You can actually do this currently with mdpopups if you have the Sublime syntax highlighter enabled in your preference file. There is a mapping file that takes care of the conversion of short names to the syntax highlighter: https://github.com/facelessuser/sublime-markdown-popups/blob/master/st3/mdpopups/st_mapping.py. This mapping obviously can be expanded by forking and also extended locally in the Preferences.sublime-settings file.

There are a few quirks due to Sublime’s limited tooltip CSS, but generally it works pretty good.

With that said, a native implementation would be really nice as well.

0 Likes

#59

nop, the SL is already supported by the scheme, so this is the only copy the sublime use.

0 Likes

#60

Ah, it’s really strange. Here’s my popup styling and it works as expected: https://github.com/oivva/boxy/blob/dev/schemes/Boxy%20Monokai.YAML-tmTheme

Clear cache or ⌘+Q?

0 Likes

#61

this is becoming ridiculous, thanx for ur help :wink:

0 Likes

#62

I suggest creating a new topic with information such as your console output, settings, etc.

2 Likes

#63

One thing I’ve noticed is that when you set the font-size in the popup/phantom CSS, it doesn’t respect the font scaling in Windows. I have a windows system with a 4K monitor and the font set at 125% which is about 120dpi. And when I set my font size in a popup/phantom, the font sizes are 25% too small.

In order to fix this, I had to detect the font size and make adjustments to what I set in the CSS:

    def get_font_scale(self):
        """Get font scale."""

        scale = 1.0
        if sublime.platform() == 'windows':
            try:
                import ctypes

                LOGPIXELSY = 90
                dc = ctypes.windll.user32.GetDC(0)
                height = ctypes.windll.gdi32.GetDeviceCaps(dc, LOGPIXELSY)
                scale = float(height) / 96.0
            except Exception:
                pass

        return scale

Anyways, it would be great if when setting a font in the CSS, the scaling was taken into consideration automatically. I have currently only looked into this on Windows, but it might be an issue on other platforms as well.

1 Like