Directory Opus 13.17
Download manually, or use Help > Check for Program Updates.
The following is a summary of new features and other significant changes from 13.16.
See the New Releases forum for detailed release notes for the various beta versions from 13.16.1 onwards.
Compatibility
- Fixed problem with PowerToys Command Palette causing Opus to open a window for a folder called "The Internet" (but showing the content of the desktop), if Explorer Replacement was switched into "for all folders" mode.
Task Manager
The new Task Manager window displays a list of various types of running Opus tasks. Three task groups are shown currently - scripts, evaluator and background tasks. Currently background tasks only include thumbnail and metadata threads, but more background tasks may be added in the future.
The Task Manager shows each task's state and how much runtime has elapsed in total since it was started. You can cancel individual script and evaluator tasks, and can also activate an emergency "disable" flag for both types.
To access the Task Manager, use the command Help TASKMANAGER
. This has been added to the default Help menu - reset the Operations toolbar to factory defaults to get this command automatically. It also has a default hotkey assigned - Ctrl+Shift+F1.
File Types
-
Added a Cloud item entry to the File Types dialog, under the Directory Opus File Types category. This is now responsible for adding the "Always keep on this device" and "Free up space" context menu commands for cloud storage files, and means you can remove them if unneeded.
-
Improvements for File Types dialog with file extensions that don't have "proper" entries in the registry, but instead are only assigned via the "Open With" system.
-
On startup, Opus no longer "repairs" the .Zip file type events (Opus-specific events for double-click, double-click + shift, etc.).
The default events now only come from the Archives file type group, without the .Zip type adding further overrides.
As well as simplifying things, this means you're now free to modify what happens when double-clicking Zip files inside Opus (e.g. if you always want Zips to open in a new tab, you can do that now).
Favorites
-
The Favorites system now allows files to be added to the list as well as folders.
- Clicking a favorite file opens the file (except if displayed in the tree, where clicking it will read its parent folder and select the file).
- The Folder Tree / Contents Preferences page has a new option for Favorites to show files in the folder tree.
Preferences
-
Added two new options in Internet / Updates:
- Automatically install when Opus is inactive: After an update is downloaded, Opus will launch the installer automatically when idle (e.g. no file copies are ongoing). A UAC prompt may still be required.
- Install updates with minimal interaction: Streamlines update installation when done via the update checker. A UAC prompt may still be required to install each update, but you won't normally need to see or click on the installer beyond that.
-
Internet / Updates now always allows you to turn off checks for new betas. If a beta is currently installed and beta updates are turned off, a note will appear informing you that the beta updates will still be detected until a stable release has been installed. There's also a link to easily revert to the previous stable release.
-
Added Folder Tabs / Options / Per-tab format lock option. When turned on, the format lock only applies to the tab that's visible when it's turned on - the lock state won't carry over to other tabs.
-
The Frequently Used Paths / SmartFavorites page now has a folder exclusion list, which lets you configure folders or wildcard patterns to exclude specific folders from the SmartFavorites system.
-
Moved the SmartFavorites points configuration to its own page.
-
Added Miscellaneous / Advanced: [Limits] hotkey_sequence_time option, which lets you change the default 5000ms timeout between keypresses when using multi-key hotkey sequences.
-
Added Folder Tree / Sorting Preferences page. It contains a few options related to sorting the folder tree.
- Mirror sort order from file display: With this turned on, the sort order of folders in the tree will update to match the order in the file display whenever possible.
- Numeric order sorting: Detect numbers in folder names and sort based on their numeric rather than lexical value.
- Use global ignore prefix: Ignore the prefixes configured in Filtering and Sorting / Sorting in the tree as well as in the file display.
- Word sort: Special handling for hyphens and other punctuation characters when sorting folder names.
-
Improved Preferences search for Chinese IMEs.
-
When Opus starts up it now runs a background task that automatically builds the Preferences search index if it's out of date. This means your first Preferences search after an upgrade shouldn't be noticeably slower than subsequent ones (unless you try to do it in the first 10 seconds or so after startup). This can be turned off via Preferences / Miscellaneous / Advanced: [Behavior] prefs_prebuild_search_index if desired.
Other Changes
-
In file collections a new column, Date Added, is available. This displays the date/time that each item was added to the collection. Note that existing collections do not contain this information so the column will not display data for any files added to collections by earlier versions.
-
The markup text code
<#>
for setting text/background color now accepts the "fill" keyword to make it fill the entire area rather than just the area behind the text. For example,<#ffffff #aa0000 fill>...</#>
in the status bar would fill the entire status bar part with red.
Commands
-
Added "Select Random Item" command to the default Edit > Select Other menu.
-
Go FOLDERCONTENT
,BACKLIST
,FORWARDLIST
andHISTORYLIST
now support amaxwidth
parameter to limit the width of menus it produces. If a file or folder name is longer than the specified value, it will be truncated. -
Added new
Go FOLDERCONTENT
keywordresolvedirlinks
. If this is specified, .lnk files are resolved to see if they point to folders and if so treated the same as folders (even when files would ordinarily be hidden). This means something likeGo FOLDERCONTENT=move,resolvedirlinks
will work with a folder full of directory shortcuts.Note that while similar, this option behaves slightly differently to the existing
noparselinks
keyword, particularly in relation to filters. Theresolvedirlinks
keyword specifically relates to links to folders, and the resolving is done earlier so they're actually treated as folders all along, meaning any filters the command uses will be compared against the link target rather than the link itself. Thenoparselinks
option relates to links to both files and folders and is done later, and any filters will be compared against the link rather than its target. -
You can now use embedded commands with
Go FOLDERCONTENT=move
etc. The commands will be added to each generated button following the instruction that actually performs the copy or move operation. -
When using an embedded command with
Go FOLDERCONTENT
the chosen target path is now available as a variable calledtargetpath
. It can be accessed in the embedded function as{$targetpath}
. -
Added
Show VIEWCMD=nextrandom
to make the standalone viewer jump to a random image in the list (without needing to be in slideshow mode). -
Several changes for the
Select
command:- Added
NOCOLUMN
argument. Lets you use theRANGE
argument without having the Index column automatically added to the file display. - Added new
CASE
andIGNOREDIACRITICS
arguments, to control whether wildcard selections ignore case and/or diacritics. - The command
Select INVERT TYPE=focus
can now be used to toggle the selection of the item with focus (useful if you want to reassign the normal behaviour of Space to another key). - The
Select SHOWHIDDEN
argument can now be used in conjunction withHIDESEL
andHIDEUNSEL
, as well as by itself.
- Added
-
"Clear the filter automatically when changing folders" can now be overridden both ways when refreshing a folder via
Go REFRESH=filterkeep
andGo REFRESH=filterclear
. -
The
Favorites
command has a newTYPE
argument which lets the generated favorites list in toolbars/menus exclude files or folders. -
Added
@clearoutput
directive to clear the script log from a function. -
Added
@requires
command modifier. Allows a function's requirements (e.g. source path, selected files) to be specified explicitly, if needed. -
In "Command" mode the FAYT field now has a pin button which lets you pin it open and prevent it from disappearing when it loses focus. This lets you run a command and then edit the command line to run it again. You can toggle the pin from the keyboard with Ctrl+Shift+Page Down and Ctrl+Shift+Page Up.
Evaluator
-
Added for and while loops (plus
break
/continue
keywords) to the evaluator. The syntax is the same as C/C++/Javascript, e.g.for (a = 0; a < 10; a++) { ... }
. The body of the loop must be enclosed in{...}
braces. -
Added
ListerCount
value for evaluatorSysInfo()
function - returns the current number of open Listers. -
In the Rename dialog, an evaluator insertion clause can now call (or return the result of) the
Cancel()
function in order to skip the current file. -
Evaluator groups can now use markup in their headers. To use this, the group must return a value collection from the evaluator clause, with the marked up string assigned to a variable called
markup
. Thename
variable must also be present to provide the non-marked up name as before. -
The evaluator
Output()
function now accepts an optional second parameter; if set to true, the output log will be cleared before the text is printed. -
Added
EscapeWild
evaluator function.
Scripting
-
The
FSUtil.Hash
method can now operate asynchronously and return its result to a dialog's message loop. To use this, pass theDlg
object as the third argument to theHash
method. TheHash
method will return an ID number for the request, and your message loop will receive a "hash" message when the result is ready. TheMsg.data
value provides the ID and theMsg.object
value provides the hash (either as a string, or a vector for more than one hash type). -
Added
Path.GetDrive
method. Returns aDrive
object for the path (orfalse
if path doesn't refer to a drive letter). -
Added
Drive.ssd
property. Returnstrue
if drive can be identified as solid state. -
Added
ListerCount
property toSysInfo
object - returns the current number of open Listers. -
Added
Control.GetItemRect()
method. Returns aRect
object containing the position of the specified item or subitem. Works with listview, listbox and tab controls. The first argument is the item's index; for listviews in details mode, a second argument providing the subitem's index can optionally be provided. The rectangle is returned in client coordinates relative to the control; you can use theControl.ClientToScreen()
method to convert to screen coordinates if needed. -
The
Dialog.SetTimer
method has a new "One Shot" parameter which automatically kills the timer the first time it fires (the script can then set the timer again in response if it wishes). Can be used to avoid problems with asynchronous timer events. -
The
Tab
object has a newunresolved
property which provides unresolved versions of all the various Item collections (e.g.all
,selected
). Mostly useful with file collections which normally return the resolved path - accessing through the unresolved objects will return the nativecoll://
paths instead. -
The
Metadata
object has a newspecial
property which provides a collection of any folder-specific properties. For example, in file collections you can access thedateadded
property this way to see when an item was added to the collection. -
Listviews in script dialogs now send a "key" message when a key is pressed and the listview has focus. The
Msg.data
property provides the virtual key code of the key pressed, andMsg.value
provides the name of the key in text form. Virtual key codes are listed here: Virtual-Key Codes (Winuser.h) - Win32 apps | Microsoft Learn -
Scripts that wish to show their own configuration UI can now easily integrate it into the Script Management dialog (so that it's accessible via the normal script config button). There are two ways to do this:
-
The first way is to implement the
OnConfigureScript
method. Similar to theOnAboutScript
method, this lets a script take over the configuration function completely and display its own dialog when the config button is pressed.This method means the script can't use standard configuration, because there would be no way for the user to configure it.
-
The second way is to implement the
OnAddConfigPages
method. This lets a script add additional tabs to the standard configuration dialog. The standard script configuration is still available to the user from the first tab.In response to
OnAddConfigPages
, the script must create a detached dialog containing a tab control with at least one tab. It must run a normal script message loop and handle all message processing as normal. The only difference is that instead of callingDialog.Show()
the script must callDialog.AddConfigPages()
, and pass through theAddConfigPagesData
object that's supplied to the method.
-
-
Opus script objects now support the
hasOwnProperty()
method to check for the existence of a property by name. -
The
Vars.Set
method will now fail if you try to store a non-Opus object (e.g. a JScript array) in a variable. Language-specific objects are associated with the particular instance of the script engine that creates them and can't survive once the script stops running. To persist non-Opus objects in Opus variables you can serialize them (e.g. by converting them to JSON strings).