diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..8d64c6b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+emacs/.config/**
+!emacs/.config/emacs/Emacs.org
+!emacs/.config/emacs/early-init.el
+!emacs/.config/emacs/init.el
+pianobar/.config/pianobar/album.jpg
+pianobar/.config/pianobar/info
+pianobar/.config/pianobar/state
+nvim/.config/nvim/lazy-lock.json
+tmux/.config/tmux/plugins
+vifm/.config/vifm/vifminfo.json
diff --git a/.stow-local-ignore b/.stow-local-ignore
new file mode 100644
index 0000000..5f70014
--- /dev/null
+++ b/.stow-local-ignore
@@ -0,0 +1,5 @@
+\.git
+LICENSE
+README.md
+\.gitmodules
+keyd
diff --git a/README.md b/README.md
index d23d95a..9f53156 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,54 @@
-# dotfiles
+# Dotfiles
+My personal dotfiles for Sway/River on Arch Linux. They are designed to be used
+with [[https://www.gnu.org/software/stow/][gnu stow]]. Each directory is a kind
+of 'module' that can be individually symlinked.
+
+You are welcome to do whatever you would like with these configs (they are
+licensed under the 0 clause BSD license); be inspired by them, copy them,
+whatever, no attribution necessary. I would encourage you to fork this repo,
+then use `stow` to install whatever modules you would like, changing whatever
+you want as you go. For example, if you want to steal my neovim configuration,
+you could run `stow nvim`, assuming this repo is located in your home
+directory.
+
+# Some Software I run
+
+## Shell
+I use [[https://fishshell.com/][fish]] together with
+[[https://starship.rs][starship]]. It's basic, but gets the job done.
+
+## Editors
+
+### Neovim
+I love [[https://neovim.io][neovim]]. I have two different neovim
+configurations, (`nvim` and `nvim-vimscript`). `nvim` is a ~500 LOC lua
+monstrosity that works wonderfully but is a bit of a pain to maintain. If you
+are new to neovim, I would recommend borrowing more from `nvim-vimscript` which
+is a ~100 LOC vimscript config that is much simpler and does 95% of what the
+other config does.
+
+### Emacs
+I love [[https://www.gnu.org/software/emacs/][emacs]] as well. My configuration
+is a literate `org` file that gets tangled into `init.el`. As far as Emacs
+configurations go, it's pretty clean, but still is a several hundred line mess.
+
+## Compositors
+I'm on Wayland now, and use either [[https://swaywm.org/][sway]] or
+[[https://codeberg.org/river/river][river]] depending on how I'm feeling, and
+have configurations for both. I generally use
+[[https://github.com/Alexays/Waybar][waybar]] for sway and
+[[https://codeberg.org/dnkl/yambar][yambar]] for river for no particular
+reason. All the other configs (swaylock, fuzzel, etc.) are compositor agnostic.
+Note, in both my sway and river configs I swap meta and left-alt. That's just a
+habit from starting on [[https://dwm.suckless.org/][dwm]], whose default mod
+key is alt. You may want to change that.
+
+## Keyd
+Since I use vim and emacs, I like to map caps lock to act as control when held
+and escape when tapped. I use a simple [[https://github.com/rvaiya/keyd][keyd]]
+config for this. However, note that `keyd/default.conf` should be copied to
+`/etc/keyd/` and the `keyd` service should be enabled and started. If `keyd`
+isn't in your distro's repos, it is very easy to build and install from source.
+Otherwise, [[https://gitlab.com/interception/linux/plugins/caps2esc][caps2esc]]
+probably is and is likewise pretty simple to get set up.
diff --git a/bat/.config/bat/themes/Catppuccin-frappe.tmTheme b/bat/.config/bat/themes/Catppuccin-frappe.tmTheme
new file mode 100644
index 0000000..f4eb222
--- /dev/null
+++ b/bat/.config/bat/themes/Catppuccin-frappe.tmTheme
@@ -0,0 +1,959 @@
+
+
+
+
+ name
+ Catppuccin
+ settings
+
+
+ settings
+
+ foreground
+ #c6d0f5
+ background
+ #303446
+ caret
+ #b5bfe2
+ invisibles
+ #a5adce
+ gutterForeground
+ #949cbb
+ gutterForegroundHighlight
+ #a6d189
+ lineHighlight
+ #626880
+ selection
+ #737994
+ selectionBorder
+ #303446
+ activeGuide
+ #ef9f76
+ findHighlightForeground
+ #292c3c
+ findHighlight
+ #e5c890
+ bracketsForeground
+ #949cbb
+ bracketContentsForeground
+ #949cbb
+
+
+
+ name
+ Comment
+ scope
+ comment
+ settings
+
+ foreground
+ #737994
+ fontStyle
+ italic
+
+
+
+ name
+ String
+ scope
+ string
+ settings
+
+ foreground
+ #a6d189
+ fontStyle
+
+
+
+
+ name
+ String regex
+ scope
+ string.regexp
+ settings
+
+ foreground
+ #ef9f76
+ fontStyle
+
+
+
+
+ name
+ Number
+ scope
+ constant.numeric
+ settings
+
+ foreground
+ #ef9f76
+ fontStyle
+
+
+
+
+ name
+ Boolean
+ scope
+ constant.language.boolean
+ settings
+
+ foreground
+ #ef9f76
+ fontStyle
+ bold italic
+
+
+
+ name
+ Built-in constant
+ scope
+ constant.language
+ settings
+
+ foreground
+ #babbf1
+ fontStyle
+ italic
+
+
+
+ name
+ Built-in function
+ scope
+ support.function.builtin
+ settings
+
+ foreground
+ #ef9f76
+ fontStyle
+ italic
+
+
+
+ name
+ User-defined constant
+ scope
+ variable.other.constant
+ settings
+
+ foreground
+ #ef9f76
+ fontStyle
+
+
+
+
+ name
+ Variable
+ scope
+ variable
+ settings
+
+
+
+ name
+ Keyword
+ scope
+ keyword
+ settings
+
+ foreground
+ #e78284
+ fontStyle
+ italic
+
+
+
+ name
+ Conditional/loop
+ scope
+ keyword.control.loop, keyword.control.conditional, keyword.control.c++
+ settings
+
+ foreground
+ #ca9ee6
+ fontStyle
+ bold
+
+
+
+ name
+ Return
+ scope
+ keyword.control.return, keyword.control.flow.return
+ settings
+
+ foreground
+ #f4b8e4
+ fontStyle
+ bold
+
+
+
+ name
+ Exception
+ scope
+ support.type.exception
+ settings
+
+ foreground
+ #ef9f76
+ fontStyle
+ italic
+
+
+
+ name
+ Operator
+ scope
+ keyword.operator, punctuation.accessor
+ settings
+
+ foreground
+ #99d1db
+ fontStyle
+ bold
+
+
+
+ name
+ Punctuation separator
+ scope
+ punctuation.separator
+ settings
+
+ foreground
+ #81c8be
+ fontStyle
+
+
+
+
+ name
+ Punctuation terminator
+ scope
+ punctuation.terminator
+ settings
+
+ foreground
+ #81c8be
+ fontStyle
+
+
+
+
+ name
+ Punctuation bracket
+ scope
+ punctuation.section
+ settings
+
+ foreground
+ #949cbb
+ fontStyle
+
+
+
+
+ name
+ Include
+ scope
+ keyword.control.import.include
+ settings
+
+ foreground
+ #81c8be
+ fontStyle
+ italic
+
+
+
+ name
+ Storage
+ scope
+ storage
+ settings
+
+ foreground
+ #e78284
+ fontStyle
+
+
+
+
+ name
+ Storage type
+ scope
+ storage.type
+ settings
+
+ foreground
+ #e5c890
+ fontStyle
+ italic
+
+
+
+ name
+ Storage modifier
+ scope
+ storage.modifier
+ settings
+
+ foreground
+ #e78284
+ fontStyle
+
+
+
+
+ name
+ Storage type namespace
+ scope
+ entity.name.namespace, meta.path
+ settings
+
+ foreground
+ #f2d5cf
+ fontStyle
+ italic
+
+
+
+ name
+ Storage type class
+ scope
+ storage.type.class
+ settings
+
+ foreground
+ #f2d5cf
+ fontStyle
+ italic
+
+
+
+ name
+ Label
+ scope
+ entity.name.label
+ settings
+
+ foreground
+ #8caaee
+ fontStyle
+
+
+
+
+ name
+ Keyword class
+ scope
+ keyword.declaration.class
+ settings
+
+ foreground
+ #e78284
+ fontStyle
+ italic
+
+
+
+ name
+ Class name
+ scope
+ entity.name.class, meta.toc-list.full-identifier
+ settings
+
+ foreground
+ #99d1db
+ fontStyle
+
+
+
+
+ name
+ Inherited class
+ scope
+ entity.other.inherited-class
+ settings
+
+ foreground
+ #99d1db
+ fontStyle
+ italic
+
+
+
+ name
+ Function name
+ scope
+ entity.name.function, variable.function
+ settings
+
+ foreground
+ #8caaee
+ fontStyle
+ italic
+
+
+
+ name
+ Function macro
+ scope
+ entity.name.function.preprocessor
+ settings
+
+ foreground
+ #e78284
+ fontStyle
+
+
+
+
+ name
+ Macro directive - ifdef
+ scope
+ keyword.control.import
+ settings
+
+ foreground
+ #e78284
+ fontStyle
+
+
+
+
+ name
+ Constructor
+ scope
+ entity.name.function.constructor, entity.name.function.destructor
+ settings
+
+ foreground
+ #babbf1
+ fontStyle
+
+
+
+
+ name
+ Function argument
+ scope
+ variable.parameter.function
+ settings
+
+ foreground
+ #f2d5cf
+ fontStyle
+ italic
+
+
+
+ name
+ Function declaration
+ scope
+ keyword.declaration.function
+ settings
+
+ foreground
+ #ea999c
+ fontStyle
+ italic
+
+
+
+ name
+ Library function
+ scope
+ support.function
+ settings
+
+ foreground
+ #99d1db
+ fontStyle
+
+
+
+
+ name
+ Library constant
+ scope
+ support.constant
+ settings
+
+ foreground
+ #8caaee
+ fontStyle
+
+
+
+
+ name
+ Library class/type
+ scope
+ support.type, support.class
+ settings
+
+ foreground
+ #8caaee
+ fontStyle
+ italic
+
+
+
+ name
+ Library variable
+ scope
+ support.other.variable
+ settings
+
+ fontStyle
+
+
+
+
+ name
+ Variable function
+ scope
+ variable.function
+ settings
+
+ foreground
+ #8caaee
+ fontStyle
+ italic
+
+
+
+ name
+ Variable parameter
+ scope
+ variable.parameter
+ settings
+
+ foreground
+ #f2d5cf
+ fontStyle
+ italic
+
+
+
+ name
+ Variable other
+ scope
+ variable.other
+ settings
+
+ foreground
+ #c6d0f5
+ fontStyle
+ italic
+
+
+
+ name
+ Variable field
+ scope
+ variable.other.member
+ settings
+
+ foreground
+ #f2d5cf
+ fontStyle
+
+
+
+
+ name
+ Variable language
+ scope
+ variable.language
+ settings
+
+ foreground
+ #81c8be
+ fontStyle
+
+
+
+
+ name
+ Tag name
+ scope
+ entity.name.tag
+ settings
+
+ foreground
+ #ef9f76
+ fontStyle
+
+
+
+
+ name
+ Tag attribute
+ scope
+ entity.other.attribute-name
+ settings
+
+ foreground
+ #ca9ee6
+ fontStyle
+ italic
+
+
+
+ name
+ Tag delimiter
+ scope
+ punctuation.definition.tag
+ settings
+
+ foreground
+ #ea999c
+ fontStyle
+
+
+
+
+ name
+ Markdown URL
+ scope
+ markup.underline.link.markdown
+ settings
+
+ foreground
+ #f2d5cf
+ fontStyle
+ italic underline
+
+
+
+ name
+ Markdown reference
+ scope
+ meta.link.inline.description
+ settings
+
+ foreground
+ #babbf1
+ fontStyle
+ bold
+
+
+
+ name
+ Markdown literal
+ scope
+ comment.block.markdown, meta.code-fence, markup.raw.code-fence, markup.raw.inline
+ settings
+
+ foreground
+ #81c8be
+ fontStyle
+ italic
+
+
+
+ name
+ Markdown title
+ scope
+ punctuation.definition.heading, entity.name.section
+ settings
+
+ foreground
+ #8caaee
+ fontStyle
+ bold
+
+
+
+ name
+ Markdown emphasis
+ scope
+ markup.italic
+ settings
+
+ foreground
+ #ea999c
+ fontStyle
+ italic
+
+
+
+ name
+ Markdown strong
+ scope
+ markup.bold
+ settings
+
+ foreground
+ #ea999c
+ fontStyle
+ bold
+
+
+
+ name
+ Escape
+ scope
+ constant.character.escape
+ settings
+
+ foreground
+ #f4b8e4
+ fontStyle
+
+
+
+
+ name
+ Bash built-in function
+ scope
+ source.shell.bash meta.function.shell meta.compound.shell meta.function-call.identifier.shell
+ settings
+
+ foreground
+ #f4b8e4
+ fontStyle
+
+
+
+
+ name
+ Bash parameter
+ scope
+ variable.language.shell
+ settings
+
+ foreground
+ #e78284
+ fontStyle
+ italic
+
+
+
+ name
+ Lua field
+ scope
+ source.lua meta.function.lua meta.block.lua meta.mapping.value.lua meta.mapping.key.lua string.unquoted.key.lua
+ settings
+
+ foreground
+ #babbf1
+ fontStyle
+ italic
+
+
+
+ name
+ Lua constructor
+ scope
+ source.lua meta.function.lua meta.block.lua meta.mapping.key.lua string.unquoted.key.lua
+ settings
+
+ foreground
+ #eebebe
+ fontStyle
+
+
+
+
+ name
+ Java constant
+ scope
+ entity.name.constant.java
+ settings
+
+ foreground
+ #81c8be
+ fontStyle
+
+
+
+
+ name
+ CSS property
+ scope
+ support.type.property-name.css
+ settings
+
+ foreground
+ #eebebe
+ fontStyle
+ italic
+
+
+
+ name
+ CSS constant
+ scope
+ support.constant.property-value.css
+ settings
+
+ foreground
+ #c6d0f5
+ fontStyle
+
+
+
+
+ name
+ CSS suffix
+ scope
+ constant.numeric.suffix.css, keyword.other.unit.css
+ settings
+
+ foreground
+ #81c8be
+ fontStyle
+ italic
+
+
+
+ name
+ CSS variable property
+ scope
+ variable.other.custom-property.name.css, support.type.custom-property.name.css, punctuation.definition.custom-property.css
+ settings
+
+ foreground
+ #81c8be
+ fontStyle
+
+
+
+
+ name
+ SCSS tag
+ scope
+ entity.name.tag.css
+ settings
+
+ foreground
+ #babbf1
+ fontStyle
+
+
+
+
+ name
+ SASS variable
+ scope
+ variable.other.sass
+ settings
+
+ foreground
+ #81c8be
+ fontStyle
+
+
+
+
+ name
+ Invalid
+ scope
+ invalid
+ settings
+
+ foreground
+ #c6d0f5
+ background
+ #e78284
+ fontStyle
+
+
+
+
+ name
+ Invalid deprecated
+ scope
+ invalid.deprecated
+ settings
+
+ foreground
+ #c6d0f5
+ background
+ #ca9ee6
+ fontStyle
+
+
+
+
+ name
+ Diff header
+ scope
+ meta.diff, meta.diff.header
+ settings
+
+ foreground
+ #737994
+ fontStyle
+
+
+
+
+ name
+ Diff deleted
+ scope
+ markup.deleted
+ settings
+
+ foreground
+ #e78284
+ fontStyle
+
+
+
+
+ name
+ Diff inserted
+ scope
+ markup.inserted
+ settings
+
+ foreground
+ #a6d189
+ fontStyle
+
+
+
+
+ name
+ Diff changed
+ scope
+ markup.changed
+ settings
+
+ foreground
+ #e5c890
+ fontStyle
+
+
+
+
+ name
+ Message error
+ scope
+ message.error
+ settings
+
+ foreground
+ #e78284
+ fontStyle
+
+
+
+
+ uuid
+ 4d0379b5-ef82-467b-b8b8-365889420646
+ colorSpaceName
+ sRGB
+ semanticClass
+ theme.dark.Catppuccin
+ author
+ BrunDerSchwarzmagier
+
+
diff --git a/bat/.config/bat/themes/Catppuccin-latte.tmTheme b/bat/.config/bat/themes/Catppuccin-latte.tmTheme
new file mode 100644
index 0000000..6f23c16
--- /dev/null
+++ b/bat/.config/bat/themes/Catppuccin-latte.tmTheme
@@ -0,0 +1,959 @@
+
+
+
+
+ name
+ Catppuccin
+ settings
+
+
+ settings
+
+ foreground
+ #4c4f69
+ background
+ #eff1f5
+ caret
+ #5c5f77
+ invisibles
+ #6c6f85
+ gutterForeground
+ #7c7f93
+ gutterForegroundHighlight
+ #40a02b
+ lineHighlight
+ #acb0be
+ selection
+ #9ca0b0
+ selectionBorder
+ #eff1f5
+ activeGuide
+ #fe640b
+ findHighlightForeground
+ #e6e9ef
+ findHighlight
+ #df8e1d
+ bracketsForeground
+ #7c7f93
+ bracketContentsForeground
+ #7c7f93
+
+
+
+ name
+ Comment
+ scope
+ comment
+ settings
+
+ foreground
+ #9ca0b0
+ fontStyle
+ italic
+
+
+
+ name
+ String
+ scope
+ string
+ settings
+
+ foreground
+ #40a02b
+ fontStyle
+
+
+
+
+ name
+ String regex
+ scope
+ string.regexp
+ settings
+
+ foreground
+ #fe640b
+ fontStyle
+
+
+
+
+ name
+ Number
+ scope
+ constant.numeric
+ settings
+
+ foreground
+ #fe640b
+ fontStyle
+
+
+
+
+ name
+ Boolean
+ scope
+ constant.language.boolean
+ settings
+
+ foreground
+ #fe640b
+ fontStyle
+ bold italic
+
+
+
+ name
+ Built-in constant
+ scope
+ constant.language
+ settings
+
+ foreground
+ #7287fd
+ fontStyle
+ italic
+
+
+
+ name
+ Built-in function
+ scope
+ support.function.builtin
+ settings
+
+ foreground
+ #fe640b
+ fontStyle
+ italic
+
+
+
+ name
+ User-defined constant
+ scope
+ variable.other.constant
+ settings
+
+ foreground
+ #fe640b
+ fontStyle
+
+
+
+
+ name
+ Variable
+ scope
+ variable
+ settings
+
+
+
+ name
+ Keyword
+ scope
+ keyword
+ settings
+
+ foreground
+ #d20f39
+ fontStyle
+ italic
+
+
+
+ name
+ Conditional/loop
+ scope
+ keyword.control.loop, keyword.control.conditional, keyword.control.c++
+ settings
+
+ foreground
+ #8839ef
+ fontStyle
+ bold
+
+
+
+ name
+ Return
+ scope
+ keyword.control.return, keyword.control.flow.return
+ settings
+
+ foreground
+ #ea76cb
+ fontStyle
+ bold
+
+
+
+ name
+ Exception
+ scope
+ support.type.exception
+ settings
+
+ foreground
+ #fe640b
+ fontStyle
+ italic
+
+
+
+ name
+ Operator
+ scope
+ keyword.operator, punctuation.accessor
+ settings
+
+ foreground
+ #04a5e5
+ fontStyle
+ bold
+
+
+
+ name
+ Punctuation separator
+ scope
+ punctuation.separator
+ settings
+
+ foreground
+ #179299
+ fontStyle
+
+
+
+
+ name
+ Punctuation terminator
+ scope
+ punctuation.terminator
+ settings
+
+ foreground
+ #179299
+ fontStyle
+
+
+
+
+ name
+ Punctuation bracket
+ scope
+ punctuation.section
+ settings
+
+ foreground
+ #7c7f93
+ fontStyle
+
+
+
+
+ name
+ Include
+ scope
+ keyword.control.import.include
+ settings
+
+ foreground
+ #179299
+ fontStyle
+ italic
+
+
+
+ name
+ Storage
+ scope
+ storage
+ settings
+
+ foreground
+ #d20f39
+ fontStyle
+
+
+
+
+ name
+ Storage type
+ scope
+ storage.type
+ settings
+
+ foreground
+ #df8e1d
+ fontStyle
+ italic
+
+
+
+ name
+ Storage modifier
+ scope
+ storage.modifier
+ settings
+
+ foreground
+ #d20f39
+ fontStyle
+
+
+
+
+ name
+ Storage type namespace
+ scope
+ entity.name.namespace, meta.path
+ settings
+
+ foreground
+ #dc8a78
+ fontStyle
+ italic
+
+
+
+ name
+ Storage type class
+ scope
+ storage.type.class
+ settings
+
+ foreground
+ #dc8a78
+ fontStyle
+ italic
+
+
+
+ name
+ Label
+ scope
+ entity.name.label
+ settings
+
+ foreground
+ #1e66f5
+ fontStyle
+
+
+
+
+ name
+ Keyword class
+ scope
+ keyword.declaration.class
+ settings
+
+ foreground
+ #d20f39
+ fontStyle
+ italic
+
+
+
+ name
+ Class name
+ scope
+ entity.name.class, meta.toc-list.full-identifier
+ settings
+
+ foreground
+ #04a5e5
+ fontStyle
+
+
+
+
+ name
+ Inherited class
+ scope
+ entity.other.inherited-class
+ settings
+
+ foreground
+ #04a5e5
+ fontStyle
+ italic
+
+
+
+ name
+ Function name
+ scope
+ entity.name.function, variable.function
+ settings
+
+ foreground
+ #1e66f5
+ fontStyle
+ italic
+
+
+
+ name
+ Function macro
+ scope
+ entity.name.function.preprocessor
+ settings
+
+ foreground
+ #d20f39
+ fontStyle
+
+
+
+
+ name
+ Macro directive - ifdef
+ scope
+ keyword.control.import
+ settings
+
+ foreground
+ #d20f39
+ fontStyle
+
+
+
+
+ name
+ Constructor
+ scope
+ entity.name.function.constructor, entity.name.function.destructor
+ settings
+
+ foreground
+ #7287fd
+ fontStyle
+
+
+
+
+ name
+ Function argument
+ scope
+ variable.parameter.function
+ settings
+
+ foreground
+ #dc8a78
+ fontStyle
+ italic
+
+
+
+ name
+ Function declaration
+ scope
+ keyword.declaration.function
+ settings
+
+ foreground
+ #e64553
+ fontStyle
+ italic
+
+
+
+ name
+ Library function
+ scope
+ support.function
+ settings
+
+ foreground
+ #04a5e5
+ fontStyle
+
+
+
+
+ name
+ Library constant
+ scope
+ support.constant
+ settings
+
+ foreground
+ #1e66f5
+ fontStyle
+
+
+
+
+ name
+ Library class/type
+ scope
+ support.type, support.class
+ settings
+
+ foreground
+ #1e66f5
+ fontStyle
+ italic
+
+
+
+ name
+ Library variable
+ scope
+ support.other.variable
+ settings
+
+ fontStyle
+
+
+
+
+ name
+ Variable function
+ scope
+ variable.function
+ settings
+
+ foreground
+ #1e66f5
+ fontStyle
+ italic
+
+
+
+ name
+ Variable parameter
+ scope
+ variable.parameter
+ settings
+
+ foreground
+ #dc8a78
+ fontStyle
+ italic
+
+
+
+ name
+ Variable other
+ scope
+ variable.other
+ settings
+
+ foreground
+ #4c4f69
+ fontStyle
+ italic
+
+
+
+ name
+ Variable field
+ scope
+ variable.other.member
+ settings
+
+ foreground
+ #dc8a78
+ fontStyle
+
+
+
+
+ name
+ Variable language
+ scope
+ variable.language
+ settings
+
+ foreground
+ #179299
+ fontStyle
+
+
+
+
+ name
+ Tag name
+ scope
+ entity.name.tag
+ settings
+
+ foreground
+ #fe640b
+ fontStyle
+
+
+
+
+ name
+ Tag attribute
+ scope
+ entity.other.attribute-name
+ settings
+
+ foreground
+ #8839ef
+ fontStyle
+ italic
+
+
+
+ name
+ Tag delimiter
+ scope
+ punctuation.definition.tag
+ settings
+
+ foreground
+ #e64553
+ fontStyle
+
+
+
+
+ name
+ Markdown URL
+ scope
+ markup.underline.link.markdown
+ settings
+
+ foreground
+ #dc8a78
+ fontStyle
+ italic underline
+
+
+
+ name
+ Markdown reference
+ scope
+ meta.link.inline.description
+ settings
+
+ foreground
+ #7287fd
+ fontStyle
+ bold
+
+
+
+ name
+ Markdown literal
+ scope
+ comment.block.markdown, meta.code-fence, markup.raw.code-fence, markup.raw.inline
+ settings
+
+ foreground
+ #179299
+ fontStyle
+ italic
+
+
+
+ name
+ Markdown title
+ scope
+ punctuation.definition.heading, entity.name.section
+ settings
+
+ foreground
+ #1e66f5
+ fontStyle
+ bold
+
+
+
+ name
+ Markdown emphasis
+ scope
+ markup.italic
+ settings
+
+ foreground
+ #e64553
+ fontStyle
+ italic
+
+
+
+ name
+ Markdown strong
+ scope
+ markup.bold
+ settings
+
+ foreground
+ #e64553
+ fontStyle
+ bold
+
+
+
+ name
+ Escape
+ scope
+ constant.character.escape
+ settings
+
+ foreground
+ #ea76cb
+ fontStyle
+
+
+
+
+ name
+ Bash built-in function
+ scope
+ source.shell.bash meta.function.shell meta.compound.shell meta.function-call.identifier.shell
+ settings
+
+ foreground
+ #ea76cb
+ fontStyle
+
+
+
+
+ name
+ Bash parameter
+ scope
+ variable.language.shell
+ settings
+
+ foreground
+ #d20f39
+ fontStyle
+ italic
+
+
+
+ name
+ Lua field
+ scope
+ source.lua meta.function.lua meta.block.lua meta.mapping.value.lua meta.mapping.key.lua string.unquoted.key.lua
+ settings
+
+ foreground
+ #7287fd
+ fontStyle
+ italic
+
+
+
+ name
+ Lua constructor
+ scope
+ source.lua meta.function.lua meta.block.lua meta.mapping.key.lua string.unquoted.key.lua
+ settings
+
+ foreground
+ #dd7878
+ fontStyle
+
+
+
+
+ name
+ Java constant
+ scope
+ entity.name.constant.java
+ settings
+
+ foreground
+ #179299
+ fontStyle
+
+
+
+
+ name
+ CSS property
+ scope
+ support.type.property-name.css
+ settings
+
+ foreground
+ #dd7878
+ fontStyle
+ italic
+
+
+
+ name
+ CSS constant
+ scope
+ support.constant.property-value.css
+ settings
+
+ foreground
+ #4c4f69
+ fontStyle
+
+
+
+
+ name
+ CSS suffix
+ scope
+ constant.numeric.suffix.css, keyword.other.unit.css
+ settings
+
+ foreground
+ #179299
+ fontStyle
+ italic
+
+
+
+ name
+ CSS variable property
+ scope
+ variable.other.custom-property.name.css, support.type.custom-property.name.css, punctuation.definition.custom-property.css
+ settings
+
+ foreground
+ #179299
+ fontStyle
+
+
+
+
+ name
+ SCSS tag
+ scope
+ entity.name.tag.css
+ settings
+
+ foreground
+ #7287fd
+ fontStyle
+
+
+
+
+ name
+ SASS variable
+ scope
+ variable.other.sass
+ settings
+
+ foreground
+ #179299
+ fontStyle
+
+
+
+
+ name
+ Invalid
+ scope
+ invalid
+ settings
+
+ foreground
+ #4c4f69
+ background
+ #d20f39
+ fontStyle
+
+
+
+
+ name
+ Invalid deprecated
+ scope
+ invalid.deprecated
+ settings
+
+ foreground
+ #4c4f69
+ background
+ #8839ef
+ fontStyle
+
+
+
+
+ name
+ Diff header
+ scope
+ meta.diff, meta.diff.header
+ settings
+
+ foreground
+ #9ca0b0
+ fontStyle
+
+
+
+
+ name
+ Diff deleted
+ scope
+ markup.deleted
+ settings
+
+ foreground
+ #d20f39
+ fontStyle
+
+
+
+
+ name
+ Diff inserted
+ scope
+ markup.inserted
+ settings
+
+ foreground
+ #40a02b
+ fontStyle
+
+
+
+
+ name
+ Diff changed
+ scope
+ markup.changed
+ settings
+
+ foreground
+ #df8e1d
+ fontStyle
+
+
+
+
+ name
+ Message error
+ scope
+ message.error
+ settings
+
+ foreground
+ #d20f39
+ fontStyle
+
+
+
+
+ uuid
+ 4d0379b5-ef82-467b-b8b8-365889420646
+ colorSpaceName
+ sRGB
+ semanticClass
+ theme.dark.Catppuccin
+ author
+ BrunDerSchwarzmagier
+
+
diff --git a/bat/.config/bat/themes/Catppuccin-macchiato.tmTheme b/bat/.config/bat/themes/Catppuccin-macchiato.tmTheme
new file mode 100644
index 0000000..0beedb6
--- /dev/null
+++ b/bat/.config/bat/themes/Catppuccin-macchiato.tmTheme
@@ -0,0 +1,959 @@
+
+
+
+
+ name
+ Catppuccin
+ settings
+
+
+ settings
+
+ foreground
+ #cad3f5
+ background
+ #24273a
+ caret
+ #b8c0e0
+ invisibles
+ #a5adcb
+ gutterForeground
+ #939ab7
+ gutterForegroundHighlight
+ #a6da95
+ lineHighlight
+ #5b6078
+ selection
+ #6e738d
+ selectionBorder
+ #24273a
+ activeGuide
+ #f5a97f
+ findHighlightForeground
+ #1e2030
+ findHighlight
+ #eed49f
+ bracketsForeground
+ #939ab7
+ bracketContentsForeground
+ #939ab7
+
+
+
+ name
+ Comment
+ scope
+ comment
+ settings
+
+ foreground
+ #6e738d
+ fontStyle
+ italic
+
+
+
+ name
+ String
+ scope
+ string
+ settings
+
+ foreground
+ #a6da95
+ fontStyle
+
+
+
+
+ name
+ String regex
+ scope
+ string.regexp
+ settings
+
+ foreground
+ #f5a97f
+ fontStyle
+
+
+
+
+ name
+ Number
+ scope
+ constant.numeric
+ settings
+
+ foreground
+ #f5a97f
+ fontStyle
+
+
+
+
+ name
+ Boolean
+ scope
+ constant.language.boolean
+ settings
+
+ foreground
+ #f5a97f
+ fontStyle
+ bold italic
+
+
+
+ name
+ Built-in constant
+ scope
+ constant.language
+ settings
+
+ foreground
+ #b7bdf8
+ fontStyle
+ italic
+
+
+
+ name
+ Built-in function
+ scope
+ support.function.builtin
+ settings
+
+ foreground
+ #f5a97f
+ fontStyle
+ italic
+
+
+
+ name
+ User-defined constant
+ scope
+ variable.other.constant
+ settings
+
+ foreground
+ #f5a97f
+ fontStyle
+
+
+
+
+ name
+ Variable
+ scope
+ variable
+ settings
+
+
+
+ name
+ Keyword
+ scope
+ keyword
+ settings
+
+ foreground
+ #ed8796
+ fontStyle
+ italic
+
+
+
+ name
+ Conditional/loop
+ scope
+ keyword.control.loop, keyword.control.conditional, keyword.control.c++
+ settings
+
+ foreground
+ #c6a0f6
+ fontStyle
+ bold
+
+
+
+ name
+ Return
+ scope
+ keyword.control.return, keyword.control.flow.return
+ settings
+
+ foreground
+ #f5bde6
+ fontStyle
+ bold
+
+
+
+ name
+ Exception
+ scope
+ support.type.exception
+ settings
+
+ foreground
+ #f5a97f
+ fontStyle
+ italic
+
+
+
+ name
+ Operator
+ scope
+ keyword.operator, punctuation.accessor
+ settings
+
+ foreground
+ #91d7e3
+ fontStyle
+ bold
+
+
+
+ name
+ Punctuation separator
+ scope
+ punctuation.separator
+ settings
+
+ foreground
+ #8bd5ca
+ fontStyle
+
+
+
+
+ name
+ Punctuation terminator
+ scope
+ punctuation.terminator
+ settings
+
+ foreground
+ #8bd5ca
+ fontStyle
+
+
+
+
+ name
+ Punctuation bracket
+ scope
+ punctuation.section
+ settings
+
+ foreground
+ #939ab7
+ fontStyle
+
+
+
+
+ name
+ Include
+ scope
+ keyword.control.import.include
+ settings
+
+ foreground
+ #8bd5ca
+ fontStyle
+ italic
+
+
+
+ name
+ Storage
+ scope
+ storage
+ settings
+
+ foreground
+ #ed8796
+ fontStyle
+
+
+
+
+ name
+ Storage type
+ scope
+ storage.type
+ settings
+
+ foreground
+ #eed49f
+ fontStyle
+ italic
+
+
+
+ name
+ Storage modifier
+ scope
+ storage.modifier
+ settings
+
+ foreground
+ #ed8796
+ fontStyle
+
+
+
+
+ name
+ Storage type namespace
+ scope
+ entity.name.namespace, meta.path
+ settings
+
+ foreground
+ #f4dbd6
+ fontStyle
+ italic
+
+
+
+ name
+ Storage type class
+ scope
+ storage.type.class
+ settings
+
+ foreground
+ #f4dbd6
+ fontStyle
+ italic
+
+
+
+ name
+ Label
+ scope
+ entity.name.label
+ settings
+
+ foreground
+ #8aadf4
+ fontStyle
+
+
+
+
+ name
+ Keyword class
+ scope
+ keyword.declaration.class
+ settings
+
+ foreground
+ #ed8796
+ fontStyle
+ italic
+
+
+
+ name
+ Class name
+ scope
+ entity.name.class, meta.toc-list.full-identifier
+ settings
+
+ foreground
+ #91d7e3
+ fontStyle
+
+
+
+
+ name
+ Inherited class
+ scope
+ entity.other.inherited-class
+ settings
+
+ foreground
+ #91d7e3
+ fontStyle
+ italic
+
+
+
+ name
+ Function name
+ scope
+ entity.name.function, variable.function
+ settings
+
+ foreground
+ #8aadf4
+ fontStyle
+ italic
+
+
+
+ name
+ Function macro
+ scope
+ entity.name.function.preprocessor
+ settings
+
+ foreground
+ #ed8796
+ fontStyle
+
+
+
+
+ name
+ Macro directive - ifdef
+ scope
+ keyword.control.import
+ settings
+
+ foreground
+ #ed8796
+ fontStyle
+
+
+
+
+ name
+ Constructor
+ scope
+ entity.name.function.constructor, entity.name.function.destructor
+ settings
+
+ foreground
+ #b7bdf8
+ fontStyle
+
+
+
+
+ name
+ Function argument
+ scope
+ variable.parameter.function
+ settings
+
+ foreground
+ #f4dbd6
+ fontStyle
+ italic
+
+
+
+ name
+ Function declaration
+ scope
+ keyword.declaration.function
+ settings
+
+ foreground
+ #ee99a0
+ fontStyle
+ italic
+
+
+
+ name
+ Library function
+ scope
+ support.function
+ settings
+
+ foreground
+ #91d7e3
+ fontStyle
+
+
+
+
+ name
+ Library constant
+ scope
+ support.constant
+ settings
+
+ foreground
+ #8aadf4
+ fontStyle
+
+
+
+
+ name
+ Library class/type
+ scope
+ support.type, support.class
+ settings
+
+ foreground
+ #8aadf4
+ fontStyle
+ italic
+
+
+
+ name
+ Library variable
+ scope
+ support.other.variable
+ settings
+
+ fontStyle
+
+
+
+
+ name
+ Variable function
+ scope
+ variable.function
+ settings
+
+ foreground
+ #8aadf4
+ fontStyle
+ italic
+
+
+
+ name
+ Variable parameter
+ scope
+ variable.parameter
+ settings
+
+ foreground
+ #f4dbd6
+ fontStyle
+ italic
+
+
+
+ name
+ Variable other
+ scope
+ variable.other
+ settings
+
+ foreground
+ #cad3f5
+ fontStyle
+ italic
+
+
+
+ name
+ Variable field
+ scope
+ variable.other.member
+ settings
+
+ foreground
+ #f4dbd6
+ fontStyle
+
+
+
+
+ name
+ Variable language
+ scope
+ variable.language
+ settings
+
+ foreground
+ #8bd5ca
+ fontStyle
+
+
+
+
+ name
+ Tag name
+ scope
+ entity.name.tag
+ settings
+
+ foreground
+ #f5a97f
+ fontStyle
+
+
+
+
+ name
+ Tag attribute
+ scope
+ entity.other.attribute-name
+ settings
+
+ foreground
+ #c6a0f6
+ fontStyle
+ italic
+
+
+
+ name
+ Tag delimiter
+ scope
+ punctuation.definition.tag
+ settings
+
+ foreground
+ #ee99a0
+ fontStyle
+
+
+
+
+ name
+ Markdown URL
+ scope
+ markup.underline.link.markdown
+ settings
+
+ foreground
+ #f4dbd6
+ fontStyle
+ italic underline
+
+
+
+ name
+ Markdown reference
+ scope
+ meta.link.inline.description
+ settings
+
+ foreground
+ #b7bdf8
+ fontStyle
+ bold
+
+
+
+ name
+ Markdown literal
+ scope
+ comment.block.markdown, meta.code-fence, markup.raw.code-fence, markup.raw.inline
+ settings
+
+ foreground
+ #8bd5ca
+ fontStyle
+ italic
+
+
+
+ name
+ Markdown title
+ scope
+ punctuation.definition.heading, entity.name.section
+ settings
+
+ foreground
+ #8aadf4
+ fontStyle
+ bold
+
+
+
+ name
+ Markdown emphasis
+ scope
+ markup.italic
+ settings
+
+ foreground
+ #ee99a0
+ fontStyle
+ italic
+
+
+
+ name
+ Markdown strong
+ scope
+ markup.bold
+ settings
+
+ foreground
+ #ee99a0
+ fontStyle
+ bold
+
+
+
+ name
+ Escape
+ scope
+ constant.character.escape
+ settings
+
+ foreground
+ #f5bde6
+ fontStyle
+
+
+
+
+ name
+ Bash built-in function
+ scope
+ source.shell.bash meta.function.shell meta.compound.shell meta.function-call.identifier.shell
+ settings
+
+ foreground
+ #f5bde6
+ fontStyle
+
+
+
+
+ name
+ Bash parameter
+ scope
+ variable.language.shell
+ settings
+
+ foreground
+ #ed8796
+ fontStyle
+ italic
+
+
+
+ name
+ Lua field
+ scope
+ source.lua meta.function.lua meta.block.lua meta.mapping.value.lua meta.mapping.key.lua string.unquoted.key.lua
+ settings
+
+ foreground
+ #b7bdf8
+ fontStyle
+ italic
+
+
+
+ name
+ Lua constructor
+ scope
+ source.lua meta.function.lua meta.block.lua meta.mapping.key.lua string.unquoted.key.lua
+ settings
+
+ foreground
+ #f0c6c6
+ fontStyle
+
+
+
+
+ name
+ Java constant
+ scope
+ entity.name.constant.java
+ settings
+
+ foreground
+ #8bd5ca
+ fontStyle
+
+
+
+
+ name
+ CSS property
+ scope
+ support.type.property-name.css
+ settings
+
+ foreground
+ #f0c6c6
+ fontStyle
+ italic
+
+
+
+ name
+ CSS constant
+ scope
+ support.constant.property-value.css
+ settings
+
+ foreground
+ #cad3f5
+ fontStyle
+
+
+
+
+ name
+ CSS suffix
+ scope
+ constant.numeric.suffix.css, keyword.other.unit.css
+ settings
+
+ foreground
+ #8bd5ca
+ fontStyle
+ italic
+
+
+
+ name
+ CSS variable property
+ scope
+ variable.other.custom-property.name.css, support.type.custom-property.name.css, punctuation.definition.custom-property.css
+ settings
+
+ foreground
+ #8bd5ca
+ fontStyle
+
+
+
+
+ name
+ SCSS tag
+ scope
+ entity.name.tag.css
+ settings
+
+ foreground
+ #b7bdf8
+ fontStyle
+
+
+
+
+ name
+ SASS variable
+ scope
+ variable.other.sass
+ settings
+
+ foreground
+ #8bd5ca
+ fontStyle
+
+
+
+
+ name
+ Invalid
+ scope
+ invalid
+ settings
+
+ foreground
+ #cad3f5
+ background
+ #ed8796
+ fontStyle
+
+
+
+
+ name
+ Invalid deprecated
+ scope
+ invalid.deprecated
+ settings
+
+ foreground
+ #cad3f5
+ background
+ #c6a0f6
+ fontStyle
+
+
+
+
+ name
+ Diff header
+ scope
+ meta.diff, meta.diff.header
+ settings
+
+ foreground
+ #6e738d
+ fontStyle
+
+
+
+
+ name
+ Diff deleted
+ scope
+ markup.deleted
+ settings
+
+ foreground
+ #ed8796
+ fontStyle
+
+
+
+
+ name
+ Diff inserted
+ scope
+ markup.inserted
+ settings
+
+ foreground
+ #a6da95
+ fontStyle
+
+
+
+
+ name
+ Diff changed
+ scope
+ markup.changed
+ settings
+
+ foreground
+ #eed49f
+ fontStyle
+
+
+
+
+ name
+ Message error
+ scope
+ message.error
+ settings
+
+ foreground
+ #ed8796
+ fontStyle
+
+
+
+
+ uuid
+ 4d0379b5-ef82-467b-b8b8-365889420646
+ colorSpaceName
+ sRGB
+ semanticClass
+ theme.dark.Catppuccin
+ author
+ BrunDerSchwarzmagier
+
+
diff --git a/bat/.config/bat/themes/Catppuccin-mocha.tmTheme b/bat/.config/bat/themes/Catppuccin-mocha.tmTheme
new file mode 100644
index 0000000..3b9b72c
--- /dev/null
+++ b/bat/.config/bat/themes/Catppuccin-mocha.tmTheme
@@ -0,0 +1,959 @@
+
+
+
+
+ name
+ Catppuccin
+ settings
+
+
+ settings
+
+ foreground
+ #cdd6f4
+ background
+ #1e1e2e
+ caret
+ #bac2de
+ invisibles
+ #a6adc8
+ gutterForeground
+ #9399b2
+ gutterForegroundHighlight
+ #a6e3a1
+ lineHighlight
+ #585b70
+ selection
+ #6c7086
+ selectionBorder
+ #1e1e2e
+ activeGuide
+ #fab387
+ findHighlightForeground
+ #181825
+ findHighlight
+ #f9e2af
+ bracketsForeground
+ #9399b2
+ bracketContentsForeground
+ #9399b2
+
+
+
+ name
+ Comment
+ scope
+ comment
+ settings
+
+ foreground
+ #6c7086
+ fontStyle
+ italic
+
+
+
+ name
+ String
+ scope
+ string
+ settings
+
+ foreground
+ #a6e3a1
+ fontStyle
+
+
+
+
+ name
+ String regex
+ scope
+ string.regexp
+ settings
+
+ foreground
+ #fab387
+ fontStyle
+
+
+
+
+ name
+ Number
+ scope
+ constant.numeric
+ settings
+
+ foreground
+ #fab387
+ fontStyle
+
+
+
+
+ name
+ Boolean
+ scope
+ constant.language.boolean
+ settings
+
+ foreground
+ #fab387
+ fontStyle
+ bold italic
+
+
+
+ name
+ Built-in constant
+ scope
+ constant.language
+ settings
+
+ foreground
+ #b4befe
+ fontStyle
+ italic
+
+
+
+ name
+ Built-in function
+ scope
+ support.function.builtin
+ settings
+
+ foreground
+ #fab387
+ fontStyle
+ italic
+
+
+
+ name
+ User-defined constant
+ scope
+ variable.other.constant
+ settings
+
+ foreground
+ #fab387
+ fontStyle
+
+
+
+
+ name
+ Variable
+ scope
+ variable
+ settings
+
+
+
+ name
+ Keyword
+ scope
+ keyword
+ settings
+
+ foreground
+ #f38ba8
+ fontStyle
+ italic
+
+
+
+ name
+ Conditional/loop
+ scope
+ keyword.control.loop, keyword.control.conditional, keyword.control.c++
+ settings
+
+ foreground
+ #cba6f7
+ fontStyle
+ bold
+
+
+
+ name
+ Return
+ scope
+ keyword.control.return, keyword.control.flow.return
+ settings
+
+ foreground
+ #f5c2e7
+ fontStyle
+ bold
+
+
+
+ name
+ Exception
+ scope
+ support.type.exception
+ settings
+
+ foreground
+ #fab387
+ fontStyle
+ italic
+
+
+
+ name
+ Operator
+ scope
+ keyword.operator, punctuation.accessor
+ settings
+
+ foreground
+ #89dceb
+ fontStyle
+ bold
+
+
+
+ name
+ Punctuation separator
+ scope
+ punctuation.separator
+ settings
+
+ foreground
+ #94e2d5
+ fontStyle
+
+
+
+
+ name
+ Punctuation terminator
+ scope
+ punctuation.terminator
+ settings
+
+ foreground
+ #94e2d5
+ fontStyle
+
+
+
+
+ name
+ Punctuation bracket
+ scope
+ punctuation.section
+ settings
+
+ foreground
+ #9399b2
+ fontStyle
+
+
+
+
+ name
+ Include
+ scope
+ keyword.control.import.include
+ settings
+
+ foreground
+ #94e2d5
+ fontStyle
+ italic
+
+
+
+ name
+ Storage
+ scope
+ storage
+ settings
+
+ foreground
+ #f38ba8
+ fontStyle
+
+
+
+
+ name
+ Storage type
+ scope
+ storage.type
+ settings
+
+ foreground
+ #f9e2af
+ fontStyle
+ italic
+
+
+
+ name
+ Storage modifier
+ scope
+ storage.modifier
+ settings
+
+ foreground
+ #f38ba8
+ fontStyle
+
+
+
+
+ name
+ Storage type namespace
+ scope
+ entity.name.namespace, meta.path
+ settings
+
+ foreground
+ #f5e0dc
+ fontStyle
+ italic
+
+
+
+ name
+ Storage type class
+ scope
+ storage.type.class
+ settings
+
+ foreground
+ #f5e0dc
+ fontStyle
+ italic
+
+
+
+ name
+ Label
+ scope
+ entity.name.label
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+
+
+
+
+ name
+ Keyword class
+ scope
+ keyword.declaration.class
+ settings
+
+ foreground
+ #f38ba8
+ fontStyle
+ italic
+
+
+
+ name
+ Class name
+ scope
+ entity.name.class, meta.toc-list.full-identifier
+ settings
+
+ foreground
+ #89dceb
+ fontStyle
+
+
+
+
+ name
+ Inherited class
+ scope
+ entity.other.inherited-class
+ settings
+
+ foreground
+ #89dceb
+ fontStyle
+ italic
+
+
+
+ name
+ Function name
+ scope
+ entity.name.function, variable.function
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+ italic
+
+
+
+ name
+ Function macro
+ scope
+ entity.name.function.preprocessor
+ settings
+
+ foreground
+ #f38ba8
+ fontStyle
+
+
+
+
+ name
+ Macro directive - ifdef
+ scope
+ keyword.control.import
+ settings
+
+ foreground
+ #f38ba8
+ fontStyle
+
+
+
+
+ name
+ Constructor
+ scope
+ entity.name.function.constructor, entity.name.function.destructor
+ settings
+
+ foreground
+ #b4befe
+ fontStyle
+
+
+
+
+ name
+ Function argument
+ scope
+ variable.parameter.function
+ settings
+
+ foreground
+ #f5e0dc
+ fontStyle
+ italic
+
+
+
+ name
+ Function declaration
+ scope
+ keyword.declaration.function
+ settings
+
+ foreground
+ #eba0ac
+ fontStyle
+ italic
+
+
+
+ name
+ Library function
+ scope
+ support.function
+ settings
+
+ foreground
+ #89dceb
+ fontStyle
+
+
+
+
+ name
+ Library constant
+ scope
+ support.constant
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+
+
+
+
+ name
+ Library class/type
+ scope
+ support.type, support.class
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+ italic
+
+
+
+ name
+ Library variable
+ scope
+ support.other.variable
+ settings
+
+ fontStyle
+
+
+
+
+ name
+ Variable function
+ scope
+ variable.function
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+ italic
+
+
+
+ name
+ Variable parameter
+ scope
+ variable.parameter
+ settings
+
+ foreground
+ #f5e0dc
+ fontStyle
+ italic
+
+
+
+ name
+ Variable other
+ scope
+ variable.other
+ settings
+
+ foreground
+ #cdd6f4
+ fontStyle
+ italic
+
+
+
+ name
+ Variable field
+ scope
+ variable.other.member
+ settings
+
+ foreground
+ #f5e0dc
+ fontStyle
+
+
+
+
+ name
+ Variable language
+ scope
+ variable.language
+ settings
+
+ foreground
+ #94e2d5
+ fontStyle
+
+
+
+
+ name
+ Tag name
+ scope
+ entity.name.tag
+ settings
+
+ foreground
+ #fab387
+ fontStyle
+
+
+
+
+ name
+ Tag attribute
+ scope
+ entity.other.attribute-name
+ settings
+
+ foreground
+ #cba6f7
+ fontStyle
+ italic
+
+
+
+ name
+ Tag delimiter
+ scope
+ punctuation.definition.tag
+ settings
+
+ foreground
+ #eba0ac
+ fontStyle
+
+
+
+
+ name
+ Markdown URL
+ scope
+ markup.underline.link.markdown
+ settings
+
+ foreground
+ #f5e0dc
+ fontStyle
+ italic underline
+
+
+
+ name
+ Markdown reference
+ scope
+ meta.link.inline.description
+ settings
+
+ foreground
+ #b4befe
+ fontStyle
+ bold
+
+
+
+ name
+ Markdown literal
+ scope
+ comment.block.markdown, meta.code-fence, markup.raw.code-fence, markup.raw.inline
+ settings
+
+ foreground
+ #94e2d5
+ fontStyle
+ italic
+
+
+
+ name
+ Markdown title
+ scope
+ punctuation.definition.heading, entity.name.section
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+ bold
+
+
+
+ name
+ Markdown emphasis
+ scope
+ markup.italic
+ settings
+
+ foreground
+ #eba0ac
+ fontStyle
+ italic
+
+
+
+ name
+ Markdown strong
+ scope
+ markup.bold
+ settings
+
+ foreground
+ #eba0ac
+ fontStyle
+ bold
+
+
+
+ name
+ Escape
+ scope
+ constant.character.escape
+ settings
+
+ foreground
+ #f5c2e7
+ fontStyle
+
+
+
+
+ name
+ Bash built-in function
+ scope
+ source.shell.bash meta.function.shell meta.compound.shell meta.function-call.identifier.shell
+ settings
+
+ foreground
+ #f5c2e7
+ fontStyle
+
+
+
+
+ name
+ Bash parameter
+ scope
+ variable.language.shell
+ settings
+
+ foreground
+ #f38ba8
+ fontStyle
+ italic
+
+
+
+ name
+ Lua field
+ scope
+ source.lua meta.function.lua meta.block.lua meta.mapping.value.lua meta.mapping.key.lua string.unquoted.key.lua
+ settings
+
+ foreground
+ #b4befe
+ fontStyle
+ italic
+
+
+
+ name
+ Lua constructor
+ scope
+ source.lua meta.function.lua meta.block.lua meta.mapping.key.lua string.unquoted.key.lua
+ settings
+
+ foreground
+ #f2cdcd
+ fontStyle
+
+
+
+
+ name
+ Java constant
+ scope
+ entity.name.constant.java
+ settings
+
+ foreground
+ #94e2d5
+ fontStyle
+
+
+
+
+ name
+ CSS property
+ scope
+ support.type.property-name.css
+ settings
+
+ foreground
+ #f2cdcd
+ fontStyle
+ italic
+
+
+
+ name
+ CSS constant
+ scope
+ support.constant.property-value.css
+ settings
+
+ foreground
+ #cdd6f4
+ fontStyle
+
+
+
+
+ name
+ CSS suffix
+ scope
+ constant.numeric.suffix.css, keyword.other.unit.css
+ settings
+
+ foreground
+ #94e2d5
+ fontStyle
+ italic
+
+
+
+ name
+ CSS variable property
+ scope
+ variable.other.custom-property.name.css, support.type.custom-property.name.css, punctuation.definition.custom-property.css
+ settings
+
+ foreground
+ #94e2d5
+ fontStyle
+
+
+
+
+ name
+ SCSS tag
+ scope
+ entity.name.tag.css
+ settings
+
+ foreground
+ #b4befe
+ fontStyle
+
+
+
+
+ name
+ SASS variable
+ scope
+ variable.other.sass
+ settings
+
+ foreground
+ #94e2d5
+ fontStyle
+
+
+
+
+ name
+ Invalid
+ scope
+ invalid
+ settings
+
+ foreground
+ #cdd6f4
+ background
+ #f38ba8
+ fontStyle
+
+
+
+
+ name
+ Invalid deprecated
+ scope
+ invalid.deprecated
+ settings
+
+ foreground
+ #cdd6f4
+ background
+ #cba6f7
+ fontStyle
+
+
+
+
+ name
+ Diff header
+ scope
+ meta.diff, meta.diff.header
+ settings
+
+ foreground
+ #6c7086
+ fontStyle
+
+
+
+
+ name
+ Diff deleted
+ scope
+ markup.deleted
+ settings
+
+ foreground
+ #f38ba8
+ fontStyle
+
+
+
+
+ name
+ Diff inserted
+ scope
+ markup.inserted
+ settings
+
+ foreground
+ #a6e3a1
+ fontStyle
+
+
+
+
+ name
+ Diff changed
+ scope
+ markup.changed
+ settings
+
+ foreground
+ #f9e2af
+ fontStyle
+
+
+
+
+ name
+ Message error
+ scope
+ message.error
+ settings
+
+ foreground
+ #f38ba8
+ fontStyle
+
+
+
+
+ uuid
+ 4d0379b5-ef82-467b-b8b8-365889420646
+ colorSpaceName
+ sRGB
+ semanticClass
+ theme.dark.Catppuccin
+ author
+ BrunDerSchwarzmagier
+
+
diff --git a/fish/.config/fish/completions/fisher.fish b/fish/.config/fish/completions/fisher.fish
new file mode 100644
index 0000000..6d23ce4
--- /dev/null
+++ b/fish/.config/fish/completions/fisher.fish
@@ -0,0 +1,7 @@
+complete --command fisher --exclusive --long help --description "Print help"
+complete --command fisher --exclusive --long version --description "Print version"
+complete --command fisher --exclusive --condition __fish_use_subcommand --arguments install --description "Install plugins"
+complete --command fisher --exclusive --condition __fish_use_subcommand --arguments update --description "Update installed plugins"
+complete --command fisher --exclusive --condition __fish_use_subcommand --arguments remove --description "Remove installed plugins"
+complete --command fisher --exclusive --condition __fish_use_subcommand --arguments list --description "List installed plugins matching regex"
+complete --command fisher --exclusive --condition "__fish_seen_subcommand_from update remove" --arguments "(fisher list)"
diff --git a/fish/.config/fish/completions/fzf_configure_bindings.fish b/fish/.config/fish/completions/fzf_configure_bindings.fish
new file mode 100644
index 0000000..b38ef92
--- /dev/null
+++ b/fish/.config/fish/completions/fzf_configure_bindings.fish
@@ -0,0 +1,8 @@
+complete fzf_configure_bindings --no-files
+complete fzf_configure_bindings --long help --short h --description "Print help" --condition "not __fish_seen_argument --help -h"
+complete fzf_configure_bindings --long directory --description "Change the key binding for Search Directory" --condition "not __fish_seen_argument --directory"
+complete fzf_configure_bindings --long git_log --description "Change the key binding for Search Git Log" --condition "not __fish_seen_argument --git_log"
+complete fzf_configure_bindings --long git_status --description "Change the key binding for Search Git Status" --condition "not __fish_seen_argument --git_status"
+complete fzf_configure_bindings --long history --description "Change the key binding for Search History" --condition "not __fish_seen_argument --history"
+complete fzf_configure_bindings --long processes --description "Change the key binding for Search Processes" --condition "not __fish_seen_argument --processes"
+complete fzf_configure_bindings --long variables --description "Change the key binding for Search Variables" --condition "not __fish_seen_argument --variables"
diff --git a/fish/.config/fish/conf.d/.gitnow b/fish/.config/fish/conf.d/.gitnow
new file mode 100644
index 0000000..748ca9d
--- /dev/null
+++ b/fish/.config/fish/conf.d/.gitnow
@@ -0,0 +1,40 @@
+[ options ]
+
+# Read text from system clipboard or from the standard input
+# only when using Gitflow keybindings
+clipboard = false
+
+[ keybindings ]
+
+# Alt + S
+state = \es
+
+# Alt + E
+stage = \ee
+
+# Ctrl + E
+unstage = \ce
+
+# Alt + M
+show = \em
+
+# Alt + C
+commit-all = \ec
+
+# Alt + D
+pull = \ed
+
+# Alt + P
+push = \ep
+
+# Alt + U
+upstream = \eu
+
+# Alt + L
+logs = \el
+
+# Alt + F
+feature = \ef
+
+# Alt + H
+hotfix = \eh
diff --git a/fish/.config/fish/conf.d/fzf.fish b/fish/.config/fish/conf.d/fzf.fish
new file mode 100644
index 0000000..8156c11
--- /dev/null
+++ b/fish/.config/fish/conf.d/fzf.fish
@@ -0,0 +1,28 @@
+# fzf.fish is only meant to be used in interactive mode. If not in interactive mode and not in CI, skip the config to speed up shell startup
+if not status is-interactive && test "$CI" != true
+ exit
+end
+
+# Because of scoping rules, to capture the shell variables exactly as they are, we must read
+# them before even executing _fzf_search_variables. We use psub to store the
+# variables' info in temporary files and pass in the filenames as arguments.
+# This variable is global so that it can be referenced by fzf_configure_bindings and in tests
+set --global _fzf_search_vars_command '_fzf_search_variables (set --show | psub) (set --names | psub)'
+
+
+# Install the default bindings, which are mnemonic and minimally conflict with fish's preset bindings
+fzf_configure_bindings
+
+# Doesn't erase autoloaded _fzf_* functions because they are not easily accessible once key bindings are erased
+function _fzf_uninstall --on-event fzf_uninstall
+ _fzf_uninstall_bindings
+
+ set --erase _fzf_search_vars_command
+ functions --erase _fzf_uninstall _fzf_migration_message _fzf_uninstall_bindings fzf_configure_bindings
+ complete --erase fzf_configure_bindings
+
+ set_color cyan
+ echo "fzf.fish uninstalled."
+ echo "You may need to manually remove fzf_configure_bindings from your config.fish if you were using custom key bindings."
+ set_color normal
+end
diff --git a/fish/.config/fish/conf.d/rustup.fish b/fish/.config/fish/conf.d/rustup.fish
new file mode 100644
index 0000000..45aa295
--- /dev/null
+++ b/fish/.config/fish/conf.d/rustup.fish
@@ -0,0 +1 @@
+. "/home/wball/.local/share/cargo/env.fish"
diff --git a/fish/.config/fish/conf.d/z.fish b/fish/.config/fish/conf.d/z.fish
new file mode 100644
index 0000000..59c960f
--- /dev/null
+++ b/fish/.config/fish/conf.d/z.fish
@@ -0,0 +1,63 @@
+if test -z "$Z_DATA"
+ if test -z "$XDG_DATA_HOME"
+ set -U Z_DATA_DIR "$HOME/.local/share/z"
+ else
+ set -U Z_DATA_DIR "$XDG_DATA_HOME/z"
+ end
+ set -U Z_DATA "$Z_DATA_DIR/data"
+end
+
+if test ! -e "$Z_DATA"
+ if test ! -e "$Z_DATA_DIR"
+ mkdir -p -m 700 "$Z_DATA_DIR"
+ end
+ touch "$Z_DATA"
+end
+
+if test -z "$Z_CMD"
+ set -U Z_CMD z
+end
+
+set -U ZO_CMD "$Z_CMD"o
+
+if test ! -z $Z_CMD
+ function $Z_CMD -d "jump around"
+ __z $argv
+ end
+end
+
+if test ! -z $ZO_CMD
+ function $ZO_CMD -d "open target dir"
+ __z -d $argv
+ end
+end
+
+if not set -q Z_EXCLUDE
+ set -U Z_EXCLUDE "^$HOME\$"
+else if contains $HOME $Z_EXCLUDE
+ # Workaround: migrate old default values to a regex (see #90).
+ set Z_EXCLUDE (string replace -r -- "^$HOME\$" '^'$HOME'$$' $Z_EXCLUDE)
+end
+
+# Setup completions once first
+__z_complete
+
+function __z_on_variable_pwd --on-variable PWD
+ __z_add
+end
+
+function __z_uninstall --on-event z_uninstall
+ functions -e __z_on_variable_pwd
+ functions -e $Z_CMD
+ functions -e $ZO_CMD
+
+ if test ! -z "$Z_DATA"
+ printf "To completely erase z's data, remove:\n" >/dev/stderr
+ printf "%s\n" "$Z_DATA" >/dev/stderr
+ end
+
+ set -e Z_CMD
+ set -e ZO_CMD
+ set -e Z_DATA
+ set -e Z_EXCLUDE
+end
diff --git a/fish/.config/fish/config.fish b/fish/.config/fish/config.fish
new file mode 100644
index 0000000..0c78b18
--- /dev/null
+++ b/fish/.config/fish/config.fish
@@ -0,0 +1,78 @@
+#!/bin/fish
+
+# fish settings
+fish_hybrid_key_bindings
+set fish_cursor_default block
+set fish_cursor_insert line
+set fish_curser_replace_one underscore
+set fish_greeting
+
+# starship prompt
+eval (starship init fish)
+
+# my aliases
+abbr --add grep rg
+abbr --add ls eza
+abbr --add sl eza
+abbr --add ll eza -alF
+abbr --add la eza -a
+abbr --add l eza
+abbr --add lal eza -al
+abbr --add cat bat
+
+alias ip 'ip --color=auto'
+
+# add some stuff to the path
+fish_add_path $HOME/.local/share/cargo/bin
+fish_add_path $HOME/.local/bin
+fish_add_path $HOME/j9.5/bin
+fish_add_path $HOME/.local/share/rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin
+fish_add_path /usr/lib/smlnj/bin
+fish_add_path $HOME/.config/emacs/bin
+fish_add_path $HOME/.elan/bin
+fish_add_path $HOME/go/bin
+
+# set some environment variables
+set -x MANPAGER "sh -c 'col -bx | bat -l man -p'"
+set -x INPUTRC $HOME/.config/readline/inputrc
+set -x EDITOR nvim
+set -x VISUAL nvim
+set -x TZ America/Los_Angeles
+set -x TERM xterm-256color
+set -x BROWSER firefox
+set -x MOZ_ENABLE_WAYLAND 1
+set -x ELECTRON_OZONE_PLATFORM_HINT auto
+set -x MAKEFLAGS "-j$(nproc)"
+set -x MANROFFOPT "-c"
+set -x LESSHISTFILE -
+set -x GDK_BACKEND wayland
+set -x XDG_DATA_HOME $HOME/.local/share
+set -x CARGO_HOME $XDG_DATA_HOME/cargo
+set -x GHCUP_USE_XDG_DIRS true
+set -x JULIA_DEPOT_PATH $XDG_DATA_HOME/julia:$JULIA_DEPOT_PATH
+set -x JUPYTER_CONFIG_DIR $XDG_CONFIG_HOME/jupyter
+set -x RUSTUP_HOME $XDG_DATA_HOME/rustup
+set -x DOT_SAGE $XDG_CONFIG_HOME/sage
+set -x OCAMLPATH $HOME/.opam/default/lib
+
+function vicd
+ set dst "$(command vifm --choose-dir - $argv[2..-1])"
+ if [ -z "$dst" ];
+ echo 'Directory picking cancelled/failed'
+ return 1
+ end
+ cd "$dst"
+end
+
+eval (opam env --switch=default)
+
+set -q GHCUP_INSTALL_BASE_PREFIX[1]; or set GHCUP_INSTALL_BASE_PREFIX $HOME ; set -gx PATH $HOME/.cabal/bin $PATH /home/wball/.local/bin # ghcup-env
+
+# >>> JVM installed by coursier >>>
+set -gx JAVA_HOME "/home/wball/.cache/coursier/arc/https/github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.24%252B8/OpenJDK11U-jdk_x64_linux_hotspot_11.0.24_8.tar.gz/jdk-11.0.24+8"
+set -gx PATH "$PATH:/home/wball/.cache/coursier/arc/https/github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.24%252B8/OpenJDK11U-jdk_x64_linux_hotspot_11.0.24_8.tar.gz/jdk-11.0.24+8/bin"
+# <<< JVM installed by coursier <<<
+
+# >>> coursier install directory >>>
+set -gx PATH "$PATH:/home/wball/.local/share/coursier/bin"
+# <<< coursier install directory <<<
diff --git a/fish/.config/fish/fish_plugins b/fish/.config/fish/fish_plugins
new file mode 100644
index 0000000..08afdc3
--- /dev/null
+++ b/fish/.config/fish/fish_plugins
@@ -0,0 +1,4 @@
+jorgebucaran/fisher
+jethrokuan/z
+patrickf1/fzf.fish
+catppuccin/fish
diff --git a/fish/.config/fish/fish_variables b/fish/.config/fish/fish_variables
new file mode 100644
index 0000000..09ca98c
--- /dev/null
+++ b/fish/.config/fish/fish_variables
@@ -0,0 +1,56 @@
+# This file contains fish universal variable definitions.
+# VERSION: 3.0
+SETUVAR --export FZF_DEFAULT_OPTS:\x2d\x2dcolor\x3dbg\x2b\x3a\x23313244\x2cbg\x3a\x231e1e2e\x2cspinner\x3a\x23f5e0dc\x2chl\x3a\x23f38ba8\x20\x2d\x2dcolor\x3dfg\x3a\x23cdd6f4\x2cheader\x3a\x23f38ba8\x2cinfo\x3a\x23cba6f7\x2cpointer\x3a\x23f5e0dc\x20\x2d\x2dcolor\x3dmarker\x3a\x23f5e0dc\x2cfg\x2b\x3a\x23cdd6f4\x2cprompt\x3a\x23cba6f7\x2chl\x2b\x3a\x23f38ba8
+SETUVAR ZO_CMD:zo
+SETUVAR Z_CMD:z
+SETUVAR Z_DATA:/home/wball/\x2elocal/share/z/data
+SETUVAR Z_DATA_DIR:/home/wball/\x2elocal/share/z
+SETUVAR Z_EXCLUDE:\x5e/home/wball\x24
+SETUVAR __fish_initialized:3400
+SETUVAR _fisher_catppuccin_2F_fish_files:\x7e/\x2econfig/fish/themes/Catppuccin\x20Frappe\x2etheme\x1e\x7e/\x2econfig/fish/themes/Catppuccin\x20Latte\x2etheme\x1e\x7e/\x2econfig/fish/themes/Catppuccin\x20Macchiato\x2etheme\x1e\x7e/\x2econfig/fish/themes/Catppuccin\x20Mocha\x2etheme
+SETUVAR _fisher_jethrokuan_2F_z_files:\x7e/\x2econfig/fish/functions/__z\x2efish\x1e\x7e/\x2econfig/fish/functions/__z_add\x2efish\x1e\x7e/\x2econfig/fish/functions/__z_clean\x2efish\x1e\x7e/\x2econfig/fish/functions/__z_complete\x2efish\x1e\x7e/\x2econfig/fish/conf\x2ed/z\x2efish
+SETUVAR _fisher_jorgebucaran_2F_fisher_files:\x7e/\x2econfig/fish/functions/fisher\x2efish\x1e\x7e/\x2econfig/fish/completions/fisher\x2efish
+SETUVAR _fisher_patrickf1_2F_fzf_2E_fish_files:\x7e/\x2econfig/fish/functions/_fzf_configure_bindings_help\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_extract_var_info\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_preview_changed_file\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_preview_file\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_report_diff_type\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_report_file_type\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_search_directory\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_search_git_log\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_search_git_status\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_search_history\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_search_processes\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_search_variables\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_wrapper\x2efish\x1e\x7e/\x2econfig/fish/functions/fzf_configure_bindings\x2efish\x1e\x7e/\x2econfig/fish/conf\x2ed/fzf\x2efish\x1e\x7e/\x2econfig/fish/completions/fzf_configure_bindings\x2efish
+SETUVAR _fisher_plugins:jorgebucaran/fisher\x1ejethrokuan/z\x1epatrickf1/fzf\x2efish\x1ecatppuccin/fish
+SETUVAR _fisher_upgraded_to_4_4:\x1d
+SETUVAR fish_color_autosuggestion:6c7086
+SETUVAR fish_color_cancel:f38ba8
+SETUVAR fish_color_command:89b4fa
+SETUVAR fish_color_comment:7f849c
+SETUVAR fish_color_cwd:f9e2af
+SETUVAR fish_color_cwd_root:red
+SETUVAR fish_color_end:fab387
+SETUVAR fish_color_error:f38ba8
+SETUVAR fish_color_escape:eba0ac
+SETUVAR fish_color_gray:6c7086
+SETUVAR fish_color_history_current:\x2d\x2dbold
+SETUVAR fish_color_host:89b4fa
+SETUVAR fish_color_host_remote:a6e3a1
+SETUVAR fish_color_keyword:f38ba8
+SETUVAR fish_color_normal:cdd6f4
+SETUVAR fish_color_operator:f5c2e7
+SETUVAR fish_color_option:a6e3a1
+SETUVAR fish_color_param:f2cdcd
+SETUVAR fish_color_quote:a6e3a1
+SETUVAR fish_color_redirection:f5c2e7
+SETUVAR fish_color_search_match:\x2d\x2dbackground\x3d313244
+SETUVAR fish_color_selection:\x2d\x2dbackground\x3d313244
+SETUVAR fish_color_status:f38ba8
+SETUVAR fish_color_user:94e2d5
+SETUVAR fish_color_valid_path:\x2d\x2dunderline
+SETUVAR fish_key_bindings:fish_hybrid_key_bindings
+SETUVAR fish_pager_color_background:\x1d
+SETUVAR fish_pager_color_completion:cdd6f4
+SETUVAR fish_pager_color_description:6c7086
+SETUVAR fish_pager_color_prefix:f5c2e7
+SETUVAR fish_pager_color_progress:6c7086
+SETUVAR fish_pager_color_secondary_background:\x1d
+SETUVAR fish_pager_color_secondary_completion:\x1d
+SETUVAR fish_pager_color_secondary_description:\x1d
+SETUVAR fish_pager_color_secondary_prefix:\x1d
+SETUVAR fish_pager_color_selected_background:\x1d
+SETUVAR fish_pager_color_selected_completion:\x1d
+SETUVAR fish_pager_color_selected_description:\x1d
+SETUVAR fish_pager_color_selected_prefix:\x1d
+SETUVAR fish_user_paths:/usr/lib/smlnj/bin\x1e/home/wball/go/bin\x1e/home/wball/\x2eelan/bin\x1e/home/wball/\x2econfig/emacs/bin\x1e/home/wball/j9\x2e5/bin\x1e/home/wball/\x2elocal/smlnj/bin\x1e/home/wball/\x2elocal/share/rustup/toolchains/stable\x2dx86_64\x2dunknown\x2dlinux\x2dgnu/bin\x1e/home/wball/code/j/j9\x2e4/bin\x1e/usr/lib/j9/bin\x1e/home/wball/\x2ecabal/bin\x1e/home/wball/\x2eghcup/bin\x1e/home/wball/\x2elocal/share/cargo/bin\x1e/home/wball/\x2elocal/bin\x1e/home/wball/\x2ecargo/bin\x1e/home/wball/\x2escripts
+SETUVAR grc_plugin_execs:cat\x1ecvs\x1edf\x1ediff\x1edig\x1egcc\x1eg\x2b\x2b\x1els\x1eifconfig\x1emake\x1emount\x1emtr\x1enetstat\x1eping\x1eps\x1etail\x1etraceroute\x1ewdiff\x1eblkid\x1edu\x1ednf\x1edocker\x1edocker\x2dcompose\x1edocker\x2dmachine\x1eenv\x1eid\x1eip\x1eiostat\x1ejournalctl\x1ekubectl\x1elast\x1elsattr\x1elsblk\x1elspci\x1elsmod\x1elsof\x1egetfacl\x1egetsebool\x1eulimit\x1euptime\x1enmap\x1efdisk\x1efindmnt\x1efree\x1esemanage\x1esar\x1ess\x1esysctl\x1esystemctl\x1estat\x1eshowmount\x1etcpdump\x1etune2fs\x1evmstat\x1ew\x1ewho\x1esockstat
diff --git a/fish/.config/fish/functions/__z.fish b/fish/.config/fish/functions/__z.fish
new file mode 100644
index 0000000..f72ff0e
--- /dev/null
+++ b/fish/.config/fish/functions/__z.fish
@@ -0,0 +1,174 @@
+function __z -d "Jump to a recent directory."
+ function __print_help -d "Print z help."
+ printf "Usage: $Z_CMD [-celrth] string1 string2...\n\n"
+ printf " -c --clean Removes directories that no longer exist from $Z_DATA\n"
+ printf " -d --dir Opens matching directory using system file manager.\n"
+ printf " -e --echo Prints best match, no cd\n"
+ printf " -l --list List matches and scores, no cd\n"
+ printf " -p --purge Delete all entries from $Z_DATA\n"
+ printf " -r --rank Search by rank\n"
+ printf " -t --recent Search by recency\n"
+ printf " -x --delete Removes the current directory from $Z_DATA\n"
+ printf " -h --help Print this help\n\n"
+ end
+ function __z_legacy_escape_regex
+ # taken from escape_string_pcre2 in fish
+ # used to provide compatibility with fish 2
+ for c in (string split '' $argv)
+ if contains $c (string split '' '.^$*+()?[{}\\|-]')
+ printf \\
+ end
+ printf '%s' $c
+ end
+ end
+
+ set -l options h/help c/clean e/echo l/list p/purge r/rank t/recent d/directory x/delete
+
+ argparse $options -- $argv
+
+ if set -q _flag_help
+ __print_help
+ return 0
+ else if set -q _flag_clean
+ __z_clean
+ printf "%s cleaned!\n" $Z_DATA
+ return 0
+ else if set -q _flag_purge
+ echo >$Z_DATA
+ printf "%s purged!\n" $Z_DATA
+ return 0
+ else if set -q _flag_delete
+ sed -i -e "\:^$PWD|.*:d" $Z_DATA
+ return 0
+ end
+
+ set -l typ
+
+ if set -q _flag_rank
+ set typ rank
+ else if set -q _flag_recent
+ set typ recent
+ end
+
+ set -l z_script '
+ function frecent(rank, time) {
+ dx = t-time
+ if( dx < 3600 ) return rank*4
+ if( dx < 86400 ) return rank*2
+ if( dx < 604800 ) return rank/2
+ return rank/4
+ }
+
+ function output(matches, best_match, common) {
+ # list or return the desired directory
+ if( list ) {
+ cmd = "sort -nr"
+ for( x in matches ) {
+ if( matches[x] ) {
+ printf "%-10s %s\n", matches[x], x | cmd
+ }
+ }
+ } else {
+ if( common ) best_match = common
+ print best_match
+ }
+ }
+
+ function common(matches) {
+ # find the common root of a list of matches, if it exists
+ for( x in matches ) {
+ if( matches[x] && (!short || length(x) < length(short)) ) {
+ short = x
+ }
+ }
+ if( short == "/" ) return
+ for( x in matches ) if( matches[x] && index(x, short) != 1 ) {
+ return
+ }
+ return short
+ }
+
+ BEGIN {
+ hi_rank = ihi_rank = -9999999999
+ }
+ {
+ if( typ == "rank" ) {
+ rank = $2
+ } else if( typ == "recent" ) {
+ rank = $3 - t
+ } else rank = frecent($2, $3)
+ if( $1 ~ q ) {
+ matches[$1] = rank
+ } else if( tolower($1) ~ tolower(q) ) imatches[$1] = rank
+ if( matches[$1] && matches[$1] > hi_rank ) {
+ best_match = $1
+ hi_rank = matches[$1]
+ } else if( imatches[$1] && imatches[$1] > ihi_rank ) {
+ ibest_match = $1
+ ihi_rank = imatches[$1]
+ }
+ }
+
+ END {
+ # prefer case sensitive
+ if( best_match ) {
+ output(matches, best_match, common(matches))
+ } else if( ibest_match ) {
+ output(imatches, ibest_match, common(imatches))
+ }
+ }
+ '
+
+ set -l qs
+ for arg in $argv
+ set -l escaped $arg
+ if string escape --style=regex '' >/dev/null 2>&1 # use builtin escape if available
+ set escaped (string escape --style=regex $escaped)
+ else
+ set escaped (__z_legacy_escape_regex $escaped)
+ end
+ # Need to escape twice, see https://www.math.utah.edu/docs/info/gawk_5.html#SEC32
+ set escaped (string replace --all \\ \\\\ $escaped)
+ set qs $qs $escaped
+ end
+ set -l q (string join '.*' $qs)
+
+ if set -q _flag_list
+ # Handle list separately as it can print common path information to stderr
+ # which cannot be captured from a subcommand.
+ command awk -v t=(date +%s) -v list="list" -v typ="$typ" -v q="$q" -F "|" $z_script "$Z_DATA"
+ return
+ end
+
+ set target (command awk -v t=(date +%s) -v typ="$typ" -v q="$q" -F "|" $z_script "$Z_DATA")
+
+ if test "$status" -gt 0
+ return
+ end
+
+ if test -z "$target"
+ printf "'%s' did not match any results\n" "$argv"
+ return 1
+ end
+
+ if set -q _flag_echo
+ printf "%s\n" "$target"
+ else if set -q _flag_directory
+ if test -n "$ZO_METHOD"
+ type -q "$ZO_METHOD"; and "$ZO_METHOD" "$target"; and return $status
+ echo "Cannot open with ZO_METHOD set to $ZO_METHOD"; and return 1
+ else if test "$OS" = Windows_NT
+ # Be careful, in msys2, explorer always return 1
+ type -q explorer; and explorer "$target"
+ return 0
+ echo "Cannot open file explorer"
+ return 1
+ else
+ type -q xdg-open; and xdg-open "$target"; and return $status
+ type -q open; and open "$target"; and return $status
+ echo "Not sure how to open file manager"; and return 1
+ end
+ else
+ pushd "$target"
+ end
+end
diff --git a/fish/.config/fish/functions/__z_add.fish b/fish/.config/fish/functions/__z_add.fish
new file mode 100644
index 0000000..20d5d7e
--- /dev/null
+++ b/fish/.config/fish/functions/__z_add.fish
@@ -0,0 +1,49 @@
+function __z_add -d "Add PATH to .z file"
+ test -n "$fish_private_mode"; and return 0
+
+ for i in $Z_EXCLUDE
+ if string match -r $i $PWD >/dev/null
+ return 0 #Path excluded
+ end
+ end
+
+ set -l tmpfile (mktemp $Z_DATA.XXXXXX)
+
+ if test -f $tmpfile
+ set -l path (string replace --all \\ \\\\ $PWD)
+ command awk -v path=$path -v now=(date +%s) -F "|" '
+ BEGIN {
+ rank[path] = 1
+ time[path] = now
+ }
+ $2 >= 1 {
+ if( $1 == path ) {
+ rank[$1] = $2 + 1
+ time[$1] = now
+ }
+ else {
+ rank[$1] = $2
+ time[$1] = $3
+ }
+ count += $2
+ }
+ END {
+ if( count > 1000 ) {
+ for( i in rank ) print i "|" 0.9*rank[i] "|" time[i] # aging
+ }
+ else for( i in rank ) print i "|" rank[i] "|" time[i]
+ }
+ ' $Z_DATA 2>/dev/null >$tmpfile
+
+ if test ! -z "$Z_OWNER"
+ chown $Z_OWNER:(id -ng $Z_OWNER) $tmpfile
+ end
+ #
+ # Don't use redirection here as it can lead to a race condition where $Z_DATA is clobbered.
+ # Note: There is a still a possible race condition where an old version of $Z_DATA is
+ # read by one instance of Fish before another instance of Fish writes its copy.
+ #
+ command mv $tmpfile $Z_DATA
+ or command rm $tmpfile
+ end
+end
diff --git a/fish/.config/fish/functions/__z_clean.fish b/fish/.config/fish/functions/__z_clean.fish
new file mode 100644
index 0000000..ae1721a
--- /dev/null
+++ b/fish/.config/fish/functions/__z_clean.fish
@@ -0,0 +1,11 @@
+function __z_clean -d "Clean up .z file to remove paths no longer valid"
+ set -l tmpfile (mktemp $Z_DATA.XXXXXX)
+
+ if test -f $tmpfile
+ while read line
+ set -l path (string split '|' $line)[1]
+ test -d $path; and echo $line
+ end <$Z_DATA >$tmpfile
+ command mv -f $tmpfile $Z_DATA
+ end
+end
diff --git a/fish/.config/fish/functions/__z_complete.fish b/fish/.config/fish/functions/__z_complete.fish
new file mode 100644
index 0000000..a626456
--- /dev/null
+++ b/fish/.config/fish/functions/__z_complete.fish
@@ -0,0 +1,13 @@
+function __z_complete -d "add completions"
+ complete -c $Z_CMD -a "(__z -l | string replace -r '^\\S*\\s*' '')" -f -k
+ complete -c $ZO_CMD -a "(__z -l | string replace -r '^\\S*\\s*' '')" -f -k
+
+ complete -c $Z_CMD -s c -l clean -d "Cleans out $Z_DATA"
+ complete -c $Z_CMD -s e -l echo -d "Prints best match, no cd"
+ complete -c $Z_CMD -s l -l list -d "List matches, no cd"
+ complete -c $Z_CMD -s p -l purge -d "Purges $Z_DATA"
+ complete -c $Z_CMD -s r -l rank -d "Searches by rank, cd"
+ complete -c $Z_CMD -s t -l recent -d "Searches by recency, cd"
+ complete -c $Z_CMD -s h -l help -d "Print help"
+ complete -c $Z_CMD -s x -l delete -d "Removes the current directory from $Z_DATA"
+end
diff --git a/fish/.config/fish/functions/_fzf_configure_bindings_help.fish b/fish/.config/fish/functions/_fzf_configure_bindings_help.fish
new file mode 100644
index 0000000..ecfe68e
--- /dev/null
+++ b/fish/.config/fish/functions/_fzf_configure_bindings_help.fish
@@ -0,0 +1,43 @@
+function _fzf_configure_bindings_help --description "Prints the help message for fzf_configure_bindings."
+ echo "\
+USAGE:
+ fzf_configure_bindings [--COMMAND=[KEY_SEQUENCE]...]
+
+DESCRIPTION
+ fzf_configure_bindings installs key bindings for fzf.fish's commands and erases any bindings it
+ previously installed. It installs bindings for both default and insert modes. fzf.fish executes
+ it without options on fish startup to install the out-of-the-box key bindings.
+
+ By default, commands are bound to a mnemonic key sequence, shown below. Each command's binding
+ can be configured using a namesake corresponding option:
+ COMMAND | DEFAULT KEY SEQUENCE | CORRESPONDING OPTION
+ Search Directory | Ctrl+Alt+F (F for file) | --directory
+ Search Git Log | Ctrl+Alt+L (L for log) | --git_log
+ Search Git Status | Ctrl+Alt+S (S for status) | --git_status
+ Search History | Ctrl+R (R for reverse) | --history
+ Search Processes | Ctrl+Alt+P (P for process) | --processes
+ Search Variables | Ctrl+V (V for variable) | --variables
+ Override a command's binding by specifying its corresponding option with the desired key
+ sequence. Disable a command's binding by specifying its corresponding option with no value.
+
+ Because fzf_configure_bindings erases bindings it previously installed, it can be cleanly
+ executed multiple times. Once the desired fzf_configure_bindings command has been found, add it
+ to your config.fish in order to persist the customized bindings.
+
+ In terms of validation, fzf_configure_bindings fails if passed unknown options. It expects an
+ equals sign between an option's name and value. However, it does not validate key sequences.
+
+ Pass -h or --help to print this help message and exit.
+
+EXAMPLES
+ Default bindings but bind Search Directory to Ctrl+F and Search Variables to Ctrl+Alt+V
+ \$ fzf_configure_bindings --directory=\cf --variables=\e\cv
+ Default bindings but disable Search History
+ \$ fzf_configure_bindings --history=
+ An agglomeration of different options
+ \$ fzf_configure_bindings --git_status=\cg --history=\ch --variables= --processes=
+
+SEE Also
+ To learn more about fish key bindings, see bind(1) and fish_key_reader(1).
+"
+end
diff --git a/fish/.config/fish/functions/_fzf_extract_var_info.fish b/fish/.config/fish/functions/_fzf_extract_var_info.fish
new file mode 100644
index 0000000..dd4e952
--- /dev/null
+++ b/fish/.config/fish/functions/_fzf_extract_var_info.fish
@@ -0,0 +1,15 @@
+# helper function for _fzf_search_variables
+function _fzf_extract_var_info --argument-names variable_name set_show_output --description "Extract and reformat lines pertaining to \$variable_name from \$set_show_output."
+ # Extract only the lines about the variable, all of which begin with either
+ # $variable_name: ...or... $variable_name[
+ string match --regex "^\\\$$variable_name(?::|\[).*" <$set_show_output |
+
+ # Strip the variable name prefix, including ": " for scope info lines
+ string replace --regex "^\\\$$variable_name(?:: )?" '' |
+
+ # Distill the lines of values, replacing...
+ # [1]: |value|
+ # ...with...
+ # [1] value
+ string replace --regex ": \|(.*)\|" ' $1'
+end
diff --git a/fish/.config/fish/functions/_fzf_preview_changed_file.fish b/fish/.config/fish/functions/_fzf_preview_changed_file.fish
new file mode 100644
index 0000000..78dd561
--- /dev/null
+++ b/fish/.config/fish/functions/_fzf_preview_changed_file.fish
@@ -0,0 +1,49 @@
+# helper for _fzf_search_git_status
+# arg should be a line from git status --short, e.g.
+# MM functions/_fzf_preview_changed_file.fish
+# D README.md
+# R LICENSE -> "New License"
+function _fzf_preview_changed_file --argument-names path_status --description "Show the git diff of the given file."
+ # remove quotes because they'll be interpreted literally by git diff
+ # no need to requote when referencing $path because fish does not perform word splitting
+ # https://fishshell.com/docs/current/fish_for_bash_users.html
+ set -f path (string unescape (string sub --start 4 $path_status))
+ # first letter of short format shows index, second letter shows working tree
+ # https://git-scm.com/docs/git-status/2.35.0#_short_format
+ set -f index_status (string sub --length 1 $path_status)
+ set -f working_tree_status (string sub --start 2 --length 1 $path_status)
+
+ set -f diff_opts --color=always
+
+ if test $index_status = '?'
+ _fzf_report_diff_type Untracked
+ _fzf_preview_file $path
+ else if contains {$index_status}$working_tree_status DD AU UD UA DU AA UU
+ # Unmerged statuses taken directly from git status help's short format table
+ # Unmerged statuses are mutually exclusive with other statuses, so if we see
+ # these, then safe to assume the path is unmerged
+ _fzf_report_diff_type Unmerged
+ git diff $diff_opts -- $path
+ else
+ if test $index_status != ' '
+ _fzf_report_diff_type Staged
+
+ # renames are only detected in the index, never working tree, so only need to test for it here
+ # https://stackoverflow.com/questions/73954214
+ if test $index_status = R
+ # diff the post-rename path with the original path, otherwise the diff will show the entire file as being added
+ set -f orig_and_new_path (string split --max 1 -- ' -> ' $path)
+ git diff --staged $diff_opts -- $orig_and_new_path[1] $orig_and_new_path[2]
+ # path currently has the form of "original -> current", so we need to correct it before it's used below
+ set path $orig_and_new_path[2]
+ else
+ git diff --staged $diff_opts -- $path
+ end
+ end
+
+ if test $working_tree_status != ' '
+ _fzf_report_diff_type Unstaged
+ git diff $diff_opts -- $path
+ end
+ end
+end
diff --git a/fish/.config/fish/functions/_fzf_preview_file.fish b/fish/.config/fish/functions/_fzf_preview_file.fish
new file mode 100644
index 0000000..c926475
--- /dev/null
+++ b/fish/.config/fish/functions/_fzf_preview_file.fish
@@ -0,0 +1,43 @@
+# helper function for _fzf_search_directory and _fzf_search_git_status
+function _fzf_preview_file --description "Print a preview for the given file based on its file type."
+ # because there's no way to guarantee that _fzf_search_directory passes the path to _fzf_preview_file
+ # as one argument, we collect all the arguments into one single variable and treat that as the path
+ set -f file_path $argv
+
+ if test -L "$file_path" # symlink
+ # notify user and recurse on the target of the symlink, which can be any of these file types
+ set -l target_path (realpath "$file_path")
+
+ set_color yellow
+ echo "'$file_path' is a symlink to '$target_path'."
+ set_color normal
+
+ _fzf_preview_file "$target_path"
+ else if test -f "$file_path" # regular file
+ if set --query fzf_preview_file_cmd
+ # need to escape quotes to make sure eval receives file_path as a single arg
+ eval "$fzf_preview_file_cmd '$file_path'"
+ else
+ bat --style=numbers --color=always "$file_path"
+ end
+ else if test -d "$file_path" # directory
+ if set --query fzf_preview_dir_cmd
+ # see above
+ eval "$fzf_preview_dir_cmd '$file_path'"
+ else
+ # -A list hidden files as well, except for . and ..
+ # -F helps classify files by appending symbols after the file name
+ command ls -A -F "$file_path"
+ end
+ else if test -c "$file_path"
+ _fzf_report_file_type "$file_path" "character device file"
+ else if test -b "$file_path"
+ _fzf_report_file_type "$file_path" "block device file"
+ else if test -S "$file_path"
+ _fzf_report_file_type "$file_path" socket
+ else if test -p "$file_path"
+ _fzf_report_file_type "$file_path" "named pipe"
+ else
+ echo "$file_path doesn't exist." >&2
+ end
+end
diff --git a/fish/.config/fish/functions/_fzf_report_diff_type.fish b/fish/.config/fish/functions/_fzf_report_diff_type.fish
new file mode 100644
index 0000000..cc26fb3
--- /dev/null
+++ b/fish/.config/fish/functions/_fzf_report_diff_type.fish
@@ -0,0 +1,18 @@
+# helper for _fzf_preview_changed_file
+# prints out something like
+# ╭────────╮
+# │ Staged │
+# ╰────────╯
+function _fzf_report_diff_type --argument-names diff_type --description "Print a distinct colored header meant to preface a git patch."
+ # number of "-" to draw is the length of the string to box + 2 for padding
+ set -f repeat_count (math 2 + (string length $diff_type))
+ set -f line (string repeat --count $repeat_count ─)
+ set -f top_border ╭$line╮
+ set -f btm_border ╰$line╯
+
+ set_color yellow
+ echo $top_border
+ echo "│ $diff_type │"
+ echo $btm_border
+ set_color normal
+end
diff --git a/fish/.config/fish/functions/_fzf_report_file_type.fish b/fish/.config/fish/functions/_fzf_report_file_type.fish
new file mode 100644
index 0000000..49e02e1
--- /dev/null
+++ b/fish/.config/fish/functions/_fzf_report_file_type.fish
@@ -0,0 +1,6 @@
+# helper function for _fzf_preview_file
+function _fzf_report_file_type --argument-names file_path file_type --description "Explain the file type for a file."
+ set_color red
+ echo "Cannot preview '$file_path': it is a $file_type."
+ set_color normal
+end
diff --git a/fish/.config/fish/functions/_fzf_search_directory.fish b/fish/.config/fish/functions/_fzf_search_directory.fish
new file mode 100644
index 0000000..4541eec
--- /dev/null
+++ b/fish/.config/fish/functions/_fzf_search_directory.fish
@@ -0,0 +1,33 @@
+function _fzf_search_directory --description "Search the current directory. Replace the current token with the selected file paths."
+ # Directly use fd binary to avoid output buffering delay caused by a fd alias, if any.
+ # Debian-based distros install fd as fdfind and the fd package is something else, so
+ # check for fdfind first. Fall back to "fd" for a clear error message.
+ set -f fd_cmd (command -v fdfind || command -v fd || echo "fd")
+ set -f --append fd_cmd --color=always $fzf_fd_opts
+
+ set -f fzf_arguments --multi --ansi $fzf_directory_opts
+ set -f token (commandline --current-token)
+ # expand any variables or leading tilde (~) in the token
+ set -f expanded_token (eval echo -- $token)
+ # unescape token because it's already quoted so backslashes will mess up the path
+ set -f unescaped_exp_token (string unescape -- $expanded_token)
+
+ # If the current token is a directory and has a trailing slash,
+ # then use it as fd's base directory.
+ if string match --quiet -- "*/" $unescaped_exp_token && test -d "$unescaped_exp_token"
+ set --append fd_cmd --base-directory=$unescaped_exp_token
+ # use the directory name as fzf's prompt to indicate the search is limited to that directory
+ set --prepend fzf_arguments --prompt="Directory $unescaped_exp_token> " --preview="_fzf_preview_file $expanded_token{}"
+ set -f file_paths_selected $unescaped_exp_token($fd_cmd 2>/dev/null | _fzf_wrapper $fzf_arguments)
+ else
+ set --prepend fzf_arguments --prompt="Directory> " --query="$unescaped_exp_token" --preview='_fzf_preview_file {}'
+ set -f file_paths_selected ($fd_cmd 2>/dev/null | _fzf_wrapper $fzf_arguments)
+ end
+
+
+ if test $status -eq 0
+ commandline --current-token --replace -- (string escape -- $file_paths_selected | string join ' ')
+ end
+
+ commandline --function repaint
+end
diff --git a/fish/.config/fish/functions/_fzf_search_git_log.fish b/fish/.config/fish/functions/_fzf_search_git_log.fish
new file mode 100644
index 0000000..aa54724
--- /dev/null
+++ b/fish/.config/fish/functions/_fzf_search_git_log.fish
@@ -0,0 +1,36 @@
+function _fzf_search_git_log --description "Search the output of git log and preview commits. Replace the current token with the selected commit hash."
+ if not git rev-parse --git-dir >/dev/null 2>&1
+ echo '_fzf_search_git_log: Not in a git repository.' >&2
+ else
+ if not set --query fzf_git_log_format
+ # %h gives you the abbreviated commit hash, which is useful for saving screen space, but we will have to expand it later below
+ set -f fzf_git_log_format '%C(bold blue)%h%C(reset) - %C(cyan)%ad%C(reset) %C(yellow)%d%C(reset) %C(normal)%s%C(reset) %C(dim normal)[%an]%C(reset)'
+ end
+
+ set -f preview_cmd 'git show --color=always --stat --patch {1}'
+ if set --query fzf_diff_highlighter
+ set preview_cmd "$preview_cmd | $fzf_diff_highlighter"
+ end
+
+ set -f selected_log_lines (
+ git log --no-show-signature --color=always --format=format:$fzf_git_log_format --date=short | \
+ _fzf_wrapper --ansi \
+ --multi \
+ --scheme=history \
+ --prompt="Git Log> " \
+ --preview=$preview_cmd \
+ --query=(commandline --current-token) \
+ $fzf_git_log_opts
+ )
+ if test $status -eq 0
+ for line in $selected_log_lines
+ set -f abbreviated_commit_hash (string split --field 1 " " $line)
+ set -f full_commit_hash (git rev-parse $abbreviated_commit_hash)
+ set -f --append commit_hashes $full_commit_hash
+ end
+ commandline --current-token --replace (string join ' ' $commit_hashes)
+ end
+ end
+
+ commandline --function repaint
+end
diff --git a/fish/.config/fish/functions/_fzf_search_git_status.fish b/fish/.config/fish/functions/_fzf_search_git_status.fish
new file mode 100644
index 0000000..358f88c
--- /dev/null
+++ b/fish/.config/fish/functions/_fzf_search_git_status.fish
@@ -0,0 +1,41 @@
+function _fzf_search_git_status --description "Search the output of git status. Replace the current token with the selected file paths."
+ if not git rev-parse --git-dir >/dev/null 2>&1
+ echo '_fzf_search_git_status: Not in a git repository.' >&2
+ else
+ set -f preview_cmd '_fzf_preview_changed_file {}'
+ if set --query fzf_diff_highlighter
+ set preview_cmd "$preview_cmd | $fzf_diff_highlighter"
+ end
+
+ set -f selected_paths (
+ # Pass configuration color.status=always to force status to use colors even though output is sent to a pipe
+ git -c color.status=always status --short |
+ _fzf_wrapper --ansi \
+ --multi \
+ --prompt="Git Status> " \
+ --query=(commandline --current-token) \
+ --preview=$preview_cmd \
+ --nth="2.." \
+ $fzf_git_status_opts
+ )
+ if test $status -eq 0
+ # git status --short automatically escapes the paths of most files for us so not going to bother trying to handle
+ # the few edges cases of weird file names that should be extremely rare (e.g. "this;needs;escaping")
+ set -f cleaned_paths
+
+ for path in $selected_paths
+ if test (string sub --length 1 $path) = R
+ # path has been renamed and looks like "R LICENSE -> LICENSE.md"
+ # extract the path to use from after the arrow
+ set --append cleaned_paths (string split -- "-> " $path)[-1]
+ else
+ set --append cleaned_paths (string sub --start=4 $path)
+ end
+ end
+
+ commandline --current-token --replace -- (string join ' ' $cleaned_paths)
+ end
+ end
+
+ commandline --function repaint
+end
diff --git a/fish/.config/fish/functions/_fzf_search_history.fish b/fish/.config/fish/functions/_fzf_search_history.fish
new file mode 100644
index 0000000..cafbce9
--- /dev/null
+++ b/fish/.config/fish/functions/_fzf_search_history.fish
@@ -0,0 +1,39 @@
+function _fzf_search_history --description "Search command history. Replace the command line with the selected command."
+ # history merge incorporates history changes from other fish sessions
+ # it errors out if called in private mode
+ if test -z "$fish_private_mode"
+ builtin history merge
+ end
+
+ if not set --query fzf_history_time_format
+ # Reference https://devhints.io/strftime to understand strftime format symbols
+ set -f fzf_history_time_format "%m-%d %H:%M:%S"
+ end
+
+ # Delinate time from command in history entries using the vertical box drawing char (U+2502).
+ # Then, to get raw command from history entries, delete everything up to it. The ? on regex is
+ # necessary to make regex non-greedy so it won't match into commands containing the char.
+ set -f time_prefix_regex '^.*? │ '
+ # Delinate commands throughout pipeline using null rather than newlines because commands can be multi-line
+ set -f commands_selected (
+ builtin history --null --show-time="$fzf_history_time_format │ " |
+ _fzf_wrapper --read0 \
+ --print0 \
+ --multi \
+ --scheme=history \
+ --prompt="History> " \
+ --query=(commandline) \
+ --preview="string replace --regex '$time_prefix_regex' '' -- {} | fish_indent --ansi" \
+ --preview-window="bottom:3:wrap" \
+ $fzf_history_opts |
+ string split0 |
+ # remove timestamps from commands selected
+ string replace --regex $time_prefix_regex ''
+ )
+
+ if test $status -eq 0
+ commandline --replace -- $commands_selected
+ end
+
+ commandline --function repaint
+end
diff --git a/fish/.config/fish/functions/_fzf_search_processes.fish b/fish/.config/fish/functions/_fzf_search_processes.fish
new file mode 100644
index 0000000..133a880
--- /dev/null
+++ b/fish/.config/fish/functions/_fzf_search_processes.fish
@@ -0,0 +1,32 @@
+function _fzf_search_processes --description "Search all running processes. Replace the current token with the pid of the selected process."
+ # Directly use ps command because it is often aliased to a different command entirely
+ # or with options that dirty the search results and preview output
+ set -f ps_cmd (command -v ps || echo "ps")
+ # use all caps to be consistent with ps default format
+ # snake_case because ps doesn't seem to allow spaces in the field names
+ set -f ps_preview_fmt (string join ',' 'pid' 'ppid=PARENT' 'user' '%cpu' 'rss=RSS_IN_KB' 'start=START_TIME' 'command')
+ set -f processes_selected (
+ $ps_cmd -A -opid,command | \
+ _fzf_wrapper --multi \
+ --prompt="Processes> " \
+ --query (commandline --current-token) \
+ --ansi \
+ # first line outputted by ps is a header, so we need to mark it as so
+ --header-lines=1 \
+ # ps uses exit code 1 if the process was not found, in which case show an message explaining so
+ --preview="$ps_cmd -o '$ps_preview_fmt' -p {1} || echo 'Cannot preview {1} because it exited.'" \
+ --preview-window="bottom:4:wrap" \
+ $fzf_processes_opts
+ )
+
+ if test $status -eq 0
+ for process in $processes_selected
+ set -f --append pids_selected (string split --no-empty --field=1 -- " " $process)
+ end
+
+ # string join to replace the newlines outputted by string split with spaces
+ commandline --current-token --replace -- (string join ' ' $pids_selected)
+ end
+
+ commandline --function repaint
+end
diff --git a/fish/.config/fish/functions/_fzf_search_variables.fish b/fish/.config/fish/functions/_fzf_search_variables.fish
new file mode 100644
index 0000000..52a7c70
--- /dev/null
+++ b/fish/.config/fish/functions/_fzf_search_variables.fish
@@ -0,0 +1,47 @@
+# This function expects the following two arguments:
+# argument 1 = output of (set --show | psub), i.e. a file with the scope info and values of all variables
+# argument 2 = output of (set --names | psub), i.e. a file with all variable names
+function _fzf_search_variables --argument-names set_show_output set_names_output --description "Search and preview shell variables. Replace the current token with the selected variable."
+ if test -z "$set_names_output"
+ printf '%s\n' '_fzf_search_variables requires 2 arguments.' >&2
+
+ commandline --function repaint
+ return 22 # 22 means invalid argument in POSIX
+ end
+
+ # Exclude the history variable from being piped into fzf because
+ # 1. it's not included in $set_names_output
+ # 2. it tends to be a very large value => increases computation time
+ # 3._fzf_search_history is a much better way to examine history anyway
+ set -f all_variable_names (string match --invert history <$set_names_output)
+
+ set -f current_token (commandline --current-token)
+ # Use the current token to pre-populate fzf's query. If the current token begins
+ # with a $, remove it from the query so that it will better match the variable names
+ set -f cleaned_curr_token (string replace -- '$' '' $current_token)
+
+ set -f variable_names_selected (
+ printf '%s\n' $all_variable_names |
+ _fzf_wrapper --preview "_fzf_extract_var_info {} $set_show_output" \
+ --prompt="Variables> " \
+ --preview-window="wrap" \
+ --multi \
+ --query=$cleaned_curr_token \
+ $fzf_variables_opts
+ )
+
+ if test $status -eq 0
+ # If the current token begins with a $, do not overwrite the $ when
+ # replacing the current token with the selected variable.
+ # Uses brace expansion to prepend $ to each variable name.
+ commandline --current-token --replace (
+ if string match --quiet -- '$*' $current_token
+ string join " " \${$variable_names_selected}
+ else
+ string join " " $variable_names_selected
+ end
+ )
+ end
+
+ commandline --function repaint
+end
diff --git a/fish/.config/fish/functions/_fzf_wrapper.fish b/fish/.config/fish/functions/_fzf_wrapper.fish
new file mode 100644
index 0000000..486e36c
--- /dev/null
+++ b/fish/.config/fish/functions/_fzf_wrapper.fish
@@ -0,0 +1,21 @@
+function _fzf_wrapper --description "Prepares some environment variables before executing fzf."
+ # Make sure fzf uses fish to execute preview commands, some of which
+ # are autoloaded fish functions so don't exist in other shells.
+ # Use --function so that it doesn't clobber SHELL outside this function.
+ set -f --export SHELL (command --search fish)
+
+ # If neither FZF_DEFAULT_OPTS nor FZF_DEFAULT_OPTS_FILE are set, then set some sane defaults.
+ # See https://github.com/junegunn/fzf#environment-variables
+ set --query FZF_DEFAULT_OPTS FZF_DEFAULT_OPTS_FILE
+ if test $status -eq 2
+ # cycle allows jumping between the first and last results, making scrolling faster
+ # layout=reverse lists results top to bottom, mimicking the familiar layouts of git log, history, and env
+ # border shows where the fzf window begins and ends
+ # height=90% leaves space to see the current command and some scrollback, maintaining context of work
+ # preview-window=wrap wraps long lines in the preview window, making reading easier
+ # marker=* makes the multi-select marker more distinguishable from the pointer (since both default to >)
+ set --export FZF_DEFAULT_OPTS '--cycle --layout=reverse --border --height=90% --preview-window=wrap --marker="*"'
+ end
+
+ fzf $argv
+end
diff --git a/fish/.config/fish/functions/fisher.fish b/fish/.config/fish/functions/fisher.fish
new file mode 100644
index 0000000..b1513d3
--- /dev/null
+++ b/fish/.config/fish/functions/fisher.fish
@@ -0,0 +1,240 @@
+function fisher --argument-names cmd --description "A plugin manager for Fish"
+ set --query fisher_path || set --local fisher_path $__fish_config_dir
+ set --local fisher_version 4.4.4
+ set --local fish_plugins $__fish_config_dir/fish_plugins
+
+ switch "$cmd"
+ case -v --version
+ echo "fisher, version $fisher_version"
+ case "" -h --help
+ echo "Usage: fisher install Install plugins"
+ echo " fisher remove Remove installed plugins"
+ echo " fisher update Update installed plugins"
+ echo " fisher update Update all installed plugins"
+ echo " fisher list [] List installed plugins matching regex"
+ echo "Options:"
+ echo " -v, --version Print version"
+ echo " -h, --help Print this help message"
+ echo "Variables:"
+ echo " \$fisher_path Plugin installation path. Default: $__fish_config_dir" | string replace --regex -- $HOME \~
+ case ls list
+ string match --entire --regex -- "$argv[2]" $_fisher_plugins
+ case install update remove
+ isatty || read --local --null --array stdin && set --append argv $stdin
+
+ set --local install_plugins
+ set --local update_plugins
+ set --local remove_plugins
+ set --local arg_plugins $argv[2..-1]
+ set --local old_plugins $_fisher_plugins
+ set --local new_plugins
+
+ test -e $fish_plugins && set --local file_plugins (string match --regex -- '^[^\s]+$' <$fish_plugins)
+
+ if ! set --query argv[2]
+ if test "$cmd" != update
+ echo "fisher: Not enough arguments for command: \"$cmd\"" >&2 && return 1
+ else if ! set --query file_plugins
+ echo "fisher: \"$fish_plugins\" file not found: \"$cmd\"" >&2 && return 1
+ end
+ set arg_plugins $file_plugins
+ end
+
+ for plugin in $arg_plugins
+ set plugin (test -e "$plugin" && realpath $plugin || string lower -- $plugin)
+ contains -- "$plugin" $new_plugins || set --append new_plugins $plugin
+ end
+
+ if set --query argv[2]
+ for plugin in $new_plugins
+ if contains -- "$plugin" $old_plugins
+ test "$cmd" = remove &&
+ set --append remove_plugins $plugin ||
+ set --append update_plugins $plugin
+ else if test "$cmd" = install
+ set --append install_plugins $plugin
+ else
+ echo "fisher: Plugin not installed: \"$plugin\"" >&2 && return 1
+ end
+ end
+ else
+ for plugin in $new_plugins
+ contains -- "$plugin" $old_plugins &&
+ set --append update_plugins $plugin ||
+ set --append install_plugins $plugin
+ end
+
+ for plugin in $old_plugins
+ contains -- "$plugin" $new_plugins || set --append remove_plugins $plugin
+ end
+ end
+
+ set --local pid_list
+ set --local source_plugins
+ set --local fetch_plugins $update_plugins $install_plugins
+ set --local fish_path (status fish-path)
+
+ echo (set_color --bold)fisher $cmd version $fisher_version(set_color normal)
+
+ for plugin in $fetch_plugins
+ set --local source (command mktemp -d)
+ set --append source_plugins $source
+
+ command mkdir -p $source/{completions,conf.d,themes,functions}
+
+ $fish_path --command "
+ if test -e $plugin
+ command cp -Rf $plugin/* $source
+ else
+ set temp (command mktemp -d)
+ set repo (string split -- \@ $plugin) || set repo[2] HEAD
+
+ if set path (string replace --regex -- '^(https://)?gitlab.com/' '' \$repo[1])
+ set name (string split -- / \$path)[-1]
+ set url https://gitlab.com/\$path/-/archive/\$repo[2]/\$name-\$repo[2].tar.gz
+ else
+ set url https://api.github.com/repos/\$repo[1]/tarball/\$repo[2]
+ end
+
+ echo Fetching (set_color --underline)\$url(set_color normal)
+
+ if command curl -q --silent -L \$url | command tar -xzC \$temp -f - 2>/dev/null
+ command cp -Rf \$temp/*/* $source
+ else
+ echo fisher: Invalid plugin name or host unavailable: \\\"$plugin\\\" >&2
+ command rm -rf $source
+ end
+
+ command rm -rf \$temp
+ end
+
+ set files $source/* && string match --quiet --regex -- .+\.fish\\\$ \$files
+ " &
+
+ set --append pid_list (jobs --last --pid)
+ end
+
+ wait $pid_list 2>/dev/null
+
+ for plugin in $fetch_plugins
+ if set --local source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)] && test ! -e $source
+ if set --local index (contains --index -- "$plugin" $install_plugins)
+ set --erase install_plugins[$index]
+ else
+ set --erase update_plugins[(contains --index -- "$plugin" $update_plugins)]
+ end
+ end
+ end
+
+ for plugin in $update_plugins $remove_plugins
+ if set --local index (contains --index -- "$plugin" $_fisher_plugins)
+ set --local plugin_files_var _fisher_(string escape --style=var -- $plugin)_files
+
+ if contains -- "$plugin" $remove_plugins
+ for name in (string replace --filter --regex -- '.+/conf\.d/([^/]+)\.fish$' '$1' $$plugin_files_var)
+ emit {$name}_uninstall
+ end
+ printf "%s\n" Removing\ (set_color red --bold)$plugin(set_color normal) " "$$plugin_files_var | string replace -- \~ ~
+ set --erase _fisher_plugins[$index]
+ end
+
+ command rm -rf (string replace -- \~ ~ $$plugin_files_var)
+
+ functions --erase (string replace --filter --regex -- '.+/functions/([^/]+)\.fish$' '$1' $$plugin_files_var)
+
+ for name in (string replace --filter --regex -- '.+/completions/([^/]+)\.fish$' '$1' $$plugin_files_var)
+ complete --erase --command $name
+ end
+
+ set --erase $plugin_files_var
+ end
+ end
+
+ if set --query update_plugins[1] || set --query install_plugins[1]
+ command mkdir -p $fisher_path/{functions,themes,conf.d,completions}
+ end
+
+ for plugin in $update_plugins $install_plugins
+ set --local source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)]
+ set --local files $source/{functions,themes,conf.d,completions}/*
+
+ if set --local index (contains --index -- $plugin $install_plugins)
+ set --local user_files $fisher_path/{functions,themes,conf.d,completions}/*
+ set --local conflict_files
+
+ for file in (string replace -- $source/ $fisher_path/ $files)
+ contains -- $file $user_files && set --append conflict_files $file
+ end
+
+ if set --query conflict_files[1] && set --erase install_plugins[$index]
+ echo -s "fisher: Cannot install \"$plugin\": please remove or move conflicting files first:" \n" "$conflict_files >&2
+ continue
+ end
+ end
+
+ for file in (string replace -- $source/ "" $files)
+ command cp -RLf $source/$file $fisher_path/$file
+ end
+
+ set --local plugin_files_var _fisher_(string escape --style=var -- $plugin)_files
+
+ set --query files[1] && set --universal $plugin_files_var (string replace -- $source $fisher_path $files | string replace -- ~ \~)
+
+ contains -- $plugin $_fisher_plugins || set --universal --append _fisher_plugins $plugin
+ contains -- $plugin $install_plugins && set --local event install || set --local event update
+
+ printf "%s\n" Installing\ (set_color --bold)$plugin(set_color normal) " "$$plugin_files_var | string replace -- \~ ~
+
+ for file in (string match --regex -- '.+/[^/]+\.fish$' $$plugin_files_var | string replace -- \~ ~)
+ source $file
+ if set --local name (string replace --regex -- '.+conf\.d/([^/]+)\.fish$' '$1' $file)
+ emit {$name}_$event
+ end
+ end
+ end
+
+ command rm -rf $source_plugins
+
+ if set --query _fisher_plugins[1]
+ set --local commit_plugins
+
+ for plugin in $file_plugins
+ contains -- (string lower -- $plugin) (string lower -- $_fisher_plugins) && set --append commit_plugins $plugin
+ end
+
+ for plugin in $_fisher_plugins
+ contains -- (string lower -- $plugin) (string lower -- $commit_plugins) || set --append commit_plugins $plugin
+ end
+
+ printf "%s\n" $commit_plugins >$fish_plugins
+ else
+ set --erase _fisher_plugins
+ command rm -f $fish_plugins
+ end
+
+ set --local total (count $install_plugins) (count $update_plugins) (count $remove_plugins)
+
+ test "$total" != "0 0 0" && echo (string join ", " (
+ test $total[1] = 0 || echo "Installed $total[1]") (
+ test $total[2] = 0 || echo "Updated $total[2]") (
+ test $total[3] = 0 || echo "Removed $total[3]")
+ ) plugin/s
+ case \*
+ echo "fisher: Unknown command: \"$cmd\"" >&2 && return 1
+ end
+end
+
+if ! set --query _fisher_upgraded_to_4_4
+ set --universal _fisher_upgraded_to_4_4
+ if functions --query _fisher_list
+ set --query XDG_DATA_HOME[1] || set --local XDG_DATA_HOME ~/.local/share
+ command rm -rf $XDG_DATA_HOME/fisher
+ functions --erase _fisher_{list,plugin_parse}
+ fisher update >/dev/null 2>/dev/null
+ else
+ for var in (set --names | string match --entire --regex '^_fisher_.+_files$')
+ set $var (string replace -- ~ \~ $$var)
+ end
+ functions --erase _fisher_fish_postexec
+ end
+end
diff --git a/fish/.config/fish/functions/fzf_configure_bindings.fish b/fish/.config/fish/functions/fzf_configure_bindings.fish
new file mode 100644
index 0000000..4b4e7a2
--- /dev/null
+++ b/fish/.config/fish/functions/fzf_configure_bindings.fish
@@ -0,0 +1,46 @@
+# Always installs bindings for insert and default mode for simplicity and b/c it has almost no side-effect
+# https://gitter.im/fish-shell/fish-shell?at=60a55915ee77a74d685fa6b1
+function fzf_configure_bindings --description "Installs the default key bindings for fzf.fish with user overrides passed as options."
+ # no need to install bindings if not in interactive mode or running tests
+ status is-interactive || test "$CI" = true; or return
+
+ set -f options_spec h/help 'directory=?' 'git_log=?' 'git_status=?' 'history=?' 'processes=?' 'variables=?'
+ argparse --max-args=0 --ignore-unknown $options_spec -- $argv 2>/dev/null
+ if test $status -ne 0
+ echo "Invalid option or a positional argument was provided." >&2
+ _fzf_configure_bindings_help
+ return 22
+ else if set --query _flag_help
+ _fzf_configure_bindings_help
+ return
+ else
+ # Initialize with default key sequences and then override or disable them based on flags
+ # index 1 = directory, 2 = git_log, 3 = git_status, 4 = history, 5 = processes, 6 = variables
+ set -f key_sequences \e\cf \e\cl \e\cs \cr \e\cp \cv # \c = control, \e = escape
+ set --query _flag_directory && set key_sequences[1] "$_flag_directory"
+ set --query _flag_git_log && set key_sequences[2] "$_flag_git_log"
+ set --query _flag_git_status && set key_sequences[3] "$_flag_git_status"
+ set --query _flag_history && set key_sequences[4] "$_flag_history"
+ set --query _flag_processes && set key_sequences[5] "$_flag_processes"
+ set --query _flag_variables && set key_sequences[6] "$_flag_variables"
+
+ # If fzf bindings already exists, uninstall it first for a clean slate
+ if functions --query _fzf_uninstall_bindings
+ _fzf_uninstall_bindings
+ end
+
+ for mode in default insert
+ test -n $key_sequences[1] && bind --mode $mode $key_sequences[1] _fzf_search_directory
+ test -n $key_sequences[2] && bind --mode $mode $key_sequences[2] _fzf_search_git_log
+ test -n $key_sequences[3] && bind --mode $mode $key_sequences[3] _fzf_search_git_status
+ test -n $key_sequences[4] && bind --mode $mode $key_sequences[4] _fzf_search_history
+ test -n $key_sequences[5] && bind --mode $mode $key_sequences[5] _fzf_search_processes
+ test -n $key_sequences[6] && bind --mode $mode $key_sequences[6] "$_fzf_search_vars_command"
+ end
+
+ function _fzf_uninstall_bindings --inherit-variable key_sequences
+ bind --erase -- $key_sequences
+ bind --erase --mode insert -- $key_sequences
+ end
+ end
+end
diff --git a/fish/.config/fish/themes/Catppuccin Frappe.theme b/fish/.config/fish/themes/Catppuccin Frappe.theme
new file mode 100644
index 0000000..b4c1994
--- /dev/null
+++ b/fish/.config/fish/themes/Catppuccin Frappe.theme
@@ -0,0 +1,30 @@
+# name: 'Catppuccin Frappé'
+# url: 'https://github.com/catppuccin/fish'
+# preferred_background: 303446
+
+fish_color_normal c6d0f5
+fish_color_command 8caaee
+fish_color_param eebebe
+fish_color_keyword e78284
+fish_color_quote a6d189
+fish_color_redirection f4b8e4
+fish_color_end ef9f76
+fish_color_comment 838ba7
+fish_color_error e78284
+fish_color_gray 737994
+fish_color_selection --background=414559
+fish_color_search_match --background=414559
+fish_color_option a6d189
+fish_color_operator f4b8e4
+fish_color_escape ea999c
+fish_color_autosuggestion 737994
+fish_color_cancel e78284
+fish_color_cwd e5c890
+fish_color_user 81c8be
+fish_color_host 8caaee
+fish_color_host_remote a6d189
+fish_color_status e78284
+fish_pager_color_progress 737994
+fish_pager_color_prefix f4b8e4
+fish_pager_color_completion c6d0f5
+fish_pager_color_description 737994
\ No newline at end of file
diff --git a/fish/.config/fish/themes/Catppuccin Latte.theme b/fish/.config/fish/themes/Catppuccin Latte.theme
new file mode 100644
index 0000000..002dace
--- /dev/null
+++ b/fish/.config/fish/themes/Catppuccin Latte.theme
@@ -0,0 +1,30 @@
+# name: 'Catppuccin Latte'
+# url: 'https://github.com/catppuccin/fish'
+# preferred_background: eff1f5
+
+fish_color_normal 4c4f69
+fish_color_command 1e66f5
+fish_color_param dd7878
+fish_color_keyword d20f39
+fish_color_quote 40a02b
+fish_color_redirection ea76cb
+fish_color_end fe640b
+fish_color_comment 8c8fa1
+fish_color_error d20f39
+fish_color_gray 9ca0b0
+fish_color_selection --background=ccd0da
+fish_color_search_match --background=ccd0da
+fish_color_option 40a02b
+fish_color_operator ea76cb
+fish_color_escape e64553
+fish_color_autosuggestion 9ca0b0
+fish_color_cancel d20f39
+fish_color_cwd df8e1d
+fish_color_user 179299
+fish_color_host 1e66f5
+fish_color_host_remote 40a02b
+fish_color_status d20f39
+fish_pager_color_progress 9ca0b0
+fish_pager_color_prefix ea76cb
+fish_pager_color_completion 4c4f69
+fish_pager_color_description 9ca0b0
\ No newline at end of file
diff --git a/fish/.config/fish/themes/Catppuccin Macchiato.theme b/fish/.config/fish/themes/Catppuccin Macchiato.theme
new file mode 100644
index 0000000..c8be912
--- /dev/null
+++ b/fish/.config/fish/themes/Catppuccin Macchiato.theme
@@ -0,0 +1,30 @@
+# name: 'Catppuccin Macchiato'
+# url: 'https://github.com/catppuccin/fish'
+# preferred_background: 24273a
+
+fish_color_normal cad3f5
+fish_color_command 8aadf4
+fish_color_param f0c6c6
+fish_color_keyword ed8796
+fish_color_quote a6da95
+fish_color_redirection f5bde6
+fish_color_end f5a97f
+fish_color_comment 8087a2
+fish_color_error ed8796
+fish_color_gray 6e738d
+fish_color_selection --background=363a4f
+fish_color_search_match --background=363a4f
+fish_color_option a6da95
+fish_color_operator f5bde6
+fish_color_escape ee99a0
+fish_color_autosuggestion 6e738d
+fish_color_cancel ed8796
+fish_color_cwd eed49f
+fish_color_user 8bd5ca
+fish_color_host 8aadf4
+fish_color_host_remote a6da95
+fish_color_status ed8796
+fish_pager_color_progress 6e738d
+fish_pager_color_prefix f5bde6
+fish_pager_color_completion cad3f5
+fish_pager_color_description 6e738d
\ No newline at end of file
diff --git a/fish/.config/fish/themes/Catppuccin Mocha.theme b/fish/.config/fish/themes/Catppuccin Mocha.theme
new file mode 100644
index 0000000..892a000
--- /dev/null
+++ b/fish/.config/fish/themes/Catppuccin Mocha.theme
@@ -0,0 +1,30 @@
+# name: 'Catppuccin Mocha'
+# url: 'https://github.com/catppuccin/fish'
+# preferred_background: 1e1e2e
+
+fish_color_normal cdd6f4
+fish_color_command 89b4fa
+fish_color_param f2cdcd
+fish_color_keyword f38ba8
+fish_color_quote a6e3a1
+fish_color_redirection f5c2e7
+fish_color_end fab387
+fish_color_comment 7f849c
+fish_color_error f38ba8
+fish_color_gray 6c7086
+fish_color_selection --background=313244
+fish_color_search_match --background=313244
+fish_color_option a6e3a1
+fish_color_operator f5c2e7
+fish_color_escape eba0ac
+fish_color_autosuggestion 6c7086
+fish_color_cancel f38ba8
+fish_color_cwd f9e2af
+fish_color_user 94e2d5
+fish_color_host 89b4fa
+fish_color_host_remote a6e3a1
+fish_color_status f38ba8
+fish_pager_color_progress 6c7086
+fish_pager_color_prefix f5c2e7
+fish_pager_color_completion cdd6f4
+fish_pager_color_description 6c7086
\ No newline at end of file
diff --git a/foot/.config/foot/foot.ini b/foot/.config/foot/foot.ini
new file mode 100644
index 0000000..15223bc
--- /dev/null
+++ b/foot/.config/foot/foot.ini
@@ -0,0 +1,23 @@
+font=Iosevka Nerd Font:size=10
+dpi-aware=yes
+pad=4x2 center
+
+[colors]
+foreground=cdd6f4 # Text
+background=1e1e2e # Base
+regular0=45475a # Surface 1
+regular1=f38ba8 # red
+regular2=a6e3a1 # green
+regular3=f9e2af # yellow
+regular4=89b4fa # blue
+regular5=f5c2e7 # pink
+regular6=94e2d5 # teal
+regular7=bac2de # Subtext 1
+bright0=585b70 # Surface 2
+bright1=f38ba8 # red
+bright2=a6e3a1 # green
+bright3=f9e2af # yellow
+bright4=89b4fa # blue
+bright5=f5c2e7 # pink
+bright6=94e2d5 # teal
+bright7=a6adc8 # Subtext 0
diff --git a/fuzzel/.config/fuzzel/fuzzel.ini b/fuzzel/.config/fuzzel/fuzzel.ini
new file mode 100644
index 0000000..6430102
--- /dev/null
+++ b/fuzzel/.config/fuzzel/fuzzel.ini
@@ -0,0 +1,14 @@
+font=Iosevka Nerd Font:size=8
+dpi-aware=yes
+
+[colors]
+background=1e1e2eff
+text=cdd6f4ff
+match=f5c2e7ff
+selection=45475aff
+selection-text=cdd6f4ff
+border=f5c2e7ff
+
+[border]
+width=2
+radius=0
diff --git a/git/.config/git/config b/git/.config/git/config
new file mode 100644
index 0000000..c6d1fd8
--- /dev/null
+++ b/git/.config/git/config
@@ -0,0 +1,12 @@
+[merge]
+ conflictstyle = diff3
+
+[diff]
+ colorMoved = default
+
+[init]
+ defaultBranch = main
+
+[user]
+ email = williampi103@gmail.com
+ name = William Ball
diff --git a/keyd/default.conf b/keyd/default.conf
new file mode 100644
index 0000000..3a708f6
--- /dev/null
+++ b/keyd/default.conf
@@ -0,0 +1,11 @@
+[ids]
+
+*
+
+[main]
+
+# Maps capslock to escape when pressed and control when held.
+capslock = overload(control, esc)
+
+# Remaps the escape key to capslock
+esc = capslock
diff --git a/kitty/.config/kitty/current-theme.conf b/kitty/.config/kitty/current-theme.conf
new file mode 100644
index 0000000..2533db7
--- /dev/null
+++ b/kitty/.config/kitty/current-theme.conf
@@ -0,0 +1,80 @@
+# vim:ft=kitty
+
+## name: Catppuccin-Mocha
+## author: Pocco81 (https://github.com/Pocco81)
+## license: MIT
+## upstream: https://github.com/catppuccin/kitty/blob/main/mocha.conf
+## blurb: Soothing pastel theme for the high-spirited!
+
+
+
+# The basic colors
+foreground #CDD6F4
+background #1E1E2E
+selection_foreground #1E1E2E
+selection_background #F5E0DC
+
+# Cursor colors
+cursor #F5E0DC
+cursor_text_color #1E1E2E
+
+# URL underline color when hovering with mouse
+url_color #F5E0DC
+
+# Kitty window border colors
+active_border_color #B4BEFE
+inactive_border_color #6C7086
+bell_border_color #F9E2AF
+
+# OS Window titlebar colors
+wayland_titlebar_color system
+macos_titlebar_color system
+
+# Tab bar colors
+active_tab_foreground #11111B
+active_tab_background #CBA6F7
+inactive_tab_foreground #CDD6F4
+inactive_tab_background #181825
+tab_bar_background #11111B
+
+# Colors for marks (marked text in the terminal)
+mark1_foreground #1E1E2E
+mark1_background #B4BEFE
+mark2_foreground #1E1E2E
+mark2_background #CBA6F7
+mark3_foreground #1E1E2E
+mark3_background #74C7EC
+
+# The 16 terminal colors
+
+# black
+color0 #45475A
+color8 #585B70
+
+# red
+color1 #F38BA8
+color9 #F38BA8
+
+# green
+color2 #A6E3A1
+color10 #A6E3A1
+
+# yellow
+color3 #F9E2AF
+color11 #F9E2AF
+
+# blue
+color4 #89B4FA
+color12 #89B4FA
+
+# magenta
+color5 #F5C2E7
+color13 #F5C2E7
+
+# cyan
+color6 #94E2D5
+color14 #94E2D5
+
+# white
+color7 #BAC2DE
+color15 #A6ADC8
diff --git a/kitty/.config/kitty/kitty.conf b/kitty/.config/kitty/kitty.conf
new file mode 100644
index 0000000..15eba1d
--- /dev/null
+++ b/kitty/.config/kitty/kitty.conf
@@ -0,0 +1,13 @@
+font_family iosevka Nerd Font
+font_size 15.0
+
+enable_audio_bell no
+visual_bell_duration 0.0
+
+hide_window_decorations
+
+
+# BEGIN_KITTY_THEME
+# Catppuccin-Mocha
+include current-theme.conf
+# END_KITTY_THEME
diff --git a/mako/.config/mako/config b/mako/.config/mako/config
new file mode 100644
index 0000000..273bbf0
--- /dev/null
+++ b/mako/.config/mako/config
@@ -0,0 +1,12 @@
+font=Iosevka Nerd Font
+default-timeout=5000
+
+# Colors
+
+background-color=#1e1e2e
+text-color=#cdd6f4
+border-color=#f5c2e7
+progress-color=over #313244
+
+[urgency=high]
+border-color=#fab387
diff --git a/misc/.config/gtk-3.0/bookmarks b/misc/.config/gtk-3.0/bookmarks
new file mode 100644
index 0000000..3e12362
--- /dev/null
+++ b/misc/.config/gtk-3.0/bookmarks
@@ -0,0 +1,2 @@
+file:///home/wball/Nextcloud/Books
+file:///home/wball/Nextcloud
diff --git a/misc/.config/gtk-3.0/gtk.css b/misc/.config/gtk-3.0/gtk.css
new file mode 100644
index 0000000..fa476ec
--- /dev/null
+++ b/misc/.config/gtk-3.0/gtk.css
@@ -0,0 +1,26 @@
+/* No (default) title bar on wayland */
+headerbar.default-decoration {
+ /* You may need to tweak these values depending on your GTK theme */
+ margin-bottom: 50px;
+ margin-top: -100px;
+
+ background: transparent;
+ padding: 0;
+ border: 0;
+ min-height: 0;
+ font-size: 0;
+ box-shadow: none;
+}
+
+/* rm -rf window shadows */
+window.csd, /* gtk4? */
+window.csd decoration { /* gtk3 */
+ box-shadow: none;
+}
+
+/* /** WARNING: CAN BREAK THINGS **/ */
+/* /** hiding title bar **/ */
+/* headerbar.default-decoration { */
+/* margin-bottom: 50px; */
+/* margin-top: -100px; */
+/* } */
diff --git a/misc/.config/gtk-3.0/settings.ini b/misc/.config/gtk-3.0/settings.ini
new file mode 100644
index 0000000..c3e965a
--- /dev/null
+++ b/misc/.config/gtk-3.0/settings.ini
@@ -0,0 +1,2 @@
+[Settings]
+gtk-dialogs-use-header=false
diff --git a/misc/.config/gtk-4.0/bookmarks b/misc/.config/gtk-4.0/bookmarks
new file mode 100644
index 0000000..3e12362
--- /dev/null
+++ b/misc/.config/gtk-4.0/bookmarks
@@ -0,0 +1,2 @@
+file:///home/wball/Nextcloud/Books
+file:///home/wball/Nextcloud
diff --git a/misc/.config/gtk-4.0/gtk.css b/misc/.config/gtk-4.0/gtk.css
new file mode 100644
index 0000000..97df90c
--- /dev/null
+++ b/misc/.config/gtk-4.0/gtk.css
@@ -0,0 +1,26 @@
+/* No (default) title bar on wayland */
+headerbar.default-decoration {
+ /* You may need to tweak these values depending on your GTK theme */
+ margin-bottom: 50px;
+ margin-top: -100px;
+
+ background: transparent;
+ padding: 0;
+ border: 0;
+ min-height: 0;
+ font-size: 0;
+ box-shadow: none;
+}
+
+/* rm -rf window shadows */
+window.csd, /* gtk4? */
+window.csd decoration { /* gtk3 */
+ box-shadow: none;
+}
+
+/** WARNING: CAN BREAK THINGS **/
+/** hiding title bar **/
+/* headerbar.default-decoration { */
+/* margin-bottom: 50px; */
+/* margin-top: -100px; */
+/* } */
diff --git a/misc/.config/gtk-4.0/settings.ini b/misc/.config/gtk-4.0/settings.ini
new file mode 100644
index 0000000..c3e965a
--- /dev/null
+++ b/misc/.config/gtk-4.0/settings.ini
@@ -0,0 +1,2 @@
+[Settings]
+gtk-dialogs-use-header=false
diff --git a/misc/.config/macchina/macchina.toml b/misc/.config/macchina/macchina.toml
new file mode 100644
index 0000000..99e6e83
--- /dev/null
+++ b/misc/.config/macchina/macchina.toml
@@ -0,0 +1 @@
+show = ["Kernel", "Distribution", "Packages", "Terminal", "WindowManager", "Shell", "Uptime"]
diff --git a/misc/.config/starship.toml b/misc/.config/starship.toml
new file mode 100644
index 0000000..93c8c53
--- /dev/null
+++ b/misc/.config/starship.toml
@@ -0,0 +1,110 @@
+add_newline = false
+palette = "catppuccin_mocha"
+
+[character]
+success_symbol = "[λ](bold green)"
+error_symbol = "[λ](bold red)"
+vicmd_symbol = "[λ](bold yellow)"
+
+[line_break]
+disabled = true
+
+[haskell]
+disabled = true
+
+[aws]
+disabled = true
+
+[crystal]
+disabled = true
+
+[dotnet]
+disabled = true
+
+[elixir]
+disabled = true
+
+[erlang]
+disabled = true
+
+[golang]
+disabled = true
+
+[java]
+disabled = true
+
+[julia]
+disabled = true
+
+[lua]
+disabled = true
+
+[nim]
+disabled = true
+
+[nix_shell]
+disabled = true
+
+[nodejs]
+disabled = true
+
+[package]
+disabled = true
+
+[ocaml]
+disabled = true
+
+[php]
+disabled = true
+
+[python]
+disabled = true
+
+[ruby]
+disabled = true
+
+[rust]
+disabled = true
+
+[singularity]
+disabled = true
+
+[terraform]
+disabled = true
+
+[zig]
+disabled = true
+
+[purescript]
+disabled = true
+
+[vlang]
+disabled = true
+
+[palettes.catppuccin_mocha]
+rosewater = "#f5e0dc"
+flamingo = "#f2cdcd"
+pink = "#f5c2e7"
+mauve = "#cba6f7"
+red = "#f38ba8"
+maroon = "#eba0ac"
+peach = "#fab387"
+yellow = "#f9e2af"
+green = "#a6e3a1"
+teal = "#94e2d5"
+sky = "#89dceb"
+sapphire = "#74c7ec"
+blue = "#89b4fa"
+lavender = "#b4befe"
+text = "#cdd6f4"
+subtext1 = "#bac2de"
+subtext0 = "#a6adc8"
+overlay2 = "#9399b2"
+overlay1 = "#7f849c"
+overlay0 = "#6c7086"
+surface2 = "#585b70"
+surface1 = "#45475a"
+surface0 = "#313244"
+base = "#1e1e2e"
+mantle = "#181825"
+crust = "#11111b"
diff --git a/misc/.config/wallpaper.png b/misc/.config/wallpaper.png
new file mode 100644
index 0000000..445ba3a
Binary files /dev/null and b/misc/.config/wallpaper.png differ
diff --git a/nvim-vimscript/.config/nvim/init.vim b/nvim-vimscript/.config/nvim/init.vim
new file mode 100644
index 0000000..01868a6
--- /dev/null
+++ b/nvim-vimscript/.config/nvim/init.vim
@@ -0,0 +1,125 @@
+set number
+set relativenumber
+
+set tabstop=4
+set shiftwidth=4
+set expandtab
+set autoindent
+
+set ignorecase
+set smartcase
+
+set cursorline
+
+set termguicolors
+set signcolumn=yes
+
+set conceallevel=2
+
+set breakindent
+set linebreak
+
+set clipboard+=unnamedplus
+
+let mapleader=" "
+let maplocalleader=" "
+
+augroup terminal
+ autocmd TermOpen * setlocal nonumber norelativenumber
+augroup END
+
+nnoremap j gj
+nnoremap k gk
+vnoremap j gj
+vnoremap k gk
+
+nnoremap nh :nohl
+
+call plug#begin()
+
+Plug 'junegunn/fzf'
+Plug 'junegunn/fzf.vim'
+Plug 'catppuccin/nvim', { 'as': 'catppuccin' }
+Plug 'tpope/vim-surround'
+Plug 'tpope/vim-repeat'
+Plug 'tpope/vim-commentary'
+
+Plug 'nvim-lua/plenary.nvim'
+Plug 'NeogitOrg/neogit'
+
+Plug 'dense-analysis/ale'
+
+Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
+
+Plug 'folke/which-key.nvim'
+
+Plug 'jez/vim-better-sml'
+
+Plug 'vifm/vifm.vim'
+
+Plug 'numToStr/Navigator.nvim'
+
+Plug 'stevearc/conform.nvim'
+
+call plug#end()
+
+lua require('neogit').setup({})
+
+colorscheme catppuccin-mocha
+
+nnoremap fg :GFiles
+nnoremap ff :Files
+nnoremap fb :Buffers
+nnoremap fr :Rg
+nnoremap fh :Helptags
+
+nnoremap (ale_previous_wrap)
+nnoremap (ale_next_wrap)
+nnoremap gD :ALEGoToDefinition
+nnoremap gI :ALEGoToImplementation
+nnoremap gr :ALEFindReferences
+nnoremap K :ALEHover
+nnoremap lr :ALERename
+nnoremap la :ALECodeAction
+
+let g:ale_lint_on_text_changed = 'never'
+let g:ale_lint_on_insert_leave = 0
+let g:ale_lint_on_enter = 0
+let g:ale_use_neovim_diagnostics_api = 1
+
+let g:deoplete#enable_at_startup = 1
+call deoplete#custom#option('sources', {
+\ '_': ['ale'],
+\})
+call deoplete#custom#option({
+ \ 'auto_refresh_delay': 10,
+ \ 'skip_multibyte': v:true,
+ \ 'auto_preview': v:true,
+ \ })
+call deoplete#custom#option('num_processes', 1)
+
+lua require('Navigator').setup({})
+
+nnoremap NavigatorLeft
+nnoremap NavigatorRight
+nnoremap NavigatorUp
+nnoremap NavigatorDown
+nnoremap NavigatorPrevious
+
+tnoremap NavigatorLeft
+tnoremap NavigatorRight
+tnoremap NavigatorUp
+tnoremap NavigatorDown
+tnoremap NavigatorPrevious
+
+lua << EOF
+require('conform').setup({
+ formatters_by_ft = {
+ sml = { "smlfmt" },
+ },
+ format_on_save = {
+ timeout_ms = 500,
+ lsp_format = "fallback",
+ },
+})
+EOF
diff --git a/nvim/.config/nvim/init.lua b/nvim/.config/nvim/init.lua
new file mode 100644
index 0000000..c54f6fd
--- /dev/null
+++ b/nvim/.config/nvim/init.lua
@@ -0,0 +1,4 @@
+require("wball.core.options")
+require("wball.core.keymaps")
+
+require("wball.lazy")
diff --git a/nvim/.config/nvim/lua/wball/core/keymaps.lua b/nvim/.config/nvim/lua/wball/core/keymaps.lua
new file mode 100644
index 0000000..5accc5f
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/core/keymaps.lua
@@ -0,0 +1,26 @@
+local keymap = vim.keymap
+
+-- set leader key to space
+vim.g.mapleader = ' '
+vim.g.maplocalleader = ' '
+
+-- let move around windows
+-- keymap.set('n', '', 'h')
+-- keymap.set('n', '', 'j')
+-- keymap.set('n', '', 'k')
+-- keymap.set('n', '', 'l')
+
+-- same with terminals
+-- keymap.set('t', '', 'h')
+-- keymap.set('t', '', 'j')
+-- keymap.set('t', '', 'k')
+-- keymap.set('t', '', 'l')
+
+-- navigate by visual lines
+keymap.set('n', 'j', 'gj')
+keymap.set('n', 'k', 'gk')
+keymap.set('v', 'j', 'gj')
+keymap.set('v', 'k', 'gk')
+
+-- nohl
+keymap.set("n", "nh", ":nohl", { desc = "Clear highlight" })
diff --git a/nvim/.config/nvim/lua/wball/core/options.lua b/nvim/.config/nvim/lua/wball/core/options.lua
new file mode 100644
index 0000000..81cbfb0
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/core/options.lua
@@ -0,0 +1,34 @@
+local opt = vim.opt
+
+vim.g.netrw_liststyle = 3
+
+opt.relativenumber = true
+opt.number = true
+
+opt.tabstop = 4
+opt.shiftwidth = 4
+opt.expandtab = true
+opt.autoindent = true
+
+opt.ignorecase = true
+opt.smartcase = true
+
+opt.cursorline = true
+
+opt.termguicolors = true
+opt.signcolumn = "yes"
+
+opt.clipboard:append("unnamedplus")
+
+opt.conceallevel = 2
+
+opt.breakindent = true
+opt.linebreak = true
+
+vim.api.nvim_create_autocmd("TermOpen", {
+ pattern = "*",
+ callback = function()
+ vim.opt.number = false
+ vim.opt.relativenumber = false
+ end
+})
diff --git a/nvim/.config/nvim/lua/wball/lazy.lua b/nvim/.config/nvim/lua/wball/lazy.lua
new file mode 100644
index 0000000..de7be51
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/lazy.lua
@@ -0,0 +1,25 @@
+local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
+if not vim.loop.fs_stat(lazypath) then
+ vim.fn.system({
+ "git",
+ "clone",
+ "--filter=blob:none",
+ "https://github.com/folke/lazy.nvim.git",
+ "--branch=stable",
+ lazypath,
+ })
+end
+
+vim.opt.rtp:prepend(lazypath)
+
+require("lazy").setup({
+ { import = "wball.plugins" },
+ { import = "wball.plugins.lsp" },
+ checker = {
+ enable = true,
+ notify = false,
+ },
+ change_detection = {
+ notify = false,
+ },
+})
diff --git a/nvim/.config/nvim/lua/wball/plugins/autopairs.lua b/nvim/.config/nvim/lua/wball/plugins/autopairs.lua
new file mode 100644
index 0000000..aeff2e1
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/autopairs.lua
@@ -0,0 +1,21 @@
+return {
+ "windwp/nvim-autopairs",
+ event = { "InsertEnter" },
+ dependencies = {
+ "hrsh7th/nvim-cmp",
+ },
+ config = function()
+ local autopairs = require("nvim-autopairs")
+
+ autopairs.setup({ check_ts = true })
+
+ -- remove single-quote rule for some languages
+ autopairs.get_rule("'")[1].not_filetypes = { "scheme", "lisp", "ocaml", "sml", "rust" }
+
+ local cmp_autopairs = require("nvim-autopairs.completion.cmp")
+
+ local cmp = require("cmp")
+
+ cmp.event:on("confirm_done", cmp_autopairs.on_confirm_done())
+ end
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/colorscheme.lua b/nvim/.config/nvim/lua/wball/plugins/colorscheme.lua
new file mode 100644
index 0000000..239dec6
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/colorscheme.lua
@@ -0,0 +1,12 @@
+return {
+ "catppuccin/nvim",
+ name = "catppuccin",
+ priority = 1000,
+ config = function()
+ require("catppuccin").setup({
+ transparent_background = true,
+ term_colors = true
+ })
+ vim.cmd.colorscheme("catppuccin")
+ end
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/comment.lua b/nvim/.config/nvim/lua/wball/plugins/comment.lua
new file mode 100644
index 0000000..c7d56e2
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/comment.lua
@@ -0,0 +1,12 @@
+return {
+ "numToStr/Comment.nvim",
+ event = { "BufReadPre", "BufNewFile" },
+ dependencies = {
+ "JoosepAlviste/nvim-ts-context-commentstring",
+ },
+ config = function()
+ require("Comment").setup({
+ pre_hook = require("ts_context_commentstring.integrations.comment_nvim").create_pre_hook(),
+ })
+ end
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/dressing.lua b/nvim/.config/nvim/lua/wball/plugins/dressing.lua
new file mode 100644
index 0000000..32df64b
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/dressing.lua
@@ -0,0 +1,4 @@
+return {
+ "stevearc/dressing.nvim",
+ event = "VeryLazy",
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/init.lua b/nvim/.config/nvim/lua/wball/plugins/init.lua
new file mode 100644
index 0000000..d2c1874
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/init.lua
@@ -0,0 +1,3 @@
+return {
+ "nvim-lua/plenary.nvim"
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/isabelle.lua b/nvim/.config/nvim/lua/wball/plugins/isabelle.lua
new file mode 100644
index 0000000..a24d9f6
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/isabelle.lua
@@ -0,0 +1,18 @@
+return {
+ {
+ "Treeniks/isabelle-syn.nvim",
+ ft = "isabelle",
+ },
+ {
+ "Treeniks/isabelle-lsp.nvim",
+ ft = "isabelle",
+ config = function()
+ require('isabelle-lsp').setup({
+ unicode_symbols = true,
+ isabelle_path = '/home/wball/repos/isabelle-emacs/bin/isabelle',
+ })
+
+ require('lspconfig').isabelle.setup({})
+ end
+ }
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/languages.lua b/nvim/.config/nvim/lua/wball/plugins/languages.lua
new file mode 100644
index 0000000..0e9b417
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/languages.lua
@@ -0,0 +1,11 @@
+return {
+ {
+ "whonore/Coqtail"
+ },
+ {
+ "https://git.sr.ht/~sircmpwn/hare.vim"
+ },
+ {
+ "https://git.sr.ht/~torresjrjr/vim-haredoc"
+ },
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/lean.lua b/nvim/.config/nvim/lua/wball/plugins/lean.lua
new file mode 100644
index 0000000..245c0f7
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/lean.lua
@@ -0,0 +1,16 @@
+return {
+ {
+ 'Julian/lean.nvim',
+ event = { 'BufReadPre *.lean', 'BufNewFile *.lean' },
+
+ dependencies = {
+ 'neovim/nvim-lspconfig',
+ 'nvim-lua/plenary.nvim',
+ },
+
+ opts = {
+ lsp = {},
+ mappings = true,
+ }
+ }
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/lsp/coq.lua b/nvim/.config/nvim/lua/wball/plugins/lsp/coq.lua
new file mode 100644
index 0000000..e23a53f
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/lsp/coq.lua
@@ -0,0 +1,8 @@
+return {
+ 'tomtomjhj/coq-lsp.nvim',
+ config = function()
+ vim.g['loaded_coqtail'] = 1
+ vim.g['coqtail#supported'] = 0
+ require('coq-lsp').setup()
+ end
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/lsp/haskell.lua b/nvim/.config/nvim/lua/wball/plugins/lsp/haskell.lua
new file mode 100644
index 0000000..21e0245
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/lsp/haskell.lua
@@ -0,0 +1,5 @@
+return {
+ 'mrcjkb/haskell-tools.nvim',
+ version = '^3',
+ ft = { 'haskell', 'lhaskell', 'cabal', 'cabalproject' },
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/lsp/lspconfig.lua b/nvim/.config/nvim/lua/wball/plugins/lsp/lspconfig.lua
new file mode 100644
index 0000000..bce7dc9
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/lsp/lspconfig.lua
@@ -0,0 +1,81 @@
+return {
+ "neovim/nvim-lspconfig",
+ event = { "BufReadPre", "BufNewFile" },
+ dependencies = {
+ "hrsh7th/cmp-nvim-lsp",
+ { "antosha417/nvim-lsp-file-operations", config = true },
+ { "folke/neodev.nvim", opts = {} },
+ },
+ config = function()
+ local lspconfig = require("lspconfig")
+ local cmp_nvim_lsp = require("cmp_nvim_lsp")
+
+ local keymap = vim.keymap
+
+ lspconfig.rust_analyzer.setup({})
+ lspconfig.clangd.setup({})
+ lspconfig.ocamllsp.setup({})
+ lspconfig.millet.setup({
+ cmd = { "millet-ls" }
+ })
+
+ vim.api.nvim_create_autocmd("LspAttach", {
+ group = vim.api.nvim_create_augroup("UserLspConfig", {}),
+ callback = function(ev)
+ local opts = { buffer = ev.buf, silent = true }
+
+ opts.desc = "Show LSP references"
+ keymap.set("n", "gR", "Telescope lsp_references", opts)
+
+ opts.desc = "Go to declaration"
+ keymap.set("n", "gD", vim.lsp.buf.declaration, opts)
+
+ opts.desc = "Show LSP definitions"
+ keymap.set("n", "gd", "Telescope lsp_definitions", opts)
+
+ opts.desc = "Show LSP implementations"
+ keymap.set("n", "gi", "Telescope lsp_implementations", opts)
+
+ opts.desc = "Show LSP type definitions"
+ keymap.set("n", "gt", "Telescope lsp_type_definitions", opts)
+
+ opts.desc = "See available code actions"
+ keymap.set({ "n", "v" }, "la", vim.lsp.buf.code_action, opts)
+
+ opts.desc = "Smart rename"
+ keymap.set("n", "lr", vim.lsp.buf.rename, opts)
+
+ opts.desc = "Format"
+ keymap.set("n", "lf", vim.lsp.buf.format, opts)
+
+ opts.desc = "Show buffer diagnostics"
+ keymap.set("n", "ld", "Telescope diagnostics bufnr=0", opts)
+
+ opts.desc = "Show line diagnostics"
+ keymap.set("n", "le", vim.diagnostic.open_float, opts)
+
+ opts.desc = "Go to previous diagnostic"
+ keymap.set("n", "[d", vim.diagnostic.goto_prev, opts)
+
+ opts.desc = "Go to next diagnostic"
+ keymap.set("n", "]d", vim.diagnostic.goto_next, opts)
+
+ opts.desc = "LSP Hover"
+ keymap.set("n", "K", vim.lsp.buf.hover, opts)
+
+ opts.desc = "Restart LSP"
+ keymap.set("n", "ls", ":LspRestart", opts)
+ end,
+ })
+
+ vim.lsp.handlers['textDocument/hover'] = vim.lsp.with(vim.lsp.handlers.hover, { border = "single" })
+
+ vim.diagnostic.config({ virtual_text = true })
+ -- local signs = { Error = " ", Warn = " ", Hint = " ", Info = " " }
+ -- for type, icon in pairs(signs) do
+ -- local hl = "DiagnosticSign" .. type
+ -- vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = "" })
+ -- end
+
+ end,
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/lsp/miscutils.lua b/nvim/.config/nvim/lua/wball/plugins/lsp/miscutils.lua
new file mode 100644
index 0000000..6c4cf77
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/lsp/miscutils.lua
@@ -0,0 +1,6 @@
+return {
+ {
+ "j-hui/fidget.nvim",
+ config = true,
+ },
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/lsp/rust.lua b/nvim/.config/nvim/lua/wball/plugins/lsp/rust.lua
new file mode 100644
index 0000000..1837ea6
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/lsp/rust.lua
@@ -0,0 +1,4 @@
+return {
+ 'vxpm/ferris.nvim',
+ config = true,
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/neogit.lua b/nvim/.config/nvim/lua/wball/plugins/neogit.lua
new file mode 100644
index 0000000..19b7045
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/neogit.lua
@@ -0,0 +1,22 @@
+return {
+ {
+ "NeogitOrg/neogit",
+ dependencies = {
+ "nvim-lua/plenary.nvim",
+ "sindrets/diffview.nvim",
+ "nvim-telescope/telescope.nvim",
+ },
+ config = function()
+ local neogit = require("neogit")
+ vim.keymap.set("n",
+ "go",
+ function()
+ neogit.open({ kind="auto" })
+ end,
+ { desc = "Open Neogit in new split" })
+ vim.keymap.set("n", "gg", neogit.open, { desc = "Open Neogit in new tab "})
+
+ neogit.setup()
+ end
+ }
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/nvim-cmp.lua b/nvim/.config/nvim/lua/wball/plugins/nvim-cmp.lua
new file mode 100644
index 0000000..7ea2efd
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/nvim-cmp.lua
@@ -0,0 +1,57 @@
+return {
+ "hrsh7th/nvim-cmp",
+ event = "InsertEnter",
+ dependencies = {
+ "hrsh7th/cmp-buffer",
+ "hrsh7th/cmp-path",
+ {
+ "L3MON4D3/LuaSnip",
+ version = "v2.*",
+ },
+ "saadparwaiz1/cmp_luasnip",
+ "rafamadriz/friendly-snippets",
+ "onsails/lspkind.nvim",
+ },
+ config = function()
+ local cmp = require("cmp")
+
+ local luasnip = require("luasnip")
+
+ local lspkind = require("lspkind")
+
+ require("luasnip.loaders.from_vscode").lazy_load()
+
+ cmp.setup({
+ completion = {
+ completeopt = "menu,menuone,preview,noselect",
+ },
+ snippet = {
+ expand = function(args)
+ luasnip.lsp_expand(args.body)
+ end,
+ },
+ mapping = cmp.mapping.preset.insert({
+ [""] = cmp.mapping.select_prev_item(),
+ [""] = cmp.mapping.select_next_item(),
+ [""] = cmp.mapping.scroll_docs(-4),
+ [""] = cmp.mapping.scroll_docs(4),
+ [""] = cmp.mapping.complete(),
+ [""] = cmp.mapping.abort(),
+ [""] = cmp.mapping.confirm({ select = false }),
+ }),
+ sources = cmp.config.sources({
+ { name = "nvim_lsp" },
+ { name = "luasnip" },
+ { name = "buffer" },
+ { name = "path" },
+ }),
+
+ formatting = {
+ format = lspkind.cmp_format({
+ maxwidth = 50,
+ ellipsis_char = "...",
+ }),
+ },
+ })
+ end,
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/nvim-tree.lua b/nvim/.config/nvim/lua/wball/plugins/nvim-tree.lua
new file mode 100644
index 0000000..907dc47
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/nvim-tree.lua
@@ -0,0 +1,17 @@
+return {
+ "nvim-tree/nvim-tree.lua",
+ dependencies = "nvim-tree/nvim-web-devicons",
+ config = function()
+ local nvimtree = require("nvim-tree")
+
+ vim.g.loaded_netrw = 1
+ vim.g.loaded_netrwPlugin = 1
+
+ nvimtree.setup()
+
+ vim.keymap.set("n", "ee", "NvimTreeToggle", { desc = "Toggle NvimTree" })
+ vim.keymap.set("n", "ef", "NvimTreeFindFileToggle", { desc = "Toggle NvimTree on current file" })
+ vim.keymap.set("n", "ec", "NvimTreeCollapse", { desc = "Collapse NvimTree" })
+ vim.keymap.set("n", "er", "NvimTreeRefresh", { desc = "Refresh NvimTree" })
+ end
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/sml.lua b/nvim/.config/nvim/lua/wball/plugins/sml.lua
new file mode 100644
index 0000000..3fb70be
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/sml.lua
@@ -0,0 +1,5 @@
+return {
+ {
+ 'jez/vim-better-sml'
+ }
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/surround.lua b/nvim/.config/nvim/lua/wball/plugins/surround.lua
new file mode 100644
index 0000000..153dec8
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/surround.lua
@@ -0,0 +1,6 @@
+return {
+ "kylechui/nvim-surround",
+ event = { "BufReadPre", "BufNewFile" },
+ version = "*",
+ config = true,
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/telescope.lua b/nvim/.config/nvim/lua/wball/plugins/telescope.lua
new file mode 100644
index 0000000..b60cae5
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/telescope.lua
@@ -0,0 +1,36 @@
+return {
+ "nvim-telescope/telescope.nvim",
+ branch = "0.1.x",
+ dependencies = {
+ "nvim-lua/plenary.nvim",
+ { "nvim-telescope/telescope-fzf-native.nvim", build = "make" },
+ "nvim-tree/nvim-web-devicons",
+ "folke/todo-comments.nvim",
+ },
+ config = function()
+ local telescope = require("telescope")
+ local actions = require("telescope.actions")
+
+ telescope.setup()
+
+ telescope.load_extension("fzf")
+
+
+ local builtin = require('telescope.builtin')
+ vim.keymap.set("n", "ff", builtin.find_files, { desc = "Fuzzy find files in cwd" })
+ vim.keymap.set("n", "fr", builtin.registers, { desc = "Fuzzy find registers" })
+ vim.keymap.set("n", "fb", builtin.buffers, { desc = "Fuzzy find buffers" })
+ vim.keymap.set("n", "fl", builtin.live_grep, { desc = "Live grep" })
+ vim.keymap.set("n", "fs", builtin.grep_string, { desc = "Grep string under cursor in cwd" })
+ vim.keymap.set("n", "ftt", builtin.tags, { desc = "Fuzzy find tags" })
+ vim.keymap.set("n", "fgf", builtin.git_files, { desc = "Fuzzy search git files" })
+ vim.keymap.set("n", "fgc", builtin.git_commits, { desc = "Fuzzy search git commits" })
+ vim.keymap.set("n", "ftb", builtin.builtin, { desc = "Search telescope builtins" })
+ vim.keymap.set("n", "fc", builtin.commands, { desc = "Fuzzy search commands" })
+ vim.keymap.set("n", "fq", builtin.quickfix, { desc = "Search quickfix list" })
+ vim.keymap.set("n", "fl", builtin.loclist, { desc = "Search loclist" })
+ vim.keymap.set("n", "fh", builtin.help_tags, { desc = "Search help tags" })
+ vim.keymap.set("n", "fm", builtin.marks, { desc = "Search marks" })
+ vim.keymap.set("n", "fd", "TodoTelescope", { desc = "Find todos" })
+ end
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/terminal.lua b/nvim/.config/nvim/lua/wball/plugins/terminal.lua
new file mode 100644
index 0000000..7de717f
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/terminal.lua
@@ -0,0 +1,12 @@
+return {
+ {
+ "akinsho/toggleterm.nvim",
+ opts = {
+ open_mapping = [[]],
+ direction = "horizontal",
+ insert_mappings = true,
+ start_in_insert = true,
+ },
+ keys = [[]],
+ },
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/tmux.lua b/nvim/.config/nvim/lua/wball/plugins/tmux.lua
new file mode 100644
index 0000000..77a244c
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/tmux.lua
@@ -0,0 +1,11 @@
+return {
+ "numToStr/Navigator.nvim",
+ config = function()
+ require('Navigator').setup()
+ vim.keymap.set({'n', 't'}, '', 'NavigatorLeft')
+ vim.keymap.set({'n', 't'}, '', 'NavigatorRight')
+ vim.keymap.set({'n', 't'}, '', 'NavigatorUp')
+ vim.keymap.set({'n', 't'}, '', 'NavigatorDown')
+ vim.keymap.set({'n', 't'}, '', 'NavigatorPrevious')
+ end,
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/todo-comments.lua b/nvim/.config/nvim/lua/wball/plugins/todo-comments.lua
new file mode 100644
index 0000000..6bdf756
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/todo-comments.lua
@@ -0,0 +1,18 @@
+return {
+ "folke/todo-comments.nvim",
+ event = { "BufReadPre", "BufNewFile" },
+ dependencies = { "nvim-lua/plenary.nvim" },
+ config = function()
+ local todo_comments = require("todo-comments")
+
+ vim.keymap.set("n", "]t", function()
+ todo_comments.jump_next()
+ end, { desc = "Next todo comment" })
+
+ vim.keymap.set("n", "[t", function()
+ todo_comments.jump_prev()
+ end, { desc = "Previous todo comment" })
+
+ todo_comments.setup()
+ end
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/treesitter.lua b/nvim/.config/nvim/lua/wball/plugins/treesitter.lua
new file mode 100644
index 0000000..e3286cc
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/treesitter.lua
@@ -0,0 +1,30 @@
+return {
+ "nvim-treesitter/nvim-treesitter",
+ event = { "BufReadPre", "BufNewFile" },
+ build = ":TSUpdate",
+ dependencies = {
+ "HiPhish/rainbow-delimiters.nvim"
+ },
+ config = function()
+ local treesitter = require('nvim-treesitter.configs')
+ treesitter.setup({
+ highlight = {
+ enable = true,
+ disable = { "latex" },
+ },
+ indent = { enable = true },
+
+ ensure_installed = "all",
+
+ incremental_selection = {
+ enable = true,
+ keymaps = {
+ init_selection = "",
+ node_incremental = "",
+ scope_incremental = false,
+ node_decremental = "",
+ }
+ }
+ })
+ end
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/vifm.lua b/nvim/.config/nvim/lua/wball/plugins/vifm.lua
new file mode 100644
index 0000000..becc05f
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/vifm.lua
@@ -0,0 +1,3 @@
+return {
+ "vifm/vifm.vim",
+}
diff --git a/nvim/.config/nvim/lua/wball/plugins/which-key.lua b/nvim/.config/nvim/lua/wball/plugins/which-key.lua
new file mode 100644
index 0000000..5c94080
--- /dev/null
+++ b/nvim/.config/nvim/lua/wball/plugins/which-key.lua
@@ -0,0 +1,9 @@
+return {
+ "folke/which-key.nvim",
+ event = "VeryLazy",
+ init = function()
+ vim.o.timeout = true
+ vim.o.timeoutlen = 500
+ end,
+ opts = {}
+}
diff --git a/pianobar/.config/pianobar/change_station.sh b/pianobar/.config/pianobar/change_station.sh
new file mode 100755
index 0000000..fb01240
--- /dev/null
+++ b/pianobar/.config/pianobar/change_station.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+choice=$(cat "$HOME/.config/pianobar/info" | grep "station[0-9]" | cut -d "=" -f 2 | fuzzel --dmenu)
+
+[ -z "$choice" ] || echo "s$(cat "$HOME/.config/pianobar/info" | grep "$choice" | cut -d "=" -f 1 | sed "s/station//")" > "$HOME/.config/pianobar/ctl"
diff --git a/pianobar/.config/pianobar/config b/pianobar/.config/pianobar/config
new file mode 100644
index 0000000..fac8f5e
--- /dev/null
+++ b/pianobar/.config/pianobar/config
@@ -0,0 +1,3 @@
+user = william.ball103@proton.me
+password_command = gpg --decrypt ~/.config/pianobar/password.gpg
+event_command = ~/.config/pianobar/event_command.sh
diff --git a/pianobar/.config/pianobar/display_info.sh b/pianobar/.config/pianobar/display_info.sh
new file mode 100755
index 0000000..5c87d6d
--- /dev/null
+++ b/pianobar/.config/pianobar/display_info.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+while read L; do
+ k="`echo "$L" | cut -d '=' -f 1`"
+ v="`echo "$L" | cut -d '=' -f 2`"
+ export "$k=$v"
+done < <(grep -e '^\(title\|artist\|album\|stationName\|songStationName\|pRet\|pRetStr\|wRet\|wRetStr\|songDuration\|songPlayed\|rating\|coverArt\|stationCount\|station[0-9]*\)=' "$HOME/.config/pianobar/info")
+
+curl "$coverArt" --silent --output "$HOME/.config/pianobar/album.jpg"
+
+notify-send "Now playing:" "$title by $artist on $album" --icon="$HOME/.config/pianobar/album.jpg"
diff --git a/pianobar/.config/pianobar/event_command.sh b/pianobar/.config/pianobar/event_command.sh
new file mode 100755
index 0000000..53883d3
--- /dev/null
+++ b/pianobar/.config/pianobar/event_command.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+rm "$HOME/.config/pianobar/info"
+while read L; do
+ echo "$L" >> "$HOME/.config/pianobar/info"
+ k="`echo "$L" | cut -d '=' -f 1`"
+ v="`echo "$L" | cut -d '=' -f 2`"
+ export "$k=$v"
+done < <(grep -e '^\(title\|artist\|album\|stationName\|songStationName\|pRet\|pRetStr\|wRet\|wRetStr\|songDuration\|songPlayed\|rating\|coverArt\|stationCount\|station[0-9]*\)=' /dev/stdin)
+
+case "$1" in
+ songstart)
+ curl "$coverArt" --silent --output "$HOME/.config/pianobar/album.jpg"
+ notify-send "Now playing:" "$title by $artist on $album" --icon="$HOME/.config/pianobar/album.jpg"
+ ;;
+ *)
+ ;;
+esac
diff --git a/pianobar/.config/pianobar/nowplaying b/pianobar/.config/pianobar/nowplaying
new file mode 100644
index 0000000..f90bb20
--- /dev/null
+++ b/pianobar/.config/pianobar/nowplaying
@@ -0,0 +1 @@
+Best Friends -- Shuko & F of Audiotreats
diff --git a/pianobar/.config/pianobar/password.gpg b/pianobar/.config/pianobar/password.gpg
new file mode 100644
index 0000000..4c3252b
--- /dev/null
+++ b/pianobar/.config/pianobar/password.gpg
@@ -0,0 +1 @@
+
גCLW| o=M^[UUF<h(YP}ަT03Bq.'"rYAO9]=w+E%R3
\ No newline at end of file
diff --git a/river/.config/river/init b/river/.config/river/init
new file mode 100755
index 0000000..9a06490
--- /dev/null
+++ b/river/.config/river/init
@@ -0,0 +1,191 @@
+#!/bin/sh
+
+# Variables
+term="foot"
+term_client="footclient"
+term_float="foot --app-id=float -w 1120x700"
+browser="firefox"
+email="thunderbird"
+emacs="emacsclient --create-frame --alternate-editor='emacs'"
+mod=Super
+
+wobsock=$XDG_RUNTIME_DIR/wob.sock
+rm -f $wobsock && mkfifo $wobsock && tail -f $wobsock | wob &
+
+
+# Launch things
+riverctl map normal $mod Return spawn footclient
+riverctl map normal $mod+Shift Return spawn foot
+riverctl map normal $mod Semicolon spawn fuzzel
+riverctl map normal $mod BracketRight spawn "$browser"
+riverctl map normal $mod T spawn "$email"
+riverctl map normal $mod Z spawn "books.sh"
+riverctl map normal $mod E spawn "$emacs"
+riverctl map normal $mod+Control O spawn "swaylock"
+
+# Close windows & exit wm
+riverctl map normal $mod+Shift C close
+riverctl map normal $mod+Shift Q exit
+
+# view stuff
+riverctl map normal $mod J focus-view next
+riverctl map normal $mod K focus-view previous
+riverctl map normal $mod+Shift J swap next
+riverctl map normal $mod+Shift K swap previous
+
+riverctl map normal $mod+Shift Space zoom
+
+# monitor stuff
+riverctl map normal $mod Period focus-output next
+riverctl map normal $mod Comma focus-output previous
+riverctl map normal $mod+Shift Period send-to-output next
+riverctl map normal $mod+Shift Comma send-to-output previous
+
+# mess with main
+riverctl map normal $mod H send-layout-cmd rivertile "main-ratio -0.05"
+riverctl map normal $mod L send-layout-cmd rivertile "main-ratio +0.05"
+
+riverctl map normal $mod+Shift H send-layout-cmd rivertile "main-count +1"
+riverctl map normal $mod+Shift L send-layout-cmd rivertile "main-count -1"
+
+# manipulate views
+riverctl map normal $mod+Alt H move left 100
+riverctl map normal $mod+Alt J move down 100
+riverctl map normal $mod+Alt K move up 100
+riverctl map normal $mod+Alt L move right 100
+
+riverctl map normal $mod+Alt+Control H snap left
+riverctl map normal $mod+Alt+Control J snap down
+riverctl map normal $mod+Alt+Control K snap up
+riverctl map normal $mod+Alt+Control L snap right
+
+riverctl map normal $mod+Alt+Shift H resize horizontal -100
+riverctl map normal $mod+Alt+Shift J resize vertical 100
+riverctl map normal $mod+Alt+Shift K resize vertical -100
+riverctl map normal $mod+Alt+Shift L resize horizontal 100
+
+riverctl map-pointer normal $mod BTN_LEFT move-view
+riverctl map-pointer normal $mod BTN_RIGHT resize-view
+riverctl map-pointer normal $mod BTN_MIDDLE toggle-float
+
+# tag stuff
+for i in $(seq 1 9)
+do
+ tags=$((1 << ($i - 1)))
+
+ riverctl map normal $mod $i set-focused-tags $tags
+ riverctl map normal $mod+Shift $i set-view-tags $tags
+ riverctl map normal $mod+Control $i toggle-focused-tags $tags
+ riverctl map normal $mod+Shift+Control $i toggle-view-tags $tags
+done
+
+all_tags=$(((1 << 32) - 1))
+riverctl map normal $mod 0 set-focused-tags $all_tags
+riverctl map normal $mod+Shift 0 set-view-tags $all_tags
+
+# toggle
+riverctl map normal $mod Space toggle-float
+riverctl map normal $mod F toggle-fullscreen
+
+# change layout orientation
+riverctl map normal $mod+Control K send-layout-cmd rivertile "main-location top"
+riverctl map normal $mod+Control L send-layout-cmd rivertile "main-location right"
+riverctl map normal $mod+Control J send-layout-cmd rivertile "main-location bottom"
+riverctl map normal $mod+Control H send-layout-cmd rivertile "main-location left"
+
+# passthrough mode
+riverctl declare-mode passthrough
+riverctl map normal $mod F11 enter-mode passthrough
+riverctl map passthrough $mod F11 enter-mode normal
+
+# media key bindings
+for mode in normal locked
+do
+ riverctl map $mode None XF86Eject spawn 'eject -T'
+
+ riverctl map $mode None XF86AudioRaiseVolume spawn "amixer sset Master 5%+ | sed -En 's/.*\[([0-9]+)%\].*/\1/p' | head -1 > $wobsock"
+ riverctl map $mode None XF86AudioLowerVolume spawn "amixer sset Master 5%- | sed -En 's/.*\[([0-9]+)%\].*/\1/p' | head -1 > $wobsock"
+ riverctl map $mode None XF86AudioMute exec spawn "sset Master toggle | sed -En '/\[on\]/ s/.*\[([0-9]+)%\].*/\1/ p; /\[off\]/ s/.*/0/p' | head -1 > $wobsock"
+
+ riverctl map $mode None XF86AudioMedia spawn 'playerctl play-pause'
+ riverctl map $mode None XF86AudioPlay spawn 'playerctl play-pause'
+ riverctl map $mode None XF86AudioPrev spawn 'playerctl previous'
+ riverctl map $mode None XF86AudioNext spawn 'playerctl next'
+
+ riverctl map $mode $mod+Control+Shift K spawn 'brightnessctl set +5% | sed -En "s/.*\(([0-9]+)%\).*/\1/p" > $wobsock'
+ riverctl map $mode $mod+Control+Shift J spawn 'brightnessctl set 5%- | sed -En "s/.*\(([0-9]+)%\).*/\1/p" > $wobsock'
+done
+
+# colors
+riverctl background-color 0x1e1e2e
+riverctl border-color-focused 0xf5c2e7
+riverctl border-color-unfocused 0x586e75
+riverctl border-width 2
+
+# options
+riverctl set-repeat 50 300
+riverctl keyboard-layout -options "altwin:swap_lalt_lwin" us
+
+riverctl focus-follows-cursor normal
+riverctl hide-cursor timeout 10000
+riverctl hide-cursor when-typing enabled
+riverctl xcursor-theme Adwaita
+
+touchpad=$(riverctl list-inputs | grep -i touchpad)
+riverctl input $touchpad disable-while-typing enabled
+riverctl input $touchpad natural-scroll enabled
+riverctl input $touchpad tap enabled
+
+# Make certain views start floating
+riverctl float-filter-add app-id float
+riverctl float-filter-add title "popup title with spaces"
+riverctl float-filter-add app-id blueman-manager
+
+# "Scratchpad"
+scratch_tag=$((1 << 20))
+riverctl map normal $mod Slash toggle-focused-tags $scratch_tag
+riverctl map normal $mod+Shift Slash set-view-tags $scratch_tag
+riverctl map normal $mod+Control Slash toggle-view-tags $scratch_tag
+riverctl map normal $mod S spawn 'foot --app-id=float -w 1120x700'
+riverctl rule-add -app-id float float
+
+# SSD (so GTK apps show border)
+riverctl rule-add -app-id firefox ssd
+riverctl rule-add -app-id thunderbird ssd
+riverctl rule-add -app-id emacs ssd
+riverctl rule-add -app-id gnucash ssd
+riverctl rule-add -app-id pcmanfm ssd
+riverctl rule-add -app-id steam ssd
+riverctl rule-add -app-id drracket ssd
+riverctl rule-add -app-id org.pwmt.zathura ssd
+riverctl rule-add -app-id org.gnome.Boxes ssd
+riverctl rule-add -app-id com.github.xournalpp.xournalpp ssd
+
+# spawn stuff
+# pgrep wbg || wbg ~/.config/wallpaper.png &
+pgrep swaybg || swaybg --image ~/.config/wallpaper.png &
+wlr-randr --output eDP-1 --scale 1.25
+pgrep yambar || yambar &
+
+# mako stuff
+pgrep mako || mako &
+riverctl map normal $mod D spawn 'makoctl dismiss'
+riverctl map normal $mod+Shift D spawn 'makoctl dismiss --all'
+
+# foot server
+foot --server & # TODO: figure out systemd service
+
+# pianobar
+riverctl map normal $mod+Shift S spawn '~/.config/pianobar/change_station.sh'
+riverctl map normal $mod P spawn 'echo "p" > ~/.config/pianobar/ctl'
+riverctl map normal $mod C spawn '~/.config/pianobar/display_info.sh'
+riverctl map normal $mod N spawn 'echo "n" > ~/.config/pianobar/ctl'
+
+# swayidle
+pgrep swayidle || swayidle -w \
+ timeout 300 'swaylock -f -c 000000' \
+ before-sleep 'swaylock -f -c 000000' &
+
+# start rivertile
+riverctl default-layout rivertile
+rivertile -view-padding 6 -outer-padding 6 -main-ratio 0.55 &
diff --git a/scripts/.local/bin/aur b/scripts/.local/bin/aur
new file mode 100755
index 0000000..b5d8732
--- /dev/null
+++ b/scripts/.local/bin/aur
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+git clone "https://aur.archlinux.org/$1.git"
diff --git a/scripts/.local/bin/books.sh b/scripts/.local/bin/books.sh
new file mode 100755
index 0000000..dabf2b8
--- /dev/null
+++ b/scripts/.local/bin/books.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+prefix=$HOME/Nextcloud/Books/
+
+choice=$(find $prefix -type f | sed "s|$prefix||;s/_/ /g" | fuzzel -d -w 80)
+
+test -n "$choice" && zathura $(echo $choice | sed "s/ /_/g;s|^|$prefix|")
diff --git a/scripts/.local/bin/papers.sh b/scripts/.local/bin/papers.sh
new file mode 100755
index 0000000..76d1644
--- /dev/null
+++ b/scripts/.local/bin/papers.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+prefix=$HOME/Nextcloud/Papers/
+
+choice=$(find $prefix -type f | sed "s|$prefix||;s/_/ /g" | fuzzel -d -w 80)
+
+test -n "$choice" && zathura $(echo $choice | sed "s/ /_/g;s|^|$prefix|")
diff --git a/ssh/.ssh/config b/ssh/.ssh/config
new file mode 100644
index 0000000..9b56373
--- /dev/null
+++ b/ssh/.ssh/config
@@ -0,0 +1,14 @@
+Host gh
+ User git
+ Hostname github.com
+ IdentityFile ~/.ssh/id_rsa-github
+
+Host gl
+ User git
+ Hostname gitlab.com
+ IdentityFile ~/.ssh/id_rsa-gitlab
+
+Host fg
+ Hostname forgejo-ssh.ballcloud.cc
+ User git
+ ProxyCommand /usr/bin/cloudflared access ssh --hostname %h
diff --git a/sway/.config/sway/config b/sway/.config/sway/config
new file mode 100644
index 0000000..99f59e1
--- /dev/null
+++ b/sway/.config/sway/config
@@ -0,0 +1,287 @@
+### Autotiling
+exec autotiling
+
+### Variables
+#
+# Logo key. Use Mod1 for Alt.
+set $mod Mod4
+# Home row direction keys, like vim
+set $left h
+set $down j
+set $up k
+set $right l
+# Your preferred terminal emulator
+set $term kitty
+set $browser firefox
+set $emacs "emacsclient --create-frame --alternate-editor='emacs'"
+# Your preferred application launcher
+# Note: pass the final command to swaymsg so that the resulting window can be opened
+# on the original workspace that the command was run on.
+set $menu fuzzel | xargs swaymsg exec --
+
+### Appearance
+# window corner radius in px
+# corner_radius 0
+#
+# # Window background blur
+# blur off
+# blur_xray off
+# blur_passes 2
+# blur_radius 5
+#
+# shadows enable
+# shadows_on_csd off
+# shadow_blur_radius 20
+# shadow_color #0000007F
+#
+# # inactive window fade amount. 0.0 = no dimming, 1.0 = fully dimmed
+# default_dim_inactive 0.0
+# dim_inactive_colors.unfocused #000000FF
+# dim_inactive_colors.urgent #900000FF
+#
+# # Move minimized windows into Scratchpad (enable|disable)
+# scratchpad_minimize disable
+
+smart_gaps on
+gaps inner 10
+default_border pixel 2
+
+client.focused #f5c2e7 #1e1e2e #cdd6f4 #a6e3a1 #f5c2e7
+client.unfocused #1e1e2e #1e1e2e #cdd6f4 #a6e3a1 #586e75
+client.focused_inactive #1e1e2e #1e1e2e #cdd6f4 #a6e3a1 #586e75
+
+font pango:Iosevka Nerd Font 10
+
+### Output configuration
+#
+# Default wallpaper (more resolutions are available in /usr/share/backgrounds/sway/)
+output * bg ~/.config/wallpaper.png fill
+output * scale 1.25
+#
+# Example configuration:
+#
+# output HDMI-A-1 resolution 1920x1080 position 1920,0
+#
+# You can get the names of your outputs by running: swaymsg -t get_outputs
+
+### Idle configuration
+#
+# Example configuration:
+#
+exec swayidle -w \
+ timeout 300 'swaylock -f -c 000000' \
+ timeout 600 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' \
+ before-sleep 'swaylock -f -c 000000'
+#
+# This will lock your screen after 300 seconds of inactivity, then turn off
+# your displays after another 300 seconds, and turn your screens back on when
+# resumed. It will also lock your screen before your computer goes to sleep.
+
+### Input configuration
+#
+# Example configuration:
+#
+input "type:touchpad" {
+ dwt enabled
+ tap enabled
+ natural_scroll enabled
+ accel_profile adaptive
+}
+
+input "type:keyboard" {
+ xkb_layout us,us
+ xkb_variant ,dvorak
+ xkb_options altwin:swap_lalt_lwin,grp:win_space_toggle
+ repeat_delay 300
+ repeat_rate 40
+}
+
+seat * hide_cursor 3000
+seat * hide_cursor when-typing enable
+
+#
+# You can get the names of your inputs by running: swaymsg -t get_inputs
+# Read `man 5 sway-input` for more information about this section.
+
+bindgesture swipe:right workspace prev
+bindgesture swipe:left workspace next
+
+### Key bindings
+#
+# Basics:
+#
+ # Start a terminal
+ bindsym $mod+Return exec $term
+
+ bindsym $mod+bracketright exec $browser
+ bindsym $mod+e exec $emacs
+ bindsym $mod+d exec "makoctl dismiss"
+ bindsym $mod+Shift+d exec "makoctl dismiss --all"
+ bindsym $mod+z exec "books.sh"
+ bindsym $mod+y exec "papers.sh"
+ bindsym $mod+Control+k exec 'brightnessctl set +5%'
+ bindsym $mod+Control+j exec 'brightnessctl set 5%-'
+ bindsym XF86MonBrightnessUp exec 'brightnessctl set +5%'
+ bindsym XF86MonBrightnessDown exec 'brightnessctl set 5%-'
+ bindsym $mod+Shift+o exec 'swaylock -f -c 000000'
+ bindsym XF86AudioRaiseVolume exec 'wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 2%+'
+ bindsym XF86AudioLowerVolume exec 'wpctl set-volume @DEFAULT_AUDIO_SINK@ 2%-'
+ bindsym XF86AudioMute exec 'wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle'
+ bindsym XF86AudioMicMute exec 'wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle'
+
+ # Kill focused window
+ bindsym $mod+Shift+c kill
+
+ # Start your launcher
+ bindsym $mod+semicolon exec $menu
+
+ # Drag floating windows by holding down $mod and left mouse button.
+ # Resize them with right mouse button + $mod.
+ # Despite the name, also works for non-floating windows.
+ # Change normal to inverse to use left mouse button for resizing and right
+ # mouse button for dragging.
+ floating_modifier $mod normal
+
+ # Reload the configuration file
+ bindsym $mod+Shift+r reload
+
+ # Exit sway (logs you out of your Wayland session)
+ bindsym $mod+Shift+q exit
+#
+# Moving around:
+#
+ # Move your focus around
+ bindsym $mod+$left focus left
+ bindsym $mod+$down focus down
+ bindsym $mod+$up focus up
+ bindsym $mod+$right focus right
+ # Or use $mod+[up|down|left|right]
+ bindsym $mod+Left focus left
+ bindsym $mod+Down focus down
+ bindsym $mod+Up focus up
+ bindsym $mod+Right focus right
+
+ # Move the focused window with the same, but add Shift
+ bindsym $mod+Shift+$left move left
+ bindsym $mod+Shift+$down move down
+ bindsym $mod+Shift+$up move up
+ bindsym $mod+Shift+$right move right
+ # Ditto, with arrow keys
+ bindsym $mod+Shift+Left move left
+ bindsym $mod+Shift+Down move down
+ bindsym $mod+Shift+Up move up
+ bindsym $mod+Shift+Right move right
+#
+# Workspaces:
+#
+ # Switch to workspace
+ bindsym $mod+1 workspace number 1
+ bindsym $mod+2 workspace number 2
+ bindsym $mod+3 workspace number 3
+ bindsym $mod+4 workspace number 4
+ bindsym $mod+5 workspace number 5
+ bindsym $mod+6 workspace number 6
+ bindsym $mod+7 workspace number 7
+ bindsym $mod+8 workspace number 8
+ bindsym $mod+9 workspace number 9
+ bindsym $mod+0 workspace number 10
+ # Move focused container to workspace
+ bindsym $mod+Shift+1 move container to workspace number 1
+ bindsym $mod+Shift+2 move container to workspace number 2
+ bindsym $mod+Shift+3 move container to workspace number 3
+ bindsym $mod+Shift+4 move container to workspace number 4
+ bindsym $mod+Shift+5 move container to workspace number 5
+ bindsym $mod+Shift+6 move container to workspace number 6
+ bindsym $mod+Shift+7 move container to workspace number 7
+ bindsym $mod+Shift+8 move container to workspace number 8
+ bindsym $mod+Shift+9 move container to workspace number 9
+ bindsym $mod+Shift+0 move container to workspace number 10
+ # Note: workspaces can have any name you want, not just numbers.
+ # We just use 1-10 as the default.
+#
+# Layout stuff:
+#
+ # You can "split" the current object of your focus with
+ # $mod+b or $mod+v, for horizontal and vertical splits
+ # respectively.
+ bindsym $mod+b splith
+ bindsym $mod+v splitv
+
+ # Switch the current container between different layout styles
+ bindsym $mod+s layout stacking
+ bindsym $mod+w layout tabbed
+ bindsym $mod+t layout toggle split
+
+ # Make the current focus fullscreen
+ bindsym $mod+f fullscreen
+
+ # Toggle the current focus between tiling and floating mode
+ bindsym $mod+Shift+space floating toggle
+
+ # Swap focus between the tiling area and the floating area
+ bindsym $mod+space focus mode_toggle
+
+ # Move focus to the parent container
+ bindsym $mod+a focus parent
+#
+# Scratchpad:
+#
+ # Sway has a "scratchpad", which is a bag of holding for windows.
+ # You can send windows there and get them back later.
+
+ # Move the currently focused window to the scratchpad
+ bindsym $mod+Shift+slash move scratchpad
+
+ # Show the next scratchpad window or hide the focused scratchpad window.
+ # If there are multiple scratchpad windows, this command cycles through them.
+ bindsym $mod+slash scratchpad show
+#
+# Resizing containers:
+#
+mode "resize" {
+ # left will shrink the containers width
+ # right will grow the containers width
+ # up will shrink the containers height
+ # down will grow the containers height
+ bindsym $mod+$left resize shrink width 10px
+ bindsym $mod+$down resize grow height 10px
+ bindsym $mod+$up resize shrink height 10px
+ bindsym $mod+$right resize grow width 10px
+
+ # Return to default mode
+ bindsym Return mode "default"
+ bindsym Escape mode "default"
+}
+bindsym $mod+r mode "resize"
+
+#
+# pianobar mode:
+#
+mode "pianobar" {
+ bindsym $mod+s exec "~/.config/pianobar/change_station.sh" ; mode "default"
+ bindsym $mod+p exec "echo 'p' > ~/.config/pianobar/ctl" ; mode "default"
+ bindsym $mod+c exec "~/.config/pianobar/display_info.sh" ; mode "default"
+ bindsym $mod+n exec "echo 'n' > ~/.config/pianobar/ctl" ; mode "default"
+ bindsym s exec "~/.config/pianobar/change_station.sh" ; mode "default"
+ bindsym p exec "echo 'p' > ~/.config/pianobar/ctl" ; mode "default"
+ bindsym c exec "~/.config/pianobar/display_info.sh" ; mode "default"
+ bindsym n exec "echo 'n' > ~/.config/pianobar/ctl" ; mode "default"
+ bindsym Escape mode "default"
+}
+bindsym $mod+p mode "pianobar"
+
+#
+# Status Bar:
+#
+# Read `man 5 sway-bar` for more information about this section.
+bar {
+ swaybar_command waybar
+}
+
+# autostart
+exec blueman-applet
+exec mako
+exec nm-applet
+exec emacs --daemon
+
+include /etc/sway/config.d/*
diff --git a/swaylock/.config/swaylock/config b/swaylock/.config/swaylock/config
new file mode 100644
index 0000000..b7f6d26
--- /dev/null
+++ b/swaylock/.config/swaylock/config
@@ -0,0 +1,29 @@
+color=1e1e2e
+bs-hl-color=f5e0dc
+caps-lock-bs-hl-color=f5e0dc
+caps-lock-key-hl-color=a6e3a1
+inside-color=00000000
+inside-clear-color=00000000
+inside-caps-lock-color=00000000
+inside-ver-color=00000000
+inside-wrong-color=00000000
+key-hl-color=a6e3a1
+layout-bg-color=00000000
+layout-border-color=00000000
+layout-text-color=cdd6f4
+line-color=00000000
+line-clear-color=00000000
+line-caps-lock-color=00000000
+line-ver-color=00000000
+line-wrong-color=00000000
+ring-color=b4befe
+ring-clear-color=f5e0dc
+ring-caps-lock-color=fab387
+ring-ver-color=89b4fa
+ring-wrong-color=eba0ac
+separator-color=00000000
+text-color=cdd6f4
+text-clear-color=f5e0dc
+text-caps-lock-color=fab387
+text-ver-color=89b4fa
+text-wrong-color=eba0ac
diff --git a/tmux/.config/tmux/tmux.conf b/tmux/.config/tmux/tmux.conf
new file mode 100644
index 0000000..4408bfd
--- /dev/null
+++ b/tmux/.config/tmux/tmux.conf
@@ -0,0 +1,32 @@
+set -g default-terminal "xterm-256color"
+set-option -ga terminal-overrides ",xterm-256color:Tc"
+
+version_pat='s/^tmux[^0-9]*([.0-9]+).*/\1/p'
+
+is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
+ | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
+bind-key -n M-h if-shell "$is_vim" "send-keys M-h" "select-pane -L"
+bind-key -n M-j if-shell "$is_vim" "send-keys M-j" "select-pane -D"
+bind-key -n M-k if-shell "$is_vim" "send-keys M-k" "select-pane -U"
+bind-key -n M-l if-shell "$is_vim" "send-keys M-l" "select-pane -R"
+tmux_version="$(tmux -V | sed -En "$version_pat")"
+setenv -g tmux_version "$tmux_version"
+
+if-shell -b '[ "$(echo "$tmux_version < 3.0" | bc)" = 1 ]' \
+ "bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\' 'select-pane -l'"
+if-shell -b '[ "$(echo "$tmux_version >= 3.0" | bc)" = 1 ]' \
+ "bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\\\' 'select-pane -l'"
+
+bind-key -T copy-mode-vi M-h select-pane -L
+bind-key -T copy-mode-vi M-j select-pane -D
+bind-key -T copy-mode-vi M-k select-pane -U
+bind-key -T copy-mode-vi M-l select-pane -R
+bind-key -T copy-mode-vi C-\\ select-pane -l
+
+bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "wl-copy && wl-paste -n | wl-copy -p"
+bind-key C-y run "wl-paste -n | tmux load-buffer - ; tmux paste-buffer"
+
+set -g @plugin 'tmux-plugins/tpm'
+set -g @plugin 'tmux-plugins/tmux-sensible'
+set -g @plugin 'catppuccin/tmux'
+run '~/.config/tmux/plugins/tpm/tpm'
diff --git a/vifm/.config/vifm/colors/Default.vifm b/vifm/.config/vifm/colors/Default.vifm
new file mode 100644
index 0000000..898d956
--- /dev/null
+++ b/vifm/.config/vifm/colors/Default.vifm
@@ -0,0 +1,100 @@
+" You can edit this file by hand.
+" The " character at the beginning of a line comments out the line.
+" Blank lines are ignored.
+
+" The Default color scheme is used for any directory that does not have
+" a specified scheme and for parts of user interface like menus. A
+" color scheme set for a base directory will also
+" be used for the sub directories.
+
+" The standard ncurses colors are:
+" Default = -1 = None, can be used for transparency or default color
+" Black = 0
+" Red = 1
+" Green = 2
+" Yellow = 3
+" Blue = 4
+" Magenta = 5
+" Cyan = 6
+" White = 7
+
+" Light versions of colors are also available (they set bold
+" attribute in terminals with less than 16 colors):
+" LightBlack
+" LightRed
+" LightGreen
+" LightYellow
+" LightBlue
+" LightMagenta
+" LightCyan
+" LightWhite
+
+" Available attributes (some of them can be combined):
+" bold
+" underline
+" reverse or inverse
+" standout
+" italic (on unsupported systems becomes reverse)
+" combine
+" none
+
+" Vifm supports 256 colors you can use color numbers 0-255
+" (requires properly set up terminal: set your TERM environment variable
+" (directly or using resources) to some color terminal name (e.g.
+" xterm-256color) from /usr/lib/terminfo/; you can check current number
+" of colors in your terminal with tput colors command)
+
+" highlight group cterm=attrs ctermfg=foreground_color ctermbg=background_color
+
+highlight clear
+
+highlight Win cterm=none ctermfg=white ctermbg=black
+highlight Directory cterm=bold ctermfg=cyan ctermbg=default
+highlight Link cterm=bold ctermfg=yellow ctermbg=default
+highlight BrokenLink cterm=bold ctermfg=red ctermbg=default
+highlight HardLink cterm=none ctermfg=yellow ctermbg=default
+highlight Socket cterm=bold ctermfg=magenta ctermbg=default
+highlight Device cterm=bold ctermfg=red ctermbg=default
+highlight Fifo cterm=bold ctermfg=cyan ctermbg=default
+highlight Executable cterm=bold ctermfg=green ctermbg=default
+highlight Selected cterm=bold ctermfg=magenta ctermbg=default
+highlight CurrLine cterm=bold,reverse ctermfg=default ctermbg=default
+highlight TopLine cterm=none ctermfg=black ctermbg=white
+highlight TopLineSel cterm=bold ctermfg=black ctermbg=default
+highlight StatusLine cterm=bold ctermfg=black ctermbg=white
+highlight WildMenu cterm=underline,reverse ctermfg=white ctermbg=black
+highlight CmdLine cterm=none ctermfg=white ctermbg=black
+highlight ErrorMsg cterm=none ctermfg=red ctermbg=black
+highlight Border cterm=none ctermfg=black ctermbg=white
+highlight OtherLine ctermfg=default ctermbg=default
+highlight JobLine cterm=bold,reverse ctermfg=black ctermbg=white
+highlight SuggestBox cterm=bold ctermfg=default ctermbg=default
+highlight CmpMismatch cterm=bold ctermfg=white ctermbg=red
+highlight CmpUnmatched cterm=bold ctermfg=white ctermbg=green
+highlight CmpBlank ctermfg=default ctermbg=default
+highlight AuxWin ctermfg=default ctermbg=default
+highlight TabLine cterm=none ctermfg=white ctermbg=black
+highlight TabLineSel cterm=bold,reverse ctermfg=default ctermbg=default
+highlight User1 ctermfg=default ctermbg=default
+highlight User2 ctermfg=default ctermbg=default
+highlight User3 ctermfg=default ctermbg=default
+highlight User4 ctermfg=default ctermbg=default
+highlight User5 ctermfg=default ctermbg=default
+highlight User6 ctermfg=default ctermbg=default
+highlight User7 ctermfg=default ctermbg=default
+highlight User8 ctermfg=default ctermbg=default
+highlight User9 ctermfg=default ctermbg=default
+highlight User10 ctermfg=default ctermbg=default
+highlight User11 ctermfg=default ctermbg=default
+highlight User12 ctermfg=default ctermbg=default
+highlight User13 ctermfg=default ctermbg=default
+highlight User14 ctermfg=default ctermbg=default
+highlight User15 ctermfg=default ctermbg=default
+highlight User16 ctermfg=default ctermbg=default
+highlight User17 ctermfg=default ctermbg=default
+highlight User18 ctermfg=default ctermbg=default
+highlight User19 ctermfg=default ctermbg=default
+highlight User20 ctermfg=default ctermbg=default
+highlight OtherWin ctermfg=default ctermbg=default
+highlight LineNr ctermfg=default ctermbg=default
+highlight OddLine ctermfg=default ctermbg=default
diff --git a/vifm/.config/vifm/colors/mocha.vifm b/vifm/.config/vifm/colors/mocha.vifm
new file mode 100644
index 0000000..004b840
--- /dev/null
+++ b/vifm/.config/vifm/colors/mocha.vifm
@@ -0,0 +1,30 @@
+""
+" Catppuccin color scheme for Vifm
+""
+
+highlight clear
+
+highlight Border cterm=none ctermfg=default ctermbg=default
+
+highlight TopLine cterm=none ctermfg=green ctermbg=default
+highlight TopLineSel cterm=bold ctermfg=green ctermbg=default
+
+highlight Win cterm=none ctermfg=default ctermbg=default
+highlight Directory cterm=bold ctermfg=blue ctermbg=default
+highlight CurrLine cterm=bold ctermfg=232 ctermbg=yellow
+highlight OtherLine cterm=bold ctermfg=default ctermbg=default
+highlight Selected cterm=bold ctermfg=white ctermbg=black
+
+highlight JobLine cterm=bold ctermfg=232 ctermbg=white
+highlight StatusLine cterm=none ctermfg=black ctermbg=default
+highlight ErrorMsg cterm=bold ctermfg=red ctermbg=default
+highlight WildMenu cterm=bold ctermfg=white ctermbg=default
+highlight CmdLine cterm=none ctermfg=white ctermbg=default
+
+highlight Executable cterm=bold ctermfg=cyan ctermbg=default
+highlight Link cterm=bold ctermfg=magenta ctermbg=default
+highlight BrokenLink cterm=bold ctermfg=red ctermbg=default
+highlight Device cterm=bold ctermfg=magenta ctermbg=default
+highlight Fifo cterm=none ctermfg=default ctermbg=default
+highlight Socket cterm=bold ctermfg=default ctermbg=default
+
diff --git a/vifm/.config/vifm/scripts/README b/vifm/.config/vifm/scripts/README
new file mode 100644
index 0000000..7694952
--- /dev/null
+++ b/vifm/.config/vifm/scripts/README
@@ -0,0 +1,6 @@
+This directory is dedicated for user-supplied scripts/executables.
+vifm modifies its PATH environment variable to let user run those
+scripts without specifying full path. All subdirectories are added
+as well. File in a subdirectory overrules file with the same name
+in parent directories. Restart might be needed to recognize files
+in newly created or renamed subdirectories.
\ No newline at end of file
diff --git a/vifm/.config/vifm/vifm-help.txt b/vifm/.config/vifm/vifm-help.txt
new file mode 100644
index 0000000..c69fdef
--- /dev/null
+++ b/vifm/.config/vifm/vifm-help.txt
@@ -0,0 +1,7006 @@
+VIFM(1) General Commands Manual VIFM(1)
+
+
+
+NAME
+ vifm - vi file manager
+
+SYNOPSIS
+ vifm [OPTION]...
+ vifm [OPTION]... path
+ vifm [OPTION]... path path
+
+DESCRIPTION
+ Vifm is an ncurses based file manager with vi like keybindings. If you
+ use vi, vifm gives you complete keyboard control over your files with-
+ out having to learn a new set of commands.
+
+OPTIONS
+ vifm starts in the current directory unless it is given a different di-
+ rectory on the command line or 'vifminfo' option includes "savedirs"
+ (in which case last visited directories are used as defaults).
+
+ - Read list of files from standard input stream and compose custom
+ view out of them (see "Custom views" section). Current working
+ directory is used as a base for relative paths.
+
+ Starts Vifm in the specified path.
+
+
+ Starts Vifm in the specified paths.
+
+ Specifying two directories triggers split view even when vifm was in
+ single-view mode on finishing previous run. To suppress this behaviour
+ :only command can be put in the vifmrc file.
+
+ When only one path argument is found on command-line, the left/top pane
+ is automatically set as the current view.
+
+ Paths to files are also allowed in case you want vifm to start with
+ some archive opened.
+
+ --select
+ Open parent directory of the given path and select specified
+ file in it.
+
+ -f Makes vifm instead of opening files write selection to
+ $VIFM/vimfiles and quit.
+
+ --choose-files |-
+ Sets output file to write selection into on exit instead of
+ opening files. "-" means standard output. Use empty value to
+ disable it.
+
+ --choose-dir |-
+ Sets output file to write last visited directory into on exit.
+ "-" means standard output. Use empty value to disable it.
+
+ --delimiter
+ Sets separator for list of file paths written out by vifm.
+ Empty value means null character. Default is new line charac-
+ ter.
+
+ --on-choose
+ Sets command to be executed on selected files instead of opening
+ them. The command may use any of macros described in "Command
+ macros" section below. The command is executed once for whole
+ selection.
+
+ --plugins-dir
+ Additional plugins directory (can appear multiple times). The
+ last one added has the highest priority.
+
+ --logging[=]
+ Log some operational details to $XDG_DATA_HOME/vifm/log or
+ $VIFM/log. If the optional startup log path is specified and
+ permissions allow to open it for writing, then logging of early
+ initialization (before configuration directories are determined)
+ is put there.
+
+ --server-list
+ List available server names and exit.
+
+ --server-name
+ Name of target or this instance (sequential numbers are appended
+ on name conflict).
+
+ --remote
+ Sends the rest of the command line to another instance of vifm,
+ --server-name is treated just like any other argument and should
+ precede --remote on the command line. When there is no server,
+ quits silently. There is no limit on how many arguments can be
+ processed. One can combine --remote with -c or + to execute commands in already running instance of vifm.
+ See also "Client-Server" section below.
+
+ --remote-expr
+ passes expression to vifm server and prints result. See also
+ "Client-Server" section below.
+
+ -c or +
+ Run command-line mode on startup. Commands in such
+ arguments are executed in the order they appear in command line.
+ Commands with spaces or special symbols must be enclosed in dou-
+ ble or single quotes or all special symbols should be escaped
+ (the exact syntax strongly depends on shell). "+" argument is
+ equivalent to "$" and thus picks last item of of the view.
+
+ --help, -h
+ Show a brief command summary and exit vifm.
+
+ --version, -v
+ Show version information and quit.
+
+ --no-configs
+ Skip reading vifmrc and vifminfo.
+
+
+ See "Startup" section below for the explanations on $VIFM.
+
+General keys
+ Ctrl-C or Escape
+ cancel most operations (see "Cancellation" section below), clear
+ all selected files.
+
+ Ctrl-L clear and redraw the screen. Can also reload file list in ap-
+ propriate modes (like normal and visual).
+
+Basic Movement
+ The basic vi key bindings are used to move through the files and pop-up
+ windows.
+
+ k, gk, or Ctrl-P
+ move cursor up one line.
+
+ j, gj or Ctrl-N
+ move cursor down one line.
+
+ h when 'lsview' is off move up one directory (moves to parent di-
+ rectory node in tree view), otherwise move left one file.
+
+ l when 'lsview' is off move into a directory or launch a file,
+ otherwise move right one file. See "Selection" section below.
+
+ gg move to the first line of the file list.
+
+ G move to the last line in the file list.
+
+ gh go up one directory regardless of view representation (regular,
+ ls-like). Also can be used to leave custom views including tree
+ view.
+
+ gl or Enter
+ enter directory or launch a file. See "Selection" section be-
+ low.
+
+ H move to the first file in the window.
+
+ M move to the file in the middle of the window.
+
+ L move to the last file in the window.
+
+ Ctrl-F or Page Down
+ move forward one page.
+
+ Ctrl-B or Page Up
+ move back one page.
+
+ Ctrl-D jump back one half page.
+
+ Ctrl-U jump forward one half page.
+
+ n% move to the file that is n percent from the top of the list (for
+ example 25%).
+
+ 0 or ^ move cursor to the first column. See 'lsview' option descrip-
+ tion.
+
+ $ move cursor to the last column. See 'lsview' option descrip-
+ tion.
+
+ Space switch file lists.
+
+ gt switch to the next tab (wrapping around).
+
+ {n}gt switch to the tab number {n} (wrapping around).
+
+ gT switch to the previous tab (wrapping around).
+
+ {n}gT switch to {n}-th previous tab.
+
+Movement with Count
+ Most movement commands also accept a count, 12j would move down 12
+ files.
+
+ [count]%
+ move to percent of the file list.
+
+ [count]j
+ move down [count] files.
+
+ [count]k
+ move up [count] files.
+
+ [count]G or [count]gg
+ move to list position [count].
+
+ [count]h
+ go up [count] directories.
+
+Scrolling panes
+ zt redraw pane with file in top of list.
+
+ zz redraw pane with file in center of list.
+
+ zb redraw pane with file in bottom of list.
+
+ Ctrl-E scroll pane one line down or column right (in transposed ls-like
+ view).
+
+ Ctrl-Y scroll pane one line up or column left (in transposed ls-like
+ view).
+
+Pane manipulation
+ Second character can be entered with or without Control key.
+
+ Ctrl-W H
+ move the pane to the far left.
+
+ Ctrl-W J
+ move the pane to the very bottom.
+
+ Ctrl-W K
+ move the pane to the very top.
+
+ Ctrl-W L
+ move the pane to the far right.
+
+
+ Ctrl-W h
+ switch to the left pane.
+
+ Ctrl-W j
+ switch to the pane below.
+
+ Ctrl-W k
+ switch to the pane above.
+
+ Ctrl-W l
+ switch to the right pane.
+
+
+ Ctrl-W b
+ switch to bottom-right window.
+
+ Ctrl-W t
+ switch to top-left window.
+
+
+ Ctrl-W p
+ switch to previous window.
+
+ Ctrl-W w
+ switch to other pane.
+
+
+ Ctrl-W o
+ leave only one pane.
+
+ Ctrl-W s
+ split window horizontally.
+
+ Ctrl-W v
+ split window vertically.
+
+
+ Ctrl-W x
+ exchange panes.
+
+ Ctrl-W z
+ quit preview pane or view modes.
+
+
+ Ctrl-W -
+ decrease size of the view by count.
+
+ Ctrl-W +
+ increase size of the view by count.
+
+ Ctrl-W <
+ decrease size of the view by count.
+
+ Ctrl-W >
+ increase size of the view by count.
+
+
+ Ctrl-W |
+ set current view size to count.
+
+ Ctrl-W _
+ set current view size to count.
+
+ Ctrl-W =
+ make size of two views equal.
+
+ For Ctrl-W +, Ctrl-W -, Ctrl-W <, Ctrl-W >, Ctrl-W | and Ctrl-W _ com-
+ mands count can be given before and/or after Ctrl-W. The resulting
+ count is a multiplication of those two. So "2 Ctrl-W 2 -" decreases
+ window size by 4 lines or columns.
+
+ Ctrl-W | and Ctrl-W _ maximise current view by default.
+
+Marks
+ Marks are set the same way as they are in vi.
+
+ You can use these characters for marks [a-z][A-Z][0-9].
+
+ m[a-z][A-Z][0-9]
+ set a mark for the file at the current cursor position.
+
+ '[a-z][A-Z][0-9]
+ navigate to the file set for the mark.
+
+
+ There are also several special marks that can't be set manually:
+
+ - ' (single quote) - previously visited directory of the view, thus
+ hitting '' allows switching between two last locations
+
+ - < - the first file of the last visually selected block
+
+ - > - the last file of the last visually selected block
+
+Searching
+ /regular expression pattern
+ search for files matching regular expression in forward direc-
+ tion and advance cursor to next match.
+
+ / perform forward search with top item of search pattern history.
+
+ ?regular expression pattern
+ search for files matching regular expression in backward direc-
+ tion and advance cursor to previous match.
+
+ ? perform backward search with top item of search pattern history.
+
+ Trailing slash for directories is taken into account, so /\/ searches
+ for directories and symbolic links to directories. At the moment //
+ works too, but this can change in the future, so consider escaping the
+ slash if not typing pattern by hand.
+
+ Matches are automatically selected if 'hlsearch' is set. Enabling
+ 'incsearch' makes search interactive. 'ignorecase' and 'smartcase' op-
+ tions affect case sensitivity of search queries as well as local filter
+ and other things detailed in the description of 'caseoptions'.
+
+
+ [count]n
+ go to the next file matching last search pattern. Takes last
+ search direction into account.
+
+ [count]N
+ go to the previous file matching last search pattern. Takes
+ last search direction into account.
+
+ If 'hlsearch' option is set, hitting n/N to perform search and go to
+ the first matching item resets current selection in normal mode. It is
+ not the case if search was already performed on files in the directory,
+ thus selection is not reset after clearing selection with escape key
+ and hitting n/N key again.
+
+ See also "Regular expressions" section.
+
+
+ [count]f[character]
+ search forward for file with [character] as first character in
+ name. Search wraps around the end of the list.
+
+ [count]F[character]
+ search backward for file with [character] as first character in
+ name. Search wraps around the end of the list.
+
+ [count];
+ find the next match of f or F.
+
+ [count],
+ find the previous match of f or F.
+
+ Note: f, F, ; and , wrap around list beginning and end when they are
+ used alone and they don't wrap when they are used as selectors.
+
+File Filters
+ There are three basic file filters:
+
+ - dot files filter (does not affect "." and ".." special directories,
+ whose appearance is controlled by the 'dotdirs' option), see 'dot-
+ files' option;
+
+ - permanent filter;
+
+ - local filter (see description of the "=" normal mode command).
+
+ Permanent filter essentially allows defining a group of files names
+ which are not desirable to be seen by default, like temporary or backup
+ files, which might be created alongside normal ones. Just like you
+ don't usually need to see hidden dot files (files starting with a dot).
+ Local filter on the other hand is for temporary immediate filtering of
+ file list at hand, to get rid of uninterested files in the view or to
+ make it possible to use % range in a :command.
+
+ For the purposes of more deterministic editing permanent filter is
+ split into two parts:
+
+ - one edited explicitly via :filter command;
+
+ - another one which is edited implicitly via zf shortcut.
+
+ Files are tested against both parts and a match counts if at least one
+ of the parts matched.
+
+
+ Each file list has its own copy of each filter.
+
+ Filtered files are not checked in / search or :commands.
+
+ Files and directories are filtered separately. This is done by append-
+ ing a slash to a directory name before testing whether it matches the
+ filter. Examples:
+
+
+ " filter directories which names end with '.files'
+ :filter /^.*\.files\/$/
+
+ " filter files which names end with '.d'
+ :filter {*.d}
+
+ " filter files and directories which names end with '.o'
+ :filter /^.*\.o\/?$/
+
+ See also "Regular expressions" and "Patterns" sections.
+
+ The basic Vim folding key bindings are used for managing filters.
+
+
+ za toggle visibility of dot files.
+
+ zo show dot files.
+
+ zm hide dot files.
+
+ zf add selected files to permanent filter.
+
+ zO reset permanent filter.
+
+ zR save and reset all filters.
+
+ zr clear local filter.
+
+ zM restore all filters (undoes last zR).
+
+ zd exclude selection or current file from a custom view. Does
+ nothing for regular view. For tree view excluding directory ex-
+ cludes that sub-tree. For compare views zd hides group of adja-
+ cent identical files, count can be specified as 1 to exclude
+ just single file or selected items instead. Files excluded this
+ way are not counted as filtered out and can't be returned unless
+ view is reloaded.
+
+ =regular expression pattern
+ filter out files that don't match regular expression. Whether
+ view is updated as regular expression is changed depends on the
+ value of the 'incsearch' option. This kind of filter is auto-
+ matically reset when directory is changed.
+
+Tree-related Keys
+ While some of the keys make sense outside of tree-view, they are most
+ useful in trees.
+
+ [z go to first sibling of current entry.
+
+ ]z go to last sibling of current entry.
+
+ zj go to next directory sibling of current entry or do nothing.
+
+ zk go to previous directory sibling of current entry or do nothing.
+
+ zx toggle fold under the cursor or parent entry of the current file
+ if cursor is not on a directory.
+
+Other Normal Mode Keys
+ [count]:
+ enter command line mode. [count] generates range.
+
+ q: open external editor to prompt for command-line command. See
+ "Command line editing" section for details.
+
+ q/ open external editor to prompt for search pattern to be searched
+ in forward direction. See "Command line editing" section for
+ details.
+
+ q? open external editor to prompt for search pattern to be searched
+ in backward direction. See "Command line editing" section for
+ details.
+
+ q= open external editor to prompt for filter pattern. See "Command
+ line editing" section for details. Unlike other q{x} commands
+ this one doesn't work in Visual mode.
+
+ [count]!! and [count]!
+ enter command line mode with entered ! command. [count] modi-
+ fies range.
+
+ Ctrl-O go backwards through directory history of current view. Nonex-
+ istent directories are automatically skipped.
+
+ Ctrl-I if 'cpoptions' contains "t" flag, and switch active
+ pane just like does, otherwise it goes forward through
+ directory history of current view. Nonexistent directories are
+ automatically skipped.
+
+ Ctrl-G show a dialog with detailed information about current file. See
+ "Menus and dialogs" section for controls.
+
+ Shift-Tab
+ enter view mode (works only after activating view pane with
+ :view command).
+
+ ga calculate directory size. Uses cached directory sizes when pos-
+ sible for better performance. As a special case calculating
+ size of ".." entry results in calculation of size of current di-
+ rectory.
+
+ gA like ga, but force update. Ignores old values of directory
+ sizes.
+
+ If file under cursor is selected, each selected item is processed, oth-
+ erwise only current file is updated.
+
+ gf find link destination (like l with 'followlinks' off, but also
+ finds directories). On Windows additionally follows .lnk-files.
+
+ gF Same as gf, but resolves final path of the chain of symbolic
+ links.
+
+ gr only for MS-Windows
+ same as l key, but tries to run program with administrative
+ privileges.
+
+ av go into visual mode for updating current selection, any existing
+ selection is preserved.
+
+ gv go into visual mode restoring last selection.
+
+ [reg]gs
+ if register is present, then all files listed in that register
+ that are visible in current view are selected.
+
+ When no register is specified, restore the last selection saved
+ for this view (similar to what gv does for visual mode selec-
+ tion). When you leave a directory, its saved selection is re-
+ membered for that path and visiting the directory again restores
+ it. Selection for up to 10 distinct file-system locations are
+ remembered.
+
+ gu
+ make names of selected files lowercase.
+
+ [count]guu and [count]gugu
+ make names of [count] files starting from the current one lower-
+ case. Without [count] only current file is affected.
+
+ gU
+ make names of selected files uppercase.
+
+ [count]gUU and [count]gUgU
+ make names of [count] files starting from the current one upper-
+ case. Without [count] only current file is affected.
+
+ e explore file in the current pane.
+
+ i handle file (even if it's an executable and 'runexec' option is
+ set).
+
+ cw change word is used to rename a file or files. If multiple
+ files are selected, behaves as :rename command run without argu-
+ ments.
+
+ cW change WORD is used to change only name of file (without exten-
+ sion).
+
+ cl change link target. If multiple files are selected, an editor
+ is spawn to edit paths.
+
+ co only for *nix
+ change file owner.
+
+ cg only for *nix
+ change file group.
+
+ [count]cp
+ change file attributes (permission on *nix and properties on
+ Windows). If [count] is specified, it's treated as numerical
+ argument for non-recursive `chmod` command (of the form
+ [0-7]{3,4}). See "Menus and dialogs" section for controls.
+
+ [count]C
+ clone file [count] times.
+
+ [count]dd or d[count]selector
+ move selected file or files to trash directory (if 'trash' op-
+ tion is set, otherwise delete). See "Trash directory" section
+ below.
+
+ [count]DD or D[count]selector
+ like dd and d, but omitting trash directory (even when
+ 'trash' option is set).
+
+ Y, [count]yy or y[count]selector
+ yank selected files.
+
+ p copy yanked files to the current directory or move the files to
+ the current directory if they were deleted with dd or :d[elete]
+ or if the files were yanked from trash directory. See "Trash
+ directory" section below.
+
+ P move the last yanked files. The advantage of using P instead of
+ d followed by p is that P moves files only once. This isn't im-
+ portant in case you're moving files in the same file system
+ where your home directory is, but using P to move files on some
+ other file system (or file systems, in case you want to move
+ files from fs1 to fs2 and your home is on fs3) can save your
+ time.
+
+ al put symbolic links with absolute paths.
+
+ rl put symbolic links with relative paths.
+
+ t select or unselect (tag) the current file.
+
+ u undo last change.
+
+ Ctrl-R redo last change.
+
+ dp in compare view of "ofboth grouppaths" kind makes corresponding
+ entries of the other pane equal to the current one. If at least
+ one file is selected, the command processes selection, otherwise
+ current file.
+ The semantics is as follows:
+ - nothing is done for identical entries
+ - if file is missing in current view, its pair gets removed
+ - if file is missing or differs in other view, it's replaced
+ - file pairs are defined by matching relative paths
+ File removal obeys 'trash' option. When the option is enabled,
+ the operation can be undone/redone (although results won't be
+ visible automatically).
+ Unlike in Vim, this operation is performed on a single line
+ rather than a set of adjacent changes.
+
+ do same as dp, but applies changes in the opposite direction.
+
+ v or V enter visual mode, clears current selection.
+
+ [count]Ctrl-A
+ increment first number in file name by [count] (1 by default).
+
+ [count]Ctrl-X
+ decrement first number in file name by [count] (1 by default).
+
+ ZQ same as :quit!.
+
+ ZZ same as :quit.
+
+ . repeat last command-line command (not normal mode command) of
+ this run (does nothing right after startup or :restart command).
+ The command doesn't depend on command-line history and can be
+ used with completely disabled history.
+
+ ( go to previous group. Groups are defined by primary sorting
+ key. For name and iname members of each group have same first
+ letter, for all other sorting keys vifm uses size, uid, ...
+
+ ) go to next group. See ( key description above.
+
+ { speeds up navigation to closest previous entry of the opposite
+ type by moving to the first file backwards when cursor is on a
+ directory and to the first directory backwards when cursor is on
+ a file. This is essentially a special case of ( that is locked
+ on "dirs".
+
+ } same as {, but in forward direction.
+
+ [c go to previous mismatched entry in directory comparison view or
+ do nothing.
+
+ ]c go to next mismatched entry in directory comparison view or do
+ nothing.
+
+ [d go to previous directory entry or do nothing.
+
+ ]d go to next directory entry or do nothing.
+
+ [r same as :siblprev.
+
+ ]r same as :siblnext.
+
+ [R same as :siblprev!.
+
+ ]R same as :siblnext!.
+
+ [s go to previous selected entry or do nothing.
+
+ ]s go to next selected entry or do nothing.
+
+Using Count
+ You can use count with commands like yy.
+
+ [count]yy
+ yank count files starting from current cursor position downward.
+
+ Or you can use count with motions passed to y, d or D.
+
+ d[count]j
+ delete (count + 1) files starting from current cursor position
+ upward.
+
+Registers
+ vifm supports multiple registers for temporary storing list of yanked
+ or deleted files.
+
+ Registers should be specified by hitting double quote key followed by a
+ register name. Count is specified after register name. By default
+ commands use unnamed register, which has double quote as its name.
+
+ Though all commands accept registers, most of commands ignores them
+ (for example H or Ctrl-U). Other commands can fill register or append
+ new files to it.
+
+ Presently vifm supports ", _, a-z and A-Z characters as register names.
+
+ As mentioned above " is unnamed register and has special meaning of the
+ default register. Every time when you use named registers (a-z and A-
+ Z) unnamed register is updated to contain same list of files as the
+ last used register.
+
+ _ is black hole register. It can be used for writing, but its list is
+ always empty.
+
+ Registers with names from a to z and from A to Z are named ones. Low-
+ ercase registers are cleared before adding new files, while uppercase
+ aren't and should be used to append new files to the existing file list
+ of appropriate lowercase register (A for a, B for b, ...).
+
+ Registers can be changed on :empty command if they contain files under
+ trash directory (see "Trash directory" section below).
+
+ Registers do not contain one file more than once.
+
+ Example:
+
+ "a2yy
+
+ puts names of two files to register a (and to the unnamed register),
+
+ "Ad
+
+ removes one file and append its name to register a (and to the unnamed
+ register),
+
+ p or "ap or "Ap
+
+ inserts previously yanked and deleted files into current directory.
+
+Selectors
+ y, d, D, !, gu and gU commands accept selectors. You can combine them
+ with any of selectors below to quickly remove or yank several files.
+
+ Most of selectors are like vi motions: j, k, gg, G, H, L, M, %, f, F,
+ ;, comma, ', ^, 0 and $. But there are some additional ones.
+
+ a all files in current view.
+
+ s selected files.
+
+ S all files except selected.
+
+ Examples:
+
+ - dj - delete file under cursor and one below;
+
+ - d2j - delete file under cursor and two below;
+
+ - y6gg - yank all files from cursor position to 6th file in the list.
+
+ When you pass a count to whole command and its selector they are multi-
+ plied. So:
+
+ - 2d2j - delete file under cursor and four below;
+
+ - 2dj - delete file under cursor and two below;
+
+ - 2y6gg - yank all files from cursor position to 12th file in the
+ list.
+
+Visual Mode
+ Visual mode has two generic operating submodes:
+
+ - plain selection as it is in Vim;
+
+ - selection editing submode.
+
+ Both modes select files in range from cursor position at which visual
+ mode was entered to current cursor position (let's call it "selection
+ region"). Each of two borders can be adjusted by swapping them via "o"
+ or "O" keys and updating cursor position with regular cursor motion
+ keys. Obviously, once initial cursor position is altered this way,
+ real start position becomes unavailable.
+
+ Plain Vim-like visual mode starts with cleared selection, which is not
+ restored on rejecting selection ("Escape", "Ctrl-C", "v", "V"). Con-
+ trary to it, selection editing doesn't clear previously selected files
+ and restores them after reject. Accepting selection by performing an
+ operation on selected items (e.g. yanking them via "y") moves cursor to
+ the top of current selection region (not to the top most selected file
+ of the view).
+
+ In turn, selection editing supports three types of editing (look at
+ status bar to know which one is currently active):
+
+ - append - amend selection by selecting elements in selection region;
+
+ - remove - amend selection by deselecting elements in selection re-
+ gion;
+
+ - invert - amend selection by inverting selection of elements in se-
+ lection region.
+
+ No matter how you activate selection editing it starts in "append".
+ One can switch type of operation (in the order given above) via "Ctrl-
+ G" key.
+
+ Almost all normal mode keys work in visual mode, but instead of accept-
+ ing selectors they operate on selected items.
+
+ Enter save selection and go back to normal mode not moving cursor.
+
+ av leave visual mode if in amending mode (restores previous selec-
+ tion), otherwise switch to amending selection mode.
+
+ gv restore previous visual selection.
+
+ v, V, Ctrl-C or Escape
+ leave visual mode if not in amending mode, otherwise switch to
+ normal visual selection.
+
+ Ctrl-G switch type of amending by round robin scheme: append -> remove
+ -> invert.
+
+ : enter command line mode. Selection is cleared on leaving the
+ mode.
+
+ o switch active selection bound.
+
+ O switch active selection bound.
+
+ gu, u make names of selected files lowercase.
+
+ gU, U make names of selected files uppercase.
+
+ cl change target of symbolic link(s).
+
+ cw same as running :rename command without arguments.
+
+View Mode
+ This mode tries to imitate the less program. List of builtin shortcuts
+ can be found below. Shortcuts can be customized using :qmap, :qnoremap
+ and :qunmap command-line commands.
+
+ Shift-Tab, Tab, q, Q, ZZ
+ return to normal mode.
+
+ [count]e, [count]Ctrl-E, [count]j, [count]Ctrl-N, [count]Enter
+ scroll forward one line (or [count] lines).
+
+ [count]y, [count]Ctrl-Y, [count]k, [count]Ctrl-K, [count]Ctrl-P
+ scroll backward one line (or [count] lines).
+
+ [count]f, [count]Ctrl-F, [count]Ctrl-V, [count]Space
+ scroll forward one window (or [count] lines).
+
+ [count]b, [count]Ctrl-B, [count]Alt-V
+ scroll backward one window (or [count] lines).
+
+ [count]z
+ scroll forward one window (and set window to [count]).
+
+ [count]w
+ scroll backward one window (and set window to [count]).
+
+ [count]Alt-Space
+ scroll forward one window, but don't stop at end-of-file.
+
+ [count]d, [count]Ctrl-D
+ scroll forward one half-window (and set half-window to [count]).
+
+ [count]u, [count]Ctrl-U
+ scroll backward one half-window (and set half-window to
+ [count]).
+
+ r, Ctrl-R, Ctrl-L
+ repaint screen.
+
+ R reload view preserving scroll position.
+
+ F toggle automatic forwarding. Roughly equivalent to periodic
+ file reload and scrolling to the bottom. The behaviour is simi-
+ lar to `tail -F` or F key in less.
+
+ a switch to the next viewer. Does nothing for preview constructed
+ via %q macro.
+
+ A switch to the previous viewer. Does nothing for preview con-
+ structed via %q macro.
+
+ i toggle raw mode (ignoring of defined viewers). Does nothing for
+ preview constructed via %q macro.
+
+ [count]/pattern
+ search forward for ([count]-th) matching line.
+
+ [count]?pattern
+ search backward for ([count]-th) matching line.
+
+ [count]n
+ repeat previous search (for [count]-th occurrence).
+
+ [count]N
+ repeat previous search in reverse direction (for [count]-th oc-
+ currence).
+
+ [count]g, [count]<, [count]Alt-<
+ scroll to the first line of the file (or line [count]).
+
+ [count]G, [count]>, [count]Alt->
+ scroll to the last line of the file (or line [count]).
+
+ [count]p, [count]%
+ scroll to the beginning of the file (or N percent into file).
+
+ v invoke an editor to edit the current file being viewed. The
+ command for editing is taken from the 'vicmd' or 'vixcmd' option
+ value and extended with middle line number prepended by a plus
+ sign and name of the current file.
+
+ All "Ctrl-W x" keys work the same was as in Normal mode. Active mode
+ is automatically changed on navigating among windows. When less-like
+ mode activated on file preview is left using one by "Ctrl-W x" keys,
+ its state is stored until another file is displayed using preview (it's
+ possible to leave the mode, hide preview pane, do something else, then
+ get back to the file and show preview pane again with previously stored
+ state in it).
+
+Command line Mode
+ These keys are available in all submodes of the command line mode: com-
+ mand, search, prompt and filtering.
+
+ Down, Up, Left, Right, Home, End and Delete are extended keys and they
+ are not available if vifm is compiled with --disable-extended-keys op-
+ tion.
+
+ Esc, Ctrl-C
+ leave command line mode, cancels input. Cancelled input is
+ saved into appropriate history and can be recalled later.
+
+ Ctrl-M, Enter
+ execute command and leave command line mode.
+
+ Ctrl-I, Tab
+ complete command or its argument.
+
+ Shift-Tab
+ complete in reverse order.
+
+ Ctrl-_ stop completion and return original input.
+
+ Ctrl-B, Left
+ move cursor to the left.
+
+ Ctrl-F, Right
+ move cursor to the right.
+
+ Ctrl-A, Home
+ go to line beginning.
+
+ Ctrl-E, End
+ go to line end.
+
+ Alt-B go to the beginning of previous word.
+
+ Alt-F go to the end of next word.
+
+ Ctrl-U remove characters from cursor position till the beginning of
+ line.
+
+ Ctrl-K remove characters from cursor position till the end of line.
+
+ Ctrl-H, Backspace
+ remove character before the cursor.
+
+ Ctrl-D, Delete
+ remove character under the cursor.
+
+ Ctrl-W remove characters from cursor position till the beginning of
+ previous word.
+
+ Alt-D remove characters from cursor position till the beginning of
+ next word.
+
+ Ctrl-T swap the order of current and previous character and move cursor
+ forward or, if cursor past the end of line, swap the order of
+ two last characters in the line.
+
+ Alt-. insert last part of previous command to current cursor position.
+ Each next call will insert last part of older command.
+
+ Ctrl-G edit command-line content in external editor. See "Command line
+ editing" section for details.
+
+ Ctrl-N recall more recent command-line from history.
+
+ Ctrl-P recall older command-line from history.
+
+ Up recall more recent command-line from history, that begins as the
+ current command-line.
+
+ Down recall older command-line from history, that begins as the cur-
+ rent command-line.
+
+ Ctrl-] trigger abbreviation expansion.
+
+ Ctrl-R =
+ insert result of evaluating an expression. Expression is to be
+ entered via nested command-line prompt (where this key does
+ nothing). Expansion of an erroneous expression is empty.
+
+Fast navigation
+ In order to streamline navigation through directory tree, you can enter
+ a special form of command-line mode from search or local filter prompt.
+ Once activated, pressing Enter opens currently selected directory and
+ clears the prompt in anticipation of the next component of the path.
+ If entry under the cursor is a file, it is opened and the mode is fin-
+ ished.
+
+ This behaviour is embedded in a command-line mode, but doesn't update
+ input histories nor expands abbreviations and redefines some of the
+ mode's mappings for the purpose of faster navigation through the file
+ system rather than command-line editing. When on, prompt gets "nav"
+ prefix.
+
+ You can enable this behaviour on search by default via a mapping like:
+
+ nnoremap / /
+
+
+ Ctrl-Y enter navigation mode. Works only for search and local filter
+ started from a normal mode and only when 'incsearch' is set
+ ('wrapscan' is also nice to have set for search).
+
+ Ctrl-Y return to a regular command-line mode.
+
+ Enter, Right
+ either enter a directory under the cursor without leaving the
+ mode and clear the prompt or leave the mode for files. If
+ 'navoptions' specifies "open:all" a file under the cursor is
+ opened after leaving the mode.
+
+ Ctrl-O, Left
+ go to parent directory.
+
+ Ctrl-J leave the mode without undoing cursor position or filter state.
+
+ Ctrl-N, Down
+ move view cursor down.
+
+ Ctrl-P, Up
+ move view cursor up.
+
+ Page Down
+ scroll view down.
+
+ Page Up
+ scroll view up.
+
+ Home move view cursor to the first item.
+
+ End move view cursor to the last item.
+
+Pasting special values
+ The shortcuts listed below insert specified values into current cursor
+ position. Last key of every shortcut references value that it inserts:
+ - c - [c]urrent file
+ - d - [d]irectory path
+ - e - [e]xtension of a file name
+ - r - [r]oot part of a file name
+ - t - [t]ail part of directory path
+
+ - a - [a]utomatic filter
+ - m - [m]anual filter
+ - = - local filter, which is bound to "=" in normal mode
+
+ Values related to filelist in current pane are available through Ctrl-X
+ prefix, while values from the other pane have doubled Ctrl-X key as
+ their prefix (doubled Ctrl-X is presumably easier to type than upper-
+ case letters; it's still easy to remap the keys to correspond to names
+ of similar macros).
+
+ Ctrl-X c
+ name of the current file of the active pane.
+
+ Ctrl-X d
+ path to the current directory of the active pane.
+
+ Ctrl-X e
+ extension of the current file of the active pane.
+
+ Ctrl-X r
+ name root of current file of the active pane.
+
+ Ctrl-X t
+ the last component of path to the current directory of the ac-
+ tive pane.
+
+ Ctrl-X Ctrl-X c
+ name of the current file of the inactive pane.
+
+ Ctrl-X Ctrl-X d
+ path to the current directory of the inactive pane.
+
+ Ctrl-X Ctrl-X e
+ extension of the current file of the inactive pane.
+
+ Ctrl-X Ctrl-X r
+ name root of current file of the inactive pane.
+
+ Ctrl-X Ctrl-X t
+ the last component of path to the current directory of the inac-
+ tive pane.
+
+
+ Ctrl-X a
+ value of implicit permanent filter (old name "automatic") of the
+ active pane.
+
+ Ctrl-X m
+ value of explicit permanent filter (old name "manual") of the
+ active pane.
+
+ Ctrl-X =
+ value of local filter of the active pane.
+
+
+ Ctrl-X /
+ last pattern from search history.
+
+Command line editing
+ vifm provides a facility to edit several kinds of data, that is usually
+ edited in command-line mode, in external editor (using command speci-
+ fied by 'vicmd' or 'vixcmd' option). This has at least two advantages
+ over built-in command-line mode:
+ - one can use full power of Vim to edit text;
+ - finding and reusing history entries becomes possible.
+
+ The facility is supported by four input submodes of the command-line:
+ - command;
+ - forward search;
+ - backward search;
+ - file rename (see description of cw and cW normal mode keys).
+
+ Editing command-line using external editor is activated by the Ctrl-G
+ shortcut. It's also possible to do almost the same from Normal and
+ Visual modes using q:, q/ and q? commands.
+
+ Temporary file created for the purpose of editing the line has the fol-
+ lowing structure:
+
+ 1. First line, which is either empty or contains text already entered
+ in command-line.
+
+ 2. 2nd and all other lines with history items starting with the most
+ recent one. Altering this lines in any way won't change history
+ items stored by vifm.
+
+ After editing application is finished the first line of the file is
+ taken as the result of operation, when the application returns zero
+ exit code. If the application returns an error (see :cquit command in
+ Vim), all the edits made to the file are ignored, but the initial value
+ of the first line is saved in appropriate history.
+
+More Mode
+ This is the mode that appears when status bar content is so big that it
+ doesn't fit on the screen. One can identify the mode by "-- More --"
+ message at the bottom.
+
+ The following keys are handled in this mode:
+
+
+ Enter, Ctrl-J, j or Down
+ scroll one line down.
+
+ Backspace, k or Up
+ scroll one line up.
+
+
+ d scroll one page (half of a screen) down.
+
+ u scroll one page (half of a screen) up.
+
+
+ Space, f or PageDown
+ scroll down a screen.
+
+ b or PageUp
+ scroll up a screen.
+
+
+ G scroll to the bottom.
+
+ g scroll to the top.
+
+
+ q, Escape or Ctrl-C
+ quit the mode.
+
+ : switch to command-line mode.
+
+Commands
+ Commands are executed with :command_name
+
+ Commented out lines should start with the double quote symbol ("),
+ which may be preceded by whitespace characters intermixed with colons.
+ Inline comments can be added at the end of the line after double quote
+ symbol, only last line of a multi-line command can contain such com-
+ ment. Not all commands support inline comments as their syntax con-
+ flicts with names of registers and fields where double quotes are al-
+ lowed.
+
+ Most of the commands have two forms: complete and the short one. Exam-
+ ple:
+
+ :noh[lsearch]
+
+ This means the complete command is nohlsearch, and the short one is
+ noh.
+
+ Most of command-line commands completely reset selection in the current
+ view. However, there are several exceptions:
+
+ - `:invert s` most likely leaves some files selected;
+
+ - :view command;
+
+ - :normal command (when it doesn't leave command-line mode);
+
+ - :if and :else commands don't affect selection on successful execu-
+ tion.
+
+ '|' can be used to separate commands, so you can give multiple commands
+ in one line. If you want to use '|' in an argument, precede it with
+ '\'.
+
+ These commands see '|' as part of their arguments even when it's es-
+ caped:
+
+ :[range]!
+ :amap
+ :anoremap
+ :autocmd
+ :cabbrev
+ :cmap
+ :cnoreabbrev
+ :cnoremap
+ :command
+ :dmap
+ :dnoremap
+ :filetype
+ :fileviewer
+ :filextype
+ :keepsel
+ :map
+ :mmap
+ :mnoremap
+ :nmap
+ :nnoremap
+ :noremap
+ :normal
+ :qmap
+ :qnoremap
+ :vmap
+ :vnoremap
+ :wincmd
+ :windo
+ :winrun
+
+ To be able to use another command after one of these, wrap it with the
+ :execute command. An example:
+
+ if filetype('.') == 'reg' | execute '!!echo regular file' | endif
+
+ :[count]
+
+ :number
+ move to the file number.
+ :12 would move to the 12th file in the list.
+ :0 move to the top of the list.
+ :$ move to the bottom of the list.
+
+ :[count]command
+ The only builtin :[count]command are :[count]d[elete] and
+ :[count]y[ank].
+
+ :d3 would delete three files starting at the current file position
+ moving down.
+
+ :3d would delete one file at the third line in the list.
+
+ :command [args]
+
+ :[range]!program
+ execute command via shell. Accepts macros.
+
+ :[range]!command &
+
+ same as above, but the command is run in the background using vifm's
+ means.
+
+ Programs that write to stderr create error dialogs showing errors of
+ the command.
+
+ Note the space before ampersand symbol, if you omit it, command will be
+ run in the background using job control of your shell.
+
+ Accepts macros.
+
+ :!!
+
+ :[range]!!command
+ same as :!, but pauses before returning.
+
+ :!! repeat the last command.
+
+ :alink
+
+ :[range]alink[!?]
+ create absolute symbolic links to files in directory of inactive
+ view. With "?" prompts for destination file names in an edi-
+ tor. "!" forces overwrite.
+
+ :[range]alink[!] path
+ create absolute symbolic links to files in directory specified
+ by the path (absolute or relative to directory of inactive
+ view).
+
+ :[range]alink[!] name1 name2...
+ create absolute symbolic links of files in directory of other
+ view giving each next link a corresponding name from the argu-
+ ment list.
+
+ :[range]alink[!?] -skip ...
+ see "-skip parameter" section below.
+
+ :apropos
+
+ :apropos keyword...
+ create a menu of items returned by the apropos command. Select-
+ ing an item in the menu opens corresponding man page. By de-
+ fault the command relies on the external "apropos" utility,
+ which can be customized by altering value of the 'aproposprg'
+ option. See "Menus and dialogs" section for controls.
+
+ :autocmd
+
+ :au[tocmd] {event} {pat} {cmd}
+ register autocommand for the {event}, which can be:
+ - DirEnter - triggered after directory is changed
+ Event name is case insensitive.
+
+ {pat} is a comma-separated list of modified globs patterns,
+ which can contain tilde or environment variables. All paths use
+ slash ('/') as directory separator. The pattern can start with
+ a '!', which negates it. Patterns that do not contain slashes
+ are matched against the last item of the path only (e.g. "dir"
+ in "/path/dir"). Literal comma can be entered by doubling it.
+ Two modifications to globs matching are as follows:
+ - * - never matches a slash (i.e., can signify single direc-
+ tory level)
+ - ** - matches any character (i.e., can match path of arbi-
+ trary depth)
+
+ {cmd} is a :command or several of them separated with '|'.
+
+ Examples of patterns:
+ - conf.d - matches conf.d directory anywhere
+ - *.d - matches directories ending with ".d" anywhere
+ - **.git - matches something.git, but not .git anywhere
+ - **/.git/** - matches /path/.git/objects, but not /path/.git
+ - **/.git/**/ - matches /path/.git/ only (because of trailing
+ slash)
+ - /etc/* - matches /etc/conf.d/, /etc/X11, but not
+ /etc/X11/fs
+ - /etc/**/*.d - matches /etc/conf.d, /etc/X11/conf.d, etc.
+ - /etc/**/* - matches /etc/ itself and any file below it
+ - /etc/**/** - matches /etc/ itself and any file below it
+
+ :au[tocmd] [{event}] [{pat}]
+ list those autocommands that match given event-pattern combina-
+ tion.
+ {event} and {pat} can be omitted to list all autocommands. To
+ list any autocommands for specific pattern one can use * place-
+ holder in place of {event}.
+
+ :au[tocmd]! [{event}] [{pat}]
+ remove autocommands that match given event-pattern combination.
+ Syntax is the same as for listing above.
+
+ :apropos
+ repeat last :apropos command.
+
+ :bmark
+
+ :bmark tag1 [tag2 [tag3...]]
+ bookmark current directory with specified tags.
+
+ :bmark! path tag1 [tag2 [tag3...]]
+ same as :bmark, but allows bookmarking specific path instead of
+ current directory. This is for use in vifmrc and for bookmark-
+ ing files.
+
+ Path can contain macros that expand to single path (%c, %C, %d,
+ %D) or those that can expand to multiple paths, but contain only
+ one (%f, %F, %rx). The latter is done for convenience on using
+ the command interactively. Complex macros that include spaces
+ (e.g. "%c:gs/ /_") should be escaped.
+
+ :bmarks
+
+ :bmarks
+ display all bookmarks in a menu.
+
+ :bmarks [tag1 [tag2...]]
+ display menu of bookmarks that include all of the specified
+ tags. See "Menus and dialogs" section for controls.
+
+ :bmgo
+
+ :bmgo [tag1 [tag2...]]
+ when there are more than one match acts exactly like :bmarks,
+ otherwise navigates to single match immediately (and fails if
+ there is no match).
+
+ :cabbrev
+
+ :ca[bbrev]
+ display menu of command-line mode abbreviations. See "Menus and
+ dialogs" section for controls.
+
+ :ca[bbrev] lhs-prefix
+ display command-line mode abbreviations which left-hand side
+ starts with specified prefix.
+
+ :ca[bbrev] lhs rhs
+ register new or overwrites existing abbreviation for command-
+ line mode. rhs can contain spaces and any special sequences ac-
+ cepted in rhs of mappings (see "Mappings" section below). Ab-
+ breviations are expanded non-recursively.
+
+ :cnoreabbrev
+
+ :cnorea[bbrev]
+ display menu of command-line mode abbreviations. See "Menus and
+ dialogs" section for controls.
+
+ :cnorea[bbrev] lhs-prefix
+ display command-line mode abbreviations which left-hand side
+ starts with specified prefix.
+
+ :cnorea[bbrev] lhs rhs
+ same as :cabbrev, but mappings in rhs are ignored during expan-
+ sion.
+
+ :cd
+
+ :cd or :cd ~ or :cd $HOME
+ change to home directory.
+
+ :cd - go to the last visited directory.
+
+ :cd ~/dir
+ change directory to ~/dir.
+
+ :cd /curr/dir /other/dir
+ change directory of the current pane to /curr/dir and directory
+ of the other pane to /other/dir. Relative paths are assumed to
+ be relative to directory of current view. Command won't fail if
+ one of directories is invalid. All forms of the command accept
+ macros.
+
+ :cd! /dir
+ same as :cd /dir /dir.
+
+ :cds
+
+ :cds[!] pattern string
+ navigate to path obtained by substituting first match in current
+ path. Arguments can include slashes, but starting first argu-
+ ment with a separator will activate below form of the command.
+ Specifying "!" changes directory of both panes.
+
+ Available flags:
+
+ - i - ignore case (the 'ignorecase' and 'smartcase' options are not
+ used)
+
+ - I - don't ignore case (the 'ignorecase' and 'smartcase' options are
+ not used)
+
+ :cds[!]/pattern/string/[flags]
+ same as above, but with :substitute-like syntax. Other punctua-
+ tion characters can be used as separators.
+
+ :change
+
+ :c[hange]
+ show a dialog to alter properties of files.
+
+ :chmod
+
+ :[range]chmod
+ display file attributes (permission on *nix and properties on
+ Windows) change dialog.
+
+ :[range]chmod[!] arg...
+ only for *nix
+ change permissions for files. See `man 1 chmod` for arg format.
+ "!" means set permissions recursively.
+
+ :chown
+
+ :[range]chown
+ only for *nix
+ same as co key in normal mode.
+
+ :[range]chown [user][:][group]
+ only for *nix
+ change owner and/or group of files. Operates on directories re-
+ cursively.
+
+ :clone
+
+ :[range]clone[!?]
+ clones files in current directory. With "?" vifm will open vi
+ to edit file names. "!" forces overwrite. Macros are expanded.
+
+ :[range]clone[!] path
+ clones files to directory specified with the path (absolute or
+ relative to current directory). "!" forces overwrite. Macros
+ are expanded.
+
+ :[range]clone[!] name1 name2...
+ clones files in current directory giving each next clone a cor-
+ responding name from the argument list. "!" forces overwrite.
+ Macros are expanded.
+
+ :colorscheme
+
+ :colo[rscheme]?
+ print current color scheme name on the status bar.
+
+ :colo[rscheme]
+ display a menu with a list of available color schemes. You can
+ choose primary color scheme here. It is used for view if no di-
+ rectory specific colorscheme fits current path. It's also used
+ to set border color (except view titles) and colors in menus and
+ dialogs. See "Menus and dialogs" section for controls.
+
+ :colo[rscheme] color_scheme_name
+ change primary color scheme to color_scheme_name. In case of
+ errors (e.g. some colors are not supported by terminal) either
+ nothing is changed or color scheme is reset to builtin colors to
+ ensure that TUI is left in a usable state.
+
+ :colo[rscheme] color_scheme_name directory
+ associate directory with the color scheme. The directory argu-
+ ment can be either absolute or relative path when :colorscheme
+ command is executed from command line, but mandatory should be
+ an absolute path when the command is executed in scripts loaded
+ at startup (until vifm is completely loaded).
+
+ :colo[rscheme] color_scheme_name color_scheme_name...
+ loads the first color scheme in the order given that exists and
+ is supported by the terminal. If none matches, current one re-
+ mains unchanged. For example:
+
+ " use a separate color scheme for panes which are inside FUSE mounts
+ execute 'colorscheme in-fuse' &fusehome
+
+ :comclear
+
+ :comc[lear]
+ remove all user defined commands.
+
+ :command
+
+ :com[mand]
+ display a menu of user commands. See "Menus and dialogs" sec-
+ tion for controls.
+
+ :com[mand] prefix
+ display user defined commands that start with the prefix.
+
+ :com[mand] name action[ &]
+ set or redefine a user command.
+ Use :com[mand]! to overwrite a previously set command of the
+ same name. Builtin commands can't be redefined.
+ User commands must start with an upper or lower case letter.
+ Command name can't contain special symbols except for a single
+ trailing '?' or '!'. Numbers are allowed provided that they
+ don't cause parsing ambiguity (no command name prefix that pre-
+ cedes a digit can match an existing command unless it has a
+ digit in the same place), for example:
+ " good
+ :command mp3 command
+ " good
+ :command mp4 command
+ :command mp3! command
+ :command mp4? command
+ " bad
+ :command mp command
+ :command mp44 command
+ " good
+ :command mp4c command
+
+ User commands are run in a shell by default (see below for syn-
+ tax of other options). To run a command in the background you
+ must mark it as a background command by adding " &" after the
+ command's action (e.g., `:com rm rm %f &`).
+ User commands of all kinds have macros expanded in them. See
+ "Command macros" section for more information.
+
+ :com[mand] name /pattern
+ set search pattern.
+
+ :com[mand] name =pattern
+ set local filter value.
+
+ :com[mand] name filter{:filter args}
+ set file name filter (see :filter command description). For ex-
+ ample:
+
+ " display only audio files
+ :command onlyaudio filter/.+.\(mp3|wav|mp3|flac|ogg|m4a|wma|ape\)$/i
+ " display everything except audio files
+ :command noaudio filter!/.+.\(mp3|wav|mp3|flac|ogg|m4a|wma|ape\)$/i
+
+ :com[mand] name :commands
+ set kind of an alias for internal commands (like in a shell).
+ Passes range given to alias to an aliased command, so running
+ :%cp after
+ :command cp :copy %a
+ equals
+ :%copy
+
+ :compare
+
+ :compare [byname | bysize | bycontents |
+ listall | listunique | listdups |
+ ofboth | ofone |
+ groupids | grouppaths |
+ skipempty | withicase | withrcase |
+ showidentical | showdifferent | showuniqueleft | showuni-
+ queright]...
+ compare files in one or two views according to the arguments.
+ The default is "bycontents listall ofboth grouppaths showidenti-
+ cal showdifferent showuniqueleft showuniqueright". See "Compare
+ views" section below for details. Diff structure is incompati-
+ ble with alternative representations, so values of 'lsview' and
+ 'millerview' options are ignored.
+
+ :compare! (showidentical | showdifferent | showuniqueleft |
+ showuniqueright)... this invocation form works only when
+ compare view is active and results in redoing of the previous
+ :compare with toggled state of the passed in options.
+
+ :copen
+
+ :cope[n]
+ reopens the last visible menu that has navigation to files by
+ default, if any.
+
+ :copy
+
+ :[range]co[py][!?][ &]
+ copy files to directory of other view. With "?" prompts for
+ destination file names in an editor. "!" forces overwrite.
+
+ :[range]co[py][!] path[ &]
+ copy files to directory specified with the path (absolute or
+ relative to directory of other view). "!" forces overwrite.
+
+ :[range]co[py][!] name1 name2...[ &]
+ copy files to directory of other view giving each next file a
+ corresponding name from the argument list. "!" forces over-
+ write.
+
+ :[range]co[py][!?] -skip ...[ &]
+ see "-skip parameter" section below.
+
+ :cquit
+
+ :cq[uit][!]
+ same as :quit, but also aborts directory choosing via
+ --choose-dir (empties output file) and returns non-zero exit
+ code.
+
+ :cunabbrev
+
+ :cuna[bbrev] lhs
+ unregister command-line mode abbreviation by its lhs.
+
+ :cuna[bbrev] rhs
+ unregister command-line mode abbreviation by its rhs, so that
+ abbreviation could be removed even after expansion.
+
+ :delbmarks
+
+ :delbmarks
+ remove bookmarks from current directory.
+
+ :delbmarks tag1 [tag2 [tag3...]]
+ remove set of bookmarks that include all of the specified tags.
+
+ :delbmarks!
+ remove all bookmarks.
+
+ :delbmarks! path1 [path2 [path3...]]
+ remove bookmarks of listed paths.
+
+ :delcommand
+
+ :delc[ommand] user_command
+ remove user defined command named user_command.
+
+ :delete
+
+ :[range]d[elete][!][ &]
+ delete selected file or files. "!" means complete removal
+ (omitting trash).
+
+ :[range]d[elete][!] [reg] [count][ &]
+ delete selected or [count] files to the reg register. "!" means
+ complete removal (omitting trash).
+
+ :delmarks
+
+ :delm[arks]!
+ delete all marks.
+
+ :delm[arks] marks ...
+ delete specified marks, each argument is treated as a set of
+ marks.
+
+ :delsession
+
+ :delsession
+ delete specified session if it was stored previously. Deleting
+ current session doesn't detach it.
+
+ :display
+
+ :di[splay]
+ display menu with registers content.
+
+ :di[splay] list ...
+ display the contents of the numbered and named registers that
+ are mentioned in list (for example "az to display "", "a and "z
+ content).
+
+ :dirs
+
+ :dirs display directory stack in a menu. See "Menus and dialogs" sec-
+ tion for controls.
+
+ :echo
+
+ :ec[ho] [...]
+ evaluate each argument as an expression and output them sepa-
+ rated with a space. See help on :let command for a definition
+ of .
+
+ :edit
+
+ :[range]e[dit] [file...]
+ open selected or passed file(s) in editor. Macros and environ-
+ ment variables are expanded.
+
+ :else
+
+ :el[se]
+ execute commands until next matching :endif if all other condi-
+ tions didn't match. See also help on :if and :endif commands.
+
+ :elseif
+
+ :elsei[f] {expr1}
+ execute commands until next matching :elseif, :else or :endif if
+ conditions of previous :if and :elseif branches were evaluated
+ to zero. See also help on :if and :endif commands.
+
+ :empty
+
+ :empty permanently remove files from all existing non-empty trash di-
+ rectories (see "Trash directory" section below). Trash directo-
+ ries which are specified via %r and/or %u also get deleted com-
+ pletely. Also remove all operations from undolist that have no
+ sense after :empty and remove all records about files located
+ inside directories from all registers. Removal is performed as
+ background task with undetermined amount of work and can be
+ checked via :jobs menu.
+
+ :endif
+
+ :en[dif]
+ end conditional block. See also help on :if and :else commands.
+
+ :execute
+
+ :exe[cute] [...]
+ evaluate each argument as an expression and join results sepa-
+ rated by a space to get a single string which is then executed
+ as a command-line command. See help on :let command for a defi-
+ nition of .
+
+ :exit
+
+ :exi[t][!]
+ same as :quit.
+
+ :file
+
+ :f[ile][ &]
+ display menu of programs set for the file type of the current
+ file. " &" forces running associated program in background.
+ See "Menus and dialogs" section for controls.
+
+ :f[ile] arg[ &]
+ run associated command that begins with the arg skipping opening
+ menu. " &" forces running associated program in background.
+
+ :filetype
+
+ :filet[ype] pattern-list [{descr}]def_prog[ &],[{descr}]prog2[ &],...
+ associate given program list to each of the patterns. Associ-
+ ated program (command) is used by handlers of l and Enter keys
+ (and also in the :file menu). If you need to insert comma into
+ command just double it (",,"). Space followed by an ampersand
+ as two last characters of a command means running of the command
+ in the background. Optional description can be given to each
+ command to ease understanding of what command will do in the
+ :file menu. Vifm will try the rest of the programs for an asso-
+ ciation when the default isn't found. When program entry
+ doesn't contain any of vifm macros, name of current file is ap-
+ pended as if program entry ended with %c macro on *nix and %"c
+ on Windows. On Windows path to executables containing spaces
+ can (and should be for correct work with such paths) be double
+ quoted. See "Patterns" section below for pattern definition and
+ "Selection" section for how selection is handled. See also "Au-
+ tomatic FUSE mounts" section below. Example for zip archives
+ and several actions:
+
+ filetype *.zip,*.jar,*.war,*.ear
+ \ {Mount with fuse-zip}
+ \ FUSE_MOUNT|fuse-zip %SOURCE_FILE %DESTINATION_DIR,
+ \ {View contents}
+ \ zip -sf %c | less,
+ \ {Extract here}
+ \ tar -xf %c,
+
+ Note that on OS X when `open` is used to call an app, vifm is
+ unable to check whether that app is actually available. So if
+ automatic skipping of programs that aren't there is desirable,
+ `open` should be replaced with an actual command.
+
+ :filet[ype] filename
+ list (in menu mode) currently registered patterns that match
+ specified file name. Same as ":filextype filename".
+
+ :filextype
+
+ :filex[type] pattern-list [{ description }] def_program,program2,...
+ same as :filetype, but this command is ignored if not running in
+ X. In X :filextype is equal to :filetype. See "Patterns" sec-
+ tion below for pattern definition and "Selection" section for
+ how selection is handled. See also "Automatic FUSE mounts" sec-
+ tion below.
+
+ For example, consider the following settings (the order might
+ seem strange, but it's for the demonstration purpose):
+
+ filetype *.html,*.htm
+ \ {View in lynx}
+ \ lynx
+ filextype *.html,*.htm
+ \ {Open with dwb}
+ \ dwb %f %i &,
+ filetype *.html,*.htm
+ \ {View in links}
+ \ links
+ filextype *.html,*.htm
+ \ {Open with firefox}
+ \ firefox %f &,
+ \ {Open with uzbl}
+ \ uzbl-browser %f %i &,
+
+ If you're using vifm inside a terminal emulator that is running
+ in graphical environment (when X is used on *nix; always on Win-
+ dows), vifm attempts to run application in this order:
+
+ 1. lynx
+ 2. dwb
+ 3. links
+ 4. firefox
+ 5. uzbl
+
+ If there is no graphical environment (checked by presence of
+ non-empty $DISPLAY or $WAYLAND_DISPLAY environment variable on
+ *nix; never happens on Windows), the list will look like:
+
+ 1. lynx
+ 2. links
+
+ Just as if all :filextype commands were not there.
+
+ The purpose of such differentiation is to allow comfortable use
+ of vifm with same settings in desktop environment/through remote
+ connection (SSH)/in native console.
+
+ Note that on OS X $DISPLAY isn't defined unless you define it,
+ so :filextype should be used only if you set $DISPLAY in some
+ way.
+
+ :filext[ype] filename
+ list (in menu mode) currently registered patterns that match
+ specified file name. Same as ":filetype filename".
+
+ :fileviewer
+
+ :filev[iewer] pattern-list command1,command2,...
+ register specified list of commands as viewers for each of the
+ patterns. Viewer is a command which output is captured and dis-
+ played in one of the panes of vifm after pressing "e" or running
+ :view command. When the command doesn't contain any of vifm
+ macros, name of current file is appended as if command ended
+ with %c macro. Comma escaping and missing commands processing
+ rules as for :filetype apply to this command. See "Patterns"
+ section below for pattern definition. Supports Lua handlers.
+
+ Example for zip archives:
+
+ fileviewer *.zip,*.jar,*.war,*.ear zip -sf %c, echo "No zip to preview:"
+
+ :filev[iewer] filename
+ list (in menu mode) currently registered patterns that match
+ specified filename.
+
+ :filter
+
+ :filter[!] {pattern}
+ filter files matching the pattern out of directory listings.
+ '!' controls state of filter inversion after updating filter
+ value (see also 'cpoptions' description). Filter is matched
+ case sensitively on *nix and case insensitively on Windows. See
+ "File Filters" and "Patterns" sections.
+
+ Example:
+
+ " filter all files ending in .o from the filelist.
+ :filter /.o$/
+
+
+ :filter[!] {empty-pattern}
+ same as above, but use last search pattern as pattern value.
+
+ Example:
+
+ :filter //I
+
+
+ :filter
+ reset filter (set it to an empty string) and show all files.
+
+ :filter!
+ same as :invert.
+
+ :filter?
+ show information on local, name and auto filters.
+
+ :find
+
+ :[range]fin[d] pattern
+ display results of find command in the menu. Searches among se-
+ lected files if any. Accepts macros. By default the command
+ relies on the external "find" utility, which can be customized
+ by altering value of the 'findprg' option.
+
+ :[range]fin[d] -opt...
+ same as :find above, but user defines all find arguments.
+ Searches among selected files if any.
+
+ :[range]fin[d] path -opt...
+ same as :find above, but user defines all find arguments. Ig-
+ nores selection and range.
+
+ :[range]fin[d]
+ repeat last :find command.
+
+ :finish
+
+ :fini[sh]
+ stop sourcing a script. Can only be used in a vifm script file.
+ This is a quick way to skip the rest of the file.
+
+ :goto
+
+ :go[to]
+ change directory if necessary and put specified path under the
+ cursor. The path should be existing non-root path. Macros and
+ environment variables are expanded.
+
+ :grep
+
+ :[range]gr[ep][!] pattern
+ will show results of grep command in the menu. Add "!" to re-
+ quest inversion of search (look for lines that do not match pat-
+ tern). Searches among selected files if any and no range given.
+ Ignores binary files by default. By default the command relies
+ on the external "grep" utility, which can be customized by al-
+ tering value of the 'grepprg' option.
+
+ :[range]gr[ep][!] -opt...
+ same as :grep above, but user defines all grep arguments, which
+ are not escaped. Searches among selected files if any.
+
+ :[range]gr[ep][!]
+ repeat last :grep command. "!" of this command inverts "!" in
+ repeated command.
+
+ :help
+
+ :h[elp]
+ show the help file.
+
+ :h[elp] argument
+ is the same as using ':h argument' in vim. Use vifm-
+ to get help on vifm (tab completion works). This form of the
+ command doesn't work when 'vimhelp' option is off.
+
+ :hideui
+
+ :hideui
+ hide interface to show previous commands' output.
+
+ :highlight
+
+ :hi[ghlight]
+ display information about all highlight groups active at the mo-
+ ment.
+
+ :hi[ghlight] clear
+ reset all highlighting to builtin defaults and removed all file-
+ name-specific rules.
+
+ :hi[ghlight] clear ( {pat1,pat2,...} | /regexp/ )
+ remove specified rule.
+
+ :hi[ghlight] ( group-name | {pat1,pat2,...} | /regexp/ )
+ display information on given highlight group or file name pat-
+ tern of color scheme used in the active view.
+
+ :hi[ghlight] ( group-name | {pat1,pat2,...} | /regexp/[iI] )
+ cterm=style | ctermfg=color | ctermbg=color | gui=style | guifg=color |
+ guibg=color
+ set style (cterm, gui), foreground (ctermfg, guifg) and/or back-
+ ground (ctermbg, guibg) parameters of highlight group or file
+ name pattern for color scheme used in the active view.
+
+ All style values as well as color names are case insensitive.
+
+ Available style values (some of them can be combined):
+ - bold
+ - underline
+ - reverse or inverse
+ - standout
+ - italic (on unsupported systems becomes reverse)
+ - combine - add attributes of current group to attributes of the par-
+ ent in group hierarchy (see below) instead of replacing them
+ - none
+
+ Available group-name values:
+ - Win - color of all windows (views, dialogs, menus) and default color
+ for their content (e.g. regular files in views)
+ - AuxWin - color of auxiliary areas of windows
+ - OtherWin - color of inactive pane
+ - Border - color of vertical parts of the border
+ - TabLine - tab line color (for 'tabscope' set to "global")
+ - TabLineSel - color of the tip of selected tab (regardless of 'tab-
+ scope')
+ - TopLine - top line color of the other pane
+ - TopLineSel - top line color of the current pane
+ - CmdLine - the command line/status bar color
+ - ErrorMsg - color of error messages in the status bar
+ - StatusLine - color of the line above the status bar
+ - JobLine - color of job line that appears above the status line
+ - WildMenu - color of the wild menu items
+ - SuggestBox - color of key suggestion box
+ - CurrLine - line at cursor position in active view
+ - OtherLine - line at cursor position in inactive view
+ - OddLine - color of every second entry line in a pane
+ - LineNr - line number column of views
+ - Selected - color of selected files
+ - Directory - color of directories
+ - Link - color of symbolic links in the views
+ - BrokenLink - color of broken symbolic links
+ - HardLink - color of regular files with more than one hard link
+ - Socket - color of sockets
+ - Device - color of block and character devices
+ - Executable - color of executable files
+ - Fifo - color of fifo pipes
+ - CmpMismatch - color of mismatched files in side-by-side comparison
+ by path
+ - CmpUnmatched - comparison file entry that has no pair in the other
+ pane
+ - CmpBlank - entry placeholder in a compare view, paired with CmpUn-
+ matched
+ - User1..User20 - 20 colors which can be used via %* 'statusline'
+ macro
+
+ Available colors:
+ - -1 or default or none - default or transparent
+ - black and lightblack
+ - red and lightred
+ - green and lightgreen
+ - yellow and lightyellow
+ - blue and lightblue
+ - magenta and lightmagenta
+ - cyan and lightcyan
+ - white and lightwhite
+ - 0-255 - corresponding colors from 256-color palette (for ctermfg and
+ ctermbg)
+ - #rrggbb - direct ("gui", "true", 24-bit) color in hex-notation, each
+ of the three compontents are in the range 0x00 to 0xff (for guifg and
+ guibg)
+
+ Light versions of colors are regular colors with bold attribute set au-
+ tomatically in terminals that have less than 16 colors. So order of
+ arguments of :highlight command is important and it's better to put
+ "cterm" in front of others to prevent it from overwriting attributes
+ set by "ctermfg" or "ctermbg" arguments.
+
+ For convenience of color scheme authors xterm-like names for 256 color
+ palette is also supported. The mapping is taken from
+ http://vim.wikia.com/wiki/Xterm256_color_names_for_console_Vim
+ Duplicated entries were altered by adding an underscore followed by nu-
+ merical suffix.
+
+ 0 Black 86 Aquamarine1 172 Orange3
+ 1 Red 87 DarkSlateGray2 173 LightSalmon3_2
+ 2 Green 88 DarkRed_2 174 LightPink3
+ 3 Yellow 89 DeepPink4_2 175 Pink3
+ 4 Blue 90 DarkMagenta 176 Plum3
+ 5 Magenta 91 DarkMagenta_2 177 Violet
+ 6 Cyan 92 DarkViolet 178 Gold3_2
+ 7 White 93 Purple 179 LightGoldenrod3
+ 8 LightBlack 94 Orange4_2 180 Tan
+ 9 LightRed 95 LightPink4 181 MistyRose3
+ 10 LightGreen 96 Plum4 182 Thistle3
+ 11 LightYellow 97 MediumPurple3 183 Plum2
+ 12 LightBlue 98 MediumPurple3_2 184 Yellow3_2
+ 13 LightMagenta 99 SlateBlue1 185 Khaki3
+ 14 LightCyan 100 Yellow4 186 LightGoldenrod2
+ 15 LightWhite 101 Wheat4 187 LightYellow3
+ 16 Grey0 102 Grey53 188 Grey84
+ 17 NavyBlue 103 LightSlateGrey 189 LightSteelBlue1
+ 18 DarkBlue 104 MediumPurple 190 Yellow2
+ 19 Blue3 105 LightSlateBlue 191 DarkOliveGreen1
+ 20 Blue3_2 106 Yellow4_2 192 DarkOliveG-
+ reen1_2
+ 21 Blue1 107 DarkOliveGreen3 193 DarkSeaGreen1_2
+ 22 DarkGreen 108 DarkSeaGreen 194 Honeydew2
+ 23 DeepSkyBlue4 109 LightSkyBlue3 195 LightCyan1
+ 24 DeepSkyBlue4_2 110 LightSkyBlue3_2 196 Red1
+ 25 DeepSkyBlue4_3 111 SkyBlue2 197 DeepPink2
+ 26 DodgerBlue3 112 Chartreuse2_2 198 DeepPink1
+ 27 DodgerBlue2 113 DarkOliveGreen3_2 199 DeepPink1_2
+ 28 Green4 114 PaleGreen3_2 200 Magenta2_2
+ 29 SpringGreen4 115 DarkSeaGreen3 201 Magenta1
+ 30 Turquoise4 116 DarkSlateGray3 202 OrangeRed1
+ 31 DeepSkyBlue3 117 SkyBlue1 203 IndianRed1
+ 32 DeepSkyBlue3_2 118 Chartreuse1 204 IndianRed1_2
+ 33 DodgerBlue1 119 LightGreen_2 205 HotPink
+ 34 Green3 120 LightGreen_3 206 HotPink_2
+ 35 SpringGreen3 121 PaleGreen1 207 MediumOrchid1_2
+ 36 DarkCyan 122 Aquamarine1_2 208 DarkOrange
+ 37 LightSeaGreen 123 DarkSlateGray1 209 Salmon1
+ 38 DeepSkyBlue2 124 Red3 210 LightCoral
+ 39 DeepSkyBlue1 125 DeepPink4_3 211 PaleVioletRed1
+ 40 Green3_2 126 MediumVioletRed 212 Orchid2
+ 41 SpringGreen3_2 127 Magenta3 213 Orchid1
+ 42 SpringGreen2 128 DarkViolet_2 214 Orange1
+ 43 Cyan3 129 Purple_2 215 SandyBrown
+ 44 DarkTurquoise 130 DarkOrange3 216 LightSalmon1
+ 45 Turquoise2 131 IndianRed 217 LightPink1
+ 46 Green1 132 HotPink3 218 Pink1
+ 47 SpringGreen2_2 133 MediumOrchid3 219 Plum1
+ 48 SpringGreen1 134 MediumOrchid 220 Gold1
+ 49 MediumSpringGreen 135 MediumPurple2 221 LightGolden-
+ rod2_2
+ 50 Cyan2 136 DarkGoldenrod 222 LightGolden-
+ rod2_3
+ 51 Cyan1 137 LightSalmon3 223 NavajoWhite1
+ 52 DarkRed 138 RosyBrown 224 MistyRose1
+ 53 DeepPink4 139 Grey63 225 Thistle1
+ 54 Purple4 140 MediumPurple2_2 226 Yellow1
+ 55 Purple4_2 141 MediumPurple1 227 LightGoldenrod1
+ 56 Purple3 142 Gold3 228 Khaki1
+ 57 BlueViolet 143 DarkKhaki 229 Wheat1
+ 58 Orange4 144 NavajoWhite3 230 Cornsilk1
+ 59 Grey37 145 Grey69 231 Grey100
+ 60 MediumPurple4 146 LightSteelBlue3 232 Grey3
+ 61 SlateBlue3 147 LightSteelBlue 233 Grey7
+ 62 SlateBlue3_2 148 Yellow3 234 Grey11
+ 63 RoyalBlue1 149 DarkOliveGreen3_3 235 Grey15
+ 64 Chartreuse4 150 DarkSeaGreen3_2 236 Grey19
+ 65 DarkSeaGreen4 151 DarkSeaGreen2 237 Grey23
+ 66 PaleTurquoise4 152 LightCyan3 238 Grey27
+ 67 SteelBlue 153 LightSkyBlue1 239 Grey30
+ 68 SteelBlue3 154 GreenYellow 240 Grey35
+ 69 CornflowerBlue 155 DarkOliveGreen2 241 Grey39
+ 70 Chartreuse3 156 PaleGreen1_2 242 Grey42
+ 71 DarkSeaGreen4_2 157 DarkSeaGreen2_2 243 Grey46
+ 72 CadetBlue 158 DarkSeaGreen1 244 Grey50
+ 73 CadetBlue_2 159 PaleTurquoise1 245 Grey54
+ 74 SkyBlue3 160 Red3_2 246 Grey58
+ 75 SteelBlue1 161 DeepPink3 247 Grey62
+ 76 Chartreuse3_2 162 DeepPink3_2 248 Grey66
+ 77 PaleGreen3 163 Magenta3_2 249 Grey70
+ 78 SeaGreen3 164 Magenta3_3 250 Grey74
+ 79 Aquamarine3 165 Magenta2 251 Grey78
+ 80 MediumTurquoise 166 DarkOrange3_2 252 Grey82
+ 81 SteelBlue1_2 167 IndianRed_2 253 Grey85
+ 82 Chartreuse2 168 HotPink3_2 254 Grey89
+ 83 SeaGreen2 169 HotPink2 255 Grey93
+ 84 SeaGreen1 170 Orchid
+ 85 SeaGreen1_2 171 MediumOrchid1
+
+ There are two colors (foreground and background) and only one bold at-
+ tribute. Thus single bold attribute affects both colors when "reverse"
+ attribute is used in vifm run inside terminal emulator. At the same
+ time linux native console can handle boldness of foreground and back-
+ ground colors independently, but for consistency with terminal emula-
+ tors this is available only implicitly by using light versions of col-
+ ors. This behaviour might be changed in the future.
+
+ Although vifm supports 256 colors in a sense they are supported by UI
+ drawing library, whether you will be able to use all of them highly de-
+ pends on your terminal. To set up terminal properly, make sure that
+ $TERM in the environment you run vifm is set to name of 256-color ter-
+ minal (on *nixes it can also be set via X resources), e.g.
+ xterm-256color. One can find list of available terminal names by list-
+ ing /usr/lib/terminfo/. Number of colors supported by terminal with
+ current settings can be checked via "tput colors" command.
+
+ In order to use 24-bit colors one needs a terminal that supports them,
+ corresponding terminfo record (probably ends in "-direct" like in
+ "xterm-direct") and $TERM pointing to it. When vifm detects direct
+ color support "cterm*" values are ignored for groups which have at
+ least one of "gui*" values set, otherwise they are used after translat-
+ ing via a builtin palette.
+
+ Here is the hierarchy of highlight groups, which you need to know for
+ using transparency:
+ JobLine
+ SuggestBox
+ StatusLine
+ WildMenu
+ User1..User20
+ Border
+ CmdLine
+ ErrorMsg
+ Win
+ OtherWin
+ AuxWin
+ OddLine
+ File name specific highlights
+ Directory
+ Link
+ BrokenLink
+ HardLink
+ Socket
+ Device
+ Fifo
+ Executable
+ CmpMismatch
+ CmpUnmatched
+ CmpBlank
+ Selected
+ CurrLine
+ LineNr (in active pane)
+ OtherLine
+ LineNr (in inactive pane)
+ TopLine
+ TopLineSel
+ TabLineSel (for pane tabs)
+ User1..User20
+ TabLine
+ TabLineSel
+ User1..User20
+
+ "none" means default terminal color for highlight groups at the first
+ level of the hierarchy and transparency for all others.
+
+ Here file name specific highlights mean those configured via globs ({})
+ or regular expressions (//). At most one of them is applied per file
+ entry, namely the first that matches file name, hence order of :high-
+ light commands might be important in certain cases.
+
+ :history
+
+ :his[tory]
+ display a menu with list of visited directories. See "Menus and
+ dialogs" section for controls.
+
+ :his[tory] x
+ x can be:
+ d[ir] or . show directory history.
+ c[md] or : show command line history.
+ s[earch] or / show search history and search forward on l
+ key.
+ f[search] or / show search history and search forward on l
+ key.
+ b[search] or ? show search history and search backward on l
+ key.
+ i[nput] or @ show prompt history (e.g. on one file renam-
+ ing).
+ fi[lter] or = show local filter history (see description of
+ the "=" normal mode command).
+ e[xprreg] show expression register history (see descrip-
+ tion of Ctrl+R = in command-line mode).
+ See "Menus and dialogs" section for controls.
+
+ :histnext
+
+ :histnext
+ same as . The main use case for this command is to work
+ around the common pain point of and being the same
+ ASCII character: one could alter the terminal emulator settings
+ to emit, for example, the `F1` keycode when Ctrl-I is pressed,
+ then `:noremap :histnext` in vifm, add "t" flag to the
+ 'cpoptions', and thus have both and working as ex-
+ pected.
+
+ :histprev
+
+ :histprev
+ same as .
+
+ :if
+
+ :if {expr1}
+ start conditional block. Commands are executed until next
+ matching :elseif, :else or :endif command if {expr1} evaluates
+ to non-zero, otherwise they are ignored. See also help on :else
+ and :endif commands.
+
+ Example:
+
+ if $TERM == 'screen.linux'
+ highlight CurrLine ctermfg=lightwhite ctermbg=lightblack
+ elseif $TERM == 'tmux'
+ highlight CurrLine cterm=reverse ctermfg=black ctermbg=white
+ else
+ highlight CurrLine cterm=bold,reverse ctermfg=black ctermbg=white
+ endif
+
+ :invert
+
+ :invert [f]
+ invert file name filter.
+
+ :invert? [f]
+ show current filter state.
+
+ :invert s
+ invert selection.
+
+ :invert o
+ invert sorting order of the primary sorting key.
+
+ :invert? o
+ show sorting order of the primary sorting key.
+
+ :jobs
+
+ :jobs display menu of current backgrounded processes. See "Menus and
+ dialogs" section for controls.
+
+ :keepsel
+
+ :keepsel [command...]
+ preserve selection during some :command by default. Note that
+ this doesn't save and restore selection to preserve it no matter
+ what, but precludes its clearing at the end of a command and
+ thus won't help if selection is cleared explicitly during opera-
+ tion.
+
+ Example:
+
+ :keepsel view
+
+ :let
+
+ :let $ENV_VAR =
+ set an environment variable. Warning: setting environment vari-
+ able to an empty string on Windows removes it.
+
+ :let $ENV_VAR .=
+ append value to environment variable.
+
+ :let &[l:|g:]opt =
+ sets option value.
+
+ :let &[l:|g:]opt .=
+ append value to string option.
+
+ :let &[l:|g:]opt +=
+ increasing option value, adding sub-values.
+
+ :let &[l:|g:]opt -=
+ decreasing option value, removing sub-values.
+
+ Where could be a single-quoted string, double-quoted string, an
+ environment variable, function call or a concatanation of any of them
+ in any order using the '.' operator. Any whitespace is ignored.
+
+ :locate
+
+ :locate filename
+ use "locate" command to create a menu of filenames. Selecting a
+ file from the menu will reload the current file list in vifm to
+ show the selected file. By default the command relies on the
+ external "locate" utility (it's assumed that its database is al-
+ ready built), which can be customized by altering value of the
+ 'locateprg' option. See "Menus and dialogs" section for con-
+ trols.
+
+ :locate
+ repeat last :locate command.
+
+ :ls
+
+ :ls lists windows of active terminal multiplexer (only when terminal
+ multiplexer is used). This is achieved by issuing proper com-
+ mand for active terminal multiplexer, thus the list is not han-
+ dled by vifm.
+
+ :lstrash
+
+ :lstrash
+ display a menu with list of files in trash. Each element of the
+ list is original path of a deleted file, thus the list can con-
+ tain duplicates. See "Menus and dialogs" section for controls.
+
+ :mark
+
+ :[range]ma[rk][?] x [/full/path] [filename]
+ Set mark x (a-zA-Z0-9) at /full/path and filename. By default
+ current directory is being used. If no filename was given and
+ /full/path is current directory then last file in [range] is
+ used. Using of macros is allowed. Question mark will stop com-
+ mand from overwriting existing marks.
+
+ :marks
+
+ :marks create a pop-up menu of marks. See "Menus and dialogs" section
+ for controls.
+
+ :marks list ...
+ display the contents of the marks that are mentioned in list.
+
+ :media
+
+ :media only for *nix
+ display media management menu. See "Menus and dialogs" section
+ for controls. See also 'mediaprg' option.
+
+ :messages
+
+ :mes[sages]
+ shows previously given messages (up to 50).
+
+ :mkdir
+
+ :[line]mkdir[!] dir ...
+ create directories at specified paths. The [line] can be used
+ to pick node in a tree-view. "!" means make parent directories
+ as needed. Macros are expanded.
+
+ :move
+
+ :[range]m[ove][!?][ &]
+ move files to directory of other view. With "?" prompts for
+ destination file names in an editor. "!" forces overwrite.
+
+ :[range]m[ove][!] path[ &]
+ move files to directory specified with the path (absolute or
+ relative to directory of other view). "!" forces overwrite.
+
+ :[range]m[ove][!] name1 name2...[ &]
+ move files to directory of other view giving each next file a
+ corresponding name from the argument list. "!" forces over-
+ write.
+
+ :[range]m[ove][!?] -skip ...[ &]
+ see "-skip parameter" section below.
+
+ :nohlsearch
+
+ :noh[lsearch]
+ clear selection in current pane.
+
+ :normal
+
+ :norm[al][!] commands
+ execute normal mode commands. If "!" is used, user defined map-
+ pings are ignored. Unfinished last command is aborted as if
+ or was typed. A ":" should be completed as well.
+ Commands can't start with a space, so put a count of 1 (one) be-
+ fore it.
+
+ :only
+
+ :on[ly]
+ switch to a one window view.
+
+ :plugin
+
+ :plugin load
+ loads all plugins. To be used in configuration file to manually
+ load plugins at an earlier point. The plugins can be loaded
+ only once, additional calls will do nothing.
+
+
+ :plugin blacklist {plugin}
+ adds {plugin} to the list of plugins to be ignored.
+
+ :plugin whitelist {plugin}
+ adds {plugin} to the list of plugins to be loaded while ignoring
+ all other plugins. This list should normally be empty.
+
+ :plugins
+
+ :plugins
+ open plugins menu. See "Menus and dialogs" section for con-
+ trols.
+
+ :popd
+
+ :popd remove pane directories from stack.
+
+ :pushd
+
+ :pushd[!] /curr/dir [/other/dir]
+ add pane directories to stack and process arguments like :cd
+ command.
+
+ :pushd exchange the top two items of the directory stack.
+
+ :put
+
+ :[line]pu[t][!] [reg] [ &]
+ put files from specified register (" by default) into current
+ directory. The [line] can be used to pick node in a tree-view.
+ "!" moves files "!" moves files from their original location in-
+ stead of copying them. During this operation no confirmation
+ dialogs will be shown, all checks are performed beforehand.
+
+ :pwd
+
+ :pw[d] show the present working directory.
+
+ :qall
+
+ :qa[ll][!]
+ exit vifm (add ! to skip saving changes and checking for active
+ backgrounded commands).
+
+ :quit
+
+ :q[uit][!]
+ if there is more than one tab, close the current one, otherwise
+ exit vifm (add ! to skip saving state and checking for active
+ backgrounded commands).
+
+ :redraw
+
+ :redr[aw]
+ redraw the screen immediately.
+
+ :regedit
+
+ :rege[dit] [{reg}]
+ edit register contents using external editor. If {reg} is omit-
+ ted, unnamed register will be edited by default. Edited paths
+ are normalized (no extra `.`, `..`, `/`, etc.) and all relative
+ paths are treated as starting in the directory of the current
+ view.
+
+ :registers
+
+ :reg[isters]
+ display menu with registers content.
+
+ :reg[isters] list ...
+ display the contents of the numbered and named registers that
+ are mentioned in list (for example "az to display "", "a and "z
+ content).
+
+ :regular
+
+ :regular
+
+ switch to regular view leaving custom view.
+ :rename
+
+ :[range]rename[!]
+ rename files by editing their names in an editor. "!" renames
+ files recursively in subdirectories. See "External Renaming"
+ section.
+
+ :[range]rename name1 name2...
+ rename each of selected files to a corresponding name.
+
+ :restart
+
+ :restart
+ free a lot of things (histories, commands, etc.), reread
+ vifminfo, vifmrc and session files and run startup commands
+ passed in the argument list, thus losing all unsaved changes
+ (e.g. recent history or keys mapped after starting this in-
+ stance). Session that wasn't yet stored gets reset.
+
+ While many things get reset, some basic UI state and current lo-
+ cations are preserved, including tabs.
+
+ :restart full
+ variation of :restart that makes no attempt to preserve any-
+ thing.
+
+ :restore
+
+ :[range]restore
+ restore file from trash directory, doesn't work outside one of
+ trash directories. See "Trash directory" section below.
+
+ :rlink
+
+ :[range]rlink[!?]
+ create relative symbolic links to files in directory of other
+ view. With "?" prompts for destination file names in an editor.
+ "!" forces overwrite.
+
+ :[range]rlink[!] path
+ create relative symbolic links of files in directory specified
+ with the path (absolute or relative to directory of other view).
+ "!" forces overwrite.
+
+ :[range]rlink[!] name1 name2...
+ create relative symbolic links of files in directory of other
+ view giving each next link a corresponding name from the argu-
+ ment list. "!" forces overwrite.
+
+ :[range]rlink[!?] -skip ...[ &]
+ see "-skip parameter" section below.
+
+ :screen
+
+ :screen
+ toggle whether to use the terminal multiplexer or not.
+ A terminal multiplexer uses pseudo terminals to allow multiple
+ windows to be used in the console or in a single xterm. Start-
+ ing vifm from terminal multiplexer with appropriate support
+ turned on will cause vifm to open a new terminal multiplexer
+ window for each new file edited or program launched from vifm.
+ This requires screen version 3.9.9 or newer for the screen -X
+ argument or tmux (1.8 version or newer is recommended).
+
+ :screen!
+ enable integration with terminal multiplexers.
+
+ :screen?
+ display whether integration with terminal multiplexers is en-
+ abled.
+
+ Note: the command is called screen for historical reasons (when tmux
+ wasn't yet supported) and might be changed in future releases, or get
+ an alias.
+
+ :select
+
+ :[range]select
+ select files in the given range (current file if no range is
+ given).
+
+ :select {pattern}
+ select files that match specified pattern. Possible {pattern}
+ forms are described in "Patterns" section below. Trailing slash
+ for directories is taken into account, so `:select! */ | invert
+ s` selects only files.
+
+ :select //[iI]
+ same as item above, but reuses last search pattern.
+
+ :select !{external command}
+ select files from the list supplied by external command. Files
+ are matched by full paths, relative paths are converted to abso-
+ lute ones beforehand.
+
+ :[range]select! [{pattern}]
+ same as above, but resets previously selected items before pro-
+ ceeding.
+
+ :session
+
+ :session?
+ print name of the current session.
+
+ :session
+ detach current session without saving it. Resets v:session.
+
+ :session name
+ create or load and switch to a session with the specified name.
+ Name can't contain slashes. Session active at the moment is
+ saved before the switch. Session is also automatically saved
+ when quiting the application in usual ways. Sets v:session.
+
+ :session -
+ switch to a previous session if it still exists (wasn't removed
+ or detached from without saving).
+
+ :set
+
+ :se[t] display all options that differ from their default value.
+
+ :se[t] all
+ display all options.
+
+ :se[t] opt1=val1 opt2='val2' opt3="val3" ...
+ sets given options. For local options both values are set.
+ You can use following syntax:
+ - for all options - option, option? and option&
+ - for boolean options - nooption, invoption and option!
+ - for integer options - option=x, option+=x and option-=x
+ - for string options - option=x and option+=x
+ - for string list options - option=x, option+=x, option-=x and
+ option^=x
+ - for enumeration options - option=x, option+=x and option-=x
+ - for set options - option=x, option+=x, option-=x and op-
+ tion^=x
+ - for charset options - option=x, option+=x, option-=x and op-
+ tion^=x
+
+ the meaning:
+ - option - turn option on (for boolean) or print its value (for
+ all others)
+ - nooption - turn option off
+ - invoption - invert option state
+ - option! - invert option state
+ - option? - print option value
+ - option& - reset option to its default value
+ - option=x or option:x - set option to x
+ - option+=x - add/append x to option
+ - option-=x - remove (or subtract) x from option
+ - option^=x - toggle x presence among values of the option
+
+ Option name can be prepended and appended by any number of
+ whitespace characters.
+
+ :setglobal
+
+ :setg[lobal]
+ display all global options that differ from their default value.
+
+ :setg[lobal] all
+ display all global options.
+
+ :setg[lobal] opt1=val1 opt2='val2' opt3="val3" ...
+ same as :set, but changes/prints only global options or global
+ values of local options. Changes to the latter might be not
+ visible until directory is changed.
+
+ :setlocal
+
+ :setl[ocal]
+ display all local options that differ from their default value.
+
+ :setl[ocal] all
+ display all local options.
+
+ :setl[ocal] opt1=val1 opt2='val2' opt3="val3" ...
+ same as :set, but changes/prints only local values of local op-
+ tions.
+
+ :shell
+
+ :sh[ell][!]
+ start a shell in current directory. "!" suppresses spawning
+ dedicated window of terminal multiplexer for a shell. To make
+ vifm adaptive to environment it uses $SHELL if it's defined,
+ otherwise 'shell' value is used.
+
+
+ :siblnext
+
+ :[count]siblnext[!]
+
+ change directory to [count]th next sibling directory after cur-
+ rent path using value of global sort option of current pane.
+ "!" enables wrapping.
+
+ For example, say, you're at /boot and root listing starts like
+ this:
+
+ bin/
+ boot/
+ dev/
+ ...
+
+ Issuing :siblnext will navigate to /dev.
+
+
+ :siblprev
+
+ :[count]siblprev[!]
+ same as :siblnext, but in the opposite direction.
+
+ :sort
+
+ :sor[t]
+ display dialog with different sorting methods, where one can se-
+ lect the primary sorting key. When 'viewcolumns' options is
+ empty and 'lsview' is off, changing primary sorting key will
+ also affect view look (in particular the second column of the
+ view will be changed). See "Menus and dialogs" section for con-
+ trols.
+
+ :source
+
+ :so[urce] file
+ read command-line commands from the file.
+
+ :split
+
+ :sp[lit]
+ switch to a two window horizontal view.
+
+ :sp[lit]!
+ toggle horizontal window splitting.
+
+ :sp[lit] path
+ splits the window horizontally to show both file directories.
+ Also changes other pane to path (absolute or relative to current
+ directory of active pane).
+
+ :stop
+
+ :st[op]
+ suspend vifm (same as pressing Ctrl-Z). Does nothing if this
+ instance isn't running in a shell. The command exists to allow
+ mapping to the action of Ctrl-Z.
+
+ :substitute
+
+ :[range]s[ubstitute]/pattern/string/[flags]
+ for each file in range replace a match of pattern with string.
+
+ String can contain \0...\9 to link to capture groups (\0 - all match,
+ \1 - first group, etc.).
+
+ Pattern is stored in search history.
+
+ Available flags:
+
+ - i - ignore case (the 'ignorecase' and 'smartcase' options are not
+ used)
+
+ - I - don't ignore case (the 'ignorecase' and 'smartcase' options are
+ not used)
+
+ - g - substitute all matches in each file name (each g toggles this)
+
+ :[range]s[ubstitute]/pattern
+ substitute pattern with an empty string.
+
+ :[range]s[ubstitute]//string/[flags]
+ use last pattern from search history.
+
+ :[range]s[ubstitute]
+ repeat previous substitution command.
+
+ :sync
+
+ :sync [relative path]
+ change the other pane to the current pane directory or to some
+ path relative to the current directory. Using macros is al-
+ lowed.
+
+ :sync! change the other pane to the current pane directory and synchro-
+ nize cursor position. If current pane displays custom list of
+ files, position before entering it is used (current one might
+ not make any sense).
+
+
+ :sync! [location | cursorpos | localopts | filters | filelist | tree |
+ all]...
+ change enumerated properties of the other pane to match corre-
+ sponding properties of the current pane. Arguments have the
+ following meanings:
+
+ - location - current directory of the pane;
+
+ - cursorpos - cursor position (doesn't make sense without "lo-
+ cation");
+
+ - localopts - all local options;
+
+ - filters - all filters;
+
+ - filelist - list of files for custom view (implies "loca-
+ tion");
+
+ - tree - tree structure for tree view (implies "location");
+
+ - all - all of the above.
+
+ :tabclose
+
+ :tabc[lose]
+ close current tab, unless it's the only one open at current
+ scope.
+
+ :tabmove
+
+ :tabm[ove] [N]
+ without the argument or with `$` as the argument, current tab
+ becomes the last tab. With the argument, current tab is moved
+ after the tab with the specified number. Argument of `0` moves
+ current tab to the first position.
+
+ :tabname
+
+ :tabname [name]
+ set, update or reset (when no argument is provided) name of the
+ current tab.
+
+ :tabnew
+
+ :tabnew [path]
+ create new tab. Accepts optional path for the new tab. Macros
+ and environment variables are expanded.
+
+ :tabnext
+
+ :tabn[ext]
+ switch to the next tab (wrapping around).
+
+ :tabn[ext] {n}
+ go to the tab number {n}. Tab numeration starts with 1.
+
+ :tabonly
+
+ :tabo[nly]
+ close all tabs but the current one. Closes pane tabs only at
+ the active side.
+
+ :tabprevious
+
+ :tabp[revious]
+ switch to the previous tab (wrapping around).
+
+ :tabp[revious] {n}
+ go to the {n}-th previous tab. Note that :tabnext handles its
+ argument differently.
+
+ :touch
+
+ :[line]touch file...
+ create files at specified paths. Aborts on errors. Doesn't up-
+ date time of existing files. The [line] can be used to pick
+ node in a tree-view. Macros are expanded.
+
+ :tr
+
+ :[range]tr/pattern/string/
+ for each file in range transliterate the characters which appear
+ in pattern to the corresponding character in string. When
+ string is shorter than pattern, it's padded with its last char-
+ acter.
+
+ :trashes
+
+ :trashes
+ lists all valid trash directories in a menu. Only non-empty and
+ writable trash directories are shown. This is exactly the list
+ of directories that are cleared when :empty command is executed.
+
+ :trashes?
+ same as :trashes, but also displays size of each trash direc-
+ tory.
+
+ :tree
+
+ :tree turn pane into tree view with current directory as its root.
+ The tree view is implemented on top of a custom view, but is au-
+ tomatically kept in sync with file system state and considers
+ all the filters. Thus the structure corresponds to what one
+ would see on visiting the directories manually. As a special
+ case for trees built out of custom view file-system tracking
+ isn't performed.
+
+ To leave tree view go up from its root or use gh at any level of
+ the tree. Any command that changes directory will also do, in
+ particular, `:cd ..`.
+
+ Tree structure is incompatible with alternative representations,
+ so values of 'lsview' and 'millerview' options are ignored.
+
+ The "depth" argument specifies nesting level on which loading of
+ subdirectories won't happen (they will be folded). Values start
+ at 1.
+
+ :tree! toggle current view in and out of tree mode.
+
+ :undolist
+
+ :undol[ist]
+ display list of latest changes. Use "!" to see actual commands.
+ See "Menus and dialogs" section for controls.
+
+ :unlet
+
+ :unl[et][!] $ENV_VAR1 $ENV_VAR2 ...
+ remove environment variables. Add ! to omit displaying of warn-
+ ings about nonexistent variables.
+
+ :unselect
+
+ :[range]unselect
+ unselect files in the given range (current file if no range is
+ given).
+
+ :unselect {pattern}
+ unselect files that match specified pattern. Possible {pattern}
+ forms are described in "Patterns" section below. Trailing slash
+ for directories is taken into account, so `:unselect */` unse-
+ lects directories.
+
+ :unselect !{external command}
+ unselect files from the list supplied by external command.
+ Files are matched by full paths, relative paths are converted to
+ absolute ones beforehand.
+
+ :unselect //[iI]
+ same as item above, but reuses last search pattern.
+
+ :version
+
+ :ve[rsion]
+ show menu with version information.
+
+ :vifm
+
+ :vifm same as :version.
+
+ :view
+
+ :vie[w]
+ toggle on and off the quick file view (preview of file's con-
+ tents). See also 'quickview' option.
+
+ :vie[w]!
+ turn on quick file view if it's off.
+
+ :volumes
+
+ :volumes
+ only for MS-Windows
+ display menu with volume list. Hitting l (or Enter) key opens
+ appropriate volume in the current pane. See "Menus and dialogs"
+ section for controls.
+
+ :vsplit
+
+ :vs[plit]
+ switch to a two window vertical view.
+
+ :vs[plit]!
+ toggle window vertical splitting.
+
+ :vs[plit] path
+ split the window vertically to show both file directories. And
+ changes other pane to path (absolute or relative to current di-
+ rectory of active pane).
+
+ :wincmd
+
+ :[count]winc[md] {arg}
+ same as running Ctrl-W [count] {arg}.
+
+ :windo
+
+ :windo [command...]
+ execute command for each pane (same as :winrun % command).
+
+ :winrun
+
+ :winrun type [command...]
+ execute command for pane(s), which is determined by type argu-
+ ment:
+ - ^ - top-left pane
+ - $ - bottom-right pane
+ - % - all panes
+ - . - current pane
+ - , - other pane
+
+ :write
+
+ :w[rite]
+ write current state to vifminfo and session files (if a session
+ is active).
+
+ :wq
+
+ :wq[!] same as :quit, but ! disables only the check of backgrounded
+ commands, while state of the application is always written.
+ :wqall
+
+ :wqa[ll][!]
+ same as :qall, but ! disables only the check of backgrounded
+ commands, while state of the application is always written.
+
+ :xall
+
+ :xa[ll][!]
+ same as :qall.
+
+ :xit
+
+ :x[it][!]
+ same as :quit.
+
+ :yank
+
+ :[range]y[ank] [reg] [count]
+ will yank files to the reg register.
+
+ :map lhs rhs
+
+ :map lhs rhs
+ map lhs key sequence to rhs in normal and visual modes.
+
+ :map! lhs rhs
+ map lhs key sequence to rhs in command line mode.
+
+
+ :amap :cmap :dmap :mmap :nmap :qmap
+ :vmap
+
+ :amap lhs rhs
+ map lhs to rhs in navigation mode.
+
+ :cm[ap] lhs rhs
+ map lhs to rhs in command line mode.
+
+ :dm[ap] lhs rhs
+ map lhs to rhs in dialog modes.
+
+ :mm[ap] lhs rhs
+ map lhs to rhs in menu mode.
+
+ :nm[ap] lhs rhs
+ map lhs to rhs in normal mode.
+
+ :qm[ap] lhs rhs
+ map lhs to rhs in view mode.
+
+ :vm[ap] lhs rhs
+ map lhs to rhs in visual mode.
+
+
+ :*map
+
+ :amap list all maps in navigation mode.
+
+ :cm[ap]
+ list all maps in command line mode.
+
+ :dm[ap]
+ list all maps in dialog modes.
+
+ :mm[ap]
+ list all maps in menu mode.
+
+ :nm[ap]
+ list all maps in normal mode.
+
+ :qm[ap]
+ list all maps in view mode.
+
+ :vm[ap]
+ list all maps in visual mode.
+
+ :*map beginning
+
+ :amap beginning
+ list all maps in navigation mode that start with the beginning.
+
+ :cm[ap] beginning
+ list all maps in command line mode that start with the begin-
+ ning.
+
+ :dm[ap] beginning
+ list all maps in dialog modes that start with the beginning.
+
+ :mm[ap] beginning
+ list all maps in menu mode that start with the beginning.
+
+ :nm[ap] beginning
+ list all maps in normal mode that start with the beginning.
+
+ :qm[ap] beginning
+ list all maps in view mode that start with the beginning.
+
+ :vm[ap] beginning
+ list all maps in visual mode that start with the beginning.
+
+ :noremap
+
+ :no[remap] lhs rhs
+ map the key sequence lhs to rhs for normal and visual modes, but
+ don't expand user mappings in rhs.
+
+ :no[remap]! lhs rhs
+ map the key sequence lhs to rhs for command line mode, but don't
+ expand user mappings in rhs.
+
+ :anoremap :cnoremap :dnoremap :mnoremap :nnoremap :qnoremap
+ :vnoremap
+
+ :anoremap lhs rhs
+ map the key sequence lhs to rhs for navigation mode, but don't
+ expand user mappings in rhs.
+
+ :cno[remap] lhs rhs
+ map the key sequence lhs to rhs for command line mode, but don't
+ expand user mappings in rhs.
+
+ :dn[oremap] lhs rhs
+ map the key sequence lhs to rhs for dialog modes, but don't ex-
+ pand user mappings in rhs.
+
+ :mn[oremap] lhs rhs
+ map the key sequence lhs to rhs for menu mode, but don't expand
+ user mappings in rhs.
+
+ :nn[oremap] lhs rhs
+ map the key sequence lhs to rhs for normal mode, but don't ex-
+ pand user mappings in rhs.
+
+ :qn[oremap] lhs rhs
+ map the key sequence lhs to rhs for view mode, but don't expand
+ user mappings in rhs.
+
+ :vn[oremap] lhs rhs
+ map the key sequence lhs to rhs for visual mode, but don't ex-
+ pand user mappings in rhs.
+
+ :unmap
+
+ :unm[ap] lhs
+ remove user mapping of lhs from normal and visual modes.
+
+ :unm[ap]! lhs
+ remove user mapping of lhs from command line mode.
+
+ :aunmap :cunmap :dunmap :munmap :nunmap :qunmap
+ :vunmap
+
+ :aunmap lhs
+ remove user mapping of lhs from navigation mode.
+
+ :cu[nmap] lhs
+ remove user mapping of lhs from command line mode.
+
+ :du[nmap] lhs
+ remove user mapping of lhs from dialog modes.
+
+ :mu[nmap] lhs
+ remove user mapping of lhs from menu mode.
+
+ :nun[map] lhs
+ remove user mapping of lhs from normal mode.
+
+ :qun[map] lhs
+ remove user mapping of lhs from view mode.
+
+ :vu[nmap] lhs
+ remove user mapping of lhs from visual mode.
+
+Ranges
+ The ranges implemented include:
+ 2,3 - from second to third file in the list (including it)
+ % - the entire directory.
+ . - the current position in the filelist.
+ $ - the end of the filelist.
+ 't - the mark position t.
+
+ Examples:
+
+ :%delete
+
+ would delete all files in the directory.
+
+ :2,4delete
+
+ would delete the files in the list positions 2 through 4.
+
+ :.,$delete
+
+ would delete the files from the current position to the end of the
+ filelist.
+
+ :3delete4
+
+ would delete the files in the list positions 3, 4, 5, 6.
+
+ If a backward range is given :4,2delete - an query message is given and
+ user can chose what to do next.
+
+ The builtin commands that accept a range are :d[elete] and :y[ank].
+
+:command parameters
+ Some of the command-line commands accept parameters in the form of
+ `-paramname`. Arguments of such commands can be split into two groups:
+ parameters and positional arguments. Items from the two groups cannot
+ be interleaved and parameters always come first. List of parameters is
+ terminated implicitly by the first argument that doesn't start with a
+ dash ("-") or explicitly via "--" separator (needs to be a separate ar-
+ gument), which is just discarded. These strict rules allow arbitrary
+ positional arguments, such as file names that start with a dash.
+
+
+ -skip parameter
+ This parameter makes :copy, :move, :alink and :rlink automati-
+ cally skip source files that already exist at the destination
+ rather than refusing to perform the operation.
+
+Command macros
+ The command macros may be used in user commands.
+
+ %a User arguments. When user arguments contain macros, they are
+ expanded before preforming substitution of %a.
+
+ %c %"c The current file under the cursor.
+
+ %C %"C The current file under the cursor in the other directory.
+
+ %f %"f All of the selected files or the current file, but see "Selec-
+ tion" section below.
+
+ %F %"F Same as %f, %"f, but for the inactive pane.
+
+ %l %"l List of selected files. Unlike %f from above, this is only for
+ explicit selection (i.e., not via a range) and is empty if no
+ files are selected.
+
+ %L %"L Same as %l, %"l, but for the inactive pane.
+
+ %b %"b Same as %f %F.
+
+ %d %"d Full path to current directory.
+
+ %D %"D Full path to other file list directory.
+
+ %rx %"rx
+ Full paths to files in the register {x}. In case of invalid
+ symbol in place of {x}, it's processed with the rest of the line
+ and default register is used.
+
+ %m Show command output in a menu.
+
+ %M Same as %m, but l (or Enter) key is handled like for :locate and
+ :find commands.
+
+ %u Process command output as list of paths and compose custom view
+ out of it.
+
+ %U Same as %u, but implies less list updates inside vifm, which is
+ absence of sorting at the moment.
+
+ %Iu Same as %u, but gives up terminal before running external com-
+ mand.
+
+ %IU Same as %U, but gives up terminal before running external com-
+ mand.
+
+ %S Show command output in the status bar.
+
+ %q Redirect command output to quick view, which is activated if
+ disabled.
+
+ %s Execute command in horizontally split window of active terminal
+ multiplexer (ignored if not running inside one).
+
+ %v Same as %s, but splits vertically.
+
+ %n Forbid use of terminal multiplexer to run the command.
+
+ %N Do not detach viewer from terminal session (keeps `/dev/tty`
+ available) or process group (keeps the command in the set of
+ foreground clients of the terminal).
+
+ %i Run in background and suppress error dialogs, but collect errors
+ internally for viewing via :jobs menu.
+
+ %Pl Pipe list of files to standard input of a command.
+
+ %Pz Same as %Pl, but separates paths by null ('\0') character.
+
+ %pc Marks the end of the main command and the beginning of the clear
+ command for graphical preview, which is invoked on closing pre-
+ view of a file.
+
+ %pd Marks a preview command as one that directly communicates with
+ the terminal. Beware that this is for things like sixel which
+ are self-contained sequences that depend only on current cursor
+ position, using this with anything else is likely to mangle ter-
+ minal state.
+
+ %pu Uncached preview. Intended to be used for commands that just
+ send file path somewhere for preview.
+
+ The following dimensions and coordinates are in characters:
+
+ %px x coordinate of top-left corner of preview area.
+
+ %py y coordinate of top-left corner of preview area.
+
+ %pw width of preview area.
+
+ %ph height of preview area.
+
+
+ Use %% if you need to put a percent sign in your command.
+
+ Note that %i, %Iu, %IU, %m, %M, %n, %q, %s, %S, %u, %U and %v macros
+ are mutually exclusive. Only the last one of them on the command will
+ take effect.
+
+ Note that %Pl and %Pz are mutually exclusive. Only the last one of
+ them on the command will take effect.
+
+ You can use file name modifiers after %c, %C, %f, %F, %b, %d and %D
+ macros. Supported modifiers are:
+
+ - :p - full path
+
+ - :u - UNC name of path (e.g. "\\server" in
+ "\\server\share"), Windows only. Expands to current computer name
+ for not UNC paths.
+
+ - :~ - relative to the home directory
+
+ - :. - relative to current directory
+
+ - :h - head of the file name
+
+ - :t - tail of the file name
+
+ - :r - root of the file name (without last extension)
+
+ - :e - extension of the file name (last one)
+
+ - :s?pat?sub? - substitute the first occurrence of pat with sub.
+ You can use any character for '?', but it must not occur in pat or
+ sub.
+
+ - :gs?pat?sub? - like :s, but substitutes all occurrences of pat with
+ sub.
+
+ See ':h filename-modifiers' in Vim's documentation for the detailed de-
+ scription.
+
+ Using %x means expand corresponding macro escaping all characters that
+ have special meaning. And %"x means using of double quotes and escape
+ only backslash and double quote characters, which is more useful on
+ Windows systems.
+
+ Position and quantity (if there is any) of %m, %M, %S or %s macros in
+ the command is unimportant. All their occurrences are removed from the
+ resulting command.
+
+ %c and %f macros are expanded to file names only, when %C and %F are
+ expanded to full paths. %f and %F follow this in %b too.
+
+ :com move mv %f %D
+ set the :move command to move all of the files selected in the
+ current directory to the other directory.
+
+ The %a macro is replaced with any arguments given to an alias command.
+ All arguments are considered optional.
+ :com lsl !!ls -l %a - set the lsl command to execute ls -l with
+ or without an argument.
+
+ :lsl
+ will list the directory contents of the current directory.
+
+ :lsl filename
+ will list only the given filename.
+
+ The macros can also be used in directly executing commands. ":!mv %f
+ %D" would move the current directory selected files to the other direc-
+ tory.
+
+ Appending & to the end of a command causes it to be executed in the
+ background. Typically you want to run two kinds of external commands
+ in the background:
+
+ - GUI applications that doesn't fork thus block vifm (:!sxiv %f &);
+
+ - console tools that do not work with terminal (:!mv %f %D &).
+
+ You don't want to run terminal commands, which require terminal input
+ or output something in background because they will mess up vifm's TUI.
+ Anyway, if you did run such a command, you can use Ctrl-L key to update
+ vifm's TUI.
+
+ Rewriting the example command with macros given above with background-
+ ing:
+
+ %m, %M, %s, %S, %u and %U macros cannot be combined with background
+ mark (" &") as it doesn't make much sense.
+
+Command backgrounding
+ Copy and move operation can take a lot of time to proceed. That's why
+ vifm supports backgrounding of this two operations. To run :copy,
+ :move or :delete command in the background just add " &" at the end of
+ a command.
+
+ For each background operation a new thread is created. Job cancella-
+ tion can be requested in the :jobs menu via dd shortcut.
+
+ You can see if command is still running in the :jobs menu. Back-
+ grounded commands have progress instead of process id at the line be-
+ ginning.
+
+ Background operations cannot be undone.
+
+Cancellation
+ Note that cancellation works somewhat different on Windows platform due
+ to different mechanism of break signal propagation. One also might
+ need to use Ctrl-Break shortcut instead of Ctrl-C.
+
+ There are two types of operations that can be cancelled:
+
+ - file system operations;
+
+ - mounting with FUSE (but not unmounting as it can cause loss of
+ data);
+
+ - calls of external applications.
+
+ Note that vifm never terminates applications, it sends SIGINT signal
+ and lets the application quit normally.
+
+ When one of set of operations is cancelled (e.g. copying of 5th file of
+ 10 files), further operations are cancelled too. In this case undo
+ history will contain only actually performed operations.
+
+ Cancelled operations are indicated by "(cancelled)" suffix appended to
+ information message on status bar.
+
+ File system operations
+
+ Currently the following commands can be cancelled: :alink, :chmod,
+ :chown, :clone, :copy, :delete, :mkdir, :move, :restore, :rlink,
+ :touch. File putting (on p/P key) can be cancelled as well. It's not
+ hard to see that these are mainly long-running operations.
+
+ Cancelling commands when they are repeated for undo/redo operations is
+ allowed for convenience, but is not recommended as further undo/redo
+ operations might get blocked by side-effects of partially cancelled
+ group of operations.
+
+ These commands can't be cancelled: :empty, :rename, :substitute, :tr.
+
+ Mounting with FUSE
+
+ It's not considered to be an error, so only notification on the status
+ bar is shown.
+
+ External application calls
+
+ Each of this operations can be cancelled: :apropos, :find, :grep, :lo-
+ cate.
+
+Selection
+ If there is a selection, it's stashed before proceeding further unless
+ file under the cursor is part of that selection. This means that when
+ macros are expanded for :filetype or :filextype programs, `%f` and `%F`
+ become equivalent to `%c` and `%C` respectively if current file is not
+ selected. So you run selection by running one of selected files, oth-
+ erwise you're running a single file even if there are other selected
+ entries.
+
+ When running a selection it must not include broken symbolic links, has
+ to be consistent and set of file handlers must be compatible. Consis-
+ tency means that selection contains either only directories (including
+ links to them) or only files, but not their mix.
+
+ Compatibility is a more sophisticated check, but it's defined in a nat-
+ ural way so that you get what you'd expect. The following properties
+ of selection are taken into account while checking it for compatibility
+ and deciding how to handle it:
+
+
+ 1. If there any files for which handler isn't defined, then all files
+ are opened using 'vicmd' or 'vixcmd'.
+
+
+ 2. If all handlers match the following criteria:
+ - backgrounded
+ - include `%c` and/or `%C`
+ - include neither `%f` nor `%F`
+ then each file is executed independently of the rest.
+
+
+ 3. If all handlers are equal, the common handler is executed. This
+ handler might ignore selection and process only file under the
+ cursor.
+
+
+ 4. Otherwise, an error is reported, because handlers differ and they
+ don't support parallel execution.
+
+Patterns
+ :highlight, :filetype, :filextype, :fileviewer commands and 'classify'
+ option support globs, regular expressions and mime types to match file
+ names or their paths.
+
+ There are six possible ways to write a single pattern:
+
+ 1. [!]{comma-separated-name-globs}
+
+ 2. [!]{{comma-separated-path-globs}}
+
+ 3. [!]/name-regular-expression/[iI]
+
+ 4. [!]//path-regular-expression//[iI]
+
+ 5. [!]
+
+ 6. undecorated-pattern
+
+ First five forms can include leading exclamation mark that negates pat-
+ tern matching.
+
+ The last form is implicitly refers to one of others. :highlight does
+ not accept undecorated form, while :filetype, :filextype, :fileviewer,
+ :select, :unselect and 'classify' treat it as list of name globs.
+
+ Path patterns receive absolute path of the file that includes its name
+ component as well.
+
+ To combine several patterns (AND them), make sure you're using one of
+ the first five forms and write patterns one after another, like this:
+ {*.vifm}
+ Mind that if you make a mistake the whole string will be treated as the
+ sixth form.
+
+ :filetype, :filextype and :fileviewer commands accept comma-separated
+ list of patterns instead of a single pattern, thus effectively handling
+ OR operation on them:
+ {*.vifm},{*.pdf}
+ Forms that accept comma-separated lists of patterns also process them
+ as lists of alternatives.
+
+ Patterns with regular expressions
+
+ Regular expression patterns are case insensitive by default, see de-
+ scription of commands, which might override default behaviour.
+
+ Flags of regular expressions mean the following:
+ - "i" makes filter case insensitive;
+ - "I" makes filter case sensitive. They can be repeated multiple
+ times, but the later one takes precedence (e.g. "iiiI" is equivalent
+ to "I" and "IiIi" is the same as "i").
+
+ There are no implicit `^` or `$`, so make sure to specify them explic-
+ itly if the pattern should match the whole name or path.
+
+ Patterns with globs
+
+ "Globs" section below provides short overview of globs and some impor-
+ tant points that one needs to know about them.
+
+ Patterns with mime-types
+
+ Mime type matching is essentially globs matching applied to mime type
+ of a file instead of its name/path. Note: mime types aren't detected
+ on Windows.
+
+ Examples
+
+ Associate `evince` to PDF-files only inside `/home/user/downloads/` di-
+ rectory (excluding its subdirectories):
+
+ :filextype //^/home/user/downloads/[^/]*.pdf$// evince %f
+
+
+Regular expressions
+ All regular expressions are modern/extended. See `man 7 regex` for
+ more details on what's supported.
+
+ The following special sequences are additionally parsed:
+ - `\c` forces matching ignoring case of letters
+ - `\C` forces matching respecting case of letters
+
+ `\c` and `\C` have the highest priority in determining whether case is
+ matched or not and exist to override 'ignorecase', 'smartcase' and
+ `i`/`I` flags when necessary.
+
+ If multiple sequences are present, the one which appears later takes
+ precedence.
+
+ Note that unlike in Vim character classes are affected by settings and
+ sequences that control case sensitivity in regular expressions.
+
+Globs
+ Globs are always case insensitive as it makes sense in general case.
+
+ `*`, `?`, `[` and `]` are treated as special symbols in the pattern.
+ E.g.
+
+ :filetype * less %c
+
+ matches all files. One can use character classes for escaping, so
+
+ :filetype [*] less %c
+
+ matches only one file name, the one which contains only asterisk sym-
+ bol.
+
+ `*` means any number of any characters (possibly an empty substring),
+ with one exception: asterisk at the pattern beginning doesn't match dot
+ in the first position. E.g.
+
+ :fileviewer *.zip,*.jar zip -sf %c
+
+ associates using of `zip` program to preview all files with `zip` or
+ `jar` extensions as listing of their content, but `.file.zip` won't be
+ matched.
+
+ `?` means any character at this position. E.g.
+
+ :fileviewer ?.out file %c
+
+ calls `file` tool for all files which have exactly one character before
+ their extension (e.g. a.out, b.out).
+
+ Square brackets designate character class, which means that whole char-
+ acter class matches against any of characters listed in it. For exam-
+ ple
+
+ :fileviewer *.[ch] highlight -O xterm256 -s dante --syntax c %c
+
+ makes vifm call `highlight` program to colorize source and header files
+ in C language for a 256-color terminal. Equal command would be
+
+ :fileviewer *.c,*.h highlight -O xterm256 -s dante --syntax c %c
+
+
+ Inside square brackets `^` or `!` can be used for symbol class negotia-
+ tion and the `-` symbol to set a range. `^` and `!` should appear
+ right after the opening square bracket. For example
+
+ :filetype *.[!d]/ inspect_dir
+
+ associates `inspect_dir` as additional handler for all directories that
+ have one character extension unless it's "d" letter. And
+
+ :filetype [0-9].jpg sxiv
+
+ associates `sxiv` picture viewer only for JPEG-files that contain sin-
+ gle digit in their name.
+
+ If you need to include literal comma, which is normally separates mul-
+ tiple globs, double it.
+
+:set options
+ Local options
+ These are kind of options that are local to a specific view. So
+ you can set ascending sorting order for left pane and descending
+ order for right pane.
+
+ In addition to being local to views, each such option also has
+ two values:
+
+ - local to current directory (value associated with current
+ location);
+
+ - global to current directory (value associated with the
+ pane).
+
+ The idea is that current directory can be made a temporary ex-
+ ception to regular configuration of the view, until directory
+ change. Use :setlocal for that. :setglobal changes view value
+ not affecting settings until directory change. :set applies
+ changes immediately to all values.
+
+
+ 'aproposprg'
+ type: string
+ default: "apropos %a"
+ Specifies format for an external command to be invoked by the
+ :apropos command. The format supports expanding of macros, spe-
+ cific for a particular *prg option, and %% sequence for insert-
+ ing percent sign literally. This option should include the %a
+ macro to specify placement of arguments passed to the :apropos
+ command. If the macro is not used, it will be implicitly added
+ after a space to the value of this option.
+
+ 'autocd'
+ type: boolean
+ default: false
+ When enabled unknown command-line commands are interpreted as
+ implicit invocation of :cd with one argument and no escaping.
+ Tilde is expanded, but not macros or environment variables.
+
+ 'autochpos'
+ type: boolean
+ default: true
+ When disabled vifm will set cursor to the first line in the view
+ after :cd and :pushd commands instead of saved cursor position.
+ Disabling this will also make vifm clear information about cur-
+ sor position in the view history on :cd and :pushd commands (and
+ on startup if 'autochpos' is disabled in the vifmrc). l key in
+ the ":history ." and ":trashes" menus are treated like :cd com-
+ mand. This option also affects marks so that navigating to a
+ mark doesn't restore cursor position.
+
+ When this option is enabled, more fine grained control over cur-
+ sor position is available via 'histcursor' option.
+
+ 'columns' 'co'
+ type: integer
+ default: terminal width on startup
+ Terminal width in characters.
+
+ 'caseoptions'
+ type: charset
+ default: ""
+ This option gives additional control over case sensitivity by
+ allowing overriding default behaviour to either always be case
+ sensitive or always be case insensitive. Possible values form
+ pairs of lower and upper case letters that configure specific
+ aspect of behaviour:
+ p - always ignore case of paths during completion.
+ P - always match case of paths during completion.
+ g - always ignore case of characters for f/F/;/,.
+ G - always match case of characters for f/F/;/,.
+
+ At most one item of each pair takes affect, if both or more are
+ present, only the last one matters. When none of pair's ele-
+ ments are present, the behaviour is default (depends on operat-
+ ing system for path completion and on values of 'ignorecase' and
+ 'smartcase' options for file navigation).
+
+ 'cdpath' 'cd'
+ type: string list
+ default: value of $CDPATH with commas instead of colons
+ Specifies locations to check on changing directory with relative
+ path that doesn't start with "./" or "../". When non-empty,
+ current directory is examined after directories listed in the
+ option.
+
+ This option doesn't affect completion of :cd command.
+
+ Example:
+
+ set cdpath=~
+
+ This way ":cd bin" will switch to "~/bin" even if directory
+ named "bin" exists in current directory, while ":cd ./bin" com-
+ mand will ignore value of 'cdpath'.
+
+ 'chaselinks'
+ type: boolean
+ default: false
+ When enabled path of view is always resolved to real path (with
+ all symbolic links expanded).
+
+ 'classify'
+ type: string list
+ default: ":dir:/"
+ Specifies file name prefixes and suffixes depending on file type
+ or name. The format is either of:
+ - [{prefix}]:{filetype}:[{suffix}]
+ - [{prefix}]::{pattern}::[{suffix}]
+ Possible {pattern} forms are described in "Patterns" section
+ above.
+
+ Priority rules:
+ - file name patterns have priority over type patterns
+ - file name patterns are matched in left-to-right order of
+ their appearance in this option
+
+ Either {prefix} or {suffix} or both can be omitted (which is the
+ default for all unspecified file types), this means empty {pre-
+ fix} and/or {suffix}. {prefix} and {suffix} should consist of
+ at most eight characters. Elements are separated by commas.
+ Neither prefixes nor suffixes are part of file names, so they
+ don't affect commands which operate on file names in any way.
+ Comma (',') character can be inserted by doubling it. List of
+ file type names can be found in the description of filetype()
+ function.
+
+ 'confirm' 'cf'
+ type: set
+ default: delete,permdelete
+ Defines which operations require confirmation:
+ - delete - moving files to trash (on d or :delete);
+ - permdelete - permanent deletion of files (on D or :delete!
+ command or on undo/redo operation).
+
+ 'cpoptions' 'cpo'
+ type: charset
+ default: "fst"
+ Contains a sequence of single-character flags. Each flag en-
+ ables behaviour of older versions of vifm. Flags:
+ - f - when included, running :filter command results in not in-
+ verted (matching files are filtered out) and :filter! in in-
+ verted (matching files are left) filter, when omitted, meaning
+ of the exclamation mark changes to the opposite;
+ - s - when included, yy, dd and DD normal mode commands act on
+ selection, otherwise they operate on current file only;
+ - t - when included, (thus ) behave as and
+ switches active pane, otherwise and go forward in
+ the view history. It's possible to make both and to
+ work as expected by setting up the terminal to emit a custom se-
+ quence when is pressed; see :histnext for details.
+
+ 'cvoptions'
+ type: set
+ default:
+ Specifies whether entering/leaving custom views triggers events
+ that normally happen on entering/leaving directories:
+ - autocmds - trigger autocommands on entering/leaving custom
+ views;
+ - localopts - reset local options on entering/leaving custom
+ views;
+ - localfilter - reset local filter on entering/leaving custom
+ views.
+
+ 'deleteprg'
+ type: string
+ default: ""
+ Specifies program to run on files that are permanently removed.
+ When empty, files are removed as usual, otherwise this command
+ is invoked on each file by appending its name. If the command
+ doesn't remove files, they will remain on the file system.
+
+ 'dirsize'
+ type: enumeration
+ default: size
+ Controls how size of directories is displayed in file views.
+ The following values are possible:
+ - size - size of directory (i.e., size used to store list of
+ files)
+ - nitems - number of entries in the directory (excluding . and
+ ..)
+
+ Size obtained via ga/gA overwrites this setting so seeing count
+ of files and occasionally size of directories is possible.
+
+ 'dotdirs'
+ type: set
+ default: nonrootparent,treeleafsparent
+ Controls displaying of dot directories. The following values
+ are possible:
+ - rootparent - show "../" in root directory of file system
+ - nonrootparent - show "../" in non-root directories of file
+ system
+ - treeleafsparent - show "../" in empty directories of tree
+ view
+
+ Note that empty directories always contain "../" entry regard-
+ less of value of this option. "../" disappears at the moment at
+ least one file is created.
+
+ 'dotfiles'
+ type: boolean
+ default: false
+ Whether dot files are shown in the view. Can be controlled with
+ z* bindings.
+
+ 'fastrun'
+ type: boolean
+ default: false
+ With this option turned on you can run partially entered com-
+ mands with unambiguous beginning using :! (e.g. :!Te instead of
+ :!Terminal or :!Te).
+
+ 'fillchars' 'fcs'
+ type: string list
+ default: ""
+ Sets characters used to fill borders.
+
+ item default used for
+ vborder:c ' ' left, middle and right vertical bor-
+ ders
+ hborder:c '' middle horizontal border
+
+ A null string for vborder is equivalent to a space.
+
+ A null string for hborder omits the horizontal border.
+
+ Example:
+
+ set fillchars=vborder:".",hborder:""
+
+ 'findprg'
+ type: string
+ default: "find %s %a -print , -type d \( ! -readable -o ! -exe-
+ cutable \) -prune"
+ Specifies format for an external command to be invoked by the
+ :find command. The format supports expansion of macros specific
+ for this particular option and %% sequence for inserting percent
+ sign literally. The macros are:
+
+ macro value/meaning
+ %s literal arguments of :find or
+ list of paths to search in
+
+ %A empty or
+ literal arguments of :find
+ %a empty or
+ literal arguments of :find or
+ predicate followed by escaped arguments of :find
+ %p empty or
+ literal arguments of :find or
+ escaped arguments (parameters) of :find
+
+ %u redirect output to custom view instead of showing a
+ menu
+ %U redirect output to unsorted custom view instead of
+ showing a menu
+
+ Predicate in %a is "-name" on *nix and "-iname" on Windows.
+
+ If both %u and %U are specified, %U is chosen.
+
+ Some macros can be added implicitly:
+ - if %s isn't present, it's appended
+ - if neither of %a, %A and %p is present, %a is appended
+ - if neither of %s, %a, %A and %p is present, %s and %a are ap-
+ pended in this order
+
+ The macros slightly change their meaning depending on format of
+ :find's arguments:
+ - if the first argument points to an existing directory, %s is
+ assigned all arguments while %a, %A and %p are left empty
+ - otherwise:
+ - %s is assigned a dot (".") meaning current directory or
+ list of selected file names, if any
+ - %a, %A and %p are assigned literal arguments when first
+ argument starts with a dash ("-"), otherwise %a gets an escaped
+ version of the arguments with a predicate and %p contains es-
+ caped version of the arguments
+
+ Starting with Windows Server 2003 a `where` command is avail-
+ able. One can configure vifm to use it in the following way:
+
+ set findprg="where /R %s %A"
+
+ As the syntax of this command is rather limited, one can't use
+ :find command with selection of more than one item because the
+ command ignores all directory paths except for the last one.
+
+ When using find port on Windows, another option is to setup
+ 'findprg' like this:
+
+ set findprg="find %s %a"
+
+
+ 'followlinks'
+ type: boolean
+ default: true
+ Follow links on l or Enter. That is navigate to destination
+ file instead of treating the link as if it were target file.
+ Doesn't affects links to directories, which are always entered
+ (use gf key for directories).
+
+ 'fusehome'
+ type: string
+ default: "($XDG_DATA_HOME/vifm | $VIFM)/fuse/"
+ Directory to be used as a root dir for FUSE mounts. Value of
+ the option can contain environment variables (in form "$en-
+ vname"), which will be expanded (prepend it with a slash to pre-
+ vent expansion). The value should expand to an absolute path.
+
+ If you change this option, vifm won't remount anything. It af-
+ fects future mounts only. See "Automatic FUSE mounts" section
+ below for more information.
+
+ 'gdefault' 'gd'
+ type: boolean
+ default: false
+ When on, 'g' flag is on for :substitute by default.
+
+ 'grepprg'
+ type: string
+ default: "grep -n -H -I -r %i %a %s"
+ Specifies format for an external command to be invoked by the
+ :grep command. The format supports expanding of macros, spe-
+ cific for a particular *prg option, and %% sequence for insert-
+ ing percent sign literally. This option should include the %i
+ macro to specify placement of "-v" string when inversion of re-
+ sults is requested, %a or %A macro to specify placement of argu-
+ ments passed to the :grep command and the %s macro to specify
+ placement of list of files to search in. If some of the macros
+ are not used, they will be implicitly added after a space to the
+ value of the 'grepprg' option in the following order: %i, %a,
+ %s. Note that when neither %a nor %A are specified, it's %a
+ which is added implicitly.
+
+ Optional %u or %U macro could be used (if both specified %U is
+ chosen) to force redirection to custom or unsorted custom view
+ respectively.
+
+ See 'findprg' option for description of difference between %a
+ and %A.
+
+ Example of setup to use ack (http://beyondgrep.com/) instead of
+ grep:
+
+ set grepprg='ack -H -r %i %a %s'
+
+ or The Silver Searcher (https://github.com/ggreer/the_sil-
+ ver_searcher):
+
+ set grepprg='ag --line-numbers %i %a %s'
+
+
+
+ 'histcursor'
+ type: set
+ default: startup,dirmark,direnter
+ Defines situations when cursor should be moved according to di-
+ rectory history:
+ - startup - on loading file lists during startup
+ - dirmark - after navigating to a mark that doesn't specify
+ file
+ - direnter - on opening directory from a file list
+
+ This option has no effect when 'autochpos' is disabled.
+
+ Note that the list is not exhaustive and there are other situa-
+ tions when cursor is positioned automatically.
+
+ 'history' 'hi'
+ type: integer
+ default: 15
+ Maximum number of stored items in all histories.
+
+ 'hlsearch' 'hls'
+ type: boolean
+ default: true
+ Automatically select files that are search matches.
+
+ 'iec' type: boolean
+ default: false
+ Use KiB, MiB, ... suffixes instead of K, M, ... when printing
+ size in human-friendly format.
+
+ 'ignorecase' 'ic'
+ type: boolean
+ default: false
+ Ignore case in search patterns (:substitute, / and ? commands),
+ local filter (but not the rest of filters) and other things de-
+ tailed in the description of 'caseoptions'.
+
+ 'incsearch' 'is'
+ type: boolean
+ default: false
+ When this option is set, search and view update for local filter
+ is be performed starting from initial cursor position each time
+ search pattern is changed.
+
+ 'iooptions'
+ type: set
+ default: datasync
+ Controls details of file operations. The following values are
+ available:
+ - datasync - periodically synchronize writes on copying files
+ when 'syscalls' is set.
+ (This makes copying last as long as it takes to
+ actually write
+ data to the medium, which is slower than you might
+ expect;
+ however, this also prevents system hanging due to
+ filling memory
+ with file-system cache.)
+ - fastfilecloning - perform fast file cloning (copy-on-write),
+ when available (available on Linux and btrfs file system).
+
+ 'laststatus' 'ls'
+ type: boolean
+ default: true
+ Controls if status bar is visible.
+
+ 'lines'
+ type: integer
+ default: terminal height on startup
+ Terminal height in lines.
+
+ 'locateprg'
+ type: string
+ default: "locate %a"
+ Specifies format for an external command to be invoked by the
+ :locate command. The format supports expanding of macros, spe-
+ cific for a particular *prg option, and %% sequence for insert-
+ ing percent sign literally. This option should include the %a
+ macro to specify placement of arguments passed to the :locate
+ command. If the macro is not used, it will be implicitly added
+ after a space to the value of this option.
+
+ Optional %u or %U macro could be used (if both specified %U is
+ chosen) to force redirection to custom or unsorted custom view
+ respectively.
+
+ 'mediaprg'
+ type: string
+ default: path to bundled script that supports udevil, udisks and
+ udisks2
+ (using udisks2 requires python with dbus module in-
+ stalled)
+ OS X: path points to a python script that uses diskutil
+ {only for *nix}
+ Specifies command to be used to manage media devices. Used by
+ :media command.
+
+ The command can be passed the following parameters:
+ - list -- list media
+ - mount {device} -- mount a device
+ - unmount {path} -- unmount given mount point
+
+ The output of `list` subcommand is parsed in search of lines
+ that start with one of the following prefixes:
+ - device= - specifies device path (e.g., "/dev/sde")
+ - label= - specifies optional device label (e.g., "Memory
+ card")
+ - info= - specifies arbitrary text to display next to
+ device (by
+ default "[label]" is used, if label is pro-
+ vided)
+ - mount-point= - specifies a mount point (can be absent or ap-
+ pear more than once)
+
+ All other lines are ignored. Each `device=` starts a new sec-
+ tion describing a device which should include two other possible
+ prefixes.
+
+ `list` subcommand is assumed to always succeed, while exit code
+ of `mount` and `unmount` is taken into account to determine
+ whether operation was performed successfully.
+
+ 'lsoptions'
+ type: string list
+ default: ""
+ scope: local
+
+ Configures ls-like view.
+
+ item used for
+ columncount fixed number of columns to display or 0
+ transposed filling view grid by columns rather than by
+ lines
+
+
+ 'lsview'
+ type: boolean
+ default: false
+ scope: local
+ When this option is set, directory view will be displayed in
+ multiple columns with file names similar to output of `ls -x`
+ command. See "ls-like view" section below for format descrip-
+ tion. This option has no effect if 'millerview' is on.
+
+ 'milleroptions'
+ type: string list
+ default: "lsize:1,csize:1,rsize:1,rpreview:dirs"
+ scope: local
+
+ Configures miller view.
+
+ item default used for
+ lsize:num 0 left column
+ csize:num 1 center column (can't be disabled)
+ rsize:num 0 right column
+ rpreview:str dirs right column
+
+ *size specifies ratios of columns. Each ratio is in the range
+ from 0 to 100 and values are adjusted to fit the limits. Zero
+ disables a column, but central (main) column can't be disabled.
+
+ rpreview specifies what file-system objects should be previewed
+ in the right column and takes three values: dirs (only directo-
+ ries), files (only files) or all. Neither value enables preview
+ of parent directory ("..").
+
+ Example of two-column mode which is useful in combination with
+ :view command:
+
+ set milleroptions=lsize:1,csize:2
+
+
+ 'millerview'
+ type: boolean
+ default: false
+ scope: local
+ When this option is set, directory view will be displayed in
+ multiple cascading columns. Ignores 'lsview'.
+
+ 'mintimeoutlen'
+ type: integer
+ default: 150
+ The fracture of 'timeoutlen' in milliseconds that is waited be-
+ tween subsequent input polls, which affects various asynchronous
+ operations (detecting changes made by external applications,
+ monitoring background jobs, redrawing UI). There are no strict
+ guarantees, however the higher this value is, the less is CPU
+ load in idle mode.
+
+ 'mouse'
+ type: charset
+ default: ""
+
+ Contains a sequence of single-character flags:
+ - a - all supported modes (a shorthand for all the rest and fu-
+ ture additions)
+ - c - command-line mode (includes navigation mode)
+ - m - menu mode
+ - n - normal mode
+ - q - view mode
+ - v - visual mode
+
+ 'navoptions'
+ type: string list
+ default: "open:dirs"
+
+ Configures behaviour of navigation mode.
+
+ item default
+ open:str dirs
+
+ The "open" item specifies what file-system objects should be
+ opened on Enter and can take two values: dirs (only directories)
+ or all.
+
+ 'number' 'nu'
+ type: boolean
+ default: false
+ scope: local
+ Print line number in front of each file name when 'lsview' op-
+ tion is turned off. Use 'numberwidth' to control width of line
+ number. Also see 'relativenumber'.
+
+ 'numberwidth' 'nuw'
+ type: integer
+ default: 4
+ scope: local
+ Minimal number of characters for line number field.
+
+ 'previewoptions'
+ type: string list
+ default: "graphicsdelay:50000"
+
+ Tweaks how previewing is done (in quick view, miller view's col-
+ umn and view mode).
+
+ item default meaning
+ graphicsdelay:num 0 delay before drawing graphics (mi-
+ croseconds)
+ hardgraphicsclear unset redraw screen to get rid of graph-
+ ics
+ maxtreedepth:num 0 max number of levels in preview
+ tree
+ toptreestats unset show file counts before the tree
+
+ graphicsdelay is needed if terminal requires some timeout before
+ it can draw graphics (otherwise it gets lost).
+
+ hardgraphicsclear seems to be necessary to get rid of sixel
+ graphics in some terminals, where it otherwise lingers. This
+ can cause flicker on the screen due to erasure followed by re-
+ drawing.
+
+ 0 for maxtreedepth means "unlimited", 1 will only show selected
+ directory, 2 adds its children, and so forth.
+
+ Default value is used when item is missing from the option.
+
+ 'previewprg'
+ type: string
+ default: ""
+ scope: local
+
+ External command to be used instead of preview programs config-
+ ured via :fileviewer command.
+
+ Example:
+
+ " always show git log in preview of files inside some repository
+ au DirEnter '~/git-repo/**/*' setl previewprg='git log --color -- %c 2>&1'
+
+ 'quickview'
+ type: boolean
+ default: false
+ Whether quick view (:view) is currently active or not.
+
+ 'relativenumber' 'rnu'
+ type: boolean
+ default: false
+ scope: local
+ Print relative line number in front of each file name when
+ 'lsview' option is turned off. Use 'numberwidth' to control
+ width of line number. Various combinations of 'number' and
+ 'relativenumber' lead to such results:
+
+ nonumber number
+
+ norelativenumber | first | 1 first
+ | second | 2 second
+ | third | 3 third
+
+ relativenumber | 1 first | 1 first
+ | 0 second |2 second
+ | 1 third | 1 third
+
+
+ 'rulerformat' 'ruf'
+ type: string
+ default: "%l/%S "
+ Determines the content of the ruler. Its minimal width is 13
+ characters and it's right aligned. Following macros are sup-
+ ported:
+ %= - separation point between left and right aligned halves of
+ the line
+ %l - file number
+ %L - total number of files in view (including filtered out
+ ones)
+ %x - number of files excluded by filters
+ %0- - old name for %x macro
+ %P - percentage through file list (All, Top, xx% or Bot), al-
+ ways 3 in length
+ %S - number of displayed files
+ %= - separation point between left and right align items
+ %% - literal percent sign
+ %[ - designates beginning of an optional block
+ %] - designates end of an optional block
+
+ Percent sign can be followed by optional minimum field width.
+ Add '-' before minimum field width if you want field to be right
+ aligned.
+
+ Optional blocks are ignored unless at least one macro inside of
+ them is expanded to a non-empty value.
+
+ Example:
+
+ set rulerformat='%2l-%S%[ +%x%]'
+
+ 'runexec'
+ type: boolean
+ default: false
+ Run executable file on Enter, l or Right Arrow key. Behaviour
+ of the last two depends on the value of the 'lsview' option.
+
+ 'scrollbind' 'scb'
+ type: boolean
+ default: false
+ When this option is set, vifm will try to keep difference of
+ scrolling positions of two windows constant.
+
+ 'scrolloff' 'so'
+ type: integer
+ default: 0
+ Minimal number of screen lines to keep above and below the cur-
+ sor. If you want cursor line to always be in the middle of the
+ view (except at the beginning or end of the file list), set this
+ option to some large value (e.g. 999).
+
+ 'sessionoptions' 'ssop'
+ sessionoptions ssop
+ type: set
+ default: tui,state,tabs,savedirs,dhistory
+ An equivalent of 'vifminfo' for sessions, uses the same values.
+ When both options include the same value, data from session file
+ has higher priority (data from vifminfo isn't necessarily com-
+ pletely discarded, instead it's merged with the state of a ses-
+ sion the same way state of multiple instances is merged on
+ exit).
+
+ 'shell' 'sh'
+ type: string
+ default: $SHELL or "/bin/sh" or "cmd" (on MS-Windows)
+ Full path to the shell to use to run external commands. On *nix
+ a shell argument can be supplied.
+
+ 'shellcmdflag' 'shcf'
+ type: string
+ default: "-c" or "/C" (for cmd.exe on MS-Windows)
+ Command-line option used to pass a command to 'shell'. It's
+ used in contexts where command comes from the user.
+
+ Note that using this option to force interactive mode of the
+ shell is most likely a BAD IDEA. In general interactive host
+ and interactive child shell can't share the same terminal ses-
+ sion. You can't even run such a shell in background. Consider
+ writing a wrapper for your shell that preloads aliases and com-
+ mands without making the shell interactive and ending up using
+ it in a way it was not meant to be used.
+
+ Note that this option is ignored when 'shell' is set to Power-
+ Shell due to the internal use of `-encodedCommand`.
+
+ 'shortmess' 'shm'
+ type: charset
+ default: "p"
+ Contains a sequence of single-character flags. Each flag en-
+ ables shortening of some message displayed by vifm in the TUI.
+ Flags:
+ - L - display only last directory in tab line instead of full
+ path.
+ - M - shorten titles in windows of terminal multiplexers cre-
+ ated by vifm down to file name instead of using full path.
+ - T - truncate status bar messages in the middle if they are
+ too long to fit on the command line. "..." will appear in the
+ middle.
+ - p - use tilde shortening in view titles.
+
+
+ 'showtabline' 'stal'
+ type: enumeration
+ default: multiple
+ Specifies when tab line should be displayed. Possible values:
+ - never - never display tab line
+ - multiple - show tab line only when there are at least two
+ tabs
+ - always - display tab line always
+
+ Alternatively 0, 1 and 2 Vim-like values are also accepted and
+ correspond to "never", "multiple" and "always" respectively.
+
+
+ 'sizefmt'
+ type: string list
+ default: "units:iec"
+ Configures the way size is formatted in human-friendly way.
+
+ item value meaning
+ units: iec Use 1024 byte units (K or KiB,
+ etc.).
+ See 'iec' option.
+ si Use 1000 byte units (KB, etc.).
+ precision: i > 0 How many fraction digits to con-
+ sider.
+ {not set} Precision of 1 for integer part
+ < 10,
+ 0 otherwise (provides old behav-
+ iour).
+ space {present} Insert space before unit sym-
+ bols.
+ This is the default.
+ nospace {present} Do not insert space before unit
+ symbols.
+
+ Numbers are rounded from zero. Trailing zeros are dropped.
+
+ Example:
+
+ set sizefmt=units:iec,precision:2,nospace
+
+
+ 'slowfs'
+ type: string list
+ default: ""
+ only for *nix
+ A list of mounter fs name beginnings (first column in /etc/mtab
+ or /proc/mounts) or paths prefixes for fs/directories that work
+ too slow for you. This option can be used to stop vifm from
+ making some requests to particular kinds of file systems that
+ can slow down file browsing. Currently this means don't check
+ if directory has changed, skip check if target of symbolic links
+ exists, assume that link target located on slow fs to be a di-
+ rectory (allows entering directories and navigating to files via
+ gf). If you set the option to "*", it means all the systems are
+ considered slow (useful for cygwin, where all the checks might
+ render vifm very slow if there are network mounts).
+
+ Example for autofs root /mnt/autofs:
+
+ set slowfs+=/mnt/autofs
+
+ 'smartcase' 'scs'
+ type: boolean
+ default: false
+ Overrides the ignorecase option if a pattern contains at least
+ one upper case character. Only used when 'ignorecase' option is
+ enabled.
+
+ 'sort' type: string list
+ default: +name on *nix and +iname on Windows
+ scope: local
+ Sets list of sorting keys (first item is primary key, second is
+ secondary key, etc.):
+ [+-]ext - extension of files and directories
+ [+-]fileext - extension of files only
+ [+-]name - name (including extension)
+ [+-]iname - name (including extension, ignores case)
+ [+-]type - file type
+ (dir/reg/exe/link/char/block/sock/fifo)
+ [+-]dir - directory grouping (directory < file)
+ [+-]gid - group id (*nix only)
+ [+-]gname - group name (*nix only)
+ [+-]mode - file type derived from its mode (*nix only)
+ [+-]perms - permissions string (*nix only)
+ [+-]uid - owner id (*nix only)
+ [+-]uname - owner name (*nix only)
+ [+-]nlinks - number of hard links (*nix only)
+ [+-]inode - inode number (*nix only)
+ [+-]size - size
+ [+-]nitems - number of items in a directory (zero for files)
+ [+-]groups - groups extracted via regexps from 'sortgroups'
+ [+-]target - symbolic link target (empty for other file
+ types)
+ [+-]atime - time accessed (e.g., read, executed)
+ [+-]ctime - time changed (changes in metadata, like mode)
+ [+-]mtime - time modified (when file contents is changed)
+
+ Note: look for st_atime, st_ctime and st_mtime in "man 2 stat"
+ for more information on time keys.
+
+ '+' means ascending sort for this key, and '-' means descending
+ sort.
+
+ "dir" key is somewhat similar in this regard but it's added im-
+ plicitly: when "dir" is not specified, sorting behaves as if it
+ was the first key in the list. That's why if one wants sorting
+ algorithm to mix directories and files, "dir" should be appended
+ to sorting option, for example like this:
+
+ set sort+=dir
+
+ or
+
+ set sort=-size,dir
+
+ Value of the option is checked to include dir key and default
+ sorting key (name on *nix, iname on Windows). Here is what hap-
+ pens if one of them is missing:
+
+ - type key is added at the beginning;
+
+ - default key is added at the end;
+
+ all other keys are left untouched (at most they are moved).
+
+ This option also changes view columns according to primary sort-
+ ing key set, unless 'viewcolumns' option is not empty.
+
+ 'sortnumbers'
+ type: boolean
+ default: false
+ scope: local
+ Natural sort of (version) numbers within text.
+
+ 'sortgroups'
+ type: string
+ default: ""
+ scope: local
+ Sets comma-separated list of regular expressions for group type
+ of sorting. Double the comma to insert it literally.
+
+ The regular expressions are used to extract substrings of file
+ names to serve as keys for sorting. It is essentially a way to
+ ignore uninteresting parts of file names during sorting by name.
+
+ Each expression should contain at least one group or its value
+ will be considered to be always empty. Also, only the first
+ match of regular expression is processed.
+
+ The first group divides list of files into sub-groups, each of
+ which is then sorted by substrings extracted using second regu-
+ lar expression and so on recursively.
+
+ Example:
+ set sortgroups=-(todo|done).*
+ this would group files with "-done" in their names and files
+ with "-todo" separately. On ascending sorting, group containing
+ "-done" would appear before the other one.
+
+ 'sortorder'
+ type: enumeration
+ default: ascending
+ Sets sort order for primary key: ascending, descending.
+
+ 'statusline' 'stl'
+ type: string
+ default: ""
+ Determines the content of the status line (the line right above
+ command-line). Empty string means use same format like in pre-
+ vious versions. Following macros are supported:
+
+ - %N - line break (increases height of the status line accord-
+ ingly), ignores %[ %] blocks
+
+ - %t - file name (considering value of the 'classify' option)
+
+ - %T - symbolic link target (empty for other filetypes)
+
+ - %f - file name relative to current directory (considers 'clas-
+ sify')
+
+ - %A - file attributes (permissions on *nix or properties on
+ Windows)
+
+ - %o - file permissions in octal form on *nix (nothing on Win-
+ dows)
+
+ - %u - user name or uid (if it cannot be resolved)
+
+ - %g - group name or gid (if it cannot be resolved)
+
+ - %s - file size in human readable format
+
+ - %E - size of selected files in human readable format, same as
+ %s when no files are selected, except that it will never show
+ size of ../ in visual mode, since it cannot be selected
+
+ - %d - file modification date (uses 'timefmt' option)
+
+ - %D - path of the other pane for single-pane layout
+
+ - %a - amount of free space available on current FS
+
+ - %c - size of current FS
+
+ - %z - short tips/tricks/hints that chosen randomly after one
+ minute period
+
+ - %{} - evaluate arbitrary vifm expression '', e.g.
+ '&sort'
+
+ - %* - resets or applies one of User1..User20 highlight groups;
+ reset happens when width field is 0 or not specified, one of
+ the groups gets picked when width field is in the range from 1
+ to 20
+
+ - all 'rulerformat' macros
+
+ Percent sign can be followed by optional minimum field width.
+ Add '-' before minimum field width if you want field to be right
+ aligned.
+
+ On Windows file properties include the following flags (upper
+ case means flag is on):
+ A - archive
+ H - hidden
+ I - content isn't indexed
+ R - readonly
+ S - system
+ C - compressed
+ D - directory
+ E - encrypted
+ P - reparse point (e.g. symbolic link)
+ Z - sparse file
+
+ Example without colors:
+
+ set statusline=" %t%= %A %10u:%-7g %15s %20d %{&sort} "
+
+ Example with colors:
+
+ highlight User1 ctermbg=yellow
+ highlight User2 ctermbg=blue ctermfg=white cterm=bold
+ set statusline="%1* %-26t %2* %= %1* %A %2* %7u:%-7g %1* %-5s %2* %d "
+
+
+ 'suggestoptions'
+ type: string list
+ default:
+ Controls when, for what and how suggestions are displayed. The
+ following values are available:
+ - normal - in normal mode;
+ - visual - in visual mode;
+ - view - in view mode;
+ - otherpane - use other pane to display suggestions, when
+ available;
+ - delay[:num] - display suggestions after a small delay (to
+ do not annoy if you just want to type a fast shortcut consisting
+ of multiple keys), num specifies the delay in ms (500 by de-
+ fault), 'timeoutlen' at most;
+ - keys - include shortcuts (commands and selectors);
+ - foldsubkeys - fold multiple keys with common prefix;
+ - marks - include marks;
+ - registers[:num] - include registers, at most num files (5 by
+ default).
+
+ 'syncregs'
+ type: string
+ default: ""
+ Specifies identifier of group of instances that share registers
+ among each other. When several instances of vifm have this op-
+ tion set to identical value, they automatically synchronize con-
+ tents of their registers on operations which use them.
+
+ 'syscalls'
+ type: boolean
+ default: false
+ When disabled, vifm will rely on external applications to per-
+ form file-system operations, otherwise system calls are used in-
+ stead (much faster and supports progress tracking). The option
+ should eventually be removed. Mostly *nix-like systems are af-
+ fected.
+
+ 'tablabel'
+ type: string
+ default: ""
+ When non-empty and 'tabline' isn't set, determines format of the
+ main part of a single tab's label.
+
+ When empty, tab label is set to either tab name for named tabs
+ or to view title (usually current path) for unnamed tabs.
+
+ The following macros can appear in the format (see below for
+ what a flag is):
+
+ - %C - flag of a current tab
+
+ - %N - number of the tab
+
+ - %T - flag of a tree mode
+
+ - %c - description of a custom view
+
+ - %n - name of the tab
+
+ - %p - path of the view (handles filename modifiers)
+
+ - %t - title of the view (affected by 'shortmess' flags)
+
+ - %% - literal percent sign
+
+ - %[ - designates beginning of an optional block
+
+ - %] - designates end of an optional block
+
+ - %*, %0* - resets highlighting
+
+ - %1*-%20* - applies one of User1..User20 highlight groups
+
+ In global tabs the view in bullets above refers to currently ac-
+ tive view of that tab.
+
+ Flag macros are a special kind of macros that always expand to
+ an empty value and are meant to be used inside optional blocks
+ to control their visibility.
+
+ Optional blocks are ignored unless at least one macro inside of
+ them is expanded to a non-empty value or is a set flag macro.
+
+ " %[(%n)%] -- optional name of the tab
+ " %[ -- optional description of the view
+ " %[%T{tree}%] -- mark of tree mode
+ " %[{%c}%] -- description of custom view
+ " @ -- just an extra separator before the path
+ ' %]
+ " %p:t -- tail part of view's location
+ set tablabel=%[(%n)%]%[%[%T{tree}%]%[{%c}%]@%]%p:t
+
+ 'tabline' 'tal'
+ type: string
+ default: ""
+ When non-empty, determines format of the tab line. Note that
+ mouse clicks won't be handled when this option is non-empty.
+
+ The following macros can appear in the format:
+
+ - %*, %0* - resets highlighting
+
+ - %1*-%20* - applies one of User1..User20 highlight groups
+
+ 'tabprefix'
+ type: string
+ default: "[%N:"
+ Determines prefix of a tab's label. Formatting is done as for
+ 'tablabel' option.
+
+ 'tabscope'
+ type: enumeration
+ default: global
+ Picks style of tabs, which defines what a single tab contains.
+ Possible values:
+ - global - tab describes complete UI of two views and how they
+ are arranged
+ - pane - tab is located "inside" a pane and manages it and
+ quick view
+
+ 'tabstop' 'ts'
+ type: integer
+ default: value from curses library
+ Number of spaces that a Tab in the file counts for.
+
+ 'tabsuffix'
+ type: string
+ default: "]"
+ Determines suffix of a tab's label. Formatting is done as for
+ 'tablabel' option.
+
+ 'timefmt'
+ type: string
+ default: "%m/%d %H:%M"
+ Format of time in file list. See "man 1 date" or "man 3 strf-
+ time" for details.
+
+ 'timeoutlen' 'tm'
+ type: integer
+ default: 1000
+ The time in milliseconds that is waited for a mapped key in case
+ of already typed key sequence is ambiguous.
+
+ 'title'
+ type: boolean
+ default: true when title can be restored, false otherwise
+ When enabled, title of the terminal or terminal multiplexer's
+ window is updated according to current location. Because not
+ all terminals support setting title, this works only if `$TERM`
+ value matches one of the following conditions:
+ - equals "xterm" or starts with "xterm-"
+ - equals "rxvt" or starts with "rxvt-"
+ - equals "screen" or starts with "screen-"
+ - equals "aterm"
+ - equals "Eterm"
+
+ 'trash'
+ type: boolean
+ default: true
+ Use trash directory. See "Trash directory" section below.
+
+ 'trashdir'
+ type: string
+ default:
+ on *nix:
+ "%r/.vifm-Trash-%u,$XDG_DATA_HOME/vifm/Trash,%r/.vifm-Trash"
+ or
+ "%r/.vifm-Trash-%u,$VIFM/Trash,%r/.vifm-Trash"
+ on Windows:
+ "%r/.vifm-Trash,$XDG_DATA_HOME/vifm/Trash"
+ or
+ "%r/.vifm-Trash,$VIFM/vifm/Trash"
+ List of trash directory path specifications, separated with com-
+ mas. Each list item either defines an absolute path to trash
+ directory or a path relative to a mount point root when list el-
+ ement starts with "%r/". Value of the option can contain envi-
+ ronment variables (of form "$envname"), which will be expanded
+ (prepend $ with a slash to prevent expansion). Environment
+ variables are expanded when the option is set.
+
+ On *nix, if element ends with "%u", the mark is replaced with
+ real user ID and permissions are set so that only that only
+ owner is able to use it.
+ Note that even this setup is not completely secure when combined
+ with "%r/" and it's overall safer to keep files in home direc-
+ tory, but that implies cost of copying files between partitions.
+
+ When new file gets cut (deleted) vifm traverses each element of
+ the option in the order of their appearance and uses first trash
+ directory that it was able to create or that is already
+ writable.
+
+ Default value tries to use trash directory per mount point and
+ falls back to trash common trash directory on failure.
+
+ Will attempt to create the directory if it does not exist. See
+ "Trash directory" section below.
+
+ 'tuioptions' 'to'
+ type: charset
+ default: "psv"
+ Each flag configures some aspect of TUI appearance. The flags
+ are:
+ p - when included:
+ * file list inside a pane gets additional single character
+ padding on left and right sides;
+ * quick view and view mode get single character padding.
+ s - when included, left and right borders (side borders, hence
+ "s" character) are visible.
+ u - use Unicode characters in the TUI (Unicode ellipsis instead
+ of "...").
+ v - vary width of vertical middle border to equalize view sizes.
+
+ Each pane title contains the path of the listed directory. If
+ too large, the path is truncated on the left for the active pane
+ and on the right for the other pane. This can be modified with:
+
+ l - truncation is always on the left.
+ r - truncation is always on the right.
+
+ 'undolevels' 'ul'
+ type: integer
+ default: 100
+ Maximum number of changes that can be undone. Note that here
+ single file operation is used as a unit, not operation, i.e.
+ deletion of 101 files will exceed default limit.
+
+ 'vicmd'
+ type: string
+ default: "vim"
+ Command used to edit files in various contexts. Ampersand sign
+ at the end (regardless whether it's preceded by space or not)
+ means backgrounding of command.
+
+ Background flag is ignored in certain context where vifm waits
+ for the editor to finish. Such contexts include any command
+ that spawns editor to change list of file names or a command,
+ with :rename being one example. `-f` is also appended to pre-
+ vent forking in such cases, so the command needs to handle the
+ flag.
+
+ Additionally `+{num}` and `+'call cursor()'` arguments are used
+ to position cursor when location is known.
+
+ 'viewcolumns'
+ type: string
+ default: ""
+ scope: local
+ Format string containing list of columns in the view. When this
+ option is empty, view columns to show are chosen automatically
+ using sorting keys (see 'sort') as a base. Value of this option
+ is ignored if 'lsview' is set. See "Column view" section below
+ for format description.
+
+ An example of setting the options for both panes (note :windo
+ command):
+
+ windo set viewcolumns=-{name}..,6{size},11{perms}
+
+ 'vixcmd'
+ type: string
+ default: value of 'vicmd'
+ Same as 'vicmd', but takes precedence over it when running in-
+ side a graphical environment.
+
+ 'vifminfo'
+ type: set
+ default: bookmarks,bmarks
+ Controls what will be saved in the $VIFM/vifminfo file.
+
+ bmarks - named bookmarks (see :bmark command)
+ bookmarks - marks, except special ones like '< and '>
+ tui - state of the user interface (sorting, number of
+ windows, quick
+ view state, active view)
+ dhistory - directory history
+ state - file name and dot filters and terminal multiplex-
+ ers integration
+ state
+ cs - primary color scheme
+ savedirs - save last visited directory
+ chistory - command line history
+ ehistory - expression register history (see description of
+ Ctrl+R =
+ in command-line mode)
+ shistory - search history (/ and ? commands)
+ phistory - prompt history
+ fhistory - history of local filter (see description of the
+ "=" normal mode
+ command)
+ dirstack - directory stack overwrites previous stack, unless
+ stack of
+ current instance is empty
+ registers - registers content
+ tabs - global or pane tabs
+ options - all options that can be set with the :set command
+ (obsolete)
+ filetypes - associated programs and viewers (obsolete)
+ commands - user defined commands (see :command description)
+ (obsolete)
+
+ 'vimhelp'
+ type: boolean
+ default: false
+ Use vim help format.
+
+ 'wildmenu' 'wmnu'
+ type: boolean
+ default: false
+ Controls whether possible matches of completion will be shown
+ above the command line.
+
+ 'wildstyle'
+ type: enumeration
+ default: bar
+ Picks presentation style of wild menu. Possible values:
+ - bar - one-line with left-to-right cursor
+ - popup - multi-line with top-to-bottom cursor
+
+ 'wordchars'
+ type: string list
+ default: "1-8,14-31,33-255" (that is all non-whitespace charac-
+ ters)
+ Specifies which characters in command-line mode should be con-
+ sidered as part of a word. Value of the option is comma-sepa-
+ rated list of ranges. If both endpoints of a range match, sin-
+ gle endpoint is enough (e.g. "a" = "a-a"). Both endpoints are
+ inclusive. There are two accepted forms: character representing
+ itself or number encoding character according to ASCII table.
+ In case of ambiguous characters (dash, comma, digit) use numeric
+ form. Accepted characters are in the range from 0 to 255. Any
+ Unicode character with code greater than 255 is considered to be
+ part of a word.
+
+ The option affects Alt-D, Alt-B and Alt-F, but not Ctrl-W. This
+ is intentionally to allow two use cases:
+
+ - Moving by WORDS and deletion by words.
+ - Moving by words and deletion by WORDS.
+
+ To get the latter use the following mapping:
+
+ cnoremap
+
+ Also used for abbreviations.
+
+ 'wrap' type: boolean
+ default: true
+ Controls whether to wrap text in quick view.
+
+ 'wrapscan' 'ws'
+ type: boolean
+ default: true
+ Searches wrap around end of the list.
+
+Mappings
+ A user mapping like `nnoremap lhs rhs` defines a substitution of the
+ left-hand-side (LHS) with the right-hand-side (RHS) in the input
+ stream. A regular mapping (without "nore" in :command's name) expands
+ recognized sequences in the RHS, while "*noremap" mapping always inter-
+ prets RHS as if no user mappings were defined and each key has its
+ builtin meaning. In most cases you want to use noremap variant and if
+ your RHS includes LHS, only noremap variant will work because recursion
+ in a mapping is not allowed.
+
+ In order to define a mapping determine in which mode you want to acti-
+ vate it and use an appropriate "*noremap" :command (e.g., :nnoremap for
+ a normal mode mapping). RHS doesn't have to limit itself to the mode
+ in which the mapping was started and can span multiple modes.
+
+ Map arguments
+
+ LHS of mappings can be preceded by arguments which take the form of
+ special sequences:
+
+
+ Postpone UI updates until RHS is completely processed.
+
+ In case of builtin mapping causing conflict for a user-defined
+ mapping (e.g., `t` builtin to a partially typed `ta` user-de-
+ fined mapping), ignore the builtin mapping and wait for input
+ indefinitely as opposed to default behaviour of triggering the
+ builtin mapping after a delay defined by 'timeoutlen'. Example:
+
+ nnoremap tw :set wrap!
+ nnoremap