New in Epsilon 14
Epsilon 14 began beta testing in March 2020, and was released on 20
October 2020. This page describes its new features. You can also read
about the features we added in previous
versions. Purchase your update here.
Epsilon 14 includes these operating system versions:
- A graphical version that runs under all versions of Windows since
Windows Vista, plus a Window Console Mode executable.
- A macOS application that can run as an X11 program or a terminal
program.
- Linux packages in both .rpm and .deb formats, plus a version for
FreeBSD. Each runs as an X11 program under X11, or as a terminal
program on the console or terminals.
All versions above share most customization files. (The Epsilon
distribution also includes older versions of Epsilon that run under
OS/2 and DOS.)
Major New Features
- Epsilon is now a 64-bit program. (On most platforms a 32-bit
version is also available.) All have the same features and can share
the same state files.
- The new compare-files
command compares all files matching a pattern to corresponding files
in another directory, showing which files are identical, different, or
missing. You can compare entire hierarchies by naming two directories,
or use ** in a pattern to
compare only certain
file types in the hierarchy. The new
compare-files-method
variable controls whether it compares by examining file contents (the
default), just checks file dates and sizes, or compares bytes. Run
compare-files with a
prefix argument and it will prompt for that, how to compare runs of
spaces and tabs (normally determined by
compare-files-ignore-spaces)
and other comparison options. In the resulting listing,
there are keys to
examine or further compare individual file pairs in various ways, or
copy files in either direction. Some of these keys now work in
diff and
visual-diff buffers too.
- You can now use environment variables
when typing file
names, using the syntax %TEMP% under Windows, and $TEMP or ${TEMP}
for macOS, Linux and FreeBSD. Completion works too. When a value
has a list of directories, Epsilon converts it into a file pattern, so
a pattern like %INCLUDE%\std*.h (or $INCLUDE/std*.h) matches files in
any INCLUDE directory. Windows shell folder names are also recognized,
and you can add your own shorthand names. The new
file-interpret-env-vars
variable controls this. The new syntax also works in
find-linked-file.
- There are new commands for navigating in source files. The
goto-next-declaration
command on Ctrl-c Ctrl-n and
goto-previous-declaration
on Ctrl-c Ctrl-p move to the next or previous global declaration or
definition of a function or variable. The
goto-next-definition
and
goto-previous-definition
commands are similar but move by definitions, ignoring declarations.
The commands work in all modes that support
tagging.
- C mode now highlights matching #if/#else/#endif lines in the same
way it highlights matching parentheses, controlled by the new 2 bit in
auto-show-c-delimiters.
(The 4 bit makes Epsilon skip highlighting when point is after the
preprocessor keyword, such as in the expression part of an #if, but is
not on by default.)
- C mode now colors "#if 0" blocks as comments. The new
c-color-preproc-if-pattern
variable determines what counts as an #if 0 block, so you can make
other #if-like preprocessor lines start comment coloring too.
MS-Windows-Specific Changes
- On Windows, the
dired file pattern *:
now matches all local drives (but see the new
drive-match-types
variable), so you can use dired on *: and then descend into each
drive.
- Epsilon for Windows now moves and resizes itself at startup if
needed to ensure it's visible on at least one monitor. The new
-vf
flag controls the details.
- Epsilon for Windows now looks better on high DPI screens under
Windows 10.
- Epsilon for Windows can now overwrite hidden files.
- The
configure-epsilon
command in Epsilon for Windows was reimplemented, and Epsilon now uses
a different installation system under Windows. An installer that does
not require Administrator privileges and performs a per-user install
is now available separately.
- The new
session-restore-exclude-file-types
variable may be used to tell Epsilon for Windows not to include
network files or those on removable drives when saving a
session file.
- Epsilon for Windows now works around a Windows issue that prevents
directly renaming directories to change their case.
- The
draw-column-markers
variable in Epsilon for Windows now allows defining up to 100 column
markers.
MacOS/Linux/FreeBSD-Specific Changes
- Under X11, Epsilon now sets the mouse cursor to different shapes
in a way similar to Windows, and its default shape is now an I-beam
instead of an arrow. (Setting the std_pointer variable to 0 under X11
using Alt-x
set-any-variable
restores the former arrow cursor.)
- On Unix and Mac systems, the
set-font and
set-color commands in the X11
environment have been reimplemented (to eliminate their dependence on
a 32-bit-only helper program).
- The Linux version's packages now install into /opt by default
instead of /usr/local, and includes a new Epsilon icon for window
manager menus.
- Epsilon for macOS is now code-signed and uses a new startup
helper program. It has various changes to work better with macOS 10.15
Catalina's privacy dialogs, new default shell, etc. It now requires
macOS 10.9 or later.
- The
preserve-filename-case
variable recognizes two new bit values. In Epsilon for macOS, the 16
bit makes Epsilon treat file names as case-sensitive (instead of the
default, case-preserving). In Epsilon for Linux/FreeBSD, the 32 bit
makes Epsilon treat file names as case-preserving (by default they're
case-sensitive). (Under Windows, Epsilon retrieves this information
from the OS separately for each drive.)
- On macOS, Linux, and FreeBSD, you can now set the 32 bit in the
dired-layout variable to
make dired show the
full date including year and seconds for all files. (By default it
mimics the format of ``ls -l'', showing either a year or hours and
minutes, never both and never seconds.)
- Epsilon for X11 will now read any custom
X11
resource definitions you put in a file named
~/.epsilon/Xcustomresources. The new optional setting
"Epsilon.recordPosition: 1" in this file makes Epsilon for X11
remember and restore its window position.
New Default Values And Bindings
- Pressing <Enter> in the modes for HTML, XML, and PHP now
reindents the current line before moving to the new one, as a result
of new default values for the
html-reindent-previous-line,
xml-reindent-previous-line,
and
php-reindent-previous-line
variables. Set these back to zero if you don't want this behavior.
- Epsilon for Windows now uses the Consolas font by default instead
of Courier New. If you've
previously selected a font
other than the default, Epsilon will continue using that.
- Epsilon for Windows now treats the <Tab> key differently in
dialog boxes. When the focus is on an Epsilon window within the
dialog, it now performs completion, just as in non-Windows versions of
Epsilon. Previously it cycled through the dialog's controls. The
want-gui-prompts
variable recognizes the new bit value 2, which makes <Tab> in
dialog boxes cycle through the controls, as in previous Windows
versions. Similarly, the <Escape> key now performs completion in
such instances, just as in non-GUI versions, and the 4 bit restores
<Escape>'s old behavior of canceling the dialog. A setting of 7
restores Epsilon 13's treatment of both these two keys.
- Count-words is now
bound to Ctrl-c Ctrl-w.
- The want-auto-save
variable now defaults to 1, so Epsilon will now create
autosave
files by default. Saving a file deletes its autosaved version
(which by default has a name like #file.cpp.asv#).
- The
message-history-size
variable's default is now 1 million characters, so the #messages#
buffer can hold many more messages.
- The
sentence-end-double-space
variable now defaults to 0, meaning paragraph filling now uses one
space after a sentence, not two.
- The
html-paragraph-is-container
variable now defaults to 1, meaning it assumes HTML's p element is
used as a container. (Very old HTML code sometimes used these tags as
paragraph separators, with no </p> tags. Epsilon no longer scans
HTML files to see if they seem to use this old style. You can set this
variable back 2 if you must maintain ancient HTML files and want
Epsilon to scan each HTML file.)
- The default color scheme in non-console environments,
standard-gui, now uses dark brown instead of black for keywords in C
mode and modes based on it, and for function names in Visual Basic
mode. You can use Alt-x
set-color to change the
colors.
Buffer-specific Variables and File Variables
- Many variables that control indenting rules and other features
have been made buffer-specific, so they can have a different value in
each buffer. These are: auto-fill-comment-rules, c-access-spec-offset,
c-align-break-with-case, c-align-contin-lines,
c-align-contin-max-offset, c-align-contin-max-width,
c-align-extra-space, c-align-inherit, c-align-open-paren,
c-align-selectors, c-auto-fill-mode, c-biggest-declarator,
c-brace-offset, c-case-offset, c-contin-offset,
c-delete-trailing-spaces, c-fill-column, c-indent-after-extern-c,
c-indent-after-namespace, c-label-indent, c-param-decl,
c-reindent-previous-line, c-tab-always-indents, c-top-braces,
c-top-contin, c-top-struct, c-top-template, closeback,
comment-repeat-indentation-lines, css-indent, fill-c-comment-plain,
html-indent, html-style-rules, indent-preprocessor-contin,
java-indent, matchdelim, new-c-comments, php-top-level-indent,
python-indent, recognize-password-prompt, reindent-c-comments,
reindent-c-preprocessor-lines, reindent-one-line-c-comments,
reindent-perl-comments, tcl-indent, topindent, vhdl-indent,
xml-indent.
- Files can use a special syntax to tell Epsilon the appropriate
settings for editing that specific file (for instance, the tab size or
mode to use); these are called
file variables. Now,
instead of only using a fixed list of known file variable names,
Epsilon lets any numeric buffer-specific variable be used as a file
variable, including all the ones listed above. That also means if an
extension defines a new numeric buffer-specific variable, it can
immediately be used as a file variable.
- Epsilon's file
variables feature now loads any .epsilon_vars file in its
customization directory and applies its settings to all files.
Settings in per-directory .epsilon_vars files have precedence, as do
file variables set by individual files. You can now tell
Epsilon to search a file's hierarchy for an .epsilon_vars file in a
parent directory by setting use-file-variables.
- All .epsilon_vars files can now use Basenames blocks to more
conveniently apply rules to files by their basename, not just their
extension or full path. File variables can now be defined in terms of
other file variables, including simple expressions.
Language Mode Improvements
- When no region is highlighted,
comment-region now
operates on the current line.
- The new
comment-region-options
variable has bits that control how
comment-region behaves:
whether comments should be indented, whether indented comments should
be recognized, and if blank lines should be skipped. Any mode can
define a variable that includes its name, such as
python-comment-region-options,
and comment-region will use those settings in place of
comment-region-options.
- The new NSIS mode
supports editing .nsi files, adding variables
auto-show-nsis-delimiters
and
nsis-auto-show-delim-chars.
- C mode now works with more
varieties of JavaScript's syntax for defining functions, and its
syntax highlighting now supports JavaScript's template literals
(backquote-surrounded and with interpolated expressions).
- The new
c-align-inherit
variable controls how much extra indentation lines specifying C++
inheritance (those following a line ending in : in a multi-line
function header) should receive. A value of -1 indents it like any
other continuation line.
- The tag-options
variable's new bit 2 (now the default) makes the
select-tag-file command
look up the directory hierarchy from the current file when suggesting
a new tag file.
- Epsilon now tries to auto-detect when a here document in Perl or
PHP contains HTML code, and color it appropriately. New variables
perl-heredoc-syntax,
php-heredoc-syntax,
and
shell-heredoc-syntax
configure this. For each of Perl, PHP, and Shell mode, you can make
Epsilon assume here documents are always HTML (or TeX), let Epsilon
try to detect the right language, or only color here blocks as HTML or
TeX when the here document's terminating string ends in ".html" or
".tex" (as in previous versions).
- In Makefiles, Alt-i
(list-make-preprocessor-conditionals) now recognizes both Gnu
Make and Microsoft Nmake syntax for conditionals on all systems,
instead of choosing which one to recognize based on whether the
Windows version of Epsilon was running or not.
- Python mode now colors
function names with a specific color, as in most other modes.
- TeX mode's
feature for synchronizing with a DVI previewer now also works with PDF
files. The
manual
explains how to configure Epsilon and a suitable PDF program so
you can Ctrl-click on TeX source and jump to the resulting PDF
output, and vice versa, using SyncTeX with the
jump-to-dvi command, which
has also been enhanced to handle mainfile declarations. And TeX's
matching delimiter highlighting now skips over delimiters
inside/outside comments or math mode, depending on whether the
original delimiter was inside such blocks.
- Some Shift-F1
context help
default definitions were changed to search the web instead of looking
for installed help files. Such definitions can now use new shorthands
to search for results on a specific website, and optionally, go
immediately to the best match. Code in .m and .js files now uses
specific rules instead of the generic C mode rule. The commands
select-help-files and search-all-help-files were removed, since they
only worked with ancient help file formats.
- When C mode scans for function definitions, it skips over the
standard macros _ANSI_ARGS, __P, and PROTO that can appear within
their signatures. You can now expand this list of macro names by
modifying the new
c-prototype-macro-names
variable. And Epsilon now uses this list in more contexts.
- C mode's
c-align-open-paren
variable now understands a new option. Set it to 2 to make Epsilon use
alternate logic when indenting lines within a multi-line expression,
depending on what character appears before the line break.
- C mode no longer thinks C++14's use of ' as a digit separator in
numeric constants begins a character constant, and understands C++'s
raw string syntax. Tagging and displaying the current function's name
work better with C++ template syntax. C, C++, and Java keywords added
in more recent versions of those languages are now colored as
keywords.
- You can now set the
c-align-contin-lines
variable to -1 if you don't want to limit alignment rules by column.
This value acts like an infinitely large value.
- When parsing the buffer for the name of the current function, C
mode assumes by default that a } right brace character found at the
left margin marks the end of a top-level block (such as a function,
class, or structure definition). If you must edit code formatted with
the } of inner blocks also on the left margin, you can now set the new
c-quick-scan variable to
zero. (On very large files, this can make updating the function name
shown on the mode line much slower.)
- Epsilon now recognizes that it should use
Shell mode for more types of
files.
Other Improvements
- The
save-all-buffers
command now reports which files it saved.
- File names and tag names may
now be up to 4095 characters long (previously, 255 and 1023
respectively).
- The right-click context menu now has a "Web Search" item, which
runs the new web-search
command to open a tab in your browser displaying the results. You can
edit the web-search-url
variable to change the search provider used.
- In a concurrent
process buffer, completion now works on environment variable
names (in addition to file and command names).
- Epsilon now tries to set the buffer directory of ssh and telnet
buffers to a suitable scp or ftp URL, so that commands like
find-file will
prompt
with a more useful default path.
- If an external curl or wget program is installed, Epsilon can run it
to display https:// URLs in a buffer.
- When typing a URL at a file prompt, completion now works on the
host name and user name portion. Epsilon uses its prompt response
history to collect matching host names and user names. Similarly, when
typing the path portion of an http or https URL, Epsilon completes
using previous responses that match the partial URL.
- The new all-read-only
variable can be used to make buffers read-only by default.
- The new
this-buffer-grep
command provides a shortcut for grepping just the current buffer.
- The grep and
file-query-replace
commands now skip files over 2 GB in size by default. The new
grep-ignore-file-max-size
variable controls this.
- The new
select-and-grep command
lets you set up named shorthand sets of ignore rules, then select
which set to use. By default, the "all" set makes grep search all
matching files, no matter their name, extension, or size, instead of
excluding many binary-type files and very large files.
- The filter-region and
shell-command commands,
on Alt-| and Alt-!, now interpret a negative argument to mean "prompt
for the buffer name to receive the program's output". As before, the
default is to use a standard name, and an argument greater than one
puts the output in the current buffer (for filter-region only,
replacing the region's text send to the external program).
- Dired mode now
recognizes @ to toggle the read-only property of a given file. The
quick-dired-command
on Alt-o also recognizes this key, so Alt-o @ toggles the current
file's read-only status.
- File name
templates now recognize new codes %h for the host name of a URL
and %c for Epsilon's
customization
directory.
- The new
set-bookmark-automatically
variable may be used to make Epsilon set a bookmark at the previous
location following a search.
- Epsilon now supports mice with up to five buttons, via new key codes.
By default, buttons four and five page up and down.
- The mode-format
variable now understands a new code %o to display the numeric value of
Epsilon's variable "point" (the
character count from the start of the buffer).
- To improve performance, on buffers bigger than 10 MB, Epsilon no
longer updates the function name (or other mode-specific contextual
information) displayed in the mode line when you click and drag the
scroll box. You can set this size limit with the new variable
mouse-update-during-scroll.
Epsilon will update the mode line once you release the mouse button.
- Displaying text with syntax highlighting and extremely long lines
while in horizontal scrolling mode is now much faster.
- For safety, dired
no longer permits you to mark the .. parent directory entry for
deletion, and suggests you edit the parent directory and delete it
from there.
- Regular
expressions now understand <ident> as a synonym for
<word>, matching a letter, digit, or underscore character.
- If you set the
epsilon-manual-port
variable to make Epsilon help requests use Lugaru's website, instead
of a local help server, it now selects the correct version of the
manual, based on its own version number.
- When a buffer has no newline at the very end, the blank space to
the right of the last character is now painted with the same color and
attribute as subsequent blank lines, instead of the color and
attribute of the last character in the buffer.
Unicode Support
- In regular
expressions, <hspace> and <wspace> now match Unicode's
various space-like characters. As a result, the commands
delete-blank-lines,
delete-horizontal-space,
and others now treat Unicode's various space-like characters as types
of spaces.
- Epsilon's show-spaces
mode (toggled by Shift-F6) was improved to display a variety of
space-like and zero-width Unicode characters more clearly. The hex
display mode in
set-show-graphic
(Ctrl-F6) now displays hex codes for Unicode characters too.
- The message to choose an encoding because a file contains Unicode
characters now shows the names of the characters and uses a clearer
format.
- The new command
unicode-convert-to-ascii
replaces some Unicode and Windows-1252 punctuation characters in the
buffer (or highlighted region) with their nearest ASCII equivalent. It
converts various quote-like characters to ' or ", various hyphen-like
characters to -, and so forth, though it does not try to strip accents
from letters.
- The
clipboard-convert-unicode
variable recognizes a new bit. Setting bit 4 tells Epsilon to convert
Unicode clipboard characters being pasted into an 8-bit buffer only if
they have a corresponding ASCII (range 0-127) equivalent, and this is
now the default. If you prefer the previous behavior, you can set this
variable to 3, which makes Epsilon also convert certain Unicode
characters with no ASCII equivalent to Extended ASCII (128-255,
Windows-1252), and perform the reverse conversion when putting text
back on the clipboard.
- Epsilon's Unicode data (character names, for example) was updated to
Unicode 9.0.
- The show-point command
(Ctrl-x =) when at a Unicode surrogate character now displays the name
of the complete character.
EEL Extension Language
- In EEL code, ints are now 64-bit. (As a consequence, Epsilon can
now edit files bigger than 2 GB, though little work to improve
performance on such large files has been done yet.) The new
int32
type was added to EEL, and the
TYPE_INT32
code is now defined for primitives like
new_variable()
and
vartype().
- The
mouse_cursor
variable is now a simple number instead of a pointer to a special
structure. Existing EEL code of the form "mouse_cursor =
&horiz_arrows;" must be modified by deleting the &.
- We added the EEL primitives
iscntrl(),
isgraph(),
ispunct(),
isprint(), and
isxdigit() to report on various character properties. The
set_character_property() primitive recognizes new codes like
C_PUNCT for customizing these primitives.
- The new
unicode_character_name()
primitive retrieves the name of any Unicode character, given its
number, or vice versa, and can interpret surrogate characters too. EEL
programmers can now use the convenience macros
IS_LEADING_SURROGATE()
and
IS_TRAILING_SURROGATE()
to check if a character is a Unicode surrogate character.
- The new
aside()
primitive writes some text to the #messages# buffer without displaying
it.
- In EEL, numeric
constants starting with zero, like 0123, are no longer interpreted
as octal, for consistency with Alt-x eval. Prefixes such as 0x, 0o,
and 0b (hexadecimal, octal, binary) may still be used to specify the
base of a numeric constant.
- EEL's new
get_substitution_variables() primitive lets Epsilon perform
completion on environment variable names in file names.
- EEL programmers can use these handy new EEL subroutines:
regex_replace_in_string(),
numtoi_with_base(),
url_is_a_directory(),
count_matches_in_buffer().
- Epsilon's encoding of RGB colors now matches HTML's. Any old code
that uses hardwired color numbers instead of macros like
MAKE_RGB()
must be updated. (For example, change a hex value in the format 0xBBGGRR to
MAKE_RGB(0xRR, 0xGG, 0xBB).)
- Since EEL now supports 64-bit numbers, some primitives could be
simplified. The EEL primitives
new_file_read()
and
new_file_write()
no longer accept optional 32-bit lowstart and highstart arguments that
provided limited 64-bit file support, since their start parameter is
now 64 bits. Likewise, the
check_file()
primitive's fsize_high field was removed, since its fsize field can
now hold a full 64-bit size, and its 32-bit raw_file_date_high and
raw_file_date_low fields were combined into one 64-bit raw_file_date.
- EEL code can set some new flags in the
buffer_not_saveable
variable to control different aspects of buffer saving and warning.
- The is_win32 variable is now called
is_mswindows, and it has
new values to distinguish the 32-bit and 64-bit versions of Epsilon.
- The
_display_class
array was expanded so it can remap all the characters Epsilon can
display, not just the first 256.
- Epsilon's
win_help_string()
and
win_help_contents()
primitives can no longer handle .chm and .col files.
- The
toolbar_add_button()
primitive in Epsilon for Windows now recognizes five more standard
icon names, and Alt-x
show-view-bitmaps
displays them.
- EEL code can now use the new
use_alternate_dialog_tag
variable to select a different dialog tag, meaning Epsilon for Windows
will save and restore the size of that dialog separately from others.
Last Updated: 9 November 2020