dotfiles

My personal configuration files.
Log | Files | Refs

commit e371d9edd474bcf89cf5d462eaccb8638900b390
Author: Benjamin Chausse <benjamin@chausse.xyz>
Date:   Sat,  3 Oct 2020 19:27:15 -0400

Initial commit

Diffstat:
A.Xresources | 55+++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/aliasrc | 56++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/compton.conf | 40++++++++++++++++++++++++++++++++++++++++
A.config/dunst/dunstrc | 313+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/manual.part | 30++++++++++++++++++++++++++++++
A.config/newsboat/config | 45+++++++++++++++++++++++++++++++++++++++++++++
A.config/newsboat/urls | 43+++++++++++++++++++++++++++++++++++++++++++
A.config/nvim/UltiSnips/rnoweb.snippets | 122+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/nvim/init.vim | 289++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/picom.conf | 47+++++++++++++++++++++++++++++++++++++++++++++++
A.config/shortcutrc | 34++++++++++++++++++++++++++++++++++
A.config/sxhkd/sxhkdrc | 257+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/todotxt-machine/config | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/vifm/colors/Default.vifm | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/vifm/colors/minimal.vifm | 26++++++++++++++++++++++++++
A.config/vifm/scripts/vifmimg | 97+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/vifm/vifm-help.txt | 6103+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/vifm/vifmrc | 297+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/zathura/zathurarc | 27+++++++++++++++++++++++++++
A.local/bin/Rinstall | 5+++++
A.local/bin/aliasgen | 14++++++++++++++
A.local/bin/bars | 22++++++++++++++++++++++
A.local/bin/blocks | 3+++
A.local/bin/bloks | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.local/bin/bonsai | 554+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.local/bin/camtoggle | 4++++
A.local/bin/colorbars | 38++++++++++++++++++++++++++++++++++++++
A.local/bin/colorbars-sm | 35+++++++++++++++++++++++++++++++++++
A.local/bin/colorscheme | 27+++++++++++++++++++++++++++
A.local/bin/compiler | 40++++++++++++++++++++++++++++++++++++++++
A.local/bin/cronbat | 8++++++++
A.local/bin/crontog | 5+++++
A.local/bin/datetime | 3+++
A.local/bin/define | 3+++
A.local/bin/displaymenu | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.local/bin/displayselect | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.local/bin/dna | 47+++++++++++++++++++++++++++++++++++++++++++++++
A.local/bin/dropbox-status | 9+++++++++
A.local/bin/dropdowntoggle | 17+++++++++++++++++
A.local/bin/dwmbar | 26++++++++++++++++++++++++++
A.local/bin/dwmbar-battery | 22++++++++++++++++++++++
A.local/bin/emoji-copy | 20++++++++++++++++++++
A.local/bin/extract | 41+++++++++++++++++++++++++++++++++++++++++
A.local/bin/fixaudio | 8++++++++
A.local/bin/gd2pdf | 3+++
A.local/bin/getbib | 14++++++++++++++
A.local/bin/groffdown | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.local/bin/kblayout | 3+++
A.local/bin/layouttoggle | 24++++++++++++++++++++++++
A.local/bin/linkhandler | 22++++++++++++++++++++++
A.local/bin/makestereo | 9+++++++++
A.local/bin/manualgen | 19+++++++++++++++++++
A.local/bin/mountmenu | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.local/bin/newsup | 15+++++++++++++++
A.local/bin/opout | 11+++++++++++
A.local/bin/pacman-colors | 48++++++++++++++++++++++++++++++++++++++++++++++++
A.local/bin/pipes | 136+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.local/bin/pipesx | 207+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.local/bin/pod-dl | 30++++++++++++++++++++++++++++++
A.local/bin/podentr | 5+++++
A.local/bin/powermenu | 11+++++++++++
A.local/bin/printermenu | 3+++
A.local/bin/qndl | 13+++++++++++++
A.local/bin/queueandnotify | 15+++++++++++++++
A.local/bin/rain | 101+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.local/bin/recordmenu | 105+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.local/bin/rssadd | 9+++++++++
A.local/bin/screenstatus | 4++++
A.local/bin/setbg | 20++++++++++++++++++++
A.local/bin/shortcutgen | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.local/bin/slendy | 36++++++++++++++++++++++++++++++++++++
A.local/bin/surfmenu | 4++++
A.local/bin/tdout | 9+++++++++
A.local/bin/test.sh | 9+++++++++
A.local/bin/texclear | 32++++++++++++++++++++++++++++++++
A.local/bin/texinit | 6++++++
A.local/bin/tmux-mpsyt | 16++++++++++++++++
A.local/bin/tmux-r | 18++++++++++++++++++
A.local/bin/tmux-shell | 18++++++++++++++++++
A.local/bin/tmux-vlc | 19+++++++++++++++++++
A.local/bin/todotable | 23+++++++++++++++++++++++
A.local/bin/trackpadtoggle | 15+++++++++++++++
A.local/bin/transadd | 9+++++++++
A.local/bin/umountmenu | 42++++++++++++++++++++++++++++++++++++++++++
A.local/bin/unix | 26++++++++++++++++++++++++++
A.local/bin/vifmrun | 16++++++++++++++++
A.local/bin/volumectl | 23+++++++++++++++++++++++
A.local/bin/vpnmenu | 14++++++++++++++
A.local/bin/vpnstatus | 25+++++++++++++++++++++++++
A.local/bin/websearch | 31+++++++++++++++++++++++++++++++
A.local/bin/wifi | 10++++++++++
A.local/bin/yadms | 15+++++++++++++++
A.profile | 48++++++++++++++++++++++++++++++++++++++++++++++++
A.tmux.conf | 113+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.xinitrc | 21+++++++++++++++++++++
A.zshrc | 101+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
96 files changed, 10865 insertions(+), 0 deletions(-)

