rice

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 5d3605d78adc143124cc5abc35ef87d5bbe0f5f3
Author: Mark Feller <mark.feller@member.fsf.org>
Date:   Sat, 10 Nov 2018 13:28:08 -0700

initial commit

Diffstat:
A.config/alacritty/alacritty.yml | 457+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/htop/htoprc | 26++++++++++++++++++++++++++
A.config/mpd/mpd.conf | 14++++++++++++++
A.config/ncmpcpp/bindings | 504+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/ncmpcpp/config | 56++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/ncmpcpp/error.log | 0
A.config/neofetch/config.conf | 771+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/notmuch/config | 25+++++++++++++++++++++++++
A.config/nvim/init.vim | 3+++
A.config/oh-my-zsh | 1+
A.config/zsh/.zcompdump | 1619+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/zsh/.zsh-update | 1+
A.config/zsh/oh-my-zsh.sh | 113+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.gitignore | 11+++++++++++
A.oh-my-zsh | 1+
A.scripts/compiler | 34++++++++++++++++++++++++++++++++++
A.tmux.conf | 107+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.vim/autoload/plug.vim | 2458+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.vim/init.vim | 1+
A.vim/plugged/SyntaxAttr.vim | 1+
A.vim/plugged/auto-pairs | 1+
A.vim/plugged/ctrlp.vim | 1+
A.vim/plugged/goyo.vim | 1+
A.vim/plugged/gruvbox | 1+
A.vim/plugged/neocomplete.vim | 1+
A.vim/plugged/nerdtree | 1+
A.vim/plugged/rust.vim | 1+
A.vim/plugged/vim-airline | 1+
A.vim/plugged/vim-airline-themes | 1+
A.vim/plugged/vim-commentary | 1+
A.vim/plugged/vim-delve | 1+
A.vim/plugged/vim-easy-align | 1+
A.vim/plugged/vim-fugitive | 1+
A.vim/plugged/vim-go | 1+
A.vim/plugged/vim-ledger | 1+
A.vim/plugged/vim-racer | 1+
A.vim/plugged/vim-surround | 1+
A.vim/plugged/vim-toml | 1+
A.vim/plugged/vim-yaml | 1+
A.vim/plugged/xterm-color-table.vim | 1+
A.vim/plugged/youcompleteme | 1+
A.vimrc | 25+++++++++++++++++++++++++
A.zshenv | 50++++++++++++++++++++++++++++++++++++++++++++++++++
A.zshrc | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AREADME | 3+++
Alink.sh | 36++++++++++++++++++++++++++++++++++++
Aprogs.csv | 23+++++++++++++++++++++++
47 files changed, 6438 insertions(+), 0 deletions(-)

