def AddLogbook(view, node, key, value, onDone=None): if(InsertDrawerIfNotPresent(view, node, ":LOGBOOK:")): # File is reloaded have to regrab node node = db.Get().At(view, node.start_row) drawer = node.get_drawer("LOGBOOK") loc = drawer['loc'] end = loc[1] pt = view.text_point(end, 0) level = node.level indent = " " + (" " * level) drawer['loc'] = (loc[0], loc[1] + 1) view.run_command("org_internal_insert", {"location": pt, "text": indent + str(key) + " " + str(value) + "\n", "onDone": onDone})
def GetCapturePath(view, template): target = ['file', '{refile}'] if 'target' in template: target = template['target'] filename = None file = None at = None if ('file' in target[0]): temp = templateEngine.TemplateFormatter() tempDict = {'refile': sets.Get('refile', '')} filename = templateEngine.ExpandTemplate(view, target[1], tempDict)[0] if ('id' == target[0]): file, at = db.Get().FindByCustomId(target[1]) if (file == None): log.error("Could not find id: " + target[1]) return filename = file.filename if ('clock' == target[0]): if (not clk.ClockManager.ClockRunning()): log.debug("ERROR: clock is not running!") raise "ERROR: clock is not running" filename = clk.ClockManager.GetActiveClockFile() at = clk.ClockManager.GetActiveClockAt() # Try to create my capture file if I can try: if (not os.path.isfile(str(filename))): with open(filename, "w") as fp: fp.write("#+TAGS: refile\n") except: log.error("@@@@@@@@@@@@\nFailed to create capture file: " + str(filename)) # Now make sure that file is loaded in the DB # it might not be in my org path if (file != None): file.Reload() else: file = db.Get().LoadNew(filename) if (not at and file): at = file.org.start_row return (target, filename, file, at)
def run(self, edit, onDone=None): curNode = db.Get().AtInView(self.view) needsNewline = False if (not curNode): file = db.Get().FindInfo(self.view) if (len(file.org) > 0): curNode = file.org[len(file.org) - 1] if (not curNode): level = 1 l = self.view.line(self.view.size()) reg = sublime.Region(l.start(), l.start()) reg = here else: level = curNode.level reg = curNode.region(self.view, True) if (level == 0): level = 1 here = sublime.Region(view.size(), view.size()) else: here = sublime.Region(reg.end(), reg.end()) text = self.view.substr(self.view.line(here)) if (text.strip() != ""): needsNewline = True self.view.sel().clear() self.view.sel().add(reg.end()) self.view.show(here) if (needsNewline): self.view.insert(edit, self.view.sel()[0].begin(), '\n') ai = sublime.active_window().active_view().settings().get( 'auto_indent') self.view.settings().set('auto_indent', False) self.view.run_command( "insert_snippet", { "name": "Packages/OrgExtended/snippets/heading" + str( (level + 1)) + ".sublime-snippet" }) sublime.active_window().active_view().settings().set('auto_indent', ai) evt.EmitIf(onDone)
def plot_table_command(table,view): # First get parameters ps = plot_get_params(table,view) # Next build the data file datafile = plot_build_data_file(table,ps) # Next build the plot command file plot_build_command_file(table,ps) # Shell out to gnu plot plotcmd = sets.Get("gnuplot",r"C:\Program Files\gnuplot\bin\gnuplot.exe") output = ps['_filename'] outpath = os.path.dirname(output) sourcepath = os.path.dirname(view.file_name()) commandLine = [plotcmd, "-c", ps['_gpltfile'] ] try: startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW except: startupinfo = None cwd = os.path.join(sublime.packages_path(),"User") if(output == "viewer" and platform.system() == "Windows"): global ppp ppp = subprocess.Popen(commandLine, universal_newlines=True, cwd=cwd, startupinfo=startupinfo, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) o = "" e = "" else: popen = subprocess.Popen(commandLine, universal_newlines=True, cwd=cwd, startupinfo=startupinfo, stdout=subprocess.PIPE, stderr=subprocess.PIPE) (o,e) = popen.communicate() print("Attempting to plot data from table:") print("STDOUT: \n" + str(o)) print("STDERR: \n" + str(e)) cullTempFiles = True if(cullTempFiles): if(os.path.exists(ps['_datafile'])): os.remove(ps['_datafile']) if(os.path.exists(ps['_gpltfile'])): os.remove(ps['_gpltfile']) row = view.curRow() node = db.Get().At(view, row) level = 1 indent = " " if(node): level = node.level indent = " " * level + " " o = indent + "#+RESULTS:\n"+indent+"[[file:" + output.replace("\\","/") + "]]" if(output != "viewer"): have = plot_find_results(table,view) if(not have): o = "\n" + o view.run_command("org_internal_replace", {"start": table.resultsRegion.begin(), "end": table.resultsRegion.end(), "text": o}) print(o)
def OnDoneSourceBlockExecution(self): # Reload if necessary self.file = db.Get().FindInfo(self.view) doc = None self.style = exp.GetGlobalOption(self.file,"HTML_STYLE","HtmlStyle","blocky").lower() log.log(51,"EXPORT STYLE: " + self.style) try: outputFilename = exp.ExportFilename(self.view,".html", self.suffix) doc = HtmlDoc(outputFilename, self.file) doc.style = self.style self.helper = HtmlExportHelper(self.view, self.index) self.helper.Run(outputFilename, doc) finally: evt.EmitIf(self.onDone)
def run(self, edit): n = db.Get().AtInView(self.view) s = self.view.text_point(n.start_row, 0) e = self.view.line(self.view.text_point(n.end_row, 0)).end() r = sublime.Region(s, e) ct = self.view.substr(r) start = "" #if "#+TITLE:" not in ct: # start = "#+TITLE: " + os.path.splitext(os.path.basename(self.view.file_name()))[0] tempFile = tf.CreateTempFileFromRegion(self.view, r, ".org", start) #print("temp file: " + str(tempFile)) self.tempView = self.view.window().open_file(tempFile) self.tempView.run_command('org_export_file_org_html', {"onDone": evt.Make(self.onDone)})
def OnDoneSourceBlockExecution(self): # Reload if necessary self.file = db.Get().FindInfo(self.view) self.doc = None self.docClass = exp.GetGlobalOption(self.file, "LATEX_CLASS", "latexClass", "article").lower() try: outputFilename = exp.ExportFilename(self.view, ".tex", self.suffix) self.doc = LatexDoc(outputFilename, self.file) self.doc.setClass(self.docClass) self.helper = exp.OrgExportHelper(self.view, self.index) self.helper.Run(outputFilename, self.doc) finally: evt.EmitIf(self.onDone)
def run(self, edit): self.files = [] bl = db.Get().GetBacklinks(self.view) if(bl): self.links = bl for l in bl: title = l.fromFile.org.get_comment("TITLE",[""])[0] desc = l.desc if l.desc else "" if(title.strip() != ""): desc = title + ": " + desc self.files.append([desc, l.link]) self.view.window().show_quick_panel(self.files, self.on_done, -1, -1) return log.debug("NO BACKLINKS")
def run(self,edit,onDone=None): self.onDone = onDone n = db.Get().AtInView(self.view) if(n == None): log.error(" Failed to find node! Subtree cannot be exported!") return index = 0 for i in range(0,len(n.env._nodes)): if(n == n.env._nodes[i]): index = i if(index == 0): log.error(" Failed to find node in file! Something is wrong. Cannot export subtree!") return self.view.run_command('org_export_file_org_html', {"onDone": evt.Make(self.OnDone), "index": index, "suffix":"_subtree"})
def run(self, edit): self.links = [] self.lobjs = [] self.transientview = None files = db.Get().Files if(files): for f in files: lnks = f.org.env.links for l in lnks: desc = l.desc + " : " if l.desc else "" self.links.append([desc + l.link,f.filename]) l.inFile = f self.lobjs.append(l) self.view.window().show_quick_panel(self.links, self.on_done, -1, -1,self.on_highlighted) return
def onActivated(view): shouldHandleActivationFolding = sets.Get("onFocusRespectStartupFolds", None) if (shouldHandleActivationFolding): # Now lets respect the fold state if we have any. file = db.Get().FindInfo(view) if (file): r = file.org[0] globalStartup = sets.Get("startup", ["showall"]) startup = r.startup(globalStartup) if (Startup.overview in startup or Startup.fold in startup): fold_all_but_my_tree(view) elif (Startup.content in startup): fold_all_but_my_tree(view) fold_all_links(view)
def on_done(self, index): view = self.view (curRow, curCol) = view.curRowCol() node = db.Get().NodeAtIndex(view.file_name(), index) print(str(node)) if (node != None): row = node.start_row linePos = view.text_point(row, curCol) view.show_at_center(linePos) view.sel().clear() view.sel().add(linePos) else: view.set_status( "Error: ", "filename {0} not found in orgDb".format(view.file_name()))
def run(self, edit): line = self.view.curLine() cb = checkbox.get_checkbox(self.view, line) if (cb): self.view.run_command('org_insert_checkbox') return if (checkbox.isUnorderedList(self.view.substr(line))): self.view.run_command('org_insert_unordered_list') return if (numberedlist.isNumberedLine(self.view)): numberedlist.AppendLine(self.view, edit) return n = db.Get().AtInView(self.view) if (not n.is_root()): self.view.run_command('org_insert_heading_sibling')
def ShouldFoldLocalCycle(view): fnode = db.Get().AtInView(view) if (fnode): row, col = view.curRowCol() if (fnode.start_row == row): return True else: # This could be a property drawer. We want to fold that if so. if (not type(fnode) is node.OrgRootNode and fnode.is_foldable_drawertype(view, row)): return True else: return False pass return False
def onLoad(view): remove_all_folds(view) # Now lets respect the fold state if we have any. file = db.Get().FindInfo(view) if (file): r = file.org[0] globalStartup = sets.Get("startup", ["showall"]) startup = r.startup(globalStartup) if (Startup.overview in startup or Startup.fold in startup): fold_all(view) elif (Startup.content in startup): fold_content(view) #if(Startup.showall in startup or Startup.nofold in startup): else: fold_showall(view) fold_all_links(view)
def run(self,edit, onDone=None, index=None, suffix=""): self.file = db.Get().FindInfo(self.view) self.onDone = onDone self.suffix = suffix if(index != None): self.index = index else: self.index = None if(None == self.file): log.error("Not an org file? Cannot build reveal document") evt.EmitIf(onDone) return if(sets.Get("htmlExecuteSourceOnExport",True)): self.view.run_command('org_execute_all_source_blocks',{"onDone":evt.Make(self.OnDoneSourceBlockExecution),"amExporting": True}) else: self.OnDoneSourceBlockExecution()
def tryMatchNamedObject(self, filepath, val): fpath = self.view.RelativeTo(filepath).lower() fi = db.Get().FindInfo(fpath) if(fi): if(fi.org.names): if(val in fi.org.names): tgt = fi.org.names[val] row = tgt['row'] + 1 col = 0 if row: filepath += ':{0}'.format(row) if col: filepath += ':{0}'.format(col) self.view.window().open_file(filepath, sublime.ENCODED_POSITION) return True return None
def run(self, edit, onDone=None): self.onDone = onDone # Schedule this item so it is in the agenda self.view.run_command("org_schedule", {"dateval": str(datetime.datetime.now())}) # Create a link to the current location so we can insert it in our today item self.link = orglink.CreateLink(self.view) curNode = db.Get().AtInView(self.view) # Should we add a heading to this? if (curNode and not curNode.is_root()): self.ed = RunEditingCommandOnToday( self.view, "org_insert_text_as_child_heading", {'heading': curNode.heading}) self.ed.Run(evt.Make(self.InsertLink)) else: self.InsertLink()
def OnDone(self, text): if (not text): return node = db.Get().AtInView(self.view) if (node): if not text in node.tags: (region, line) = self.view.getLineAndRegion(node.start_row) m = RE_TAGS.search(line) if (m.group('tags') != None): tags = m.group('tags') + text + ":" else: tags = " :" + text + ":" toline = "{0:70}{1}".format(m.group('heading'), tags) self.view.ReplaceRegion(region, toline, self.onDone) else: log.debug("Tag already part of node") evt.EmitIf(self.onDone)
def Run(self, onDone=None): self.onDone = onDone idValue = "TODAY" file, at = db.Get().FindByCustomId(idValue) if (file != None and at != None): node = file.At(at) if (node): self.n = node self.f = file self.savedView = get_view_for_silent_edit_file(file) # Give time for the document to be opened. sublime.set_timeout_async(lambda: self.onLoaded(), 200) return else: log.warning("COULD NOT LOCATE TODAY") else: log.warning("Could not locate today")
def Execute(view, params): level = get_level(params) if (params.Get('scope', 'subtree') == 'subtree'): return handle_subtree(view, params, level) else: print(params['scope'] + " is not implemented") file = db.Get().FindInfo(view) if (file): r = file.org for n in r.children: n.duration() output = [] output.append("|Heading|Time|") output.append("|-") output.append("|A|B|") return output
def tryMatchHeading(self, filepath, heading): fpath = self.view.RelativeTo(filepath).lower() fi = db.Get().FindInfo(fpath) row = None col = None if(fi): for n in fi.org: if not n.is_root() and n.heading == heading: row = n.start_row + 1 col = 0 if row: filepath += ':%s' % row if col: filepath += ':%s' % col self.view.window().open_file(filepath, sublime.ENCODED_POSITION) return True return None
def on_done(self, index, modifiers=None): if(index >= 0): f = self.files[index] link = self.view.MakeRelativeToMe(f[0]) desc = os.path.basename(link) if(len(f) > 1): desc = f[1] includeRoamTag = sets.Get("insertRoamTagToFileLink", True) if includeRoamTag is False: log.error(self.rawTitles[f[0]]) desc = self.rawTitles[f[0]] indent = "" node = db.Get().AtInView(self.view) if(node): indent = node.indent() data = r"{indent}[[file:{link}][{desc}]]".format(indent=indent, link=link, desc=desc) self.view.run_command("org_internal_insert", {"location": self.view.sel()[0].begin(), "text": data})
def tryMatchDirectTarget(self, val): fpath = self.view.file_name().lower() fi = db.Get().FindInfo(fpath) if(fi): if(fi.org.targets): if(val in fi.org.targets): tgt = fi.org.targets[val] row = tgt['row'] + 1 col = tgt['col'] filepath = self.view.file_name() if row: filepath += ':{0}'.format(row) if col: filepath += ':{0}'.format(col) self.view.window().open_file(filepath, sublime.ENCODED_POSITION) return True return None
def plot_get_params(table,view): dt = datetime.datetime.now() sourcepath = os.path.dirname(view.file_name()) filename = "plot_" + str(dt.year) + "_" + str(dt.month) + "_" + str(dt.day) + "_" + str(dt.time().hour) + "_" + str(dt.time().minute) + "_" + str(dt.time().second) + ".png" params = {} params['_filename'] = os.path.join(sourcepath,filename) params['_sourcepath'] = sourcepath row = view.curRow() node = db.Get().At(view, row) if(node): plot = " " + node.get_comment('PLOT',"")[0] ps = re.split(r'\s+[a-zA-Z][a-zA-Z0-9]+[:]',plot) ps = ps[1:] keys = [m.group(0) for m in re.finditer(r'\s+[a-zA-Z][a-zA-Z0-9]+[:]',plot)] #keys = [m.group(0) for m in re.finditer(r'(^|\s+)[^: ]+[:]',plot)] for i in range(0,len(keys)): k = keys[i].strip() if(k.endswith(':')): k = k[:-1] v = ps[i].strip() if(k == 'set'): if(not 'set' in params): params['set'] = [] params['set'].append(v.replace("\"","")) continue if(k == 'unset'): if(not 'unset' in params): params['unset'] = [] params['unset'].append(v.replace("\"","")) continue if(k == 'file'): filename = v if(filename == "viewer"): params["_filename"] = "viewer" continue sourcepath = os.path.dirname(filename) if(len(sourcepath) > 2): params['_sourcepath'] = sourcepath params['_filename'] = filename else: params['_filename'] = os.path.join(params['_sourcepath'],filename) continue else: params[k] = v return params
def run(self, edit): node = db.Get().AtInView(self.view) if (not node.is_root()): self.oldsel = self.view.sel()[0] pt = self.view.text_point(node.start_row, 0) l = self.view.line(pt) # Last row handling If we are the last row we can't jump over the newline # we have to add one. nl = "" addnl = 1 if (self.view.isBeyondLastRow(node.start_row + 1)): nl = "\n" addnl = 0 now = datetime.datetime.now() toInsert = orgdate.OrgDate.format_clock(now, False) self.view.insert(edit, l.end() + addnl, nl + node.indent() + "CLOSED: " + toInsert + "\n")
def run(self, edit, onDone=None): self.onDone = onDone self.node = db.Get().AtInView(self.view) self.priorities = self.node.priorities() self.priorities = copy.copy(self.priorities) self.priorities.append("none") row = self.node.start_row self.Re = r"^([*]+ [^\[\]]*\s*)(\[\#[a-zA-Z0-9]+\]\s+)" self.Re = re.compile(self.Re) sp = self.view.text_point(row, 0) self.row = self.view.line(sp) self.bufferContents = self.view.substr(self.row) if (int(sublime.version()) <= 4096): self.view.window().show_quick_panel(self.priorities, self.on_done, -1, -1) else: self.view.window().show_quick_panel(self.priorities, self.on_done_st4, -1, -1)
def run(self, edit): self.file = db.Get().FindInfo(self.view) if (None == self.file): log.debug("Not an org file? Cannot build reveal document") return doc = None try: doc = RevealDoc(RevealFilename(self.view)) doc.StartHead() self.build_head(doc) doc.EndHead() doc.StartBody() self.build_body(doc) doc.EndBody() finally: if (None != doc): doc.Close()
def fold_local_cycle(view): fnode = db.Get().AtInView(view) if (fnode and not fnode.is_root()): row, col = view.curRowCol() if (fnode.start_row == row): if (fnode.is_folded(view)): fnode.unfold(view) if (fnode.num_children > 0): for n in fnode.children: n.fold(view) else: if (fnode.num_children > 0 and fnode.children[0].is_folded(view)): for n in fnode.children: n.unfold(view) else: fnode.fold(view) fold_all_links(view) return True else: # This could be a property drawer. We want to fold that if so. if (not type(fnode) is node.OrgRootNode and fnode.is_foldable_item(view, row)): if (fnode.is_item_folded(view, row)): fnode.unfold_item(view, row) fold_all_links(view) return True else: fnode.fold_item(view, row) fold_all_links(view) return True #linePos = view.text_point(row,0) #reg = view.line(linePos) #bufferContents = view.substr(reg) #if(":PROPERTIES:" in bufferContents or ":END:" in bufferContents): # if(node.is_properties_folded(view)): # node.unfold_properties(view) # else: # node.fold_properties(view) # return True else: return False return False
def CreateLink(view): fn = view.file_name() # Org Files have a LOT more potential for making links! if (util.isPotentialOrgFile(fn)): r = view.curRow() line = view.getLine(r) linet = RE_TARGET.match(line) namet = RE_NAMED.match(line) link = None # have target on this line? if (linet): link = "[[file:{0}::{1}][{1}]]".format(view.file_name(), linet.group('target')) # have named object on this line? if (link == None and namet): link = "[[file:{0}::{1}][{1}]]".format(view.file_name(), namet.group('target')) n = db.Get().AtInView(view) if (link == None and n and not n.is_root()): p = n.get_property("ID") cp = n.get_property("CUSTOM_ID") if (p): link = "[[file:{0}::#{1}][{2}]]".format( view.file_name(), p, n.heading) # Have custom id? elif (cp): link = "[[file:{0}::#{1}][{2}]]".format( view.file_name(), cp, n.heading) # Am near a heading? else: link = "[[file:{0}::*{1}][{1}]]".format( view.file_name(), n.heading) # okay then just use row,col if (link == None): r, c = view.curRowCol() link = "[[file:{0}::{1},{2}][{3}]]".format( view.file_name(), r, c, os.path.basename(view.file_name())) return link else: # Other file types only have line and column r, c = view.curRowCol() link = "[[{0}::{1}::{2}][{3}]]".format(fn, r, c, os.path.basename(fn)) return link