diff --git a/.Xresources b/.Xresources @@ -0,0 +1,55 @@ +URxvt.iconFile: /usr/share/icons/Faenza/apps/scalable/urxvt.svg +URxvt.transparent: false +!URxvt.shading: 40 // 0 to 99 darkens, 101 to 200 lightens +URxvt.scrollBar: off +URxvt.font: xft:cure:size=9 +URxvt.perl-ext-common:default,url-select,keyboard-select,clipboard,autocomplete-ALL-the-things, +URxvt.keysym.M-u:perl:url-select:select_next +URxvt.keysym.M-slash: perl:aAtt:complete +URxvt.urlLauncher:firefox +URvxt.url-select.button: 1 +URxvt.underlineURLs:true +URxvt.keysym.M-Escape: perl:keyboard-select:activate +URxvt.keysym.M-c: perl:clipboard:copy +URxvt.keysym.M-v: perl:clipboard:paste +URxvt.keysym.M-C-v: perl:clipboard:paste_escaped +URxvt.clipboard.copycmd: xsel -ib +URxvt.clipboard.pastecmd: xsel -ob +!AMBIANCE +URxvt*background: #222D32 +URxvt.foreground: #F2F1F0 +URxvt.cursorColor: #F07746 + +!black +/* *color0: #222D32 */ +*color0: #182024 +*color8: #666666 +!red +*color1: #E84F4F +*color9: #D23D3D +!green +/* *color2: #B7CE42 */ +/* *color10: #BDE077 */ +*color2: #19B596 +*color10: #19B596 +!yellow +/* *color3: #C4E969 */ +/* *color11: #C4E969 */ +*color3: #EADAB1 +*color11: #EBCB88 +!blue +*color4: #66AABB +*color12: #AACCBB +!magenta +*color5: #B7416E +*color13: #E16A98 +!cyan +*color6: #6D878D +*color14: #42717B +!white +*color7: #F2F1F0 +*color15: #F2F1F0 + +! SXIV COLORS +Sxiv.background: #202020 +Sxiv.foreground: #565656 diff --git a/.config/aliasrc b/.config/aliasrc @@ -0,0 +1,56 @@ +# _ _ +# | (_) +# __ _| |_ __ _ ___ _ __ ___ +# / _` | | |/ _` / __| '__/ __| +# | (_| | | | (_| \__ \ | | (__ +# \__,_|_|_|\__,_|___/_| \___| +# +# + + + +# #---Universal Shell Alias Configuration File---# # +# First column contains the alias +# Second column contains the command to execute + +|---------+----------------------------------------------------------------------| +| :e | $EDITOR | +| :q | exit | +| adog | git log --all --decorate --oneline --graph | +| cdd | cd .. | +| cs | cowsay -f sodomized | +| df | yadm | +| dfa | yadm add | +| dfc | yadm commit | +| dfp | yadm pull | +| dfup | yadm commit -a && yadm push && dwmbar | +| e | $EDITOR | +| ew | nvim ./main.rnw | +| fetch | clear && printf '\n$(pfetch)\n$(bars)\n' | +| fp | fontpreview | +| fu | fuck | +| f | vicd | +| g | git | +| goobook | goobook -c $HOME/.config/goobook/config | +| gor | go run *.go | +| less | nvimpager | +| op | e main.rnw | +| R | R -q | +| td | todotxt-machine -c ~/.config/todotxt-machine/config | +| tm | tmux | +| tmcd | tmux attach-session -t | +| tmdd | tmux kill-session -t | +| tmls | tmux list-sessions | +| t | todo.sh -d $HOME/.config/todo/todo.cfg | +| ta | todo.sh -d $HOME/.config/todo/todo.cfg a | +| tl | todo.sh -d $HOME/.config/todo/todo.cfg ls | +| v | nvim | +| vc | expressvpn connect && dwmbar | +| vd | expressvpn disconnect && dwmbar | +| vm | expressvpn connect camo && dwmbar | +| vpn | expressvpn | +| vs | expressvpn connect smart && dwmbar | +| xx | chmod +x | +| yadog | yadm log --all --decorate --oneline --graph | +|---------+----------------------------------------------------------------------| + diff --git a/.config/compton.conf b/.config/compton.conf @@ -0,0 +1,40 @@ +# Blur +blur-background = true; +blur-method = "kawase"; +blur-strength = 4; + +# Fading +fading = false; +fade-in-step = 0.05; +fade-out-step = 0.05; +fade-exclude = [ ]; + +# Other +mark-wmwin-focused = true; +mark-ovredir-focused = true; +# use-ewmh-active-win = true; +detect-rounded-corners = true; +detect-client-opacity = true; +refresh-rate = 0; +vsync = true; +dbe = false; +# sw-opti = true; +unredir-if-possible = false; +# unredir-if-possible-delay = 5000; +# unredir-if-possible-exclude = [ ]; +focus-exclude = [ "class_g = 'Cairo-clock'" ]; +detect-transient = true; +detect-client-leader = true; +invert-color-include = [ ]; +# resize-damage = 1; + +# GLX backend +backend = "glx"; +glx-no-stencil = true; +glx-copy-from-front = false; +glx-swap-method = "undefined"; +glx-no-rebind-pixmap = true; +# glx-use-copysubbuffermesa = true; +# glx-use-gpushader4 = true; +# xrender-sync = true; +# xrender-sync-fence = true; diff --git a/.config/dunst/dunstrc b/.config/dunst/dunstrc @@ -0,0 +1,313 @@ +[global] + frame_width = 0 + frame_color = "#788388" + + Font = Hack Nerd Font Mono 14 + + # Allow a small subset of html markup: + # <b>bold</b> + # <i>italic</i> + # <s>strikethrough</s> + # <u>underline</u> + # + # For a complete reference see + # <http://developer.gnome.org/pango/stable/PangoMarkupFormat.html>. + # If markup is not allowed, those tags will be stripped out of the + # message. + markup = yes + + # The format of the message. Possible variables are: + # %a appname + # %s summary + # %b body + # %i iconname (including its path) + # %I iconname (without its path) + # %p progress value if set ([ 0%] to [100%]) or nothing + # Markup is allowed + format = "<b>%a</b>\n%s %p\n%b" + + # Sort messages by urgency. + sort = yes + + # Show how many messages are currently hidden (because of geometry). + indicate_hidden = yes + + # Alignment of message text. + # Possible values are "left", "center" and "right". + alignment = left + + # The frequency with wich text that is longer than the notification + # window allows bounces back and forth. + # This option conflicts with "word_wrap". + # Set to 0 to disable. + bounce_freq = 5 + + + # Show age of message if message is older than show_age_threshold + # seconds. + # Set to -1 to disable. + show_age_threshold = 60 + + # Split notifications into multiple lines if they don't fit into + # geometry. + word_wrap = no + + # Ignore newlines '\n' in notifications. + ignore_newline = no + + + # The geometry of the window: + # [{width}]x{height}[+/-{x}+/-{y}] + # The geometry of the message window. + # The height is measured in number of notifications everything else + # in pixels. If the width is omitted but the height is given + # ("-geometry x2"), the message window expands over the whole screen + # (dmenu-like). If width is 0, the window expands to the longest + # message displayed. A positive x is measured from the left, a + # negative from the right side of the screen. Y is measured from + # the top and down respectevly. + # The width can be negative. In this case the actual width is the + # screen width minus the width defined in within the geometry option. + geometry = "0x4-25-25" + + # Define the corner radius of the notification window + # in pixel size. If the radius is 0, you have no rounded + # corners. + # The radius will be automatically lowered if it exceeds half of the + # notification height to avoid clipping text and/or icons. + corner_radius=5 + + # Shrink window if it's smaller than the width. Will be ignored if + # width is 0. + shrink = yes + + # The transparency of the window. Range: [0; 100]. + # This option will only work if a compositing windowmanager is + # present (e.g. xcompmgr, compiz, etc.). + transparency = 0 + + # Don't remove messages, if the user is idle (no mouse or keyboard input) + # for longer than idle_threshold seconds. + # Set to 0 to disable. + # default 120 + idle_threshold = 120 + + # Which monitor should the notifications be displayed on. + monitor = 0 + + # Display notification on focused monitor. Possible modes are: + # mouse: follow mouse pointer + # keyboard: follow window with keyboard focus + # none: don't follow anything + # + # "keyboard" needs a windowmanager that exports the + # _NET_ACTIVE_WINDOW property. + # This should be the case for almost all modern windowmanagers. + # + # If this option is set to mouse or keyboard, the monitor option + # will be ignored. + follow = mouse + + # Should a notification popped up from history be sticky or timeout + # as if it would normally do. + sticky_history = yes + + # Maximum amount of notifications kept in history + history_length = 20 + + # Display indicators for URLs (U) and actions (A). + show_indicators = yes + + # The height of a single line. If the height is smaller than the + # font height, it will get raised to the font height. + # This adds empty space above and under the text. + line_height = 0 + + # Draw a line of "separator_height" pixel height between two + # notifications. + # Set to 0 to disable. + separator_height = 1 + + # Padding between text and separator. + # padding = 8 + padding = 8 + + # Horizontal padding. + horizontal_padding = 10 + + # Define a color for the separator. + # possible values are: + # * auto: dunst tries to find a color fitting to the background; + # * foreground: use the same color as the foreground; + # * frame: use the same color as the frame; + # * anything else will be interpreted as a X color. + separator_color = auto + # separator_color = #263238 + + # Print a notification on startup. + # This is mainly for error detection, since dbus (re-)starts dunst + # automatically after a crash. + startup_notification = false + + # dmenu path. + dmenu = /usr/bin/dmenu -p dunst: + + # Browser for opening urls in context menu. + browser = firefox + + # Align icons left/right/off + icon_position = right + + # Paths to default icons. + icon_path = /usr/share/icons/Adwaita/16x16/status/:/usr/share/icons/Adwaita/16x16/devices/ + + # Limit icons size. + max_icon_size=100 + +[shortcuts] + + # Shortcuts are specified as [modifier+][modifier+]...key + # Available modifiers are "ctrl", "mod1" (the alt-key), "mod2", + # "mod3" and "mod4" (windows-key). + # Xev might be helpful to find names for keys. + + # Close notification. + close = mod1+space + + # Close all notifications. + # close_all = ctrl+shift+space + close_all = ctrl+mod1+space + + # Redisplay last message(s). + # On the US keyboard layout "grave" is normally above TAB and left + # of "1". + history = ctrl+mod4+h + + # Context menu. + context = ctrl+mod1+c + +[urgency_low] + # IMPORTANT: colors have to be defined in quotation marks. + # Otherwise the "#" and following would be interpreted as a comment. + background = "#263238" + foreground = "#556064" + timeout = 10 + +[urgency_normal] + background = "#263238" + foreground = "#F9FAF9" + timeout = 10 + +[urgency_critical] + background = "#D62929" + foreground = "#F9FAF9" + timeout = 0 + + +# Every section that isn't one of the above is interpreted as a rules to +# override settings for certain messages. +# Messages can be matched by "appname", "summary", "body", "icon", "category", +# "msg_urgency" and you can override the "timeout", "urgency", "foreground", +# "background", "new_icon" and "format". +# Shell-like globbing will get expanded. +# +# SCRIPTING +# You can specify a script that gets run when the rule matches by +# setting the "script" option. +# The script will be called as follows: +# script appname summary body icon urgency +# where urgency can be "LOW", "NORMAL" or "CRITICAL". +# +# NOTE: if you don't want a notification to be displayed, set the format +# to "". +# NOTE: It might be helpful to run dunst -print in a terminal in order +# to find fitting options for rules. + +#[espeak] +# summary = "*" +# script = dunst_espeak.sh + +#[script-test] +# summary = "*script*" +# script = dunst_test.sh + +#[ignore] +# # This notification will not be displayed +# summary = "foobar" +# format = "" + +#[signed_on] +# appname = Pidgin +# summary = "*signed on*" +# urgency = low +# +#[signed_off] +# appname = Pidgin +# summary = *signed off* +# urgency = low +# +#[says] +# appname = Pidgin +# summary = *says* +# urgency = critical +# +#[twitter] +# appname = Pidgin +# summary = *twitter.com* +# urgency = normal +# +#[Claws Mail] +# appname = claws-mail +# category = email.arrived +# urgency = normal +# background = "#2F899E" +# foreground = "#FFA247" +# +#[mute.sh] +# appname = mute +# category = mute.sound +# script = mute.sh +# +#[JDownloader] +# appname = JDownloader +# category = JD +# background = "#FFA247" +# foreground = "#FFFFFF" +# +[newsboat] + summary = *Feeds* + background = "#A8EB41" + foreground = "#FFFFFF" + +[irc] + appname = weechat + timeout = 0 + background = "#0033bb" + foreground = "#dddddd" +# +[weechat hl] + appname = weechat + category = weechat.HL + background = "#FF5C47" + foreground = "#FFFFFF" +# +[weechat pn] + appname = weechat + category = weechat.PM + background = "#D53B84" + foreground = "#FFFFFF" +# +[expressvpn] + appname = ExpressVPN + category = +#[CMUS] +# appname = CMUS +# category = cmus +# background = "#6C4AB7" +# foreground = "#FFE756" +# +# +# background = "#30AB70" +# foreground = "#F67245" +# +# vim: ft=cfg diff --git a/.config/manual.part b/.config/manual.part @@ -0,0 +1,30 @@ +--- +title: My dwm configuration +author: Benjamin Chausse +date: 2020-01-26 +--- + +The idea behind this configuration is simple. Vim-keybindings, Quick access to frequently used apps, and +Consistent design! + +# Useful info + +I use dwm, the dynamic window manager. All the bindings present in *Miscellaneous bindings* +are dynamically generated from my sxhkd configuration file (`~/.config/sxhkd/sxhkdrc`). +For that reason, some of it's syntax was borrowed when generating this manual: +Lists of keys surrounded by `{}` are key choices where typing different keys inside the array will have different effects. +The underscore `_` represents the lack of a key. +Therefore, `super + {_,shift} + i` represents these keybindings: +`super + i` **and** +`super + shift + i` + +# Terminal Bindings (st) +The default terminal is my build of st which itself is a variant +of Luke Smith's build. +- **Copy a commands's output**:`alt + o` +- **Copy a url on the terminal screen**:`alt + y` +- **Follow a url on the terminal screen**:`alt + l` +- **Scroll down in the terminal**:`alt + j` +- **Scroll up in the terminal**:`alt + k` + +# General Bindings diff --git a/.config/newsboat/config b/.config/newsboat/config @@ -0,0 +1,45 @@ +# show-read-feeds no +# auto-reload yes + +external-url-viewer "urlscan -dc -r 'linkhandler {}'" + +bind-key j down +bind-key k up +bind-key j next articlelist +bind-key k prev articlelist +bind-key J next-feed articlelist +bind-key K prev-feed articlelist +bind-key G end +bind-key g home +bind-key d pagedown +bind-key u pageup +bind-key l open +bind-key h quit +bind-key a toggle-article-read +bind-key n next-unread +bind-key N prev-unread +bind-key D pb-download +bind-key U show-urls +bind-key x pb-delete +bind-key ^t next-unread + +color listnormal cyan default +color listfocus black yellow standout bold +color listnormal_unread blue default +color listfocus_unread yellow default bold +color info red black bold +color article cyan default + +browser $SCRIPTS/handling/linkhandler +# external-url-viewer "less" +macro , open-in-browser +macro t set browser "tsp youtube-dl --add-metadata -ic"; open-in-browser ; set browser linkhandler +macro a set browser "tsp youtube-dl --add-metadata -xic -f bestaudio/best"; open-in-browser ; set browser linkhandler +macro v set browser "setsid nohup mpv"; open-in-browser ; set browser linkhandler +macro w set browser "w3m"; open-in-browser ; set browser linkhandler +# macro P external-url-viewer "grep" +macro c set browser "xsel -b <<<" ; open-in-browser ; set browser linkandler + +player "$SCRIPTS/handling/pod-dl" +download-path ~/Downloads/Podcasts + diff --git a/.config/newsboat/urls b/.config/newsboat/urls @@ -0,0 +1,43 @@ +#https://rss.app/feeds/nxTRC66uslhT5E22.xml #---Podcasts---# # +http://feeds.wnyc.org/science-friday "Podcast" "~Podcast: Science Friday " +https://feeds.buzzsprout.com/191338.rss "Podcast" "~Podcast: Our Ludicrous Future (Tim Dodd) " +https://carpoolcritics.libsyn.com/rss "Podcast" "~Podcast: Carpool Critics " +https://linustechtips.libsyn.com/wanshow "Podcast" "~Podcast: The WAN Show" + +# #---Youtube---# # +https://www.youtube.com/feeds/videos.xml?channel_id=UCtI0Hodo5o5dUb67FeUjDeA "Youtube" "~Youtube: SpaceX" +https://www.youtube.com/feeds/videos.xml?channel_id=UCxzC4EngIsMrPmbm6Nxvb-A "Youtube" "~Youtube: Scott Manley " +https://www.youtube.com/feeds/videos.xml?channel_id=UC6uKrU_WqJ1R2HMTY3LIx5Q "Youtube" "~Youtube: Everyday Astronaut " +https://www.youtube.com/feeds/videos.xml?channel_id=UCRS3mwPLCNjuNM8qhBlsIUg "Youtube" "~Youtube: SpaceXentric " +https://www.youtube.com/feeds/videos.xml?channel_id=UC8jkbVLPvztz8TuE98OYo8Q "Youtube" "~Youtube: Front Page Tech" +https://www.youtube.com/feeds/videos.xml?channel_id=UCXuqSBlHAE6Xw-yeJA0Tunw "Youtube" "~Youtube: Linus Tech Tips" +https://www.youtube.com/feeds/videos.xml?channel_id=UCeeFfhMcJa1kjtfZAGskOCA "Youtube" "~Youtube: Techlinked" +https://www.youtube.com/feeds/videos.xml?channel_id=UCdBK94H6oZT2Q7l0-b0xmMg "Youtube" "~Youtube: Short Circuit" +https://www.youtube.com/feeds/videos.xml?channel_id=UCFLFc8Lpbwt4jPtY1_Ai5yA "Youtube" "~Youtube: LMG Clips" +https://www.youtube.com/feeds/videos.xml?channel_id=UC2eEGT06FrWFU6VBnPOR9lg "Youtube" "~Youtube: Girlfriend Reviews" +https://www.youtube.com/feeds/videos.xml?channel_id=UC6107grRI4m0o2-emgoDnAA "Youtube" "~Youtube: Smarter Everyday " +https://www.youtube.com/feeds/videos.xml?channel_id=UC3DkFux8Iv-aYnTRWzwaiBA "Youtube" "~Youtube: Peter Mckinnon " +https://www.youtube.com/feeds/videos.xml?channel_id=UCQ-AAXSt0M5Gx0-A9UGut8g "Youtube" "~Youtube: Larian Studios" +https://www.youtube.com/feeds/videos.xml?channel_id=UC2eYFnH61tmytImy1mTYvhA "Youtube" "~Youtube: Luke Smith " +https://www.youtube.com/feeds/videos.xml?channel_id=UCBa659QWEk1AI4Tg--mrJ2A "Youtube" "~Youtube: Tom Scott" +# https://www.youtube.com/feeds/videos.xml?channel_id=<++> "Youtube" "~Youtube: <++>" + +# #---Twitter---# # +http://twitrss.me/twitter_user_to_rss/?user=SpaceX "Twitter" "~Twitter: SpaceX " +http://twitrss.me/twitter_user_to_rss/?user=Erdayastronaut "Twitter" "~Twitter: Everyday Astronaut " + +# #---Websites---# # +https://chaussebenjamin.xyz/index.xml "Website" "~Website: My Site " +https://www.spacex.com/news.xml "Website" "~Website: SpaceX Feed " +https://xkcd.com/rss.xml "Website" "~Website: XKCD " +# https://blogues.desjardins.com/press_release/atom.xml "Website" "~Website: Desjardins - Nouvelles" +https://chausse.xyz/rss.xml "Website" "~Website: My personal Blog" +https://lukesmith.xyz/rss.xml "Website" "~Website: Luke Smith's Blog" +# https://www.ledevoir.com/rss/section/societe/science.xml "Website" "~Website: Le Devoir Sciences" +# https://spacenews.com/feed/ "Website" "~Website: SpaceNews" + +# #---Facebook---# # +https://bridge.noisebridge.info/?action=display&bridge=Facebook&context=User&u=LaDebarqueEscalade&media_type=all&limit=-1&format=Atom "Facebook" "~Facebook: La Debarque" + +# #---Flickr---# # +https://www.flickr.com/services/feeds/photos_public.gne?id=130608600@N05&lang=en-us&format=rss_200 "Flickr" "~Flickr: Spacex Latest" diff --git a/.config/nvim/UltiSnips/rnoweb.snippets b/.config/nvim/UltiSnips/rnoweb.snippets @@ -0,0 +1,122 @@ +snippet \ "Begin/End Environments" +\begin{${1:element}} +${2:contents} +\end{$1} + +endsnippet + +snippet v "Import R variable in LaTeX" +\Sexpr{${1:var}} +endsnippet + +snippet eqn "Floating Equation" +\begin{eqfloat}[H] +\begin{align} + ${3:E} &= ${4:mc^2} +\end{align} +cond$5 +\label{eqn:${2:title}} +\caption{${1:A Title}} +\end{eqfloat} + +endsnippet + +snippet x "Multiplication Dot" +\cdot +endsnippet + +snippet e "Scientific Notation" +\cdot10^{${1:power}} +endsnippet + +snippet cond "Conditions for Equations" +\begin{conditions} + ${1:V} & ${2:Definition of V} +\end{conditions} +endsnippet + +snippet R "R Code" +<<label='${1:label}',echo=${2:FALSE},results='${3:asis}'>>= +${4:1+1} +@ +endsnippet + +snippet csv "Import CSV in R" +${1:variable_vame} <- read.csv("${2:path/to/file}.csv", +header=${3:TRUE}, +sep="${4:;}" +) + +endsnippet + +snippet xtable "Table made from R matrix" +print( + xtable(${1:matrix_name}, + caption="${2:Title of the table}", + label="tab:${3:table}", + digits=matrix($6 + c( +`!p +from time import sleep +try: + col = int(t[3])-1 + paragraph = "" + for i in range(int(t[4])-1): + paragraph += " rep(0,"+str(col)+"), <++>,\n" + paragraph += " rep(0,"+str(col)+"), <++>" + snip.rv = paragraph +except(ValueError): + sleep(1) +# paragraph = "" +# paragraph = " rep(0,"+t[3]+"), 0,\n" +# for i in range(int(t[4])-2): +# paragraph += " rep(0,"+t[3]+"), <++>,\n" +# paragraph += " rep(0,"+t[3]+"), <++>" +# snip.rv = paragraph +` + ), + nrow=${5:6}, + ncol=${4:3}, + byrow=TRUE + ), + table.placement="H" + ), + include.rownames=FALSE, + table.placement="H" +) + +endsnippet + +snippet img "Image" +\begin{figure}[H] +\begin{center} +\includegraphics[scale=${1:1}]{${2:path/to/image}} +\label{fig:${3/\s/_/g}} +\caption{${3:A Title}} +\end{center} +\end{figure} +endsnippet + +snippet b "Bold" +\textbf{${1:text}} +endsnippet + +snippet i "Italix" +\textit{${1:text}} +endsnippet + +snippet u "Underline" +\uline{${1:text}} +endsnippet + +snippet 1 "Section" +\section{${1:Title}} +endsnippet + +snippet 2 "Subsection" +\subsection{${1:Title}} +endsnippet + +snippet 3 "Subsubsection" +\subsubsection{${1:Title}} +endsnippet diff --git a/.config/nvim/init.vim b/.config/nvim/init.vim @@ -0,0 +1,289 @@ +" _ +" (_) +" __ ___ _ __ ___ _ __ ___ +" \ \ / / | '_ ` _ \| '__/ __| +" \ V /| | | | | | | | | (__ +" \_/ |_|_| |_| |_|_| \___| +" +" +" #---Plug Installer---# " +if empty(glob('~/.vim/autoload/plug.vim')) + silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs + \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim + autocmd VimEnter * PlugInstall --sync | source $MYVIMRC +endif + +" #---Vim Plugins---# " +call plug#begin() +" if has('nvim') + " Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' } +" else + " Plug 'Shougo/deoplete.nvim' + " Plug 'roxma/nvim-yarp' + " Plug 'roxma/vim-hug-neovim-rpc' +" endif +" Latex Deoplete source +" Plug 'hisaknown/deoplete-latex' +" Comment frames (for comment aesthetics) +Plug 'cometsong/CommentFrame.vim' +" Deoplete +Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' } +" Go Deoplete sources +Plug 'stamblerre/gocode', { 'rtp': 'vim', 'do': '~/.vim/plugged/gocode/vim/symlink.sh' } +Plug 'deoplete-plugins/deoplete-go', { 'do': 'make'} +" LaTeX deoplete +Plug 'hisaknown/deoplete-latex' +" Turning vim into an R IDE +Plug 'jalvesaq/Nvim-R' +" Vim Sensible +Plug 'tpope/vim-sensible' +" Vim org tables +Plug 'dhruvasagar/vim-table-mode' +" Html linter enabler (for prettier AUR package) +Plug 'dense-analysis/ale' +" Vim Goyo +Plug 'junegunn/goyo.vim' +" Vim css hex highlight +Plug 'chrisbra/Colorizer' +" Bracket Completion +Plug 'jiangmiao/auto-pairs' +" csv filetype for vim +Plug 'chrisbra/csv.vim' +" Go developement +Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' } +" sxhkd syntax +Plug 'kovetskiy/sxhkd-vim' +" Vim-Bling Search +Plug 'ivyl/vim-bling' +" Vim Hard Mode +Plug 'wikitopian/hardmode' +" I want to be a python ninja! +Plug 'metakirby5/codi.vim' +" Quickrun for python +Plug 'thinca/vim-quickrun' +" markdown preview vim +Plug 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install() }} +" Emmet expansion for html +Plug 'mattn/emmet-vim' +" html preview +Plug 'turbio/bracey.vim' +" VimCompletesMe for VimTex +Plug 'ajh17/VimCompletesMe' +" Xresources colors +Plug 'dylanaraps/wal.vim' +" Nord colors +Plug 'arcticicestudio/nord-vim' +" My personal colorscheme +Plug 'ChausseBenjamin/friffle-vim' +" Vim Fugitive +Plug 'tpope/vim-fugitive' +" Vim-Surround +Plug 'tpope/vim-surround' +" Vim repeat for dot command on vim surround +Plug 'tpope/vim-repeat' +" Vimtex +Plug 'lervag/vimtex' +" C developement in vim +Plug 'vim-scripts/c.vim' +" NERDTree +Plug 'scrooloose/nerdtree' +" Git plugin for NERDTree +Plug 'Xuyuanp/nerdtree-git-plugin' +" Icons in NERDTree and Airline +Plug 'ryanoasis/vim-devicons' +" lightline +Plug 'itchyny/lightline.vim' +" Commentary +Plug 'tpope/vim-commentary' +" Vim markdown +Plug 'godlygeek/tabular' +" Ctrl-P fuzzy file finder +Plug 'ctrlpvim/ctrlp.vim' +" Vim snippet manager/tool +Plug 'sirver/UltiSnips' +" Vim snippet library +Plug 'honza/vim-snippets' +" Async shell commands +Plug 'skywind3000/asyncrun.vim' +" French grammar checker +Plug 'dpelle/vim-Grammalecte' +" All purpose grammar checker +Plug 'dpelle/vim-LanguageTool' +call plug#end() + + +" #---Basics/Recomended---# " +syntax on +filetype plugin on +set termguicolors +set t_Co=256 +set encoding=utf-8 +set path+=** " Provides tab-completion for all file related tasks +set wildmenu " Display all matching file when we tab complete +" Spelling +set complete+=kspell " Better Spell Checking +set spelllang=fr +nnoremap ;h <Esc>zg +nnoremap ;j <Esc>]s +nnoremap ;k <Esc>[s +nnoremap ;l <Esc>z=1<CR><CR> +nnoremap ;<Space> <Esc>z=1<CR><CR> +" Enable autocompletion: + set wildmode=longest,list,full + set runtimepath+=~/.config/nvim/plugged/deoplete.nvim + let g:deoplete#enable_at_startup = 1 +" Splits open at the bottom and right, which is non-retarded, unlike vim defaults. +set splitbelow splitright +set rtp+=/usr/local/opt/fzf " Fuzzy File Finder +set t_vi= " Autohide the cursor +" Automatic wordwrap without creating newlines! +set wrap +set linebreak + +" #---Plugin Preferences---# " +" Nvim-R +let R_rconsole_width = 0 +" Emmet Expansion +let g:user_emmet_leader_key=',' +" Enable kite autocompletion +let g:kite_auto_complete=1 +" MarkdownPreview +" let g:mkdp_browser = 'surf' +" Bracey +let g:bracey_browser_command = "chromium" +" Grammalecte path +let g:grammalecte_cli_py = "/usr/bin/grammalecte-cli" +" Ale Linter with prettier +let g:ale_linters_explicit = 1 +" autocmd BufWrite, *.css,*.html,*.js :ALEFix prettier +" Ultisnips + " Trigger configuration. Do not use <tab> if you use https://github.com/Valloric/YouCompleteMe. + let g:UltiSnipsExpandTrigger="<Tab>" + let g:UltiSnipsJumpForwardTrigger=";<Space>" + let g:UltiSnipsJumpBackwardTrigger=";n" + " If you want :UltiSnipsEdit to split your window. + let g:UltiSnipsEditSplit="vertical" + " Snippet directory + let g:UltiSnipsSnippetDirectories=[$HOME.'/.config/nvim/UltiSnips'] +" Go deoplete +let g:deoplete#sources#go#gocode_binary = '$GOPATH/bin/gocode' +" Hexokinase +let g:Hexokinase_highlighters = ['virtual'] +" GoRun Split Reuse +function! ReuseVimGoTerm(cmd) abort + for w in nvim_list_wins() + if "goterm" == nvim_buf_get_option(nvim_win_get_buf(w), 'filetype') + call nvim_win_close(w, v:true) + break + endif + endfor + execute a:cmd +endfunction +let g:go_term_enabled = 1 +let g:go_term_mode = "silent keepalt rightbelow 35 vsplit" +let g:go_def_reuse_buffer = 1 +autocmd FileType go nmap <leader>r :call ReuseVimGoTerm('GoRun')<Return> +" Vimtex pdf viewer +let g:latex_view_general_viewer = 'zathura' +let g:vimtex_view_method = "zathura" + +" #---Document Compilation/Visualisation---# " +" Compile document, be it groff/LaTeX/markdown/etc. +map <leader>c :w! \| AsyncRun compiler <c-r>%<CR><CR> +autocmd InsertLeave,TextChanged *.gd,*.ms,*.mom :w! | :execute 'silent AsyncRun compiler %' +" autocmd InsertLeave *.rmd,*.rnw,*.tex :w! | :execute 'silent AsyncRun compiler %; todotable % TODO FIXME CHANGED XXX IDEA HACK NOTE REVIEW NB BUG QUESTION COMBAK' +autocmd VimLeave *.rmd,*.rnw,*.tex !texclear % +map <leader>x :w! \| AsyncRun todotable <c-r>% TODO FIXME CHANGED XXX IDEA HACK NOTE REVIEW NB BUG QUESTION COMBAK TEMP<CR><CR> +" Open corresponding .pdf/.html or preview + map <leader>p :! opout <c-r>%<CR><CR> +" Open corresponding .pdf/.html or preview + map <leader>o :! tdout <c-r>%<CR><CR> +" Width tabstop +set tabstop=2 +" when indenting with '>', use 4 spaces width +set shiftwidth=2 + +" #---Custom Keymaps---# " +" Tab Buffer Navigation + nnoremap <S-k> :bp<CR> + nnoremap <S-j> :bn<CR> +" Vim split resize + map <Up> <Esc>:resize<Space>+3<CR> + map <Down> <Esc>:resize<Space>-3<CR> + map <Left> <Esc>:vertical<Space>resize<Space>-3<CR> + map <Right> <Esc>:vertical<Space>resize<Space>+3<CR> + map <C-_> <Esc>:split<CR> + map <C-\> <Esc>:vsplit<CR> +" Ninja python execution + map <F5> <Esc>:Codi!!<CR> + map <F6> <Esc>:QuickRun<CR> +" Shortcutting split navigation, saving a keypress: + map <C-h> <C-w>h + map <C-j> <C-w>j + map <C-k> <C-w>k + map <C-l> <C-w>l +" Create blank lines using Shift J and Shift K + nnoremap J o<Esc> + nnoremap K O<Esc> +" Figlet dotfile titles +command RcTitle .!figlet -s -f big +" Easily escape terminal mode +tnoremap <Esc> <C-\><C-n> +" Pressing shift semicolon was too long: +nnoremap <Space> : +" Fastest :w in the west +nnoremap <leader>w :w<CR> +" #---Visual Enhancements---# " +colorscheme friffle +" Remove latex underscore errors +let g:tex_no_error=1 +" let g:airline_powerline_fonts = 1 +" Lightline config +let g:lightline = { + \ 'colorscheme': 'friffle', + \ } +set noshowmode +" Vim-go breakpoints and debug +nnoremap mp :GoDebugBreakpoint<CR> +nnoremap mn :GoDebugNext<CR> +nnoremap ms :GoDebugStart<CR> +nnoremap mq :GoDebugStop<CR> + +" #---Ease Of Use---# " +" Normal/relative number toggle +set number relativenumber +augroup numbertoggle + autocmd! + autocmd BufEnter,FocusGained,InsertLeave * set relativenumber + autocmd BufLeave,FocusLost,InsertEnter * set norelativenumber +augroup END +" Remove all trailing spaces upon write {{{ +autocmd BufWritePre * %s/\s\+$//e +" Soft Tabs +filetype plugin indent on +" NERDTRee Hotkey map +map <C-n> :NERDTreeToggle<CR> + let NERDTreeDirArrowExpandable="|" + let NERDTreeDirArrowCollapsible="-" +" Close vim if the only window left open is a NERDTree +autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif +" Other NERDTree Preferences +let NERDTreeMinimalUI = 1 +let NERDTreeDirArrows = 1 +let NERDTreeShowBookmarks=1 +let NERDTreeAutoDeleteBuffer = 1 +let NERDTreeQuitOnOpen = 1 +" Nvim-R send line +nmap <C-Enter> <leader>l +" Nvim folding + let r_syntax_folding = 1 + set foldnestmax=1 + + +" #---Universal Macros---# " +" Create and navigate Markers +" inoremap ;m <++> +inoremap ;; <Esc>/<++><CR>"_c4l +inoremap << « +inoremap >> » +" #---Filetype Specific Settings---# " diff --git a/.config/picom.conf b/.config/picom.conf @@ -0,0 +1,47 @@ +# Blur +blur-background = false; +# blur-method = "kawase"; +blur-strength = 4; + +# Fading +fading = false; +fade-in-step = 0.05; +fade-out-step = 0.05; +fade-exclude = [ ]; + +# Rounded Corners + corner-radius = 11; +rounded-corners-exclude = [ + "class_g = 'dwm'", +]; + +# Other +mark-wmwin-focused = true; +mark-ovredir-focused = true; +# use-ewmh-active-win = true; +detect-rounded-corners = true; +detect-client-opacity = true; +refresh-rate = 0; +vsync = true; +dbe = false; +# sw-opti = true; +unredir-if-possible = false; +# unredir-if-possible-delay = 5000; +# unredir-if-possible-exclude = [ ]; +focus-exclude = [ "class_g = 'Cairo-clock'" ]; +detect-transient = true; +detect-client-leader = true; +invert-color-include = [ ]; +use-damage = true; +# resize-damage = 1; + +# GLX backend +backend = "glx"; +glx-no-stencil = true; +glx-copy-from-front = false; +glx-swap-method = "undefined"; +glx-no-rebind-pixmap = true; +# glx-use-copysubbuffermesa = true; +glx-use-gpushader4 = true; +xrender-sync = true; +xrender-sync-fence = true; diff --git a/.config/shortcutrc b/.config/shortcutrc @@ -0,0 +1,34 @@ +# _____ _ _ _ +# / ____| | | | | | +# | (___ | |__ ___ _ __| |_ ___ _ _| |_ _ __ ___ +# \___ \| '_ \ / _ \| '__| __/ __| | | | __| '__/ __| +# ____) | | | | (_) | | | || (__| |_| | |_| | | (__ +# |_____/|_| |_|\___/|_| \__\___|\__,_|\__|_| \___| +# + + + +# #---Universal Shortcut Configuration File---# # +# First column should have the directory's Label +# Second column should contain the shortcut itself +# (without the modifier) +# Third column should contain the directory itself +# (It can contain environmental variables) + +|----------------+-----+--------------------------------------------------| +| Bibliographies | bb | $HOME/Dropbox/A/Scholar/All/References | +| Config | cf | $HOME/.config | +| Downloads | dl | $HOME/Dropbox/Downloads | +| Dropbox | db | $HOME/Dropbox | +| Music | ms | $HOME/Music | +| Neovim | vi | $HOME/.config/nvim | +| Personnal | ps | $HOME/Dropbox/A/Personnal/ | +| Wallpapers | wp | $HOME/Dropbox/A/Personnal/Photos/Wallpapers | +| RSS | rss | $HOME/.config/newsboat | +| Scholar | sf | $HOME/Dropbox/A/Scholar/1-CEGEP/Courses/session5 | +| Workspace | ws | $HOME/Workspace | +| Scripts | sc | $HOME/.scripts | +| Hotkeys | sx | $HOME/.config/sxhkd | +| Images | img | $HOME/Dropbox/A/Personnal/Photos/unsorted | +| Compilation | cmp | $HOME/Compilation | +|----------------+-----+--------------------------------------------------| diff --git a/.config/sxhkd/sxhkdrc b/.config/sxhkd/sxhkdrc @@ -0,0 +1,257 @@ +# _ _ _ +# | | | | | | +# _____ _| |__ | | ____| | +# / __\ \/ / '_ \| |/ / _` | +# \__ \> <| | | | < (_| | +# |___/_/\_\_| |_|_|\_\__,_| +# +# + +# Commands are procedurally added to the manual. + +# To do so, for every command, add a line starting +# with `##` which has a generic description of what +# the command does. + +# The pdf will associate it with the binding BELOW IT. + +# `#` followed by a space will be ignored and treated +# as regular comments. + +# `#-#` at the beggining of a line will be converted to +# a header in the manual. + +#-# dwm #-# +## Quit dwm +super + shift + q + dwmc quit +## Toggle the dwm bar +super + b + dwmc togglebar +## Change layout to {tiling, monocle} +super + {_,shift} t + dwmc setlayoutex {0,2} +## Change layout to {grid, floating} +super + {_,shift} g + dwmc setlayoutex {5,1} +## Change layout to {centeredmaster, floatingcenteredmaster} +super + {_,shift} m + dwmc setlayoutex {3,4} +## Make window fullscreen +super + f + dwmc togglefullscr +## Make current window floating +super + shift + space + dwmc togglefloating +## Cycle up and down the window stack (change focus) +super + {j,k} + dwmc focusstack {+,-}1 +## Rotate clockwise/counterclockwise the window stack +super + shift + {j,k} + dwmc rotatestack {+,-}1 +## Move current window up/down the stack +super + shift + {h,l} + dwmc movestack {-,+}1 +## Change focus to/swap the master window +super + {_, shift} + s + dwmc {focusmaster, zoom} +## Add/Remove windows from the master stack +super + {_,shift} + i + dwmc incnmaster {+,-}1 +## Increase/Decrease master stack width +super + {h,l} + dwmc setmfact {-,+}0.05 +## Toggle view next tag +super + Tab + dwmc view +## Cycle forward/backward through monitor focus +super + {comma,period} + dwmc focusmon {-,+}1 +## Move current window to previous/next monitor +super + shift + {comma,period} + dwmc tagmon {-,+}1 +## View all tags +super + 0 + dwmc viewall +## Move current window to tag {1-9} +super + shift + {1-9} + dwmc tagex {0-8} +## Only view the tag {1-9} +super + {1-9} + dwmc viewex {0-8} +## Toggle the visibility tag {1-9} +super + alt + {1-9} + dwmc toggleviewex {0-8} +## Toggle (pin/unpin) the current window on tag {1-9} +alt + {1-9} + dwmc toggletagex {0-8} +## Pin current window to all tags +super + shift + 0 + dwmc tagall +# ## Decrease/increase gaps +# super + {minus, shift + equal} +# dwmc setgaps {-,+}1 +# ## Set gaps to zero +# super + equal +# dwmc setgaps 0 + +#-# Miscellaneous #-# +## Quit Current App +super + q + kill -15 `xdotool getwindowfocus getwindowpid` +## Change Keyboard Layout +alt + Return + layouttoggle +## Find your cursor +super + BackSpace + find-cursor -l 4 -c "#66aabb" -s 150 +## Toggle Compositor +super + c + killall picom || setsid picom +## Toggle Screenkey +super + Insert + killall screenkey || screenkey --bg-color "#222d32" -s small -f HackGen -t 1 --font-color "#BABABA" +## Open this manual +super + alt + shift + h + $SCRIPTS/generation/manualgen +## Start colorpicker +super + shift + c + $SCRIPTS/handling/colorhandler + +#-# Standard Applications #-# +## Terminal window +super + Return + $TERMINAL +## Default Browser +super + w + $BROWSER +## TUI Email Client (neomutt) +super + e + killall neomutt || $TERMINAL -e neomutt ; $SCRIPTS/cron/dwmbar +## TUI Calendar (calcurse) +super + shift + e + killall calcurse || $TERMINAL -t dropdown_calendar -e calcurse +## TUI RSS Reader (newsboat) +super + n + killall newsboat || $TERMINAL -e newsboat ; $SCRIPTS/cron/dwmbar + +#-# Floating Apps/Utilities #-# +## Network Manager +super + shift + n + killall nmtui || dropdowntoggle network nmtui +## TUI Audio Mixer (alsamixer) +super + p + killall alsamixer || dropdowntoggle audio alsamixer -c 0 +## TODOs (todotxt-machine) +super + space + killall todotxt-machine || dropdowntoggle todos todotxt-machine +## Terminal Calculator +super + a + dropdowntoggle calc tmux-r +## Terminal Shell +super + shift + a + dropdowntoggle shell tmux-shell +## TUI Youtube (youtube-viewer) +super + v + killall youtube || dropdowntoggle youtube tmux-yt-viewer +## TUI Hacker News +super + shift + v + killall hacker-news || dropdowntoggle hacker-news tmux-hn +## Webcam +super + shift + w + $SCRIPTS/utilities/camtoggle +## Force Start VLC Podcast +super + shift + p + $SCRIPTS/utilities/tmux-vlc + +#-# Prompts (dmenu) #-# +## Application Launcher +alt + d + j4-dmenu-desktop +## Power Utility +alt + q + powermenu +## Quickly Search Google +alt + shift + d + websearch +## Open a bookmark in surf +alt + shift + o + surfmenu +## Emoji & Font-Awesome Selector +alt + grave + emoji-copy +## Mount/Unmount Devices Utility +alt + {_,shift} + m + { mountmenu, umountmenu } +## Recording Utility +alt + r + recordmenu kill || recordmenu +## Preview Fonts +alt + f + fontpreview +## Start SSH session +alt + s + $SCRIPTS/handling/pickssh + +#-# PrintScreen Utilities #-# +## Entire Screen +Print + scrot -q 100 -z && notify-send -i "$HOME/.fonts/svg/image.svg" -a Screenshot "Full screenshot completed" +## Current window +alt + Print + scrot -q 100 -u -z && notify-send -i "$HOME/.fonts/svg/image.svg" -a Screenshot "Window screenshot completed" +## Cursor Selection +super + Print + scrot -q 100 -s -z && notify-send -i "$HOME/.fonts/svg/image.svg" -a Screenshot "Selection screenshot completed" + +#-# Special Keys #-# +## Increase/decrease Volume +{XF86AudioRaiseVolume, XF86AudioLowerVolume} + volumectl 5 {+,-} +## Max-Out Volume +shift + XF86AudioRaiseVolume + volumectl 100 +## Set Volume to 5 percent +shift + XF86AudioLowerVolume + volumectl 5 +## Mute Audio +XF86AudioMute + volumectl mute +## Quit Current App +super + q + kill -15 `xdotool getwindowfocus getwindowpid` +## Increase/decrease Brightness +{XF86MonBrightnessUp, XF86MonBrightnessDown} + xbacklight -time 50 -fps 60 -{inc,dec} 5 && screenstatus +## Max-Out Brightness +shift + XF86MonBrightnessUp + xbacklight -time 100 -fps 60 -set 100 && screenstatus +## Set Brightness to 5 percent +shift + XF86MonBrightnessDown + xbacklight -time 100 -fps 60 -set 5 && screenstatus +## Display Setup Utility (mirror or extend displays) +XF86Display + displaymenu +## Disable Trackpad +XF86Favorites + trackpadtoggle 0 +## Enable Trackpad +shift + XF86Favorites + trackpadtoggle 1 +## Unmount Devices +shift + XF86Tools + umountmenu +## Mount Devices +XF86Tools + mountmenu + +#-# Music Controls (using `playerctl`) #-# +## Next/Previous Song (using playerctl) +super + {bracketright, bracketleft} + playerctl {next, previous} +## Higher/Lower music volume (using pla) +super + shift + {bracketright, bracketleft} + playerctl volume 5 {+, -} +## Toggle music playback +super + backslash + playerctl play-pause diff --git a/.config/todotxt-machine/config b/.config/todotxt-machine/config @@ -0,0 +1,51 @@ +[settings] +file = ~/Dropbox/TODOtxt/InitialFiles/todo.txt-cli/todo.txt +archive = ~/Dropbox/TODOtxt/InitialFiles/todo.txt-cli/done.txt +auto-save = True +show-toolbar = True +show-filter-panel = False +enable-borders = True +enable-word-wrap = True +colorscheme = myawesometheme +[colorscheme-myawesometheme] +plain=h250 +selected=,h238 +header_todo_count=h37 +header_todo_pending_count=h222 +header_todo_done_count=h188 +header_file=h244 +dialog_background=,h248 +dialog_color=,h240 +dialog_shadow=,h238 +footer=h39,h236 +search_match=h222,h236 +completed=h59 +context=h39 +project=h214 +creation_date=h135 +due_date=h37 +priority_a=h131 +priority_b=h222 +priority_c=h109 +priority_d=h139 +priority_e=h244 +priority_f=h244 +priority_g=h244 +priority_h=h244 +priority_i=h244 +priority_j=h244 +priority_k=h244 +priority_l=h244 +priority_m=h244 +priority_n=h244 +priority_o=h244 +priority_p=h244 +priority_q=h244 +priority_r=h244 +priority_s=h244 +priority_u=h244 +priority_v=h244 +priority_w=h244 +priority_x=h244 +priority_y=h244 +priority_z=h244 diff --git a/.config/vifm/colors/Default.vifm b/.config/vifm/colors/Default.vifm @@ -0,0 +1,83 @@ +" 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 (set bold attribute): +" 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) +" 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 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 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 AuxWin cterm=bold,underline,reverse,standout,italic ctermfg=default ctermbg=default +highlight TabLine cterm=none ctermfg=white ctermbg=black +highlight TabLineSel cterm=bold,reverse ctermfg=default ctermbg=default +highlight User1 cterm=bold,underline,reverse,standout,italic ctermfg=default ctermbg=default +highlight User2 cterm=bold,underline,reverse,standout,italic ctermfg=default ctermbg=default +highlight User3 cterm=bold,underline,reverse,standout,italic ctermfg=default ctermbg=default +highlight User4 cterm=bold,underline,reverse,standout,italic ctermfg=default ctermbg=default +highlight User5 cterm=bold,underline,reverse,standout,italic ctermfg=default ctermbg=default +highlight User6 cterm=bold,underline,reverse,standout,italic ctermfg=default ctermbg=default +highlight User7 cterm=bold,underline,reverse,standout,italic ctermfg=default ctermbg=default +highlight User8 cterm=bold,underline,reverse,standout,italic ctermfg=default ctermbg=default +highlight User9 cterm=bold,underline,reverse,standout,italic ctermfg=default ctermbg=default +highlight OtherWin cterm=bold,underline,reverse,standout,italic ctermfg=default ctermbg=default + +" vim: ft=vim diff --git a/.config/vifm/colors/minimal.vifm b/.config/vifm/colors/minimal.vifm @@ -0,0 +1,26 @@ +" colortheme +highlight clear + +highlight Win cterm=none ctermfg=255 ctermbg=none +highlight Directory cterm=bold ctermfg=12 ctermbg=default +highlight Link cterm=bold ctermfg=216 ctermbg=default +highlight BrokenLink cterm=bold ctermfg=9 ctermbg=default +highlight Socket cterm=bold ctermfg=10 ctermbg=default +highlight Device cterm=bold ctermfg=9 ctermbg=default +highlight Fifo cterm=bold ctermfg=150 ctermbg=default +highlight Executable cterm=none ctermfg=150 ctermbg=default +highlight Selected cterm=none ctermfg=255 ctermbg=236 +highlight CurrLine cterm=reverse +highlight TopLine cterm=none ctermfg=255 ctermbg=none +highlight TopLineSel cterm=bold ctermfg=110 ctermbg=none +highlight StatusLine cterm=none ctermfg=15 ctermbg=none +highlight WildMenu cterm=reverse ctermfg=255 ctermbg=black +highlight CmdLine cterm=none ctermfg=255 ctermbg=none +highlight ErrorMsg cterm=none ctermfg=203 ctermbg=none +highlight Border cterm=none ctermfg=black ctermbg=none +highlight JobLine cterm=bold,reverse ctermfg=black ctermbg=255 +highlight SuggestBox cterm=bold ctermfg=255 ctermbg=default +highlight CmpMismatch cterm=bold ctermfg=255 ctermbg=9 +highlight AuxWin cterm=bold,reverse ctermfg=default ctermbg=default + +" vim: ft=vim diff --git a/.config/vifm/scripts/vifmimg b/.config/vifm/scripts/vifmimg @@ -0,0 +1,97 @@ +#!/usr/bin/env bash +readonly ID_PREVIEW="preview" + +# Preview an image file directly +function draw() { + declare -p -A cmd=([action]=add [identifier]="$ID_PREVIEW" + [x]="$2" [y]="$3" [width]="$4" [height]="$5" \ + [path]="${PWD}/$6") \ + > "$FIFO_UEBERZUG" +} + +function font_preview() { + # if no preview found, generate one + if [ ! -f "/tmp${PWD}/$6.png" ]; then + fontpreview -i "$6" -o "/tmp${PWD}/$6.png" + fi + declare -p -A cmd=([action]=add [identifier]="$ID_PREVIEW" + [x]="$2" [y]="$3" [width]="$4" [height]="$5" \ + [path]="/tmp${PWD}/$6.png") \ + > "$FIFO_UEBERZUG" +} + +function pdf_preview() { + # if no preview found, generate one + if [ ! -f "/tmp${PWD}/$6.png" ]; then + pdftoppm -png -singlefile "$6" "/tmp${PWD}/$6" + fi + declare -p -A cmd=([action]=add [identifier]="$ID_PREVIEW" + [x]="$2" [y]="$3" [width]="$4" [height]="$5" \ + [path]="/tmp${PWD}/$6.png") \ + > "$FIFO_UEBERZUG" +} + +function audio_preview() { + # if no preview found, generate one + if [ ! -f "/tmp${PWD}/$6.png" ]; then + ffmpeg -i "$6" "/tmp${PWD}/$6.png" -y &> /dev/null + fi + declare -p -A cmd=([action]=add [identifier]="$ID_PREVIEW" + [x]="$2" [y]="$3" [width]="$4" [height]="$5" \ + [path]="/tmp${PWD}/$6.png") \ + > "$FIFO_UEBERZUG" +} + +function video_preview() { + # if no preview found, generate one + if [ ! -f "/tmp${PWD}/$6.png" ]; then + ffmpegthumbnailer -i "${PWD}/$6" -o "/tmp${PWD}/$6.png" -s 0 -q 10 + fi + declare -p -A cmd=([action]=add [identifier]="$ID_PREVIEW" + [x]="$2" [y]="$3" [width]="$4" [height]="$5" \ + [path]="/tmp${PWD}/$6.png") \ + > "$FIFO_UEBERZUG" +} + +function epub_preview() { + if [ ! -f "/tmp$PWD/$6.png" ]; then + epub-thumbnailer "$6" "/tmp$PWD/$6.png" 1024 + fi + declare -p -A cmd=([action]=add [identifier]="$ID_PREVIEW" + [x]="$2" [y]="$3" [width]="$4" [height]="$5" \ + [path]="/tmp$PWD/$6.png") \ + > "$FIFO_UEBERZUG" +} + +# clear preview image +function clear_preview() { + declare -p -A cmd=([action]=remove [identifier]="$ID_PREVIEW") \ + > "$FIFO_UEBERZUG" +} + +# Check all the dependencies that are needed to show all the file previews. +# The reason why we are sending a notification incase a dependency does not +# exist is because that is the easiest way to get the user's attention. +dependencies=(ffmpeg ffmpegthumbnailer fontpreview pdftoppm epub-thumbnailer) +for dependency in "${dependencies[@]}"; do + type -p "$dependency" &>/dev/null || { + notify-send "vifm" "Could not find '${dependency}', is it installed?" + exit 1 + } +done + + +# Make sure ueberzug's fifo exists +if [ -e "$FIFO_UEBERZUG" ]; then + # Make a temp dir for rendering if not exists + [ ! -d "/tmp${PWD}/" ] && mkdir -p "/tmp${PWD}/" + case "$1" in + draw) draw "$@" ;; + font) font_preview "$@" ;; + pdf) pdf_preview "$@" ;; + video) video_preview "$@" ;; + clear) clear_preview ;; + audio) audio_preview "$@" ;; + epub) epub_preview "$@" ;; + esac +fi diff --git a/.config/vifm/vifm-help.txt b/.config/vifm/vifm-help.txt @@ -0,0 +1,6103 @@ +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. + + <path> Starts Vifm in the specified path. + + <path> <path> + Starts Vifm in the specified paths. + + Specifying two directories triggers split view even when vifm was in + single-view mode on finishing previous session. To suppress this be- + haviour :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 <path> + 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 <path>|- + Sets output file to write selection into on exit instead of + opening files. "-" means standard output. Use empty value to + disable it. + + --choose-dir <path>|- + Sets output file to write last visited directory into on exit. + "-" means standard output. Use empty value to disable it. + + --delimiter <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 <command> + 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. + + --logging[=<startup log path>] + Log some operational details $VIFM/log. If the optional startup + log path is specified and permissions allow to open it for writ- + ing, then logging of early initialization (before value of $VIFM + is determined) is put there. + + --server-list + List available server names and exit. + + --server-name <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 <command> or +<com- + mand> 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 <command> or +<command> + Run command-line mode <command> 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. + +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 launches a file, + otherwise move right one file. + + 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. + + 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. + + Ctrl-Y scroll pane one line up. + +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. + + + [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. + + Note: vifm uses extended regular expressions for / and ?. + + + [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\/?$/ + + Note: vifm uses extended regular expressions. + + 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. + +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]!<selector> + 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, <tab> and <c-i> switch active + pane just like <space> does, otherwise it goes forward through + directory history of current view. Nonexistent directories are + automatically skipped. + + Ctrl-G create a window showing detailed information about the current + file. + + Shift-Tab + enters 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). + + gr only for MS-Windows + same as l key, but tries to run program with administrative + privileges. + + av go to visual mode into selection amending state preserving cur- + rent selection. + + gv go to visual mode restoring last selection. + + [reg]gs + when no register is specified, restore last t selection (similar + to what gv does for visual mode selection). If register is + present, then all files listed in that register and which are + visible in current view are selected. + + gu<selector> + 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<selector> + 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. + + cW change WORD is used to change only name of file (without exten- + sion). + + cl change link target. + + 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}). + + [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<selector>, 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 + entry of the other pane equal to the current one. The semantics + is as follows: + - nothing 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 session (does nothing right after startup or :restart com- + mand). 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. + + [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. + +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 to 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 + statusbar 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. + +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. + + [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'/'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. + +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<Enter> + + 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; + + - :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]! + :autocmd + :cabbrev + :cmap + :cnoreabbrev + :cnoremap + :command + :dmap + :dnoremap + :filetype + :fileviewer + :filextype + :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 stdout like "ls" create an error message showing + partial output 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. + + :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. + + :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. + + :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. + + :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. + + :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] + create a menu window to alter a files properties. + + :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. + + :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. + + :com[mand] beginning + display user defined commands that start with the beginning. + + :com[mand] name action + set a new user command. + Trying to use a reserved command name will result in an error + message. + Use :com[mand]! to overwrite a previously set command. + Unlike vim user commands do not have to start with a capital + letter. User commands are run in a shell by default. To run a + command in the background you must set it as a background com- + mand with & at the end of the commands action (:com rm rm %f &). + Command name cannot contain numbers or special symbols (except + '?' and '!'). + + :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] cmd :commands + set kind of an alias for internal command (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]... + compare files in one or two views according the arguments. The + default is "bycontents listall ofboth grouppaths". See "Compare + views" section below for details. Tree structure is incompati- + ble with alternative representations, so values of 'lsview' and + 'millerview' options are ignored. + + :copen + + :cope[n] + opens menu with contents of the last displayed menu with naviga- + tion 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. + + :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. + + :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. + + :echo + + :ec[ho] [<expr>...] + evaluate each argument as an expression and output them sepa- + rated with a space. See help on :let command for a definition + of <expr>. + + :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] [<expr>...] + 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 <expr>. + + :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. + + :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. + See also "Automatic 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. See also "Automatic FUSE + mounts" section 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 presence of $DIS- + PLAY 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. + + 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-<something> + 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 + set style (cterm), foreground (ctermfg) or/and background + (ctermbg) 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) + - 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') + - TopLineSel - top line color of the current pane + - TopLine - top line color of the other 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 + - Selected - color of selected files + - Directory - color of directories + - Link - color of symbolic links in the views + - BrokenLink - color of broken symbolic links + - 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 + - User1..User9 - 9 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 + + Light versions of colors are regular colors with bold attribute set. + So order of arguments of :highlight command is important and it's bet- + ter 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 Dupli- + cated entries were altered by adding an underscore followed by numeri- + cal 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. + + Here is the hierarchy of highlight groups, which you need to know for + using transparency: + JobLine + SuggestBox + StatusLine + WildMenu + User1..User9 + Border + CmdLine + ErrorMsg + Win + OtherWin + AuxWin + File name specific highlights + Directory + Link + BrokenLink + Socket + Device + Fifo + Executable + Selected + CurrLine + OtherLine + TopLine + TopLineSel + TabLineSel (for pane tabs) + TabLine + TabLineSel + + "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] + creates a pop-up menu of directories visited. + + :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 renaming). + fi[lter] or = show filter history (see description of the "=" + normal mode command). + + :histnext + + :histnext + same as <c-i>. The main use case for this command is to work + around the common pain point of <tab> and <c-i> 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 <f1> :histnext<cr>` in vifm, add "t" flag to the + 'cpoptions', and thus have both <c-i> and <tab> working as ex- + pected. + + :histprev + + :histprev + same as <c-o>. + + :if + + :if {expr1} + starts 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 shows menu of current backgrounded processes. + + :let + + :let $ENV_VAR = <expr> + sets environment variable. Warning: setting environment vari- + able to an empty string on Windows removes it. + + :let $ENV_VAR .= <expr> + append value to environment variable. + + :let &[l:|g:]opt = <expr> + sets option value. + + :let &[l:|g:]opt .= <expr> + append value to string option. + + :let &[l:|g:]opt += <expr> + increasing option value, adding sub-values. + + :let &[l:|g:]opt -= <expr> + decreasing option value, removing sub-values. + + Where <expr> 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. + + :locate + repeats 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 + displays a menu with list of files in trash. Each element of + the list is original path of a deleted file, thus the list can + contain duplicates. + + :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. + + :marks list ... + display the contents of the marks that are mentioned in list. + + :media + + :media only for *nix + display media management menu. 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. + + :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 + <esc> or <c-c> 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. + + :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] [ &] + puts 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 changes and checking for active + backgrounded commands). + + :redraw + + :redr[aw] + redraw the screen immediately. + + :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 using vi to edit names. ! means go recursively + through directories. + + :[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 and vifmrc files and run startup commands passed in the + argument list, thus losing all unsaved changes (e.g. recent his- + tory or keys mapped in current session). + + While many things get reset, some basic UI state and current lo- + cations are preserved, including tabs. + + :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. + + :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. + + :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, when one can se- + lect primary sorting key. When 'viewcolumns' options is empty + and 'lsview' is off, changing primary sorting key will also af- + fect view look (in particular the second column of the view will + be changed). + + :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). + + :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. + + :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. + + :tree! toggle current view in and out of tree mode. + + :undolist + + :undol[ist] + display list of latest changes. Use "!" to see actual commands. + + :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. See also 'quickview' op- + tion. + + :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. + + :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 vifminfo file. + + :wq + + :wq[!] same as :quit, but ! only disables check of backgrounded com- + mands. :wqall + + :wqa[ll][!] + same as :qall, but ! only disables check of backgrounded com- + mands. + + :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. + + + :cmap :dmap :mmap :nmap :qmap + :vmap + + :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 + + :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 + + :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 + disallow mapping of rhs. + + :no[remap]! lhs rhs + map the key sequence lhs to rhs for command line mode, but dis- + allow mapping of rhs. + + :cnoremap :dnoremap :mnoremap :nnoremap :qnoremap + :vnoremap + + :cno[remap] lhs rhs + map the key sequence lhs to rhs for command line mode, but dis- + allow mapping of rhs. + + :dn[oremap] lhs rhs + map the key sequence lhs to rhs for dialog modes, but disallow + mapping of rhs. + + :mn[oremap] lhs rhs + map the key sequence lhs to rhs for menu mode, but disallow map- + ping of rhs. + + :nn[oremap] lhs rhs + map the key sequence lhs to rhs for normal mode, but disallow + mapping of rhs. + + :qn[oremap] lhs rhs + map the key sequence lhs to rhs for view mode, but disallow map- + ping of rhs. + + :vn[oremap] lhs rhs + map the key sequence lhs to rhs for visual mode, but disallow + mapping of 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. + + :cunmap :dunmap :munmap :nunmap :qunmap + :vunmap + + :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 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. + + %F %"F All of the selected files in the other directory list. + + %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 split window of active terminal multiplexer + (ignored if not running inside one). + + %n Forbid using of terminal multiplexer to run the command. + + %i Completely ignore command output. + + + %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. + + 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 %m, %M, %s, %S, %i, %u and %U macros 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<Enter> + will list the directory contents of the current directory. + + :lsl filename<Enter> + 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 statusbar. + + 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. + +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. [!]<comma-separated-mime-type-globs> + + 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: + <text/plain>{*.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: + <text/plain>{*.vifm},<application/pdf>{*.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 + + +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. + +: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. + + '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, <tab> (thus <c-i>) behave as <space> and + switches active pane, otherwise <tab> and <c-i> go forward in + the view history. It's possible to make both <tab> and <c-i> to + work as expected by setting up the terminal to emit a custom se- + quence when <c-i> 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 + 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 + + 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<tab>). + + '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 + + If value is omitted, its default value is used. Example: + + set fillchars=vborder:. + + '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/.local/share | $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 + Highlight all matches of search pattern. + + '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) + and characters after f and F commands. It doesn't affect file + filtering. + + '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: + Controls details of file operations. The following values are + available: + - 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 + 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 can take two values: dirs (only directo- + ries) or all. Both options don't include 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. + + '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. + + '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 + %S - number of displayed files + %= - separation point between left and right align items + %% - 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. + + Example: + + set rulerformat='%2l-%S%[ +%x%]' + + 'runexec' + type: boolean + default: false + Run executable file on Enter or l. + + '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). + + '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. + + '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 the search pattern contains + at least one upper case character. Only used when ignorecase + option is enabled. It doesn't affect file filtering. + + '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, e.g. 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 to use for + group sorting, double comma is literal comma. Each expression + should contain at least one group or its value will be consid- + ered to be always empty. Only first match of each regular ex- + pression is considered. Groups are considered from right to + first similar to 'sort', first group divides list of files into + sub-groups, each of which is sorted by the second group and so + on. + + Example: + set sortgroups=-(done|todo).* + this would put files with "-done" in their names above all files + with "-todo". + + '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: + + - %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) %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 at current partition + + - %z - short tips/tricks/hints that chosen randomly after one + minute period + + - %{<expr>} - evaluate arbitrary vifm expression '<expr>', e.g. + '&sort' + + - %* - resets or applies one of User1..User9 highlight groups; + reset happens when width field is 0 or not specified, one of + groups gets picked when width field is in the range from 1 to + 9 + + - 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 + between each other. When several instances of vifm have this + option set to identical value, they automatically synchronize + contents 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. + + '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. + + '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,$VIFM/Trash,%r/.vifm-Trash" + or if $VIFM/Trash doesn't exist + "%r/.vifm-Trash-%u,$XDG_DATA_HOME/vifm/Trash,%r/.vifm-Trash" + on Windows: + "%r/.vifm-Trash,$XDG_DATA_HOME/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 ~/.vifm/Trash on failure. + + Will attempt to create the directory if it does not exist. See + "Trash directory" section below. + + 'tuioptions' 'to' + type: charset + default: "ps" + 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 "..."). + + '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 + 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 (requires dhistory) + chistory - command line history + 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 session is empty + registers - registers content + 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 <c-w> <a-b><a-d> + + 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 + Map arguments + + LHS of mappings can be preceded by arguments which take the form of + special sequences: + + <silent> + Postpone UI updates until RHS is completely processed. + + <wait> 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 <wait> tw :set wrap!<cr> + nnoremap <wait> tn :set number!<cr> + nnoremap <wait> tr :set relativenumber!<cr> + + Special sequences + + Since it's not easy to enter special characters there are several spe- + cial sequences that can be used in place of them. They are: + + <cr> Enter key. + + <esc> Escape key. + + <space> + Space key. + + <lt> Less-than character (<). + + <nop> provides a way to disable a mapping (by mapping it to <nop>). + + <bs> Backspace key (see key conflict description below). + + <tab> <s-tab> + Tabulation and Shift+Tabulation keys. + + <home> <end> + Home/End. + + <left> <right> <up> <down> + Arrow keys. + + <pageup> <pagedown> + PageUp/PageDown. + + <del> <delete> + Delete key. <del> and <delete> mean different codes, but + <delete> is more common. + + <insert> + Insert key. + + <c-a>,<c-b>,...,<c-z>,<c-[>,<c->,<c-]>,<c-^>,<c-_> + Control + some key (see key conflict description below). + + <c-@> only for *nix + Control + Space. + + <a-a>,<a-b>,...,<a-z> + <m-a>,<m-b>,...,<m-z> Alt + some key. + + <a-c-a>,<a-c-b>,...,<a-c-z> + <m-c-a>,<m-c-b>,...,<m-c-z> only for *nix + Alt + Ctrl + some key. + + <f0> - <f63> + Functional keys. + + <c-f1> - <c-f12> + only for MS-Windows + functional keys with Control key pressed. + + <a-f1> - <a-f12> + only for MS-Windows + functional keys with Alt key pressed. + + <s-f1> - <s-f12> + only for MS-Windows + functional keys with Shift key pressed. + + Note that due to the way terminals process their input, several key- + board keys might be mapped to single key code, for example: + + - <cr> and <c-m>; + + - <tab> and <c-i>; + + - <c-h> and <bs>; + + - etc. + + Most of the time they are defined consistently and don't cause sur- + prises, but <c-h> and <bs> are treated differently in different envi- + ronments (although they match each other all the time), that's why they + correspond to different keys in vifm. As a consequence, if you map <c- + h> or <bs> be sure to repeat the mapping with the other one so that it + works in all environments. Alternatively, provide your mapping in one + form and add one of the following: + + " if mappings with <c-h> in the LHS work + map <c-h> <bs> + " if mappings with <bs> in the LHS work + map <bs> <c-h> + + Whitespace + + vifm removes whitespace characters at the beginning and end of com- + mands. That's why you may want to use <space> at the end of rhs in + mappings. For example: + + cmap <f1> man<space> + + will put "man " in line when you hit the <f1> key in the command line + mode. + +Expression syntax + Supported expressions is a subset of what VimL provides. + + Expression syntax summary, from least to most significant: + + expr1 expr2 + expr2 || expr2 .. logical OR + + expr2 expr3 + expr3 && expr3 .. logical AND + + expr3 expr4 + expr4 == expr4 equal + expr4 != expr4 not equal + expr4 > expr4 greater than + expr4 >= expr4 greater than or equal + expr4 < expr4 smaller than + expr4 <= expr4 smaller than or equal + + expr4 expr5 + expr5 + expr5 .. number addition + expr5 - expr5 .. number subtraction + + expr5 expr6 + expr6 . expr6 .. string concatenation + + expr6 expr7 + - expr6 unary minus + + expr6 unary plus + ! expr6 logical NOT + + expr7 number number constant + "string" string constant, \ is special + 'string' string constant, ' is doubled + &option option value + $VAR environment variable + v:var builtin variable + function(expr1, ...) function call + (expr1) nested expression + + ".." indicates that the operations in this level can be concatenated. + + expr1 + ----- + expr2 || expr2 + + Arguments are converted to numbers before evaluation. + + Result is non-zero if at least one of arguments is non-zero. + + It's right associative and with short-circuiting, so sub-expressions + are evaluated from left to right until result of whole expression is + determined (i.e., until first non-zero) or end of the expression. + + expr2 + ----- + expr3 && expr3 + + Arguments are converted to numbers before evaluation. + + Result is non-zero only if both arguments are non-zero. + + It's right associative and with short-circuiting, so sub-expressions + are evaluated from left to right until result of whole expression is + determined (i.e., until first zero) or end of the expression. + + expr3 + ----- + expr4 {cmp} expr4 + + Compare two expr4 expressions, resulting in a 0 if it evaluates to + false or 1 if it evaluates to true. + + equal == + not equal != + greater than > + greater than or equal >= + smaller than < + smaller than or equal <= + + Examples: + + 'a' == 'a' == 1 + 'a' > 'b' == 1 + 'a' == 'b' == 0 + '2' > 'b' == 0 + 2 > 'b' == 1 + 2 > '1b' == 1 + 2 > '9b' == 0 + -1 == -'1' == 1 + 0 == '--1' == 1 + + expr4 + ----- + expr5 + expr5 .. number addition expr5 - expr5 .. number sub- + traction + + Examples: + + 1 + 3 - 3 == 1 + 1 + '2' == 3 + + expr5 + ----- + expr6 . expr6 .. string concatenation + + Examples: + + 'a' . 'b' == 'ab' + 'aaa' . '' . 'c' == 'aaac' + + expr6 + ----- + + - expr6 unary minus + + expr6 unary plus + ! expr6 logical NOT + + For '-' the sign of the number is changed. + For '+' the number is unchanged. + For '!' non-zero becomes zero, zero becomes one. + + A String will be converted to a Number first. + + These operations can be repeated and mixed. Examples: + + --9 == 9 + ---9 == -9 + -+9 == 9 + !-9 == 0 + !'' == 1 + !'x' == 0 + !!9 == 1 + + expr7 + ----- + + number number constant + ----- + + Decimal number. Examples: + + 0 == 0 + 0000 == 0 + 01 == 1 + 123 == 123 + 10000 == 10000 + + string + ------ + "string" string constant + + Note that double quotes are used. + + A string constant accepts these special characters: + \b backspace <bs> + \e escape <esc> + \n newline + \r return <cr> + \t tab <tab> + \\ backslash + \" double quote + + Examples: + + "\"Hello,\tWorld!\"" + "Hi,\nthere!" + + literal-string + -------------- + 'string' string constant + + Note that single quotes are used. + + This string is taken as it is. No backslashes are removed or have a + special meaning. The only exception is that two quotes stand for one + quote. + + Examples: + + 'All\slashes\are\saved.' + 'This string contains doubled single quotes ''here''' + + option + ------ + &option option value (local one is preferred, if exists) + &g:option global option value &l:option local + option value + + Examples: + + echo 'Terminal size: '.&columns.'x'.&lines + if &columns > 100 + + Any valid option name can be used here (note that "all" in ":set all" + is a pseudo option). See ":set options" section above. + + environment variable + -------------------- + $VAR environment variable + + The String value of any environment variable. When it is not defined, + the result is an empty string. + + Examples: + + 'This is my $PATH env: ' . $PATH + 'vifmrc at ' . $MYVIFMRC . ' is used.' + + builtin variable + -------------------- + v:var builtin variable + + Information exposed by vifm for use in scripting. + + v:count + count passed to : command, 0 by default. Can be used in mappings to + pass + count to a different command. + v:count1 + same as v:count, but 1 by default. + v:servername + See below. + + function call + ------------- + function(expr1, ...) function call + + See "Functions" section below. + + Examples: + + "'" . filetype('.') . "'" + filetype('.') == 'reg' + + expression nesting + ------------------ + (expr1) nested expression + + Groups any other expression of arbitrary complexity enforcing order in + which operators are applied. + + +Functions + USAGE RESULT DESCRIPTION + + chooseopt({opt}) String Queries choose parameters passed on + startup. + executable({expr}) Integer Checks whether {expr} command avail- + able. + expand({expr}) String Expands special keywords in {expr}. + extcached({cache}, {path}, {extcmd}) + String Caches output of {extcmd} per {cache} + and + {path} combination. + filetype({fnum} [, {resolve}]) + String Returns file type from position. + fnameescape({expr}) String Escapes {expr} for use in a :command. + getpanetype() String Returns type of current pane. + has({property}) Integer Checks whether instance has {prop- + erty}. + layoutis({type}) Integer Checks whether layout is of type + {type}. + paneisat({loc}) Integer Checks whether current pane is at + {loc}. + system({command}) String Executes shell command and returns + its output. + tabpagenr([{arg}]) Integer Returns number of current or last + tab. + term({command}) String Like system(), but for interactive + commands. + + chooseopt({opt}) + + Retrieves values of options related to file choosing. {opt} can be one + of: + files returns argument of --choose-files or empty string + dir returns argument of --choose-dir or empty string + cmd returns argument of --on-choose or empty string + delimiter returns argument of --delimiter or the default one (\n) + + executable({expr}) + + If {expr} is absolute or relative path, checks whether path destination + exists and refers to an executable, otherwise checks whether command + named {expr} is present in directories listed in $PATH. Checks for + various executable extensions on Windows. Returns boolean value de- + scribing result of the check. + + Example: + + " use custom default viewer script if it's available and installed + " in predefined system directory, otherwise try to find it elsewhere + if executable('/usr/local/bin/defviewer') + fileview * /usr/local/bin/defviewer %c + else + if executable('defviewer') + fileview * defviewer %c + endif + endif + + expand({expr}) + + Expands environment variables and macros in {expr} just like it's done + for command-line commands. Returns a string. See "Command macros" + section above. + + Examples: + + " percent sign + :echo expand('%%') + " the last part of directory name of the other pane + :echo expand('%D:t') + " $PATH environment variable (same as `:echo $PATH`) + :echo expand('$PATH') + + extcached({cache}, {path}, {extcmd}) + + Caches value of {extcmd} external command automatically updating it as + necessary based on monitoring change date of a {path}. The cache is + invalidated when file or its meta-data is updated. A single path can + have multiple caches associated with it. + + {path} value is normalized, but symbolic links in it aren't resolved. + + Example: + + " display number and size of blocks actually used by a file or directory + set statusline+=" Uses: %{ extcached('uses', + expand('%c'), + expand('stat --format=%%bx%%B %c')) }" + + filetype({fnum} [, {resolve}]) + + The result is a string, which represents file type and is one of the + list: + exe executables + reg regular files + link symbolic links + broken broken symbolic links (appears only when resolving) + dir directories + char character devices + block block devices + fifo pipes + sock *nix domain sockets + ? unknown file type (should not normally appear) + + The result can also be an empty string in case of invalid argument. + + Parameter {fnum} can have following values: + - '.' to get type of file under the cursor in the active pane + - numerical value base 1 to get type of file on specified line num- + ber + + Optional parameter {resolve} is treated as a boolean and specifies + whether symbolic links should be resolved. + + fnameescape({expr}) + + Escapes parameter to make it suitable for use as an argument of a :com- + mand. List of escaped characters includes %, which is doubled. + + Usage example: + + " navigate to most recently modified file in current directory + execute 'goto' fnameescape(system('ls -t | head -1')) + + getpanetype() + + Retrieves string describing type of current pane. Possible return val- + ues: + regular regular file listing of some directory + custom custom file list (%u) + very-custom very custom file list (%U) + tree tree view + + has({property}) + + Allows examining internal parameters from scripts to e.g. figure out + environment in which application is running. Returns 1 if property is + true/present, otherwise 0 is returned. Currently the following proper- + ties are supported (anything else will yield 0): + unix runs in *nix-like environment (including Cygwin) + win runs on Windows + + Usage example: + + " skip user/group on Windows + if !has('win') + let $RIGHTS = '%10u:%-7g ' + endif + + execute 'set' 'statusline=" %t%= %A '.$RIGHTS.'%15E %20d "' + + layoutis({type}) + + Checks whether current interface layout is {type} or not, where {type} + can be: + only single-pane mode + split double-pane mode (either vertical or horizon split) + vsplit vertical split (left and right panes) + hsplit horizontal split (top and bottom panes) + + Usage example: + + " automatically split vertically before enabling preview + :nnoremap w :if layoutis('only') | vsplit | endif | view!<cr> + + paneisat({loc}) + + Checks whether position of active pane in current layout matches one of + the following locations: + top pane reaches top border + bottom pane reaches bottom border + left pane reaches left border + right pane reaches right border + + system({command}) + + Runs the command in shell and returns its output (joined standard out- + put and standard error streams). All trailing newline characters are + stripped to allow easy appending to command output. Ctrl-C should in- + terrupt the command. + + Use this function to consume output of external commands that don't re- + quire user interaction and term() for interactive commands that make + use of terminal and are capable of handling stream redirection. + + Usage example: + + " command to enter .git/ directory of git-repository (when ran inside one) + command! cdgit :execute 'cd' system('git rev-parse --git-dir') + + tabpagenr([{arg}]) + + When called without arguments returns number of current tab page base + one. + + When called with "$" as an argument returns number of the last tab page + base one, which is the same as number of tabs. + + term({command}) + + Same as system() function, but user interface is shutdown during the + execution of the command, which makes sure that external interactive + applications won't affect the way terminal is used by vifm. + + Usage example: + + " command to change directory by picking it via fzf + command! fzfcd :execute 'cd' "'".term('find -type d | fzf 2> /dev/tty')."'" + +Menus and dialogs + When navigating to some path from a menu there is a difference in end + location depending on whether path has trailing slash or not. Files + normally don't have trailing slashes so "file/" won't work and one can + only navigate to a file anyway. On the other hand with directories + there are two options: navigate to a directory or inside of it. To al- + low both use cases, the first one is used on paths like "dir" and the + second one for "dir/". + + Commands + + :range navigate to a menu line. + + :exi[t][!] :q[uit][!] :x[it][!] + leave menu mode. + + :noh[lsearch] + reset search match highlighting. + + :w[rite] {dest} + write all menu lines into file specified by {dest}. + + General + + j, Ctrl-N - move down. + k, Ctrl-P - move up. + Enter, l - select and exit the menu. + Ctrl-L - redraw the menu. + + Escape, Ctrl-C, ZZ, ZQ, q - quit. + + In all menus + + The following set of keys has the same meaning as in normal mode. + + Ctrl-B, Ctrl-F + Ctrl-D, Ctrl-U + Ctrl-E, Ctrl-Y + /, ? + n, N + [count]G, [count]gg + H, M, L + zb, zt, zz + + zh - scroll menu items [count] characters to the right. + zl - scroll menu items [count] characters to the left. + zH - scroll menu items half of screen width characters to the right. + zL - scroll menu items half of screen width characters to the left. + + : - enter command line mode for menus (currently only :exi[t], :q[uit], + :x[it] and :{range} are supported). + + b - interpret content of the menu as list of paths and use it to create + custom view in place of previously active pane. See "Custom views" + section below. + B - same as above, but creates unsorted view. + + v - load menu content into quickfix list of the editor (Vim compatible + by assumption) or if list doesn't have separators after file names + (colons) open each line as a file name. + + + Below is description of additional commands and reaction on selection + in some menus and dialogs. + + Apropos menu + + Selecting menu item runs man on a given topic. Menu won't be closed + automatically to allow view several pages one by one. + + Command-line mode abbreviations menu + + Type dd on an abbreviation to remove it. + + c leaves menu preserving file selection and inserts right-hand side of + selected command into command-line. + + Color scheme menu + + Selecting name of a color scheme applies it the same way as if ":col- + orscheme <name>" was executed on the command-line. + + Commands menu + + Selecting command executes it with empty arguments (%a). + + dd on a command to remove. + + Marks menu + + Selecting mark navigates to it. + + dd on a mark to remove it. + + Bookmarks menu + + Selecting a bookmark navigates to it. + + Type dd on a bookmark to remove it. + + gf and e also work to make it more convenient to bookmark files. + + Trash (:lstrash) menu + + r on a file name to restore it from trash. + + dd deletes file under the cursor. + + Trashes menu + + dd empties selected trash in background. + + Directory history and Trashes menus + + Selecting directory name will change directory of the current view as + if :cd command was used. + + Directory stack menu + + Selecting directory name will rotate stack to put selected directory + pair at the top of the stack. + + Filetype menu + + Commands from vifmrc or typed in command-line are displayed above empty + line. All commands below empty line are from .desktop files. + + c leaves menu preserving file selection and inserts command after :! in + command-line mode. + + Grep, find, locate, bookmarks and user menu with navigation (%M macro) + + gf - navigate previously active view to currently selected item. + Leaves menu mode except for grep menu. Pressing Enter key has the same + effect. + + e - open selected path in the editor, stays in menu mode. + + c - leave menu preserving file selection and insert file name after :! + in command-line mode. + + User menu without navigation (%m macro) + + c leaves menu preserving file selection and inserts whole line after :! + in command-line mode. + + Grep menu + + Selecting file (via Enter or l key) opens it in editor set by 'vicmd' + at given line number. Menu won't be closed automatically to allow + viewing more than one result. + + See above for "gf" and "e" keys description. + + Command-line history menu + + Selecting an item executes it as command-line command, search query or + local filter. + + c leaves menu preserving file selection and inserts line into command- + line of appropriate kind. + + Volumes menu + + Selecting a drive navigates previously active pane to the root of that + drive. + + Fileinfo dialog + + Enter, q - close dialog + + Sort dialog + + h, Space - switch ascending/descending. + q - close dialog + + One shortcut per sorting key (see the dialog). + + Attributes (permissions or properties) dialog + + h, Space - check/uncheck. + q - close dialog + + Item states: + + - * - checked flag. + + - X - means that it has different value for files in selection. + + - d (*nix only) - (only for execute flags) means u-x+X, g-x+X or o-x+X + argument for the chmod program. If you're not on OS X and want to + remove execute permission bit from all files, but preserve it for di- + rectories, set all execute flags to 'd' and check 'Set Recursively' + flag. + + Jobs menu + + dd requests cancellation of job under cursor. The job won't be removed + from the list, but marked as being cancelled (if cancellation was suc- + cessfully requested). A message will pop up if the job has already + stopped. Note that on Windows cancelling external programs like this + might not work, because their parent shell doesn't have any windows. + + e key displays errors of selected job if any were collected. They are + displayed in a new menu, but you can get back to jobs menu by pressing + h. + + + Undolist menu + + r - reset undo position to group under the cursor. + + + Media menu + + Selecting a device either mounts (if it wasn't mounted yet) or navi- + gates to its first mount point. + + Selecting a mount point navigates to it. + + Selecting "not mounted" line causes mounting. + + Selecting any other line does nothing. + + r - reload the list. + + m - mount/unmount device (cursor should be positioned on lines under + device information). + + [ - put cursor on the previous device. + + ] - put cursor on the next device. + + +Custom views + Definition + + Normally file views contain list of files from a single directory, but + sometimes it's useful to populate them with list of files that do not + belong to the same directory, which is what custom views are for. + + Presentation + + Custom views are still related to directory they were in before custom + list was loaded. Path to that directory (original directory) can be + seen in the title of a custom view. + + Files in same directory have to be named differently, this doesn't hold + for custom views thus seeing just file names might be rather confusing. + In order to give an idea where files come from and when possible, rela- + tive paths to original directory of the view is displayed, otherwise + full path is used instead. + + Custom views normally don't contain any inexistent files. + + Navigation + + Custom views have some differences related to navigation in regular + views. + + gf - acts similar to gf on symbolic links and navigates to the file at + its real + location. + + h - go to closes parent node in tree view, otherwise return to the + original directory. + + gh - return to the original directory. + + Opening ".." entry also causes return to the original directory. + + History + + Custom list exists only while it's visible, once left one can't return + to it, so there is no appearances of it in any history. + + Filters + + Only local filter affects content of the view. This is intentional, + presumably if one loads list, precisely that list should be displayed + (except for inexistent paths, which are ignored). + + Search + + Although directory names are visible in listing, they are not search- + able. Only file names are taken into account (might be changed in fu- + ture, searching whole lines seems quite reasonable). + + Sorting + + Contrary to search sorting by name works on whole visible part of file + path. + + Highlight + + Whole file name is highlighted as one entity, even if there are direc- + tory elements. + + Updates + + Reloads can occur, though they are not automatic due to files being + scattered among different places. On a reload, inexistent files are + removed and meta-data of all other files is updated. + + Once custom view forgets about the file, it won't add it back even if + it's created again. So not seeing file previously affected by an oper- + ation, which was undone is normal. + + Operations + + All operations that add files are forbidden for custom views. For ex- + ample, moving/copying/putting files into a custom view doesn't work, + because it doesn't make much sense. + + On the other hand, operations that use files of a custom view as a + source (e.g. yanking, copying, moving file from custom view, deletion) + and operations that modify names are all allowed. + +Compare views + Kinds + + :compare can produce four different results depending on arguments: + - single compare view (ofone and either listall or listdups); + - single custom view (ofone and listunique); + - two compare views (ofboth and either listall or listdups); + - two custom views (ofboth and listunique). + + The first two display files of one file system tree. Here duplicates + are files that have at least one copy in the same tree. The other two + kinds of operation compare two trees, in which duplicates are files + that are found in both trees. + + Lists of unique files are presented in custom views because there is no + file grouping to preserve as all file ids are guaranteed to be dis- + tinct. + + Creation + + Arguments passed to :compare form four categories each with its own + prefix and is responsible for particular property of operation. + + Which files to compare: + - ofboth - compares files of two panes against each other; + - ofone - compares files of the same directory. + + How files are compared: + - byname - by their name only; + - bysize - only by their size; + - bycontents - by combination of size and hash of file contents. + + Which files to display: + - listall - all files; + - listunique - unique files only; + - listdups - only duplicated files. + + How results are grouped (has no effect if "ofone" specified): + - groupids - files considered identical are always adjacent in out- + put; + - grouppaths - file system ordering is preferred (this also enables + displaying identically named files as mismatches). + + Which files to omit: + - skipempty - ignore empty files. + + Each argument can appear multiple times, the rightmost one of the group + is considered. Arguments alter default behaviour instead of substitut- + ing it. + + Examples + + The defaults corresponds to probably the most common use case of com- + paring files in two trees with grouping by paths, so the following are + equivalent: + + :compare + :compare bycontents grouppaths + :compare bycontents listall ofboth grouppaths + + Another use case is to find duplicates in the current sub-tree: + + :compare listdups ofone + + The following command lists files that are unique to each pane: + + :compare listunique + + Look + + The view can't switch to ls-like view as it's unable to display diff- + like data. + + Comparison views have second column displaying id of the file, files + with same id are considered to be equal. The view columns configura- + tion is predefined. + + Behaviour + + When two views are being compared against each other the following + changes to the regular behaviour apply: + - views are scrolled synchronously (as if 'scrollbind' was set); + - views' cursors are synchronized; + - local filtering is disabled (its results wouldn't be meaningful); + - zd excludes groups of adjacent identical files, 1zd gives usual be- + haviour; + - sorting is permanently disabled (ordering is fixed); + - removed files hide their counter pairs; + - exiting one of the views terminates the other immediately; + - renaming files isn't blocked, but isn't taken into account and might + require regeneration of comparison; + - entries which indicate absence of equivalent file have empty names + and can be matched as such; + - when unique files of both views are listed custom views can be + empty, this absence of unique files is stated clearly. + + One compare view has similar properties (those that are applicable for + single pane). + + Files are gathered in this way: + - recursively starting at current location of the view; + - dot files are excluded if view hides them at the moment of compari- + son; + - directories are not taken into account; + - symbolic links to directories are ignored. + +Startup + On startup vifm determines several variables that are used during the + session. They are determined in the order they appear below. + + On *nix systems $HOME is normally present and used as is. On Windows + systems vifm tries to find correct home directory in the following or- + der: + - $HOME variable; + - $USERPROFILE variable (on Windows only); + - a combination of $HOMEDRIVE and $HOMEPATH variables (on Windows + only). + + vifm tries to find correct configuration directory by checking the fol- + lowing places: + - $VIFM variable; + - parent directory of the executable file (on Windows only); + - $HOME/.vifm directory; + - $APPDATA/Vifm directory (on Windows only); + - $XDG_CONFIG_HOME/vifm directory; + - $HOME/.config/vifm directory. + + vifm tries to find correct configuration file by checking the following + places: + - $MYVIFMRC variable; + - vifmrc in parent directory of the executable file (on Windows only); + - $VIFM/vifmrc file. + +Configure + See "Startup" section above for the explanations on $VIFM and $MYV- + IFMRC. + + The vifmrc file contains commands that will be executed on vifm + startup. There are two such files: global and local. Global one is at + {prefix}/etc/vifm/vifmrc, see $MYVIFMRC variable description for the + search algorithm used to find local vifmrc. Global vifmrc is loaded + before the local one, so that the later one can redefine anything con- + figured globally. + + Use vifmrc to set settings, mappings, filetypes etc. To use multi line + commands precede each next line with a slash (whitespace before slash + is ignored, but all spaces at the end of the lines are saved). For ex- + ample: + + set + \smartcase + + equals "setsmartcase". When + + set<space here> + \ smartcase + + equals "set smartcase". + + The $VIFM/vifminfo file contains session settings. You may edit it by + hand to change the settings, but it's not recommended to do that, edit + vifmrc instead. You can control what settings will be saved in + vifminfo by setting 'vifminfo' option. Vifm always writes this file on + exit unless 'vifminfo' option is empty. Marks, bookmarks, commands, + histories, filetypes, fileviewers and registers in the file are merged + with vifm configuration (which has bigger priority). + + Generally, runtime configuration has bigger priority during merging, + but there are some exceptions: + + - directory stack stored in the file is not overwritten unless some- + thing is changed in vifm session that performs merge; + + - each mark or bookmark is marked with a timestamp, so that newer + value is not overwritten by older one, thus no matter from where it + comes, the newer one wins. + + The $VIFM/scripts directory can contain shell scripts. vifm modifies + its PATH environment variable to let user run those scripts without + specifying full path. All subdirectories of the $VIFM/scripts will be + added to PATH too. Script in a subdirectory overlaps script with the + same name in all its parent directories. + + The $VIFM/colors/ and {prefix}/etc/vifm/colors/ directories contain + color schemes. Available color schemes are searched in that order, so + on name conflict the one in $VIFM/colors/ wins. + + Each color scheme should have ".vifm" extension. This wasn't the case + before and for this reason the following rules apply during lookup: + + - if there is no file with .vifm extension, all regular files are + listed; + + - otherwise only files with .vifm extension are listed (with the ex- + tension being truncated). + +Automatic FUSE mounts + vifm has a builtin support of automated FUSE file system mounts. It is + implemented using file associations mechanism. To enable automated + mounts, one needs to use a specially formatted program line in filetype + or filextype commands. These use special macros, which differ from + macros in commands unrelated to FUSE. Currently three formats are sup- + ported: + + 1) FUSE_MOUNT This format should be used in case when all information + needed for mounting all files of a particular type is the same. E.g. + mounting of tar files don't require any file specific options. + + Format line: + FUSE_MOUNT|mounter %SOURCE_FILE %DESTINATION_DIR [%FOREGROUND] + + Example filetype command: + + :filetype FUSE_MOUNT|fuse-zip %SOURCE_FILE %DESTINATION_DIR + + 2) FUSE_MOUNT2 This format allows one to use specially formatted files + to perform mounting and is useful for mounting remotes, for example re- + mote file systems over ftp or ssh. + + Format line: + FUSE_MOUNT2|mounter %PARAM %DESTINATION_DIR [%FOREGROUND] + + Example filetype command: + + :filetype *.ssh FUSE_MOUNT2|sshfs %PARAM %DESTINATION_DIR + + Example file content: + + root@127.0.0.1:/ + + 3) FUSE_MOUNT3 + + This format is equivalent to FUSE_MOUNT, but omits unmounting. It is + useful for cases, when unmounting isn't needed, like when using AVFS. + + Example :filetype command: + + :filetype *.tar,*.tar.bz2,*.tbz2,*.tgz,*.tar.gz,*.tar.xz,*.txz,*.deb + \ {Mount with avfs} + \ FUSE_MOUNT3|mount-avfs %DESTINATION_DIR %SOURCE_FILE + + Example `mount-avfs` helper script: + + #!/bin/sh + + dest=$1 + file=$2 + + rmdir "$dest" + ln -s "$HOME/.avfs$file#/" "$dest" + + All % macros are expanded by vifm at runtime and have the following + meaning: + - %SOURCE_FILE is replaced by full path to selected file; + - %DESTINATION_DIR is replaced by full path to mount directory, which + is created by vifm basing on the value of 'fusehome' option; + - %PARAM value is filled from the first line of file (whole line), + though in the future it can be changed to whole file content; + - %FOREGROUND means that you want to run mount command as a regular + command (required to be able to provide input for communication with + mounter in interactive way). + + %FOREGROUND is an optional macro. Other macros are not mandatory, but + mount commands likely won't work without them. + + %CLEAR is obsolete name of %FOREGROUND, which is still supported, but + might be removed in future. Its use is discouraged. + + Unlike macros elsewhere, these are recognized only if they appear at + the end of a command or are followed by a space. There is no way to + escape % either. These are historical limitations, which might be ad- + dressed in the future. + + The mounted FUSE file systems will be automatically unmounted in two + cases: + + - when vifm quits (with ZZ, :q, etc. or when killed by signal); + + - when you explicitly leave mount point going up to its parent direc- + tory (with h, Enter on "../" or ":cd ..") and other pane is not in + the same directory or its child directories. + +View look + vifm supports displaying of file list view in two different ways: + + - in a table mode, when multiple columns can be set using 'view- + columns' option (see "Column view" section below for details); + + - in a multicolumn list manner which looks almost like `ls -x` com- + mand output (see "ls-like view" section below for details). + + The look is local for each view and can be chosen by changing value of + the 'lsview' boolean option. + + Depending on view look some of keys change their meaning to allow more + natural cursor moving. This concerns mainly h, j, k, l and other simi- + lar navigation keys. + + Also some of options can be ignored if they don't affect view display- + ing in selected look. For example value of 'viewcolumns' when 'lsview' + is set. + +ls-like view + When this view look is enabled by setting 'lsview' option on, vifm will + display files in multiple columns. Number of columns depends on the + length of the longest file name present in current directory of the + view. Whole file list is automatically reflowed on directory change, + terminal or view resize. + + View looks close to output of `ls -x` command, so files are listed left + to right in rows. + + In this mode file manipulation commands (e.g. d) don't work line-wise + like they do in Vim, since such operations would be uncommon for file + manipulation tasks. Thus, for example, dd will remove only current + file. + + By default the view is filled by lines, 'lsoptions' can be used to get + filling by columns. + + Note that tree-view and compare view inhibit ls-like view. + +Column view + View columns are described by a comma-separated list of column descrip- + tions, each of which has the following format + [ '-' ] [ fw ( [ '.' tw ] | '%' ) ] '{' type '}' '.'{0,3} + where fw stands for full width and tw stands for text width. + + So it basically consists of four parts: + 1. Optional alignment specifier + 2. Optional width specifier + 3. Mandatory column name + 4. Optional cropping specifier + + Alignment specifier + + It's an optional minus or asterisk sign as the first symbol of the + string. + + Specifies type of text alignment within a column. Three types are sup- + ported: + + - left align + + set viewcolumns=-{name} + + - right align (default) + + set viewcolumns={name} + + - dynamic align + + It's like left alignment, but when the text is bigger than the col- + umn, the alignment is made at the right (so the part of the field is + always visible). + + set viewcolumns=*{name} + + Width specifier + + It's a number followed by a percent sign, two numbers (second one + should be less than or equal to the first one) separated with a dot or + a single number. + + Specifies column width and its units. There are three size types: + + - absolute size - column width is specified in characters + + set viewcolumns=-100{name},20.15{ext} + + results in two columns with lengths of 100 and 20 and a reserved + space of five characters on the left of second column. + + - relative (percent) size - column width is specified in percents of + view width + + set viewcolumns=-80%{name},15%{ext},5%{mtime} + + results in three columns with lengths of 80/100, 15/100 and 5/100 of + view width. + + - auto size (default) - column width is automatically determined + + set viewcolumns=-{name},{ext},{mtime} + + results in three columns with length of one third of view width. + There is no size adjustment to content, since it will slow down ren- + dering. + + Columns of different sizing types can be freely mixed in one view. + Though sometimes some of columns can be seen partly or be completely + invisible if there is not enough space to display them. + + Column name + + This is just a sort key surrounded with curly braces or {root}, e.g. + + {name},{ext},{mtime} + + {name} and {iname} keys are the same and present both for consistency + with 'sort' option. + + Following keys don't have corresponding sorting keys: + + - {root} - display name without extension (as a complement for + {ext}) + + - {fileroot} - display name without extension for anything except for + directories and symbolic links to directories (as a complement for + {fileext}) + + Empty curly braces ({}) are replaced with the default secondary column + for primary sort key. So after the next command view will be displayed + almost as if 'viewcolumns' is empty, but adding ellipsis for long file + names: + + set viewcolumns=-{name}..,6{}. + + Cropping specifier + + It's from one to three dots after closing curly brace in column format. + + Specifies type of text truncation if it doesn't fit in the column. + Currently three types are supported: + + - truncation - text is truncated + + set viewcolumns=-{name}. + + results in truncation of names that are too long too fit in the + view. + + - adding of ellipsis - ellipsis on the left or right are added when + needed + + set viewcolumns=-{name}.. + + results in that ellipsis are added at the end of too long file + names. + + - none (default) - text can pass column boundaries + + set viewcolumns=-{name}...,{ext} + + results in that long file names can partially be written on the ext + column. + +Color schemes + The color schemes in vifm can be applied in two different ways: + + - as the primary color scheme; + + - as local to a pane color scheme. + + Both types are set using :colorscheme command, but of different forms: + + - :colorscheme color_scheme_name - for the primary color scheme; + + - :colorscheme color_scheme_name directory - for local color schemes. + + Look of different parts of the TUI (Text User Interface) is determined + in this way: + + - Border, TabLine, TabLineSel, TopLineSel, TopLine, CmdLine, Er- + rorMsg, StatusLine, JobLine, SuggestBox and WildMenu are always de- + termined by the primary color scheme; + + - CurrLine, Selected, Directory, Link, BrokenLink, Socket, Device, + Executable, Fifo, CmpMismatch, Win, AuxWin and OtherWin are deter- + mined by primary color scheme and a set of local color schemes, + which can be empty. + + There might be a set of local color schemes because they are structured + hierarchically according to file system structure. For example, having + the following piece of file system: + + ~ + `-- bin + | + `-- my + + Two color schemes: + + # ~/.vifm/colors/for_bin + highlight Win cterm=none ctermfg=white ctermbg=red + highlight CurrLine cterm=none ctermfg=red ctermbg=black + + # ~/.vifm/colors/for_bin_my + highlight CurrLine cterm=none ctermfg=green ctermbg=black + + And these three commands in the vifmrc file: + + colorscheme Default + colorscheme for_bin ~/bin + colorscheme for_bin_my ~/bin/my + + File list will look in the following way for each level: + + - ~/ - Default color scheme + black background + cursor with blue background + + - ~/bin/ - mix of Default and for_bin color schemes + red background + cursor with black background and red foreground + + - ~/bin/my/ - mix of Default, for_bin and for_bin_my color schemes + red background + cursor with black background and green foreground + +Trash directory + vifm has support of trash directory, which is used as temporary storage + for deleted files or files that were cut. Using trash is controlled by + the 'trash' option, and exact path to the trash can be set with + 'trashdir' option. Trash directory in vifm differs from the system- + wide one by default, because of possible incompatibilities of storing + deleted files among different file managers. But one can set + 'trashdir' to "~/.local/share/Trash" to use a "standard" trash direc- + tory. + + There are two scenarios of using trash in vifm: + + 1. As a place for storing files that were cut by "d" and may be in- + serted to some other place in file system. + + 2. As a storage of files, that are deleted but not purged yet. + + The first scenario uses deletion ("d") operations to put files to trash + and put ("p") operations to restore files from trash directory. Note + that such operations move files to and from trash directory, which can + be long term operations in case of different partitions or remote + drives mounted locally. + + The second scenario uses deletion ("d") operations for moving files to + trash directory and :empty command-line command to purge all previously + deleted files. + + Deletion and put operations depend on registers, which can point to + files in trash directory. Normally, there are no nonexistent files in + registers, but vifm doesn't keep track of modifications under trash di- + rectory, so one shouldn't expect value of registers to be absolutely + correct if trash directory was modified not by operation that are meant + for it. But this won't lead to any issues with operations, since they + ignore nonexistent files. + +Client-Server + vifm supports remote execution of command-line mode commands, remote + changing of directories and expression evaluation. This is possible + using --remote and --remote-expr command-line arguments. + + To execute a command remotely combine --remote argument with -c <com- + mand> or +<command>. For example: + + vifm --remote -c 'cd /' + vifm --remote '+cd /' + + To change directory not using command-line mode commands one can spec- + ify paths right after --remote argument, like this: + + vifm --remote / + vifm --remote ~ + vifm --remote /usr/bin /tmp + + Evaluating expression remotely might be useful to query information + about an instance, for example its location: + + vifm --remote-expr 'expand("%d")' + + If there are several running instances, the target can be specified + with --server-name option (otherwise, the first one lexicographically + is used): + + vifm --server-name work --remote ~/work/project + + List of names of running instances can be obtained via --server-list + option. Name of the current one is available via v:servername. + + + v:servername + server name of the running vifm instance. Empty if client- + server feature is disabled. + +Plugin + Plugin for using vifm in vim as a file selector. + + Commands: + + :EditVifm select a file or files to open in the current buffer. + :Vifm alias for :EditVifm. + :SplitVifm split buffer and select a file or files to open. + :VsplitVifm vertically split buffer and select a file or files to + open. + :DiffVifm select a file or files to compare to the current file + with + :vert diffsplit. + :TabVifm select a file or files to open in tabs. + + Each command accepts up to two arguments: left pane directory and right + pane directory. After arguments are checked, vifm process is spawned + in a special "file-picker" mode. To pick files just open them either + by pressing l, i or Enter keys, or by running :edit command. If no + files are selected, file under the cursor is opened, otherwise whole + selection is passed to the plugin and opened in vim. + + The plugin have only two settings. It's a string variable named + g:vifm_term to let user specify command to run GUI terminal. By de- + fault it's equal to 'xterm -e'. And another string variable named + g:vifm_exec, which equals "vifm" by default and specifies path to + vifm's executable. To pass arguments to vifm use g:vifm_exec_args, + which is empty by default. + + To use the plugin copy the vifm.vim file to either the system wide + vim/plugin directory or into ~/.vim/plugin. + + If you would prefer not to use the plugin and it is in the system wide + plugin directory add + + let loaded_vifm=1 + + to your ~/.vimrc file. + +Reserved + The following command names are reserved and shouldn't be used for user + commands. + + g[lobal] + v[global] + +ENVIRONMENT + VIFM Points to main configuration directory (usually ~/.vifm/). + + MYVIFMRC + Points to main configuration file (usually ~/.vifm/vifmrc). + + These environment variables are valid inside vifm and also can be used + to configure it by setting some of them before running vifm. + + When $MYVIFMRC isn't set, it's made as $VIFM/vifmrc (exception for Win- + dows: vifmrc in the same directory as vifm.exe has higher priority than + $VIFM/vifmrc). + + See "Startup" section above for more details. + + VIFM_FUSE_FILE + On execution of external commands this variable is set to the + full path of file used to initiate FUSE mount of the closes + mount point from current pane directory up. It's not set when + outside FUSE mount point. When vifm is used inside terminal + multiplexer, it tries to set this variable as well (it doesn't + work this way on its own). + +SEE ALSO + vifm-convert-dircolors(1), vifm-pause(1) + + Website: https://vifm.info/ + Wiki: https://wiki.vifm.info/ + + Esperanto translation of the documentation by Sebastian Cyprych: + http://cyprych.neostrada.pl/tekstoj/komputiloj/vifm-help.eo.html + +AUTHOR + Vifm was written by ksteen <ksteen@users.sourceforge.net> + And currently is developed by xaizek <xaizek@posteo.net> + + + +vifm 0.10.1 July 29, 2019 VIFM(1) diff --git a/.config/vifm/vifmrc b/.config/vifm/vifmrc @@ -0,0 +1,297 @@ +" {{{ General config +" This is the actual command used to start vi. The default is vim. +" If you would like to use another vi clone such as Elvis or Vile +" you will need to change this setting. +set vicmd=nvim + +" This makes vifm perform file operations on its own instead of relying on +" standard utilities like `cp`. While using `cp` and alike is a more universal +" solution, it's also much slower when processing large amounts of files and +" doesn't support progress measuring. +set syscalls + +" Open with preview window +view + +" Trash Directory +" The default is to move files that are deleted with dd or :d to +" the trash directory. If you change this you will not be able to move +" files by deleting them and then using p to put the file in the new location. +" I recommend not changing this until you are familiar with vifm. +" This probably shouldn't be an option. +set trash + +" This is how many directories to store in the directory history. +set history=1000 + +" Automatically resolve symbolic links on l or Enter. +set nofollowlinks + +" Natural sort of (version) numbers within text. +set sortnumbers + +" Maximum number of changes that can be undone. +set undolevels=100 + +" If you would like to run an executable file when you +" press return on the file name set this. +set norunexec + +" Selected color scheme +colorscheme minimal + +" Format for displaying time in file list. For example: +" TIME_STAMP_FORMAT=%m/%d-%H:%M +" See man date or man strftime for details. +set timefmt=%m/%d\ %H:%M + +" Show list of matches on tab completion in command-line mode +set wildmenu + +" Display completions in a form of popup with descriptions of the matches +set wildstyle=popup + +" Display suggestions in normal, visual and view modes for keys, marks and +" registers (at most 5 files). In other view, when available. +set suggestoptions=normal,visual,view,otherpane,keys,marks,registers + +" Ignore case in search patterns unless it contains at least one uppercase +" letter +set ignorecase +set smartcase + +" Don't highlight search results automatically +set nohlsearch + +" Use increment searching (search while typing) +set incsearch + +" Try to leave some space from cursor to upper/lower border in lists +set scrolloff=4 + +" Don't do too many requests to slow file systems +if !has('win') + set slowfs=curlftpfs +endif + +" Things that should be stored in vifminfo +set vifminfo=dhistory,chistory,state,shistory,phistory,fhistory,dirstack,registers,bookmarks,bmarks + +" Dont show delete confirmation +set confirm-=delete + +" ------------------------------------------------------------------------------ + +" :com[mand][!] command_name action +" The following macros can be used in a command +" %a is replaced with the user arguments. +" %c the current file under the cursor. +" %C the current file under the cursor in the other directory. +" %f the current selected file, or files. +" %F the current selected file, or files in the other directory. +" %b same as %f %F. +" %d the current directory name. +" %D the other window directory name. +" %m run the command in a menu window + +command! df df -h %m 2> /dev/null +command! diff vim -d %f %F +command! zip zip -r %f.zip %f +command! run !! ./%f +command! make !!make %a +command! mkcd :mkdir %a | cd %a +command! vgrep vim "+grep %a" +command! reload :write | restart + +" Empty the ruler. By default, it shows the number of directories+files. +set rulerformat= +" }}} + + +" {{{ File preview & file opening +" The file type is for the default programs to be used with +" a file extension. +" :filetype pattern1,pattern2 defaultprogram,program2 +" :fileviewer pattern1,pattern2 consoleviewer +" The other programs for the file type can be accessed with the :file command +" The command macros %f, %F, %d, %F may be used in the commands. +" The %a macro is ignored. To use a % you must put %%. + +" For automated FUSE mounts, you must register an extension with :file[x]type +" in one of following formats: +" +" :filetype extensions FUSE_MOUNT|some_mount_command using %SOURCE_FILE and %DESTINATION_DIR variables +" %SOURCE_FILE and %DESTINATION_DIR are filled in by vifm at runtime. +" A sample line might look like this: +" :filetype *.zip,*.jar,*.war,*.ear FUSE_MOUNT|fuse-zip %SOURCE_FILE %DESTINATION_DIR +" +" :filetype extensions FUSE_MOUNT2|some_mount_command using %PARAM and %DESTINATION_DIR variables +" %PARAM and %DESTINATION_DIR are filled in by vifm at runtime. +" A sample line might look like this: +" :filetype *.ssh FUSE_MOUNT2|sshfs %PARAM %DESTINATION_DIR +" %PARAM value is filled from the first line of file (whole line). +" Example first line for SshMount filetype: root@127.0.0.1:/ +" +" You can also add %CLEAR if you want to clear screen before running FUSE +" program. + + +" CSV/Excel +filetype *.csv,*.xlsx libreoffice %c %i +fileviewer *.csv sed "s/,,,,/,,-,,/g;s/,,/ /g" %c | column -t | sed "s/ - / /g" | cut -c -%pw + +" HTMLs +fileviewer *.html w3m -dump %c +filextype *.html,*.htm firefox %f 2>/dev/null & + +" Text based files +filetype <text/*> nvim +fileviewer <text/*> env -uCOLORTERM bat --color always --theme base16 --wrap never --pager never %c -p +fileviewer *.[ch],*.[ch]pp,*.[ch]xx env -uCOLORTERM bat --color always --theme base16 --wrap never --pager never %c -p + +" PDFs +filextype *.pdf zathura %c %i & +fileviewer *.pdf + \ vifmimg pdf %px %py %pw %ph %c + \ %pc + \ vifmimg clear + +" ePUBs +filextype *.epub zathura %c %i & +fileviewer *.epub + \ vifmimg epub %px %py %pw %ph %c + \ %pc + \ vifmimg clear + +" Fonts +fileviewer *.otf,*.ttf,*.woff + \ vifmimg font %px %py %pw %ph %c + \ %pc + \ vifmimg clear + +" Audios +filetype <audio/*> mpv %c %i & +fileviewer <audio/*> + \ vifmimg audio %px %py %pw %ph %c + \ %pc + \ vifmimg clear + +" Videos +filetype <video/*> mpv %c %i & +fileviewer <video/*> + \ vifmimg video %px %py %pw %ph %c + \ %pc + \ vifmimg clear + +" Images +filextype <image/*> mpv %c %i & +fileviewer <image/*> + \ vifmimg draw %px %py %pw %ph %c + \ %pc + \ vifmimg clear + +" Archives +fileviewer *.zip,*.jar,*.war,*.ear,*.oxt zip -sf %c +fileviewer *.tgz,*.tar.gz tar -tzf %c +fileviewer *.tar.bz2,*.tbz2 tar -tjf %c +fileviewer *.tar.txz,*.txz xz --list %c +fileviewer *.tar tar -tf %c +fileviewer *.rar unrar v %c +fileviewer *.7z 7z l %c + +" Dont show preview on ../ as this confuses me at times +fileview ../ echo >/dev/null + +" Show ls in the preview window, it creates a similar look as ranger. +" The default directory tree thing is really messy +fileviewer */ ls --color --group-directories-first +fileviewer .*/ ls --color --group-directories-first + +" Other files +" Using xdg-open to open the highlighted file with a compatible program and +" the reason why I am using "file" to preview other files is so that "vifm" +" does not lag when trying "cat" the file +filetype * xdg-open %c +fileviewer * file -b %c +" }}} + + +"{{{ Key mappings +" Easily quit vifm by hitting q +nmap q ZQ + +" Use comma to enter command mode +nnoremap , : + +" Set highlighted image as wallpaper +nnoremap bg :!sh ~/.scripts/control/setbg %c &<cr> + +" Upload highlighted file to 0x0.st and then save url to clipboard +nnoremap 0x0 :!curl -s -F'file=@%c' https://0x0.st > /dev/null | xclip -sel clip && notify-send "vifm" "File uploaded: $(xclip -o -selection clipboard)" &<cr> + +" Reverse image search with Tiney +nnoremap re :!bash ~/bin/utils/tineye %c &<cr> + +" Go to the file that is right before "../" for going to the top most file +nnoremap gg ggj + +" Quick shortcuts to some dirs +source ~/.cache/vifm-shortcuts +nnoremap cd :cd<cr> + + +" Start shell in current directory +nnoremap s :shell<cr> + +" Display sorting dialog +nnoremap S :sort<cr> + +" Toggle visibility of preview window +nnoremap w :view<cr> +vnoremap w :view<cr>gv + +" Open file in nvim +nnoremap o :!nvim %f<cr> + +" Open file in the background using its default program +nnoremap gb :file &<cr>l + +" Yank current directory path into the clipboard +nnoremap yd :!echo %d | xclip -i -selection clipboard %i<cr> + +" Yank current file path into the clipboard +nnoremap yf :!echo %c:p | xclip -i -selection clipboard %i<cr> + +" Mappings for faster renaming +nnoremap I cw<c-a> +nnoremap cc cw<c-u> +nnoremap A cw + +" Extract an archive +nnoremap x :!/home/siddharth/bin/utils/extract %f &<cr> + +" Make a new directory +nnoremap mkd :mkdir<space> +"}}} + + +"{{{ Icons +" file types +set classify=' :dir:/, :exe:, :reg:, :link:' +" various file names +set classify+=' ::../::, ::*.sh::, ::*.[hc]pp::, ::*.[hc]::, ::/^copying|license$/::, ::.git/,,*.git/::, ::*.epub,,*.fb2,,*.djvu::, ::*.pdf::, ::*.htm,,*.html,,**.[sx]html,,*.xml::' +set classify+=' ::*.go::, ::*.vim,,vimrc::, ::*.tex,,*.aux,,*.toc,,*.rnw,,*.rmd::, ::*.js::, ::*.css::, ::*.log,,*.db::, ::*.py,,*.pyc,,*.pyd,,*.pyo::, ::*.md::, ::*.json::, ::*.vcf::, ::*.rss::' +" archives +set classify+=' ::*.7z,,*.ace,,*.arj,,*.bz2,,*.cpio,,*.deb,,*.dz,,*.gz,,*.jar,,*.lzh,,*.lzma,,*.rar,,*.rpm,,*.rz,,*.tar,,*.taz,,*.tb2,,*.tbz,,*.tbz2,,*.tgz,,*.tlz,,*.trz,,*.txz,,*.tz,,*.tz2,,*.xz,,*.z,,*.zip,,*.zoo::' +" images +set classify+=' ::*.bmp,,*.gif,,*.jpeg,,*.jpg,,*.ico,,*.png,,*.ppm,,*.svg,,*.svgz,,*.tga,,*.tif,,*.tiff,,*.xbm,,*.xcf,,*.xpm,,*.xspf,,*.xwd,,*.webp::' +" audio +set classify+=' ::*.aac,,*.anx,,*.asf,,*.au,,*.axa,,*.flac,,*.m2a,,*.m4a,,*.mid,,*.midi,,*.mp3,,*.mpc,,*.oga,,*.ogg,,*.ogx,,*.ra,,*.ram,,*.rm,,*.spx,,*.wav,,*.wma,,*.ac3::' +" media +set classify+=' ::*.avi,,*.ts,,*.axv,,*.divx,,*.m2v,,*.m4p,,*.m4v,,.mka,,*.mkv,,*.mov,,*.mp4,,*.flv,,*.mp4v,,*.mpeg,,*.mpg,,*.nuv,,*.ogv,,*.pbm,,*.pgm,,*.qt,,*.vob,,*.wmv,,*.xvid::' +" office files +set classify+=' ::*.doc,,*.docx::, ::*.xls,,*.xls[mx]::, ::*.pptx,,*.ppt::' +" miscelleneaous files +"}}} + +" vim: ft=vim diff --git a/.config/zathura/zathurarc b/.config/zathura/zathurarc @@ -0,0 +1,27 @@ +set statusbar-h-padding 0 +set statusbar-v-padding 0 +set statusbar-basename true +set window-title-basename true +set window-title-page true +set default-bg "rgba( 0, 0, 0, 0 )" +set recolor-lightcolor "rgba( 24, 32, 36, 0.72 )" +set recolor-darkcolor "rgba( 186, 196, 199, 1 )" +set inputbar-fg "rgba( 186, 196, 199, 1 )" +set inputbar-bg "rgba( 34, 45, 50, 0.9 )" +set statusbar-fg "rgba( 186, 196, 199, 1 )" +set statusbar-bg "rgba( 34, 45, 50, 0.9 )" +set notification-warning-bg "rgba( 233, 217, 176, 0.9 )" +set notification-warning-fg "rgba( 34, 45, 50, 1 )" +set notification-error-bg "rgba( 102, 170, 187, 0.9 )" +set notification-error-fg "rgba( 34, 45, 50, 1 )" +set selection-clipboard clipboard +set page-padding 1 +map u scroll half-up +map d scroll half-down +map D toggle_page_mode +map r reload +map R rotate +map J zoom in +map K zoom out +map i recolor +map p print diff --git a/.local/bin/Rinstall b/.local/bin/Rinstall @@ -0,0 +1,5 @@ +#!/bin/sh +for f in $* + do + sudo R --vanilla -e "install.packages('"$f"', repos='http://cran.us.r-project.org')" +done diff --git a/.local/bin/aliasgen b/.local/bin/aliasgen @@ -0,0 +1,14 @@ +#!/bin/sh + +# Removing unecessary comments and documentation +raw=$(cat $HOME/.config/aliasrc | tail -n +17 "$HOME/.config/aliasrc" | sed "s/^|\s*//g; + s/\(.*\)|\(.*\)|\(.*\)|/\1|\2|\3/g; + s/\s*$//g; + /^$/d") + +# #---zsh---# # +echo "$raw" | sed "s/^/alias\ /; + s/\s*|\s*/=\"/; + s/^.*-*+-*=\"$//; + s/\s*|$/\"/" > $HOME/.cache/zsh-aliases + diff --git a/.local/bin/bars b/.local/bin/bars @@ -0,0 +1,22 @@ +#!/usr/bin/bash + +# ANSI color scheme script by pfh +# Source: http://crunchbang.org/forums/viewtopic.php?pid=139126#p139126 +# Initializing mod by lolilolicon from Archlinux +# + +f=3 b=4 +for j in f b; do + for i in {0..7}; do + printf -v $j$i %b "\e[${!j}${i}m" + done +done +bld=$'\e[1m' +rst=$'\e[0m' +inv=$'\e[7m' + +cat << EOF + $f1▬▬▬▬▬ $f2▬▬▬▬▬ $f3▬▬▬▬▬ $f4▬▬▬▬▬ $f5▬▬▬▬▬ $f6▬▬▬▬▬ + $bld$f1▬▬▬▬▬ $f2▬▬▬▬▬ $f3▬▬▬▬▬ $f4▬▬▬▬▬ $f5▬▬▬▬▬ $f6▬▬▬▬▬ + $rst +EOF diff --git a/.local/bin/blocks b/.local/bin/blocks @@ -0,0 +1,3 @@ +#!/usr/bin/sh +pcs() { for i in {0..7}; do echo -en "\e[${1}$((30+$i))m \u2588\u2588 \e[0m"; done; } +printf "\n%s\n%s\n\n" "$(pcs)" "$(pcs '1;')" diff --git a/.local/bin/bloks b/.local/bin/bloks @@ -0,0 +1,59 @@ +#!/usr/bin/sh + +# ANSI Color -- use these variables to easily have different color +# and format output. Make sure to output the reset sequence after +# colors (f = foreground, b = background), and use the 'off' +# feature for anything you turn on. + +initializeANSI() +{ + esc="" + + blackf="${esc}[30m"; redf="${esc}[31m"; greenf="${esc}[32m" + yellowf="${esc}[33m" bluef="${esc}[34m"; purplef="${esc}[35m" + cyanf="${esc}[36m"; whitef="${esc}[37m" + + blackb="${esc}[1;30m"; redb="${esc}[1;31m"; greenb="${esc}[1;32m" + yellowb="${esc}[1;33m" blueb="${esc}[1;34m"; purpleb="${esc}[1;35m" + cyanb="${esc}[1;36m"; whiteb="${esc}[1;37m" + + boldon="${esc}[1m"; boldoff="${esc}[22m" + italicson="${esc}[3m"; italicsoff="${esc}[23m" + ulon="${esc}[4m"; uloff="${esc}[24m" + invon="${esc}[7m"; invoff="${esc}[27m" + + reset="${esc}[0m" +} + +# note in this first use that switching colors doesn't require a reset +# first - the new color overrides the old one. + +numbers (){ + +initializeANSI + +cat << EOF +${blackf}11111111${reset} ${redf}22222222${reset} ${greenf}33333333${reset} ${yellowf}44444444${reset} ${bluef}55555555${reset} ${purplef}66666666${reset} ${cyanf}77777777${reset} ${whitef}88888888${reset} +${blackb}11111111${reset} ${redb}22222222${reset} ${greenb}33333333${reset} ${yellowb}44444444${reset} ${blueb}55555555${reset} ${purpleb}66666666${reset} ${cyanb}77777777${reset} ${whiteb}88888888${reset} +EOF + +} + +blocks (){ + +initializeANSI + +cat << EOF +${blackf}████${reset}${blackb}████${reset} ${redf}████${reset}${redb}████${reset} ${greenf}████${reset}${greenb}████${reset} ${yellowf}████${reset}${yellowb}████${reset} ${bluef}████${reset}${blueb}████${reset} ${purplef}████${reset}${purpleb}████${reset} ${cyanf}████${reset}${cyanb}████${reset} ${whitef}████${reset}${whiteb}████${reset} +${blackf}████${reset}${blackb}████${reset} ${redf}████${reset}${redb}████${reset} ${greenf}████${reset}${greenb}████${reset} ${yellowf}████${reset}${yellowb}████${reset} ${bluef}████${reset}${blueb}████${reset} ${purplef}████${reset}${purpleb}████${reset} ${cyanf}████${reset}${cyanb}████${reset} ${whitef}████${reset}${whiteb}████${reset} +${blackf}████${reset}${blackb}████${reset} ${redf}████${reset}${redb}████${reset} ${greenf}████${reset}${greenb}████${reset} ${yellowf}████${reset}${yellowb}████${reset} ${bluef}████${reset}${blueb}████${reset} ${purplef}████${reset}${purpleb}████${reset} ${cyanf}████${reset}${cyanb}████${reset} ${whitef}████${reset}${whiteb}████${reset} +EOF + +} + +case $1 in + b) blocks;; + n) numbers;; + a) blocks && numbers;; + *) blocks && numbers;; +esac diff --git a/.local/bin/bonsai b/.local/bin/bonsai @@ -0,0 +1,554 @@ +#!/usr/bin/env bash + +# I'm a bonsai-making machine! + +################################################# +## +# author: John Allbritten +# my website: theSynAck.com +# +# repo: https://gitlab.com/jallbrit +# script can be found in the bin/bin/fun folder. +# +# license: this script is published under GPLv3. +# I don't care what you do with it, but I do ask +# that you leave this message please! +# +# inspiration: http://andai.tv/bonsai/ +# andai's version was written in JS and served +# as the basis for this script. Originally, this +# was just a port. +## +################################################# + +# ------ vars ------ +# CLI options + +flag_h=false +live=false +infinite=false + +termCols=$(tput cols) +termRows=$(tput lines) +geometry="$((termCols - 1)),$termRows" + +leafchar='&' +termColors=false + +message="" +flag_m=false +basetype=1 +multiplier=5 + +lifeStart=28 +steptime=0.01 # time between steps + +# non-CLI options +lineWidth=4 # words per line + +# ------ parse options ------ + +OPTS="hlt:ig:c:Tm:b:M:L:" # the colon means it requires a value +LONGOPTS="help,live,time:,infinite,geo:,leaf:,termcolors,message:,base:,multiplier:,life:" + +parsed=$(getopt --options=$OPTS --longoptions=$LONGOPTS -- "$@") +eval set -- "${parsed[@]}" + +while true; do + case "$1" in + -h|--help) + flag_h=true + shift + ;; + + -l|--live) + live=true + shift + ;; + + -t|--time) + steptime="$2" + shift 2 + ;; + + -i|--infinite) + infinite=true + shift + ;; + + -g|--geo) + geo=$2 + shift 2 + ;; + + -c|--leaf) + leafchar="$2" + shift 2 + ;; + + -T|--termcolors) + termColors=true + shift + ;; + + -m|--message) + flag_m=true + message="$2" + shift 2 + ;; + + -b|--basetype) + basetype="$2" + shift 2 + ;; + + -M|--multiplier) + multiplier="$2" + shift 2 + ;; + + -L|--life) + lifeStart="$2" + shift 2 + ;; + + --) # end of arguments + shift + break + ;; + + *) + echo "error while parsing CLI options" + flag_h=true + ;; + esac +done + +HELP="Usage: bonsai [-h] [-i] [-l] [-T] [-m message] [-t time] + [-g x,y] [ -c char] [-M 0-9] + +bonsai.sh is a static and live bonsai tree generator, written in bash. + +optional args: + -l, --live enable live generation + -t, --time time time between each step of growth [default: 0.01] + -m, --message text attach a message to the tree + -b, --basetype 0-2 which ascii-art plant base to use (0 for none) [default: 1] + -i, --infinite keep generating trees until quit (2s between each) + -T, --termcolors use terminal colors + -g, --geo geo set custom geometry [default: fit to terminal] + -c, --leaf char character used for leaves [default: &] + -M, --multiplier 0-9 branch multiplier; higher equals more branching [default: 5] + -L, --life int life of tree; higher equals more overall growth [default: 28] + -h, --help show help" + +# check for help +$flag_h && echo -e "$HELP" && exit 0 + +# geometry processing +cols=$(echo "$geometry" | cut -d ',' -f1) # width; X +rows=$(echo "$geometry" | cut -d ',' -f2) # height; Y + +IFS=$'\n' # delimit strings by newline +tabs 4 # set tabs to 4 spaces + +declare -A gridMessage + +# message processing +if [ $flag_m = true ]; then + + messageWidth=20 + + # make room for the message to go on the right side + cols=$((cols - messageWidth - 8 )) + + # wordwrap message, delimiting by spaces + message="$(echo "$message" | fold -sw $messageWidth)" + + # get number of lines in the message + messageLineCount=0 + for line in $message; do + messageLineCount=$((messageLineCount + 1)) + done + + messageOffset=$((rows - messageLineCount - 7)) + + # put lines of message into a grid + index=$messageOffset + for line in $message; do + gridMessage[$index]="$line" + index=$((index + 1)) + done +fi + +# define colors +if [ $termColors = true ]; then + LightBrown='\e[1;33m' + DarkBrown='\e[0;33m' + BrownGreen='\e[1;32m' + Green='\e[0;32m' +else + LightBrown='\e[38;5;172m' + DarkBrown='\e[38;5;130m' + BrownGreen='\e[38;5;142m' + Green='\e[38;5;106m' +fi +Grey='\e[1;30m' +R='\e[0m' + +# create ascii base in lines +base="" +case $basetype in + 0) + base="" ;; + + 1) + width=15 + art="\ +${Grey}:${Green}___________${DarkBrown}./~~\\.${Green}___________${Grey}: + \\ / + \\________________________/ + (_) (_)" + ;; + + 2) + width=7 + art="\ +${Grey}(${Green}---${DarkBrown}./~~\\.${Green}---${Grey}) + ( ) + (________)" + ;; +esac + +# get base height +baseHeight=0 +for line in $art; do + baseHeight=$(( baseHeight + 1 )) +done + +# add spaces before base so that it's in the middle of the terminal +iter=1 +for line in $art; do + filler='' + for (( i=0; i < $(( (cols / 2) - width )); i++)); do + filler+=" " + done + base+="${filler}${line}" + [ $iter -ne $baseHeight ] && base+='\n' + iter=$((iter+1)) +done +unset IFS # reset delimiter + +rows=$((rows - baseHeight)) + +declare -A grid # must be done outside function for unknown reason + +trap 'echo "press q to quit"' SIGINT # disable CTRL+C + +init() { + branches=0 + shoots=0 + + branchesMax=$((multiplier * 110)) + shootsMax=$multiplier + + # fill grid full of spaces + for (( row=0; row < $rows; row++ )); do + for (( col=0; col < $cols; col++ )); do + grid[$row,$col]=' ' + done + done + + # No echo stdin and hide the cursor + if [ $live = true ]; then + stty -echo + echo -ne "\e[?25l" + + echo -ne "\e[2J" + fi +} + +grow() { + local start=$((cols / 2)) + + local x=$((cols / 2)) # start halfway across the screen + local y=$rows # start just above the base + + branch $x $y trunk $lifeStart +} + +branch() { + # argument declarations + local x=$1 + local y=$2 + local type=$3 + local life=$4 + local dx=0 + local dy=0 + + # check if the user is hitting q + timeout=0.001 + [ $live = "false" ] && timeout=.0001 + read -n 1 -t $timeout input + [ "$input" = "q" ] && clean "quit" + + branches=$((branches + 1)) + + # as long as we're alive... + while [ $life -gt 0 ]; do + + life=$((life - 1)) # ensure life ends + + # case $life in + # [0]) type=dead ;; + # [1-4]) type=dying ;; + # esac + + # set dy based on type + case $type in + shoot*) # if this is a shoot, trend horizontal/downward growth + case "$((RANDOM % 10))" in + [0-1]) dy=-1 ;; + [2-7]) dy=0 ;; + [8-9]) dy=1 ;; + esac + ;; + + dying) # discourage vertical growth + case "$((RANDOM % 10))" in + [0-1]) dy=-1 ;; + [2-8]) dy=0 ;; + [9-10]) dy=1 ;; + esac + ;; + + *) # otherwise, let it grow up/not at all + dy=0 + [ $life -ne $lifeStart ] && [ $((RANDOM % 10)) -gt 2 ] && dy=-1 + ;; + esac + # if we're about to hit the ground, cut it off + [ $dy -gt 0 ] && [ $y -gt $(( rows - 1 )) ] && dy=0 + [ $type = "trunk" ] && [ $life -lt 4 ] && dy=0 + + # set dx based on type + case $type in + shootLeft) # tend left: dx=[-2,1] + case $(( RANDOM % 10 )) in + [0-1]) dx=-2 ;; + [2-5]) dx=-1 ;; + [6-8]) dx=0 ;; + [9]) dx=1 ;; + esac ;; + + shootRight) # tend right: dx=[-1,2] + case $(( RANDOM % 10 )) in + [0-1]) dx=2 ;; + [2-5]) dx=1 ;; + [6-8]) dx=0 ;; + [9]) dx=-1 ;; + esac ;; + + dying) # tend left/right: dx=[-3,3] + dx=$(( (RANDOM % 7) - 3)) ;; + + *) # tend equal: dx=[-1,1] + dx=$(( (RANDOM % 3) - 1)) ;; + + esac + + # re-branch upon conditions + if [ $branches -lt $branchesMax ]; then + + # branch is dead + if [ $life -lt 3 ]; then + branch $x $y dead $life + + # branch is dying and needs to branch into leaves + elif [ $type = trunk ] && [ $life -lt $((multiplier + 2)) ]; then + branch $x $y dying $life + + elif [[ $type = "shoot"* ]] && [ $life -lt $((multiplier + 2)) ]; then + branch $x $y dying $life + + # re-branch if: not close to the base AND (pass a chance test OR be a trunk, not have too man shoots already, and not be about to die) + elif [[ $type = trunk && $life -lt $((lifeStart - 8)) \ + && ( $(( RANDOM % (16 - multiplier) )) -eq 0 \ + || ($type = trunk && $(( life % 5 )) -eq 0 && $life -gt 5) ) ]]; then + + # if a trunk is splitting and not about to die, chance to create another trunk + if [ $((RANDOM % 3)) -eq 0 ] && [ $life -gt 7 ]; then + branch $x $y trunk $life + + elif [ $shoots -lt $shootsMax ]; then + + # give the shoot some life + tmpLife=$(( life + multiplier - 2 )) + [ $tmpLife -lt 0 ] && tmpLife=0 + + # first shoot is randomly directed + if [ $shoots -eq 0 ]; then + tmpType=shootLeft + [ $((RANDOM % 2)) -eq 0 ] && tmpType=shootRight + + + # secondary shoots alternate from the first + else + case $tmpType in + shootLeft) # last shoot was left, shoot right + tmpType=shootRight ;; + shootRight) # last shoot was right, shoot left + tmpType=shootLeft ;; + esac + fi + branch $x $y $tmpType $tmpLife + shoots=$((shoots + 1)) + fi + fi + else # if we're past max branches but want to branch... + char='<>' + fi + + # implement dx,dy + x=$((x + dx)) + y=$((y + dy)) + + # choose color + case $type in + trunk|shoot*) + color=${DarkBrown} + [ $(( RANDOM % 4 )) -eq 0 ] && color=${LightBrown} + ;; + + dying) color=${BrownGreen} ;; + + dead) color=${Green} ;; + esac + + # choose branch character + case $type in + trunk) + if [ $dx -lt 0 ]; then + char='\\' + elif [ $dx -eq 0 ]; then + char='/|' + elif [ $dx -gt 0 ]; then + char='/' + fi + [ $dy -eq 0 ] && char='/~' # not growing + #[ $dy -lt 0 ] && char='/~' # growing + ;; + + # shoots tend to look horizontal + shootLeft) + case $dx in + [-3,-1]) char='\\|' ;; + [0]) char='/|' ;; + [1,3]) char='/' ;; + esac + #[ $dy -lt 0 ] && char='/~' # growing up + [ $dy -gt 0 ] && char='/' # growing down + [ $dy -eq 0 ] && char='\\_' # not growing + ;; + + shootRight) + case $dx in + [-3,-1]) char='\\|' ;; + [0]) char='/|' ;; + [1,3]) char='/' ;; + esac + #[ $dy -lt 0 ] && char='' # growing up + [ $dy -gt 0 ] && char='\\' # growing down + [ $dy -eq 0 ] && char='_/' # not growing + ;; + + #dead) + # #life=$((life + 1)) + # char="${leafchar}" + # [ $dx -lt -2 ] || [ $dx -gt 2 ] && char="${leafchar}${leafchar}" + # ;; + + esac + + # set leaf if needed + [ $life -lt 4 ] && char="${leafchar}" + + # uncomment for help debugging + #echo -e "$life:\t$x, $y: $char" + + # put character in grid + grid[$y,$x]="${color}${char}${R}" + + # if live, print what we have so far and let the user see it + if [ $live = true ]; then + print + sleep $steptime + fi + done +} + +print() { + # parse grid for output + output="" + for (( row=0; row < $rows; row++)); do + + line="" + + for (( col=0; col < $cols; col++ )); do + + # this prints a space at 0,0 and is necessary at the moment + [ $live = true ] && echo -ne "\e[0;0H " + + # grab the character from our grid + line+="${grid[$row,$col]}" + done + + # add our message + if [ $flag_m = true ]; then + # remove trailing whitespace before we add our message + line=$(sed -r 's/[ \t]*$//' <(printf "$line")) + line+=" \t${gridMessage[$row]}" + fi + + line="${line}\n" + + # end 'er with the ol' newline + output+="$line" + done + + # add the ascii-art base we generated earlier + output+="$base" + + # output, removing trailing whitespace + sed -r 's/[ \t]*$//' <(printf "$output") +} + +clean() { + # Show cursor and echo stdin + if [ $live = true ]; then + echo -ne "\e[?25h" + stty echo + fi + + echo "" # ensure the cursor resets to the next line + + # if we wanna quit + if [ "$1" = "quit" ]; then + trap SIGINT + exit 0 + fi +} + +bonsai() { + init + grow + print + clean +} + +bonsai + +while [ $infinite = true ]; do + sleep 2 + bonsai +done diff --git a/.local/bin/camtoggle b/.local/bin/camtoggle @@ -0,0 +1,4 @@ +#!/bin/sh + +mpv --no-cache --no-osc --no-input-default-bindings --input-conf=/dev/null --title=webcam $(ls /dev/video[0,4,6,8] | tail -n 1) +# mpv --no-cache --no-osc --no-input-default-bindings --input-conf=/dev/null --title=webcam $(ls /dev/video[0,2,4,6,8] | tail -n 1) diff --git a/.local/bin/colorbars b/.local/bin/colorbars @@ -0,0 +1,38 @@ +#!/bin/sh +# +# colorbars - smpte color bars in sh +# http://git.io/colorbars + +echo + +for y in $(seq 0 13); do + printf %s ' ' + for color in 7 3 6 2 5 1 4; do + tput setab ${color} + printf %s ' ' + done + tput sgr0 + echo +done + +for y in 0 1; do + printf %s ' ' + for color in 4 0 5 0 6 0 7; do + tput setab ${color} + printf %s ' ' + done + tput sgr0 + echo +done + +for y in $(seq 0 4); do + printf %s ' ' + for color in 4 4 4 4 4 7 7 7 7 7 5 5 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0; do + tput setab ${color} + printf %s ' ' + done + tput sgr0 + echo +done + +echo diff --git a/.local/bin/colorbars-sm b/.local/bin/colorbars-sm @@ -0,0 +1,35 @@ +#!/bin/sh +echo + +# mini smpte color bars +for y in $(seq 0 6); do + printf %s ' ' + for color in 7 3 6 2 5 1 4; do + tput setab ${color} + printf %s ' ' + done + tput sgr0 + echo +done + +for y in 0 1; do + printf %s ' ' + for color in 4 0 5 0 6 0 7; do + tput setab ${color} + printf %s ' ' + done + tput sgr0 + echo +done + +for y in $(seq 0 2); do + printf %s ' ' + for color in 4 4 4 4 4 7 7 7 7 7 5 5 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0; do + tput setab ${color} + printf %s ' ' + done + tput sgr0 + echo +done + +echo diff --git a/.local/bin/colorscheme b/.local/bin/colorscheme @@ -0,0 +1,27 @@ +#!/bin/bash +# +# This file echoes a bunch of color codes to the +# terminal to demonstrate what's available. Each +# line is the color code of one forground color, +# out of 17 (default + 16 escapes), followed by a +# test use of that color on all nine background +# colors (default + 8 escapes). +# + +T='niX' # The test text + +echo -e "\n 40m 41m 42m 43m\ + 44m 45m 46m 47m"; + +for FGs in ' m' ' 1m' ' 30m' '1;30m' ' 31m' '1;31m' ' 32m' \ + '1;32m' ' 33m' '1;33m' ' 34m' '1;34m' ' 35m' '1;35m' \ + ' 36m' '1;36m' ' 37m' '1;37m'; + do FG=${FGs// /} + echo -en " $FGs \033[$FG $T " + for BG in 40m 41m 42m 43m 44m 45m 46m 47m; + do echo -en "$EINS \033[$FG\033[$BG $T \033[0m"; + done + echo; +done +echo + diff --git a/.local/bin/compiler b/.local/bin/compiler @@ -0,0 +1,40 @@ +#!/bin/sh +# This script will compile or run another finishing operation on a document. I +# have this script run via vim. +# +# Compiles .tex. groff (.mom, .ms), .rmd, .md. +# Opens .sent files as sent presentations. +# Runs scripts based on extention or shebang + +file=$(readlink -f "$1") +dir=$(dirname "$file") +base="${file%.*}" + +cd "$dir" || exit + +textype() { \ + command="pdflatex" + ( sed 5q "$file" | grep -i -q 'xelatex' ) && command="xelatex" + $command --output-directory="$dir" "$base" && + grep -i addbibresource "$file" >/dev/null && + biber --input-directory "$dir" "$base" && + $command --output-directory="$dir" "$base" && + $command --output-directory="$dir" "$base" + } + +case "$file" in + *\.ms) refer -PS -e -p"$REFERBIB" "$file" | groff -me -ms -kejpt -T pdf > "$base".pdf ;; + *\.gd) groffdown "$file" | refer -PS -e "-p$REFERBIB" | groff -me -ms -kejpt -T pdf > "$base".pdf ;; + # *\.gd) groffdown "$file" | refer -PS -e "$REFERBIB" | groff -me -ms -kejpt -T pdf > "$base".pdf ;; + *\.mom) refer -PS -e -p"$REFERBIB" "$file" | groff -mom -kejpt -T pdf > "$base".pdf ;; + *\.rmd) echo "require(rmarkdown); render('$file')" | R -q --vanilla ;; + *\.rnw) Rscript -e "knitr::knit2pdf('"$file"')" ;; + *\.tex) textype "$file" ;; + *\.md) pandoc "$file" --pdf-engine=xelatex -o "$base".pdf ;; + *config.h) make && sudo make install ;; + *\.c) cc "$file" -o "$base" && "$base" ;; + *\.py) python "$file" ;; + *\.go) go run "$file" ;; + *\.sent) setsid sent "$file" 2>/dev/null & ;; + *) sed 1q "$file" | grep "^#!/" | sed "s/^#!//" | xargs -r -I % "$file" ;; +esac diff --git a/.local/bin/cronbat b/.local/bin/cronbat @@ -0,0 +1,8 @@ +#!/bin/sh +# Notify me with notify-send if my battery is below 25%. +# You can set this to run via cron. + +[ "$(cat /sys/class/power_supply/BAT0/status)" = "Charging" ] && exit +[ "$(cat /sys/class/power_supply/BAT0/capacity)" -lt 25 ] && +export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus && +notify-send -u critical "Battery critically low." diff --git a/.local/bin/crontog b/.local/bin/crontog @@ -0,0 +1,5 @@ +#!/bin/sh +# Toggles all cronjobs off/on. +# Stores disabled crontabs in ~/.consaved until restored. + +([ -f ~/.config/cronsaved ] && crontab - < ~/.config/cronsaved && rm ~/.config/cronsaved && notify-send "🕓 Cronjobs re-enabled.") || ( crontab -l > ~/.config/cronsaved && crontab -r && notify-send "🕓 Cronjobs saved and disabled.") diff --git a/.local/bin/datetime b/.local/bin/datetime @@ -0,0 +1,3 @@ +#!/bin/sh + +date +"  %a %b %d |  %H:%M " diff --git a/.local/bin/define b/.local/bin/define @@ -0,0 +1,3 @@ +#!/bin/sh + +sdcv --color $1 | less diff --git a/.local/bin/displaymenu b/.local/bin/displaymenu @@ -0,0 +1,73 @@ +#!/bin/sh + +# A UI for detecting and selecting all displays. +# Probes xrandr for connected displays and lets user select one to use. +# User may also select "manual selection" which opens arandr. +# I plan on adding a routine from multi-monitor setups later. + +twoscreen() { # If multi-monitor is selected and there are two screens. + + mirror=$(printf "no\\nyes" | dmenu -i -p "Mirror displays?") + # Mirror displays using native resolution of external display and a scaled + # version for the internal display + if [ "$mirror" = "yes" ]; then + external=$(echo "$screens" | dmenu -i -p "Optimize resolution for") + internal=$(echo "$screens" | grep -v "$external") + + res_external=$(xrandr --query | sed -n "/^$external/,/\+/p" | \ + tail -n 1 | awk '{print $1}') + res_internal=$(xrandr --query | sed -n "/^$internal/,/\+/p" | \ + tail -n 1 | awk '{print $1}') + + res_ext_x=$(echo $res_external | sed 's/x.*//') + res_ext_y=$(echo $res_external | sed 's/.*x//') + res_int_x=$(echo $res_internal | sed 's/x.*//') + res_int_y=$(echo $res_internal | sed 's/.*x//') + + scale_x=$(echo "$res_ext_x / $res_int_x" | bc -l) + scale_y=$(echo "$res_ext_y / $res_int_y" | bc -l) + + xrandr --output "$external" --auto --scale 1.0x1.0 \ + --output "$internal" --auto --same-as "$external" \ + --scale "$scale_x"x"$scale_y" + else + + primary=$(echo "$screens" | dmenu -i -p "Select primary display") + secondary=$(echo "$screens" | grep -v "$primary") + direction=$(printf "left\\nright" | dmenu -i -p "What side of $primary should $secondary be on?") + xrandr --output "$primary" --auto --scale 1.0x1.0 --output "$secondary" --"$direction"-of "$primary" --auto --scale 1.0x1.0 + fi + } + +morescreen() { # If multi-monitor is selected and there are more than two screens. + primary=$(echo "$screens" | dmenu -i -p "Select primary display") + secondary=$(echo "$screens" | grep -v "$primary" | dmenu -i -p "Select secondary display") + direction=$(printf "left\\nright" | dmenu -i -p "What side of $primary should $secondary be on?") + tertiary=$(echo "$screens" | grep -v "$primary" | grep -v "$secondary" | dmenu -i -p "Select third display") + xrandr --output "$primary" --auto --output "$secondary" --"$direction"-of "$primary" --auto --output "$tertiary" --"$(printf "left\\nright" | grep -v "$direction")"-of "$primary" --auto + } + +multimon() { # Multi-monitor handler. + case "$(echo "$screens" | wc -l)" in + 1) xrandr $(echo "$allposs" | grep -v "$screens" | awk '{print "--output", $1, "--off"}' | tr '\n' ' ') ;; + 2) twoscreen ;; + *) morescreen ;; + esac ;} + +# Get all possible displays +allposs=$(xrandr -q | grep "connected") + +# Get all connected screens. +screens=$(echo "$allposs" | grep " connected" | awk '{print $1}') + +# Get user choice including multi-monitor and manual selection: +chosen=$(printf "%s\\nmulti-monitor\\nmanual selection" "$screens" | dmenu -i -p "Select display arangement") && +case "$chosen" in + "manual selection") arandr ; exit ;; + "multi-monitor") multimon ;; + *) xrandr --output "$chosen" --auto --scale 1.0x1.0 $(echo "$allposs" | grep -v "$chosen" | awk '{print "--output", $1, "--off"}' | tr '\n' ' ') ;; +esac + +# setbg # Fix background if screen size/arangement has changed. +remaps # Re-remap keys if keyboard added (for laptop bases) +pgrep -x dunst >/dev/null && killall dunst && setsid dunst & # Restart dunst to ensure proper location on screen diff --git a/.local/bin/displayselect b/.local/bin/displayselect @@ -0,0 +1,72 @@ +#!/bin/sh + +# A UI for detecting and selecting all displays. Probes xrandr for connected +# displays and lets user select one to use. User may also select "manual +# selection" which opens arandr. + +twoscreen() { # If multi-monitor is selected and there are two screens. + + mirror=$(printf "no\\nyes" | dmenu -i -p "Mirror displays?") + # Mirror displays using native resolution of external display and a scaled + # version for the internal display + if [ "$mirror" = "yes" ]; then + external=$(echo "$screens" | dmenu -i -p "Optimize resolution for:") + internal=$(echo "$screens" | grep -v "$external") + + res_external=$(xrandr --query | sed -n "/^$external/,/\+/p" | \ + tail -n 1 | awk '{print $1}') + res_internal=$(xrandr --query | sed -n "/^$internal/,/\+/p" | \ + tail -n 1 | awk '{print $1}') + + res_ext_x=$(echo $res_external | sed 's/x.*//') + res_ext_y=$(echo $res_external | sed 's/.*x//') + res_int_x=$(echo $res_internal | sed 's/x.*//') + res_int_y=$(echo $res_internal | sed 's/.*x//') + + scale_x=$(echo "$res_ext_x / $res_int_x" | bc -l) + scale_y=$(echo "$res_ext_y / $res_int_y" | bc -l) + + xrandr --output "$external" --auto --scale 1.0x1.0 \ + --output "$internal" --auto --same-as "$external" \ + --scale "$scale_x"x"$scale_y" + else + + primary=$(echo "$screens" | dmenu -i -p "Select primary display:") + secondary=$(echo "$screens" | grep -v "$primary") + direction=$(printf "left\\nright" | dmenu -i -p "What side of $primary should $secondary be on?") + xrandr --output "$primary" --auto --scale 1.0x1.0 --output "$secondary" --"$direction"-of "$primary" --auto --scale 1.0x1.0 + fi + } + +morescreen() { # If multi-monitor is selected and there are more than two screens. + primary=$(echo "$screens" | dmenu -i -p "Select primary display:") + secondary=$(echo "$screens" | grep -v "$primary" | dmenu -i -p "Select secondary display:") + direction=$(printf "left\\nright" | dmenu -i -p "What side of $primary should $secondary be on?") + tertiary=$(echo "$screens" | grep -v "$primary" | grep -v "$secondary" | dmenu -i -p "Select third display:") + xrandr --output "$primary" --auto --output "$secondary" --"$direction"-of "$primary" --auto --output "$tertiary" --"$(printf "left\\nright" | grep -v "$direction")"-of "$primary" --auto + } + +multimon() { # Multi-monitor handler. + case "$(echo "$screens" | wc -l)" in + 1) xrandr $(echo "$allposs" | grep -v "$screens" | awk '{print "--output", $1, "--off"}' | tr '\n' ' ') ;; + 2) twoscreen ;; + *) morescreen ;; + esac ;} + +# Get all possible displays +allposs=$(xrandr -q | grep "connected") + +# Get all connected screens. +screens=$(echo "$allposs" | grep " connected" | awk '{print $1}') + +# Get user choice including multi-monitor and manual selection: +chosen=$(printf "%s\\nmulti-monitor\\nmanual selection" "$screens" | dmenu -i -p "Select display arangement:") && +case "$chosen" in + "manual selection") arandr ; exit ;; + "multi-monitor") multimon ;; + *) xrandr --output "$chosen" --auto --scale 1.0x1.0 $(echo "$allposs" | grep -v "$chosen" | awk '{print "--output", $1, "--off"}' | tr '\n' ' ') ;; +esac + +setbg # Fix background if screen size/arangement has changed. +remaps # Re-remap keys if keyboard added (for laptop bases) +pgrep -x dunst >/dev/null && killall dunst && setsid dunst & # Restart dunst to ensure proper location on screen diff --git a/.local/bin/dna b/.local/bin/dna @@ -0,0 +1,46 @@ +#!/bin/bash +# +# ANSI color scheme script by pfh +# +# Initializing mod by lolilolicon from Archlinux +# + +f=3 b=4 +for j in f b; do + for i in {0..7}; do + printf -v $j$i %b "\e[${!j}${i}m" + done +done +bld=$'\e[1m' +rst=$'\e[0m' +inv=$'\e[7m' + +cat << EOF + + ${f1} █-----${bld}█ ${rst}${f2} █-----${bld}█${rst} ${f3} █-----${bld}█${rst} ${f4} █-----${bld}█${rst} ${f5} █-----${bld}█${rst} ${f6} █-----${bld}█${rst} + ${f1} █---${bld}█${rst} ${f2} █---${bld}█${rst} ${f3} █---${bld}█${rst} ${f4} █---${bld}█${rst} ${f5} █---${bld}█${rst} ${f6} █---${bld}█${rst} + ${f1} █-${bld}█${rst} ${f2} █-${bld}█${rst} ${f3} █-${bld}█${rst} ${f4} █-${bld}█${rst} ${f5} █-${bld}█${rst} ${f6} █-${bld}█${rst} + ${f1} █${rst} ${f2} █${rst} ${f3} █${rst} ${f4} █${rst} ${f5} █${rst} ${f6} █${rst} + ${f1}${bld} █-${rst}${f1}█${rst} ${f2}${bld} █_${rst}${f2}█${rst} ${f3}${bld} █-${rst}${f3}█${rst} ${f4}${bld} █-${rst}${f4}█${rst} ${f5}${bld} █-${rst}${f5}█${rst} ${f6}${bld} █-${rst}${f6}█${rst} + ${f1}${bld} █---${rst}${f1}█${rst} ${f2}${bld} █---${rst}${f2}█${rst} ${f3}${bld} █---${rst}${f3}█${rst} ${f4}${bld} █---${rst}${f4}█${rst} ${f5}${bld} █---${rst}${f5}█${rst} ${f6}${bld} █---${rst}${f6}█${rst} + ${f1}${bld} █-----${rst}${f1}█${rst} ${f2}${bld} █-----${rst}${f2}█${rst} ${f3}${bld} █-----${rst}${f3}█${rst} ${f4}${bld} █-----${rst}${f4}█${rst} ${f5}${bld} █-----${rst}${f5}█${rst} ${f6}${bld} █-----${rst}${f6}█${rst} + ${f1}${bld} █---${rst}${f1}█${rst} ${f2}${bld} █---${rst}${f2}█${rst} ${f3}${bld} █---${rst}${f3}█${rst} ${f4}${bld} █---${rst}${f4}█${rst} ${f5}${bld} █---${rst}${f5}█${rst} ${f6}${bld} █---${rst}${f6}█${rst} + ${f1}${bld} █-${rst}${f1}█${rst} ${f2}${bld} █-${rst}${f2}█${rst} ${f3}${bld} █-${rst}${f3}█${rst} ${f4}${bld} █-${rst}${f4}█${rst} ${f5}${bld} █-${rst}${f5}█${rst} ${f6}${bld} █-${rst}${f6}█${rst} + ${f1}${bld} █${rst} ${f2}${bld} █${rst} ${f3}${bld}█${rst} ${f4}${bld} █${rst} ${f5}${bld} █${rst} ${f6}${bld} █${rst} + ${f1} █-${bld}█${rst} ${f2} █-${bld}█${rst} ${f3} █-${bld}█${rst} ${f4} █-${bld}█${rst} ${f5} █-${bld}█${rst} ${f6} █-${bld}█${rst} + ${f1} █---${bld}█${rst} ${f2} █---${bld}█${rst} ${f3} █---${bld}█${rst} ${f4} █---${bld}█${rst} ${f5} █---${bld}█${rst} ${f6} █---${bld}█${rst} + ${f1} █-----${bld}█ ${rst}${f2} █-----${bld}█${rst} ${f3} █-----${bld}█${rst} ${f4} █-----${bld}█${rst} ${f5} █-----${bld}█${rst} ${f6} █-----${bld}█${rst} + ${f1} █---${bld}█${rst} ${f2} █---${bld}█${rst} ${f3} █---${bld}█${rst} ${f4} █---${bld}█${rst} ${f5} █---${bld}█${rst} ${f6} █---${bld}█${rst} + ${f1} █-${bld}█${rst} ${f2} █-${bld}█${rst} ${f3} █-${bld}█${rst} ${f4} █-${bld}█${rst} ${f5} █-${bld}█${rst} ${f6} █-${bld}█${rst} + ${f1} █${rst} ${f2}█${rst} ${f3} █${rst} ${f4} █${rst} ${f5} █${rst} ${f6} █${rst} + ${f1}${bld} █-${rst}${f1}█${rst} ${f2}${bld} █_${rst}${f2}█${rst} ${f3}${bld} █-${rst}${f3}█${rst} ${f4}${bld} █-${rst}${f4}█${rst} ${f5}${bld} █-${rst}${f5}█${rst} ${f6}${bld} █-${rst}${f6}█${rst} + ${f1}${bld} █---${rst}${f1}█${rst} ${f2}${bld} █---${rst}${f2}█${rst} ${f3}${bld} █---${rst}${f3}█${rst} ${f4}${bld} █---${rst}${f4}█${rst} ${f5}${bld} █---${rst}${f5}█${rst} ${f6}${bld} █---${rst}${f6}█${rst} + ${f1}${bld} █-----${rst}${f1}█${rst} ${f2}${bld} █-----${rst}${f2}█${rst} ${f3}${bld} █-----${rst}${f3}█${rst} ${f4}${bld} █-----${rst}${f4}█${rst} ${f5}${bld} █-----${rst}${f5}█${rst} ${f6}${bld} █-----${rst}${f6}█${rst} + ${f1}${bld} █---${rst}${f1}█${rst} ${f2}${bld} █---${rst}${f2}█${rst} ${f3}${bld} █---${rst}${f3}█${rst} ${f4}${bld} █---${rst}${f4}█${rst} ${f5}${bld} █---${rst}${f5}█${rst} ${f6}${bld} █---${rst}${f6}█${rst} + ${f1}${bld} █-${rst}${f1}█${rst} ${f2}${bld} █-${rst}${f2}█${rst} ${f3}${bld} █-${rst}${f3}█${rst} ${f4}${bld} █-${rst}${f4}█${rst} ${f5}${bld} █-${rst}${f5}█${rst} ${f6}${bld} █-${rst}${f6}█${rst} + ${f1}${bld} █${rst} ${f2}${bld} █${rst} ${f3}${bld} █${rst} ${f4}${bld} █${rst} ${f5}${bld} █${rst} ${f6}${bld} █${rst} + ${f1} █-${bld}█${rst} ${f2} █-${bld}█${rst} ${f3} █-${bld}█${rst} ${f4} █-${bld}█${rst} ${f5} █-${bld}█${rst} ${f6} █-${bld}█${rst} + ${f1} █---${bld}█${rst} ${f2} █---${bld}█${rst} ${f3} █---${bld}█${rst} ${f4} █---${bld}█${rst} ${f5} █---${bld}█${rst} ${f6} █---${bld}█${rst} + ${f1} █-----${bld}█ ${rst}${f2} █-----${bld}█${rst} ${f3} █-----${bld}█${rst} ${f4} █-----${bld}█${rst} ${f5} █-----${bld}█${rst} ${f6} █-----${bld}█${rst} + +EOF+ \ No newline at end of file diff --git a/.local/bin/dropbox-status b/.local/bin/dropbox-status @@ -0,0 +1,9 @@ +#!/bin/sh + +case "$(dropbox-cli status | head -n 1)" in + "Up to date") icon="" ;; + "Syncing"*) icon=" " ;; + *) icon=" " +esac + +echo " $icon " diff --git a/.local/bin/dropdowntoggle b/.local/bin/dropdowntoggle @@ -0,0 +1,17 @@ +#!/bin/sh + +# Toggle dropdown terminal windows. +# The first argument is the title of the window. +# The rest of it is the program/command to be run +# in the dropdown window. + +class="$1" +title="dropdown_$class" +active="$(xdotool search --name $title | wc -l)" +shift + + +case "$active" in + 0) $TERMINAL -c "dropdown" -t "$class" -e "$@" & ;; + *) kill -9 `xdotool search --name "$class" getwindowpid` ;; +esac diff --git a/.local/bin/dwmbar b/.local/bin/dwmbar @@ -0,0 +1,26 @@ +#!/bin/sh + +# Refreshes the dwm bar using the scripts in: +# $SCRIPTS/dwm/ + +# When given the echo option, echo to stdout instead +# of refreshing (useful for debugging) + +battery=$(battery) +datetime=$(datetime) +# dropbox=$(dropbox-status) +kblayout=$(kblayout) +# mailbox=$(mailbox) +news=$(news) +vpnstatus=$(vpnstatus) +# wifi=$(wifi) +yadms=$(yadms) + +bar="$yadms|$news|$datetime|$kblayout|$vpnstatus|$battery |" + +case "$1" in + echo) echo "$bar" ;; + *) xsetroot -name "$bar" ;; +esac + + diff --git a/.local/bin/dwmbar-battery b/.local/bin/dwmbar-battery @@ -0,0 +1,22 @@ +#!/bin/sh +# Better battery manager for polybar + +# Charging:  +# Discharching:  +# Full: underscore:  +# LOW BATTERY:  + +batstatus=$(acpi | tail -n 1) + +ico="" + +# Change the underscore color according to the charging state +case "$batstatus" in + *Charging*) ico=" ";; + *Discharging*) ico="  " ;; + *) ico="  " ;; +esac + +percentage=$( echo "$batstatus" | sed "s/.*\(\ [0-9]*\)\%.*$/\1/; s/\ //g; 1q") + +echo "$ico $percentage%" diff --git a/.local/bin/emoji-copy b/.local/bin/emoji-copy @@ -0,0 +1,20 @@ +#!/bin/sh + +# Runs a prompt to choose an emoji to copy +# to the clipboard. Some font-awesome icons are +# also supported. + +choice=$( cat $SCRIPTS/utilities/.emoji-list.txt | dmenu -i -p "Emojis & Font Awesome") + +icon=$(echo $choice | sed "s/\(.\).*$/\1/") +label=$(echo $choice | sed "s/^..\(.*\)/\1/") + +printf $icon | xsel -b + +echo "$icon" + +if [[ "$icon" == "" ]]; then + notify-send "Operation Cancelled" +else + notify-send -i "$HOME/.fonts/svgs/$label.svg" "Clipboard:" "$label has been copied!" +fi diff --git a/.local/bin/extract b/.local/bin/extract @@ -0,0 +1,41 @@ +#!/bin/sh +# A general, all-purpose extraction script. +# +# Default behavior: Extract archive into new directory +# Behavior with `-c` option: Extract contents into current directory + +while getopts "hc" o; do case "${o}" in + c) extracthere="True" ;; + *) printf "Options:\\n -c: Extract archive into current directory rather than a new one.\\n" && exit ;; +esac done + +if [ -z "$extracthere" ]; then + archive="$(readlink -f "$*")" && + directory="$(echo "$archive" | sed 's/\.[^\/.]*$//')" && + mkdir -p "$directory" && + cd "$directory" || exit +else + archive="$(readlink -f "$(echo "$*" | cut -d' ' -f2)")" +fi + +[ "$archive" = "" ] && printf "Give archive to extract as argument.\\n" && exit + +if [ -f "$archive" ] ; then + case "$archive" in + *.tar.bz2|*.tar.xz|*.tbz2) tar xvjf "$archive" ;; + *.tar.gz|*.tgz) tar xvzf "$archive" ;; + *.lzma) unlzma "$archive" ;; + *.bz2) bunzip2 "$archive" ;; + *.rar) unrar x -ad "$archive" ;; + *.gz) gunzip "$archive" ;; + *.tar) tar xvf "$archive" ;; + *.zip) unzip "$archive" ;; + *.Z) uncompress "$archive" ;; + *.7z|*.xpi) 7z x "$archive" ;; + *.xz) unxz "$archive" ;; + *.exe) cabextract "$archive" ;; + *) printf "extract: '%s' - unknown archive method\\n" "$archive" ;; + esac +else + printf "File \"%s\" not found.\\n" "$archive" +fi diff --git a/.local/bin/fixaudio b/.local/bin/fixaudio @@ -0,0 +1,8 @@ +#!bin/sh + +base=$(basename "$1") +ext="${base##*.}" +base="${base%.*}" +# ffmpeg -i "$1" -itsoffset 0.350 -i "$1" -c:v h264 -c:a aac -map 0:0 -map 1:1 "$base"_synced."ext" && \ +ffmpeg -i "$1" -itsoffset 0.250 -i "$1" -map 0:v -map 1:a -c copy "$base"_synced."$ext" && \ +notify-send -i "/home/master/.fonts/svg/headphones.svg" "Audio synced" diff --git a/.local/bin/gd2pdf b/.local/bin/gd2pdf @@ -0,0 +1,3 @@ +#!/bin/sh + +groffdown "$1" | refer -PS -e -p"$REFERBIB" | groff -me -ms -kejpt -T pdf | zathura - diff --git a/.local/bin/getbib b/.local/bin/getbib @@ -0,0 +1,14 @@ +#!/bin/sh +[ -z "$1" ] && echo "Give either a pdf file or a DOI as an argument." && exit + +if [ -f "$1" ]; then + # Try to get DOI from pdfinfo or pdftotext output. + doi=$(pdfinfo "$1" | grep -io "doi:.*") || + doi=$(pdftotext "$1" 2>/dev/null - | grep -io "doi:.*" -m 1) || + exit 1 +else + doi="$1" +fi + +# Check crossref.org for the bib citation. +curl -s "http://api.crossref.org/works/$doi/transform/application/x-bibtex" -w "\\n" diff --git a/.local/bin/groffdown b/.local/bin/groffdown @@ -0,0 +1,54 @@ +#!/bin/bash + +file=$(readlink -f "$1") +dir=$(dirname "$file") +base="${file%.*}" + +output=$( sed -e '1,1d + s/title:/\.TL\n/ + s/author:/\.AU\n/ + s/date:/\.ND\n/ + s/institution:/\.AI\n/ + + s/\\begin{abstract}/\.AB/ + s/\\end{abstract}/\.AE/ + + s/^\#####.\(.*\)/\.NH 5\n\1\n\.PP/g + s/^\####.\(.*\)/\.NH 4\n\1\n\.PP/g + s/^\###.\(.*\)/\.NH 3\n\1\n\.PP/g + s/^\##.\(.*\)/\.NH 2\n\1\n\.PP/g + s/^\#.\(.*\)/\.NH 1\n\1\n\.PP/g + + s/\*\*\*\(.*\)\*\*\*$/\n\.BI\ \"\1\"\ /g + s/\*\*\*\(.*\)\*\*\*\(.\)$/\n\.BI\ \"\1\"\ \"\2\"/g + s/\*\*\*\(.*\)\*\*\*\(.\)/\n\.BI\ \"\1\"\ \"\2\"\n/g + + s/\*\*\(.*\)\*\*$/\n\.B\ \"\1\"\ /g + s/\*\*\(.*\)\*\*\(.\)$/\n\.B\ \"\1\"\ \"\2\"/g + s/\*\*\(.*\)\*\*\(.\)/\n\.B\ \"\1\"\ \"\2\"\n/g + + s/\*\(.*\)\*$/\n\.I\ \"\1\"\ /g + s/\*\(.*\)\*\(.\)$/\n\.I\ \"\1\"\ \"\2\"/g + s/\*\(.*\)\*\(.\)/\n\.I\ \"\1\"\ \"\2\"\n/g + + s/`\(.*\)`$/\n\.CW\ \"\1\"\ /g + s/`\(.*\)`\(.\)$/\n\.CW\ \"\1\"\ \"\2\"/g + s/`\(.*\)`\(.\)/\n\.CW\ \"\1\"\ \"\2\"\n/g + + s/^\ ...............-\ /.IP\ \\(bu\ 10\n/g + s/^\ ...........-\ /.IP\ \\(bu\ 8\n/g + s/^\ .......-\ /.IP\ \\(bu\ 6\n/g + s/^\ ...-\ /.IP\ \\(bu\ 4\n/g + s/^-\ /.IP\ \\(bu\ 2\n/g + s/^\ .*-\ /.IP\ \\(bu\ 12\n/g + + ' $1) +# echo "$output" | groff -me -ms -kejpt -T pdf > $base.pdf + +# echo "$output" > $base.ms +# groff -ms $base.ms -T pdf > $base.pdf + +echo "$output" + +# $output >> output.ms +# s/\*\*\*.*\*\*\*/Hi\1hi/g diff --git a/.local/bin/kblayout b/.local/bin/kblayout @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "  $(cat $HOME/.cache/layout) " diff --git a/.local/bin/layouttoggle b/.local/bin/layouttoggle @@ -0,0 +1,24 @@ +#!/bin/sh + +layout=$(cat $HOME/.cache/layout) + +case "$layout" in + ca) setxkbmap -model pc104 -layout us -variant ,, + echo us > $HOME/.cache/layout + # pkill -RTMIN+46 dwmblocks + $SCRIPTS/cron/dwmbar + ;; + us) setxkbmap -model pc104 -layout ca -variant ,, + echo ca > $HOME/.cache/layout + # pkill -RTMIN+46 dwmblocks + $SCRIPTS/cron/dwmbar + ;; + *) setxkbmap -model pc104 -layout us -variant ,, + echo us > $HOME/.cache/layout + # pkill -RTMIN+46 dwmblocks + $SCRIPTS/cron/dwmbar + ;; + esac + +# [[ "$layout" == "us" ]] && setxkbmap -model pc104 -layout ca -variant ,, ; echo ca > $HOME/.cache/layout && $SCRIPTS/cron/dwmbar +# [[ "$layout" == "us" ]] || setxkbmap -model pc104 -layout ca -variant ,, ; echo ca > $HOME/.cache/layout && $SCRIPTS/cron/dwmbar diff --git a/.local/bin/linkhandler b/.local/bin/linkhandler @@ -0,0 +1,22 @@ +#!/bin/sh + +# Feed script a url or file location. +# If an image, it will view in sxiv, +# if a video or gif, it will view in mpv +# if a music file or pdf, it will download, +# otherwise it opens link in browser. + +# If no url given. Opens browser. For using script as $BROWSER. +[ -z "$1" ] && { "$BROWSER"; exit; } + +case "$1" in + *mkv|*webm|*mp4|*youtube.com/watch*|*youtube.com/playlist*|*youtu.be*|*hooktube.com*|*bitchute.com*) + setsid -f mpv --no-config "$1" ;; + *png|*jpg|*jpe|*jpeg|*gif|*.webp) + curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///")" && sxiv -a "/tmp/$(echo "$1" | sed "s/.*\///")" >/dev/null 2>&1 & ;; + *mp3|*flac|*opus|*mp3?source*) + setsid -f tsp curl -LO "$1" >/dev/null 2>&1 ;; + *) + if [ -f "$1" ]; then "$TERMINAL" -e "$EDITOR $1" + else setsid -f "$BROWSER" "$1" >/dev/null 2>&1; fi ;; +esac diff --git a/.local/bin/makestereo b/.local/bin/makestereo @@ -0,0 +1,9 @@ +#!/bin/sh + +file=$(readlink -f "$1") +dir=$(dirname "$file") +base="${file##*/}" +ext="${base##*.}" + +ffmpeg -i $file -af "pan=stereo|FL < 1.0*FL + 0.707*FC + 0.707*BL|FR < 1.0*FR + 0.707*FC + 0.707*BR" "$dir/stereo-$base.$ext" + diff --git a/.local/bin/manualgen b/.local/bin/manualgen @@ -0,0 +1,19 @@ +#!/bin/sh + +config=$(cat $HOME/.config/sxhkd/sxhkdrc | sed " +s/^\s.*//g; +s/^#\s.*//; +s/^##\s/##\n-\ \*\*/; +s/#-#\s*/##\n-->/; +s/\s*#-#$/\n##/; +/^$/d" | awk '/##/{if (x)print x;x="";next}{x=(!x)?$0:x"**:`"$0;}STOP{print x;}' | + sed "s/-->/##\ /; + s/:\(.*\)$/:\1\`/; + s/\s+\s/+/g; + s/#\*\*:.*//") + +manual=$(cat $HOME/.config/manual.part) + +printf " $manual \n $config" | gd2pdf + +# printf " $manual \n $config" diff --git a/.local/bin/mountmenu b/.local/bin/mountmenu @@ -0,0 +1,61 @@ +#!/bin/sh +# Gives a dmenu prompt to mount unmounted drives. +# If they're in /etc/fstab, they'll be mounted automatically. +# Otherwise, you'll be prompted to give a mountpoint from already existsing directories. +# If you input a novel directory, it will prompt you to create that directory. + +getmount() { \ + [ -z "$chosen" ] && exit 1 + mp="$(find $1 | dmenu -i -l 20 -p "Type in mount point")" + [ "$mp" = "" ] && exit 1 + if [ ! -d "$mp" ]; then + mkdiryn=$(printf "No\\nYes" | dmenu -i -l 2 -p "$mp does not exist. Create it?") + [ "$mkdiryn" = "Yes" ] && (mkdir -p "$mp" || sudo -A mkdir -p "$mp") + fi + } + +mountusb() { \ + chosen="$(echo "$usbdrives" | dmenu -i -l 20 -p "Mount which drive?" | awk '{print $1}')" + sudo -A mount "$chosen" && notify-send -i "$HOME/.fonts/svg/usb.svg" -a "USB mounting" "$chosen mounted." && exit 0 + alreadymounted=$(lsblk -nrpo "name,type,mountpoint" | awk '$2=="part"&&$3!~/\/boot|\/games|\/home$|SWAP/&&length($3)>1{printf "-not \( -path *%s -prune \) \ \n",$3}') + getmount "/mnt /mount $HOME/Drives/Usb1 $HOME/Drives/Usb2 $HOME/Drives/Usb3 -type d $alreadymounted" + partitiontype="$(lsblk -no "fstype" "$chosen")" + case "$partitiontype" in + "vfat") sudo -A mount -t vfat "$chosen" "$mp" -o rw,umask=0000;; + *) sudo -A mount "$chosen" "$mp"; user="$(whoami)"; ug="$(groups | awk '{print $1}')"; sudo -A chown "$user":"$ug" 741 "$mp";; + esac + notify-send -i "$HOME/.fonts/svg/usb.svg" -a "USB mounting" "$chosen mounted to $mp." + } + +mountandroid() { \ + chosen=$(echo "$anddrives" | dmenu -i -p "Which Android device?" | cut -d : -f 1) + getmount "$HOME -maxdepth 3 -type d" + simple-mtpfs --device "$chosen" "$mp" + notify-send -i "$HOME/.fonts/svg/android.svg" -a "Android Mounting + Android device mounted to $mp." + } + +asktype() { \ + case $(printf "USB\\nAndroid" | dmenu -i -p "Mount a USB drive or Android device?") in + USB) mountusb ;; + Android) mountandroid ;; + esac + } + +anddrives=$(simple-mtpfs -l 2>/dev/null) +usbdrives="$(lsblk -rpo "name,type,size,mountpoint" | awk '$2=="part"&&$4==""{printf "%s (%s)\n",$1,$3}' | sed 's/^.*1M.*$//; /^$/d')" +echo $usbdrives + +if [ -z "$usbdrives" ]; then + [ -z "$anddrives" ] && notify-send -i "~/.fonts/svg/usb.svg" -a "USB Mounting" "No USB drive or Android device detected" && exit + echo "Android device(s) detected." + mountandroid +else + if [ -z "$anddrives" ]; then + echo "USB drive(s) detected." + mountusb + else + echo "Mountable USB drive(s) and Android device(s) detected." + asktype + fi +fi diff --git a/.local/bin/newsup b/.local/bin/newsup @@ -0,0 +1,15 @@ +#!/bin/sh +# Set as a cron job to check for new RSS entries for newsboat. +# If newsboat is open, sends it an "R" key to refresh. + +ping -q -c 1 1.1.1.1 > /dev/null || exit + +/usr/bin/notify-send -t 1 -i "$HOME/.fonts/svg/rss.svg" -a RSS "Updating RSS feeds..." + +pgrep -x newsboat >/dev/null && /usr/bin/xdotool key --window "$(/usr/bin/xdotool search --name newsboat)" R && exit + +echo "" > /tmp/newsupdate && dwmbar +pkill -RTMIN+6 i3blocks +/usr/bin/newsboat -x reload +rm -f /tmp/newsupdate +/usr/bin/notify-send -t 1 -i "$HOME/.fonts/svg/rss.svg" -a RSS "RSS feed update complete." && dwmbar diff --git a/.local/bin/opout b/.local/bin/opout @@ -0,0 +1,11 @@ +#!/bin/sh +# opout: "open output": A general handler for opening a file's intended output. +# I find this useful especially running from vim. + +basename="$(echo "$1" | sed 's/\.[^\/.]*$//')" + +case "$1" in + *.tex|*.rnw|*.gd|*.md|*.rmd|*.ms|*.me|*.mom) setsid "$READER" "$basename".pdf >/dev/null 2>&1 & ;; + *.html) setsid "$BROWSER" --new-window "$basename".html >/dev/null 2>&1 & ;; + *.sent) setsid sent "$1" >/dev/null 2>&1 & ;; +esac diff --git a/.local/bin/pacman-colors b/.local/bin/pacman-colors @@ -0,0 +1,48 @@ +#!/bin/bash +# +# ANSI color scheme script featuring PACMAN +# by pfh +# +# Initializing procedure by lolilolicon +# + +f=3 b=4 +for j in f b; do + for i in {0..7}; do + printf -v $j$i %b "\e[${!j}${i}m" + done +done +bld=$'\e[1m' +rst=$'\e[0m' +inv=$'\e[7m' + + +cat << EOF + +$rst + $f3 ▄███████▄ $f1 ▄██████▄ $f2 ▄██████▄ $f4 ▄██████▄ $f5 ▄██████▄ $f6 ▄██████▄ + $f3▄█████████▀▀ $f1▄$f7█▀█$f1██$f7█▀█$f1██▄ $f2▄█$f7█ █$f2██$f7█ █$f2█▄ $f4▄█$f7█ █$f4██$f7█ █$f4█▄ $f5▄█$f7█ █$f5██$f7█ █$f5█▄ $f6▄██$f7█▀█$f6██$f7█▀█$f6▄ + $f3███████▀ $f7▄▄ ▄▄ ▄▄ $f1█$f7▄▄█$f1██$f7▄▄█$f1███ $f2██$f7███$f2██$f7███$f2██ $f4██$f7███$f4██$f7███$f4██ $f5██$f7███$f5██$f7███$f5██ $f6███$f7█▄▄$f6██$f7█▄▄$f6█ + $f3███████▄ $f7▀▀ ▀▀ ▀▀ $f1████████████ $f2████████████ $f4████████████ $f5████████████ $f6████████████ + $f3▀█████████▄▄ $f1██▀██▀▀██▀██ $f2██▀██▀▀██▀██ $f4██▀██▀▀██▀██ $f5██▀██▀▀██▀██ $f6██▀██▀▀██▀██ + $f3 ▀███████▀ $f1▀ ▀ ▀ ▀ $f2▀ ▀ ▀ ▀ $f4▀ ▀ ▀ ▀ $f5▀ ▀ ▀ ▀ $f6▀ ▀ ▀ ▀ +$rst +EOF + +# $rst +# $f3 ▄███████▄ $f1 ▄██████▄ $f2 ▄██████▄ $f4 ▄██████▄ $f5 ▄██████▄ $f6 ▄██████▄ +# $f3▄█████████▀▀ $f1▄$f7█▀█$f1██$f7█▀█$f1██▄ $f2▄█$f7███$f2██$f7███$f2█▄ $f4▄█$f7███$f4██$f7███$f4█▄ $f5▄█$f7███$f5██$f7███$f5█▄ $f6▄██$f7█▀█$f6██$f7█▀█$f6▄ +# $f3███████▀ $f7▄▄ ▄▄ ▄▄ $f1█$f7▄▄█$f1██$f7▄▄█$f1███ $f2██$f7█ █$f2██$f7█ █$f2██ $f4██$f7█ █$f4██$f7█ █$f4██ $f5██$f7█ █$f5██$f7█ █$f5██ $f6███$f7█▄▄$f6██$f7█▄▄$f6█ +# $f3███████▄ $f7▀▀ ▀▀ ▀▀ $f1████████████ $f2████████████ $f4████████████ $f5████████████ $f6████████████ +# $f3▀█████████▄▄ $f1██▀██▀▀██▀██ $f2██▀██▀▀██▀██ $f4██▀██▀▀██▀██ $f5██▀██▀▀██▀██ $f6██▀██▀▀██▀██ +# $f3 ▀███████▀ $f1▀ ▀ ▀ ▀ $f2▀ ▀ ▀ ▀ $f4▀ ▀ ▀ ▀ $f5▀ ▀ ▀ ▀ $f6▀ ▀ ▀ ▀ +# $bld +# $f3 ▄███████▄ $f1 ▄██████▄ $f2 ▄██████▄ $f4 ▄██████▄ $f5 ▄██████▄ $f6 ▄██████▄ +# $f3▄█████████▀▀ $f1▄$f7█▀█$f1██$f7█▀█$f1██▄ $f2▄█$f7█ █$f2██$f7█ █$f2█▄ $f4▄█$f7█ █$f4██$f7█ █$f4█▄ $f5▄█$f7█ █$f5██$f7█ █$f5█▄ $f6▄██$f7█▀█$f6██$f7█▀█$f6▄ +# $f3███████▀ $f7▄▄ ▄▄ ▄▄ $f1█$f7▄▄█$f1██$f7▄▄█$f1███ $f2██$f7███$f2██$f7███$f2██ $f4██$f7███$f4██$f7███$f4██ $f5██$f7███$f5██$f7███$f5██ $f6███$f7█▄▄$f6██$f7█▄▄$f6█ +# $f3███████▄ $f7▀▀ ▀▀ ▀▀ $f1████████████ $f2████████████ $f4████████████ $f5████████████ $f6████████████ +# $f3▀█████████▄▄ $f1██▀██▀▀██▀██ $f2██▀██▀▀██▀██ $f4██▀██▀▀██▀██ $f5██▀██▀▀██▀██ $f6██▀██▀▀██▀██ +# $f3 ▀███████▀ $f1▀ ▀ ▀ ▀ $f2▀ ▀ ▀ ▀ $f4▀ ▀ ▀ ▀ $f5▀ ▀ ▀ ▀ $f6▀ ▀ ▀ ▀ +# $rst +# EOF + diff --git a/.local/bin/pipes b/.local/bin/pipes @@ -0,0 +1,136 @@ +#!/usr/bin/env bash +# pipes.sh: Animated pipes terminal screensaver. +# +# This modified version is maintained at: +# +# https://github.com/pipeseroni/pipes.sh + +VERSION=1.2.0 + +M=32768 +p=1 +f=75 s=13 r=2000 t=0 +w=80 h=24 + +resize() { + w=$(tput cols) h=$(tput lines) +} + +# ab -> idx = a*4 + b +# 0: up, 1: right, 2: down, 3: left +# 00 means going up , then going up -> ┃ +# 12 means going right, then going down -> ┓ +sets=( + "┃┏ ┓┛━┓ ┗┃┛┗ ┏━" + "│╭ ╮╯─╮ ╰│╯╰ ╭─" + "│┌ ┐┘─┐ └│┘└ ┌─" + "║╔ ╗╝═╗ ╚║╝╚ ╔═" + "|+ ++-+ +|++ +-" + "|/ \/-\ \|/\ /-" + ".. .... .... .." + ".o oo.o o.oo o." + "-\ /\|/ /-\/ \|" # railway + "╿┍ ┑┚╼┒ ┕╽┙┖ ┎╾" # knobby pipe +) +v=() +RNDSTART=0 +BOLD=1 +NOCOLOR=0 + +OPTIND=1 +while getopts "p:t:f:s:r:RBChv" arg; do +case $arg in + p) ((p=(OPTARG>0)?OPTARG:p));; + t) + if [[ "$OPTARG" = c???????????????? ]]; then + V+=(${#sets[@]}) + sets+=("${OPTARG:1}") + else + ((OPTARG>=0 && OPTARG<${#sets[@]})) && V+=($OPTARG) + fi + ;; + f) ((f=(OPTARG>19 && OPTARG<101)?OPTARG:f));; + s) ((s=(OPTARG>4 && OPTARG<16 )?OPTARG:s));; + r) ((r=(OPTARG>=0)?OPTARG:r));; + R) RNDSTART=1;; + B) BOLD=0;; + C) NOCOLOR=1;; + h) echo -e "Usage: $(basename $0) [OPTION]..." + echo -e "Animated pipes terminal screensaver.\n" + echo -e " -p [1-]\tnumber of pipes (D=1)." + echo -e " -t [0-$((${#sets[@]} - 1))]\ttype of pipes, can be used more than once (D=0)." + echo -e " -t c[16 chars]\tcustom type of pipes." + echo -e " -f [20-100]\tframerate (D=75)." + echo -e " -s [5-15]\tprobability of a straight fitting (D=13)." + echo -e " -r LIMIT\treset after x characters, 0 if no limit (D=2000)." + echo -e " -R \t\trandom starting point." + echo -e " -B \t\tno bold effect." + echo -e " -C \t\tno color." + echo -e " -h\t\thelp (this screen)." + echo -e " -v\t\tprint version number.\n" + exit 0;; + v) echo "$(basename -- "$0") $VERSION" + exit 0 + esac +done + +# set default values if not by options +((${#V[@]})) || V=(0) + +cleanup() { + # clear up standard input + read -t 0.001 && cat </dev/stdin>/dev/null + + # terminal has no smcup and rmcup capabilities + ((FORCE_RESET)) && reset && exit 0 + + tput rmcup + tput cnorm + stty echo + ((NOCOLOR)) && echo -ne '\x1b[0m' + exit 0 +} +trap resize SIGWINCH +trap cleanup HUP TERM +trap 'break 2' INT + +resize + +for (( i=1; i<=p; i++ )); do + c[i]=$((i%8)) n[i]=0 l[i]=0 + ((x[i]=RNDSTART==1?RANDOM*w/32768:w/2)) + ((y[i]=RNDSTART==1?RANDOM*h/32768:h/2)) + v[i]=${V[${#V[@]} * RANDOM / M]} +done + +stty -echo +tput smcup || FORCE_RESET=1 +tput civis +tput clear +# any key press exits the loop and this script +while REPLY=; read -t 0.0$((1000/f)) -n 1 2>/dev/null; [[ -z $REPLY ]] ; do + for (( i=1; i<=p; i++ )); do + # New position: + ((${l[i]}%2)) && ((x[i]+=-${l[i]}+2,1)) || ((y[i]+=${l[i]}-1)) + + # Loop on edges (change color on loop): + ((${x[i]}>=w||${x[i]}<0||${y[i]}>=h||${y[i]}<0)) && ((c[i]=RANDOM%8, v[i]=V[${#V[@]}*RANDOM/M])) + ((x[i]=(x[i]+w)%w)) + ((y[i]=(y[i]+h)%h)) + + # New random direction: + ((n[i]=RANDOM%s-1)) + ((n[i]=(${n[i]}>1||${n[i]}==0)?${l[i]}:${l[i]}+${n[i]})) + ((n[i]=(${n[i]}<0)?3:${n[i]}%4)) + + # Print: + tput cup ${y[i]} ${x[i]} + echo -ne "\x1b[${BOLD}m" + [[ $NOCOLOR == 0 ]] && echo -ne "\x1b[3${c[i]}m" + echo -n "${sets[v[i]]:l[i]*4+n[i]:1}" + l[i]=${n[i]} + done + ((r>0 && t*p>=r)) && tput reset && tput civis && t=0 || ((t++)) +done + +cleanup diff --git a/.local/bin/pipesx b/.local/bin/pipesx @@ -0,0 +1,207 @@ +#!/bin/bash +# Animated pipes.sh terminal screensaver at an angle. +# Copyright (c) 2013-2015 Yu-Jie Lin +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +# Website: https://github.com/pipeseroni/pipesX.sh + +VERSION=1.1.0 + +W=$(tput cols) H=$(tput lines) +# maximal random value + 1 +M=32768 + +SETS=('╱╲' '/\' '..' 'oo' '\/') +COLORS=(31 32 33 34 35 36 37) + +# default values +N=1 +T=() +I=0.05 +P=25 +R=$((W * H / 4)) + +HELP="Usage: $(basename $0) [OPTIONS] +Animated pipes.sh terminal screensaver at an angle. + +Options: + + -n [1-] number of pipes. (Default: $N) + -t [0-$((${#SETS[@]} - 1))] types of pipes, can be used more than once. (Default: $T) + -t c[2chs] custom type of pipes. + -i [float] piping interval or maze generation interval. (Default: $I) + -P [0-100] probability of a turning pipe or of \\ in maze generation. (Default: $P) + -r [LIMIT] reset after x characters, 0 if no limit. (Default: $R) + -R random starting point. + -C no color. + -X maze generation. + -h this help message. + -v print version number. +" + +while getopts "n:t:i:P:r:RCXhv" arg; do + case $arg in + n) + ((N = OPTARG > 0 ? OPTARG : N)) + ;; + t) + if [[ "$OPTARG" = c?? ]]; then + T+=(${#SETS[@]}) + SETS+=("${OPTARG:1}") + else + T+=($(((OPTARG >= 0 && OPTARG < ${#SETS[@]}) ? OPTARG : T))) + fi + ;; + i) + I=$OPTARG + ;; + P) + ((P = (OPTARG >= 0 && OPTARG <= 100) ? OPTARG : P)) + ;; + r) + ((R = OPTARG >= 0 ? OPTARG : R)) + ;; + R) + RNDSTART=1 + ;; + C) + NOCOLOR=1 + ;; + X) + MAZE=1 + ;; + h) + echo -e "$HELP" + exit 0 + ;; + v) + echo "$(basename -- "$0") $VERSION" + exit 0 + esac +done + +# set to default values if not by options +((${#T[@]})) || T=(0) + +do_exit() { + # clear up standard input + read -t 0.001 && cat </dev/stdin>/dev/null + + # terminal has no smcup and rmcup capabilities + ((FORCE_RESET)) && reset && exit 0 + + tput rmcup + tput cnorm + stty echo + ((NOCOLOR)) && echo -ne '\e[0m' + exit 0 + } +trap do_exit HUP TERM +trap 'break 2' INT + +# No echo stdin and hide the cursor +stty -echo +tput smcup || FORCE_RESET=1 +tput civis +tput clear + +# maze geneartion +while [[ $MAZE ]] && clear; do + [[ $NOCOLOR ]] || echo -ne "\e[1;${COLORS[${#COLORS[@]} * RANDOM / M]}m" + for ((i = 0; i < W * H; i++ )); do + echo -ne ${SETS[T]:100 * RANDOM / M < P:1} + done + read -t $I -n 1 && [[ $REPLY =~ q|Q ]] && do_exit +done + +# initialze values +for ((n = 0; n < N; n++)); do + ((X[n] = RNDSTART ? (W + 2) * RANDOM / M : W / 2)) + ((Y[n] = RNDSTART ? (H + 2) * RANDOM / M : H / 2)) + D[n]=$((4 * RANDOM / M)) + C[n]=${COLORS[${#COLORS[@]} * RANDOM / M]} + t[n]=${T[${#T[@]} * RANDOM / M]} +done + +clear +while REPLY=; read -t $I -n 1; [[ -z $REPLY ]] ; do + for ((n = 0; n < N; n++, CC = 0)); do + x=${X[n]} y=${Y[n]} + d=${D[n]} c=${C[n]} + + # calculate new direction `d` + # 1 0 + # \/ 4 directions 0 to 3 + # /\ + # 2 3 + # valid directions: d: dd', d' is the new direction + # d + # 0: / 00 \ 01 03 + # / / /\ + # 1: / 10 \ 11 12 + # \ \ /\ + # 2: \/ 21 / 22 / 23 + # / \ + # 3: \/ 30 \ 32 \ 33 + # / \ + ((d = (100 * RANDOM / M) < P ? ((d + 1) + 2 * (RANDOM % 2)) % 4 : d)) + ((e = (d + 1) % 4)) + + # calculate new position + # d' x' y' + # 0: x+1 y-1 + # 1: x-1 y-1 + # 2: x-1 y+1 + # 3: x+1 y+1 + ((xn = e < 2 ? x + 1 : x - 1)) + ((yn = d < 2 ? y - 1 : y + 1)) + + # adjust position and change color? + ((d < 2 && y == 0)) && ((yn--, CC=1)) + ((e > 1 && x == 0)) && ((xn--, CC=1)) + ((d > 1 && y == H)) && ((yn++, CC=1)) + ((e < 2 && x == W)) && ((xn++, CC=1)) + ((CC)) && c=${COLORS[${#COLORS[@]} * RANDOM / M]} + ((CC)) && t[n]=${T[${#T[@]} * RANDOM / M]} + + # warp pipe + ((xn = (xn + W + 1) % (W + 1))) + ((yn = (yn + H + 1) % (H + 1))) + + # calculate position in terminal + # d' xt yt + # 0: x' y'+1 + # 1: x'+1 y'+1 + # 2: x'+1 y' + # 3: x' y' + ((xt = e < 2 ? xn : xn + 1)) + ((yt = d < 2 ? yn + 1 : yn)) + + echo -ne "\e[${yt};${xt}H" + [[ $NOCOLOR ]] || echo -ne "\e[1;${c}m" + echo -n "${SETS[t[n]]:d%2:1}" + + X[n]=$xn Y[n]=$yn + D[n]=$d C[n]=$c + done + ((R)) && ((r += N, r >= R)) && r=0 && clear +done + +do_exit diff --git a/.local/bin/pod-dl b/.local/bin/pod-dl @@ -0,0 +1,30 @@ +#!/bin/sh + +tmux kill-session -t Podcast 2 > /dev/null + +file=$(tail -n 1 $HOME/.local/share/newsboat/queue) +url=$(echo $file | sed 's/."\/home.*$//') +dir=$(echo $file | sed 's/^.*"\/home/\/home/; s/.$//') + +$TERMINAL -c dropdown -t Podcast -e $SCRIPTS/utilities/tmux-vlc "$url" + +# notify-send -i "$HOME/.fonts/svg/rss.svg" "Download initiated" +# wget -LO $dir $url && \ +# notify-send -i "$HOME/.fonts/svg/rss.svg" "Download Complete" && \ +# st -e $HOME/.scripts/tools/tm-vlc $dir + + +#!/bin/sh + +# tmux kill-session -t tm-vlc +# killall -q vlc + +# file=$(cat $HOME/.local/share/newsboat/queue | sed 2q | tail -n 1) +# url=$(echo $file | sed 's/."\/home.*$//') +# dir=$(echo $file | sed 's/^.*"\/home/\/home/; s/.$//') + +# notify-send -i "$HOME/.fonts/svg/rss.svg" "Download initiated" +# setsid wget -LO $dir $url & sleep 2s && st -e $HOME/.scripts/tools/tm-vlc "$dir" && \ +# notify-send -i "$HOME/.fonts/svg/rss.svg" "Download Complete" + +# echo "" > $HOME/.local/share/newsboat/queue diff --git a/.local/bin/podentr b/.local/bin/podentr @@ -0,0 +1,5 @@ +#!/bin/bash +# entr command to run `queueandnotify` when newsboat queue is changed + +# [ "$(pgrep -x $(basename $0) | wc -l)" -gt 2 ] && exit +echo /home/master/.local/share/newsboat/queue | entr -p $SCRIPTS/handling/pod-dl 2>/dev/null & diff --git a/.local/bin/powermenu b/.local/bin/powermenu @@ -0,0 +1,11 @@ +#!/bin/sh + +choice=$(printf "Logout\\nShutdown\\nReboot\\nHibernate" | dmenu -i -p "Power Utility") + +case $choice in + *L*) $SCRIPTS/control/lockscreen ;; + *H*) systemctl suspend ;; + *R*) reboot ;; + *S*) shutdown -h now ;; + "") notify-send -i "$HOME/.fonts/svg/power-off.svg" -a Power "Operation suspended" +esac diff --git a/.local/bin/printermenu b/.local/bin/printermenu @@ -0,0 +1,3 @@ +#!/bin/sh + +lpstat -p -d | sed 's/^printer\ //; s/\ .*$//; s/no//; /^$/d' | dmenu -p "Select printer" diff --git a/.local/bin/qndl b/.local/bin/qndl @@ -0,0 +1,13 @@ +#!/bin/sh +# $1 is a url; $2 is a command +[ -z "$1" ] && exit +base="$(basename "$1")" +notify-send -i "$HOME/.fonts/svg/rss.svg" "Queuing $base..." +cmd="$2" +notify-send $cmd +[ -z "$cmd" ] && cmd="youtube-dl --add-metadata" +idnum="$(tsp $cmd "$1")" +realname="$(echo "$base" | sed "s/?\(source\|dest\).*//;s/%20/ /g")" +tsp -D "$idnum" mv "$base" "$HOME/Downloads/Podcasts/$realname" +tsp -D "$idnum" notify-send -i "$HOME/.fonts/svg/check-circle.svg" "$realname done." +tsp -D "$idnum" sleep 5s && st -e $HOME/.scripts/tools/tm-vlc "$HOME/Downloads/Podcasts/$realname" diff --git a/.local/bin/queueandnotify b/.local/bin/queueandnotify @@ -0,0 +1,15 @@ +#!/bin/sh +# Podboat sucks. This script replaces it. +# It reads the newsboat queue, queuing downloads with taskspooler. +# It also removes the junk from extentions. +queuefile="$HOME/.local/share/newsboat/queue" + +while read -r line; do + [ -z "$line" ] && continue + url="$(echo "$line" | awk '{print $1}')" + qndl "$url" "curl -LO" +done < "$queuefile" + +echo > "$queuefile" + + diff --git a/.local/bin/rain b/.local/bin/rain @@ -0,0 +1,100 @@ +#!/bin/bash +RAINS=("|" "│" "┃" "┆" "┇" "┊" "┋" "╽" "╿") +COLORS=("\e[37m" "\e[37;1m") +# More from 256 color mode +for i in {244..255}; do + COLORS=("${COLORS[@]}" "\e[38;5;${i}m") +done +NRAINS=${#RAINS[@]} +NCOLORS=${#COLORS[@]} +NUM_RAIN_METADATA=5 + + +sigwinch() { + TERM_WIDTH=$(tput cols) + TERM_HEIGHT=$(tput lines) + STEP_DURATION=0.025 + ((MAX_RAINS = TERM_WIDTH * TERM_HEIGHT / 4)) + ((MAX_RAIN_LENGTH = TERM_HEIGHT < 10 ? 1 : TERM_HEIGHT / 10)) + # In percentage + ((NEW_RAIN_ODD = TERM_HEIGHT > 50 ? 100 : TERM_HEIGHT * 2)) + ((NEW_RAIN_ODD = NEW_RAIN_ODD * 75 / 100)) + ((FALLING_ODD = TERM_HEIGHT > 25 ? 100 : TERM_HEIGHT * 4)) + ((FALLING_ODD = FALLING_ODD * 90 / 100)) + } + +do_exit() { + echo -ne "\e[${TERM_HEIGHT};1H\e[0K" + + # Show cursor and echo stdin + echo -ne "\e[?25h" + stty echo + exit 0 + } + +do_render() { + # Clean screen first + for ((idx = 0; idx < num_rains * NUM_RAIN_METADATA; idx += NUM_RAIN_METADATA)); do + X=${rains[idx]} + Y=${rains[idx + 1]} + LENGTH=${rains[idx + 4]} + for ((y = Y; y < Y + LENGTH; y++)); do + (( y < 1 || y > TERM_HEIGHT )) && continue + echo -ne "\e[${y};${X}H " + done + done + + for ((idx = 0; idx < num_rains * NUM_RAIN_METADATA; idx += NUM_RAIN_METADATA)); do + if ((100 * RANDOM / 32768 < FALLING_ODD)); then + # Falling + if ((++rains[idx + 1] > TERM_HEIGHT)); then + # Out of screen, bye sweet <3 + rains=("${rains[@]:0:idx}" + "${rains[@]:idx+NUM_RAIN_METADATA:num_rains*NUM_RAIN_METADATA}") + ((num_rains--)) + continue + fi + fi + X=${rains[idx]} + Y=${rains[idx + 1]} + RAIN=${rains[idx + 2]} + COLOR=${rains[idx + 3]} + LENGTH=${rains[idx + 4]} + for ((y = Y; y < Y + LENGTH; y++)); do + (( y < 1 || y > TERM_HEIGHT )) && continue + echo -ne "\e[${y};${X}H${COLOR}${RAIN}" + done + done + } + +trap do_exit TERM INT +trap sigwinch WINCH +# No echo stdin and hide the cursor +stty -echo +echo -ne "\e[?25l" + +echo -ne "\e[2J" +rains=() +sigwinch +while :; do + read -n 1 -t $STEP_DURATION ch + case "$ch" in + q|Q) + do_exit + ;; + esac + + if ((num_rains < MAX_RAINS)) && ((100 * RANDOM / 32768 < NEW_RAIN_ODD)); then + # Need new |, 1-based + RAIN="${RAINS[NRAINS * RANDOM / 32768]}" + COLOR="${COLORS[NCOLORS * RANDOM / 32768]}" + LENGTH=$((MAX_RAIN_LENGTH * RANDOM / 32768 + 1)) + X=$((TERM_WIDTH * RANDOM / 32768 + 1)) + Y=$((1 - LENGTH)) + rains=("${rains[@]}" "$X" "$Y" "$RAIN" "$COLOR" "$LENGTH") + ((num_rains++)) + fi + + # Let rain fall! + do_render +done+ \ No newline at end of file diff --git a/.local/bin/recordmenu b/.local/bin/recordmenu @@ -0,0 +1,105 @@ +#!/bin/sh + +# Usage: +# `record`: Ask for recording type via dmenu +# `record screencast`: Record both audio and screen +# `record video`: Record only screen +# `record audio`: Record only audio +# `record kill`: Kill existing recording +# +# If there is already a running instance, user will be prompted to end it. + +updateicon() { \ + echo "$1" > /tmp/recordingicon + pkill -RTMIN+9 i3blocks + } + +killrecording() { + recpid="$(cat /tmp/recordingpid)" + # kill with SIGTERM, allowing finishing touches. + kill -15 "$recpid" + rm -f /tmp/recordingpid + updateicon "" + pkill -RTMIN+9 i3blocks + # even after SIGTERM, ffmpeg may still run, so SIGKILL it. + sleep 3 + kill -9 "$recpid" + exit + } + +screencast() { \ + ffmpeg -y \ + -f x11grab \ + -framerate 60 \ + -s $(xdpyinfo | grep dimensions | awk '{print $2;}') \ + -i :0.0 \ + -f alsa -i default \ + -r 30 \ + -c:v libx264rgb -crf 0 -preset ultrafast -c:a flac \ + "$HOME/screencast-$(date '+%y%m%d-%H%M-%S').mkv" & + echo $! > /tmp/recordingpid + updateicon "" + } + +video() { ffmpeg \ + -f x11grab \ + -s $(xdpyinfo | grep dimensions | awk '{print $2;}') \ + -i :0.0 \ + -c:v libx264 -qp 0 -r 30 \ + "$HOME/video-$(date '+%y%m%d-%H%M-%S').mkv" & + echo $! > /tmp/recordingpid + updateicon "" + } + +webcamhidef() { ffmpeg \ + -f v4l2 \ + -i /dev/video0 \ + -video_size 1920x1080 \ + "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" & + echo $! > /tmp/recordingpid + updateicon "" + } + +webcam() { ffmpeg \ + -f v4l2 \ + -i /dev/video0 \ + -video_size 640x480 \ + "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" & + echo $! > /tmp/recordingpid + updateicon "" + } + + +audio() { \ + ffmpeg \ + -f alsa -i default \ + -c:a flac \ + "$HOME/audio-$(date '+%y%m%d-%H%M-%S').flac" & + echo $! > /tmp/recordingpid + updateicon "" + } + +askrecording() { \ + choice=$(printf "screencast\\nvideo\\naudio\\nwebcam\\nwebcam (hi-def)" | dmenu -i -p "Select recording style") + case "$choice" in + screencast) screencast;; + audio) audio;; + video) video;; + webcam) webcam;; + "webcam (hi-def)") webcamhidef;; + esac + } + +asktoend() { \ + response=$(printf "No\\nYes" | dmenu -i -p "Recording still active. End recording?") && + [ "$response" = "Yes" ] && killrecording + } + + +case "$1" in + screencast) screencast;; + audio) audio;; + video) video;; + kill) killrecording;; + *) ([ -f /tmp/recordingpid ] && asktoend && exit) || askrecording;; +esac diff --git a/.local/bin/rssadd b/.local/bin/rssadd @@ -0,0 +1,9 @@ +#!/bin/sh +! echo "$1" | grep "https*://\S\+\.[A-Za-z]\+\S*" >/dev/null && + notify-send "That doesn't look like a full URL." && exit +RSSFILE="$HOME/.config/newsboat/urls" +if awk '{print $1}' "$RSSFILE" | grep "^$1$" >/dev/null; then + notify-send "You already have this RSS feed." +else + echo "$1" >> "$RSSFILE" && notify-send "RSS feed added." +fi diff --git a/.local/bin/screenstatus b/.local/bin/screenstatus @@ -0,0 +1,4 @@ +#!/bin/sh + +notify-send.sh --replace-file /tmp/vol-notif -a "Screen Brightness" "$(xbacklight -get)%" + diff --git a/.local/bin/setbg b/.local/bin/setbg @@ -0,0 +1,20 @@ +#!/bin/sh + +# This script does the following: +# Run by itself, set the wallpaper (at X start). +# If given a file, set that as the new wallpaper. +# If given a directory, choose random file in it. +# If wal is installed, also generate a colorscheme. + +# Location of link to wallpaper link. +bgloc="${XDG_CACHE_HOME:-$HOME/.cache/}/wall.png" + +[ -f "$1" ] && ln -sf "$(readlink -f "$1")" "$bgloc" && notify-send -i "$bgloc" "Changing wallpaper..." + +[ -d "$1" ] && ln -sf "$(find "$(readlink -f "$1")" -iregex '.*.\(jpg\|jpeg\|png\|gif\)' -type f | shuf -n 1)" "$bgloc" && notify-send -i "$bgloc" "Random Wallpaper chosen." + +# # If pywal is installed, use it. +# wal -s -i "$(readlink -f "$bgloc")" -o "${XDG_CONFIG_HOME:-$HOME/.config}/wal/postrun" >/dev/null 2>&1 + +xwallpaper --zoom "$bgloc" & + diff --git a/.local/bin/shortcutgen b/.local/bin/shortcutgen @@ -0,0 +1,54 @@ +#!/bin/sh + +# Removing unecessary comments and documentation +raw=$(cat $HOME/.config/shortcutrc | tail -n +19 "$HOME/.config/shortcutrc" | sed "s/^|\s*//g; + s/\(.*\)|\(.*\)|\(.*\)|/\1|\2|\3/g; + s/\s*$//g; + /^$/d") +# #---NERDTREE---# # +echo "$raw" | sed "s/\(.*\)\s*|.*|\s\(.*\)/\1\2/g; + s/ \{1,\}/ /g; + s/.HOME/~/g; + s/-*+-*+-*|//g" > $HOME/.NERDTreeBookmarks + +# #---ZSH---# # +# be sure to source $HOME/.cache/zsh-shortcuts in your .zshrc +echo "$raw" | sed 's/^.*|\s\([A-Za-z0-9]*\)\s*|\s\(.*\)$/alias\ g\1="cd\ \2"/g; /^-*+-*+-*|$/d' > $HOME/.cache/zsh-shortcuts + +# #---RANGER---# # +# Commands implemented: +# g -> go +# m -> move to... +# t -> new tab +# Y -> copy to... +# awk '{print "map g"$1" cd "$2"\nmap t"$1" tab_new "$2"\nmap m"$1" shell mv -v %s "$2"\nmap Y"$1" shell cp -rv %s "$2}' >> "$ranger_shortcuts" +manual=$(sed -n '/Automated Shortcut Generation/q;p' $HOME/.config/ranger/shortcuts.conf) +printf '\n\n# #---Automated Shortcut Generation---#' >> $HOME/.config/ranger/shortcuts.conf +echo "$raw" | sed 's/^.*|\s\(.*\)\s|\s\(.*\)$/map\ g\1\ cd\ \2\nmap\ t\1\ tab_new\ \2\nmap\ m\1\ shell\ mv\ -v\ %s\ \2\nmap\ Y\1\ shell\ cp\ -rv\ %s\ \2\n/g; + s/.HOME/~/g; + s/^-*+-*+-*|$//g' >> $HOME/.config/ranger/shortcuts.conf + +# #---ENVIRONMENTAL VARIABLES---# # +echo "$raw" | sed 's/[A-z,a-z,0-9]*\s*|\s*/g/; + s/\s*|\s*/=/; s/$/"/; + s/-*+-*+.*$// + s/^[A-z]*=/\U&/g + s/"$//g' > ~/.cache/shell-vars + +# #---Vifm---# # +vifm=$(echo "$raw" | sed " + s/^[A-Z,a-z,0-9]*\s*|//; + s/|/:cd/; + s/\$HOME/~/; + s/^-.*//" +) +vifmgo=$( echo "$vifm" | sed " + s/\s*/nnoremap\ g/; + s/$/<cr>/" +) +echo "$vifmgo" > ~/.cache/vifm-shortcuts + +# #---Testing---# # +# echo "$raw" | sed "s/[A-z,a-z,0-9]*\s*|//" + +# echo "$raw" diff --git a/.local/bin/slendy b/.local/bin/slendy @@ -0,0 +1,35 @@ +#!/bin/sh + +initializeANSI() +{ + esc="" + + blackf="${esc}[30m"; redf="${esc}[31m"; greenf="${esc}[32m" + yellowf="${esc}[33m" bluef="${esc}[34m"; purplef="${esc}[35m" + cyanf="${esc}[36m"; whitef="${esc}[37m" + + blackb="${esc}[40m"; redb="${esc}[41m"; greenb="${esc}[42m" + yellowb="${esc}[43m" blueb="${esc}[44m"; purpleb="${esc}[45m" + cyanb="${esc}[46m"; whiteb="${esc}[47m" + + boldon="${esc}[1m"; boldoff="${esc}[22m" + italicson="${esc}[3m"; italicsoff="${esc}[23m" + ulon="${esc}[4m"; uloff="${esc}[24m" + invon="${esc}[7m"; invoff="${esc}[27m" + + reset="${esc}[0m" +} + +initializeANSI + +cat << EOF + + ${reset}${blackf}| | | | |${reset} + ${redf}█ █${reset} ${blackf}|${reset} ${greenf}█ █${reset} ${blackf}|${reset} ${yellowf}█ █${reset} ${blackf}|${reset} ${bluef}█ █${reset} ${blackf}|${reset} ${purplef}█ █${reset} ${blackf}|${reset} ${cyanf}█ █${reset} + ${redf}███████${reset} ${blackf}|${reset} ${greenf}███████${reset} ${blackf}|${reset} ${yellowf}███████${reset} ${blackf}|${reset} ${bluef}███████${reset} ${blackf}|${reset} ${purplef}███████${reset} ${blackf}|${reset} ${cyanf}███████${reset} + ${redf}███${boldon}${redb}██${reset}${redf}█${boldon}${redb}██${reset}${redf}███${reset} ${blackf}|${reset} ${greenf}███${boldon}${greenb}██${reset}${greenf}█${boldon}${greenb}██${reset}${greenf}███${reset} ${blackf}|${reset} ${yellowf}███${boldon}${yellowb}██${reset}${yellowf}█${boldon}${yellowb}██${reset}${yellowf}███${reset} ${blackf}|${reset} ${bluef}███${boldon}${blueb}██${reset}${bluef}█${boldon}${blueb}██${reset}${bluef}███${reset} ${blackf}|${reset} ${purplef}███${boldon}${purpleb}██${reset}${purplef}█${boldon}${purpleb}██${reset}${purplef}███${reset} ${blackf}|${reset} ${cyanf}███${boldon}${cyanb}██${reset}${cyanf}█${boldon}${cyanb}██${reset}${cyanf}███${reset} + ${redf}████${boldon}${redb}█${reset}${redf}████${reset} ${blackf}|${reset} ${greenf}████${boldon}${greenb}█${reset}${greenf}████${reset} ${blackf}|${reset} ${yellowf}████${boldon}${yellowb}█${reset}${yellowf}████${reset} ${blackf}|${reset} ${bluef}████${boldon}${blueb}█${reset}${bluef}████${reset} ${blackf}|${reset} ${purplef}████${boldon}${purpleb}█${reset}${purplef}████${reset} ${blackf}|${reset} ${cyanf}████${boldon}${cyanb}█${reset}${cyanf}████${reset} + ${redf}█ █ ${boldon}█${reset} ${redf}█ █${reset} ${blackf}|${reset} ${greenf}█ █ ${boldon}█${reset} ${greenf}█ █${reset} ${blackf}|${reset} ${yellowf}█ █ ${boldon}█${reset} ${yellowf}█ █${reset} ${blackf}|${reset} ${bluef}█ █ ${boldon}█${reset} ${bluef}█ █${reset} ${blackf}|${reset} ${purplef}█ █ ${boldon}█${reset} ${purplef}█ █${reset} ${blackf}|${reset} ${cyanf}█ █ ${boldon}█${reset} ${cyanf}█ █${reset} + ${redf}█ █${reset} ${blackf}|${reset} ${greenf}█ █${reset} ${blackf}|${reset} ${yellowf}█ █${reset} ${blackf}|${reset} ${bluef}█ █${reset} ${blackf}|${reset} ${purplef}█ █${reset} ${blackf}|${reset} ${cyanf}█ █${reset} + ${blackf}| | | | |${reset} +EOF+ \ No newline at end of file diff --git a/.local/bin/surfmenu b/.local/bin/surfmenu @@ -0,0 +1,4 @@ +#!/bin/sh + +url=$(cat ~/.surf/bookmarks | dmenu -i -p "Go: ") +surf "$url" diff --git a/.local/bin/tdout b/.local/bin/tdout @@ -0,0 +1,9 @@ +#!/bin/sh +# opout: "open output": A general handler for opening a file's intended output. +# I find this useful especially running from vim. + +basename="$(echo "$1" | sed 's/\.[^\/.]*$//')" + +case "$1" in + *.tex|*.rnw|*.gd|*.md|*.rmd|*.ms|*.me|*.mom) setsid "$READER" "$basename"-tdtable.pdf >/dev/null 2>&1 & ;; +esac diff --git a/.local/bin/test.sh b/.local/bin/test.sh @@ -0,0 +1,9 @@ +#!/usr/bin + +for i in $(ls ~/manjaro-dotfiles/.scripts/) +do + for j in $(ls ~/manjaro-dotfiles/.scripts/$i) + do + cp ~/manjaro-dotfiles/.scripts/$i/$j ~/.local/bin/ + done +done diff --git a/.local/bin/texclear b/.local/bin/texclear @@ -0,0 +1,32 @@ +#!/bin/sh + +# Clears the build files of a LaTeX/XeLaTeX build. +# I have vim run this file whenever I exit a .tex file. + +case "$1" in + *.tex) + file=$(readlink -f "$1") + dir=$(dirname "$file") + base="${file%.*}" + find "$dir" -maxdepth 1 -type f -regextype gnu-awk -regex "^$base\\.(4tc|xref|tmp|pyc|pyo|fls|vrb|fdb_latexmk|bak|swp|aux|log|synctex\\(busy\\)|lof|lot|maf|idx|mtc|mtc0|nav|out|snm|toc|bcf|run\\.xml|synctex\\.gz|blg|bbl)" -delete + ;; + *.rnw) + file=$(readlink -f "$1") + dir=$(dirname "$file") + base="${file%.*}" + find "$dir" -maxdepth 1 -type f -regextype gnu-awk -regex "^$base\\.(4tc|xref|tmp|pyc|pyo|fls|vrb|fdb_latexmk|bak|swp|aux|log|synctex\\(busy\\)|lof|lot|maf|idx|mtc|mtc0|nav|out|snm|toc|bcf|run\\.xml|synctex\\.gz|blg|bbl|tex|Rout)" -delete + rm "$dir"/Rplots.pdf + rm "$dir"/.Rhistory + # rm "$dir"/.Rhistory + ;; + *.rmd) + file=$(readlink -f "$1") + dir=$(dirname "$file") + base="${file%.*}" + find "$dir" -maxdepth 1 -type f -regextype gnu-awk -regex "^$base\\.(4tc|xref|tmp|pyc|pyo|fls|vrb|fdb_latexmk|bak|swp|aux|log|synctex\\(busy\\)|lof|lot|maf|idx|mtc|mtc0|nav|out|snm|toc|bcf|run\\.xml|synctex\\.gz|blg|bbl|tex|Rout)" -delete + rm "$dir"/Rplots.pdf + rm "$dir"/.Rhistory + ;; + *) printf "Give .tex, .rnw, or .rmd file as argument.\\n" ;; +esac + diff --git a/.local/bin/texinit b/.local/bin/texinit @@ -0,0 +1,6 @@ +#!/bin/sh + +cp $HOME/Dropbox/A/Scholar/All/Templates/Text/LaTeX/001personal/cegep-lanaudiere/article/* ./ +ln $BIB/citations.bib ./citations.bib +mkdir archives + diff --git a/.local/bin/tmux-mpsyt b/.local/bin/tmux-mpsyt @@ -0,0 +1,16 @@ +#!/bin/sh +# This script ensures that i3 will spawn a youtube tui. +session="mps-YouTube" + +# Check if the session exists, discarding output +# We can check $? for the exit status (zero for success, non-zero for failure) +tmux has-session -t $session 2>/dev/null + +if [ $? != 0 ]; then + # Set up your session + tmux new-session -d -s "$session" mpsyt +fi + +# Attach to created session +tmux attach-session -t $session + diff --git a/.local/bin/tmux-r b/.local/bin/tmux-r @@ -0,0 +1,18 @@ +#!/bin/sh +# This script ensures that i3 will spawn a youtube tui. +session="R" + +# Check if the session exists, discarding output +# We can check $? for the exit status (zero for success, non-zero for failure) +tmux has-session -t $session 2>/dev/null + +if [ $? != 0 ]; then + # Set up your session + tmux new-session -d -s "$session" R -q --no-save + # R -q --no-save + # ([ -e /usr/bin/R ] && R -q --no-save) || python -q +fi + +# Attach to created session +tmux attach-session -t $session + diff --git a/.local/bin/tmux-shell b/.local/bin/tmux-shell @@ -0,0 +1,18 @@ +#!/bin/sh +# This script ensures that i3 will spawn a youtube tui. +session="Shell" + +# Check if the session exists, discarding output +# We can check $? for the exit status (zero for success, non-zero for failure) +tmux has-session -t $session 2>/dev/null + +if [ $? != 0 ]; then + # Set up your session + tmux new-session -d -s "$session" zsh + # R -q --no-save + # ([ -e /usr/bin/R ] && R -q --no-save) || python -q +fi + +# Attach to created session +tmux attach-session -t $session + diff --git a/.local/bin/tmux-vlc b/.local/bin/tmux-vlc @@ -0,0 +1,19 @@ +#!/bin/sh +# This script ensures that i3 will spawn a youtube tui. +session="Podcast" +url=$1 + +# Check if the session exists, discarding output +# We can check $? for the exit status (zero for success, non-zero for failure) +tmux has-session -t $session 2>/dev/null + +if [ $? != 0 ]; then + # Set up your session + tmux new-session -d -s "$session" vlc -I ncurses "$url" + # R -q --no-save + # ([ -e /usr/bin/R ] && R -q --no-save) || python -q +fi + +# Attach to created session +tmux attach-session -t $session + diff --git a/.local/bin/todotable b/.local/bin/todotable @@ -0,0 +1,23 @@ +#!/bin/sh + +file=$(readlink -f "$1") +dir=$(dirname "$file") +base="${file%.*}" + +contents="$1" +shift +for i in "$@"; do + output=$output"\n"$(cat "$contents" | grep -n "$i" | sed 's/\([0-9]*\):.*'"$i"'.\(.*\)$/-\ \*\*'"$i"':\*\*\ \2\ (line \1)/g' + ) +done + + +if [ "$#" -eq $(printf $output | wc -l ) ]; +then + rm "$base"-tdtable.pdf + exit 0 +else + echo -e '---\ntitle: Checklist:\n.PP'"$output" | groffdown | refer -PS -e "-p$REFERBIB" | groff -me -ms -kejpt -T pdf > "$base"-tdtable.pdf +fi +# Uncomment for debugging: +# echo -e '---\ntitle: TODOs\n.PP'"$output" > "$base"-tdtable.gd diff --git a/.local/bin/trackpadtoggle b/.local/bin/trackpadtoggle @@ -0,0 +1,15 @@ +#!/bin/sh + +# Give this the 1 argument to activate the Trackpad. +# Give this 0 to disable it. + +input="$1" + +xinput --set-prop 12 "Device Enabled" $input + +case "$input" in + 0) notify-send -i "$HOME/.fonts/svg/mouse-pointer.svg" -a Trackpad "Trackpad successfully disabled" ;; + 1) notify-send -i "$HOME/.fonts/svg/mouse-pointer.svg" -a Trackpad "Trackpad successfully enabled" ;; + *) notify-send -i "$HOME/.fonts/svg/mouse-pointer.svg" -a Trackpad "Error" ;; +esac + diff --git a/.local/bin/transadd b/.local/bin/transadd @@ -0,0 +1,9 @@ +#!/bin/sh + +# Mimeapp script for adding torrent to transmission-daemon, but will also start the daemon first if not running. + +# transmission-daemon sometimes fails to take remote requests in its first moments. + +pgrep -x transmission-da || (transmission-daemon && notify-send "Starting transmission daemon..." && sleep 3 && pkill -RTMIN+7 i3blocks) + +transmission-remote -a "$@" && notify-send " Torrent added." diff --git a/.local/bin/umountmenu b/.local/bin/umountmenu @@ -0,0 +1,42 @@ +#!/bin/sh +# A dmenu prompt to unmount drives. +# Provides you with mounted partitions, select one to unmount. +# Drives mounted at /, /boot, /games and /home will not be options to unmount. + +unmountusb() { + [ -z "$drives" ] && exit + chosen=$(echo "$drives" | dmenu -i -p "Unmount which drive?" | awk '{print $1}') + [ -z "$chosen" ] && exit + sudo -A umount "$chosen" && notify-send -i "$HOME/.fonts/svg/usb.svg" -a "USB Mounting" "$chosen unmounted." + } + +unmountandroid() { \ + chosen=$(awk '/simple-mtpfs/ {print $2}' /etc/mtab | dmenu -i -p "Unmount which device?") + [ -z "$chosen" ] && exit + sudo -A umount -l "$chosen" && notify-send -i "$HOME/.fonts/svg/android.svg" -a "Android unmounting + $chosen unmounted." + } + +asktype() { \ + case "$(printf "USB\\nAndroid" | dmenu -i -p "Unmount a USB drive or Android device?")" in + USB) unmountusb ;; + Android) unmountandroid ;; + esac + } + +drives=$(lsblk -nrpo "name,type,size,mountpoint" | awk '$2=="part"&&$4!~/\/boot|\/games|\/home$|SWAP/&&length($4)>1{printf "%s (%s)\n",$4,$3}') + +if ! grep simple-mtpfs /etc/mtab; then + [ -z "$drives" ] && notify-send -i "~/.fonts/svg/usb.svg" -a "USB Mounting" "No drives to unmount." && exit + echo "Unmountable USB drive detected." + unmountusb +else + if [ -z "$drives" ] + then + echo "Unmountable Android device detected." + unmountandroid + else + echo "Unmountable USB drive(s) and Android device(s) detected." + asktype + fi +fi diff --git a/.local/bin/unix b/.local/bin/unix @@ -0,0 +1,25 @@ +#!/bin/sh +#original artwork by http://www.sanderfocus.nl/#/portfolio/tech-heroes +#converted to shell by #nixers @ irc.unix.chat + +cat << 'eof' + ,_ ,_==▄▂ + , ▂▃▄▄▅▅▅▂▅¾. / / + ▄▆<´ "»▓▓▓%\ / / / / + ,▅7" ´>▓▓▓% / / > / >/% + ▐¶▓ ,»▓▓¾´ /> %/%// / / + ▓▃▅▅▅▃,,▄▅▅▅Æ\// ///>// />/ / + V║«¼.;→ ║<«.,`=// />//%/% / / + //╠<´ -²,)(▓~"-╝/¾/ %/>/ /> + / / / ▐% -./▄▃▄▅▐, /7//;//% / / + / ////`▌▐ %zWv xX▓▇▌//&;% / / + / / / %//%/¾½´▌▃▄▄▄▄▃▃▐¶\/& / + </ /</%//`▓!%▓%╣[38;5;255;╣WY<Y)y&/`\ + / / %/%//</%//\i7; ╠N>)VY>7; \_ UNIX IS VERY SIMPLE IT JUST NEEDS A + / /</ //<///<_/%\▓ V%W%£)XY _/%‾\_, GENIUS TO UNDERSTAND ITS SIMPLICITY + / / //%/_,=--^/%/%%\¾%¶%%} /%%%%%%;\, + %/< /_/ %%%%%;X%%\%%;, _/%%%;, \ + / / %%%%%%;, \%%l%%;// _/%;, dmr + / %%%;, <;\-=-/ / + ;, l +eof+ \ No newline at end of file diff --git a/.local/bin/vifmrun b/.local/bin/vifmrun @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +export FIFO_UEBERZUG="/tmp/vifm-ueberzug-${PPID}" + +function cleanup() { + rm "$FIFO_UEBERZUG" 2>/dev/null + pkill -P $$ 2>/dev/null +} + +rm "$FIFO_UEBERZUG" 2>/dev/null +mkfifo "$FIFO_UEBERZUG" +trap cleanup EXIT +tail --follow "$FIFO_UEBERZUG" | ueberzug layer --silent --parser bash & + +vifm "$@" +cleanup diff --git a/.local/bin/volumectl b/.local/bin/volumectl @@ -0,0 +1,23 @@ +#!/bin/bash + +# Usage: + +# The first argument is the percentage by which you should +# change the volume + +# The second argument should be `+` or `-` +# to choose wether to increment or decrement audio. +# If no second argument is given, the audio will be SET +# to a set percentage fixed by the first argument. +case "$1" in + mute) amixer set Master toggle ;; + *) pcnt="$1" + sign="$2" + amixer set Master $pcnt%$sign ;; +esac + +mute="" +vol=$(awk '/%/ {gsub(/[\[\]]/,""); print $4}' <(amixer sget Master)) +amixer sget Master | grep off && mute="(muted)" +notify-send.sh -t 1000 --replace-file /tmp/vol-notif -a Volume "$vol $mute" + diff --git a/.local/bin/vpnmenu b/.local/bin/vpnmenu @@ -0,0 +1,14 @@ +#!/bin/sh + +current=$(expressvpn status | sed "s/.......................//; 1q") + +location=$(expressvpn list recomend | sed "1,4d; s/^.*\t//" | head | dmenu -l 10) + +if [ ! -n "$location" ] +then + notify-send -i "$HOME/.fonts/svg/shield.svg" -a "VPN Module" "Operation aborted" +else + expressvpn disconnect; expressvpn connect "$location" +fi + +# expressvpn disconnect; expressvpn connect "$location" diff --git a/.local/bin/vpnstatus b/.local/bin/vpnstatus @@ -0,0 +1,25 @@ +#!/bin/bash +# Outputs if Express VPN is connected or not + +vpnstatus=$(expressvpn status | head -n 1) + +case "$vpnstatus" in + *"Not"*) icon="" + ;; + *"Connected"*) icon="" + ;; + *"Connecting"*) icon=" " + ;; + *) icon="" +esac + +echo " $icon " + + +# \033]01;31\] # pink +# \033]00m\] # white +# \033]01;36\] # bold green +# \033]02;36\] # green +# \033]01;34\] # blue +# \033]01;33\] # bold yellow +# s/onnected\sto\s//; diff --git a/.local/bin/websearch b/.local/bin/websearch @@ -0,0 +1,31 @@ +#!/bin/sh +# Gives a dmenu prompt to search Google. +# Without input, will open Google.com. +# URLs will be directly handed to the browser. +# Anything else, it search it. + +query=$(printf " " | dmenu -i -p " Search Google") + +echo "$query" | head -c 1 + +if [ $(echo "$query" | head -c 1) == "\!" ]; then + $BROWSER "https://duckduckgo.com/?q=$query&t=ffab&atb=v1-1" +else + $BROWSER "https://google.com/?q=$query&t=ffab&atb=v1-1" +fi + + +# # pgrep -x dmenu && exit +# # pgrep -x dmenu + +# choice=$(echo "" | dmenu -i -p " Search DuckDuckGo") || exit 1 + +# if [ "$choice" = "" ]; then +# firefox "https://duckduckgo.com" +# else +# if echo "$choice" | grep "^(http:\/\/|https:\/\/)?[a-zA-Z0-9]+\.[a-zA-Z]+(/)?.*$"; then +# firefox "$choice" +# else +# firefox "https://duckduckgo.com/?q=$choice&t=ffab&atb=v1-1" +# fi +# fi diff --git a/.local/bin/wifi b/.local/bin/wifi @@ -0,0 +1,10 @@ +#!/bin/sh + +case "$(cat /sys/class/net/wlp0s20f3/operstate)" in + up) echo "  " ;; + down) echo "  " ;; +esac + +#  +#  +#  diff --git a/.local/bin/yadms b/.local/bin/yadms @@ -0,0 +1,15 @@ +#!/bin/bash + +dotfiles=$(yadm status | sed '1,3d; + 5,$d; + s/.$//g') + +if [[ ${dotfiles:0:1} == "n" ]]; then + warn="" +else + warn="  " +fi + + + +echo "  $warn" diff --git a/.profile b/.profile @@ -0,0 +1,48 @@ +export GOPATH=$HOME/.go +export SCRIPTS=$HOME/.scripts +export PATH="$PATH:$(du "$HOME/.scripts/" | cut -f2 | tr '\n' ':')" +export PATH=$PATH:/root/.local/bin +export PATH=$PATH:$HOME/.local/bin +export PATH=$PATH:$HOME/.cargo/bin +export PATH=$GOPATH/bin:$PATH +export QT_QPA_PLATFORMTHEME="qt5ct" +export EDITOR=/usr/bin/nvim +export READER=/usr/bin/zathura +export GTK2_RC_FILES="$HOME/.gtkrc-2.0" +export QT_QPA_PLATFORMTHEME="qt5ct" +export GRDB="dropbox://default@/git-private" +export TERM=st +export TERMINAL=st +export BIB=$HOME/Dropbox/A/Scholar/All/References +export REFERBIB=$HOME/Dropbox/A/Scholar/All/References/bibliography.refer +export DISTRIB_ID=arch +export DISTRIB_RELEASE=$(uname -r) +# export GOROOT=/usr/bin/go + +# fix "xdg-open fork-bomb" export your preferred browser from here +export BROWSER=firefox + +# less/man colors +export LESS=-R +export LESS_TERMCAP_mb="$(printf '%b' '')" # begin bold +export LESS_TERMCAP_md="$(printf '%b' '')" # begin blink +export LESS_TERMCAP_me="$(printf '%b' '')" # reset bold/blink +export LESS_TERMCAP_so="$(printf '%b' '')" # begin reverse video +export LESS_TERMCAP_se="$(printf '%b' '')" # reset reverse video +export LESS_TERMCAP_us="$(printf '%b' '')" #begin underline +export LESS_TERMCAP_ue="$(printf '%b' '')" # reset underline + +# Start Desktop Environment if on the main TTY +if [[ -z $DISPLAY ]] && [[ $(tty) = /dev/tty1 ]]; then +startx +fi + +# Map CAPS_LOCK correctly: +$SCRIPTS/remaps + +# gh completion +eval "$(gh completion -s zsh)" + +# Generate shortcuts and aliases +shortcutgen +aliasgen diff --git a/.tmux.conf b/.tmux.conf @@ -0,0 +1,113 @@ +set -g prefix C-a +setw -g mode-keys vi + +# split panes using | and - +bind | split-window -h +bind = split-window -v +unbind '"' +unbind % +# reload config file (change file location to your the tmux.conf you want to use) +bind r source-file ~/.tmux.conf +# switch panes using Alt-arrow without prefix +bind -n M-Left select-pane -L +bind -n M-Right select-pane -R +bind -n M-Up select-pane -U +bind -n M-Down select-pane -D +# don't rename windows automatically +set-option -g allow-rename off + +# escape-time +set -sg escape-time 0 + +# Shell naming +set-option -g set-titles on +set-option -g set-titles-string "dropdown_#S" + +# move around panes with hjkl, as one would in vim after pressing ctrl-w +bind h select-pane -L +bind j select-pane -D +bind k select-pane -U +bind l select-pane -R + +# swap pane +bind-key -n C-S-Left swap-window -t -1 +bind-key -n C-S-Right swap-window -t +1 + +# resize panes like vim +# feel free to change the "1" to however many lines you want to resize by, only +# one at a time can be slow +bind < resize-pane -L 10 +bind > resize-pane -R 10 +bind - resize-pane -D 10 +bind + resize-pane -U 10 + +# sync panes +bind b setw synchronize-panes\; display 'Synchronize-panes' + +# vi-style controls for copy mode +setw -g mode-keys vi + +# force a reload of the config file +unbind r +bind r source-file ~/.tmux.conf\; display "Reloaded!" + +# main vertical layout settings +bind M-6 set-window-option main-pane-width '165'\; select-layout main-vertical + +# set window and pane index to 1 (0 by default) +set-option -g base-index 1 +setw -g pane-base-index 1 + +# set -g renumber-windows on + +# unicode support +#setw -g utf8 on +#set -g status-utf8 on + +# listen to alerts from all windows +set -g bell-action any + +# auto rename window +set-option -g allow-rename off + +set-option history-file ~/.tmux/.tmux_history + +#.......... +# Status line - http://dotshare.it/dots/963/ +# Colours, +# for i in {0..255} ; do +# printf "\x1b[38;5;${i}mcolour${i}\n" +# done +#.......... +set -g status-left '' +set -g status-justify right +set -g status-position bottom +# set -g status-right '#[fg=colour176,bold,bg=colour236,bold] %B #[fg=colour146,bold,bg=colour236,bold]%d, #[fg=colour173,bold,bg=colour236,bold]%Y#[fg=default] #[fg=colour234,bold,bg=colour12,bold] %R ' +set -g status-right '' +set -g status-right-length 100 +set -g status-bg default + +# Dusk and black +# setw -g window-status-format '#[fg=colour180,bold,bg=colour236,bold] #I #[fg=colour236,bold,bg=colour180,bold] #W ' +# setw -g window-status-current-format '#[fg=colour236,bold,bg=colour180,bold] #I #[fg=colour180,bold,bg=colour236,bold] #W ' + +# Black and white +setw -g window-status-format '#[fg=white,bg=default]#{?window_zoomed_flag,(, }#I #W#{?window_zoomed_flag,), }' +# setw -g window-status-current-format '#[fg=colour232,bold,bg=white,bold] #I #W ' +#setw -g window-status-current-format '#{?window_zoomed_flag,#[bg=white]#[fg=red](,}#[fg=colour232,bold,bg=white,bold]#I #W#{?window_zoomed_flag,#[fg=red]),}' +setw -g window-status-current-format '#[fg=colour232,bold,bg=white]#{?window_zoomed_flag,(, }#I #W#{?window_zoomed_flag,), }' + +# Bold Purple and black +# setw -g window-status-format '#[fg=colour213,bg=colour236] #I #[fg=colour213,bg=colour236] #W ' +# setw -g window-status-current-format '#[fg=colour236,bold,bg=colour213,bold] #I #[fg=colour213,bold,bg=colour236,bold] #W ' + +# Chark Purple and black +# setw -g window-status-format '#[fg=colour176,bg=colour236] #I #[fg=colour176,bg=colour236] #W ' +# setw -g window-status-current-format '#[fg=colour236,bold,bg=colour176,bold] #I #[fg=colour176,bold,bg=colour236,bold] #W ' + +setw -g window-status-format '#[fg=colour1,bg=colour1] #I #[fg=colour253,bg=colour52] #W ' +setw -g window-status-current-format '#[fg=colour30,bold,bg=colour253,bold] #I #[fg=colour253,bold,bg=colour30,bold] #W ' +#.......... +# Other good status line +# 1. http://dotshare.it/dots/586/ +#.......... diff --git a/.xinitrc b/.xinitrc @@ -0,0 +1,21 @@ +xwallpaper --zoom ~/.cache/wall.png & +crond & +crond -f $HOME/.config/scron/crontab & +nm-applet & +blueman-applet & +pnmixer & +dropbox & +sxhkd & +$SCRIPTS/remaps & +dunst & +protonmail-bridge --no-window & +xautolock -time 5 -detectsleep -locker slock & +picom -b & +flashfocus & +echo "/tmp/imapsyncicon_$USER" | entr $SCRIPTS/cron/dwmbar & +echo "" > $HOME/.local/share/newsboat/queue +echo us > $HOME/.cache/layout +xrdb -load $HOME/.Xresources +$SCRIPTS/cron/dwmbar & +exec dwm +# vim:filetype=sh diff --git a/.zshrc b/.zshrc @@ -0,0 +1,101 @@ +# ______ _____ _ _ +# |___ // ____| | | | +# / /| (___ | |__| | +# / / \___ \| __ | +# / /__ ____) | | | | +# /_____|_____/|_| |_| +# + +# The following lines were added by compinstall +zstyle ':completion:*' completer _complete _ignored _correct _approximate +zstyle ':completion:*' file-sort name +zstyle ':completion:*' matcher-list '' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' 'r:|[._-,]=** r:|=**' +zstyle ':completion:*' preserve-prefix '//[^/]##/' +zstyle ':completion:*' squeeze-slashes true +zstyle :compinstall filename '/home/master/.zshrc' + +autoload -Uz compinit +zstyle ':completion:*' menu select +zmodload zsh/complist + +compinit +# End of lines added by compinstall + +# Vim keys in tab complete menu: +bindkey -M menuselect 'h' vi-backward-char +bindkey -M menuselect 'k' vi-up-line-or-history +bindkey -M menuselect 'l' vi-forward-char +bindkey -M menuselect 'j' vi-down-line-or-history + +export KEYTIMEOUT=1 + +# Change cursor shape for different vi modes. +function zle-keymap-select { + if [[ ${KEYMAP} == vicmd ]] || + [[ $1 = 'block' ]]; then + echo -ne '\e[1 q' + + elif [[ ${KEYMAP} == main ]] || + [[ ${KEYMAP} == viins ]] || + [[ ${KEYMAP} = '' ]] || + [[ $1 = 'beam' ]]; then + echo -ne '\e[5 q' + fi +} +zle -N zle-keymap-select + +zle-line-init() { + zle -K viins # initiate `vi insert` as keymap (can be removed if `bindkey -V` has been set elsewhere) + echo -ne "\e[5 q" +} +zle -N zle-line-init + +# Use beam shape cursor on startup. +echo -ne '\e[5 q' +# Use beam shape cursor for each new prompt. +preexec() { echo -ne '\e[5 q' ;} + + +# Lines configured by zsh-newuser-install +HISTFILE=~/.cache/zsh-history +HISTSIZE=1000 +SAVEHIST=10000 +setopt appendhistory autocd extendedglob nomatch +unsetopt beep notify +bindkey -v +# End of lines configured by zsh-newuser-install + +# Git current branch setup +autoload -Uz vcs_info +precmd_vcs_info() { vcs_info } +precmd_functions+=( precmd_vcs_info ) +setopt prompt_subst + +# Prompt theme +PROMPT=" %B%F{blue}π %b%F{yellow}" +RPROMPT="\$vcs_info_msg_0_ %B%F{magenta}(%B%F{cyan}%1/%B%F{magenta})" + +zstyle ':vcs_info:git:*' formats '%b' + +# Loading shortcuts made by aliasgen and shortcutgen +source $HOME/.cache/zsh-aliases* +source $HOME/.cache/zsh-shortcuts +source $HOME/.cache/shell-vars + +# Making ranger useful: +alias ranger='ranger --choosedir=$HOME/.rangerdir; LASTDIR=`cat $HOME/.rangerdir`; cd "$LASTDIR"' + +# Vifm with sensible cd option +vicd() +{ + local dst="$(command vifmrun --choose-dir - "$@")" + [[ "$dst" == "" ]] && \ + echo 'Directory picking cancelled/failed' && \ + return 1 \ + || cd "$dst" +} + +# Load zsh-syntax-highlighting; should be last. +source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh 2>/dev/null + +eval $(thefuck --alias)