A general-purpose lister plugin for Total Commander (32/64-bit, Windows) and Double Commander (64-bit, Linux). It renders documents inside the file panel using a real web engine instead of a plain-text view, with syntax highlighting (highlight.js), math formulas (MathJax for Markdown, KaTeX for reStructuredText), diagrams (Mermaid), dark mode, zoom, text search and printing.
Rendering backends:
- Windows: WebView2 (Chromium)
- Linux: Qt 6 WebEngine
The plugin is tested under Windows 10/11 (WebView2 runtime required) and Linux distributions that ship Qt 6.4+ with QtWebEngine (Ubuntu 24.04+, Debian 12+, Fedora 40+, Arch). CHM files can be opened with Multidoc Viewer.
| Format | Rendered with |
|---|---|
Markdown (.md, .markdown) |
marked.js, highlight.js, MathJax, Mermaid, detect-charset |
| AsciiDoc | Asciidoctor.js |
reStructuredText (.rst) |
rst-compiler, highlight.js, KaTeX |
HTML / XHTML / XML (.html, .htm, .xhtml, .xml) |
rendered natively by the web engine |
| MHT / MHTML | mhtml2html |
| EML email files | postal-mime |
| Images | built-in <img> rendering with the thumbnail viewer (zoom, pan, fullscreen) |
| Directories | thumbnail listing; real shell thumbnails on Windows (GenDirThumbs), static icons elsewhere |
.url internet shortcuts |
navigates to the target page |
| Everything else (incl. PDF) | loaded directly by the web engine (Chromium's built-in PDF viewer handles PDF) |
Configuration files are processed with mINI.
Windows: Binary plugin archives come with the setup script. Just enter the archive, and confirm installation.
Linux: unpack the release archive into ~/.local/share/doublecmd/plugins/edgeviewer/, then register it in Double Commander (Configuration → Options → Plugins → Lister plugins → Add).
Plugin configuration is stored in the edgeviewer.ini file, located in the plugin folder. The shipped template (edgeviewer.ini.sample) documents every available key.
The plugin reads its configuration from the first of these that yields a usable configuration (a file that parses into at least one section):
edgeviewer.ini— your own file, never modified or overwritten by a plugin update.edgeviewer.ini.sample— the shipped template, used when there is noedgeviewer.ini(or when it is empty).
Sources are not merged: your own file replaces the template wholesale.
So the plugin also works when the plugin folder is read-only and the file cannot be created. On a writable folder, edgeviewer.ini is created from the template on the first run; to customize the settings, edit that file (or copy the template over it yourself).
Highlights:
- Per-format styling: each
[<Format>]section acceptsCSSandCSSDarkstylesheet overrides picked from the bundled stylesheets. [WebView] Switches: extra command-line flags for the web engine (e.g.--disable-gpu).[WebView] BrowserExecutableX86Folder/BrowserExecutableX64Folder: use a specific WebView2 Runtime instead of the installed one.[WebView] CleanupOnExit: remove the browser cache directory and temp files when the plugin unloads (Windows).[WebView] KeepZoom: remember the zoom factor per format across files.[WebView] OfflineMode: every request that does not resolve to plugin-local content (e.g., remote images and styles) is blocked before any network access.[Extensions] ForcedHtmlExt: extensions whose content should be treated as HTML even when their extension says otherwise (e.g.,xml,xhtml).[QuickView] PassTabToTC: in quick view (Ctrl+Q),Tabis forwarded to Total Commander for panel switching instead of cycling page links. The standalone F3 lister always keeps in-pageTabnavigation.
| Key | Action |
|---|---|
Ctrl+ / Ctrl- / 0 / Ctrl+Wheel |
Zoom in / out / reset through fixed steps |
F |
Toggle fullscreen in the Image viewer |
Ctrl+H / Ctrl+G / F and Shift+F |
Show/hide names, show/hide folders, fit thumbnail to screen in Directory viewer |
Codepage of legacy HTML is autodetected with jschardet. It is always possible to right-click inside an HTML or MHT view and choose another code page from the Encoding submenu. Set [HTML] ForceDetectEncoding=1 to also correct HTML files that declare a wrong charset (overrides Chromium detection functionality).
Dark mode is set at load time, so an already-open document keeps its current style until you open another file. On Linux, dark mode follows the system color scheme (Double Commander does not yet forward TC's dark-mode flag). For plain HTML pages, plugin-side dark styling is opt-in via [HTML] CSSDark=style-dark.css (use none.css to switch off custom styling).
Opening a file with Ctrl+Q (quick view embedded in the panel) as the first lister open of a session places the rendered content in a separate window near the screen center and Double Commander's main window jumps to match. This can be prevented by switching to software rendering:
QT_QUICK_BACKEND=software doublecmdWhen a single image is opened via F3 (ImgProcessor), Double Commander intercepts the F and Shift+F keys before they reach the embedded QWebEngineView. The fullscreen toggle in our JavaScript handler never fires. There are possibly other similar hotkey-intercepting issues on Linux.
MS Visual Studio 2022 (with the "Desktop development with C++" workload) and vcpkg with MSBuild integration are required. Run BuildMakeSetup.bat from the MSVS 2022 Developer Command Prompt to build the project.
The Linux backend requires a C++23-capable compiler, CMake ≥ 3.16, pkg-config, zip, ca-certificates, and the Qt 6 development packages: qt6-base-dev, qt6-5compat-dev, qt6-webengine-dev (Debian/Ubuntu) or qt6-qtbase-devel, qt6-qt5compat-devel, qt6-qtwebengine-devel (Fedora/Arch). qt6-5compat-dev provides Qt6::Core5Compat (used for QTextCodec charset decode); ca-certificates supplies the TLS CA bundle for the mINI header fetch at CMake configure time, which is needed in minimal chroot/container environments.
Run ./BuildMakeSetup.sh to build the project.
The solution includes a Catch2-backed test projectEdgeViewer.Tests. Build and run from the Developer Command Prompt:
msbuild EdgeViewer.sln /p:Configuration=Release /p:Platform=x64
winbuild\EdgeViewer.Tests_x64_Release\EdgeViewer.Tests.exe
See EdgeViewer.Tests/readme.md for the full tier model and coverage details. The autotests cover the pure/config/script layer; rendering and interactive behaviour are verified by hand against openspec/notes/manual-testing-checklist.md.
Developer-facing design records live under openspec/.
openspec/specs/: capability specifications (the behavioral contract of the plugin).openspec/notes/rendering-pipeline.md: how loaders receive file content (pre-fetch/base64) and the Linuxev://scheme rewrite.openspec/notes/future-work.md: deliberately deferred features with re-introduction criteria.