diff --git a/.config/alacritty/alacritty.yml b/.config/alacritty/alacritty.yml @@ -0,0 +1,457 @@ +# Configuration for Alacritty, the GPU enhanced terminal emulator + +# Any items in the `env` entry below will be added as +# environment variables. Some entries may override variables +# set by alacritty it self. +env: + # TERM env customization. + # + # If this property is not set, alacritty will set it to xterm-256color. + # + # Note that some xterm terminfo databases don't declare support for italics. + # You can verify this by checking for the presence of `smso` and `sitm` in + # `infocmp xterm-256color`. + TERM: xterm-256color + +window: + # Window dimensions in character columns and lines + # (changes require restart) + dimensions: + columns: 160 + lines: 50 + + # Adds this many blank pixels of padding around the window + # Units are physical pixels; this is not DPI aware. + # (change requires restart) + padding: + x: 45 + y: 45 + + # Window decorations + # Setting this to false will result in window without borders and title bar. + decorations: transparent + +# Display tabs using this many cells (changes require restart) +tabspaces: 8 + +# When true, bold text is drawn using the bright variant of colors. +draw_bold_text_with_bright_colors: true + +# Font configuration (changes require restart) +font: + # The normal (roman) font face to use. + normal: + family: Fira Mono + # Style can be specified to pick a specific face. + # style: Regular + + # The bold font face + bold: + family: Fira Mono + # Style can be specified to pick a specific face. + # style: Bold + + # The italic font face + italic: + family: Fira Mono + # Style can be specified to pick a specific face. + # style: Italic + + # Point size of the font + size: 12.0 + + # Offset is the extra space around each character. offset.y can be thought of + # as modifying the linespacing, and offset.x as modifying the letter spacing. + offset: + x: 0 + y: 0 + + # Glyph offset determines the locations of the glyphs within their cells with + # the default being at the bottom. Increase the x offset to move the glyph to + # the right, increase the y offset to move the glyph upward. + glyph_offset: + x: 0 + y: 0 + + # OS X only: use thin stroke font rendering. Thin strokes are suitable + # for retina displays, but for non-retina you probably want this set to + # false. + use_thin_strokes: false + +# Should display the render timer +render_timer: false + +# Use custom cursor colors. If true, display the cursor in the cursor.foreground +# and cursor.background colors, otherwise invert the colors of the cursor. +custom_cursor_colors: false + +# Colors (Tomorrow Night Bright) +colors: + # Default colors + primary: + background: '#1d2021' + foreground: '#ebdbb2' + + # Colors the cursor will use if `custom_cursor_colors` is true + cursor: + text: '#282828' + cursor: '#ebdbb2' + + # Normal colors + normal: + black: '#282828' + red: '#cc241d' + green: '#98971a' + yellow: '#d79921' + blue: '#458588' + magenta: '#b16286' + cyan: '#689d6a' + white: '#a89984' + + # Bright colors + bright: + black: '#928374' + red: '#fb4934' + green: '#b8bb26' + yellow: '#fabd2f' + blue: '#83a598' + magenta: '#d3869b' + cyan: '#8ec07c' + white: '#ebdbb2' + + # # Dim colors (Optional) + # dim: + # black: '0x333333' + # red: '0xf2777a' + # green: '0x99cc99' + # yellow: '0xffcc66' + # blue: '0x6699cc' + # magenta: '0xcc99cc' + # cyan: '0x66cccc' + # white: '0xdddddd' + + +# Visual Bell +# +# Any time the BEL code is received, Alacritty "rings" the visual bell. Once +# rung, the terminal background will be set to white and transition back to the +# default background color. You can control the rate of this transition by +# setting the `duration` property (represented in milliseconds). You can also +# configure the transition function by setting the `animation` property. +# +# Possible values for `animation` +# `Ease` +# `EaseOut` +# `EaseOutSine` +# `EaseOutQuad` +# `EaseOutCubic` +# `EaseOutQuart` +# `EaseOutQuint` +# `EaseOutExpo` +# `EaseOutCirc` +# `Linear` +# +# To completely disable the visual bell, set its duration to 0. +# +visual_bell: + animation: EaseOutExpo + duration: 0 + +# Background opacity +background_opacity: 1.0 + +# Mouse bindings +# +# Currently doesn't support modifiers. Both the `mouse` and `action` fields must +# be specified. +# +# Values for `mouse`: +# - Middle +# - Left +# - Right +# - Numeric identifier such as `5` +# +# Values for `action`: +# - Paste +# - PasteSelection +# - Copy (TODO) +mouse_bindings: + - { mouse: Middle, action: PasteSelection } + +mouse: + # Click settings + # + # The `double_click` and `triple_click` settings control the time + # alacritty should wait for accepting multiple clicks as one double + # or triple click. + double_click: { threshold: 300 } + triple_click: { threshold: 300 } + + # Faux Scrollback + # + # The `faux_scrollback_lines` setting controls the number + # of lines the terminal should scroll when the alternate + # screen buffer is active. This is used to allow mouse + # scrolling for applications like `man`. + # + # To disable this completely, set `faux_scrollback_lines` to 0. + faux_scrollback_lines: 1 + +selection: + semantic_escape_chars: ",│`|:\"' ()[]{}<>" + +dynamic_title: true + +hide_cursor_when_typing: true + +# Style of the cursor +# +# Values for 'cursor_style': +# - Block +# - Underline +# - Beam +cursor_style: Block + +# Live config reload (changes require restart) +live_config_reload: true + +# Shell +# +# You can set shell.program to the path of your favorite shell, e.g. /bin/fish. +# Entries in shell.args are passed unmodified as arguments to the shell. +# +shell: + program: /bin/zsh +# args: +# - --login + +# Key bindings +# +# Each binding is defined as an object with some properties. Most of the +# properties are optional. All of the alphabetical keys should have a letter for +# the `key` value such as `V`. Function keys are probably what you would expect +# as well (F1, F2, ..). The number keys above the main keyboard are encoded as +# `Key1`, `Key2`, etc. Keys on the number pad are encoded `Number1`, `Number2`, +# etc. These all match the glutin::VirtualKeyCode variants. +# +# A list with all available `key` names can be found here: +# https://docs.rs/glutin/*/glutin/enum.VirtualKeyCode.html#variants +# +# Possible values for `mods` +# `Command`, `Super` refer to the super/command/windows key +# `Control` for the control key +# `Shift` for the Shift key +# `Alt` and `Option` refer to alt/option +# +# mods may be combined with a `|`. For example, requiring control and shift +# looks like: +# +# mods: Control|Shift +# +# The parser is currently quite sensitive to whitespace and capitalization - +# capitalization must match exactly, and piped items must not have whitespace +# around them. +# +# Either an `action`, `chars`, or `command` field must be present. +# `action` must be one of `Paste`, `PasteSelection`, `Copy`, or `Quit`. +# `chars` writes the specified string every time that binding is activated. +# These should generally be escape sequences, but they can be configured to +# send arbitrary strings of bytes. +# `command` must be a map containing a `program` string, and `args` array of +# strings. For example: +# - { ... , command: { program: "alacritty", args: ["-e", "vttest"] } } +key_bindings: + - { key: V, mods: Command, action: Paste } + - { key: C, mods: Command, action: Copy } + - { key: Q, mods: Command, action: Quit } + - { key: W, mods: Command, action: Quit } + - { key: Home, chars: "\x1bOH", mode: AppCursor } + - { key: Home, chars: "\x1b[H", mode: ~AppCursor } + - { key: End, chars: "\x1bOF", mode: AppCursor } + - { key: End, chars: "\x1b[F", mode: ~AppCursor } + - { key: Key0, mods: Command, action: ResetFontSize } + - { key: Equals, mods: Command, action: IncreaseFontSize } + - { key: Minus, mods: Command, action: DecreaseFontSize } + - { key: PageUp, mods: Shift, chars: "\x1b[5;2~" } + - { key: PageUp, mods: Control, chars: "\x1b[5;5~" } + - { key: PageUp, chars: "\x1b[5~" } + - { key: PageDown, mods: Shift, chars: "\x1b[6;2~" } + - { key: PageDown, mods: Control, chars: "\x1b[6;5~" } + - { key: PageDown, chars: "\x1b[6~" } + - { key: Tab, mods: Shift, chars: "\x1b[Z" } + - { key: Back, chars: "\x7f" } + - { key: Back, mods: Alt, chars: "\x1b\x7f" } + - { key: Insert, chars: "\x1b[2~" } + - { key: Delete, chars: "\x1b[3~" } + - { key: Left, mods: Shift, chars: "\x1b[1;2D" } + - { key: Left, mods: Control, chars: "\x1b[1;5D" } + - { key: Left, mods: Alt, chars: "\x1b[1;3D" } + - { key: Left, chars: "\x1b[D", mode: ~AppCursor } + - { key: Left, chars: "\x1bOD", mode: AppCursor } + - { key: Right, mods: Shift, chars: "\x1b[1;2C" } + - { key: Right, mods: Control, chars: "\x1b[1;5C" } + - { key: Right, mods: Alt, chars: "\x1b[1;3C" } + - { key: Right, chars: "\x1b[C", mode: ~AppCursor } + - { key: Right, chars: "\x1bOC", mode: AppCursor } + - { key: Up, mods: Shift, chars: "\x1b[1;2A" } + - { key: Up, mods: Control, chars: "\x1b[1;5A" } + - { key: Up, mods: Alt, chars: "\x1b[1;3A" } + - { key: Up, chars: "\x1b[A", mode: ~AppCursor } + - { key: Up, chars: "\x1bOA", mode: AppCursor } + - { key: Down, mods: Shift, chars: "\x1b[1;2B" } + - { key: Down, mods: Control, chars: "\x1b[1;5B" } + - { key: Down, mods: Alt, chars: "\x1b[1;3B" } + - { key: Down, chars: "\x1b[B", mode: ~AppCursor } + - { key: Down, chars: "\x1bOB", mode: AppCursor } + - { key: F1, chars: "\x1bOP" } + - { key: F2, chars: "\x1bOQ" } + - { key: F3, chars: "\x1bOR" } + - { key: F4, chars: "\x1bOS" } + - { key: F5, chars: "\x1b[15~" } + - { key: F6, chars: "\x1b[17~" } + - { key: F7, chars: "\x1b[18~" } + - { key: F8, chars: "\x1b[19~" } + - { key: F9, chars: "\x1b[20~" } + - { key: F10, chars: "\x1b[21~" } + - { key: F11, chars: "\x1b[23~" } + - { key: F12, chars: "\x1b[24~" } + - { key: F1, mods: Shift, chars: "\x1b[1;2P" } + - { key: F2, mods: Shift, chars: "\x1b[1;2Q" } + - { key: F3, mods: Shift, chars: "\x1b[1;2R" } + - { key: F4, mods: Shift, chars: "\x1b[1;2S" } + - { key: F5, mods: Shift, chars: "\x1b[15;2~" } + - { key: F6, mods: Shift, chars: "\x1b[17;2~" } + - { key: F7, mods: Shift, chars: "\x1b[18;2~" } + - { key: F8, mods: Shift, chars: "\x1b[19;2~" } + - { key: F9, mods: Shift, chars: "\x1b[20;2~" } + - { key: F10, mods: Shift, chars: "\x1b[21;2~" } + - { key: F11, mods: Shift, chars: "\x1b[23;2~" } + - { key: F12, mods: Shift, chars: "\x1b[24;2~" } + - { key: F1, mods: Control, chars: "\x1b[1;5P" } + - { key: F2, mods: Control, chars: "\x1b[1;5Q" } + - { key: F3, mods: Control, chars: "\x1b[1;5R" } + - { key: F4, mods: Control, chars: "\x1b[1;5S" } + - { key: F5, mods: Control, chars: "\x1b[15;5~" } + - { key: F6, mods: Control, chars: "\x1b[17;5~" } + - { key: F7, mods: Control, chars: "\x1b[18;5~" } + - { key: F8, mods: Control, chars: "\x1b[19;5~" } + - { key: F9, mods: Control, chars: "\x1b[20;5~" } + - { key: F10, mods: Control, chars: "\x1b[21;5~" } + - { key: F11, mods: Control, chars: "\x1b[23;5~" } + - { key: F12, mods: Control, chars: "\x1b[24;5~" } + - { key: F1, mods: Alt, chars: "\x1b[1;6P" } + - { key: F2, mods: Alt, chars: "\x1b[1;6Q" } + - { key: F3, mods: Alt, chars: "\x1b[1;6R" } + - { key: F4, mods: Alt, chars: "\x1b[1;6S" } + - { key: F5, mods: Alt, chars: "\x1b[15;6~" } + - { key: F6, mods: Alt, chars: "\x1b[17;6~" } + - { key: F7, mods: Alt, chars: "\x1b[18;6~" } + - { key: F8, mods: Alt, chars: "\x1b[19;6~" } + - { key: F9, mods: Alt, chars: "\x1b[20;6~" } + - { key: F10, mods: Alt, chars: "\x1b[21;6~" } + - { key: F11, mods: Alt, chars: "\x1b[23;6~" } + - { key: F12, mods: Alt, chars: "\x1b[24;6~" } + - { key: F1, mods: Command, chars: "\x1b[1;3P" } + - { key: F2, mods: Command, chars: "\x1b[1;3Q" } + - { key: F3, mods: Command, chars: "\x1b[1;3R" } + - { key: F4, mods: Command, chars: "\x1b[1;3S" } + - { key: F5, mods: Command, chars: "\x1b[15;3~" } + - { key: F6, mods: Command, chars: "\x1b[17;3~" } + - { key: F7, mods: Command, chars: "\x1b[18;3~" } + - { key: F8, mods: Command, chars: "\x1b[19;3~" } + - { key: F9, mods: Command, chars: "\x1b[20;3~" } + - { key: F10, mods: Command, chars: "\x1b[21;3~" } + - { key: F11, mods: Command, chars: "\x1b[23;3~" } + - { key: F12, mods: Command, chars: "\x1b[24;3~" } + + # Alt key + - { key: A, mods: Alt, chars: "\x1ba" } + - { key: B, mods: Alt, chars: "\x1bb" } + - { key: C, mods: Alt, chars: "\x1bc" } + - { key: D, mods: Alt, chars: "\x1bd" } + - { key: E, mods: Alt, chars: "\x1be" } + - { key: F, mods: Alt, chars: "\x1bf" } + - { key: G, mods: Alt, chars: "\x1bg" } + - { key: H, mods: Alt, chars: "\x1bh" } + - { key: I, mods: Alt, chars: "\x1bi" } + - { key: J, mods: Alt, chars: "\x1bj" } + - { key: K, mods: Alt, chars: "\x1bk" } + - { key: L, mods: Alt, chars: "\x1bl" } + - { key: M, mods: Alt, chars: "\x1bm" } + - { key: N, mods: Alt, chars: "\x1bn" } + - { key: O, mods: Alt, chars: "\x1bo" } + - { key: P, mods: Alt, chars: "\x1bp" } + - { key: Q, mods: Alt, chars: "\x1bq" } + - { key: R, mods: Alt, chars: "\x1br" } + - { key: S, mods: Alt, chars: "\x1bs" } + - { key: T, mods: Alt, chars: "\x1bt" } + - { key: U, mods: Alt, chars: "\x1bu" } + - { key: V, mods: Alt, chars: "\x1bv" } + - { key: W, mods: Alt, chars: "\x1bw" } + - { key: X, mods: Alt, chars: "\x1bx" } + - { key: Y, mods: Alt, chars: "\x1by" } + - { key: Z, mods: Alt, chars: "\x1bz" } + - { key: A, mods: Alt|Shift, chars: "\x1bA" } + - { key: B, mods: Alt|Shift, chars: "\x1bB" } + - { key: C, mods: Alt|Shift, chars: "\x1bC" } + - { key: D, mods: Alt|Shift, chars: "\x1bD" } + - { key: E, mods: Alt|Shift, chars: "\x1bE" } + - { key: F, mods: Alt|Shift, chars: "\x1bF" } + - { key: G, mods: Alt|Shift, chars: "\x1bG" } + - { key: H, mods: Alt|Shift, chars: "\x1bH" } + - { key: I, mods: Alt|Shift, chars: "\x1bI" } + - { key: J, mods: Alt|Shift, chars: "\x1bJ" } + - { key: K, mods: Alt|Shift, chars: "\x1bK" } + - { key: L, mods: Alt|Shift, chars: "\x1bL" } + - { key: M, mods: Alt|Shift, chars: "\x1bM" } + - { key: N, mods: Alt|Shift, chars: "\x1bN" } + - { key: O, mods: Alt|Shift, chars: "\x1bO" } + - { key: P, mods: Alt|Shift, chars: "\x1bP" } + - { key: Q, mods: Alt|Shift, chars: "\x1bQ" } + - { key: R, mods: Alt|Shift, chars: "\x1bR" } + - { key: S, mods: Alt|Shift, chars: "\x1bS" } + - { key: T, mods: Alt|Shift, chars: "\x1bT" } + - { key: U, mods: Alt|Shift, chars: "\x1bU" } + - { key: V, mods: Alt|Shift, chars: "\x1bV" } + - { key: W, mods: Alt|Shift, chars: "\x1bW" } + - { key: X, mods: Alt|Shift, chars: "\x1bX" } + - { key: Y, mods: Alt|Shift, chars: "\x1bY" } + - { key: Z, mods: Alt|Shift, chars: "\x1bZ" } + - { key: Key1, mods: Alt, chars: "\x1b1" } + - { key: Key2, mods: Alt, chars: "\x1b2" } + - { key: Key3, mods: Alt, chars: "\x1b3" } + - { key: Key4, mods: Alt, chars: "\x1b4" } + - { key: Key5, mods: Alt, chars: "\x1b5" } + - { key: Key6, mods: Alt, chars: "\x1b6" } + - { key: Key7, mods: Alt, chars: "\x1b7" } + - { key: Key8, mods: Alt, chars: "\x1b8" } + - { key: Key9, mods: Alt, chars: "\x1b9" } + - { key: Key0, mods: Alt, chars: "\x1b0" } + - { key: Space, mods: Control, chars: "\x00" } # Ctrl + Space + - { key: Grave, mods: Alt, chars: "\x1b`" } # Alt + ` + - { key: Grave, mods: Alt|Shift, chars: "\x1b~" } # Alt + ~ + - { key: Period, mods: Alt, chars: "\x1b." } # Alt + . + - { key: Key8, mods: Alt|Shift, chars: "\x1b*" } # Alt + * + - { key: Key3, mods: Alt|Shift, chars: "\x1b#" } # Alt + # + - { key: Period, mods: Alt|Shift, chars: "\x1b>" } # Alt + > + - { key: Comma, mods: Alt|Shift, chars: "\x1b<" } # Alt + < + - { key: Minus, mods: Alt|Shift, chars: "\x1b_" } # Alt + _ + - { key: Key5, mods: Alt|Shift, chars: "\x1b%" } # Alt + % + - { key: Key6, mods: Alt|Shift, chars: "\x1b^" } # Alt + ^ + - { key: Backslash, mods: Alt, chars: "\x1b\\" } # Alt + \ + - { key: Backslash, mods: Alt|Shift, chars: "\x1b|" } # Alt + | + + - { key: Period, mods: Alt, chars: "\x1b." } + - { key: Key8, mods: Alt|Shift, chars: "\x1b*" } + - { key: Key3, mods: Alt|Shift, chars: "\x1b#" } + + - { key: Key1, mods: Alt, chars: "\x1b1" } + - { key: Key2, mods: Alt, chars: "\x1b2" } + - { key: Key3, mods: Alt, chars: "\x1b3" } + - { key: Key4, mods: Alt, chars: "\x1b4" } + - { key: Key5, mods: Alt, chars: "\x1b5" } + - { key: Key6, mods: Alt, chars: "\x1b6" } + - { key: Key7, mods: Alt, chars: "\x1b7" } + - { key: Key8, mods: Alt, chars: "\x1b8" } + - { key: Key9, mods: Alt, chars: "\x1b9" } + - { key: Key0, mods: Alt, chars: "\x1b0" } diff --git a/.config/htop/htoprc b/.config/htop/htoprc @@ -0,0 +1,26 @@ +# Beware! This file is rewritten by htop when settings are changed in the interface. +# The parser is also very primitive, and not human-friendly. +fields=0 48 17 18 38 39 2 46 47 49 1 +sort_key=46 +sort_direction=1 +hide_threads=0 +hide_kernel_threads=0 +hide_userland_threads=0 +shadow_other_users=0 +show_thread_names=0 +show_program_path=0 +highlight_base_name=0 +highlight_megabytes=0 +highlight_threads=1 +tree_view=1 +header_margin=0 +detailed_cpu_time=0 +cpu_count_from_zero=0 +update_process_names=0 +account_guest_in_cpu_meter=0 +color_scheme=0 +delay=15 +left_meters=LeftCPUs Memory Swap +left_meter_modes=1 1 1 +right_meters=RightCPUs Tasks LoadAverage Uptime +right_meter_modes=1 2 2 2 diff --git a/.config/mpd/mpd.conf b/.config/mpd/mpd.conf @@ -0,0 +1,14 @@ +music_directory "~/Music" +playlist_directory "~/.mpd/playlists" +db_file "~/.mpd/database" +log_file "~/.mpd/log" +pid_file "~/.mpd/pid" +state_file "~/.mpd/state" +sticker_file "~/.mpd/sticker.sql" + +user "markfeller" + +audio_output { + type "osx" + name "default audio" +} diff --git a/.config/ncmpcpp/bindings b/.config/ncmpcpp/bindings @@ -0,0 +1,503 @@ +# -*- mode:conf -*- + +def_key "up" + scroll_up + +def_key "down" + scroll_down + +def_key "k" + scroll_up + +def_key "K" + scroll_up + scroll_up + scroll_up + scroll_up + +def_key "j" + scroll_down + +def_key "J" + scroll_down + scroll_down + scroll_down + scroll_down + +def_key "l" + next_column + +def_key "l" + enter_directory + +def_key "l" + toggle_output + +def_key "l" + run_action + +def_key "l" + play_item + +def_key "h" + previous_column + +def_key "h" + jump_to_parent_directory + +def_key "d" + delete_playlist_items + +def_key "d" + delete_browser_items + +def_key "d" + delete_stored_playlist + +def_key "space" + add_item_to_playlist + +def_key "space" + toggle_lyrics_update_on_song_change + +def_key "space" + toggle_visualization_type + +def_key "right" + volume_up + +def_key "+" + volume_up + +def_key "left" + volume_down + +def_key "-" + volume_down + +def_key "o" + master_screen + +def_key "o" + slave_screen + +def_key "s" + stop + +def_key "S" + save_playlist + +def_key "p" + pause + +def_key ":" + execute_command + +def_key "f1" + show_help + +def_key "1" + show_playlist + +def_key "2" + show_browser + +def_key "2" + change_browse_mode + +def_key "3" + show_search_engine + +def_key "3" + reset_search_engine + +def_key "4" + show_media_library + +def_key "4" + toggle_media_library_columns_mode + +def_key "5" + show_playlist_editor + +def_key "6" + show_tag_editor + +def_key "7" + show_outputs + +def_key "8" + show_visualizer + +def_key "0" + show_clock + +def_key "@" + show_server_info + +def_key "q" + quit + +def_key ")" + seek_forward + +def_key "(" + seek_backward + +def_key "/" + find + +def_key "/" + find_item_forward + +def_key "?" + find + +def_key "?" + find_item_backward + +def_key "n" + next_found_item + +def_key "N" + previous_found_item + +def_key "=" + sort_playlist + +def_key "backspace" + jump_to_parent_directory + +def_key "backspace" + replay_song + +def_key "u" + update_database + +def_key "e" + edit_song + +def_key "e" + edit_library_tag + +def_key "e" + edit_library_album + +def_key "e" + edit_directory_name + +def_key "e" + edit_playlist_name + +def_key "e" + edit_lyrics + +def_key "i" + show_song_info + +def_key "I" + show_artist_info + +def_key "c" + clear_playlist + +def_key "ctrl-l" + toggle_screen_lock + +def_key "tab" + next_screen + +def_key "shift-tab" + previous_screen + +def_key "a" + add_selected_items + +def_key "c" + clear_main_playlist + +def_key "r" + toggle_repeat + +def_key "z" + toggle_random + +def_key "y" + toggle_single + +def_key "R" + toggle_consume + +def_key "#" + toggle_bitrate_visibility + +def_key "x" + toggle_crossfade + +def_key "X" + set_crossfade + +def_key "g" + jump_to_position_in_song + +def_key "G" + jump_to_playing_song + +def_key "b" + jump_to_playlist_editor + +def_key "!" + toggle_separators_between_albums + +def_key "L" + toggle_lyrics_fetcher + +# def_key "y" +# save_tag_changes +# +# def_key "y" +# start_searching +# +# def_key "Y" +# toggle_replay_gain_mode +# +# def_key "T" +# toggle_add_mode +# +# def_key "|" +# toggle_mouse +# +# def_key "Z" +# shuffle +# +# def_key "ctrl-r" +# reverse_playlist +# +# def_key "ctrl-f" +# apply_filter +# +# def_key "w" +# toggle_find_mode +# +# def_key "v" +# reverse_selection +# +# def_key "V" +# remove_selection +# +# def_key "B" +# select_album +# +# def_key "C" +# crop_playlist +# +# def_key "C" +# crop_main_playlist +# +# def_key "m" +# move_sort_order_up +# +# def_key "m" +# move_selected_items_up +# +# def_key "m" +# toggle_media_library_sort_mode +# +# def_key "m" +# set_visualizer_sample_multiplier +# +# def_key "n" +# move_sort_order_down +# +# def_key "n" +# move_selected_items_down +# +# def_key "M" +# move_selected_items_to +# +# def_key "A" +# add +# +# def_key "~" +# jump_to_media_library +# +# def_key "E" +# jump_to_tag_editor +# +# def_key "U" +# toggle_playing_song_centering +# +# def_key "P" +# toggle_display_mode +# +# def_key "\\" +# toggle_interface +# +# +# def_key "F" +# toggle_fetching_lyrics_in_background +# +# def_key "`" +# toggle_browser_sort_mode +# +# def_key "`" +# toggle_library_tag_type +# +# def_key "`" +# refetch_lyrics +# +# def_key "`" +# add_random_items +# +# def_key "ctrl-p" +# set_selected_items_priority +# + + + +########################################################## +## this is example bindings configuration file, copy it ## +## to ~/.ncmpcpp/bindings and set up your preferences ## +########################################################## +## +##### General rules ##### +## +## 1) Because each action has runtime checks whether it's +## ok to run it, a few actions can be bound to one key. +## Actions will be bound in order given in configuration +## file. When a key is pressed, first action in order +## will test itself whether it's possible to run it. If +## test succeeds, action is executed and other actions +## bound to this key are ignored. If it doesn't, next +## action in order tests itself etc. +## +## 2) It's possible to bind more that one action at once +## to a key. It can be done using the following syntax: +## +## def_key "key" +## action1 +## action2 +## ... +## +## This creates a chain of actions. When such chain is +## executed, each action in chain is run until the end of +## chain is reached or one of its actions fails to execute +## due to its requirements not being met. If multiple actions +## and/or chains are bound to the same key, they will be +## consecutively run until one of them gets fully executed. +## +## 3) When ncmpcpp starts, bindings configuration file is +## parsed and then ncmpcpp provides "missing pieces" +## of default keybindings. If you want to disable some +## bindings, there is a special action called 'dummy' +## for that purpose. Eg. if you want to disable ability +## to crop playlists, you need to put the following +## into configuration file: +## +## def_key "C" +## dummy +## +## After that ncmpcpp will not bind any default action +## to this key. +## +## 4) To let you write simple macros, the following special +## actions are provided: +## +## - push_character "character" - pushes given special +## character into input queue, so it will be immediately +## picked by ncmpcpp upon next call to readKey function. +## Accepted values: mouse, up, down, page_up, page_down, +## home, end, space, enter, insert, delete, left, right, +## tab, shift_tab, ctrl_a, ctrl_b, ..., ctrl_z, f1, f2, +## ..., f12, backspace, backspace_2. +## +## - push_characters "string" - pushes given string into +## input queue. +## +## - require_runnable "action" - checks whether given action +## is runnable and fails if it isn't. This is especially +## useful when mixed with previous two functions. Consider +## the following macro definition: +## +## def_key "key" +## push_characters "custom_filter" +## apply_filter +## +## If apply_filter can't be currently run, we end up with +## sequence of characters in input queue which will be +## treated just as we typed them. This may lead to unexpected +## results (in this case 'c' will most likely clear current +## playlist, 'u' will trigger database update, 's' will stop +## playback etc.). To prevent such thing from happening, we +## need to change above definition to this one: +## +## def_key "key" +## require_runnable "apply_filter" +## push_characters "custom_filter" +## apply_filter +## +## Here, first we test whether apply_filter can be actually run +## before we stuff characters into input queue, so if condition +## is not met, whole chain is aborted and we're fine. +## +## - require_screen "screen" - checks whether given screen is +## currently active. accepted values: browser, clock, help, +## media_library, outputs, playlist, playlist_editor, +## search_engine, tag_editor, visualizer, last_fm, lyrics, +## selected_items_adder, server_info, song_info, +## sort_playlist_dialog, tiny_tag_editor. +## +## - run_external_command "command" - runs given command using +## system() function. +## +## 5) In addition to binding to a key, you can also bind actions +## or chains of actions to a command. If it comes to commands, +## syntax is very similar to defining keys. Here goes example +## definition of a command: +## +## def_command "quit" [deferred] +## stop +## quit +## +## If you execute the above command (which can be done by +## invoking action execute_command, typing 'quit' and pressing +## enter), ncmpcpp will stop the player and then quit. Note the +## presence of word 'deferred' enclosed in square brackets. It +## tells ncmpcpp to wait for confirmation (ie. pressing enter) +## after you typed quit. Instead of 'deferred', 'immediate' +## could be used. Then ncmpcpp will not wait for confirmation +## (enter) and will execute the command the moment it sees it. +## +## Note: Both 'backspace' and 'backspace_2' are used because some +## terminals interpret backspace using keycode of 'backspace' +## and some the one of 'backspace_2'. You can get away with +## binding once if all your terminal emulators use the same +## value. +## +## Note: There is a difference between: +## +## def_key "key" +## action1 +## +## def_key "key" +## action2 +## +## and +## +## def_key "key" +## action1 +## action2 +## +## First one binds two single actions to the same key whilst +## second one defines a chain of actions. The behavior of +## these two is different and is described in (1) and (2). +## +## Note: Function def_key accepts non-ascii characters. +## +##### List of unbound actions ##### +## +## The following actions are not bound to any key/command: +## +## - set_volume +## - filter_playlist_on_priorities +##+ \ No newline at end of file diff --git a/.config/ncmpcpp/config b/.config/ncmpcpp/config @@ -0,0 +1,56 @@ +# directories +ncmpcpp_directory = "~/.config/ncmpcpp" +lyrics_directory = "~/.config/ncmpcpp/lyrics" + +# mpd +mpd_music_dir = "~/Music" +mpd_port = "6600" +playlist_disable_highlight_delay = 1 +message_delay_time = 3 + +# formats +song_status_format = "{%a} • {%t}" +song_library_format = "%t" +song_window_title_format = "{%a-%t}" +song_columns_list_format = "(30)[]{a} (40)[]{t|f} (30)[]{b}" +alternative_header_first_line_format = "$aqu$/a $b{%t}|{%f}$/b $atq$/a" +alternative_header_second_line_format = "{%a}" + +# progressbar +progressbar_look = "─╼ " # ╼─ +progressbar_color = "black" +progressbar_elapsed_color = "cyan" + +# ui +user_interface = "classic" +header_visibility = "no" +statusbar_visibility = "yes" +titles_visibility = "no" +cyclic_scrolling = "no" +enable_window_title = "no" +playlist_display_mode = "columns" +browser_display_mode = "columns" +autocenter_mode = "yes" + +# colors +colors_enabled = "yes" +statusbar_color = "default" +alternative_ui_separator_color = "default" +window_border_color = "default" +active_window_border = "default" +color2 = "default" +color1 = "default" +main_window_color = "default" +state_flags_color = "default" +state_line_color = "default" +volume_color = "default" +header_window_color = "default" +empty_tag_color = "default" + +# visualizer +visualizer_fifo_path = "/tmp/mpd.fifo" +visualizer_output_name = "my_fifo" +visualizer_sync_interval = "30" +# visualizer_type = "spectrum" +visualizer_look = "∙▋" +visualizer_in_stereo = "yes" diff --git a/.config/ncmpcpp/error.log b/.config/ncmpcpp/error.log diff --git a/.config/neofetch/config.conf b/.config/neofetch/config.conf @@ -0,0 +1,771 @@ +# Neofetch config file +# https://github.com/dylanaraps/neofetch + + +# See this wiki page for more info: +# https://github.com/dylanaraps/neofetch/wiki/Customizing-Info +print_info() { + info title + info underline + + info "OS" distro + info "Host" model + info "Kernel" kernel + info "Uptime" uptime + info "Packages" packages + info "Shell" shell + info "Resolution" resolution + info "DE" de + info "WM" wm + info "WM Theme" wm_theme + info "Theme" theme + info "Icons" icons + info "Terminal" term + info "Terminal Font" term_font + info "CPU" cpu + info "GPU" gpu + info "Memory" memory + + # info "GPU Driver" gpu_driver # Linux/macOS only + # info "CPU Usage" cpu_usage + # info "Disk" disk + # info "Battery" battery + # info "Font" font + # info "Song" song + # info "Local IP" local_ip + # info "Public IP" public_ip + # info "Users" users + # info "Install Date" install_date + # info "Locale" locale # This only works on glibc systems. + + info line_break + info cols + info line_break +} + + +# Kernel + + +# Shorten the output of the kernel function. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --kernel_shorthand +# Supports: Everything except *BSDs (except PacBSD and PC-BSD) +# +# Example: +# on: '4.8.9-1-ARCH' +# off: 'Linux 4.8.9-1-ARCH' +kernel_shorthand="on" + + +# Distro + + +# Shorten the output of the distro function +# +# Default: 'off' +# Values: 'on', 'off', 'tiny' +# Flag: --distro_shorthand +# Supports: Everything except Windows and Haiku +distro_shorthand="off" + +# Show/Hide OS Architecture. +# Show 'x86_64', 'x86' and etc in 'Distro:' output. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --os_arch +# +# Example: +# on: 'Arch Linux x86_64' +# off: 'Arch Linux' +os_arch="on" + + +# Uptime + + +# Shorten the output of the uptime function +# +# Default: 'on' +# Values: 'on', 'off', 'tiny' +# Flag: --uptime_shorthand +# +# Example: +# on: '2 days, 10 hours, 3 mins' +# off: '2 days, 10 hours, 3 minutes' +# tiny: '2d 10h 3m' +uptime_shorthand="on" + + +# Shell + + +# Show the path to $SHELL +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --shell_path +# +# Example: +# on: '/bin/bash' +# off: 'bash' +shell_path="off" + +# Show $SHELL version +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --shell_version +# +# Example: +# on: 'bash 4.4.5' +# off: 'bash' +shell_version="on" + + +# CPU + + +# CPU speed type +# +# Default: 'bios_limit' +# Values: 'scaling_cur_freq', 'scaling_min_freq', 'scaling_max_freq', 'bios_limit'. +# Flag: --speed_type +# Supports: Linux with 'cpufreq' +# NOTE: Any file in '/sys/devices/system/cpu/cpu0/cpufreq' can be used as a value. +speed_type="bios_limit" + +# CPU speed shorthand +# +# Default: 'off' +# Values: 'on', 'off'. +# Flag: --speed_shorthand. +# NOTE: This flag is not supported in systems with CPU speed less than 1 GHz +# +# Example: +# on: 'i7-6500U (4) @ 3.1GHz' +# off: 'i7-6500U (4) @ 3.100GHz' +speed_shorthand="off" + +# Enable/Disable CPU brand in output. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --cpu_brand +# +# Example: +# on: 'Intel i7-6500U' +# off: 'i7-6500U (4)' +cpu_brand="on" + +# CPU Speed +# Hide/Show CPU speed. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --cpu_speed +# +# Example: +# on: 'Intel i7-6500U (4) @ 3.1GHz' +# off: 'Intel i7-6500U (4)' +cpu_speed="on" + +# CPU Cores +# Display CPU cores in output +# +# Default: 'logical' +# Values: 'logical', 'physical', 'off' +# Flag: --cpu_cores +# Support: 'physical' doesn't work on BSD. +# +# Example: +# logical: 'Intel i7-6500U (4) @ 3.1GHz' (All virtual cores) +# physical: 'Intel i7-6500U (2) @ 3.1GHz' (All physical cores) +# off: 'Intel i7-6500U @ 3.1GHz' +cpu_cores="logical" + +# CPU Temperature +# Hide/Show CPU temperature. +# Note the temperature is added to the regular CPU function. +# +# Default: 'off' +# Values: 'C', 'F', 'off' +# Flag: --cpu_temp +# Supports: Linux, BSD +# NOTE: For FreeBSD and NetBSD-based systems, you'll need to enable +# coretemp kernel module. This only supports newer Intel processors. +# +# Example: +# C: 'Intel i7-6500U (4) @ 3.1GHz [27.2°C]' +# F: 'Intel i7-6500U (4) @ 3.1GHz [82.0°F]' +# off: 'Intel i7-6500U (4) @ 3.1GHz' +cpu_temp="off" + + +# GPU + + +# Enable/Disable GPU Brand +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --gpu_brand +# +# Example: +# on: 'AMD HD 7950' +# off: 'HD 7950' +gpu_brand="on" + +# Which GPU to display +# +# Default: 'all' +# Values: 'all', 'dedicated', 'integrated' +# Flag: --gpu_type +# Supports: Linux +# +# Example: +# all: +# GPU1: AMD HD 7950 +# GPU2: Intel Integrated Graphics +# +# dedicated: +# GPU1: AMD HD 7950 +# +# integrated: +# GPU1: Intel Integrated Graphics +gpu_type="all" + + +# Resolution + + +# Display refresh rate next to each monitor +# Default: 'off' +# Values: 'on', 'off' +# Flag: --refresh_rate +# Supports: Doesn't work on Windows. +# +# Example: +# on: '1920x1080 @ 60Hz' +# off: '1920x1080' +refresh_rate="off" + + +# Gtk Theme / Icons / Font + + +# Shorten output of GTK Theme / Icons / Font +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --gtk_shorthand +# +# Example: +# on: 'Numix, Adwaita' +# off: 'Numix [GTK2], Adwaita [GTK3]' +gtk_shorthand="off" + + +# Enable/Disable gtk2 Theme / Icons / Font +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --gtk2 +# +# Example: +# on: 'Numix [GTK2], Adwaita [GTK3]' +# off: 'Adwaita [GTK3]' +gtk2="on" + +# Enable/Disable gtk3 Theme / Icons / Font +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --gtk3 +# +# Example: +# on: 'Numix [GTK2], Adwaita [GTK3]' +# off: 'Numix [GTK2]' +gtk3="on" + + +# IP Address + + +# Website to ping for the public IP +# +# Default: 'http://ident.me' +# Values: 'url' +# Flag: --ip_host +public_ip_host="http://ident.me" + + +# Disk + + +# Which disks to display. +# The values can be any /dev/sdXX, mount point or directory. +# NOTE: By default we only show the disk info for '/'. +# +# Default: '/' +# Values: '/', '/dev/sdXX', '/path/to/drive'. +# Flag: --disk_show +# +# Example: +# disk_show=('/' '/dev/sdb1'): +# 'Disk (/): 74G / 118G (66%)' +# 'Disk (/mnt/Videos): 823G / 893G (93%)' +# +# disk_show=('/'): +# 'Disk (/): 74G / 118G (66%)' +# +disk_show=('/') + +# Disk subtitle. +# What to append to the Disk subtitle. +# +# Default: 'mount' +# Values: 'mount', 'name', 'dir' +# Flag: --disk_subtitle +# +# Example: +# name: 'Disk (/dev/sda1): 74G / 118G (66%)' +# 'Disk (/dev/sdb2): 74G / 118G (66%)' +# +# mount: 'Disk (/): 74G / 118G (66%)' +# 'Disk (/mnt/Local Disk): 74G / 118G (66%)' +# 'Disk (/mnt/Videos): 74G / 118G (66%)' +# +# dir: 'Disk (/): 74G / 118G (66%)' +# 'Disk (Local Disk): 74G / 118G (66%)' +# 'Disk (Videos): 74G / 118G (66%)' +disk_subtitle="mount" + + +# Song + + +# Manually specify a music player. +# +# Default: 'auto' +# Values: 'auto', 'player-name' +# Flag: --music_player +# +# Available values for 'player-name': +# +# Google Play +# Spotify +# amarok +# audacious +# banshee +# bluemindo +# clementine +# cmus +# deadbeef +# deepin-music +# elisa +# exaile +# gnome-music +# guayadeque +# iTunes$ +# juk +# lollypop +# mocp +# mopidy +# mpd +# pogo +# pragha +# qmmp +# quodlibet +# rhythmbox +# spotify +# tomahawk +# xmms2d +# yarock +music_player="auto" + +# Print the Artist and Title on separate lines +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --song_shorthand +# +# Example: +# on: 'Artist: The Fratellis' +# 'Song: Chelsea Dagger' +# +# off: 'Song: The Fratellis - Chelsea Dagger' +song_shorthand="off" + + +# Install Date + + +# Whether to show the time in the output +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --install_time +# +# Example: +# on: 'Thu 14 Apr 2016 11:50 PM' +# off: 'Thu 14 Apr 2016' +install_time="on" + +# Set time format in the output +# +# Default: '24h' +# Values: '12h', '24h' +# Flag: --install_time_format +# +# Example: +# 12h: 'Thu 14 Apr 2016 11:50 PM' +# 24h: 'Thu 14 Apr 2016 23:50' +install_time_format="12h" + + +# Text Colors + + +# Text Colors +# +# Default: 'distro' +# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num' +# Flag: --colors +# +# Each number represents a different part of the text in +# this order: 'title', '@', 'underline', 'subtitle', 'colon', 'info' +# +# Example: +# colors=(distro) - Text is colored based on Distro colors. +# colors=(4 6 1 8 8 6) - Text is colored in the order above. +colors=(distro) + + +# Text Options + + +# Toggle bold text +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --bold +bold="on" + +# Enable/Disable Underline +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --underline +underline_enabled="on" + +# Underline character +# +# Default: '-' +# Values: 'string' +# Flag: --underline_char +underline_char="-" + + +# Color Blocks + + +# Color block range +# The range of colors to print. +# +# Default: '0', '7' +# Values: 'num' +# Flag: --block_range +# +# Example: +# +# Display colors 0-7 in the blocks. (8 colors) +# neofetch --block_range 0 7 +# +# Display colors 0-15 in the blocks. (16 colors) +# neofetch --block_range 0 15 +block_range=(0 7) + +# Toggle color blocks +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --color_blocks +color_blocks="on" + +# Color block width in spaces +# +# Default: '3' +# Values: 'num' +# Flag: --block_width +block_width=3 + +# Color block height in lines +# +# Default: '1' +# Values: 'num' +# Flag: --block_height +block_height=1 + + +# Progress Bars + + +# Bar characters +# +# Default: '-', '=' +# Values: 'string', 'string' +# Flag: --bar_char +# +# Example: +# neofetch --bar_char 'elapsed' 'total' +# neofetch --bar_char '-' '=' +bar_char_elapsed="-" +bar_char_total="=" + +# Toggle Bar border +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --bar_border +bar_border="on" + +# Progress bar length in spaces +# Number of chars long to make the progress bars. +# +# Default: '15' +# Values: 'num' +# Flag: --bar_length +bar_length=15 + +# Progress bar colors +# When set to distro, uses your distro's logo colors. +# +# Default: 'distro', 'distro' +# Values: 'distro', 'num' +# Flag: --bar_colors +# +# Example: +# neofetch --bar_colors 3 4 +# neofetch --bar_colors distro 5 +bar_color_elapsed="distro" +bar_color_total="distro" + + +# Info display +# Display a bar with the info. +# +# Default: 'off' +# Values: 'bar', 'infobar', 'barinfo', 'off' +# Flags: --cpu_display +# --memory_display +# --battery_display +# --disk_display +# +# Example: +# bar: '[---=======]' +# infobar: 'info [---=======]' +# barinfo: '[---=======] info' +# off: 'info' +cpu_display="off" +memory_display="off" +battery_display="off" +disk_display="off" + + +# Backend Settings + + +# Image backend. +# +# Default: 'ascii' +# Values: 'ascii', 'caca', 'catimg', 'jp2a', 'iterm2', 'off', 'termpix', 'pixterm', 'tycat', 'w3m' +# Flag: --backend +image_backend="ascii" + +# Image Source +# +# Which image or ascii file to display. +# +# Default: 'auto' +# Values: 'auto', 'ascii', 'wallpaper', '/path/to/img', '/path/to/ascii', '/path/to/dir/' +# Flag: --source +# +# NOTE: 'auto' will pick the best image source for whatever image backend is used. +# In ascii mode, distro ascii art will be used and in an image mode, your +# wallpaper will be used. +image_source="auto" + + +# Ascii Options + + +# Ascii distro +# Which distro's ascii art to display. +# +# Default: 'auto' +# Values: 'auto', 'distro_name' +# Flag: --ascii_distro +# +# NOTE: Arch and Ubuntu have 'old' logo variants. +# Change this to 'arch_old' or 'ubuntu_old' to use the old logos. +# NOTE: Ubuntu has flavor variants. +# Change this to 'Lubuntu', 'Xubuntu', 'Ubuntu-GNOME' or 'Ubuntu-Budgie' to use the flavors. +# NOTE: Arch, Crux and Gentoo have a smaller logo variant. +# Change this to 'arch_small', 'crux_small' or 'gentoo_small' to use the small logos. +ascii_distro="auto" + +# Ascii Colors +# +# Default: 'distro' +# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num' +# Flag: --ascii_colors +# +# Example: +# ascii_colors=(distro) - Ascii is colored based on Distro colors. +# ascii_colors=(4 6 1 8 8 6) - Ascii is colored using these colors. +ascii_colors=(distro) + +# Bold ascii logo +# Whether or not to bold the ascii logo. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --ascii_bold +ascii_bold="on" + + +# Image Options + + +# Image loop +# Setting this to on will make neofetch redraw the image constantly until +# Ctrl+C is pressed. This fixes display issues in some terminal emulators. +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --loop +image_loop="off" + +# Thumbnail directory +# +# Default: '~/.cache/thumbnails/neofetch' +# Values: 'dir' +thumbnail_dir="${XDG_CACHE_HOME:-${HOME}/.cache}/thumbnails/neofetch" + +# Crop mode +# +# Default: 'normal' +# Values: 'normal', 'fit', 'fill' +# Flag: --crop_mode +# +# See this wiki page to learn about the fit and fill options. +# https://github.com/dylanaraps/neofetch/wiki/What-is-Waifu-Crop%3F +crop_mode="normal" + +# Crop offset +# Note: Only affects 'normal' crop mode. +# +# Default: 'center' +# Values: 'northwest', 'north', 'northeast', 'west', 'center' +# 'east', 'southwest', 'south', 'southeast' +# Flag: --crop_offset +crop_offset="center" + +# Image size +# The image is half the terminal width by default. +# +# Default: 'auto' +# Values: 'auto', '00px', '00%', 'none' +# Flags: --image_size +# --size +image_size="auto" + +# Gap between image and text +# +# Default: '3' +# Values: 'num', '-num' +# Flag: --gap +gap=3 + +# Image offsets +# Only works with the w3m backend. +# +# Default: '0' +# Values: 'px' +# Flags: --xoffset +# --yoffset +yoffset=0 +xoffset=0 + +# Image background color +# Only works with the w3m backend. +# +# Default: '' +# Values: 'color', 'blue' +# Flag: --bg_color +background_color= + + +# Scrot Options + + +# Whether or not to always take a screenshot +# You can manually take a screenshot with "--scrot" or "-s" +# +# Default: 'off' +# Values: 'on', 'off' +# Flags: --scrot +# -s +scrot="off" + +# Screenshot Program +# Neofetch will automatically use whatever screenshot tool +# is installed on your system. +# +# If 'neofetch -v' says that it couldn't find a screenshot +# tool or you're using a custom tool then you can change +# the option below to a custom command. +# +# Default: 'auto' +# Values: 'auto' 'cmd -flags' +# Flag: --scrot_cmd +scrot_cmd="auto" + +# Screenshot Filename +# What to name the screenshots +# +# Default: 'neofetch-$(date +%F-%I-%M-%S-${RANDOM}).png' +# Values: 'string' +# Flag: --scrot_name +scrot_name="neofetch-$(date +%F-%I-%M-%S-${RANDOM}).png" + +# Image upload host +# Where to upload the image. +# +# Default: 'teknik' +# Values: 'imgur', 'teknik' +# Flag: --image_host +# +# NOTE: If you'd like another image host to be added to Neofetch. +# Open an issue on github. +image_host="teknik" + + +# Misc Options + +# Stdout mode +# Turn off all colors and disables image backend (ASCII/Image). +# Useful for piping into another command. +# Default: 'off' +# Values: 'on', 'off' +stdout="off" + +# Config version. +# +# NOTE: Don't change this value, neofetch reads this to determine +# how to handle backwards compatibility. +config_version="3.4.0" diff --git a/.config/notmuch/config b/.config/notmuch/config @@ -0,0 +1,25 @@ +# -*- mode:toml -*- + +# .notmuch-config - Configuration file for the notmuch mail system +# +# For more information about notmuch, see https://notmuchmail.org + +[database] +path=/Users/mark/mail + +[user] +name=Mark Feller +primary_email=mjfeller1992@gmail.com + +[new] +tags=unread;inbox; +ignore= + +[search] +exclude_tags=deleted;spam; + +[maildir] +synchronize_flags=true + +[crypto] +gpg_path=gpg diff --git a/.config/nvim/init.vim b/.config/nvim/init.vim @@ -0,0 +1,3 @@ +set runtimepath^=~/.vim runtimepath+=~/.vim/after +let &packpath = &runtimepath +source ~/.vimrc diff --git a/.config/oh-my-zsh b/.config/oh-my-zsh @@ -0,0 +1 @@ +Subproject commit d2725d44fce59ea7060b4d712c5739512a56882d diff --git a/.config/zsh/.zcompdump b/.config/zsh/.zcompdump @@ -0,0 +1,1619 @@ +#files: 754 version: 5.2 + +_comps=( +'-' '_precommand' +'-array-value-' '_value' +'-assign-parameter-' '_assign' +'-brace-parameter-' '_brace_parameter' +'-command-' '_autocd' +'-command-line-' '_normal' +'-condition-' '_condition' +'-default-' '_default' +'-equal-' '_equal' +'-first-' '_first' +'-math-' '_math' +'-parameter-' '_parameter' +'-redirect-' '_redirect' +'-redirect-,-default-,-default-' '_files' +'-redirect-,<,bunzip2' '_bzip2' +'-redirect-,<,bzip2' '_bzip2' +'-redirect-,<,compress' '_compress' +'-redirect-,<,gunzip' '_gzip' +'-redirect-,<,gzip' '_gzip' +'-redirect-,<,uncompress' '_compress' +'-redirect-,<,unxz' '_xz' +'-redirect-,<,xz' '_xz' +'-redirect-,>,bzip2' '_bzip2' +'-redirect-,>,compress' '_compress' +'-redirect-,>,gzip' '_gzip' +'-redirect-,>,xz' '_xz' +'-subscript-' '_subscript' +'-tilde-' '_tilde' +'-value-' '_value' +'-value-,-default-,-command-' '_zargs' +'-value-,-default-,-default-' '_value' +'-value-,ADB_TRACE,-default-' '_adb' +'-value-,ANDROID_LOG_TAGS,-default-' '_adb' +'-value-,ANDROID_SERIAL,-default-' '_adb' +'-value-,ANT_ARGS,-default-' '_ant' +'-value-,CFLAGS,-default-' '_gcc' +'-value-,CPPFLAGS,-default-' '_gcc' +'-value-,CXXFLAGS,-default-' '_gcc' +'-value-,DISPLAY,-default-' '_x_display' +'-value-,GREP_OPTIONS,-default-' '_grep' +'-value-,GZIP,-default-' '_gzip' +'-value-,LANG,-default-' '_locales' +'-value-,LANGUAGE,-default-' '_locales' +'-value-,LDFLAGS,-default-' '_gcc' +'-value-,LESS,-default-' '_less' +'-value-,LESSCHARSET,-default-' '_less' +'-value-,LPDEST,-default-' '_printers' +'-value-,P4CLIENT,-default-' '_perforce' +'-value-,P4MERGE,-default-' '_perforce' +'-value-,P4PORT,-default-' '_perforce' +'-value-,P4USER,-default-' '_perforce' +'-value-,PERLDOC,-default-' '_perldoc' +'-value-,PRINTER,-default-' '_printers' +'-value-,PROMPT,-default-' '_ps1234' +'-value-,PROMPT2,-default-' '_ps1234' +'-value-,PROMPT3,-default-' '_ps1234' +'-value-,PROMPT4,-default-' '_ps1234' +'-value-,PS1,-default-' '_ps1234' +'-value-,PS2,-default-' '_ps1234' +'-value-,PS3,-default-' '_ps1234' +'-value-,PS4,-default-' '_ps1234' +'-value-,RPROMPT,-default-' '_ps1234' +'-value-,RPROMPT2,-default-' '_ps1234' +'-value-,RPS1,-default-' '_ps1234' +'-value-,RPS2,-default-' '_ps1234' +'-value-,SPROMPT,-default-' '_ps1234' +'-value-,TERM,-default-' '_terminals' +'-value-,TERMINFO_DIRS,-default-' '_dir_list' +'-value-,TZ,-default-' '_time_zone' +'-value-,VALGRIND_OPTS,-default-' '_valgrind' +'-value-,WWW_HOME,-default-' '_urls' +'-value-,XML_CATALOG_FILES,-default-' '_xmlsoft' +'-value-,XZ_DEFAULTS,-default-' '_xz' +'-value-,XZ_OPT,-default-' '_xz' +'-vared-' '_in_vared' +'-zcalc-line-' '_zcalc_line' +'.' '_source' +'5g' '_go' +'5l' '_go' +'6g' '_go' +'6l' '_go' +'8g' '_go' +'8l' '_go' +'Mail' '_mail' +'Mosaic' '_webbrowser' +'SuSEconfig' '_SUSEconfig' +'a2dismod' '_a2utils' +'a2dissite' '_a2utils' +'a2enmod' '_a2utils' +'a2ensite' '_a2utils' +'a2ps' '_a2ps' +'aaaa' '_hosts' +'aap' '_aap' +'acpi' '_acpi' +'acpitool' '_acpitool' +'acroread' '_acroread' +'adb' '_adb' +'add-zsh-hook' '_add-zsh-hook' +'admin' '_sccs' +'ali' '_mh' +'alias' '_alias' +'amaya' '_webbrowser' +'analyseplugin' '_analyseplugin' +'animate' '_imagemagick' +'anno' '_mh' +'ant' '_ant' +'antiword' '_antiword' +'aoss' '_precommand' +'apache2ctl' '_apachectl' +'apachectl' '_apachectl' +'apm' '_apm' +'appletviewer' '_java' +'apropos' '_man' +'apt' '_apt' +'apt-cache' '_apt' +'apt-cdrom' '_apt' +'apt-config' '_apt' +'apt-file' '_apt-file' +'apt-get' '_apt' +'apt-mark' '_apt' +'apt-move' '_apt-move' +'apt-show-versions' '_apt-show-versions' +'aptitude' '_aptitude' +'apvlv' '_pdf' +'arena' '_webbrowser' +'arp' '_arp' +'arping' '_arping' +'at' '_at' +'atq' '_at' +'atrm' '_at' +'attr' '_attr' +'augtool' '_augeas' +'auto-apt' '_auto-apt' +'autoload' '_typeset' +'awk' '_awk' +'axi-cache' '_axi-cache' +'bash' '_sh' +'batch' '_at' +'baz' '_baz' +'beadm' '_beadm' +'beep' '_beep' +'bg' '_jobs_bg' +'bindkey' '_bindkey' +'bison' '_bison' +'bmake' '_make' +'bogofilter' '_bogofilter' +'bogotune' '_bogofilter' +'bogoutil' '_bogofilter' +'bpython' '_bpython' +'bpython-gtk' '_bpython' +'bpython-urwid' '_bpython' +'bpython2' '_bpython' +'bpython2-gtk' '_bpython' +'bpython2-urwid' '_bpython' +'bpython3' '_bpython' +'bpython3-gtk' '_bpython' +'bpython3-urwid' '_bpython' +'brctl' '_brctl' +'brew' '_brew' +'brew-cask' '_brew_cask' +'bsdconfig' '_bsdconfig' +'bsdgrep' '_grep' +'bsdinstall' '_bsdinstall' +'btdownloadcurses' '_bittorrent' +'btdownloadgui' '_bittorrent' +'btdownloadheadless' '_bittorrent' +'btlaunchmany' '_bittorrent' +'btlaunchmanycurses' '_bittorrent' +'btmakemetafile' '_bittorrent' +'btreannounce' '_bittorrent' +'btrename' '_bittorrent' +'btrfs' '_btrfs' +'bts' '_bts' +'btshowmetainfo' '_bittorrent' +'bttrack' '_bittorrent' +'bug' '_bug' +'buildhash' '_ispell' +'builtin' '_builtin' +'bunzip2' '_bzip2' +'burst' '_mh' +'bzcat' '_bzip2' +'bzip2' '_bzip2' +'bzip2recover' '_bzip2' +'bzr' '_bzr' +'c++' '_gcc' +'cabal' '_cabal' +'cal' '_cal' +'calendar' '_calendar' +'cat' '_cat' +'catchsegv' '_precommand' +'cc' '_gcc' +'ccal' '_ccal' +'cd' '_cd' +'cdbs-edit-patch' '_cdbs-edit-patch' +'cdc' '_sccs' +'cdcd' '_cdcd' +'cdr' '_cdr' +'cdrdao' '_cdrdao' +'cdrecord' '_cdrecord' +'certtool' '_gnutls' +'cftp' '_twisted' +'chage' '_users' +'chdir' '_cd' +'chflags' '_chflags' +'chfn' '_users' +'chgrp' '_chown' +'chimera' '_webbrowser' +'chkconfig' '_chkconfig' +'chmod' '_chmod' +'chown' '_chown' +'chpass' '_chsh' +'chrt' '_chrt' +'chsh' '_chsh' +'ci' '_rcs' +'ckeygen' '_twisted' +'clang' '_gcc' +'clang++' '_gcc' +'clay' '_clay' +'clear' '_nothing' +'cmp' '_cmp' +'co' '_rcs' +'comb' '_sccs' +'combine' '_imagemagick' +'combinediff' '_patchutils' +'comm' '_comm' +'command' '_command' +'comp' '_mh' +'compadd' '_compadd' +'compdef' '_compdef' +'composite' '_imagemagick' +'compress' '_compress' +'conch' '_twisted' +'config.status' '_configure' +'configure' '_configure' +'convert' '_imagemagick' +'coreadm' '_coreadm' +'cowsay' '_cowsay' +'cowthink' '_cowsay' +'cp' '_cp' +'cpio' '_cpio' +'cplay' '_cplay' +'crsh' '_cssh' +'cryptsetup' '_cryptsetup' +'csh' '_sh' +'cssh' '_cssh' +'csup' '_csup' +'curl' '_curl' +'cut' '_cut' +'cvs' '_cvs' +'cvsup' '_cvsup' +'cygcheck' '_cygcheck' +'cygcheck.exe' '_cygcheck' +'cygpath' '_cygpath' +'cygpath.exe' '_cygpath' +'cygrunsrv' '_cygrunsrv' +'cygrunsrv.exe' '_cygrunsrv' +'cygserver' '_cygserver' +'cygserver.exe' '_cygserver' +'cygstart' '_cygstart' +'cygstart.exe' '_cygstart' +'dak' '_dak' +'darcs' '_darcs' +'date' '_date' +'dbus-monitor' '_dbus' +'dbus-send' '_dbus' +'dch' '_debchange' +'dchroot' '_dchroot' +'dchroot-dsa' '_dchroot-dsa' +'dcop' '_dcop' +'dcopclient' '_dcop' +'dcopfind' '_dcop' +'dcopobject' '_dcop' +'dcopref' '_dcop' +'dcopstart' '_dcop' +'dcut' '_dcut' +'dd' '_dd' +'debchange' '_debchange' +'debcheckout' '_debcheckout' +'debdiff' '_debdiff' +'debfoster' '_debfoster' +'debsign' '_debsign' +'declare' '_typeset' +'defaults' '_defaults' +'delta' '_sccs' +'devtodo' '_devtodo' +'df' '_df' +'dhclient' '_dhclient' +'dhclient3' '_dhclient' +'dhcpinfo' '_dhcpinfo' +'dict' '_dict' +'diff' '_diff' +'diffstat' '_diffstat' +'dillo' '_webbrowser' +'dircmp' '_directories' +'dirs' '_dirs' +'disable' '_disable' +'disown' '_jobs_fg' +'display' '_imagemagick' +'dist' '_mh' +'django-admin' '_django' +'django-admin.py' '_django' +'dladm' '_dladm' +'dlocate' '_dlocate' +'dmake' '_make' +'dmidecode' '_dmidecode' +'dnf' '_dnf' +'domainname' '_yp' +'dosdel' '_floppy' +'dosread' '_floppy' +'dpatch-edit-patch' '_dpatch-edit-patch' +'dpkg' '_dpkg' +'dpkg-buildpackage' '_dpkg-buildpackage' +'dpkg-cross' '_dpkg-cross' +'dpkg-deb' '_dpkg' +'dpkg-query' '_dpkg' +'dpkg-reconfigure' '_dpkg' +'dpkg-repack' '_dpkg-repack' +'dpkg-source' '_dpkg_source' +'dput' '_dput' +'dsh' '_dsh' +'dtrace' '_dtrace' +'du' '_du' +'dumpadm' '_dumpadm' +'dumper' '_dumper' +'dumper.exe' '_dumper' +'dupload' '_dupload' +'dvibook' '_dvi' +'dviconcat' '_dvi' +'dvicopy' '_dvi' +'dvidvi' '_dvi' +'dvipdf' '_dvi' +'dvips' '_dvi' +'dviselect' '_dvi' +'dvitodvi' '_dvi' +'dvitype' '_dvi' +'dwb' '_webbrowser' +'ecasound' '_ecasound' +'echotc' '_echotc' +'echoti' '_echoti' +'egrep' '_grep' +'elfdump' '_elfdump' +'elinks' '_elinks' +'elm' '_elm' +'emulate' '_emulate' +'enable' '_enable' +'enscript' '_enscript' +'env' '_env' +'epdfview' '_pdf' +'epsffit' '_psutils' +'erb' '_ruby' +'espeak' '_espeak' +'etags' '_etags' +'ethtool' '_ethtool' +'eu-nm' '_nm' +'eu-readelf' '_readelf' +'eval' '_precommand' +'eview' '_vim' +'evim' '_vim' +'evince' '_pspdf' +'exec' '_precommand' +'explodepkg' '_pkgtool' +'export' '_typeset' +'express' '_webbrowser' +'extcheck' '_java' +'extractres' '_psutils' +'fakeroot' '_fakeroot' +'false' '_nothing' +'fc' '_fc' +'fc-list' '_xft_fonts' +'fc-match' '_xft_fonts' +'feh' '_feh' +'fetch' '_fetch' +'fetchmail' '_fetchmail' +'ffmpeg' '_ffmpeg' +'fg' '_jobs_fg' +'fgrep' '_grep' +'figlet' '_figlet' +'filterdiff' '_patchutils' +'find' '_find' +'findaffix' '_ispell' +'finger' '_finger' +'fink' '_fink' +'firefox' '_mozilla' +'fixdlsrps' '_psutils' +'fixfmps' '_psutils' +'fixmacps' '_psutils' +'fixpsditps' '_psutils' +'fixpspps' '_psutils' +'fixscribeps' '_psutils' +'fixtpps' '_psutils' +'fixwfwps' '_psutils' +'fixwpps' '_psutils' +'fixwwps' '_psutils' +'flasher' '_flasher' +'flex' '_flex' +'flipdiff' '_patchutils' +'flist' '_mh' +'flists' '_mh' +'float' '_typeset' +'flowadm' '_flowadm' +'fmadm' '_fmadm' +'fmttest' '_mh' +'fned' '_zed' +'fnext' '_mh' +'folder' '_mh' +'folders' '_mh' +'fortune' '_fortune' +'forw' '_mh' +'fprev' '_mh' +'freebsd-make' '_make' +'freebsd-update' '_freebsd-update' +'fsh' '_fsh' +'fstat' '_fstat' +'ftp' '_hosts' +'functions' '_typeset' +'fuser' '_fuser' +'fusermount' '_fusermount' +'fwhois' '_whois' +'g++' '_gcc' +'galeon' '_webbrowser' +'gcc' '_gcc' +'gccgo' '_go' +'gchmod' '_chmod' +'gcmp' '_cmp' +'gcomm' '_comm' +'gcore' '_gcore' +'gcount' '_git' +'gcp' '_cp' +'gdate' '_date' +'gdb' '_gdb' +'gdiff' '_diff' +'gdu' '_du' +'gdv' '_git' +'genisoimage' '_genisoimage' +'get' '_sccs' +'getafm' '_psutils' +'getclip' '_getclip' +'getclip.exe' '_getclip' +'getconf' '_getconf' +'getent' '_getent' +'getfacl' '_getfacl' +'getfacl.exe' '_getfacl' +'getfattr' '_attr' +'getmail' '_getmail' +'getopts' '_vars' +'gex' '_vim' +'gfg' '_grep' +'gfind' '_find' +'ggf' '_git' +'ggl' '_git' +'ggp' '_git' +'ggpnp' '_git' +'ggpull' '_git' +'ggpur' '_git' +'ggpush' '_git' +'ggu' '_git' +'ggv' '_gnome-gv' +'ghostscript' '_gs' +'ghostview' '_pspdf' +'gid' '_id' +'git' '_git' +'git-buildpackage' '_git-buildpackage' +'git-cvsserver' '_git' +'git-receive-pack' '_git' +'git-shell' '_git' +'git-svn-dcommit-push' '_git' +'git-upload-archive' '_git' +'git-upload-pack' '_git' +'gitk' '_git' +'gjoin' '_join' +'gk' '_git' +'gke' '_git' +'gln' '_ln' +'global' '_global' +'glp' '_git' +'gls' '_ls' +'gm' '_graphicsmagick' +'gmake' '_make' +'gmd5sum' '_md5sum' +'gmkdir' '_mkdir' +'gmplayer' '_mplayer' +'gnl' '_nl' +'gnome-gv' '_gnome-gv' +'gnupod_INIT' '_gnupod' +'gnupod_INIT.pl' '_gnupod' +'gnupod_addsong' '_gnupod' +'gnupod_addsong.pl' '_gnupod' +'gnupod_check' '_gnupod' +'gnupod_check.pl' '_gnupod' +'gnupod_search' '_gnupod' +'gnupod_search.pl' '_gnupod' +'gnutls-cli' '_gnutls' +'gnutls-cli-debug' '_gnutls' +'god' '_od' +'gofmt' '_go' +'gpatch' '_patch' +'gpg' '_gpg' +'gpg-zip' '_gpg' +'gpg2' '_gpg' +'gpgv' '_gpg' +'gphoto2' '_gphoto2' +'gpoat' '_git' +'gprof' '_gprof' +'gqview' '_gqview' +'gradle' '_gradle' +'gradlew' '_gradle' +'grail' '_webbrowser' +'grep' '_grep' +'grep-excuses' '_grep-excuses' +'grepdiff' '_patchutils' +'grm' '_rm' +'groff' '_groff' +'groupadd' '_user_admin' +'groupdel' '_groups' +'groupmod' '_user_admin' +'groups' '_users' +'growisofs' '_growisofs' +'gs' '_gs' +'gsbj' '_pspdf' +'gsdj' '_pspdf' +'gsdj500' '_pspdf' +'gsed' '_sed' +'gslj' '_pspdf' +'gslp' '_pspdf' +'gsnd' '_pspdf' +'gsort' '_sort' +'gtar' '_tar' +'guilt' '_guilt' +'guilt-add' '_guilt' +'guilt-applied' '_guilt' +'guilt-delete' '_guilt' +'guilt-files' '_guilt' +'guilt-fold' '_guilt' +'guilt-fork' '_guilt' +'guilt-header' '_guilt' +'guilt-help' '_guilt' +'guilt-import' '_guilt' +'guilt-import-commit' '_guilt' +'guilt-init' '_guilt' +'guilt-new' '_guilt' +'guilt-next' '_guilt' +'guilt-patchbomb' '_guilt' +'guilt-pop' '_guilt' +'guilt-prev' '_guilt' +'guilt-push' '_guilt' +'guilt-rebase' '_guilt' +'guilt-refresh' '_guilt' +'guilt-rm' '_guilt' +'guilt-series' '_guilt' +'guilt-status' '_guilt' +'guilt-top' '_guilt' +'guilt-unapplied' '_guilt' +'guniq' '_uniq' +'gunzip' '_gzip' +'gv' '_gv' +'gview' '_vim' +'gvim' '_vim' +'gvimdiff' '_vim' +'gwc' '_wc' +'gxargs' '_xargs' +'gzcat' '_gzip' +'gzilla' '_webbrowser' +'gzip' '_gzip' +'hash' '_hash' +'hdiutil' '_hdiutil' +'head' '_head' +'help' '_sccs' +'hg' '_hg' +'hilite' '_precommand' +'history' '_fc' +'host' '_hosts' +'hotjava' '_webbrowser' +'hwinfo' '_hwinfo' +'iceweasel' '_mozilla' +'icombine' '_ispell' +'iconv' '_iconv' +'id' '_id' +'identify' '_imagemagick' +'ifconfig' '_ifconfig' +'ifdown' '_net_interfaces' +'iftop' '_iftop' +'ifup' '_net_interfaces' +'ijoin' '_ispell' +'import' '_imagemagick' +'inc' '_mh' +'includeres' '_psutils' +'inetadm' '_inetadm' +'info' '_texinfo' +'infocmp' '_terminals' +'initctl' '_initctl' +'insmod' '_modutils' +'install-info' '_texinfo' +'installpkg' '_pkgtool' +'integer' '_typeset' +'interdiff' '_patchutils' +'invoke-rc.d' '_invoke-rc.d' +'ionice' '_ionice' +'ip' '_ip' +'ipadm' '_ipadm' +'ipset' '_ipset' +'iptables' '_iptables' +'iptables-restore' '_iptables' +'iptables-save' '_iptables' +'irb' '_ruby' +'irssi' '_irssi' +'ispell' '_ispell' +'iwconfig' '_iwconfig' +'jadetex' '_tex' +'jar' '_java' +'jarsigner' '_java' +'java' '_java' +'javac' '_java' +'javadoc' '_java' +'javah' '_java' +'javap' '_java' +'jdb' '_java' +'jexec' '_jexec' +'jls' '_jls' +'jobs' '_jobs_builtin' +'joe' '_joe' +'join' '_join' +'keytool' '_java' +'kfmclient' '_kfmclient' +'kill' '_kill' +'killall' '_killall' +'killall5' '_killall' +'kioclient' '_kfmclient' +'kldload' '_kld' +'kldunload' '_kld' +'knock' '_knock' +'konqueror' '_webbrowser' +'kpdf' '_pdf' +'ksh' '_sh' +'kvno' '_kvno' +'last' '_last' +'lastb' '_last' +'latex' '_tex' +'latexmk' '_tex' +'ldd' '_ldd' +'less' '_less' +'let' '_math' +'lftp' '_ncftp' +'lha' '_lha' +'light' '_webbrowser' +'lighty-disable-mod' '_lighttpd' +'lighty-enable-mod' '_lighttpd' +'limit' '_limit' +'links' '_links' +'lintian' '_lintian' +'lintian-info' '_lintian' +'linux' '_uml' +'lldb' '_lldb' +'llvm-g++' '_gcc' +'llvm-gcc' '_gcc' +'ln' '_ln' +'loadkeys' '_loadkeys' +'local' '_typeset' +'locate' '_locate' +'logname' '_nothing' +'look' '_look' +'lore' '_twisted' +'losetup' '_losetup' +'lp' '_lp' +'lpadmin' '_lp' +'lpinfo' '_lp' +'lpoptions' '_lp' +'lpq' '_lp' +'lpr' '_lp' +'lprm' '_lp' +'lpstat' '_lp' +'ls' '_ls' +'lscfg' '_lscfg' +'lsdev' '_lsdev' +'lsdiff' '_patchutils' +'lslv' '_lslv' +'lsmod' '_modutils' +'lsof' '_lsof' +'lspv' '_lspv' +'lsusb' '_lsusb' +'lsvg' '_lsvg' +'lynx' '_lynx' +'lzcat' '_xz' +'lzma' '_xz' +'lzop' '_lzop' +'m-a' '_module-assistant' +'madison' '_madison' +'mail' '_mail' +'mailx' '_mail' +'make' '_make' +'make-kpkg' '_make-kpkg' +'makeinfo' '_texinfo' +'makepkg' '_pkgtool' +'man' '_man' +'man-preview' '_man' +'manage.py' '_django' +'manhole' '_twisted' +'mark' '_mh' +'matlab' '_matlab' +'mattrib' '_mtools' +'mcd' '_mtools' +'mcopy' '_mtools' +'md5sum' '_md5sum' +'mdadm' '_mdadm' +'mdel' '_mtools' +'mdeltree' '_mtools' +'mdir' '_mtools' +'mdu' '_mtools' +'members' '_members' +'mencal' '_mencal' +'mere' '_mere' +'merge' '_rcs' +'mergechanges' '_mergechanges' +'metaflac' '_metaflac' +'mformat' '_mtools' +'mgv' '_pspdf' +'mhfixmsg' '_mh' +'mhlist' '_mh' +'mhmail' '_mh' +'mhn' '_mh' +'mhparam' '_mh' +'mhpath' '_mh' +'mhshow' '_mh' +'mhstore' '_mh' +'mii-tool' '_mii-tool' +'mixerctl' '_mixerctl' +'mkdir' '_mkdir' +'mkisofs' '_growisofs' +'mkshortcut' '_mkshortcut' +'mkshortcut.exe' '_mkshortcut' +'mktunes' '_gnupod' +'mktunes.pl' '_gnupod' +'mkzsh' '_mkzsh' +'mkzsh.exe' '_mkzsh' +'mlabel' '_mtools' +'mlocate' '_locate' +'mmd' '_mtools' +'mmm' '_webbrowser' +'mmount' '_mtools' +'mmove' '_mtools' +'modinfo' '_modutils' +'modprobe' '_modutils' +'module' '_module' +'module-assistant' '_module-assistant' +'mogrify' '_imagemagick' +'mondoarchive' '_mondo' +'montage' '_imagemagick' +'moosic' '_moosic' +'mosh' '_mosh' +'mount' '_mount' +'mozilla' '_mozilla' +'mozilla-firefox' '_mozilla' +'mozilla-xremote-client' '_mozilla' +'mpc' '_mpc' +'mplayer' '_mplayer' +'mrd' '_mtools' +'mread' '_mtools' +'mren' '_mtools' +'msgchk' '_mh' +'mt' '_mt' +'mtn' '_monotone' +'mtoolstest' '_mtools' +'mtr' '_mtr' +'mtype' '_mtools' +'munchlist' '_ispell' +'mupdf' '_pdf' +'mush' '_mail' +'mutt' '_mutt' +'mx' '_hosts' +'mysql' '_mysql_utils' +'mysqladmin' '_mysql_utils' +'mysqldiff' '_mysqldiff' +'mysqldump' '_mysql_utils' +'mysqlimport' '_mysql_utils' +'mysqlshow' '_mysql_utils' +'nail' '_mail' +'native2ascii' '_java' +'nautilus' '_nautilus' +'nc' '_netcat' +'ncal' '_cal' +'ncftp' '_ncftp' +'ncl' '_nedit' +'nedit' '_nedit' +'nedit-nc' '_nedit' +'netcat' '_netcat' +'netrik' '_webbrowser' +'netscape' '_netscape' +'netstat' '_netstat' +'new' '_mh' +'newgrp' '_groups' +'next' '_mh' +'nice' '_nice' +'nkf' '_nkf' +'nl' '_nl' +'nm' '_nm' +'nmap' '_nmap' +'nmblookup' '_samba' +'nmcli' '_nmcli' +'nocorrect' '_precommand' +'noglob' '_precommand' +'nohup' '_precommand' +'notmuch' '_notmuch' +'npm' '_npm' +'ns' '_hosts' +'nslookup' '_nslookup' +'ntalk' '_other_accounts' +'nvim' '_vim' +'objdump' '_objdump' +'od' '_od' +'odme' '_object_classes' +'odmget' '_object_classes' +'odmshow' '_object_classes' +'ogg123' '_vorbis' +'oggdec' '_vorbis' +'oggenc' '_vorbis' +'ogginfo' '_vorbis' +'okular' '_okular' +'open' '_open' +'opera' '_webbrowser' +'opera-next' '_webbrowser' +'osc' '_osc' +'p4' '_perforce' +'p4d' '_perforce' +'pack' '_pack' +'packf' '_mh' +'parsehdlist' '_urpmi' +'passwd' '_users' +'patch' '_patch' +'pax' '_pax' +'pbuilder' '_pbuilder' +'pcat' '_pack' +'pcred' '_pids' +'pdf2dsc' '_pdf' +'pdf2ps' '_pdf' +'pdffonts' '_pdf' +'pdfimages' '_pdf' +'pdfinfo' '_pdf' +'pdfjadetex' '_tex' +'pdflatex' '_tex' +'pdfopt' '_pdf' +'pdftex' '_tex' +'pdftk' '_pdftk' +'pdftopbm' '_pdf' +'pdftops' '_pdf' +'pdftotext' '_pdf' +'perl' '_perl' +'perldoc' '_perldoc' +'pfctl' '_pfctl' +'pfexec' '_pfexec' +'pfiles' '_pids' +'pflags' '_pids' +'pgrep' '_pgrep' +'php' '_php' +'pick' '_mh' +'pigz' '_gzip' +'pine' '_pine' +'pinef' '_pine' +'ping' '_ping' +'piuparts' '_piuparts' +'pkg' '_pkg5' +'pkg-config' '_pkg-config' +'pkg_add' '_bsd_pkg' +'pkg_create' '_bsd_pkg' +'pkg_delete' '_bsd_pkg' +'pkg_info' '_bsd_pkg' +'pkgadd' '_pkgadd' +'pkginfo' '_pkginfo' +'pkgrm' '_pkgrm' +'pkgtool' '_pkgtool' +'pkill' '_pgrep' +'pldd' '_pids' +'pmake' '_make' +'pman' '_perl_modules' +'pmap' '_pids' +'pmcat' '_perl_modules' +'pmdesc' '_perl_modules' +'pmeth' '_perl_modules' +'pmexp' '_perl_modules' +'pmfunc' '_perl_modules' +'pmload' '_perl_modules' +'pmls' '_perl_modules' +'pmpath' '_perl_modules' +'pmvers' '_perl_modules' +'podgrep' '_perl_modules' +'podpath' '_perl_modules' +'podtoc' '_perl_modules' +'poff' '_pon' +'policytool' '_java' +'pon' '_pon' +'popd' '_directory_stack' +'portaudit' '_portaudit' +'portlint' '_portlint' +'portmaster' '_portmaster' +'portsnap' '_portsnap' +'postsuper' '_postfix' +'powerd' '_powerd' +'prcs' '_prcs' +'prev' '_mh' +'print' '_print' +'printenv' '_printenv' +'printf' '_print' +'procstat' '_procstat' +'prompt' '_prompt' +'prove' '_prove' +'prs' '_sccs' +'prstat' '_prstat' +'prt' '_sccs' +'prun' '_pids' +'ps' '_ps' +'ps2ascii' '_pspdf' +'ps2epsi' '_postscript' +'ps2pdf' '_postscript' +'ps2pdf12' '_postscript' +'ps2pdf13' '_postscript' +'ps2pdf14' '_postscript' +'ps2pdfwr' '_postscript' +'ps2ps' '_postscript' +'psbook' '_psutils' +'pscp' '_pscp' +'pscp.exe' '_pscp' +'psed' '_sed' +'psig' '_pids' +'psmerge' '_psutils' +'psmulti' '_postscript' +'psnup' '_psutils' +'psresize' '_psutils' +'psselect' '_psutils' +'pstack' '_pids' +'pstoedit' '_pspdf' +'pstop' '_pids' +'pstops' '_psutils' +'pstotgif' '_pspdf' +'pswrap' '_postscript' +'ptree' '_ptree' +'pump' '_pump' +'pushd' '_cd' +'putclip' '_putclip' +'putclip.exe' '_putclip' +'pwait' '_pids' +'pwdx' '_pids' +'pyhtmlizer' '_twisted' +'qdbus' '_qdbus' +'qiv' '_qiv' +'qtplay' '_qtplay' +'querybts' '_bug' +'quilt' '_quilt' +'r' '_fc' +'raggle' '_raggle' +'rake' '_rake' +'ranlib' '_ranlib' +'rar' '_rar' +'rc' '_sh' +'rcp' '_rlogin' +'rcs' '_rcs' +'rcsdiff' '_rcs' +'rdesktop' '_rdesktop' +'read' '_read' +'readelf' '_readelf' +'readonly' '_typeset' +'readshortcut' '_readshortcut' +'readshortcut.exe' '_readshortcut' +'rebootin' '_rebootin' +'refile' '_mh' +'rehash' '_hash' +'reload' '_initctl' +'removepkg' '_pkgtool' +'remsh' '_rlogin' +'renice' '_renice' +'repl' '_mh' +'reportbug' '_bug' +'reprepro' '_reprepro' +'restart' '_initctl' +'retawq' '_webbrowser' +'rgview' '_vim' +'rgvim' '_vim' +'ri' '_ri' +'rlogin' '_rlogin' +'rm' '_rm' +'rmadison' '_madison' +'rmdel' '_sccs' +'rmdir' '_directories' +'rmf' '_mh' +'rmic' '_java' +'rmid' '_java' +'rmiregistry' '_java' +'rmm' '_mh' +'rmmod' '_modutils' +'rpm' '_rpm' +'rpmbuild' '_rpmbuild' +'rrdtool' '_rrdtool' +'rsh' '_rlogin' +'rsync' '_rsync' +'rtin' '_tin' +'rubber' '_rubber' +'rubber-info' '_rubber' +'rubber-pipe' '_rubber' +'ruby' '_ruby' +'run-help' '_run-help' +'rup' '_hosts' +'rusage' '_precommand' +'rview' '_vim' +'rvim' '_vim' +'rwho' '_hosts' +'rxvt' '_urxvt' +'s2p' '_sed' +'sabcmd' '_sablotron' +'sact' '_sccs' +'savecore' '_savecore' +'scan' '_mh' +'sccs' '_sccs' +'sccsdiff' '_sccs' +'sched' '_sched' +'schedtool' '_schedtool' +'schroot' '_schroot' +'scl' '_scl' +'scp' '_ssh' +'screen' '_screen' +'sed' '_sed' +'serialver' '_java' +'service' '_service' +'set' '_set' +'setfacl' '_setfacl' +'setfacl.exe' '_setfacl' +'setfattr' '_attr' +'setopt' '_setopt' +'sftp' '_ssh' +'sh' '_sh' +'shift' '_arrays' +'show' '_mh' +'showchar' '_psutils' +'showmount' '_showmount' +'sisu' '_sisu' +'skipstone' '_webbrowser' +'slitex' '_tex' +'slocate' '_locate' +'slogin' '_ssh' +'slrn' '_slrn' +'smbclient' '_samba' +'smbcontrol' '_samba' +'smbstatus' '_samba' +'smit' '_smit' +'smitty' '_smit' +'snoop' '_snoop' +'soa' '_hosts' +'socket' '_socket' +'sockstat' '_sockstat' +'softwareupdate' '_softwareupdate' +'sort' '_sort' +'sortm' '_mh' +'source' '_source' +'spamassassin' '_spamassassin' +'splitdiff' '_patchutils' +'sqlite' '_sqlite' +'sqlite3' '_sqlite' +'sqsh' '_sqsh' +'sr' '_surfraw' +'srptool' '_gnutls' +'ss' '_ss' +'ssh' '_ssh' +'ssh-add' '_ssh' +'ssh-agent' '_ssh' +'ssh-copy-id' '_ssh' +'ssh-keygen' '_ssh' +'sshfs' '_sshfs' +'star' '_tar' +'start' '_initctl' +'stat' '_stat' +'status' '_initctl' +'stg' '_stgit' +'stop' '_initctl' +'strace' '_strace' +'strftime' '_strftime' +'strip' '_strip' +'stty' '_stty' +'su' '_su' +'sudo' '_sudo' +'sudoedit' '_sudo' +'surfraw' '_surfraw' +'sv' '_runit' +'svcadm' '_svcadm' +'svccfg' '_svccfg' +'svcprop' '_svcprop' +'svcs' '_svcs' +'svn' '_subversion' +'svn-buildpackage' '_svn-buildpackage' +'svnadmin' '_subversion' +'svnadmin-static' '_subversion' +'sync' '_nothing' +'sysctl' '_sysctl' +'systat' '_systat' +'system_profiler' '_system_profiler' +'tail' '_tail' +'talk' '_other_accounts' +'tap2deb' '_twisted' +'tap2rpm' '_twisted' +'tapconvert' '_twisted' +'tar' '_tar' +'tardy' '_tardy' +'tcp_open' '_tcpsys' +'tcpdump' '_tcpdump' +'tcptraceroute' '_tcptraceroute' +'tcsh' '_sh' +'tda' '_devtodo' +'tdd' '_devtodo' +'tde' '_devtodo' +'tdr' '_devtodo' +'telnet' '_telnet' +'tex' '_tex' +'texi2dvi' '_texinfo' +'texindex' '_texinfo' +'tg' '_topgit' +'tidy' '_tidy' +'tig' '_git' +'time' '_precommand' +'times' '_nothing' +'tin' '_tin' +'tkconch' '_twisted' +'tkinfo' '_texinfo' +'tla' '_tla' +'tmux' '_tmux' +'todo' '_devtodo' +'todo.sh' '_todo.sh' +'toilet' '_toilet' +'totdconfig' '_totd' +'tpb' '_tpb' +'tpconfig' '_tpconfig' +'tpkg-debarch' '_toolchain-source' +'tpkg-install' '_toolchain-source' +'tpkg-install-libc' '_toolchain-source' +'tpkg-make' '_toolchain-source' +'tpkg-update' '_toolchain-source' +'tr' '_tr' +'tracepath' '_tracepath' +'tracepath6' '_tracepath' +'traceroute' '_hosts' +'trap' '_trap' +'tree' '_tree' +'trial' '_twisted' +'true' '_nothing' +'tryaffix' '_ispell' +'ttyctl' '_ttyctl' +'tunctl' '_uml' +'tune2fs' '_tune2fs' +'tunes2pod' '_gnupod' +'tunes2pod.pl' '_gnupod' +'twidge' '_twidge' +'twistd' '_twisted' +'txt' '_hosts' +'type' '_which' +'typeset' '_typeset' +'ulimit' '_ulimit' +'uml_mconsole' '_uml' +'uml_moo' '_uml' +'uml_switch' '_uml' +'umount' '_mount' +'unace' '_unace' +'unalias' '_aliases' +'uname' '_uname' +'uncompress' '_compress' +'unexpand' '_unexpand' +'unfunction' '_functions' +'unget' '_sccs' +'unhash' '_unhash' +'uniq' '_uniq' +'unison' '_unison' +'units' '_units' +'unlimit' '_limits' +'unlzma' '_xz' +'unpack' '_pack' +'unpigz' '_gzip' +'unrar' '_rar' +'unset' '_vars' +'unsetopt' '_setopt' +'unwrapdiff' '_patchutils' +'unxz' '_xz' +'unzip' '_zip' +'update-alternatives' '_update-alternatives' +'update-rc.d' '_update-rc.d' +'upgradepkg' '_pkgtool' +'urpme' '_urpmi' +'urpmf' '_urpmi' +'urpmi' '_urpmi' +'urpmi.addmedia' '_urpmi' +'urpmi.removemedia' '_urpmi' +'urpmi.update' '_urpmi' +'urpmq' '_urpmi' +'urxvt' '_urxvt' +'urxvt256c' '_urxvt' +'urxvt256c-ml' '_urxvt' +'urxvt256c-mlc' '_urxvt' +'urxvt256cc' '_urxvt' +'urxvtc' '_urxvt' +'uscan' '_uscan' +'useradd' '_user_admin' +'userdel' '_users' +'usermod' '_user_admin' +'uzbl' '_uzbl' +'uzbl-browser' '_uzbl' +'uzbl-tabbed' '_uzbl' +'val' '_sccs' +'valgrind' '_valgrind' +'vared' '_vared' +'vcsh' '_vcsh' +'vim' '_vim' +'vim-addons' '_vim-addons' +'vimdiff' '_vim' +'vmstat' '_vmstat' +'vncserver' '_vnc' +'vncviewer' '_vnc' +'vorbiscomment' '_vorbiscomment' +'vserver' '_vserver' +'vux' '_vux' +'vuxctl' '_vux' +'w3m' '_w3m' +'wait' '_wait' +'wajig' '_wajig' +'wanna-build' '_wanna-build' +'watch' '_watch' +'wc' '_wc' +'wget' '_wget' +'what' '_sccs' +'whatis' '_man' +'whence' '_which' +'where' '_which' +'whereis' '_whereis' +'which' '_which' +'whoami' '_nothing' +'whois' '_whois' +'whom' '_mh' +'wiggle' '_wiggle' +'wodim' '_cdrecord' +'wpa_cli' '_wpa_cli' +'write' '_users_on' +'www' '_webbrowser' +'xargs' '_xargs' +'xauth' '_xauth' +'xautolock' '_xautolock' +'xclip' '_xclip' +'xdpyinfo' '_x_utils' +'xdvi' '_xdvi' +'xelatex' '_tex' +'xetex' '_tex' +'xev' '_x_utils' +'xfd' '_x_utils' +'xfig' '_xfig' +'xfontsel' '_x_utils' +'xhost' '_x_utils' +'xkill' '_x_utils' +'xli' '_xloadimage' +'xloadimage' '_xloadimage' +'xlsatoms' '_x_utils' +'xmllint' '_xmlsoft' +'xmms2' '_xmms2' +'xmodmap' '_xmodmap' +'xmosaic' '_webbrowser' +'xon' '_x_utils' +'xournal' '_xournal' +'xpdf' '_xpdf' +'xping' '_hosts' +'xprop' '_x_utils' +'xrandr' '_xrandr' +'xrdb' '_x_utils' +'xscreensaver-command' '_xscreensaver' +'xset' '_xset' +'xsetbg' '_xloadimage' +'xsetroot' '_x_utils' +'xsltproc' '_xmlsoft' +'xterm' '_xterm' +'xtightvncviewer' '_vnc' +'xtp' '_imagemagick' +'xv' '_xv' +'xview' '_xloadimage' +'xvnc4viewer' '_vnc' +'xvncviewer' '_vnc' +'xwd' '_x_utils' +'xwininfo' '_x_utils' +'xwit' '_xwit' +'xwud' '_x_utils' +'xxd' '_xxd' +'xz' '_xz' +'xzcat' '_xz' +'yast' '_yast' +'yast2' '_yast' +'ypbind' '_yp' +'ypcat' '_yp' +'ypmatch' '_yp' +'yppasswd' '_yp' +'yppoll' '_yp' +'yppush' '_yp' +'ypserv' '_yp' +'ypset' '_yp' +'ypwhich' '_yp' +'ypxfr' '_yp' +'ytalk' '_other_accounts' +'yum' '_yum' +'zargs' '_zargs' +'zathura' '_pspdf' +'zcalc' '_zcalc' +'zcat' '_zcat' +'zcompile' '_zcompile' +'zcp' '_zmv' +'zdelattr' '_zattr' +'zdump' '_zdump' +'zed' '_zed' +'zegrep,' '_grep' +'zen' '_webbrowser' +'zf_chgrp' '_chown' +'zf_chown' '_chown' +'zf_ln' '_ln' +'zf_mkdir' '_mkdir' +'zf_rm' '_rm' +'zf_rmdir' '_directories' +'zfgrep' '_grep' +'zfs' '_zfs' +'zgetattr' '_zattr' +'zgrep,' '_grep' +'zip' '_zip' +'zipinfo' '_zip' +'zle' '_zle' +'zlistattr' '_zattr' +'zln' '_zmv' +'zlogin' '_zlogin' +'zmail' '_mail' +'zmodload' '_zmodload' +'zmv' '_zmv' +'zone' '_hosts' +'zoneadm' '_zoneadm' +'zpool' '_zpool' +'zpty' '_zpty' +'zsetattr' '_zattr' +'zsh' '_zsh' +'zsh-mime-handler' '_zsh-mime-handler' +'zsocket' '_zsocket' +'zstat' '_stat' +'zstyle' '_zstyle' +'ztodo' '_ztodo' +'zxpdf' '_xpdf' +'zypper' '_zypper' +) + +_services=( +'-redirect-,<,bunzip2' 'bunzip2' +'-redirect-,<,bzip2' 'bzip2' +'-redirect-,<,compress' 'compress' +'-redirect-,<,gunzip' 'gunzip' +'-redirect-,<,gzip' 'gzip' +'-redirect-,<,uncompress' 'uncompress' +'-redirect-,<,unxz' 'unxz' +'-redirect-,<,xz' 'xz' +'-redirect-,>,bzip2' 'bunzip2' +'-redirect-,>,compress' 'uncompress' +'-redirect-,>,gzip' 'gunzip' +'-redirect-,>,xz' 'unxz' +'Mail' 'mail' +'bzcat' 'bunzip2' +'dch' 'debchange' +'gdv' 'git-diff' +'ggf' 'git-checkout' +'ggl' 'git-checkout' +'ggp' 'git-checkout' +'ggpnp' 'git-checkout' +'ggpull' 'git-checkout' +'ggpur' 'git-checkout' +'ggpush' 'git-checkout' +'ggu' 'git-checkout' +'git-svn-dcommit-push' 'git' +'gk' 'gitk' +'gke' 'gitk' +'glp' 'git-log' +'gnupod_INIT.pl' 'gnupod_INIT' +'gnupod_addsong.pl' 'gnupod_addsong' +'gnupod_check.pl' 'gnupod_check' +'gnupod_search.pl' 'gnupod_search' +'gpg2' 'gpg' +'gpoat' 'git-push' +'gzcat' 'gunzip' +'iceweasel' 'firefox' +'lzcat' 'unxz' +'lzma' 'xz' +'mailx' 'mail' +'mktunes.pl' 'mktunes' +'nail' 'mail' +'ncl' 'nc' +'nedit-nc' 'nc' +'pcat' 'unpack' +'remsh' 'rsh' +'slogin' 'ssh' +'svnadmin-static' 'svnadmin' +'tunes2pod.pl' 'tunes2pod' +'unlzma' 'unxz' +'xelatex' 'latex' +'xetex' 'tex' +'xzcat' 'unxz' +'zf_chgrp' 'chgrp' +'zf_chown' 'chown' +) + +_patcomps=( +'*/(init|rc[0-9S]#).d/*' '_init_d' +'zf*' '_zftp' +) + +_postpatcomps=( +'(p[bgpn]m*|*top[bgpn]m)' '_pbm' +'(ruby|[ei]rb)[0-9.]#' '_ruby' +'(texi(2*|ndex))' '_texi' +'(tiff*|*2tiff|pal2rgb)' '_tiff' +'(|cifs)iostat' '_sysstat' +'*/X11(|R<4->)/*' '_x_arguments' +'-value-,(ftp|http(|s))_proxy,-default-' '_urls' +'-value-,*PATH,-default-' '_dir_list' +'-value-,*path,-default-' '_directories' +'-value-,LC_*,-default-' '_locales' +'-value-,RUBY(LIB|OPT|PATH),-default-' '_ruby' +'isag' '_sysstat' +'mpstat' '_sysstat' +'pidstat' '_sysstat' +'pydoc[0-9.]#' '_pydoc' +'python[0-9.]#' '_python' +'qemu(|-system-*)' '_qemu' +'sadf' '_sysstat' +'sar' '_sysstat' +'yodl(|2*)' '_yodl' +) + +_compautos=( +'_call_program' '+X' +) + +zle -C _bash_complete-word .complete-word _bash_completions +zle -C _bash_list-choices .list-choices _bash_completions +zle -C _complete_debug .complete-word _complete_debug +zle -C _complete_help .complete-word _complete_help +zle -C _complete_tag .complete-word _complete_tag +zle -C _correct_filename .complete-word _correct_filename +zle -C _correct_word .complete-word _correct_word +zle -C _expand_alias .complete-word _expand_alias +zle -C _expand_word .complete-word _expand_word +zle -C _history-complete-newer .complete-word _history_complete_word +zle -C _history-complete-older .complete-word _history_complete_word +zle -C _list_expansions .list-choices _expand_word +zle -C _most_recent_file .complete-word _most_recent_file +zle -C _next_tags .list-choices _next_tags +zle -C _read_comp .complete-word _read_comp +bindkey '^X^R' _read_comp +bindkey '^X?' _complete_debug +bindkey '^XC' _correct_filename +bindkey '^Xa' _expand_alias +bindkey '^Xc' _correct_word +bindkey '^Xd' _list_expansions +bindkey '^Xe' _expand_word +bindkey '^Xh' _complete_help +bindkey '^Xm' _most_recent_file +bindkey '^Xn' _next_tags +bindkey '^Xt' _complete_tag +bindkey '^X~' _bash_list-choices +bindkey '^[,' _history-complete-newer +bindkey '^[/' _history-complete-older +bindkey '^[~' _bash_complete-word + +autoload -Uz _SUSEconfig _a2ps _a2utils _aap _acpi \ + _acpitool _acroread _adb _add-zsh-hook _alias \ + _aliases _all_labels _all_matches _alternative _analyseplugin \ + _ant _antiword _apachectl _apm _approximate \ + _apt _apt-file _apt-move _apt-show-versions _aptitude \ + _arch_archives _arch_namespace _arg_compile _arguments _arp \ + _arping _arrays _assign _at _attr \ + _augeas _auto-apt _autocd _awk _axi-cache \ + _bash_completions _baz _be_name _beadm _beep \ + _bind_addresses _bindkey _bison _bittorrent _bogofilter \ + _bpython _brace_parameter _brctl _brew _brew_cask \ + _bsd_pkg _bsdconfig _bsdinstall _btrfs _bts \ + _bug _builtin _bzip2 _bzr _cabal \ + _cache_invalid _cal _calendar _call_function _canonical_paths \ + _cat _ccal _cd _cdbs-edit-patch _cdcd \ + _cdr _cdrdao _cdrecord _chflags _chkconfig \ + _chmod _chown _chrt _chsh _clay \ + _cmdstring _cmp _combination _comm _command \ + _command_names _comp_locale _compadd _compdef _complete \ + _complete_debug _complete_help _complete_help_generic _complete_tag _compress \ + _condition _configure _coreadm _correct _correct_filename \ + _correct_word _cowsay _cp _cpio _cplay \ + _cryptsetup _cssh _csup _ctags_tags _curl \ + _current_dir _cut _cvs _cvsup _cygcheck \ + _cygpath _cygrunsrv _cygserver _cygstart _dak \ + _darcs _date _date_formats _dates _dbus \ + _dchroot _dchroot-dsa _dcop _dcut _dd \ + _deb_architectures _deb_packages _debchange _debcheckout _debdiff \ + _debfoster _debsign _default _defaults _delimiters \ + _describe _description _devtodo _df _dhclient \ + _dhcpinfo _dict _dict_words _diff _diff_options \ + _diffstat _dir_list _directories _directory_stack _dirs \ + _disable _dispatch _django _dladm _dlocate \ + _dmidecode _dnf _domains _dpatch-edit-patch _dpkg \ + _dpkg-buildpackage _dpkg-cross _dpkg-repack _dpkg_source _dput \ + _dsh _dtrace _du _dumpadm _dumper \ + _dupload _dvi _dynamic_directory_name _ecasound _echotc \ + _echoti _elfdump _elinks _elm _email_addresses \ + _emulate _enable _enscript _env _equal \ + _espeak _etags _ethtool _expand _expand_alias \ + _expand_word _extensions _external_pwds _fakeroot _fc \ + _feh _fetch _fetchmail _ffmpeg _figlet \ + _file_descriptors _file_systems _files _find _find_net_interfaces \ + _finger _fink _first _flasher _flex \ + _floppy _flowadm _fmadm _fortune _freebsd-update \ + _fsh _fstat _functions _fuse_arguments _fuse_values \ + _fuser _fusermount _gcc _gcore _gdb \ + _generic _genisoimage _getclip _getconf _getent \ + _getfacl _getmail _git _git-buildpackage _git_log_prettily \ + _git_time_since_commit _global _global_tags _globflags _globqual_delims \ + _globquals _gnome-gv _gnu_generic _gnupod _gnutls \ + _go _gpg _gphoto2 _gprof _gqview \ + _gradle _graphicsmagick _grep _grep-excuses _groff \ + _groups _growisofs _gs _guard _guilt \ + _gv _gzip _hash _have_glob_qual _hdiutil \ + _head _hg _history _history_complete_word _history_modifiers \ + _hosts _hwinfo _iconv _id _ifconfig \ + _iftop _ignored _imagemagick _in_vared _inetadm \ + _init_d _initctl _invoke-rc.d _ionice _ip \ + _ipadm _ipset _iptables _irssi _ispell \ + _iwconfig _jails _java _java_class _jexec \ + _jls _jobs _jobs_bg _jobs_builtin _jobs_fg \ + _joe _join _kfmclient _kill _killall \ + _kld _knock _kvno _last _ldd \ + _less _lha _lighttpd _limit _limits \ + _links _lintian _list _list_files _lldb \ + _ln _loadkeys _locales _locate _logical_volumes \ + _look _losetup _lp _ls _lscfg \ + _lsdev _lslv _lsof _lspv _lsusb \ + _lsvg _lynx _lzop _mac_applications _mac_files_for_application \ + _madison _mail _mailboxes _main_complete _make \ + _make-kpkg _man _match _math _math_params \ + _matlab _md5sum _mdadm _members _mencal \ + _menu _mere _mergechanges _message _metaflac \ + _mh _mii-tool _mime_types _mixerctl _mkdir \ + _mkshortcut _mkzsh _module _module-assistant _module_math_func \ + _modutils _mondo _monotone _moosic _mosh \ + _most_recent_file _mount _mozilla _mpc _mplayer \ + _mt _mtools _mtr _multi_parts _mutt \ + _my_accounts _mysql_utils _mysqldiff _nautilus _ncftp \ + _nedit _net_interfaces _netcat _netscape _netstat \ + _newsgroups _next_label _next_tags _nice _nkf \ + _nl _nm _nmap _nmcli _normal \ + _nothing _notmuch _npm _nslookup _objdump \ + _object_classes _od _okular _oldlist _omz_diag_dump_check_core_commands \ + _omz_diag_dump_echo_file_w_header _omz_diag_dump_one_big_text _omz_diag_dump_os_specific_version _omz_osx_get_frontmost_app _open \ + _options _options_set _options_unset _osc _other_accounts \ + _pack _parameter _parameters _patch _patchutils \ + _path_commands _path_files _pax _pbm _pbuilder \ + _pdf _pdftk _perforce _perl _perl_basepods \ + _perl_modules _perldoc _pfctl _pfexec _pgrep \ + _php _physical_volumes _pick_variant _pids _pine \ + _ping _piuparts _pkg-config _pkg5 _pkg_instance \ + _pkgadd _pkginfo _pkgrm _pkgtool _pon \ + _portaudit _portlint _portmaster _ports _portsnap \ + _postfix _postscript _powerd _prcs _precommand \ + _prefix _print _printenv _printers _procstat \ + _prompt _prove _prstat _ps _ps1234 \ + _pscp _pspdf _psutils _ptree _pump \ + _putclip _pydoc _python _python_modules _qdbus \ + _qemu _qiv _qtplay _quilt _raggle \ + _rake _ranlib _rar _rcs _rdesktop \ + _read _read_comp _readelf _readshortcut _rebootin \ + _redirect _regex_arguments _regex_words _remote_files _renice \ + _reprepro _requested _retrieve_cache _retrieve_mac_apps _ri \ + _rlogin _rm _rpm _rpmbuild _rrdtool \ + _rsync _rubber _ruby _ruby_version _run-help \ + _runit _sablotron _samba _savecore _sccs \ + _sched _schedtool _schroot _scl _screen \ + _sed _sep_parts _sequence _service _services \ + _set _set_command _setfacl _setopt _setup \ + _sh _showmount _signals _sisu _slrn \ + _smit _snoop _socket _sockstat _softwareupdate \ + _sort _source _spamassassin _sqlite _sqsh \ + _ss _ssh _sshfs _stat _stgit \ + _store_cache _strace _strftime _strip _stty \ + _su _sub_commands _subscript _subversion _sudo \ + _suffix_alias_files _surfraw _svcadm _svccfg _svcprop \ + _svcs _svcs_fmri _svn-buildpackage _sysctl _sysstat \ + _systat _system_profiler _tags _tail _tar \ + _tar_archive _tardy _tcpdump _tcpsys _tcptraceroute \ + _telnet _terminals _tex _texi _texinfo \ + _tidy _tiff _tilde _tilde_files _time_zone \ + _tin _tla _tmux _todo.sh _toilet \ + _toolchain-source _topgit _totd _tpb _tpconfig \ + _tr _tracepath _trap _tree _ttyctl \ + _ttys _tune2fs _twidge _twisted _typeset \ + _ulimit _uml _unace _uname _unexpand \ + _unhash _uniq _unison _units _update-alternatives \ + _update-rc.d _urls _urpmi _urxvt _uscan \ + _user_admin _user_at_host _user_expand _user_host _user_math_func \ + _users _users_on _uzbl _valgrind _value \ + _values _vared _vars _vcsh _vi_status \ + _vim _vim-addons _vmstat _vnc _volume_groups \ + _vorbis _vorbiscomment _vserver _vux _w3m \ + _wait _wajig _wakeup_capable_devices _wanna-build _wanted \ + _watch _watch-snoop _wc _webbrowser _wget \ + _whereis _which _whois _wiggle _wpa_cli \ + _x_arguments _x_borderwidth _x_color _x_colormapid _x_cursor \ + _x_display _x_extension _x_font _x_geometry _x_keysym \ + _x_locale _x_modifier _x_name _x_resource _x_selection_timeout \ + _x_title _x_utils _x_visual _x_window _xargs \ + _xauth _xautolock _xclip _xdvi _xfig \ + _xft_fonts _xloadimage _xmlsoft _xmms2 _xmodmap \ + _xournal _xpdf _xrandr _xscreensaver _xset \ + _xt_arguments _xt_session_id _xterm _xv _xwit \ + _xxd _xz _yast _yodl _yp \ + _yum _zargs _zattr _zcalc _zcalc_line \ + _zcat _zcompile _zdump _zed _zfs \ + _zfs_dataset _zfs_keysource_props _zfs_pool _zftp _zip \ + _zle _zlogin _zmodload _zmv _zoneadm \ + _zones _zpool _zpty _zsh _zsh-mime-handler \ + _zsocket _zstyle _ztodo _zypper +autoload -Uz +X _call_program + +typeset -gUa _comp_assocs +_comp_assocs=( '' ) diff --git a/.config/zsh/.zsh-update b/.config/zsh/.zsh-update @@ -0,0 +1 @@ +LAST_EPOCH=17183 diff --git a/.config/zsh/oh-my-zsh.sh b/.config/zsh/oh-my-zsh.sh @@ -0,0 +1,113 @@ +# Check for updates on initial load... +if [ "$DISABLE_AUTO_UPDATE" != "true" ]; then + env ZSH=$ZSH DISABLE_UPDATE_PROMPT=$DISABLE_UPDATE_PROMPT zsh -f $ZSH/tools/check_for_upgrade.sh +fi + +# Initializes Oh My Zsh + +# add a function path +fpath=($ZSH/functions $ZSH/completions $fpath) + +# Load all stock functions (from $fpath files) called below. +autoload -U compaudit compinit + +: ${ZSH_DISABLE_COMPFIX:=true} + +# Set ZSH_CUSTOM to the path where your custom config files +# and plugins exists, or else we will use the default custom/ +if [[ -z "$ZSH_CUSTOM" ]]; then + ZSH_CUSTOM="$ZSH/custom" +fi + +# Set ZSH_CACHE_DIR to the path where cache files should be created +# or else we will use the default cache/ +if [[ -z "$ZSH_CACHE_DIR" ]]; then + ZSH_CACHE_DIR="$ZSH/cache" +fi + + +# Load all of the config files in ~/oh-my-zsh that end in .zsh +# TIP: Add files you don't want in git to .gitignore +for config_file ($ZSH/lib/*.zsh); do + custom_config_file="${ZSH_CUSTOM}/lib/${config_file:t}" + [ -f "${custom_config_file}" ] && config_file=${custom_config_file} + source $config_file +done + + +is_plugin() { + local base_dir=$1 + local name=$2 + test -f $base_dir/plugins/$name/$name.plugin.zsh \ + || test -f $base_dir/plugins/$name/_$name +} +# Add all defined plugins to fpath. This must be done +# before running compinit. +for plugin ($plugins); do + if is_plugin $ZSH_CUSTOM $plugin; then + fpath=($ZSH_CUSTOM/plugins/$plugin $fpath) + elif is_plugin $ZSH $plugin; then + fpath=($ZSH/plugins/$plugin $fpath) + fi +done + +# Figure out the SHORT hostname +if [[ "$OSTYPE" = darwin* ]]; then + # macOS's $HOST changes with dhcp, etc. Use ComputerName if possible. + SHORT_HOST=$(scutil --get ComputerName 2>/dev/null) || SHORT_HOST=${HOST/.*/} +else + SHORT_HOST=${HOST/.*/} +fi + +# Save the location of the current completion dump file. +if [ -z "$ZSH_COMPDUMP" ]; then + ZSH_COMPDUMP="${ZDOTDIR:-${HOME}}/.zcompdump-${SHORT_HOST}-${ZSH_VERSION}" +fi + +if [[ $ZSH_DISABLE_COMPFIX != true ]]; then + # If completion insecurities exist, warn the user without enabling completions. + if ! compaudit &>/dev/null; then + # This function resides in the "lib/compfix.zsh" script sourced above. + handle_completion_insecurities + # Else, enable and cache completions to the desired file. + else + compinit -d "${ZSH_COMPDUMP}" + fi +else + compinit -i -d "${ZSH_COMPDUMP}" +fi + +# Load all of the plugins that were defined in ~/.zshrc +for plugin ($plugins); do + if [ -f $ZSH_CUSTOM/plugins/$plugin/$plugin.plugin.zsh ]; then + source $ZSH_CUSTOM/plugins/$plugin/$plugin.plugin.zsh + elif [ -f $ZSH/plugins/$plugin/$plugin.plugin.zsh ]; then + source $ZSH/plugins/$plugin/$plugin.plugin.zsh + fi +done + +# Load all of your custom configurations from custom/ +for config_file ($ZSH_CUSTOM/*.zsh(N)); do + source $config_file +done +unset config_file + +# Load the theme +if [ "$ZSH_THEME" = "random" ]; then + themes=($ZSH/themes/*zsh-theme) + N=${#themes[@]} + ((N=(RANDOM%N)+1)) + RANDOM_THEME=${themes[$N]} + source "$RANDOM_THEME" + echo "[oh-my-zsh] Random theme '$RANDOM_THEME' loaded..." +else + if [ ! "$ZSH_THEME" = "" ]; then + if [ -f "$ZSH_CUSTOM/$ZSH_THEME.zsh-theme" ]; then + source "$ZSH_CUSTOM/$ZSH_THEME.zsh-theme" + elif [ -f "$ZSH_CUSTOM/themes/$ZSH_THEME.zsh-theme" ]; then + source "$ZSH_CUSTOM/themes/$ZSH_THEME.zsh-theme" + else + source "$ZSH/themes/$ZSH_THEME.zsh-theme" + fi + fi +fi diff --git a/.gitignore b/.gitignore @@ -0,0 +1,11 @@ +# mpd +.config/mpd/playlists +.config/mpd/database +.config/mpd/log +.config/mpd/pid +.config/mpd/state +.config/mpd/sticker.sql +.config/ncmpcpp/lyrics + +.vim/plugged +.vim/.netrwhist diff --git a/.oh-my-zsh b/.oh-my-zsh @@ -0,0 +1 @@ +Subproject commit 2af2d1aa31caa534c419e72d75daa667ff725de2 diff --git a/.scripts/compiler b/.scripts/compiler @@ -0,0 +1,34 @@ +#!/bin/sh + +# This script will compile or run another finishing operation on a document. I +# have this script run via vim. +# +# tex files: Compiles to pdf, including bibliography if necessary +# md files: Compiles to pdf via pandoc +# rmd files: Compiles via R Markdown +# c files: Compiles via whatever compiler is set to cc. Usually gcc. +# py files: runs via python command +# go files: compiles and runs with "go run" +# config.h files: (For suckless utils) recompiles and installs program. +# all others: run `sent` to show a presentation + +file=$1 +dir=$(dirname "$file") +base="${file%.*}" +shebang=$(sed -n 1p "$file") + +cd "$dir" || exit + +shebangtest() { + case "$shebang" in + \#\!*) "$file" ;; + *) sent "$file" 2>/dev/null & ;; + esac +} + +case "$file" in + *\.ms) groff -ms $file | pstopdf -i -o "$base".pdf ;; + *\.py) python "$file" ;; + *\.go) go run "$file" ;; + *) shebangtest ;; +esac diff --git a/.tmux.conf b/.tmux.conf @@ -0,0 +1,107 @@ +# set-option -g default-command "reattach-to-user-namespace -l zsh" +# set -sg escape-time 0 + +# First remove *all* keybindings +set-option -g set-titles on +set-option -g set-titles-string "" + +# Set new prefix +# Note : you can press super key by set M. +# (tested with tty only) +set -g prefix ` +bind-key ` send-prefix + +# # prefix key +# set -g prefix C-a +# bind C-a send-prefix +set-option -g history-limit 10000 +set-option -g status-position bottom +set-window-option -g xterm-keys on +bind-key c new-window +bind-key -n S-Up set-option -g status +bind-key -n S-Down set-option -g status +bind-key -n S-Left previous-window +bind-key -n S-Right next-window + +# Colors +set -g default-terminal "screen-256color" +set-window-option -g window-status-fg "#666666" +set-window-option -g window-status-bg default +set-window-option -g window-status-attr default +set-window-option -g window-status-current-fg cyan +set-window-option -g window-status-current-bg default +set-window-option -g window-status-current-attr default +set-option -g status-bg default +set-option -g status-fg white +set-option -g status-attr default +set-option -g message-bg black +set-option -g message-fg white +set-option -g message-attr bright + +# status text +set -g status-left " " +set -g status-justify left +setw -g window-status-format ' #(echo "#{pane_current_command}") ' +setw -g window-status-current-format ' #(echo "#{pane_current_command}") ' +set -g status-right " " + +# enable mouse scroll in iterm2 +set-option -g mouse on + + + +# Config that is very close to a i3 window manager's keybinding. + +set -s escape-time 0 +setw -g aggressive-resize off + +# List keys +bind-key ? list-keys + +# Copy mode +bind-key [ copy-mode + +# Paste buffer +bind-key ] paste-buffer + +# Refresh client +bind-key r refresh-client \; display-message "Refresh already" + +# Start with index 1 +set -g base-index 1 +setw -g pane-base-index 1 + +# Clock +setw -g clock-mode-style 24 + +# Config Reloads +bind R source-file ~/.tmux.conf \; display-message "Config reloaded" + +# Mouse on/off +set -g mouse off + +# Split window +bind-key -n M-r split-window -h +bind-key -n M-v split-window -v + +# Rotate Window +bind-key -n M-o rotate-window + +# Swap pane +bind-key -r L swap-pane -U +bind-key -r K swap-pane -D + +# Move pane with Control (no prefix) +bind-key -n M-h select-pane -L +bind-key -n M-j select-pane -D +bind-key -n M-k select-pane -U +bind-key -n M-l select-pane -R + +# Automatically set window title +set-window-option -g automatic-rename on +set-option -g set-titles on + +# Kill Selected Pane +bind-key Q kill-pane + +set -g mouse on diff --git a/.vim/autoload/plug.vim b/.vim/autoload/plug.vim @@ -0,0 +1,2458 @@ +" vim-plug: Vim plugin manager +" ============================ +" +" Download plug.vim and put it in ~/.vim/autoload +" +" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ +" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim +" +" Edit your .vimrc +" +" call plug#begin('~/.vim/plugged') +" +" " Make sure you use single quotes +" +" " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align +" Plug 'junegunn/vim-easy-align' +" +" " Any valid git URL is allowed +" Plug 'https://github.com/junegunn/vim-github-dashboard.git' +" +" " Multiple Plug commands can be written in a single line using | separators +" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets' +" +" " On-demand loading +" Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } +" Plug 'tpope/vim-fireplace', { 'for': 'clojure' } +" +" " Using a non-master branch +" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' } +" +" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above) +" Plug 'fatih/vim-go', { 'tag': '*' } +" +" " Plugin options +" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' } +" +" " Plugin outside ~/.vim/plugged with post-update hook +" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } +" +" " Unmanaged plugin (manually installed and updated) +" Plug '~/my-prototype-plugin' +" +" " Initialize plugin system +" call plug#end() +" +" Then reload .vimrc and :PlugInstall to install plugins. +" +" Plug options: +" +"| Option | Description | +"| ----------------------- | ------------------------------------------------ | +"| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use | +"| `rtp` | Subdirectory that contains Vim plugin | +"| `dir` | Custom directory for the plugin | +"| `as` | Use different name for the plugin | +"| `do` | Post-update hook (string or funcref) | +"| `on` | On-demand loading: Commands or `<Plug>`-mappings | +"| `for` | On-demand loading: File types | +"| `frozen` | Do not update unless explicitly specified | +" +" More information: https://github.com/junegunn/vim-plug +" +" +" Copyright (c) 2017 Junegunn Choi +" +" MIT License +" +" 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. + +if exists('g:loaded_plug') + finish +endif +let g:loaded_plug = 1 + +let s:cpo_save = &cpo +set cpo&vim + +let s:plug_src = 'https://github.com/junegunn/vim-plug.git' +let s:plug_tab = get(s:, 'plug_tab', -1) +let s:plug_buf = get(s:, 'plug_buf', -1) +let s:mac_gui = has('gui_macvim') && has('gui_running') +let s:is_win = has('win32') || has('win64') +let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win) +let s:vim8 = has('patch-8.0.0039') && exists('*job_start') +let s:me = resolve(expand('<sfile>:p')) +let s:base_spec = { 'branch': 'master', 'frozen': 0 } +let s:TYPE = { +\ 'string': type(''), +\ 'list': type([]), +\ 'dict': type({}), +\ 'funcref': type(function('call')) +\ } +let s:loaded = get(s:, 'loaded', {}) +let s:triggers = get(s:, 'triggers', {}) + +function! plug#begin(...) + if a:0 > 0 + let s:plug_home_org = a:1 + let home = s:path(fnamemodify(expand(a:1), ':p')) + elseif exists('g:plug_home') + let home = s:path(g:plug_home) + elseif !empty(&rtp) + let home = s:path(split(&rtp, ',')[0]) . '/plugged' + else + return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.') + endif + if fnamemodify(home, ':t') ==# 'plugin' && fnamemodify(home, ':h') ==# s:first_rtp + return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.') + endif + + let g:plug_home = home + let g:plugs = {} + let g:plugs_order = [] + let s:triggers = {} + + call s:define_commands() + return 1 +endfunction + +function! s:define_commands() + command! -nargs=+ -bar Plug call plug#(<args>) + if !executable('git') + return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.') + endif + command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(<bang>0, [<f-args>]) + command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(<bang>0, [<f-args>]) + command! -nargs=0 -bar -bang PlugClean call s:clean(<bang>0) + command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif + command! -nargs=0 -bar PlugStatus call s:status() + command! -nargs=0 -bar PlugDiff call s:diff() + command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(<bang>0, <f-args>) +endfunction + +function! s:to_a(v) + return type(a:v) == s:TYPE.list ? a:v : [a:v] +endfunction + +function! s:to_s(v) + return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n" +endfunction + +function! s:glob(from, pattern) + return s:lines(globpath(a:from, a:pattern)) +endfunction + +function! s:source(from, ...) + let found = 0 + for pattern in a:000 + for vim in s:glob(a:from, pattern) + execute 'source' s:esc(vim) + let found = 1 + endfor + endfor + return found +endfunction + +function! s:assoc(dict, key, val) + let a:dict[a:key] = add(get(a:dict, a:key, []), a:val) +endfunction + +function! s:ask(message, ...) + call inputsave() + echohl WarningMsg + let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) ')) + echohl None + call inputrestore() + echo "\r" + return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0 +endfunction + +function! s:ask_no_interrupt(...) + try + return call('s:ask', a:000) + catch + return 0 + endtry +endfunction + +function! plug#end() + if !exists('g:plugs') + return s:err('Call plug#begin() first') + endif + + if exists('#PlugLOD') + augroup PlugLOD + autocmd! + augroup END + augroup! PlugLOD + endif + let lod = { 'ft': {}, 'map': {}, 'cmd': {} } + + if exists('g:did_load_filetypes') + filetype off + endif + for name in g:plugs_order + if !has_key(g:plugs, name) + continue + endif + let plug = g:plugs[name] + if get(s:loaded, name, 0) || !has_key(plug, 'on') && !has_key(plug, 'for') + let s:loaded[name] = 1 + continue + endif + + if has_key(plug, 'on') + let s:triggers[name] = { 'map': [], 'cmd': [] } + for cmd in s:to_a(plug.on) + if cmd =~? '^<Plug>.\+' + if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i')) + call s:assoc(lod.map, cmd, name) + endif + call add(s:triggers[name].map, cmd) + elseif cmd =~# '^[A-Z]' + let cmd = substitute(cmd, '!*$', '', '') + if exists(':'.cmd) != 2 + call s:assoc(lod.cmd, cmd, name) + endif + call add(s:triggers[name].cmd, cmd) + else + call s:err('Invalid `on` option: '.cmd. + \ '. Should start with an uppercase letter or `<Plug>`.') + endif + endfor + endif + + if has_key(plug, 'for') + let types = s:to_a(plug.for) + if !empty(types) + augroup filetypedetect + call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim') + augroup END + endif + for type in types + call s:assoc(lod.ft, type, name) + endfor + endif + endfor + + for [cmd, names] in items(lod.cmd) + execute printf( + \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "<bang>", <line1>, <line2>, <q-args>, %s)', + \ cmd, string(cmd), string(names)) + endfor + + for [map, names] in items(lod.map) + for [mode, map_prefix, key_prefix] in + \ [['i', '<C-O>', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']] + execute printf( + \ '%snoremap <silent> %s %s:<C-U>call <SID>lod_map(%s, %s, %s, "%s")<CR>', + \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix) + endfor + endfor + + for [ft, names] in items(lod.ft) + augroup PlugLOD + execute printf('autocmd FileType %s call <SID>lod_ft(%s, %s)', + \ ft, string(ft), string(names)) + augroup END + endfor + + call s:reorg_rtp() + filetype plugin indent on + if has('vim_starting') + if has('syntax') && !exists('g:syntax_on') + syntax enable + end + else + call s:reload_plugins() + endif +endfunction + +function! s:loaded_names() + return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)') +endfunction + +function! s:load_plugin(spec) + call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim') +endfunction + +function! s:reload_plugins() + for name in s:loaded_names() + call s:load_plugin(g:plugs[name]) + endfor +endfunction + +function! s:trim(str) + return substitute(a:str, '[\/]\+$', '', '') +endfunction + +function! s:version_requirement(val, min) + for idx in range(0, len(a:min) - 1) + let v = get(a:val, idx, 0) + if v < a:min[idx] | return 0 + elseif v > a:min[idx] | return 1 + endif + endfor + return 1 +endfunction + +function! s:git_version_requirement(...) + if !exists('s:git_version') + let s:git_version = map(split(split(s:system('git --version'))[2], '\.'), 'str2nr(v:val)') + endif + return s:version_requirement(s:git_version, a:000) +endfunction + +function! s:progress_opt(base) + return a:base && !s:is_win && + \ s:git_version_requirement(1, 7, 1) ? '--progress' : '' +endfunction + +if s:is_win + function! s:rtp(spec) + return s:path(a:spec.dir . get(a:spec, 'rtp', '')) + endfunction + + function! s:path(path) + return s:trim(substitute(a:path, '/', '\', 'g')) + endfunction + + function! s:dirpath(path) + return s:path(a:path) . '\' + endfunction + + function! s:is_local_plug(repo) + return a:repo =~? '^[a-z]:\|^[%~]' + endfunction +else + function! s:rtp(spec) + return s:dirpath(a:spec.dir . get(a:spec, 'rtp', '')) + endfunction + + function! s:path(path) + return s:trim(a:path) + endfunction + + function! s:dirpath(path) + return substitute(a:path, '[/\\]*$', '/', '') + endfunction + + function! s:is_local_plug(repo) + return a:repo[0] =~ '[/$~]' + endfunction +endif + +function! s:err(msg) + echohl ErrorMsg + echom '[vim-plug] '.a:msg + echohl None +endfunction + +function! s:warn(cmd, msg) + echohl WarningMsg + execute a:cmd 'a:msg' + echohl None +endfunction + +function! s:esc(path) + return escape(a:path, ' ') +endfunction + +function! s:escrtp(path) + return escape(a:path, ' ,') +endfunction + +function! s:remove_rtp() + for name in s:loaded_names() + let rtp = s:rtp(g:plugs[name]) + execute 'set rtp-='.s:escrtp(rtp) + let after = globpath(rtp, 'after') + if isdirectory(after) + execute 'set rtp-='.s:escrtp(after) + endif + endfor +endfunction + +function! s:reorg_rtp() + if !empty(s:first_rtp) + execute 'set rtp-='.s:first_rtp + execute 'set rtp-='.s:last_rtp + endif + + " &rtp is modified from outside + if exists('s:prtp') && s:prtp !=# &rtp + call s:remove_rtp() + unlet! s:middle + endif + + let s:middle = get(s:, 'middle', &rtp) + let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])') + let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)') + let rtp = join(map(rtps, 'escape(v:val, ",")'), ',') + \ . ','.s:middle.',' + \ . join(map(afters, 'escape(v:val, ",")'), ',') + let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g') + let s:prtp = &rtp + + if !empty(s:first_rtp) + execute 'set rtp^='.s:first_rtp + execute 'set rtp+='.s:last_rtp + endif +endfunction + +function! s:doautocmd(...) + if exists('#'.join(a:000, '#')) + execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '<nomodeline>' : '') join(a:000) + endif +endfunction + +function! s:dobufread(names) + for name in a:names + let path = s:rtp(g:plugs[name]).'/**' + for dir in ['ftdetect', 'ftplugin'] + if len(finddir(dir, path)) + if exists('#BufRead') + doautocmd BufRead + endif + return + endif + endfor + endfor +endfunction + +function! plug#load(...) + if a:0 == 0 + return s:err('Argument missing: plugin name(s) required') + endif + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000 + let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)') + if !empty(unknowns) + let s = len(unknowns) > 1 ? 's' : '' + return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', '))) + end + let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)') + if !empty(unloaded) + for name in unloaded + call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + endfor + call s:dobufread(unloaded) + return 1 + end + return 0 +endfunction + +function! s:remove_triggers(name) + if !has_key(s:triggers, a:name) + return + endif + for cmd in s:triggers[a:name].cmd + execute 'silent! delc' cmd + endfor + for map in s:triggers[a:name].map + execute 'silent! unmap' map + execute 'silent! iunmap' map + endfor + call remove(s:triggers, a:name) +endfunction + +function! s:lod(names, types, ...) + for name in a:names + call s:remove_triggers(name) + let s:loaded[name] = 1 + endfor + call s:reorg_rtp() + + for name in a:names + let rtp = s:rtp(g:plugs[name]) + for dir in a:types + call s:source(rtp, dir.'/**/*.vim') + endfor + if a:0 + if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2)) + execute 'runtime' a:1 + endif + call s:source(rtp, a:2) + endif + call s:doautocmd('User', name) + endfor +endfunction + +function! s:lod_ft(pat, names) + let syn = 'syntax/'.a:pat.'.vim' + call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn) + execute 'autocmd! PlugLOD FileType' a:pat + call s:doautocmd('filetypeplugin', 'FileType') + call s:doautocmd('filetypeindent', 'FileType') +endfunction + +function! s:lod_cmd(cmd, bang, l1, l2, args, names) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args) +endfunction + +function! s:lod_map(map, names, with_prefix, prefix) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + let extra = '' + while 1 + let c = getchar(0) + if c == 0 + break + endif + let extra .= nr2char(c) + endwhile + + if a:with_prefix + let prefix = v:count ? v:count : '' + let prefix .= '"'.v:register.a:prefix + if mode(1) == 'no' + if v:operator == 'c' + let prefix = "\<esc>" . prefix + endif + let prefix .= v:operator + endif + call feedkeys(prefix, 'n') + endif + call feedkeys(substitute(a:map, '^<Plug>', "\<Plug>", '') . extra) +endfunction + +function! plug#(repo, ...) + if a:0 > 1 + return s:err('Invalid number of arguments (1..2)') + endif + + try + let repo = s:trim(a:repo) + let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec + let name = get(opts, 'as', fnamemodify(repo, ':t:s?\.git$??')) + let spec = extend(s:infer_properties(name, repo), opts) + if !has_key(g:plugs, name) + call add(g:plugs_order, name) + endif + let g:plugs[name] = spec + let s:loaded[name] = get(s:loaded, name, 0) + catch + return s:err(v:exception) + endtry +endfunction + +function! s:parse_options(arg) + let opts = copy(s:base_spec) + let type = type(a:arg) + if type == s:TYPE.string + let opts.tag = a:arg + elseif type == s:TYPE.dict + call extend(opts, a:arg) + if has_key(opts, 'dir') + let opts.dir = s:dirpath(expand(opts.dir)) + endif + else + throw 'Invalid argument type (expected: string or dictionary)' + endif + return opts +endfunction + +function! s:infer_properties(name, repo) + let repo = a:repo + if s:is_local_plug(repo) + return { 'dir': s:dirpath(expand(repo)) } + else + if repo =~ ':' + let uri = repo + else + if repo !~ '/' + throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo) + endif + let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git') + let uri = printf(fmt, repo) + endif + return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri } + endif +endfunction + +function! s:install(force, names) + call s:update_impl(0, a:force, a:names) +endfunction + +function! s:update(force, names) + call s:update_impl(1, a:force, a:names) +endfunction + +function! plug#helptags() + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + for spec in values(g:plugs) + let docd = join([spec.dir, 'doc'], '/') + if isdirectory(docd) + silent! execute 'helptags' s:esc(docd) + endif + endfor + return 1 +endfunction + +function! s:syntax() + syntax clear + syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber + syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX + syn match plugNumber /[0-9]\+[0-9.]*/ contained + syn match plugBracket /[[\]]/ contained + syn match plugX /x/ contained + syn match plugDash /^-/ + syn match plugPlus /^+/ + syn match plugStar /^*/ + syn match plugMessage /\(^- \)\@<=.*/ + syn match plugName /\(^- \)\@<=[^ ]*:/ + syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/ + syn match plugTag /(tag: [^)]\+)/ + syn match plugInstall /\(^+ \)\@<=[^:]*/ + syn match plugUpdate /\(^* \)\@<=[^:]*/ + syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag + syn match plugEdge /^ \X\+$/ + syn match plugEdge /^ \X*/ contained nextgroup=plugSha + syn match plugSha /[0-9a-f]\{7,9}/ contained + syn match plugRelDate /([^)]*)$/ contained + syn match plugNotLoaded /(not loaded)$/ + syn match plugError /^x.*/ + syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/ + syn match plugH2 /^.*:\n-\+$/ + syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean + hi def link plug1 Title + hi def link plug2 Repeat + hi def link plugH2 Type + hi def link plugX Exception + hi def link plugBracket Structure + hi def link plugNumber Number + + hi def link plugDash Special + hi def link plugPlus Constant + hi def link plugStar Boolean + + hi def link plugMessage Function + hi def link plugName Label + hi def link plugInstall Function + hi def link plugUpdate Type + + hi def link plugError Error + hi def link plugDeleted Ignore + hi def link plugRelDate Comment + hi def link plugEdge PreProc + hi def link plugSha Identifier + hi def link plugTag Constant + + hi def link plugNotLoaded Comment +endfunction + +function! s:lpad(str, len) + return a:str . repeat(' ', a:len - len(a:str)) +endfunction + +function! s:lines(msg) + return split(a:msg, "[\r\n]") +endfunction + +function! s:lastline(msg) + return get(s:lines(a:msg), -1, '') +endfunction + +function! s:new_window() + execute get(g:, 'plug_window', 'vertical topleft new') +endfunction + +function! s:plug_window_exists() + let buflist = tabpagebuflist(s:plug_tab) + return !empty(buflist) && index(buflist, s:plug_buf) >= 0 +endfunction + +function! s:switch_in() + if !s:plug_window_exists() + return 0 + endif + + if winbufnr(0) != s:plug_buf + let s:pos = [tabpagenr(), winnr(), winsaveview()] + execute 'normal!' s:plug_tab.'gt' + let winnr = bufwinnr(s:plug_buf) + execute winnr.'wincmd w' + call add(s:pos, winsaveview()) + else + let s:pos = [winsaveview()] + endif + + setlocal modifiable + return 1 +endfunction + +function! s:switch_out(...) + call winrestview(s:pos[-1]) + setlocal nomodifiable + if a:0 > 0 + execute a:1 + endif + + if len(s:pos) > 1 + execute 'normal!' s:pos[0].'gt' + execute s:pos[1] 'wincmd w' + call winrestview(s:pos[2]) + endif +endfunction + +function! s:finish_bindings() + nnoremap <silent> <buffer> R :call <SID>retry()<cr> + nnoremap <silent> <buffer> D :PlugDiff<cr> + nnoremap <silent> <buffer> S :PlugStatus<cr> + nnoremap <silent> <buffer> U :call <SID>status_update()<cr> + xnoremap <silent> <buffer> U :call <SID>status_update()<cr> + nnoremap <silent> <buffer> ]] :silent! call <SID>section('')<cr> + nnoremap <silent> <buffer> [[ :silent! call <SID>section('b')<cr> +endfunction + +function! s:prepare(...) + if empty(getcwd()) + throw 'Invalid current working directory. Cannot proceed.' + endif + + for evar in ['$GIT_DIR', '$GIT_WORK_TREE'] + if exists(evar) + throw evar.' detected. Cannot proceed.' + endif + endfor + + call s:job_abort() + if s:switch_in() + if b:plug_preview == 1 + pc + endif + enew + else + call s:new_window() + endif + + nnoremap <silent> <buffer> q :if b:plug_preview==1<bar>pc<bar>endif<bar>bd<cr> + if a:0 == 0 + call s:finish_bindings() + endif + let b:plug_preview = -1 + let s:plug_tab = tabpagenr() + let s:plug_buf = winbufnr(0) + call s:assign_name() + + for k in ['<cr>', 'L', 'o', 'X', 'd', 'dd'] + execute 'silent! unmap <buffer>' k + endfor + setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell + setf vim-plug + if exists('g:syntax_on') + call s:syntax() + endif +endfunction + +function! s:assign_name() + " Assign buffer name + let prefix = '[Plugins]' + let name = prefix + let idx = 2 + while bufexists(name) + let name = printf('%s (%s)', prefix, idx) + let idx = idx + 1 + endwhile + silent! execute 'f' fnameescape(name) +endfunction + +function! s:chsh(swap) + let prev = [&shell, &shellredir] + if !s:is_win && a:swap + set shell=sh shellredir=>%s\ 2>&1 + endif + return prev +endfunction + +function! s:bang(cmd, ...) + try + let [sh, shrd] = s:chsh(a:0) + " FIXME: Escaping is incomplete. We could use shellescape with eval, + " but it won't work on Windows. + let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd + let g:_plug_bang = '!'.escape(cmd, '#!%') + execute "normal! :execute g:_plug_bang\<cr>\<cr>" + finally + unlet g:_plug_bang + let [&shell, &shellredir] = [sh, shrd] + endtry + return v:shell_error ? 'Exit status: ' . v:shell_error : '' +endfunction + +function! s:regress_bar() + let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '') + call s:progress_bar(2, bar, len(bar)) +endfunction + +function! s:is_updated(dir) + return !empty(s:system_chomp('git log --pretty=format:"%h" "HEAD...HEAD@{1}"', a:dir)) +endfunction + +function! s:do(pull, force, todo) + for [name, spec] in items(a:todo) + if !isdirectory(spec.dir) + continue + endif + let installed = has_key(s:update.new, name) + let updated = installed ? 0 : + \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir)) + if a:force || installed || updated + execute 'cd' s:esc(spec.dir) + call append(3, '- Post-update hook for '. name .' ... ') + let error = '' + let type = type(spec.do) + if type == s:TYPE.string + if spec.do[0] == ':' + if !get(s:loaded, name, 0) + let s:loaded[name] = 1 + call s:reorg_rtp() + endif + call s:load_plugin(spec) + try + execute spec.do[1:] + catch + let error = v:exception + endtry + if !s:plug_window_exists() + cd - + throw 'Warning: vim-plug was terminated by the post-update hook of '.name + endif + else + let error = s:bang(spec.do) + endif + elseif type == s:TYPE.funcref + try + let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') + call spec.do({ 'name': name, 'status': status, 'force': a:force }) + catch + let error = v:exception + endtry + else + let error = 'Invalid hook type' + endif + call s:switch_in() + call setline(4, empty(error) ? (getline(4) . 'OK') + \ : ('x' . getline(4)[1:] . error)) + if !empty(error) + call add(s:update.errors, name) + call s:regress_bar() + endif + cd - + endif + endfor +endfunction + +function! s:hash_match(a, b) + return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0 +endfunction + +function! s:checkout(spec) + let sha = a:spec.commit + let output = s:system('git rev-parse HEAD', a:spec.dir) + if !v:shell_error && !s:hash_match(sha, s:lines(output)[0]) + let output = s:system( + \ 'git fetch --depth 999999 && git checkout '.s:esc(sha).' --', a:spec.dir) + endif + return output +endfunction + +function! s:finish(pull) + let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen')) + if new_frozen + let s = new_frozen > 1 ? 's' : '' + call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s)) + endif + call append(3, '- Finishing ... ') | 4 + redraw + call plug#helptags() + call plug#end() + call setline(4, getline(4) . 'Done!') + redraw + let msgs = [] + if !empty(s:update.errors) + call add(msgs, "Press 'R' to retry.") + endif + if a:pull && len(s:update.new) < len(filter(getline(5, '$'), + \ "v:val =~ '^- ' && stridx(v:val, 'Already up-to-date') < 0")) + call add(msgs, "Press 'D' to see the updated changes.") + endif + echo join(msgs, ' ') + call s:finish_bindings() +endfunction + +function! s:retry() + if empty(s:update.errors) + return + endif + echo + call s:update_impl(s:update.pull, s:update.force, + \ extend(copy(s:update.errors), [s:update.threads])) +endfunction + +function! s:is_managed(name) + return has_key(g:plugs[a:name], 'uri') +endfunction + +function! s:names(...) + return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)')) +endfunction + +function! s:check_ruby() + silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'") + if !exists('g:plug_ruby') + redraw! + return s:warn('echom', 'Warning: Ruby interface is broken') + endif + let ruby_version = split(g:plug_ruby, '\.') + unlet g:plug_ruby + return s:version_requirement(ruby_version, [1, 8, 7]) +endfunction + +function! s:update_impl(pull, force, args) abort + let sync = index(a:args, '--sync') >= 0 || has('vim_starting') + let args = filter(copy(a:args), 'v:val != "--sync"') + let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ? + \ remove(args, -1) : get(g:, 'plug_threads', 16) + + let managed = filter(copy(g:plugs), 's:is_managed(v:key)') + let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') : + \ filter(managed, 'index(args, v:key) >= 0') + + if empty(todo) + return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install')) + endif + + if !s:is_win && s:git_version_requirement(2, 3) + let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : '' + let $GIT_TERMINAL_PROMPT = 0 + for plug in values(todo) + let plug.uri = substitute(plug.uri, + \ '^https://git::@github\.com', 'https://github.com', '') + endfor + endif + + if !isdirectory(g:plug_home) + try + call mkdir(g:plug_home, 'p') + catch + return s:err(printf('Invalid plug directory: %s. '. + \ 'Try to call plug#begin with a valid directory', g:plug_home)) + endtry + endif + + if has('nvim') && !exists('*jobwait') && threads > 1 + call s:warn('echom', '[vim-plug] Update Neovim for parallel installer') + endif + + let use_job = s:nvim || s:vim8 + let python = (has('python') || has('python3')) && !use_job + let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby() + + let s:update = { + \ 'start': reltime(), + \ 'all': todo, + \ 'todo': copy(todo), + \ 'errors': [], + \ 'pull': a:pull, + \ 'force': a:force, + \ 'new': {}, + \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1, + \ 'bar': '', + \ 'fin': 0 + \ } + + call s:prepare(1) + call append(0, ['', '']) + normal! 2G + silent! redraw + + let s:clone_opt = get(g:, 'plug_shallow', 1) ? + \ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : '' + + if has('win32unix') + let s:clone_opt .= ' -c core.eol=lf -c core.autocrlf=input' + endif + + " Python version requirement (>= 2.7) + if python && !has('python3') && !ruby && !use_job && s:update.threads > 1 + redir => pyv + silent python import platform; print platform.python_version() + redir END + let python = s:version_requirement( + \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6]) + endif + + if (python || ruby) && s:update.threads > 1 + try + let imd = &imd + if s:mac_gui + set noimd + endif + if ruby + call s:update_ruby() + else + call s:update_python() + endif + catch + let lines = getline(4, '$') + let printed = {} + silent! 4,$d _ + for line in lines + let name = s:extract_name(line, '.', '') + if empty(name) || !has_key(printed, name) + call append('$', line) + if !empty(name) + let printed[name] = 1 + if line[0] == 'x' && index(s:update.errors, name) < 0 + call add(s:update.errors, name) + end + endif + endif + endfor + finally + let &imd = imd + call s:update_finish() + endtry + else + call s:update_vim() + while use_job && sync + sleep 100m + if s:update.fin + break + endif + endwhile + endif +endfunction + +function! s:log4(name, msg) + call setline(4, printf('- %s (%s)', a:msg, a:name)) + redraw +endfunction + +function! s:update_finish() + if exists('s:git_terminal_prompt') + let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt + endif + if s:switch_in() + call append(3, '- Updating ...') | 4 + for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))')) + let [pos, _] = s:logpos(name) + if !pos + continue + endif + if has_key(spec, 'commit') + call s:log4(name, 'Checking out '.spec.commit) + let out = s:checkout(spec) + elseif has_key(spec, 'tag') + let tag = spec.tag + if tag =~ '\*' + let tags = s:lines(s:system('git tag --list '.s:shellesc(tag).' --sort -version:refname 2>&1', spec.dir)) + if !v:shell_error && !empty(tags) + let tag = tags[0] + call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag)) + call append(3, '') + endif + endif + call s:log4(name, 'Checking out '.tag) + let out = s:system('git checkout -q '.s:esc(tag).' -- 2>&1', spec.dir) + else + let branch = s:esc(get(spec, 'branch', 'master')) + call s:log4(name, 'Merging origin/'.branch) + let out = s:system('git checkout -q '.branch.' -- 2>&1' + \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only origin/'.branch.' 2>&1')), spec.dir) + endif + if !v:shell_error && filereadable(spec.dir.'/.gitmodules') && + \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir)) + call s:log4(name, 'Updating submodules. This may take a while.') + let out .= s:bang('git submodule update --init --recursive 2>&1', spec.dir) + endif + let msg = s:format_message(v:shell_error ? 'x': '-', name, out) + if v:shell_error + call add(s:update.errors, name) + call s:regress_bar() + silent execute pos 'd _' + call append(4, msg) | 4 + elseif !empty(out) + call setline(pos, msg[0]) + endif + redraw + endfor + silent 4 d _ + try + call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")')) + catch + call s:warn('echom', v:exception) + call s:warn('echo', '') + return + endtry + call s:finish(s:update.pull) + call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.') + call s:switch_out('normal! gg') + endif +endfunction + +function! s:job_abort() + if (!s:nvim && !s:vim8) || !exists('s:jobs') + return + endif + + for [name, j] in items(s:jobs) + if s:nvim + silent! call jobstop(j.jobid) + elseif s:vim8 + silent! call job_stop(j.jobid) + endif + if j.new + call s:system('rm -rf ' . s:shellesc(g:plugs[name].dir)) + endif + endfor + let s:jobs = {} +endfunction + +function! s:last_non_empty_line(lines) + let len = len(a:lines) + for idx in range(len) + let line = a:lines[len-idx-1] + if !empty(line) + return line + endif + endfor + return '' +endfunction + +function! s:job_out_cb(self, data) abort + let self = a:self + let data = remove(self.lines, -1) . a:data + let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]') + call extend(self.lines, lines) + " To reduce the number of buffer updates + let self.tick = get(self, 'tick', -1) + 1 + if !self.running || self.tick % len(s:jobs) == 0 + let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-') + let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines) + call s:log(bullet, self.name, result) + endif +endfunction + +function! s:job_exit_cb(self, data) abort + let a:self.running = 0 + let a:self.error = a:data != 0 + call s:reap(a:self.name) + call s:tick() +endfunction + +function! s:job_cb(fn, job, ch, data) + if !s:plug_window_exists() " plug window closed + return s:job_abort() + endif + call call(a:fn, [a:job, a:data]) +endfunction + +function! s:nvim_cb(job_id, data, event) dict abort + return a:event == 'stdout' ? + \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : + \ s:job_cb('s:job_exit_cb', self, 0, a:data) +endfunction + +function! s:spawn(name, cmd, opts) + let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], + \ 'new': get(a:opts, 'new', 0) } + let s:jobs[a:name] = job + let argv = add(s:is_win ? ['cmd', '/c'] : ['sh', '-c'], + \ has_key(a:opts, 'dir') ? s:with_cd(a:cmd, a:opts.dir) : a:cmd) + + if s:nvim + call extend(job, { + \ 'on_stdout': function('s:nvim_cb'), + \ 'on_exit': function('s:nvim_cb'), + \ }) + let jid = jobstart(argv, job) + if jid > 0 + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = [jid < 0 ? argv[0].' is not executable' : + \ 'Invalid arguments (or job table is full)'] + endif + elseif s:vim8 + let jid = job_start(s:is_win ? join(argv, ' ') : argv, { + \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), + \ 'out_mode': 'raw' + \}) + if job_status(jid) == 'run' + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = ['Failed to start job'] + endif + else + let params = has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd] + let job.lines = s:lines(call('s:system', params)) + let job.error = v:shell_error != 0 + let job.running = 0 + endif +endfunction + +function! s:reap(name) + let job = s:jobs[a:name] + if job.error + call add(s:update.errors, a:name) + elseif get(job, 'new', 0) + let s:update.new[a:name] = 1 + endif + let s:update.bar .= job.error ? 'x' : '=' + + let bullet = job.error ? 'x' : '-' + let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines) + call s:log(bullet, a:name, empty(result) ? 'OK' : result) + call s:bar() + + call remove(s:jobs, a:name) +endfunction + +function! s:bar() + if s:switch_in() + let total = len(s:update.all) + call setline(1, (s:update.pull ? 'Updating' : 'Installing'). + \ ' plugins ('.len(s:update.bar).'/'.total.')') + call s:progress_bar(2, s:update.bar, total) + call s:switch_out() + endif +endfunction + +function! s:logpos(name) + for i in range(4, line('$')) + if getline(i) =~# '^[-+x*] '.a:name.':' + for j in range(i + 1, line('$')) + if getline(j) !~ '^ ' + return [i, j - 1] + endif + endfor + return [i, i] + endif + endfor + return [0, 0] +endfunction + +function! s:log(bullet, name, lines) + if s:switch_in() + let [b, e] = s:logpos(a:name) + if b > 0 + silent execute printf('%d,%d d _', b, e) + if b > winheight('.') + let b = 4 + endif + else + let b = 4 + endif + " FIXME For some reason, nomodifiable is set after :d in vim8 + setlocal modifiable + call append(b - 1, s:format_message(a:bullet, a:name, a:lines)) + call s:switch_out() + endif +endfunction + +function! s:update_vim() + let s:jobs = {} + + call s:bar() + call s:tick() +endfunction + +function! s:tick() + let pull = s:update.pull + let prog = s:progress_opt(s:nvim || s:vim8) +while 1 " Without TCO, Vim stack is bound to explode + if empty(s:update.todo) + if empty(s:jobs) && !s:update.fin + call s:update_finish() + let s:update.fin = 1 + endif + return + endif + + let name = keys(s:update.todo)[0] + let spec = remove(s:update.todo, name) + let new = !isdirectory(spec.dir) + + call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') + redraw + + let has_tag = has_key(spec, 'tag') + if !new + let [error, _] = s:git_validate(spec, 0) + if empty(error) + if pull + let fetch_opt = (has_tag && !empty(globpath(spec.dir, '.git/shallow'))) ? '--depth 99999999' : '' + call s:spawn(name, printf('git fetch %s %s 2>&1', fetch_opt, prog), { 'dir': spec.dir }) + else + let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } + endif + else + let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 } + endif + else + call s:spawn(name, + \ printf('git clone %s %s %s %s 2>&1', + \ has_tag ? '' : s:clone_opt, + \ prog, + \ s:shellesc(spec.uri), + \ s:shellesc(s:trim(spec.dir))), { 'new': 1 }) + endif + + if !s:jobs[name].running + call s:reap(name) + endif + if len(s:jobs) >= s:update.threads + break + endif +endwhile +endfunction + +function! s:update_python() +let py_exe = has('python') ? 'python' : 'python3' +execute py_exe "<< EOF" +import datetime +import functools +import os +try: + import queue +except ImportError: + import Queue as queue +import random +import re +import shutil +import signal +import subprocess +import tempfile +import threading as thr +import time +import traceback +import vim + +G_NVIM = vim.eval("has('nvim')") == '1' +G_PULL = vim.eval('s:update.pull') == '1' +G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 +G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) +G_CLONE_OPT = vim.eval('s:clone_opt') +G_PROGRESS = vim.eval('s:progress_opt(1)') +G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) +G_STOP = thr.Event() +G_IS_WIN = vim.eval('s:is_win') == '1' + +class PlugError(Exception): + def __init__(self, msg): + self.msg = msg +class CmdTimedOut(PlugError): + pass +class CmdFailed(PlugError): + pass +class InvalidURI(PlugError): + pass +class Action(object): + INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-'] + +class Buffer(object): + def __init__(self, lock, num_plugs, is_pull): + self.bar = '' + self.event = 'Updating' if is_pull else 'Installing' + self.lock = lock + self.maxy = int(vim.eval('winheight(".")')) + self.num_plugs = num_plugs + + def __where(self, name): + """ Find first line with name in current buffer. Return line num. """ + found, lnum = False, 0 + matcher = re.compile('^[-+x*] {0}:'.format(name)) + for line in vim.current.buffer: + if matcher.search(line) is not None: + found = True + break + lnum += 1 + + if not found: + lnum = -1 + return lnum + + def header(self): + curbuf = vim.current.buffer + curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs) + + num_spaces = self.num_plugs - len(self.bar) + curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ') + + with self.lock: + vim.command('normal! 2G') + vim.command('redraw') + + def write(self, action, name, lines): + first, rest = lines[0], lines[1:] + msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)] + msg.extend([' ' + line for line in rest]) + + try: + if action == Action.ERROR: + self.bar += 'x' + vim.command("call add(s:update.errors, '{0}')".format(name)) + elif action == Action.DONE: + self.bar += '=' + + curbuf = vim.current.buffer + lnum = self.__where(name) + if lnum != -1: # Found matching line num + del curbuf[lnum] + if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]): + lnum = 3 + else: + lnum = 3 + curbuf.append(msg, lnum) + + self.header() + except vim.error: + pass + +class Command(object): + CD = 'cd /d' if G_IS_WIN else 'cd' + + def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None): + self.cmd = cmd + if cmd_dir: + self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd) + self.timeout = timeout + self.callback = cb if cb else (lambda msg: None) + self.clean = clean if clean else (lambda: None) + self.proc = None + + @property + def alive(self): + """ Returns true only if command still running. """ + return self.proc and self.proc.poll() is None + + def execute(self, ntries=3): + """ Execute the command with ntries if CmdTimedOut. + Returns the output of the command if no Exception. + """ + attempt, finished, limit = 0, False, self.timeout + + while not finished: + try: + attempt += 1 + result = self.try_command() + finished = True + return result + except CmdTimedOut: + if attempt != ntries: + self.notify_retry() + self.timeout += limit + else: + raise + + def notify_retry(self): + """ Retry required for command, notify user. """ + for count in range(3, 0, -1): + if G_STOP.is_set(): + raise KeyboardInterrupt + msg = 'Timeout. Will retry in {0} second{1} ...'.format( + count, 's' if count != 1 else '') + self.callback([msg]) + time.sleep(1) + self.callback(['Retrying ...']) + + def try_command(self): + """ Execute a cmd & poll for callback. Returns list of output. + Raises CmdFailed -> return code for Popen isn't 0 + Raises CmdTimedOut -> command exceeded timeout without new output + """ + first_line = True + + try: + tfile = tempfile.NamedTemporaryFile(mode='w+b') + preexec_fn = not G_IS_WIN and os.setsid or None + self.proc = subprocess.Popen(self.cmd, stdout=tfile, + stderr=subprocess.STDOUT, + stdin=subprocess.PIPE, shell=True, + preexec_fn=preexec_fn) + thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,)) + thrd.start() + + thread_not_started = True + while thread_not_started: + try: + thrd.join(0.1) + thread_not_started = False + except RuntimeError: + pass + + while self.alive: + if G_STOP.is_set(): + raise KeyboardInterrupt + + if first_line or random.random() < G_LOG_PROB: + first_line = False + line = '' if G_IS_WIN else nonblock_read(tfile.name) + if line: + self.callback([line]) + + time_diff = time.time() - os.path.getmtime(tfile.name) + if time_diff > self.timeout: + raise CmdTimedOut(['Timeout!']) + + thrd.join(0.5) + + tfile.seek(0) + result = [line.decode('utf-8', 'replace').rstrip() for line in tfile] + + if self.proc.returncode != 0: + raise CmdFailed([''] + result) + + return result + except: + self.terminate() + raise + + def terminate(self): + """ Terminate process and cleanup. """ + if self.alive: + if G_IS_WIN: + os.kill(self.proc.pid, signal.SIGINT) + else: + os.killpg(self.proc.pid, signal.SIGTERM) + self.clean() + +class Plugin(object): + def __init__(self, name, args, buf_q, lock): + self.name = name + self.args = args + self.buf_q = buf_q + self.lock = lock + self.tag = args.get('tag', 0) + + def manage(self): + try: + if os.path.exists(self.args['dir']): + self.update() + else: + self.install() + with self.lock: + thread_vim_command("let s:update.new['{0}'] = 1".format(self.name)) + except PlugError as exc: + self.write(Action.ERROR, self.name, exc.msg) + except KeyboardInterrupt: + G_STOP.set() + self.write(Action.ERROR, self.name, ['Interrupted!']) + except: + # Any exception except those above print stack trace + msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip()) + self.write(Action.ERROR, self.name, msg.split('\n')) + raise + + def install(self): + target = self.args['dir'] + if target[-1] == '\\': + target = target[0:-1] + + def clean(target): + def _clean(): + try: + shutil.rmtree(target) + except OSError: + pass + return _clean + + self.write(Action.INSTALL, self.name, ['Installing ...']) + callback = functools.partial(self.write, Action.INSTALL, self.name) + cmd = 'git clone {0} {1} {2} {3} 2>&1'.format( + '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'], + esc(target)) + com = Command(cmd, None, G_TIMEOUT, callback, clean(target)) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + + def repo_uri(self): + cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url' + command = Command(cmd, self.args['dir'], G_TIMEOUT,) + result = command.execute(G_RETRIES) + return result[-1] + + def update(self): + actual_uri = self.repo_uri() + expect_uri = self.args['uri'] + regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$') + ma = regex.match(actual_uri) + mb = regex.match(expect_uri) + if ma is None or mb is None or ma.groups() != mb.groups(): + msg = ['', + 'Invalid URI: {0}'.format(actual_uri), + 'Expected {0}'.format(expect_uri), + 'PlugClean required.'] + raise InvalidURI(msg) + + if G_PULL: + self.write(Action.UPDATE, self.name, ['Updating ...']) + callback = functools.partial(self.write, Action.UPDATE, self.name) + fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else '' + cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS) + com = Command(cmd, self.args['dir'], G_TIMEOUT, callback) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + else: + self.write(Action.DONE, self.name, ['Already installed']) + + def write(self, action, name, msg): + self.buf_q.put((action, name, msg)) + +class PlugThread(thr.Thread): + def __init__(self, tname, args): + super(PlugThread, self).__init__() + self.tname = tname + self.args = args + + def run(self): + thr.current_thread().name = self.tname + buf_q, work_q, lock = self.args + + try: + while not G_STOP.is_set(): + name, args = work_q.get_nowait() + plug = Plugin(name, args, buf_q, lock) + plug.manage() + work_q.task_done() + except queue.Empty: + pass + +class RefreshThread(thr.Thread): + def __init__(self, lock): + super(RefreshThread, self).__init__() + self.lock = lock + self.running = True + + def run(self): + while self.running: + with self.lock: + thread_vim_command('noautocmd normal! a') + time.sleep(0.33) + + def stop(self): + self.running = False + +if G_NVIM: + def thread_vim_command(cmd): + vim.session.threadsafe_call(lambda: vim.command(cmd)) +else: + def thread_vim_command(cmd): + vim.command(cmd) + +def esc(name): + return '"' + name.replace('"', '\"') + '"' + +def nonblock_read(fname): + """ Read a file with nonblock flag. Return the last line. """ + fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK) + buf = os.read(fread, 100000).decode('utf-8', 'replace') + os.close(fread) + + line = buf.rstrip('\r\n') + left = max(line.rfind('\r'), line.rfind('\n')) + if left != -1: + left += 1 + line = line[left:] + + return line + +def main(): + thr.current_thread().name = 'main' + nthreads = int(vim.eval('s:update.threads')) + plugs = vim.eval('s:update.todo') + mac_gui = vim.eval('s:mac_gui') == '1' + + lock = thr.Lock() + buf = Buffer(lock, len(plugs), G_PULL) + buf_q, work_q = queue.Queue(), queue.Queue() + for work in plugs.items(): + work_q.put(work) + + start_cnt = thr.active_count() + for num in range(nthreads): + tname = 'PlugT-{0:02}'.format(num) + thread = PlugThread(tname, (buf_q, work_q, lock)) + thread.start() + if mac_gui: + rthread = RefreshThread(lock) + rthread.start() + + while not buf_q.empty() or thr.active_count() != start_cnt: + try: + action, name, msg = buf_q.get(True, 0.25) + buf.write(action, name, ['OK'] if not msg else msg) + buf_q.task_done() + except queue.Empty: + pass + except KeyboardInterrupt: + G_STOP.set() + + if mac_gui: + rthread.stop() + rthread.join() + +main() +EOF +endfunction + +function! s:update_ruby() + ruby << EOF + module PlugStream + SEP = ["\r", "\n", nil] + def get_line + buffer = '' + loop do + char = readchar rescue return + if SEP.include? char.chr + buffer << $/ + break + else + buffer << char + end + end + buffer + end + end unless defined?(PlugStream) + + def esc arg + %["#{arg.gsub('"', '\"')}"] + end + + def killall pid + pids = [pid] + if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM + pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil } + else + unless `which pgrep 2> /dev/null`.empty? + children = pids + until children.empty? + children = children.map { |pid| + `pgrep -P #{pid}`.lines.map { |l| l.chomp } + }.flatten + pids += children + end + end + pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil } + end + end + + def compare_git_uri a, b + regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$} + regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1) + end + + require 'thread' + require 'fileutils' + require 'timeout' + running = true + iswin = VIM::evaluate('s:is_win').to_i == 1 + pull = VIM::evaluate('s:update.pull').to_i == 1 + base = VIM::evaluate('g:plug_home') + all = VIM::evaluate('s:update.todo') + limit = VIM::evaluate('get(g:, "plug_timeout", 60)') + tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1 + nthr = VIM::evaluate('s:update.threads').to_i + maxy = VIM::evaluate('winheight(".")').to_i + vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/ + cd = iswin ? 'cd /d' : 'cd' + tot = VIM::evaluate('len(s:update.todo)') || 0 + bar = '' + skip = 'Already installed' + mtx = Mutex.new + take1 = proc { mtx.synchronize { running && all.shift } } + logh = proc { + cnt = bar.length + $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})" + $curbuf[2] = '[' + bar.ljust(tot) + ']' + VIM::command('normal! 2G') + VIM::command('redraw') + } + where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } } + log = proc { |name, result, type| + mtx.synchronize do + ing = ![true, false].include?(type) + bar += type ? '=' : 'x' unless ing + b = case type + when :install then '+' when :update then '*' + when true, nil then '-' else + VIM::command("call add(s:update.errors, '#{name}')") + 'x' + end + result = + if type || type.nil? + ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"] + elsif result =~ /^Interrupted|^Timeout/ + ["#{b} #{name}: #{result}"] + else + ["#{b} #{name}"] + result.lines.map { |l| " " << l } + end + if lnum = where.call(name) + $curbuf.delete lnum + lnum = 4 if ing && lnum > maxy + end + result.each_with_index do |line, offset| + $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp) + end + logh.call + end + } + bt = proc { |cmd, name, type, cleanup| + tried = timeout = 0 + begin + tried += 1 + timeout += limit + fd = nil + data = '' + if iswin + Timeout::timeout(timeout) do + tmp = VIM::evaluate('tempname()') + system("(#{cmd}) > #{tmp}") + data = File.read(tmp).chomp + File.unlink tmp rescue nil + end + else + fd = IO.popen(cmd).extend(PlugStream) + first_line = true + log_prob = 1.0 / nthr + while line = Timeout::timeout(timeout) { fd.get_line } + data << line + log.call name, line.chomp, type if name && (first_line || rand < log_prob) + first_line = false + end + fd.close + end + [$? == 0, data.chomp] + rescue Timeout::Error, Interrupt => e + if fd && !fd.closed? + killall fd.pid + fd.close + end + cleanup.call if cleanup + if e.is_a?(Timeout::Error) && tried < tries + 3.downto(1) do |countdown| + s = countdown > 1 ? 's' : '' + log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type + sleep 1 + end + log.call name, 'Retrying ...', type + retry + end + [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"] + end + } + main = Thread.current + threads = [] + watcher = Thread.new { + if vim7 + while VIM::evaluate('getchar(1)') + sleep 0.1 + end + else + require 'io/console' # >= Ruby 1.9 + nil until IO.console.getch == 3.chr + end + mtx.synchronize do + running = false + threads.each { |t| t.raise Interrupt } unless vim7 + end + threads.each { |t| t.join rescue nil } + main.kill + } + refresh = Thread.new { + while true + mtx.synchronize do + break unless running + VIM::command('noautocmd normal! a') + end + sleep 0.2 + end + } if VIM::evaluate('s:mac_gui') == 1 + + clone_opt = VIM::evaluate('s:clone_opt') + progress = VIM::evaluate('s:progress_opt(1)') + nthr.times do + mtx.synchronize do + threads << Thread.new { + while pair = take1.call + name = pair.first + dir, uri, tag = pair.last.values_at *%w[dir uri tag] + exists = File.directory? dir + ok, result = + if exists + chdir = "#{cd} #{iswin ? dir : esc(dir)}" + ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil + current_uri = data.lines.to_a.last + if !ret + if data =~ /^Interrupted|^Timeout/ + [false, data] + else + [false, [data.chomp, "PlugClean required."].join($/)] + end + elsif !compare_git_uri(current_uri, uri) + [false, ["Invalid URI: #{current_uri}", + "Expected: #{uri}", + "PlugClean required."].join($/)] + else + if pull + log.call name, 'Updating ...', :update + fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : '' + bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil + else + [true, skip] + end + end + else + d = esc dir.sub(%r{[\\/]+$}, '') + log.call name, 'Installing ...', :install + bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc { + FileUtils.rm_rf dir + } + end + mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok + log.call name, result, ok + end + } if running + end + end + threads.each { |t| t.join rescue nil } + logh.call + refresh.kill if refresh + watcher.kill +EOF +endfunction + +function! s:shellesc(arg) + return '"'.escape(a:arg, '"').'"' +endfunction + +function! s:glob_dir(path) + return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)') +endfunction + +function! s:progress_bar(line, bar, total) + call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']') +endfunction + +function! s:compare_git_uri(a, b) + " See `git help clone' + " https:// [user@] github.com[:port] / junegunn/vim-plug [.git] + " [git@] github.com[:port] : junegunn/vim-plug [.git] + " file:// / junegunn/vim-plug [/] + " / junegunn/vim-plug [/] + let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$' + let ma = matchlist(a:a, pat) + let mb = matchlist(a:b, pat) + return ma[1:2] ==# mb[1:2] +endfunction + +function! s:format_message(bullet, name, message) + if a:bullet != 'x' + return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))] + else + let lines = map(s:lines(a:message), '" ".v:val') + return extend([printf('x %s:', a:name)], lines) + endif +endfunction + +function! s:with_cd(cmd, dir) + return printf('cd%s %s && %s', s:is_win ? ' /d' : '', s:shellesc(a:dir), a:cmd) +endfunction + +function! s:system(cmd, ...) + try + let [sh, shrd] = s:chsh(1) + let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd + return system(s:is_win ? '('.cmd.')' : cmd) + finally + let [&shell, &shellredir] = [sh, shrd] + endtry +endfunction + +function! s:system_chomp(...) + let ret = call('s:system', a:000) + return v:shell_error ? '' : substitute(ret, '\n$', '', '') +endfunction + +function! s:git_validate(spec, check_branch) + let err = '' + if isdirectory(a:spec.dir) + let result = s:lines(s:system('git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url', a:spec.dir)) + let remote = result[-1] + if v:shell_error + let err = join([remote, 'PlugClean required.'], "\n") + elseif !s:compare_git_uri(remote, a:spec.uri) + let err = join(['Invalid URI: '.remote, + \ 'Expected: '.a:spec.uri, + \ 'PlugClean required.'], "\n") + elseif a:check_branch && has_key(a:spec, 'commit') + let result = s:lines(s:system('git rev-parse HEAD 2>&1', a:spec.dir)) + let sha = result[-1] + if v:shell_error + let err = join(add(result, 'PlugClean required.'), "\n") + elseif !s:hash_match(sha, a:spec.commit) + let err = join([printf('Invalid HEAD (expected: %s, actual: %s)', + \ a:spec.commit[:6], sha[:6]), + \ 'PlugUpdate required.'], "\n") + endif + elseif a:check_branch + let branch = result[0] + " Check tag + if has_key(a:spec, 'tag') + let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) + if a:spec.tag !=# tag && a:spec.tag !~ '\*' + let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.', + \ (empty(tag) ? 'N/A' : tag), a:spec.tag) + endif + " Check branch + elseif a:spec.branch !=# branch + let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.', + \ branch, a:spec.branch) + endif + if empty(err) + let [ahead, behind] = split(s:lastline(s:system(printf( + \ 'git rev-list --count --left-right HEAD...origin/%s', + \ a:spec.branch), a:spec.dir)), '\t') + if !v:shell_error && ahead + if behind + " Only mention PlugClean if diverged, otherwise it's likely to be + " pushable (and probably not that messed up). + let err = printf( + \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n" + \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', a:spec.branch, ahead, behind) + else + let err = printf("Ahead of origin/%s by %d commit(s).\n" + \ .'Cannot update until local changes are pushed.', + \ a:spec.branch, ahead) + endif + endif + endif + endif + else + let err = 'Not found' + endif + return [err, err =~# 'PlugClean'] +endfunction + +function! s:rm_rf(dir) + if isdirectory(a:dir) + call s:system((s:is_win ? 'rmdir /S /Q ' : 'rm -rf ') . s:shellesc(a:dir)) + endif +endfunction + +function! s:clean(force) + call s:prepare() + call append(0, 'Searching for invalid plugins in '.g:plug_home) + call append(1, '') + + " List of valid directories + let dirs = [] + let errs = {} + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + if !s:is_managed(name) + call add(dirs, spec.dir) + else + let [err, clean] = s:git_validate(spec, 1) + if clean + let errs[spec.dir] = s:lines(err)[0] + else + call add(dirs, spec.dir) + endif + endif + let cnt += 1 + call s:progress_bar(2, repeat('=', cnt), total) + normal! 2G + redraw + endfor + + let allowed = {} + for dir in dirs + let allowed[s:dirpath(fnamemodify(dir, ':h:h'))] = 1 + let allowed[dir] = 1 + for child in s:glob_dir(dir) + let allowed[child] = 1 + endfor + endfor + + let todo = [] + let found = sort(s:glob_dir(g:plug_home)) + while !empty(found) + let f = remove(found, 0) + if !has_key(allowed, f) && isdirectory(f) + call add(todo, f) + call append(line('$'), '- ' . f) + if has_key(errs, f) + call append(line('$'), ' ' . errs[f]) + endif + let found = filter(found, 'stridx(v:val, f) != 0') + end + endwhile + + 4 + redraw + if empty(todo) + call append(line('$'), 'Already clean.') + else + let s:clean_count = 0 + call append(3, ['Directories to delete:', '']) + redraw! + if a:force || s:ask_no_interrupt('Delete all directories?') + call s:delete([6, line('$')], 1) + else + call setline(4, 'Cancelled.') + nnoremap <silent> <buffer> d :set opfunc=<sid>delete_op<cr>g@ + nmap <silent> <buffer> dd d_ + xnoremap <silent> <buffer> d :<c-u>call <sid>delete_op(visualmode(), 1)<cr> + echo 'Delete the lines (d{motion}) to delete the corresponding directories' + endif + endif + 4 + setlocal nomodifiable +endfunction + +function! s:delete_op(type, ...) + call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0) +endfunction + +function! s:delete(range, force) + let [l1, l2] = a:range + let force = a:force + while l1 <= l2 + let line = getline(l1) + if line =~ '^- ' && isdirectory(line[2:]) + execute l1 + redraw! + let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1) + let force = force || answer > 1 + if answer + call s:rm_rf(line[2:]) + setlocal modifiable + call setline(l1, '~'.line[1:]) + let s:clean_count += 1 + call setline(4, printf('Removed %d directories.', s:clean_count)) + setlocal nomodifiable + endif + endif + let l1 += 1 + endwhile +endfunction + +function! s:upgrade() + echo 'Downloading the latest version of vim-plug' + redraw + let tmp = tempname() + let new = tmp . '/plug.vim' + + try + let out = s:system(printf('git clone --depth 1 %s %s', s:plug_src, tmp)) + if v:shell_error + return s:err('Error upgrading vim-plug: '. out) + endif + + if readfile(s:me) ==# readfile(new) + echo 'vim-plug is already up-to-date' + return 0 + else + call rename(s:me, s:me . '.old') + call rename(new, s:me) + unlet g:loaded_plug + echo 'vim-plug has been upgraded' + return 1 + endif + finally + silent! call s:rm_rf(tmp) + endtry +endfunction + +function! s:upgrade_specs() + for spec in values(g:plugs) + let spec.frozen = get(spec, 'frozen', 0) + endfor +endfunction + +function! s:status() + call s:prepare() + call append(0, 'Checking plugins') + call append(1, '') + + let ecnt = 0 + let unloaded = 0 + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + if has_key(spec, 'uri') + if isdirectory(spec.dir) + let [err, _] = s:git_validate(spec, 1) + let [valid, msg] = [empty(err), empty(err) ? 'OK' : err] + else + let [valid, msg] = [0, 'Not found. Try PlugInstall.'] + endif + else + if isdirectory(spec.dir) + let [valid, msg] = [1, 'OK'] + else + let [valid, msg] = [0, 'Not found.'] + endif + endif + let cnt += 1 + let ecnt += !valid + " `s:loaded` entry can be missing if PlugUpgraded + if valid && get(s:loaded, name, -1) == 0 + let unloaded = 1 + let msg .= ' (not loaded)' + endif + call s:progress_bar(2, repeat('=', cnt), total) + call append(3, s:format_message(valid ? '-' : 'x', name, msg)) + normal! 2G + redraw + endfor + call setline(1, 'Finished. '.ecnt.' error(s).') + normal! gg + setlocal nomodifiable + if unloaded + echo "Press 'L' on each line to load plugin, or 'U' to update" + nnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr> + xnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr> + end +endfunction + +function! s:extract_name(str, prefix, suffix) + return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$') +endfunction + +function! s:status_load(lnum) + let line = getline(a:lnum) + let name = s:extract_name(line, '-', '(not loaded)') + if !empty(name) + call plug#load(name) + setlocal modifiable + call setline(a:lnum, substitute(line, ' (not loaded)$', '', '')) + setlocal nomodifiable + endif +endfunction + +function! s:status_update() range + let lines = getline(a:firstline, a:lastline) + let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') + if !empty(names) + echo + execute 'PlugUpdate' join(names) + endif +endfunction + +function! s:is_preview_window_open() + silent! wincmd P + if &previewwindow + wincmd p + return 1 + endif +endfunction + +function! s:find_name(lnum) + for lnum in reverse(range(1, a:lnum)) + let line = getline(lnum) + if empty(line) + return '' + endif + let name = s:extract_name(line, '-', '') + if !empty(name) + return name + endif + endfor + return '' +endfunction + +function! s:preview_commit() + if b:plug_preview < 0 + let b:plug_preview = !s:is_preview_window_open() + endif + + let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}') + if empty(sha) + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir) + return + endif + + if exists('g:plug_pwindow') && !s:is_preview_window_open() + execute g:plug_pwindow + execute 'e' sha + else + execute 'pedit' sha + wincmd P + endif + setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable + try + let [sh, shrd] = s:chsh(1) + execute 'silent %!cd' s:shellesc(g:plugs[name].dir) '&& git show --no-color --pretty=medium' sha + finally + let [&shell, &shellredir] = [sh, shrd] + endtry + setlocal nomodifiable + nnoremap <silent> <buffer> q :q<cr> + wincmd p +endfunction + +function! s:section(flags) + call search('\(^[x-] \)\@<=[^:]\+:', a:flags) +endfunction + +function! s:format_git_log(line) + let indent = ' ' + let tokens = split(a:line, nr2char(1)) + if len(tokens) != 5 + return indent.substitute(a:line, '\s*$', '', '') + endif + let [graph, sha, refs, subject, date] = tokens + let tag = matchstr(refs, 'tag: [^,)]\+') + let tag = empty(tag) ? ' ' : ' ('.tag.') ' + return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date) +endfunction + +function! s:append_ul(lnum, text) + call append(a:lnum, ['', a:text, repeat('-', len(a:text))]) +endfunction + +function! s:diff() + call s:prepare() + call append(0, ['Collecting changes ...', '']) + let cnts = [0, 0] + let bar = '' + let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)') + call s:progress_bar(2, bar, len(total)) + for origin in [1, 0] + let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))')))) + if empty(plugs) + continue + endif + call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') + for [k, v] in plugs + let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..' + let diff = s:system_chomp('git log --graph --color=never --pretty=format:"%x01%h%x01%d%x01%s%x01%cr" '.s:shellesc(range), v.dir) + if !empty(diff) + let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' + call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) + let cnts[origin] += 1 + endif + let bar .= '=' + call s:progress_bar(2, bar, len(total)) + normal! 2G + redraw + endfor + if !cnts[origin] + call append(5, ['', 'N/A']) + endif + endfor + call setline(1, printf('%d plugin(s) updated.', cnts[0]) + \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : '')) + + if cnts[0] || cnts[1] + nnoremap <silent> <buffer> <cr> :silent! call <SID>preview_commit()<cr> + nnoremap <silent> <buffer> o :silent! call <SID>preview_commit()<cr> + endif + if cnts[0] + nnoremap <silent> <buffer> X :call <SID>revert()<cr> + echo "Press 'X' on each block to revert the update" + endif + normal! gg + setlocal nomodifiable +endfunction + +function! s:revert() + if search('^Pending updates', 'bnW') + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || + \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y' + return + endif + + call s:system('git reset --hard HEAD@{1} && git checkout '.s:esc(g:plugs[name].branch).' --', g:plugs[name].dir) + setlocal modifiable + normal! "_dap + setlocal nomodifiable + echo 'Reverted' +endfunction + +function! s:snapshot(force, ...) abort + call s:prepare() + setf vim + call append(0, ['" Generated by vim-plug', + \ '" '.strftime("%c"), + \ '" :source this file in vim to restore the snapshot', + \ '" or execute: vim -S snapshot.vim', + \ '', '', 'PlugUpdate!']) + 1 + let anchor = line('$') - 3 + let names = sort(keys(filter(copy(g:plugs), + \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)'))) + for name in reverse(names) + let sha = s:system_chomp('git rev-parse --short HEAD', g:plugs[name].dir) + if !empty(sha) + call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) + redraw + endif + endfor + + if a:0 > 0 + let fn = expand(a:1) + if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?')) + return + endif + call writefile(getline(1, '$'), fn) + echo 'Saved as '.a:1 + silent execute 'e' s:esc(fn) + setf vim + endif +endfunction + +function! s:split_rtp() + return split(&rtp, '\\\@<!,') +endfunction + +let s:first_rtp = s:escrtp(get(s:split_rtp(), 0, '')) +let s:last_rtp = s:escrtp(get(s:split_rtp(), -1, '')) + +if exists('g:plugs') + let g:plugs_order = get(g:, 'plugs_order', keys(g:plugs)) + call s:upgrade_specs() + call s:define_commands() +endif + +let &cpo = s:cpo_save +unlet s:cpo_save diff --git a/.vim/init.vim b/.vim/init.vim @@ -0,0 +1 @@ +Plug 'fatih/vim-go' diff --git a/.vim/plugged/SyntaxAttr.vim b/.vim/plugged/SyntaxAttr.vim @@ -0,0 +1 @@ +Subproject commit 8debed49d8df762fd89f540996d9e9a5016ec0a3 diff --git a/.vim/plugged/auto-pairs b/.vim/plugged/auto-pairs @@ -0,0 +1 @@ +Subproject commit f0019fc6423e7ce7bbd01d196a7e027077687fda diff --git a/.vim/plugged/ctrlp.vim b/.vim/plugged/ctrlp.vim @@ -0,0 +1 @@ +Subproject commit 4b9e7cac612902a25498cca49f13475fe1a821a4 diff --git a/.vim/plugged/goyo.vim b/.vim/plugged/goyo.vim @@ -0,0 +1 @@ +Subproject commit 5b8bd0378758c1d9550d8429bef24b3d6d78b592 diff --git a/.vim/plugged/gruvbox b/.vim/plugged/gruvbox @@ -0,0 +1 @@ +Subproject commit cb4e7a5643f7d2dd40e694bcbd28c4b89b185e86 diff --git a/.vim/plugged/neocomplete.vim b/.vim/plugged/neocomplete.vim @@ -0,0 +1 @@ +Subproject commit 4be617947f3fcf2d725fab20b0e12f8b46c9e2f3 diff --git a/.vim/plugged/nerdtree b/.vim/plugged/nerdtree @@ -0,0 +1 @@ +Subproject commit d3a7cd20aed896e62ca4fbcd44b8ebdf842d1adf diff --git a/.vim/plugged/rust.vim b/.vim/plugged/rust.vim @@ -0,0 +1 @@ +Subproject commit 8e75da9834abb22f8d7ece3f4ca4324a14fa18a6 diff --git a/.vim/plugged/vim-airline b/.vim/plugged/vim-airline @@ -0,0 +1 @@ +Subproject commit e03afa1733c6296774ca95ef981bd8fd39bb1151 diff --git a/.vim/plugged/vim-airline-themes b/.vim/plugged/vim-airline-themes @@ -0,0 +1 @@ +Subproject commit 7865fd8ba435edd01ff7b59de06a9be73e01950d diff --git a/.vim/plugged/vim-commentary b/.vim/plugged/vim-commentary @@ -0,0 +1 @@ +Subproject commit 54e5676988e6eeaa05b41730b6b056026ad0ef13 diff --git a/.vim/plugged/vim-delve b/.vim/plugged/vim-delve @@ -0,0 +1 @@ +Subproject commit c73bde34062feee0ac3d43bbf2f8a7d982ca330e diff --git a/.vim/plugged/vim-easy-align b/.vim/plugged/vim-easy-align @@ -0,0 +1 @@ +Subproject commit 1cd724dc239c3a0f7a12e0fac85945cc3dbe07b0 diff --git a/.vim/plugged/vim-fugitive b/.vim/plugged/vim-fugitive @@ -0,0 +1 @@ +Subproject commit 40d78f07dee2ffab68abb9d6d1a9e27843df0fe0 diff --git a/.vim/plugged/vim-go b/.vim/plugged/vim-go @@ -0,0 +1 @@ +Subproject commit 7491209072ed4aa746e6fe7894f976ecd251801e diff --git a/.vim/plugged/vim-ledger b/.vim/plugged/vim-ledger @@ -0,0 +1 @@ +Subproject commit 1c3551b2e9103d771f7c8c4cbe4d54fcde2a60d3 diff --git a/.vim/plugged/vim-racer b/.vim/plugged/vim-racer @@ -0,0 +1 @@ +Subproject commit da725d38a6f0dd223771018c05e62a33c4a92f09 diff --git a/.vim/plugged/vim-surround b/.vim/plugged/vim-surround @@ -0,0 +1 @@ +Subproject commit e49d6c2459e0f5569ff2d533b4df995dd7f98313 diff --git a/.vim/plugged/vim-toml b/.vim/plugged/vim-toml @@ -0,0 +1 @@ +Subproject commit 624f02475080ea26d9430b8d31d7c3199b0ec939 diff --git a/.vim/plugged/vim-yaml b/.vim/plugged/vim-yaml @@ -0,0 +1 @@ +Subproject commit c21962fa4fc088f17a8e37854430ec7fa16dec13 diff --git a/.vim/plugged/xterm-color-table.vim b/.vim/plugged/xterm-color-table.vim @@ -0,0 +1 @@ +Subproject commit 9754e857e5f4fe1f8727106dcc682d21c29a51e4 diff --git a/.vim/plugged/youcompleteme b/.vim/plugged/youcompleteme @@ -0,0 +1 @@ +Subproject commit 1e38a2bfc530c632bafca4c35a65a8a27314c184 diff --git a/.vimrc b/.vimrc @@ -0,0 +1,25 @@ +" _ +" __ _(_)_ __ ___ _ __ ___ +" \ \ / / | '_ ` _ \| '__/ __| +" \ V /| | | | | | | | | (__ +" \_/ |_|_| |_| |_|_| \___| + +let mapleader =" " + +call plug#begin('~/.vim/plugged') +Plug 'junegunn/goyo.vim' +call plug#end() + +" Some basics: + set nocompatible + set encoding=utf-8 + +" Splits open at the bottom and right, which is non-retarded, unlike vim defaults. + set splitbelow + set splitright + +" Compile document + map <leader>c :!compiler <c-r>%<CR> + +" Open corresponding .pdf + map <leader>p :!open <c-r>%<CR><CR> diff --git a/.zshenv b/.zshenv @@ -0,0 +1,50 @@ +export PATH=$PATH:/usr/local/bin + +## ZSH Config +export ZDOTDIR=$HOME +export ZSHDDIR=$HOME/.config/zsh +export ZSH=$HOME/.config/oh-my-zsh +export SHELL_SESSION_HISTORY=0 + +export HISTSIZE=1000 +export SAVEHIST=1000 +export HISTFILE=~/.history + +export ZSH_THEME="evan" +export DISABLE_LS_COLORS="false" +export DISABLE_AUTO_TITLE="true" + +## User configuration +export SHELL=/bin/zsh +export MANPATH=/usr/local/share/man:$MANPATH + +## Homebrew +export HOMEBREW_GITHUB_API_TOKEN="30e5da2b006d5f92e5474ff17c7eefe5cad20ee9" +export PATH="/usr/local/sbin:$PATH" + +## Haskel +export PATH=$PATH:$HOME/Library/Haskell/bin + +## Go +export GOROOT=/usr/local/go +export GOPATH=$HOME/prog/go +export PATH=$PATH:$GOPATH/bin +export CORE=$GOPATH/src/gitlab.com/redeam/core + +## Docker +export DOCKER_HIDE_LEGACY_COMMANDS=1 + +## Rust +export PATH=$PATH:$HOME/.cargo/bin + +## fzf +export FZF_DEFAULT_OPTS='--height 40% --exact' +export FZF_CTRL_T_OPTS="--preview '(highlight -O ansi -l {} 2> /dev/null || cat {} || tree -C {}) 2> /dev/null | head -200'" +export FZF_CTRL_R_OPTS='--sort --exact' + +## Google Cloud SDK +export PATH="/usr/local/opt/texinfo/bin:$PATH" +export PATH="/usr/local/opt/gpg-agent/bin:$PATH" + +## Misc +export PATH="$HOME/.scripts:$PATH" diff --git a/.zshrc b/.zshrc @@ -0,0 +1,77 @@ +plugins=(git osx brew) +echo -e "\033]; \007" +source ~/.oh-my-zsh/oh-my-zsh.sh + +## Alias +alias ls="ls -F" +alias ll="ls -lh" +alias emacs="TERM=xterm-256color emacs" +alias q="exit" +alias neo="clear && neofetch" +alias notify='terminal-notifier -title "Terminal" -message "Done with taks"' +alias weather="curl wttr.in/\~Boulder+Colorado" +alias f="fzf --preview=\"head -$LINES {}\"" +alias fz="vim \$(f)" +alias vi=vim +alias yt="youtube-dl" + +# Kubernetes +alias kc="kubectl --kubeconfig=$HOME/cluster.config" +alias helm="helm --kubeconfig=$HOME/cluster.config" +alias c="cd $CORE" + +## Kubernetes +function gdep { + godepgraph -o gitlab.com/redeam -s gitlab.com/redeam/core/$1 | dot -Tpng -o /tmp/dep.png + open /tmp/dep.png +} + +function gp { + kubectl --kubeconfig=$HOME/cluster.config get pods | egrep -o "$1.*Running" | egrep -o "$1[^ ]*" | head -1 +} + +function kcforward { + POD=`gp $1` + kubectl --kubeconfig=$HOME/cluster.config port-forward $POD $2:8001 +} + +alias kt="ktail --kubeconfig=$HOME/cluster.config -t ' +$BOLD$LIGHT_CYAN{{ .Container.Name }}$NONE $DIM{{ .Pod.Name }}$NONE $YELLOW{{ if .Timestamp }}{{ .Timestamp.Format \"2006-01-02T15:04:05.999999999Z07:00\" }}{{ end }}$NONE +{{ .Message }} '" + +# repeat history +function fh { + print -z $( ([ -n "$ZSH_NAME" ] && fc -l 1 || history) | fzf +s --tac | sed 's/ *[0-9]* *//') +} + +function fhc { + echo -n $( ([ -n "$ZSH_NAME" ] && fc -l 1 || history) | fzf +s --tac | sed 's/ *[0-9]* *//') | pbcopy +} + +# coloured manuals +man() { + env \ + LESS_TERMCAP_mb=$(printf "\e[1;31m") \ + LESS_TERMCAP_md=$(printf "\e[1;31m") \ + LESS_TERMCAP_me=$(printf "\e[0m") \ + LESS_TERMCAP_se=$(printf "\e[0m") \ + LESS_TERMCAP_so=$(printf "\e[1;44;33m") \ + LESS_TERMCAP_ue=$(printf "\e[0m") \ + LESS_TERMCAP_us=$(printf "\e[1;32m") \ + man "$@" +} + +autoload -U +X bashcompinit && bashcompinit + +~/.vim/plugged/gruvbox/gruvbox_256palette_osx.sh + +# if [ -z $TMUX ] +# then +# tmux ls && read tmux_session && tmux attach -t ${tmux_session:-default} || tmux new -s ${tmux_session:-default} +# fi + +# The next line updates PATH for the Google Cloud SDK. +if [ -f '/Users/markfeller/Downloads/google-cloud-sdk/path.zsh.inc' ]; then source '/Users/markfeller/Downloads/google-cloud-sdk/path.zsh.inc'; fi + +# The next line enables shell command completion for gcloud. +if [ -f '/Users/markfeller/Downloads/google-cloud-sdk/completion.zsh.inc' ]; then source '/Users/markfeller/Downloads/google-cloud-sdk/completion.zsh.inc'; fi diff --git a/README b/README @@ -0,0 +1,3 @@ +Manual install +- fd +- alacritty diff --git a/link.sh b/link.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +function link { + ln -sFf $1 $HOME/$1 +} + +function link_config { + link .tmux.conf + link .zshrc + link .zshenv + + link .config/mpd + link .config/ranger + link .config/neofetch + link .config/alactritty + + link .scripts +} + +function setup_mpd { + mkdir -p .config/mpd/playlists + touch .config/mpd/database + touch .config/mpd/log + touch .config/mpd/pid + touch .config/mpd/state + touch .config/mpd/sticker.sql +} + +function setup_vim { + link .vimrc + link .vim +} + +link_config +setup_mpd +setup_vim diff --git a/progs.csv b/progs.csv @@ -0,0 +1,23 @@ +bat +emacs +fd +ffmpeg +fontconfig +freetype +fzf +gpg-agent +graphviz +htop +mpc +mpd +ncmpcpp +ncurses +neofetch +openssl +ranger +readline +ripgrep +tmux +vim +wget +youtube-dl