I am inserting this text on the view:
text: Packages list:
  1: A File Icon
Sublime file-specific icons for improved visual grepping
v3.2.1; github.com/ihodev/a-file-icon
  2: Add Folder To Project
Repository for the AddFolderToProject Sublime Plugin
v1.1.1; github.com/DavidGerva/AddFolderToProject-SublimePlugin
  3: Advanced CSV
No description provided
unknown version
  4: AdvancedNewFile
File creation plugin for Sublime Text 2 and Sublime Text 3.
v1.7.0; github.com/skuroda/Sublime-AdvancedNewFile
...
However sublime text keeps inserting (and indenting) it as:
Packages list:
  1: A File Icon
  Sublime file-specific icons for improved visual grepping
  v3.2.1; github.com/ihodev/a-file-icon
    2: Add Folder To Project
    Repository for the AddFolderToProject Sublime Plugin
    v1.1.1; github.com/DavidGerva/AddFolderToProject-SublimePlugin
      3: Advanced CSV
      No description provided
      unknown version
        4: AdvancedNewFile
        File creation plugin for Sublime Text 2 and Sublime Text 3.
        v1.7.0; github.com/skuroda/Sublime-AdvancedNewFile
        ...
This is where sublime keeps messing with everthing:
            new_view.run_command("insert", {"characters": "Packages list:\n\n" + package_string})
            print( "text: " + "Packages list:\n\n" + package_string )
The one which goes to my console is correctly displayed, the one which goes to the view is messed up.
I cannot use view.insert() because I cannot access it on the thread. I tried to pass is as attribute, but did no worked.
Can insert text be fixed on new_view.run_command("insert"?
This is my code:
import textwrap
import threading
import os
import sublime
import sublime_plugin
from .. import text
from ..show_quick_panel import show_quick_panel
from ..package_manager import PackageManager
from .existing_packages_command import ExistingPackagesCommand
print( "Reloading Package Control\package_control\commands\list_packages_command.py" )
class ListPackagesOnViewCommand(sublime_plugin.WindowCommand):
    """
    A command that shows a list of all installed packages in a new view
    """
    def run(self):
        ListPackagesThread(self.window, on_view=True).start()
class ListPackagesThread(threading.Thread, ExistingPackagesCommand):
    """
    A thread to prevent the listing of existing packages from freezing the UI
    """
    def __init__(self, window, filter_function=None, on_view=False):
        """
        :param window:
            An instance of :class:`sublime.Window` that represents the Sublime
            Text window to show the list of installed packages in.
        :param filter_function:
            A callable to filter packages for display. This function gets
            called for each package in the list with a three-element list
            as returned by :meth:`ExistingPackagesCommand.make_package_list`:
              0 - package name
              1 - package description
              2 - [action] installed version; package url
            If the function returns a true value, the package is listed,
            otherwise it is discarded. If `None`, no filtering is performed.
        """
        self.window = window
        self.on_view = on_view
        self.filter_function = filter_function
        self.manager = PackageManager()
        threading.Thread.__init__(self)
    def run(self):
        self.package_list = self.make_package_list()
        if self.filter_function:
            self.package_list = list(filter(self.filter_function, self.package_list))
        def show_no_packages():
            sublime.message_dialog(text.format(
                u'''
                Package Control
                There are no packages to list
                '''
            ))
        def show_panel():
            if not self.package_list:
                show_no_packages()
                return
            show_quick_panel(self.window, self.package_list, self.on_done)
        def show_view():
            if not self.package_list:
                show_no_packages()
                return
            new_view = sublime.active_window().new_file()
            package_string = ""
            package_count = 0
            new_view.set_scratch(True)
            new_view.set_name("Packages List")
            new_view.set_syntax_file("Packages/Text/Plain text.tmLanguage")
            for package in self.package_list:
                package_count += 1;
                text = ""
                text += "%3d: %s\n" % ( package_count, package[0] )
                text += textwrap.fill(package[1], 80)
                text = textwrap.dedent(text)
                # print( "text: " + text )
                package_string += text + "\n" + package[2] + "\n\n"
            new_view.run_command("insert", {"characters": "Packages list:\n\n" + package_string})
            print( "text: " + "Packages list:\n\n" + package_string )
            new_view.sel().clear()
            initial_region = sublime.Region(0,0)
            new_view.sel().add(initial_region)
            new_view.show_at_center(initial_region)
        if self.on_view:
            sublime.set_timeout(show_view, 10)
        else:
            sublime.set_timeout(show_panel, 10)
    def on_done(self, picked):
        """
        Quick panel user selection handler - opens the homepage for any
        selected package in the user's browser
        :param picked:
            An integer of the 0-based package name index from the presented
            list. -1 means the user cancelled.
        """
        if picked == -1:
            return
        package_name = self.package_list[picked][0]
        def open_dir():
            package_dir = self.manager.get_package_dir(package_name)
            package_file = None
            if not os.path.exists(package_dir):
                package_dir = self.manager.settings['installed_packages_path']
                package_file = package_name + '.sublime-package'
                if not os.path.exists(os.path.join(package_dir, package_file)):
                    package_file = None
            open_dir_file = {'dir': package_dir}
            if package_file is not None:
                open_dir_file['file'] = package_file
            self.window.run_command('open_dir', open_dir_file)
        sublime.set_timeout(open_dir, 10)