- Improved noweb error reporting and handling
- Added “builtinSourceBlockHandlers” setting allowing users to override one of the built in source handlers with their own.
Batch files do not support arrays so we play some games. VAR_width and VAR_height are defined to help with iteration and array like variables are defined a value at a time VARNAME[r#,c#]
a | b | c | d | e |
1 | 2 | 3 | 4 | 6 |
setLocal enableDelayedExpansion
echo Hello World %x%
FOR /L %%r IN (1,1,%DATA_height%) DO (
FOR /L %%c IN (1,1,%DATA_width%) DO (
echo|set /p dummy=!DATA[%%r,%%c]!
)
echo .
)
Value execution is kind of funny. Batch files can reach out and touch a parent parameter var. The return value is the first. Set it like so:
echo "hi"
set "%~1=5"
1.2.15 introduces the start of noweb like macro support to our babel offering.
The contents of source blocks can be dynamically included from remote blocks. (Much like a macro the code is pasted into the block)
References can be done by parameters or by name. The noweb-ref parameter allows you to define the target of a reference much like a name would.
Since the source of a noweb reference can be named in a parameter this means that property parameters can apply to a set of source blocks that each has a part of the full snippet. In this case snippets will be pasted in the order they appear in your file.
print("Hello World")
print("And again!")
print("Even More!")
<<includeme>>
<<by-name>>
<<by-results(x=5)>>
In the example above we are referencing the blocks by a name in the parameter field. Here we are referencing the source block by the name of the block.
print("By-Name")
If you use () in your reference you are requesting the results of the block be pasted rather than the block itself. This can be useful but can easily get complicated if abused. So use with restraint.
print("print('By-Results: " + str(x) + "')")
- FIXED: Improved color scheme generator. It did not handle comments so Solarized Dark as throwing. Issue
- This has been extended to 10 as per request from antidistinctiminty (Was 7 previously)
- Fixed a fairly major regression with capture templates.
- Capture snippets now live in Packages\User\orgsnippets folder (for consistency with other extension types)
- A bug was fixed which would fail to find a snippet in some cases.
- Thankfully the problem with dateutil has been discovered by wbond. we should now be able to install again once dateutil clears. I have removed the dependency on an internal dateutil.
- Trying to get dateutil to operate well as a package inside OrgExtended. Had some problems with six.py’s location.
- I believe this will fix it.
Dateutil seems to have vanished on package control. This was causing some people to have problems installing. I have been forced (for now) to embed dateutil into orgextended so we can continue chugging along.
My hope is that in doing this it will fix the ST3 issues we have been seeing.
Caching will try to avoid executing a block if the source and or parameters have not changed. Caching uses a Sha1 hash of the source and parameter mix to determine if it should re-run the block.
This mode is dangerous if the operation has any side effects.
It does however skip execution when the operation is already present. It will keep a hash of the source and params and will only execute if the source does not change.
print("Hello world")
This feature is not yet well tested with source block chaining.
#+RESULTS[5ce4498b4cf15deb48101207ad5673485754fd11]:
Hello world
A security feature of org is that you can specify that a block should never execute. This is now mostly working.
print("hi")
Query evaluation is mostly working now although the title of the query prompt is not great.
print("Hello World")
This release marks the begining of tangle work. Marking a source block as tangleable allows someone to export just the source code to a “detangled” file containing the source code and data from the page without the rest of the document. The resulting file will have the name of the the org file with the appropriate file extension for the source code.
We get a new command with this release:
- Org Tangle File
Write-Host("Hello World")
- 1.2.7 was missing a source file. This fixes that.
Core Idea: Quality of Life
This release is about stability, testing and validating the core babel feature set before I move on to noweb and tangle.
- Having most of the core babel features in place we have started to work towards validating the core babel feature set and putting a rough stamp of non preview on the babel feature set.
- Added “Org Show Table Tests” and “Org Show Source Block Tests” which will create a file with the unit tests for these features as a means of documentation and exploration for new users.
- FIXED: Issues with multiple :var statements on the fence line of a babel block.
- FIXED: Exception with initial inserts with drawer formatter.
- FIXED: The Source Block Execute method had a bug that was preventing propper execution due to some of the features introduced in 1.2.6
- FIXED: cell being passed to an sbe function would sometimes not evaluate properly.
- New command: “Org Execute Formula” This will only execute the formula targetting the current cell vs the entire table. This can help when building a table.
- Some expressions using SBE can get fairly expensive to compute. When highlighting cells the system executes
formulas in the background to determine which cells the formula touches. To avoid paying that cost when moving
around you can turn this off for a node in the heirarchy as follows:
:PROPERTIES: :NoTableHighlight: True :END:
I had to do this for the unit tests since our unit tests were generating diagrams as a result of the sbe calls Although an unrealistic real world case, this was slowing down the highlight to be somewhat unusable so merited the feature.
- olegBc asked for a day page system. The project still has a little definition before we know where we need to take it. That said, I added a text command to create a day page as a first little step in that direction.
Core Idea: Inline Babel Blocks
With this release we are focusing on some fringe pieces of the core babel feature set that we need to be complete.
Inline babel blocks allow you to call a babel function within some other text providing even more dynamic living breathing documents.
Header blocks extend the core babel features providing more real estate to add parameters to a source block.
- Bugfix thanks to Anti-Distinctlyminty - on windows uses os.startfile() to launch a file link providing better support for out of sublime file links. Also some improved error notation in the contols when a link cannot resolve.
- Sometimes this would assert when the agenda was not active.
- If someone sets their orgDirs to a string vs a list we would treat each character as an orgDir which was just plain wrong. I have augmented the db to detect that and just “do the right thing”
- Additional guards against asserts in popups for the input box:
Errors in Sublime Console
Thanks to OlegBc for finding this one.
Basic inline source block syntax highlighting now works. Org has a somewhat odd inline syntax:
src_python[:var x=5]{print(“hello” + str(x))} {{{results(hello5
)}}}
Simple execution seems to be working:
src_powershell{Write-Host “Hello World”} {{{results(Hello World
)}}}
- Plists now have propper exclusion properties so :results output value will only have the last value since the options are considered mutually exclusive.
- The unit tests have been enhanced to cover exclusivity.
- Source blocks now have a global setting allowing you to control their default behaviour globally. this is inline with what you can do in emacs with: org-babel-default-header-args
"orgBabelDefaultHeaderArgs": ":var x=5"
Added support for the more generic HEADER comment blocks as seen below.
print(str(y) + " x " + str(x))
I find that as I move around the buffer I tend to unfold a lot of “things” When I have a buffer set to “content” mode I like it to clean up the open folds when it can.
This new setting will allow sublime to aggressively cleanup the folds to just your active subtree of the file if you turn this on.
What I really want is org-narrow-to-subtree which is the ability to restrict a view to a narrowing of the buffer but in the absence of that capability this helps keep me focused on the things that matter in my file.
- This is controlled by a setting:
"onFocusRespectStartupFolds": true,
Core Idea: Better Chaining Support
- Bugfix: The weekview could show things last month but in the current week erroneously.
- Fixed a regression in the parameter handling for plantuml.
a -> b
b -> c
a | b | c | d | e |
1 | 2 | 3 | 4 | 5 |
This source block uses the output from the table above
print(DATA)
This source block uses the output from python-src as an input
print(DATA)
Here we have a list that acts as a source for some python that acts as a source for more python.
- a
- b
- c
print(DATA)
print(DATA)
Here the powershell scripts results are piped into the python script.
return 5
print(DATA)
$DATA
print(DATA)
print(DATA)
print(DATA)
Begining support for the babel call syntax. Here we define a function that can be called elsewhere in the document with different parameters.
print(DATA)
This is a slight breakaway from orgmode as we do not support lisp and in orgmode this would be done with (org-sbe ‘name’ (key x) (key y)) This is not a syntax I can easily support properly without implementing a full lisp parser inside sublime and… I don’t like that idea. So, I am using the more python friendly function call as seen below. Note this is running the varfunction above, taking the results and placing them in the table below in cell 2,1.
a | b |
12345 | 6 |
Core Idea: Value vs Output execution
By default most file links will be loaded within sublime. If there is a file type you want launched outside of sublime use:
"file_exclude_pattern": ["*.pdf"],
- Fixed a problem where the columnview dynamic block was grabbing its column definitions
from the current node. This would cause column view to use the default definition.
TODO Task Tags effort 1.2.4 DONE ..Column View
Acts like a function, the return statement of the code is returned.
print("Hello world")
print("Hello world2")
if 5 < 10:
print("hi")
return 11
Write-Host "Hello World"
return 10
A src block should be able to reference another src block as an input. This is a REALLY early version of this. Only tables work at the moment.
There are a couple of challenges here:
- Things move as other items execute, I haven’t fully solved that yet.
- Right now I ALWAYS execute the target source block, I need to improve that going forward.
- Errors in the chain are not handled very well yet.
a | b | c | d | e |
1 | 2 | 3 | 4 | 5 |
This source block uses the output from the table above
print(DATA)
This source block uses the output from python-src as an input
print(DATA)
Core Idea - Better output support and results controls
- Fixed a small regression introduced in plists in some of the earlier babel work. This was impacting columnview
To help new users we now have an:
“Org Show Testfile” command that will quickly create a testfile for a user to play with.
List Handler
print(str([1,2,3,4,5]))
File Handler With a List
print(str([1,2,3,4,5]))
These wrap the output in a formatting block of some sort.
will wrap output in a drawer
print("Hello World")
print(x)
will generate a code block with the output:
print(str([1,2,3,4,5]))
will generate a code block specific to org
print("#+COMMENT: org data here")
print("#+COMMENT: org data here")
#+COMMENT: org data here
#+COMMENT: org data here
print("#+COMMENT: org data here")
#+COMMENT: org data here
#+COMMENT: org data here
print("#+COMMENT: org data here")
- “Org Show Worklog” will generate our worklog to a new buffer
Quotes work for variables in plists
print(x)
All of the following are now possible sources of variables In a parameter block, including the local fence variable
This required fixing the properties parser to understand multiple semi colons in a variable list.
print(v)
print(x)
print(y)
print(z)
print(p)
print(g)
I have started working on output handling. Right now things are pretty manual.
Things that work:
:results table - This will try to format your output as a table :results verbatim - This will output things in verbatim format :file - The presence of a file parameter will cause the system to output a link to the file. This does not work for script output yet only for ditaa, plantuml and graphviz modules that naturally want to output to a file.
Things that do not work: :file - for script blocks, that is comming :results - auto detection of tables :results - value a bunch of other stuff…
a | b | c | d | e |
1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 0 |
$DATA | %{"$_"}
print(str(DATA))
print("Hello World This Is Tablular?")
a -> b
b -> c
Just like 1.2.0 was focused on supporting tables 1.3.0 has a focus on better babel support.
Core Idea for 1.2.1: Input - More language handlers supporting table and list data sources.
This is a fairly simple first step into the world of babel. The GNU Plot handler paved the way for this we are just adding the same support to the other handlers.
Right now we only really have python and powershell handlers anyways. As this matures we will document how to add your own language handlers as well as extend the list of supported languages.
There is still more to do with input. This gets us 30% of the way to handling input sources. We still have to improve our plist handle spaces a little better and then handle the various ways that variables can be set for handlers vs the local mechanism. We also need to handle source blocks being the source of data for other source blocks. We are going to hold off on that until we have a slightly better handle on the various execution types for source blocks.
- Thanks to Antidistinctlyminty for improving file handling in the plantuml source block handler. The module not respects the :file tag properly. This was actually fixed in the 1.2.0 release but went unmentioned.
- fixed a bug with unordered list sorting including source blocks.
- In preparation for working on output formatting in a future release (for babel) we have tweaked the output formatting to respect indents a little better when executing source blocks.
Python now supports tables as data sources. True babel execution would auto format the output or provide controls over how we handle the output but… these are our first steps here.
a | b | c | d | e |
---|---|---|---|---|
1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 0 |
print(str(DATA))
Basic variables are also somewhat operational.
print(str(DATA))
$DATA | % {"$_"}
Source blocks are also getting list as as data sources: Notice that the indented item is excluded this is normal org behaviour with lists.
- b
- a
- a
- c
print(str(DATA))
,$DATA
Numbered lists are also now potential data sources:
- b
- a
- c
- 4
print(str(DATA))
,$DATA
Core Idea: I am considering the spreadsheet feature out of preview now. most of the core org features with spreadsheets are now supported. While there are a ton of functions yet to support to have calc equivalence I believe what we have is a pretty good line in the sand to say we have something some usable.
More core functions
- tanh
- cosh
- sinh
- atanh
- acosh
- asinh
- atan
- acos
- asin
- degrees
- radians
- sqrt
- pow
- log
- log10
- log2
Added unit tests for these functions.
- New Command: “Org Insert Archive Tag” will add the :ARCHIVE: Tag to a node. Not currently bound to a key.
- ARCHIVE tag gets filtered out by default in agenda. This means archived TODO’s do not accidentally show up if you have a FILETAG on your archive file.
- Fixed a bug with moving headings up and down when the heading is at the end of the file.
- FILETAGS comment is now respected properly as an inheritied tag on a heading.
- Notifications system now respects the ARCHIVE tag.
Core Idea: Testing pass on tables to ensure what is there is relatively usable.
- added:
- bool(cell)
- int(cell)
- float(cell)
to convert string cells to boolean, ints and floats explicitly if desired
- added highlight(cell,color,text) which highlights a cell a specific color for you
- added passed(test) that will highlight a target cell green or red and write PASSED or FAILED into the cell. We are using this for unit testing at the moment.
- added unit tests org file for tables.
- Execute table now restores the cursor after the evaluation of the table improving usability.
- Fixed assert when cursor was on a formula during table formula execution due to call to table_editor_align requiring the cursor be in the table
- Fixed a bug with <= not evaluating properly next to a cell name ($1<=$2 would fail)
- Added Org Execute All Tables - scans the whole file for tables and executes all of them.
- Improved all date functions handling of datestrings
- Fixed double digit row index parsing, @10$2 was failing to parse properly sometimes.
- Fixed a bug with vmedian where it would sometimes not compute the median!
- More docs including a little view of the new highlight in action in a unit test capture: (at the bottom of the tables doc)
- New documentation on adding the emacs constants.el to your table experience in docs
- Calling “Org Plot Table” on the #+PLOT: header rather than the table would cause problems.
Core Idea: Add GNU Plot Script Blocks
- [x] Add a syntax for gnu plot script blocks if one does not already exist
- [x] Add a src handler to execute these script blocks.
- Fixed a bug with TBLFM appearing after a END marker on dynamic blocks
- Fixed a bug with if statements and equals signs in TBLFM blocks
- Fixed a bug with tables where it would look up the properties on the root node of the file. this would cause an assert.
We now have a GNU Plot script block and source handler. We have a very limited set of source hanlders.
Here is some gnu plot code that draws a sine wave if executed and gnuplot can be found in your settings file. The requirements are the same as those for table plotting.
# We don't need a key (or legend) for this simple graph.
set key off
# Set the title for the graph.
set title "Sine against Phase"
# We want the graph to cover a full sine wave.
set xrange [0:6.28]
# Set the label for the X axis.
set xlabel "Phase (radians)"
# Draw a horizontal centreline.
set xzeroaxis
# Pure sine wave amplitude ranges from +1 to -1.
set yrange [-1:1]
# No tick-marks are needed for the Y-axis .
unset ytics
# Plot the curve.
plot sin(x)
- Params for src blocks have been converted to use the new PList system added in 1.1.28
- Source Blocks now have a PreProcessSourceFile() method that allows for injection of file and other paramters into the source block.
- GNU Plot is the first module to start implementing the data source mechanism: The following example generates a graphed line line by feeding the data in my-table into gnu plot using babel like mechanics. NOTE: Babel is in its infancy in our system. We have source handlers for python, powershell, gnuplot, ditaa, plantuml, graphviz and that is it. ONLY GNU Plot can read from tables at this time. This will change.
plot "$DATA" using 1:2 with lines title "hello"
1 | 2 |
2 | 3 |
3 | 4 |
- this was using the OrgExtended package dir as it’s cwd which was causing problems when running as a package. FIXED.
- Params structure is now a PList class and has:
- Get(name,default)
- Returns the parameter as a string value
- GetInt(name,default)
- Returns the parameter as an int value
- GetFloat(name,default)
- Returns the parameter as a float value
- GetList(name,default)
- Returns the parameter as a list of strings
- GetIntList(name,default)
- Returns the parameter as a list of ints
Plists now support double quotes “” and () brackets delimiting parameter values.
- Fixed an assert that could happen when backing image was removed.
- Sublime will now show the non image icon as expected.
- ORG_ATTR comments on image links with plists specifying image dimensions are now respected in inline sublime visualization of an image.
#+ORG_ATTR: :width 700
Mostly quality of life improvements in this release.
- Table cache works across files properly now.
- Turned off highlight updates during formula execution it was costing us during the update needlessly.
- Improved function table, symbol table and constants table construction. They are now lazy loaded and reused as much as possible for all tables reducing the costs associated with highlighting cells and navigation.
- In the interest of supporting only pay for what you use.
Dynamic table extensions (user added functions) are reloaded ONCE when
the tables are first constructed, if you are developing a function for
table handling you can now turn on:
"forceLoadExternalExtensions": True
In your settings to dynamically reload your extension all the time. This reduces the cost of building the function table.
- Added abs function
- Improved remote() function, it no longer requires you to open a view / tab although the file has to have been parsed so should be in your orgDirs / orgFile list.
- Added the ability to add dynamic symbols as well as functions.
To use add a python file in your User folder like so:
.../Packages/User/orgtable/mysymbols.py
And add the symbols you would like exposed for use in your tables.
def AddSymbols(symbolTable): symbolTable['pi'] = 3.14159268 symbolTable['c'] = 299792458
a d 0.50 2 51 0.46 3 56 0.19 4 2 0.02 5 3 0.49 6 4 0.64 7 5
- gnuplot language added to syntax, to use install the GNU Plot package.
- “Org Fold Others” - New command that folds all other headings but the immediate part of the tree you are on.
- Fixed a bug where ARCHIVE_TIME was missing a colon at the front when inserted.
- Switched archiving to save as utf-8 by default to avoid some of the unicode problems I have been running into.
- Org Insert Now Active - Inserts right now as an active datetime
- Org Insert Now Inactive - Inserts right now as an inactive datetime
- Org Insert Date Active - Pops up the date picker to insert an active datetime
- Org Insert Date Inactive - Pops up the date picker to insert an inactive datetime
- Dynamic Block Snippet:
<b
- Example blocks are now orgmode syntax inside the block.
- date() function improved to auto convert strings and cells to OrgDate objects.
- duration() added to handle columnview duration syntax. This is compatible with adding to dates.
- if statements work although they do not follow the calc style, here we are diverging a little at the moment due to the fact that our backend is really python ast. “If” is a keyword, I can’t easily use it like a function without playing some games I am not sure I am ready to do.
- percentages can be treated like numbers much like they can in orgmode
a | b | c | d | e | f | g | h |
---|---|---|---|---|---|---|---|
<2021-03-10 Wed 22:25> | <2021-03-09 Tue 22:25> | 5d | <2021-03-15 Mon 22:25> | 5d | 50 | 20% | 10.0 |
- Empty properties still make a row in the column view (allowing you to setup additional rows for calculations)
- Table format blocks can live after the end marker on a dynamic block. This is not org standard but it lets us build formulas for generated tables which can be really handy on clock tables and columnviews (building timesheets and project plans)
- Org syntax is turned on inside a dynamic block now allowing tables to be highlighted inside the block.
Task | Effort | Testing |
1.1.27 | ||
Archiving | ||
Editing | ||
Spreadsheet Preview V11 | ||
Columnview |
- improvements to orgdir globbing / error handling / parsing thanks to Anti-Distinctlyminty
- clojure
- bat|cmd
- org
- pascal
- actionscript
- applescript
- dtd
- haskell
- markdown|md
- groovy
- regexp
- ruby
- restructuredtext
- xsl
- scala
- hex
- erlang
- diff
- d
- css
- cmake
- asp
- json
- r
- Block folding inside a block was driving me nuts I have changed it so you can only fold a dynamic block or a source block from its header If this bothers you, we can make this configurable, just let me know.
- New Command: “Org Create Heading Id” This will add a UUID ID to the current heading.
- Db handling of ids reworked a little to support jumping to an ID or a CUSTOM_ID
- New Command: “Org Insert Effort” Must be org duration format. Will insert an effort property defaultEffortEstimateUnit - setting (defaults to d) can be used to set the default effort unit
- remote function can now take a custom id or id as per: Remote Table References
- Nodes now have a table property that lists the position of the first table in the node.
- It doesn’t really work well because the existing table system requires a view, which means that we have to load the file which cannot easily be done during the execution of a formula. This means you can get odd tab swaps if you have a remote reference and the file is not opened. I will have to think about another way of handling this in the future.
Part of the reason for the tags, priorities and effort markers in these release notes is to show the new column view dynamic block. It is still in its infancy. It has none of the summary functionality of the real column view. It also only has a limited set of handlers. It can access properties and has the following built in handlers:
- ALLTAGS All tags, including inherited ones.
- CLOSED When was this entry closed?
- DEADLINE The deadline timestamp.
- FILE The filename the entry is located in.
- ITEM The headline of the entry.
- PRIORITY The priority of the entry, a string with a single letter.
- SCHEDULED The scheduling timestamp.
- TAGS The tags defined directly in the headline.
- TIMESTAMP The first keyword-less timestamp in the entry.
- TIMESTAMP_IA The first inactive timestamp in the entry.
- TODO The TODO keyword of the entry.
Parameters that work:
- hlines
- maxdepth
- id (local, global, ID value, file:)
- indent
- skip-empty-rows
- exclude-tags
Parameters that do not yet work:
- match
Task | Effort | Todo | Deadline | Tags | Time | Inactive | Priority |
1.1.26 | a | ||||||
..Source Blocks | 2d | DONE | a | ||||
..Folding | a | ||||||
..Properties | 2d | 2021-03-09 Tue 20:55 | a | ||||
..Spreadsheets Preview V11 | 4h | a tag | 2021-03-09 Tue 14:53 | ||||
..ColumnView Dynamic Block | 1d | a | 2021-03-09 Tue 11:00 | B |
I am slowly driving towards being able to do this: Gantt Charts in Org Mode
I don’t have column mode yet, but we will get something like it eventually.
- Non existent subdirs are auto-created
- Execute block works on any line inside the source block as well as on the fence.
- Evaluating a block on the last line of the file was not inserting the RESULTS tag.
- Repeated re-evaluation kept adding newlines at the end.
- When evaluating source with a diagram the cursor could move, this is now fixes.
digraph G { a -> b; a -> c; c -> d; }
- Support single directory wildcards:
"orgDirs": "C:\Mypath\*\SubFolder"
Will match a single folder wildcard like so:
- C:\Mypath\foo\SubFolder\x.org
- C:\Mypath\bar\SubFolder\y.org
- C:\Mypath\baz\SubFolder\z.org
Again, this can increase your startup time dramatically. Please use with caution!
- boxes mode seems to work.
Sede Max H-index top Sao Paolo 71.00 11.50 13.5 Stockholm 134.19 14.33 16.33 Leeds 165.77 19.68 21.68 Morelia 257.56 17.67 19.67 Chile 257.72 21.39 23.39
- Auto computed cells now mostly work. Careful with these in big tables. They only auto compute when you use tab or shift tab to move between cells, arrow keys do not recompute
- Row names seem to work work.
- Above and Below names seem to work
- Symbol rows seem to work
a | b | c | |
---|---|---|---|
# | 0.38 | 0.1 | 0.46 |
# | 0.38 | 0.1 | 0.86 |
# | 0.03 | 0.6 | 0.01 |
* | 0.02 | 0.0 | 0.06 |
^ | hello | world | namedRow |
* | 0.3 | ||
_ | below | ||
# | 3.5 | 0.7 | |
# | 4.5 | 0.9 | |
# | 4.0 | 0.8 | |
# | 2.0 | 0.4 | |
$ | max=5 |
Fixed issue with 0 blank lines at the top of the file. The comment gathering code was not being initialized properly.
- Fixed bug with working directory that was causing problems when executing as a package.
- orgDirs - in 1.1.22 we added support for directory globbing. We have added a little more error handling in 1.1.23 to
detect single stars rather than double stars and to not throw in those cases.
D:\mypath\**\ - This is supported D:\mypath\*\ - This is NOT supported
- Improved handling of unsaved files when executing source blocks. NOTE: Sublime WILL save the file for you if it has already been saved, or error out. PlantUml Example Request
- added engine (neato, dot, etc)
- added fmt (jpg, ps, png)
digraph G {
a -> b;
a -> c;
c -> d
}
To use: Add the path to ditaa.jar from sourceforge in your settings file:
"ditaa": "<pathto>/ditaa.jar",
Create a source block with your diagram. (Nope, we don’t have an artist mode for sublime yet)
+--------+ +----------+
| Hello | ----> | Hello2 |
+--------+ +----------+
Execute the block and you should now have a diagram!
- Added directory globbing support to orgDirs
"c:\\Users\\ihdav\\notes\\**\\test\\"
This will find valid org extensions in all test sub folders of the path. CAUTION: This will slow down sublime start times with overly large search space!
- GPU Plot support extended: file option now allows for several output formats:
- file.txt - dumb option in gnu plot.
- file.html - canvas option in gnu plot.
- file.jpg - jpeg option in gnu plot.
- file.png - png option in gnu plot.
- file.svg - svg option in gnu plot.
- file.ps - postscript option in gnu plot.
- file.gif - gif option in gnu plot.
- GPU Plot
- Added include:header to include header row in data (you have to account for it in your plot)
- Added using statement to allow you to write your own full using statement rather than just the style:
- Improved quoting, spaces in fields are accounted for and quoted.
- Improved indent of RESULTS block.
Sede Max H-index top Sao Paolo 71.00 11.50 13.5 Stockholm 134.19 14.33 16.33 Leeds 165.77 19.68 21.68 Morelia 257.56 17.67 19.67 Chile 257.72 21.39 23.39
- PlantUml info in docs.
- Added auto image preview mode when creating images using diagram methods.
- GraphViz support.
- Only dot engine is currently supported.
- To use add graphviz path to settings file:
"graphviz": "C:\fullpath\dot.exe"
Create a source block like so and execute it
digraph G {
a -> b;
a -> c;
c -> d
}
- orgFiles was not working, this has been fixed. orgFiles does not work
- Files with a BOM. I can’t easily handle BOMs but I now do try to detect it and swap encodings if I fail to load the file as utf-8.
- Notifications fix. The notification system was asserting on SCHEDULED: <DATE> where date did not have a time.
- Fix for floating point values.
- VERY early support for gnuplot
To use:
- install gnuplot
- Set your gnuplot path:
"gnuplot": "<fullpathtognuplot.exe>",
- Run “Org Plot Table” with cursor on the table
- Right now I am just dumping an image and using the inline image show option
in the future I may change that.
Sede Max H-index top Sao Paolo 71.00 11.50 13.5 Stockholm 134.19 14.33 16.33 Leeds 165.77 19.68 21.68 Morelia 257.56 17.67 19.67 Chile 257.72 21.39 23.39
- Heading and Child heading insertion now ignores whitespace at the end of a node
- Improved extension reloading on modification. Before it would force reload to often now we track and reload only when we have to. This should improve table performance a little. This is in prep for the advanced table features including automatic cell calculations on # fields.
- Extension folders renamed for consistency:
- src folder renamed to orgsrc
- resolver folder renamed to orgresolver
- dynamic folder renamed to orgdynamic
- table extensions were already in orgtable
- Fixed small issue with syntax coloring
- Added lisp coloring for source blocks marked with lisp or emacs-lisp as the language.
Also added the following language identifiers to src blocks:
- yaml
- rust
- sql
- r
- html
- go
- ledger
- make|makefile
- typescript|ts
- Added the ability to add your own functions
Create a file with the name of your function in:
Packages/User/orgtable/<yourfunction>.py
Here I have created a file called nowstr.py:
def Execute():
import sublime
import datetime
return str(datetime.datetime.now())
The module will be run dynamically so your imports are best to put in the function as seen above. If your function takes cells they should be parameters to Execute.
In my example I am returning the current datetime as a string:
I will have further examples in the documentation going forward.
- Fixed a couple of asserts found when navigating tables.
This feature is considered an advanced feature and is disabled by default in your settings file.
"enableTableExtensions": true,
2021-03-03 12:42:03.720657 | b | c | d | e |
2021-03-03 12:42:03.738691 |
Added a bunch of the datetime methods
A |
---|
2021-03-03 19:56:44.294403 |
2021 |
3 |
3 |
2021-03-03 |
19:56:44.375228 |
19 |
56 |
44 |
2 |
62 |
Recursive todo summary data. NOTE: this counts ALL checkboxes as if they are part of the parent checkbox not just leaves. This can be set using the COOKIE_DATA property above or using the global setting:
"checkboxSummaryRecursive": true,
- [-] Testing parent [3/6]
- [x] A
- [-] B
- [ ] C
- [x] D
- [x] E
- [ ] F
Supporting this was a request from: Checkbox summaries
- A crude stab at a table visualization
- “Org Show Table Rows” - will show a set of phantoms that ID the rows and columns to help when authoring formulas
- “Org Hide Table Rows” - will hide the phantoms.
- Fixed positive relative offsets, they were not working:
a b c d e f 4 5 6 7 8 9 1 2 3 4 5 6 Things that work:
- Evaluation of rows and columns with basic arithmetic
- vmean, vmax, vmin and a handful of other functions
- the basic range syntax seen above.
- respecting the header in column expressions
- filling in a cell with an expression and having it automatically be moved to tablefmt
- cell highlighting when editing expressions.
- horizontal separators are now respected as non cells.
- Negative (relative) or arrow cell indexes
- Index symbol $# and @#
- Automatically updating your expressions when you resize the table
- box range targets
- basic printf style formatting after semi colon for floating point types: $2=$1/2.0;%.1f
- Properties and constants (defined in a CONSTANTS comment) can be used in formulas
- remote() references to other named tables.
- Visualizing columns and rows
Things that do NOT work:
- Extended calc style output formatting (semi colon)
- Advanced tabled features / Named fields
- gnu plot support
- more functions
- Invalid cell references now are not assserting in the obvious cases.
- Invalid cell references now generate a status message during the highligh phase to let you know you have invalid cell references:
- Fixed a bug with column lookup where it would return curcol sometimes rather than fixed reference.
- Removed a bunch of silly debugging prints that were left around from 1.1.16 release!
- SOME support for formatting suffix in formulas:
- N - Will treat empty cells as 0
- %.#f - Will output # decimal places like a printf
- Additional functions:
- floor
- ceil
- round
- trunc
- Properties can be referenced in an equation: $PROP_<name>
(See property in node above)
- Remote table references here we are grabbing a value from the tabled named TestName above:
a | b | c | d | e |
1 | 1 | 1 | 1 | 1 |
2 | 2 | 2 | 2 | 2 |
a | b | c | d | e |
1 | 1 | 1 | 1 | |
0.476 | 0.476 | 0.0 | 0.476 | 0.476 |
a | b | c | d | e |
5 | 10 | 15 | 20 | 25 |
a | b | c | d | e |
3.1 | 6.3 | 9.4 | 12.6 | 15.7 |
a | b | c | d | e |
10 | 10 | 10 | 10 | 10 |
CURRENT FUNCTIONS:
- vmean
- vmedian
- vmax
- vmin
- vsum
- tan
- cos
- sin
- exp
- floor
- ceil
- round
- trunc
- randomf
- random
Things that work:
- Evaluation of rows and columns with basic arithmetic
- vmean, vmax, vmin and a handful of other functions
- the basic range syntax seen above.
- respecting the header in column expressions
- filling in a cell with an expression and having it automatically be moved to tablefmt
- cell highlighting when editing expressions.
- horizontal separators are now respected as non cells.
- Negative (relative) or arrow cell indexes
- Index symbol $# and @#
- Automatically updating your expressions when you resize the table
- box range targets
- basic printf style formatting after semi colon for floating point types: $2=$1/2.0;%.1f
- Properties and constants (defined in a CONSTANTS comment) can be used in formulas
- remote() references to other named tables.
Things that do NOT work:
- Extended calc style output formatting (semi colon)
- Advanced tabled features / Named fields
- Visualizing columns
- gnu plot support
- hline symbols
- more functions
- Moving cells around, adding and deleting cells is now starting to try to keep formulas intact now!
- Deleting the target or source of a cell will result in the formula having and $INVALID or @INVALID tag which is not currently handled properly. This will be improved going forward!
- Fixed a bug with row ranges not expanding properly
- Fixed an issue with tables at the last row of the file.
- Added random(a,b) - integer random range
- Added randomf() - 0.0..1.0 random range
- Range targets are now supported:
a | b | c | d |
---|---|---|---|
0.506666 | 0.995246 | 0.5519 | 0.061723 |
0.065874 | 0.993011 | 0.241133 | 0.410426 |
- Removed some extraneous trace information.
a | b | c | d | e |
---|---|---|---|---|
3 | 4 | 5 | 6 | 7 |
2 | 4 | 6 | 8 | 10 |
- Column cell formula insertion was broken, this is now fixed.
- TBLFM expressions on their own lines would cause exceptions
- Added non standard row insertion using >= syntax.
While testing this found a bug in row expressions
a b c d e a b 5 10 >=@3 1 1 1 6 3.0914709848078967 - Still using a hacked up version of simple_eval and python ast for the expression parser. Decided using functions rather than names for the expression differences made sense. Even though this is a bit of a misuse of the parser I think I will stick with this approach, it’s simple it’s functional and will allow me to support the other variable modifiers in the end.
- Right now the parser is pretty locked down.
- I will probably never support arbitrary lisp like spreadsheets like emacs can. (As much as it would be fun to build a lisp parser here, it’s kind of missing the rest of emacs and the massive function library)
- Cleaned up some asserts that happened when editing a table. The highligher didn’t like targets changing on the fly.
- That said, I may support more and more of the calc library and even allow some user made extensions eventually.
- My eventual goal is to flesh out my babel hack to a more full featured version with all the power that comes along with that. Without TRAMP, remote sessions etc. some of the power of bable is muted a little bit. (But who knows, maybe TRAMP is possible in sublime…) That said, we need powerfull spreadsheet support as an input source before really going to town on bable is possible.
With the refactor on how I am handling cells I can now support the > and relative cell identifiers -1 is one to the left or one up from the current target being calculated. It is a relative identifier. > means last column while >> means last but one.
a | b | c | d | e |
---|---|---|---|---|
a | b | 5 | 10 | >=@3 |
1 | 1 | 1 | 6 | 3.0914709848078967 |
- In addition we have index symbols $# is the current column and @# is the current row
idx | Index Gen |
---|---|
1 | Testing Index |
2 | Generation |
- Constants defined in your file can also be used in expressions
x | y |
world | b |
Things that work:
- Evaluation of rows and columns with basic arithmetic
- vmean, vmax, vmin and a handful of other functions
- the basic range syntax seen above.
- respecting the header in column expressions
- filling in a cell with an expression and having it automatically be moved to tablefmt
- cell highlighting when editing expressions.
- horizontal separators are now respected as non cells.
- Negative (relative) or arrow cell indexes
- Index symbol $# and @#
Things that do NOT work:
- Automatically updating your expressions when you resize the table
- calc style output formatting (semi colon)
- Advanced tabled features / Named fields
- box range targets
- Visualizing columns
- gnu plot support
- hline symbols
- more functions
- remote() references to other named tables.
WARNING: Super experimental, use at your own risk.
- Horizontal rules are now respected in row ids
- Cell highlight can help with understanding formulas
- Fixed a couple of bugs with cell indexing
- Calling execute on a cell with := will introduce a new formula into the TBLFM and evaluate the table.
- = Should add a column expression
a b c d e a b 5 4 :=$1 1 1 1 1 1 Still very poorly tested but improving.
Things that work:
- Evaluation of rows and columns with basic arithmetic
- vmean, vmax, vmin and a handful of other functions
- the basic range syntax seen above.
- respecting the header in column expressions
- filling in a cell with an expression and having it automatically be moved to tablefmt
- cell highlighting when editing expressions.
- horizontal separators are now respected as non cells.
Things that do NOT work:
- Automatically updating your expressions when you resize the table
- calc style output formatting (semi colon)
- Negative or other fancier ranges
- Named fields
- Visualizing columns
Right now evaluating a table is bound to the execute DWIM binding.
NOTE: This feature will never be completely compatible with ORG. Org supports the ability to execute arbitrary lisp expressions on table cells. We aren’t going that far. That said, I really appreciate the basics of the spreadsheet feature in org and we should be able to support most of the basics with our own flair.
REALLY preliminary table formula preview. It’s buggy!
The example below runs, but not much else will.
I am undecided if I will continue with attempting to use the python ast for my expression support or simply roll my own parser as my limited knowledge of the ast module has me at a loss of how to change the default grammar. (If anyone has input and knowledge here that would be beneficial)
a | b | c | d | e |
---|---|---|---|---|
a | b | 5 | 1 | 2 |
1 | 1 | 1 | 1 | 1 |
Things that work:
- Evaluation of rows and columns with basic arithmetic
- vmean, vmax, vmin and a handful of other functions
- the basic range syntax seen above.
- respecting the header in column expressions
Things that do NOT work:
- Automatically updating your expressions when you resize the table
- Filling in a cell with an expression and having it automatically be moved to tablefmt
- Cell highlighting when editing expressions.
- calc style output formatting (semi colon)
- Negative or other fancier ranges
- Named fields
- Visualizing columns
- Horizontal separators are currently considered in cell indexes (this will be fixed)
Right now evaluating a table is bound to the execute DWIM binding.
- Incorporated Table Edit keybindings allowing for column and row movement, navigation, inserting and deleting rows and columns and hline insertion with some key bindings.
- Improved separator auto detection during import and region conversion.
None of the new commands are bound to a keybinding.
- “Org Insert Blank Table”
- This will insert a blank WxH blank table at point.
- “Org Import Csv”
- Still in its infancy
- Added Org Import Cvs command. Will import a csv file into a table.
- “Org Convert Region To Table”
- Only works with commas at the moment.
- Tries to convert a region to a table, will improve with time.
A numbered list preceded by a normal list was confusing DWIM extension. The system was putting the new entry above the unordered list.
- This would disrupt DWIM editing of the list below - DWIM was finding this list and thinking it was part - of the numbered list. 1. I am extending this list 2. This is the list I am extending
The same thing could happen for example blocks or src blocks.
- Ctrl+Shift+Enter is an extended insert For numbered lists it will extend the list vs insert where you are.
- This should now work for all the list types.
- Works when cursor is on list types.
- Will sort the list aphabetically
- Loose Tasks View was sometimes not detecting top level loose tasks
- DWIM editing of numbered lists has improved slightly
Fixed some bugs with lists at the end of a buffer
or with a blank line above the list.
- DWIM editing of standard unordered lists (not checkbox) is now supported properly.
- Indent and DeIndent somewhat work on lists (tabs vs spaces are still a little problematic)
- Request: Checkboxes in Headings
- Checkbox summaries at the END of a heading but before tags are now supported and will be updated when a checkbox is toggled:
- [ ] A
- [ ] B
- [x] C
- [x] D
- Request: Agenda Items Not Showing
- Org Agenda will reload all open buffers to pick up agenda items in unsaved buffers
- Added keybindings utility function to help author docs.
- Bug found with active timestamps not recurring properly datetime conversion was not working properly
- Fixed some issues in the agenda with old SCHEDULED: values
We would search forward in time forever trying to find
a match in the agenda. This could make org files with REALLY old
SCHEDULED tasks that were not closed take a long time to render in the agenda.
I have now capped it. 4 Months is the default: This goes for deadlines, active timestamps and scheduled values.
In addition I have enabled some caching for following repeat rules which should improve overall performance here.
agendaMaxScheduledIterations: 120
- Working to improve handling of dates without times in the agenda.
This could cause some assertions in some of the new scheduled and deadline handling systems
I believe I have all the asserts now but I am working on ensuring intuitive behaviour.
- Fixed display of plain (no time) DEADLINES, they now show the due date properly
- Fixed closing of plain (no time) DEADLINES, they would assert before when trying to update the time.
- Changed default keybinding. Capture is now Alt+o z to mirror neovintageous mode with Z (it also did not work before due to other Alt+o c … commands)
- Removed legacy automatic copy of settings files to User folder now that we are using the new dual pane settings mechanic. This was causing an assert on startup for users on ST3.
- Active timestamps with ranges were not showing up in the agenda properly. This was due to how the timestamps were querried. Should now be fixed.
- Closed Scheduled timestamps would show up in the week view even after the scheduled date. this was a byproduct of the new scheduled behaviour and has been fixed. When closed the items will show up ONLY for the date they were scheduled. (They do not reflect) the date at which they were closed. In the future I hope to make that happen. NOTE: they do not show up in the day view at the moment. I will work to improve that in a future release.
- Toggling a task to done with a recurring timestamp will set the LAST_REPEAT and LOGBOOK entries properly now and will update the base timestamp.
- Fixing regression in 1.1.2 New shared keybinding command was being instantiated improperly
- Added OrgDeadlineCommand OrgScheduleCommand OrgActiveTimestampCommand to add SCHEDULE, DEADLINE and active timestamps using the quick picker.
- DEADLINE works in the agenda. Very minimal visualization at this time. Will show Warning, Due and Overdue messages on the right hand side of the day view.
- DEADLINE: <........ -3d> basic warning cookies work
- Fixed a bug with new SCHEDULED: behaviour in week view.
- Removed visualization in the CalendarView for SCHEDULED and DEADLINE while I figure out the best way to visualize that, that is not super ugly.
- New Link Editing Commands
Org Copy Href will copy the href out of a link onto the clipboard
currently not bound to a keybinding.
Org Select Href will select the href in a link, even if it is folded.
currently not bound to a keybinding
- Support active timestamps vs SCHEDULED
SCHEDULED is when you want to start on a task
while tasks with a timestamp are scheduled at a point in time.
** TODO Heading SCHEDULED: <startdate> <-- This will appear in the agenda until you close the task ** TODO HEADING <date> <-- This will appear in the agenda but only at the date specified
- BREAKING CHANGE
Before I would only show tasks, these are items with an open TODO state.
Now, by default anything that has an active timestamp or is scheduled will
show up in the agenda UNLESS you set that view to :onlytasks as a parameter.
** HEADING <date> <-- This will now appear in the agenda where before it would not
"AgendaCustomViews": { "Default": ["Calendar", "Week", "Day : onlytasks", "Blocked Projects", "Next Tasks", "Loose Tasks"], "Todos": ["Todos"], }
Note the onlytasks parameter, that will filter out non tasks from the Day view in my default agenda view.
- DEADLINE is still not supported but support should be comming in a future release.
- Added link insertion snippet
<l
Will insert a new quote jumping between the fields and jumping after the link when done
$2 $0
- Truncated filename in day view for filenames longer than 12 characters.
- Fixed quick panel views to continue to work on ST4 builds.
- Org Select Subtree
This will select the full subtree of the active heading.
- alt+o m s
- <space> m s (neovintageous normal mode)
- Org Select Entity
This will select just the current node
- alt+o m e (mark entity)
- <space> m e (neovintageous normal mode)
- Org Copy Subtree
This will copy the entire subtree to the clipboard.
- alt+o y s (yank entity)
- <space> y s (neovintageous normal mode)
- Org Copy Entity
This will copy the current node to the clipboard.
- alt+o y e (yank entity)
- <space> y e (neovintageous normal mode)
- Org Select Entity
This will select just the current node
- Fixed link tab cycling.
- The generator is now able to handle simple tmTheme files.
NOTE: it converts them to sublime-color-scheme files in the output folder.
- Added Org Select Color Scheme menu item to switch Org between color schemes you have already generated. NOTE: same caveats hold about having org files open when switching. Sublime does not automatically switch existing views.
- For ST4 users - neovintageous has upgraded to python 3.8
this means that my hacks to push register 0 with the values
of the system clipboard aren’t working until I upgrade OrgExtended.
I will attempt to make that a priority for those that care.
- Fixed a bug where buffers that are lacking a filename can still be folded.
new setting:
- clockingSubMinuteClocks: true will now keep clocking entries that are smaller than a minute
- Fixed move heading up / move heading down. This now does the same
as org-move-subtree-up and org-move-subtree-down.
- Moves headings within siblings at the same level of the tree.
- Date picker syntax extended to work with generic color schemes
- Agenda picker syntax extended to work with generic color schemes
- Color scheme generator has time delay to try to avoid popup errors when generating and switching color schemes.
- Color scheme generator will generate some of the key agenda colors.
- Color scheme generator will output a comment block for the date picker describing additional scopes.
This is a bit of an experimental feature to help people use org mode with their own color scheme. It is NOT complete and not where I want it to be yet. This does not yet touch the agenda or the data picker, but I do eventually intend to work on those as well.
I feel like orgmode should respect your chosen color scheme!
- Org Create Color Scheme From Active
When run from a normal NON org mode buffer will sample the currently active color scheme, create a new color scheme file in:
Packages/User/OrgColorSchems/<originalName>_Org.sublime-color-scheme
It will then add a couple of key scopes such as:
- orgmode.preamble
- which is used to make the leading stars invisible on a subheading
- orgmode.state.*
- These are used to give the core built in states some color
This also adds a comment block in the color scheme file that tries to help new users understand what their options are. Note this is based off your active color scheme.
This will ALSO change the active OrgExtended color scheme to be this new color scheme to let you see how it is going to pan out. This may, or may NOT work out well for you!
NOTE: This is a preview feature. It is still under active development and will change / improve as I mature it. I felt it might be beneficial to some to release it at this point. PLEASE only use this feature if you feel confident with your ability to manipulate sublime color schemes. I have yet to document the feature or test it on a wide variety of color schemes. Ultimately I would like to include the orgagenda and orgdatepicker schemes into this one scheme. To do that I need some more creative programmatic means of generating a starting color palette from a pre-existing one. That will take a bit.
However, in the interim I am happily using a generated Guna color scheme on my personal machine.
- Bash blocks uses embed to allow them to escape properly
- Core syntax (not agenda and picker) now support standard syntax markers
- NOTE: Not all features are supported or colored. Existing OrgExtended color schemes are still the preferred means of viewing an org file.
- Eventual goal is to take an existing active color scheme and provide a tool to extend it to support all the org coloring. This is a first step in that direction.
- Created languagelist.yaml to make it easier to add new languages to the syntax.
- #+CAPTION comments export a custom figure for tables and images.
- At the moment captions are always t-above style.
- Figures are done with a div and span pair.
- Styles include: .figure .figure-number and caption.t-above and caption.table-number
- #+AUTHOR, #+TITLE, #+EMAIL, #+LANGUAGE tags have rudimentary support although very rough.
- #+NAME is stripped out of output properly.
- HTML Exporter has better support for HTML_ATTR comments.
- Capture now works on ST4 4096+ with the new modifiers
- Direct capture mode has had some fixes that handle spaces on a line and end of file better
- WeekView in calendar now respects agendaDayStartTime and agendaDayEndTime
- View will be truncated to the hours specified
- Documentation moved out of the repository to its own repository this was done to shrink the size of the package.
- Turned off logger that was accidentally left on.
- Added “openas”: “direct” to capture definitions. This will open the capture directly in the file at the target location.
- Added “agendaFirstDay” and “agendaWeekViewNumDays” to settings to allow
users to start the week view from monday rather than sunday and limit the
week view to just a 5 day view rather than 7 days if desired.
- Actually agendaFirstDay got renamed to firstDayOfWeek as the date picker now respects the firstDayOfWeek as well rather than just the agenda
- Cleaned up a bunch of old debugging output.
- Working on named targets for blocks in the parser, this is to facilitate
eventual chainging of inputs in the bable execution.
- Fixed archive notation to work without the colon separator.
- added <q and <v quote and verse snippets
- Added these release notes
- Improved settings to use the new settings ui.
- Changed docs link in settings to open the docs repo rather than opening the docs in sublime.
- Fixed global tab cycling on first line of file.
- agendaFirstDay can now be the english name of a day of the week OR an integer.
- Month view in the agenda now respects agendaFirstDay
- PRIORITIES comment is now respected in change priority command
- STARTUP comment now recurses
- WARNING: orgextended.sublime-syntax renamed to OrgExtended. This is so the title appears as OrgExtended in the syntax list on the bottom right of sublime. This can caust errors when loading sublime with an old settings file. Please carefully rename your settings file and close all org tabs.
- Fixed a number of issues when loading as a zipped package. Export should work from a package again.
- agendaDayStart and End renamed to agendaDayStartTime and agendaDayEndTime for more clarity
- Improving link handling for local files.
- Fixes some bugs around generating local file links.
Setup instructions can be found here: https://github.com/ihdavids/orgextended_docs/blob/master/start.org
Org Mode in Emacs is an extensive lifestyle plugin. This plugin couldn’t hope to duplicate the full expanse of Emacs org mode. That said, this plugin attempts to provide some of the amazing functionality found in Emacs org mode right here in sublime text!
Org Mode IS: https://orgmode.org
- A document interchange format
- A personal wiki
- A task and project management toolset
- An agenda
- A means of building living documents known as literate programming
- The backend for blogs, webpages, and an outliner for authors.
- A tool for authoring presentations.
- A time tracking tool
- A spreadsheet and data management tool
- And much much more.
This plugin is written selfishly as a means of helping me stay organized. It comes with no warranty whatsoever. It is my hope that you still find it useful.