-
-
Notifications
You must be signed in to change notification settings - Fork 13
/
SideBarFolders.py
141 lines (115 loc) · 4.03 KB
/
SideBarFolders.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# coding=utf8
import sublime, sublime_plugin
import os
import codecs
MENU = """[
{"caption": "Help", "id": "help" },
{
"caption": "Folders",
"id": "folders",
"mnemonic": "d",
"children": [
{ "caption": "-" , "id": "open" },
{ "command": "side_bar_folders_append", "caption": "Load Folder…"},
{ "caption": "-", "id": "edit" },
{ "command": "open_file", "args": { "file": "${packages}/User/Side Bar Folders.sublime-settings" }, "caption": "Edit Folders"},
{ "caption": "-" , "id": "options-separator" },
%(entries)s
{ "caption": "-" , "id": "options" },
{ "command": "side_bar_folders_clear_missing", "caption": "Clear Missing Folders"},
{ "caption": "-" , "id": "end" }
]
}
]
"""
FOLDER_ENTRY = '%(indent)s{ "command": "side_bar_folders_add_to_sidebar", "args":{ "index": %(index)d }},'
s = {}
Pref = {}
def Window():
return sublime.active_window()
# when closing a project, project_data returns "None"
# related maybe or maybe not https://github.com/sublimehq/sublime_text/issues/6105
def get_project_data(window):
project_data = window.project_data()
if project_data is None or "folders" not in project_data:
project_data = {}
project_data["folders"] = []
return project_data
class Menu(object):
@staticmethod
def prepare_menu():
path = os.path.join(sublime.packages_path(), "User", "Side Bar Folders")
if not os.path.exists(path):
os.makedirs(path)
Menu.path = os.path.join(path, "Main.sublime-menu")
@staticmethod
def generate_menu(count):
try:
with codecs.open(Menu.path, "w", encoding="utf-8") as f:
f.write(
MENU
% {
"entries": "\n".join(
[Menu.generate_menu_item(x) for x in range(0, count)]
),
}
)
except:
pass
@staticmethod
def generate_menu_item(index, indent=3):
return FOLDER_ENTRY % {"indent": "\t" * indent, "index": index}
class Pref:
def load(self):
Menu.prepare_menu()
Pref.reload()
Pref.bucle()
def reload(self):
Pref.folders = s.get("folders", [])
def bucle(self):
sublime.set_timeout(lambda: Pref.bucle(), 60 * 1000)
for window in sublime.windows():
try:
for folder in get_project_data(window)["folders"]:
if folder["path"] not in Pref.folders:
Pref.folders.append(folder["path"])
except:
pass
Pref.save()
def save(self):
Pref.folders = sorted(Pref.folders, reverse=True)
if s.get("folders", []) != Pref.folders:
s.set("folders", Pref.folders)
sublime.save_settings("Side Bar Folders.sublime-settings")
Menu.generate_menu(len(Pref.folders))
class side_bar_folders_add_to_sidebar(sublime_plugin.WindowCommand):
def run(self, index=-1):
folder = (Pref.folders[::-1])[index]
project = get_project_data(Window())
project["folders"].append({"path": folder})
Window().set_project_data(project)
def is_visible(self, index=-1):
try:
return (Pref.folders[::-1])[index] is not None
except:
return False
def description(self, index=-1):
try:
return (Pref.folders[::-1])[index]
except:
return ""
class side_bar_folders_clear_missing(sublime_plugin.WindowCommand):
def run(self):
folders = []
for item in Pref.folders:
if os.path.exists(item):
folders.append(item)
Pref.folders = folders
Pref.save()
def plugin_loaded():
global s, Pref
s = sublime.load_settings("Side Bar Folders.sublime-settings")
Pref = Pref()
Pref.load()
s.clear_on_change("reload")
s.add_on_change("reload", lambda: Pref.reload())