<!DOCTYPE HTML>
< html lang = "en" class = "sidebar-visible no-js dark" >
< head >
<!-- Book generated using mdBook -->
< meta charset = "UTF-8" >
< title > Introduction - xplr book< / title >
<!-- Custom HTML head -->
< meta content = "text/html; charset=utf-8" http-equiv = "Content-Type" >
< meta name = "description" content = "A hackable, minimal, fast TUI file explorer" >
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
< meta name = "theme-color" content = "#ffffff" / >
< link rel = "shortcut icon" href = "favicon.png" >
< link rel = "stylesheet" href = "css/variables.css" >
< link rel = "stylesheet" href = "css/general.css" >
< link rel = "stylesheet" href = "css/chrome.css" >
< link rel = "stylesheet" href = "css/print.css" media = "print" >
<!-- Fonts -->
< link rel = "stylesheet" href = "FontAwesome/css/font-awesome.css" >
< link rel = "stylesheet" href = "fonts/fonts.css" >
<!-- Highlight.js Stylesheets -->
< link rel = "stylesheet" href = "highlight.css" >
< link rel = "stylesheet" href = "tomorrow-night.css" >
< link rel = "stylesheet" href = "ayu-highlight.css" >
<!-- Custom theme stylesheets -->
<!-- EthicalAds -->
< script async src = "https://media.ethicalads.io/media/client/ethicalads.min.js" > < / script >
< / head >
< body >
<!-- Provide site root to javascript -->
< script type = "text/javascript" >
var path_to_root = "";
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "coal" : "dark";
< / script >
<!-- Work around some values being stored in localStorage wrapped in quotes -->
< script type = "text/javascript" >
try {
var theme = localStorage.getItem('mdbook-theme');
var sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') & & theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
}
if (sidebar.startsWith('"') & & sidebar.endsWith('"')) {
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
}
} catch (e) { }
< / script >
<!-- Set the theme before any content is loaded, prevents flash -->
< script type = "text/javascript" >
var theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
var html = document.querySelector('html');
html.classList.remove('no-js')
html.classList.remove('dark')
html.classList.add(theme);
html.classList.add('js');
< / script >
<!-- Hide / unhide sidebar before it is displayed -->
< script type = "text/javascript" >
var html = document.querySelector('html');
var sidebar = 'hidden';
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
}
html.classList.remove('sidebar-visible');
html.classList.add("sidebar-" + sidebar);
< / script >
< nav id = "sidebar" class = "sidebar" aria-label = "Table of contents" >
< div class = "sidebar-scrollbox" >
<!-- EthicalAds -->
< div
id="docs-sidebar-bottom"
class="dark flat"
data-ea-publisher="xplrdev"
data-ea-type="image"
>< / div >
< ol class = "chapter" > < li class = "chapter-item expanded " > < a href = "introduction.html" > < strong aria-hidden = "true" > 1.< / strong > Introduction< / a > < / li > < li class = "chapter-item expanded " > < a href = "quickstart.html" > < strong aria-hidden = "true" > 2.< / strong > Quickstart< / a > < / li > < li > < ol class = "section" > < li class = "chapter-item expanded " > < a href = "install.html" > < strong aria-hidden = "true" > 2.1.< / strong > Install< / a > < / li > < li class = "chapter-item expanded " > < a href = "post-install.html" > < strong aria-hidden = "true" > 2.2.< / strong > Post Install< / a > < / li > < / ol > < / li > < li class = "chapter-item expanded " > < a href = "configuration.html" > < strong aria-hidden = "true" > 3.< / strong > Configuration< / a > < / li > < li > < ol class = "section" > < li class = "chapter-item expanded " > < a href = "general-config.html" > < strong aria-hidden = "true" > 3.1.< / strong > General< / a > < / li > < li class = "chapter-item expanded " > < a href = "node_types.html" > < strong aria-hidden = "true" > 3.2.< / strong > Node Types< / a > < / li > < li class = "chapter-item expanded " > < a href = "layouts.html" > < strong aria-hidden = "true" > 3.3.< / strong > Layouts< / a > < / li > < li class = "chapter-item expanded " > < a href = "modes.html" > < strong aria-hidden = "true" > 3.4.< / strong > Modes< / a > < / li > < / ol > < / li > < li class = "chapter-item expanded " > < a href = "concept.html" > < strong aria-hidden = "true" > 4.< / strong > Concept< / a > < / li > < li > < ol class = "section" > < li class = "chapter-item expanded " > < a href = "key-bindings.html" > < strong aria-hidden = "true" > 4.1.< / strong > Key Bindings< / a > < / li > < li > < ol class = "section" > < li class = "chapter-item expanded " > < a href = "configure-key-bindings.html" > < strong aria-hidden = "true" > 4.1.1.< / strong > Configure Key Bindings< / a > < / li > < li class = "chapter-item expanded " > < a href = "default-key-bindings.html" > < strong aria-hidden = "true" > 4.1.2.< / strong > Default Key Bindings< / a > < / li > < li class = "chapter-item expanded " > < a href = "debug-key-bindings.html" > < strong aria-hidden = "true" > 4.1.3.< / strong > Debug Key Bindings< / a > < / li > < / ol > < / li > < li class = "chapter-item expanded " > < a href = "node-type.html" > < strong aria-hidden = "true" > 4.2.< / strong > Node Type< / a > < / li > < li class = "chapter-item expanded " > < a href = "layout.html" > < strong aria-hidden = "true" > 4.3.< / strong > Layout< / a > < / li > < li class = "chapter-item expanded " > < a href = "mode.html" > < strong aria-hidden = "true" > 4.4.< / strong > Mode< / a > < / li > < li class = "chapter-item expanded " > < a href = "message.html" > < strong aria-hidden = "true" > 4.5.< / strong > Message< / a > < / li > < li > < ol class = "section" > < li class = "chapter-item expanded " > < a href = "messages.html" > < strong aria-hidden = "true" > 4.5.1.< / strong > Full List of Messages< / a > < / li > < li class = "chapter-item expanded " > < a href = "input-operation.html" > < strong aria-hidden = "true" > 4.5.2.< / strong > Input Operation< / a > < / li > < / ol > < / li > < li class = "chapter-item expanded " > < a href = "borders.html" > < strong aria-hidden = "true" > 4.6.< / strong > Borders< / a > < / li > < li class = "chapter-item expanded " > < a href = "style.html" > < strong aria-hidden = "true" > 4.7.< / strong > Style< / a > < / li > < li class = "chapter-item expanded " > < a href = "sorting.html" > < strong aria-hidden = "true" > 4.8.< / strong > Sorting< / a > < / li > < li class = "chapter-item expanded " > < a href = "filtering.html" > < strong aria-hidden = "true" > 4.9.< / strong > Filtering< / a > < / li > < li class = "chapter-item expanded " > < a href = "column-renderer.html" > < strong aria-hidden = "true" > 4.10.< / strong > Column Renderer< / a > < / li > < li class = "chapter-item expanded " > < a href = "lua-function-calls.html" > < strong aria-hidden = "true" > 4.11.< / strong > Lua Function Calls< / a > < / li > < li class = "chapter-item expanded " > < a href = "environment-variables-and-pipes.html" > < strong aria-hidden = "true" > 4.12.< / strong > Environment Variables and Pipes< / a > < / li > < / ol > < / li > < li class = "chapter-item expanded " > < a href = "awesome-hacks.html" > < strong aria-hidden = "true" > 5.< / strong > Awesome Hacks< / a > < / li > < li class = "chapter-item expanded " > < a href = "plugin.html" > < strong aria-hidden = "true" > 6.< / strong > Plugin< / a > < / li > < li > < ol class = "section" > < li class = "chapter-item expanded " > < a href = "installing-plugins.html" > < strong aria-hidden = "true" > 6.1.< / strong > Installing Plugins< / a > < / li > < li class = "chapter-item expanded " > < a href = "writing-plugins.html" > < strong aria-hidden = "true" > 6.2.< / strong > Writing Plugins< / a > < / li > < li
< / div >
< div id = "sidebar-resize-handle" class = "sidebar-resize-handle" > < / div >
< / nav >
< div id = "page-wrapper" class = "page-wrapper" >
< div class = "page" >
< div id = "menu-bar-hover-placeholder" > < / div >
< div id = "menu-bar" class = "menu-bar sticky bordered" >
< div class = "left-buttons" >
< button id = "sidebar-toggle" class = "icon-button" type = "button" title = "Toggle Table of Contents" aria-label = "Toggle Table of Contents" aria-controls = "sidebar" >
< i class = "fa fa-bars" > < / i >
< / button >
< button id = "theme-toggle" class = "icon-button" type = "button" title = "Change theme" aria-label = "Change theme" aria-haspopup = "true" aria-expanded = "false" aria-controls = "theme-list" >
< i class = "fa fa-paint-brush" > < / i >
< / button >
< ul id = "theme-list" class = "theme-popup" aria-label = "Themes" role = "menu" >
< li role = "none" > < button role = "menuitem" class = "theme" id = "light" > Light< / button > < / li >
< li role = "none" > < button role = "menuitem" class = "theme" id = "rust" > Rust< / button > < / li >
< li role = "none" > < button role = "menuitem" class = "theme" id = "coal" > Coal< / button > < / li >
< li role = "none" > < button role = "menuitem" class = "theme" id = "navy" > Navy< / button > < / li >
< li role = "none" > < button role = "menuitem" class = "theme" id = "ayu" > Ayu< / button > < / li >
< / ul >
< button id = "search-toggle" class = "icon-button" type = "button" title = "Search. (Shortkey: s)" aria-label = "Toggle Searchbar" aria-expanded = "false" aria-keyshortcuts = "S" aria-controls = "searchbar" >
< i class = "fa fa-search" > < / i >
< / button >
< / div >
< h1 class = "menu-title" > xplr book< / h1 >
< div class = "right-buttons" >
< a href = "print.html" title = "Print this book" aria-label = "Print this book" >
< i id = "print-button" class = "fa fa-print" > < / i >
< / a >
< a href = "https://github.com/sayanarijit/xplr" title = "Git repository" aria-label = "Git repository" >
< i id = "git-repository-button" class = "fa fa-github" > < / i >
< / a >
< a href = "https://github.com/sayanarijit/xplr/edit/main/docs/en/src/introduction.md" title = "Suggest an edit" aria-label = "Suggest an edit" >
< i id = "git-edit-button" class = "fa fa-edit" > < / i >
< / a >
< / div >
< / div >
< div id = "search-wrapper" class = "hidden" >
< form id = "searchbar-outer" class = "searchbar-outer" >
< input type = "search" id = "searchbar" name = "searchbar" placeholder = "Search this book ..." aria-controls = "searchresults-outer" aria-describedby = "searchresults-header" >
< / form >
< div id = "searchresults-outer" class = "searchresults-outer hidden" >
< div id = "searchresults-header" class = "searchresults-header" > < / div >
< ul id = "searchresults" >
< / ul >
< / div >
< / div >
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
< script type = "text/javascript" >
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
});
< / script >
< div id = "content" class = "content" >
< main >
< h1 id = "introduction" > < a class = "header" href = "#introduction" > Introduction< / a > < / h1 >
< p > xplr is a terminal UI based file explorer that aims to increase our terminal
productivity by being a flexible, interactive orchestrator for the ever growing
awesome command-line utilities that work with the file-system.< / p >
< p > To achieve its goal, xplr strives to be a fast, minimal and more importantly,
hackable file explorer.< / p >
< p > xplr is not meant to be a replacement for the standard shell commands or the
GUI file managers. Rather, it aims to < a href = "awesome-plugins.html#integration" > integrate them all< / a > and expose an
intuitive, scriptable, < a href = "configure-key-bindings.html" > keyboard controlled< / a > ,
< a href = "layouts.html" > real-time visual interface< / a > , also being an ideal candidate for < a href = "awesome-integrations.html" > further
integration< / a > , enabling you to achieve insane terminal productivity.< / p >
< h2 id = "concept" > < a class = "header" href = "#concept" > Concept< / a > < / h2 >
< h3 id = "hackable" > < a class = "header" href = "#hackable" > Hackable< / a > < / h3 >
< p > xplr is built with configurability in mind. So it allows you to perform a vast
set of operations and make it look and behave just the way you want.< / p >
< p > A few things you can do with the xplr configuration< / p >
< ul >
< li > < a href = "awesome-hacks.html" > Hacks< / a > < / li >
< li > < a href = "awesome-plugins.html" > Plugins< / a > < / li >
< li > < a href = "awesome-integrations.html" > Integrations< / a > < / li >
< / ul >
< h3 id = "fast" > < a class = "header" href = "#fast" > Fast< / a > < / h3 >
< p > Although speed is not the primary concern, xplr is already fast enough so that
you can take it out for a walk into your < code > node_modules< / code > or < code > /nix/store< / code > any
time you want, and it will only get faster. Still, if you feel like it's
somehow making you slow, just report it. Most probably we're just waiting for
someone to complain.< / p >
< p > < strong > Tip:< / strong > A quick and easy way to optimize the UI rendering is reducing the
number of columns in the table.< / p >
< h3 id = "minimal" > < a class = "header" href = "#minimal" > Minimal< / a > < / h3 >
< p > xplr is being referred to as a < em > File Explorer< / em > , not a < em > File Manager< / em > . This
is because at the core, xplr is only an explorer, and < a href = "https://github.com/sayanarijit/xplr/blob/main/src/init.lua" > outsources< / a > the file
management operations to external commands. This helps xplr stay minimal, and
focus only on doing what it does best.< / p >
< p > So, just like speed, minimalism isn't as as aggressively pursued as
hackability. xplr simply prefers to stay minimal and looks for the opportunity
to lose some kb if it makes sense.< / p >
< h2 id = "features" > < a class = "header" href = "#features" > Features< / a > < / h2 >
< p > Some of the coolest features xplr provide beside the basic stuff:< / p >
< ul >
< li > < a href = "https://github.com/sayanarijit/xplr/discussions/183" > Embedded LuaJIT< / a > for portability and extensibility.< / li >
< li > < a href = "message.html" > A simple system based on message passing< / a > to control xplr session using:
< ul >
< li > < a href = "configure-key-bindings.html" > Keyboard inputs< / a > < / li >
< li > < a href = "mode.html#input-pipe" > Shell Commands< / a > < / li >
< li > < a href = "lua-function-calls.html" > Lua Functions< / a > < / li >
< / ul >
< / li >
< li > < a href = "https://github.com/sayanarijit/xplr/pull/397" > Readline-like input buffer< / a > with customizable behaviour to read user
inputs.< / li >
< li > < a href = "general-config.html#enable_recover_mode" > Switchable recover mode< / a > that saves you from doing unwanted things when in a
hurry.< / li >
< li > < a href = "layouts.html" > Customizable layouts< / a > with built-in panels. For e.g.
< ul >
< li > < strong > Selection list< / strong > to show you the selected paths in real-time.< / li >
< li > < strong > Help menu< / strong > to show you the available keys bindings in each mode.< / li >
< li > < strong > Input & logs< / strong > to read input and display logs.< / li >
< li > < strong > Filter and sort pipeline< / strong > to show you the applied filters and sorters.< / li >
< / ul >
< / li >
< li > < a href = "node_types.html" > Custom file properties< / a > with custom colors can be displayed in the table.< / li >
< li > < a href = "message.html#startfifo" > FIFO manager< / a > to manage a FIFO file that can be used to
< a href = "https://github.com/sayanarijit/xplr/pull/229" > integrate with previewers< / a > .< / li >
< li > < strong > Different quit options:< / strong >
< ul >
< li > Quit with success without any output (< code > q< / code > ).< / li >
< li > Quit with success and the result printed on stdout (< code > enter< / code > ).< / li >
< li > Quit with success and the present working directory printed on stdout
(< code > :< / code > < code > q< / code > < code > p< / code > ).< / li >
< li > Quit with success and the path under focus printed on stdout
(< code > :< / code > < code > q< / code > < code > f< / code > ).< / li >
< li > Quit with success and the selection printed on stdout
(< code > :< / code > < code > q< / code > < code > s< / code > ).< / li >
< li > Quit with failure (< code > ctrl-c< / code > ).< / li >
< / ul >
< / li >
< / ul >
< p > < strong > Q.< / strong > What features should be added here? < a href = "community.html" > let us know< / a > .< / p >
< / main >
< nav class = "nav-wrapper" aria-label = "Page navigation" >
<!-- Mobile navigation buttons -->
< a rel = "next" href = "quickstart.html" class = "mobile-nav-chapters next" title = "Next chapter" aria-label = "Next chapter" aria-keyshortcuts = "Right" >
< i class = "fa fa-angle-right" > < / i >
< / a >
< div style = "clear: both" > < / div >
< / nav >
< / div >
< / div >
< nav class = "nav-wide-wrapper" aria-label = "Page navigation" >
< a rel = "next" href = "quickstart.html" class = "nav-chapters next" title = "Next chapter" aria-label = "Next chapter" aria-keyshortcuts = "Right" >
< i class = "fa fa-angle-right" > < / i >
< / a >
< / nav >
< / div >
< script type = "text/javascript" >
window.playground_copyable = true;
< / script >
< script src = "elasticlunr.min.js" type = "text/javascript" charset = "utf-8" > < / script >
< script src = "mark.min.js" type = "text/javascript" charset = "utf-8" > < / script >
< script src = "searcher.js" type = "text/javascript" charset = "utf-8" > < / script >
< script src = "clipboard.min.js" type = "text/javascript" charset = "utf-8" > < / script >
< script src = "highlight.js" type = "text/javascript" charset = "utf-8" > < / script >
< script src = "book.js" type = "text/javascript" charset = "utf-8" > < / script >
<!-- Custom JS scripts -->
< / body >
< / html >