aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkshay <[email protected]>2020-07-22 03:34:08 +0100
committerAkshay <[email protected]>2020-07-22 03:34:08 +0100
commit51810b5c07e20982ebdf66f0bfb384c4bf55ad7d (patch)
treeb5120bfc9b0ca72c9293afb9ed6e2e632a811deb
squash again
-rw-r--r--.gitignore22
-rw-r--r--README.md18
-rw-r--r--X/.Xresources118
-rwxr-xr-xX/.xinitrc14
-rw-r--r--alacritty/.config/alacritty/alacritty.yml336
-rw-r--r--bash/.bash_aliases30
-rw-r--r--bash/.bash_profile8
-rwxr-xr-xbash/.bash_prompt52
-rw-r--r--bash/.bashrc144
-rwxr-xr-xcmus/.config/cmus/cmus-status-display.sh8
-rw-r--r--cmus/.config/cmus/nerdz.theme57
-rw-r--r--compton/.config/compton.conf90
-rw-r--r--dunst/.config/dunst/dunstrc67
-rw-r--r--git/.gitconfig36
-rw-r--r--nvim/.config/nvim/after/.netrwhist4
-rw-r--r--nvim/.config/nvim/after/syntax/python.vim6
-rw-r--r--nvim/.config/nvim/after/syntax/scheme.vim19
-rw-r--r--nvim/.config/nvim/autoload/plug.vim.old2540
-rw-r--r--nvim/.config/nvim/coc-settings.json54
-rw-r--r--nvim/.config/nvim/ftplugin/asm.vim1
-rw-r--r--nvim/.config/nvim/ftplugin/javascript.vim8
-rw-r--r--nvim/.config/nvim/ftplugin/python.vim7
-rw-r--r--nvim/.config/nvim/ftplugin/rust.vim1
-rw-r--r--nvim/.config/nvim/ftplugin/scheme.vim10
-rw-r--r--nvim/.config/nvim/ftplugin/tex.vim3
-rw-r--r--nvim/.config/nvim/ftplugin/typescript.vim7
-rw-r--r--nvim/.config/nvim/init.vim185
-rw-r--r--nvim/.config/nvim/plugin/help.vim16
-rw-r--r--nvim/.config/nvim/plugin/ignores.vim11
-rw-r--r--nvim/.config/nvim/plugin/maps.vim78
-rw-r--r--nvim/.config/nvim/plugin/statusline.vim136
-rw-r--r--nvim/.config/nvim/plugin/textobjs.vim27
-rw-r--r--nvim/.config/nvim/syntax/proto.vim106
-rw-r--r--polybar/.config/polybar/config234
-rwxr-xr-xscripts/scripts/2bws.sh40
-rwxr-xr-xscripts/scripts/bar.sh75
-rwxr-xr-xscripts/scripts/bat56
-rwxr-xr-xscripts/scripts/bluetooth.sh14
-rwxr-xr-xscripts/scripts/blur.sh25
-rwxr-xr-xscripts/scripts/cmusnp.sh45
-rwxr-xr-xscripts/scripts/date.sh4
-rwxr-xr-xscripts/scripts/doot53
-rwxr-xr-xscripts/scripts/draw.sh11
-rwxr-xr-xscripts/scripts/get_xres3
-rwxr-xr-xscripts/scripts/hidebars.sh23
-rwxr-xr-xscripts/scripts/img.sh32
-rwxr-xr-xscripts/scripts/music.sh16
-rwxr-xr-xscripts/scripts/netwrk.sh10
-rwxr-xr-xscripts/scripts/playpause.sh17
-rwxr-xr-xscripts/scripts/popups/cover.sh14
-rwxr-xr-xscripts/scripts/record23
-rwxr-xr-xscripts/scripts/restartbars.sh6
-rwxr-xr-xscripts/scripts/time.sh6
-rwxr-xr-xscripts/scripts/tmux-fzf.sh15
-rwxr-xr-xscripts/scripts/up20
-rwxr-xr-xscripts/scripts/url.sh4
-rwxr-xr-xscripts/scripts/vol21
-rwxr-xr-xscripts/scripts/wscycle.sh30
-rwxr-xr-xscripts/scripts/zatheme.sh37
-rw-r--r--sxhkd/.config/sxhkd/sxhkdrc14
-rw-r--r--tmux/.tmux.conf62
-rw-r--r--weechat/.weechat/weechat.conf719
-rw-r--r--zathura/.config/zathura/zathurarc34
63 files changed, 5882 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6844bd7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,22 @@
1*.txt
2*logs*
3*.log
4*~
5*.swp
6*.pyc
7images/
8*gitgraph*
9*colors*
10scripts/scripts/graphs
11weechat/sec.conf
12**/plug.vim
13ssh
14
15vim/.vim/autoload
16vim/.vim/view/*
17vim/.vim/spell/*
18./**/*.netrwhist
19./**/*.add
20./**/*.add.spl
21
22i3
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..5cea079
--- /dev/null
+++ b/README.md
@@ -0,0 +1,18 @@
1![neet.png](https://u.peppe.rs/0g.png)
2
3
4```
5 █▀▀▀ ▀█▀ █ █▀▀ █▀▀
6 █▀▀ █ █ █▀▀ ▀▀█
7▀ ▀ ▀▀▀ ▀▀▀ ▀▀▀ ▀▀▀
8```
9
10
11A bunch of files that are essential to my gnu/linux box configuration.
12
13 - WM : [2bwm](https://wiki.archlinux.org/index.php/2bwm)
14 - Editor : [vim](https://vim.org/)
15 - Font : [Iosevka](https://github.com/be5invis/Iosevka/)
16 - Terminal : [st](https://st.suckless.org/)
17 - Multiplexer : [tmux](https://github.com/tmux/tmux)
18 - Shell : [bash](https://www.gnu.org/software/bash/)
diff --git a/X/.Xresources b/X/.Xresources
new file mode 100644
index 0000000..010298e
--- /dev/null
+++ b/X/.Xresources
@@ -0,0 +1,118 @@
1! ------------------------------------------------------------------------------
2! Colors
3! ------------------------------------------------------------------------------
4!
5!------------------------------------------------------------------------------
6
7#define base00 #000000
8#define base01 #303030
9#define base02 #353535
10#define base03 #4A4A4A
11#define base04 #787878
12#define base05 #EEFFFF
13#define base06 #EEFFFF
14#define base07 #FFFFFF
15#define base08 #F07178
16#define base09 #F78C6C
17#define base0A #FDF200
18#define base0B #13CA91
19#define base0C #79ffe1
20#define base0D #7898FB
21#define base0E #ff3299
22#define base0F #FF5370
23
24! URxvt
25! ------------------------------------------------------------------------------
26
27*foreground: base05
28*background: base00
29*cursorColor: base05
30
31*color0: base00
32*color1: base08
33*color2: base0B
34*color3: base0A
35*color4: base0D
36*color5: base0E
37*color6: base0C
38*color7: base05
39
40*color8: base03
41*color9: base09
42*color10: base01
43*color11: base02
44*color12: base04
45*color13: base06
46*color14: base0F
47*color15: base07
48
49URxvt.cursorBlink : 1
50URxvt.font :xft:Input:size=12:style=Regular \
51 xft:DejaVu Sans Mono:size=11:style=Medium
52
53URxvt.italicFont :xft:Input:size=12:style=Italic
54URxvt.boldFont :xft:Input:size=12:style=Bold
55
56URxvt.lineSpace : 0
57URxvt.letterSpace : -1
58URxvt.scrollBar : false
59URxvt.internalBorder : 25
60URxvt.cursorUnderline : false
61URxvt.geometry : 70x35
62URxvt.thickness : 5
63URxvt.titleBar : false
64URxvt.intensityStyles : false
65
66
67URxvt.perl-ext-common : default,matcher
68URxvt.url-launcher : firefox
69URxvt.matcher.button : 1
70
71! ------------------------------------------------------------------------------
72! rofi
73! ------------------------------------------------------------------------------
74rofi.color-enabled: true
75
76rofi.color-window: base00 , base00 , base00 , base00 , base03
77rofi.color-normal: base00 , base03 , base00 , base00 , base07
78rofi.color-active: base03 , base0E , base00 , base0B , base00
79rofi.color-urgent: base00 , base03 , base00 , base00 , base03
80
81rofi.fake-transparency : true
82rofi.font : Iosevka Nerd 13
83rofi.columns : 1
84rofi.separator-style : none
85rofi.hide-scrollbar : true
86rofi.location : 1
87rofi.yoffset : 20
88rofi.xoffset : 20
89rofi.padding : 32
90rofi.fullscreen : false
91rofi.width : 300
92rofi.lines : 6
93
94dzen2.font: -*-archivo-medium-r-normal--0-90-0-0-p-0-*-*
95dzen2.foreground: base07
96dzen2.background: ase00
97
98Xft.autohint: 1
99Xft.antialias: 1
100Xft.lcdfilter: lcddefault
101Xft.hintstyle: hintslight
102Xft.hinting: true
103Xft.rgba: rgb
104Xft.dpi: 110
105
106! ------------------------------------------------------------------------------
107! 2bwm
108! ------------------------------------------------------------------------------
109
110twobwm.border_width: 8
111twobwm.outer_border: 2
112twobwm.focus_color: base01
113twobwm.unfocus_color: base01
114twobwm.fixed_color: base0D
115twobwm.unkill_color: base08
116twobwm.fixed_unkill_color: base0E
117twobwm.outer_border_color: base00
118twobwm.inverted_colors: true
diff --git a/X/.xinitrc b/X/.xinitrc
new file mode 100755
index 0000000..c811f12
--- /dev/null
+++ b/X/.xinitrc
@@ -0,0 +1,14 @@
1#!/bin/sh
2
3xsetroot -cursor_name left_ptr &
4xrdb -load ~/.Xresources
5setxkbmap -option caps:escape
6setxkbmap -option compose:rctrl
7
8compton &
9dunst -config "$HOME"/.config/dunst/dunstrc &
10sxhkd -c "$HOME"/.config/sxhkd/sxhkdrc &
11
12/home/np/.fehbg
13
14exec 2bwm
diff --git a/alacritty/.config/alacritty/alacritty.yml b/alacritty/.config/alacritty/alacritty.yml
new file mode 100644
index 0000000..b2f25a1
--- /dev/null
+++ b/alacritty/.config/alacritty/alacritty.yml
@@ -0,0 +1,336 @@
1env:
2 TERM: xterm-256color
3
4window:
5 dimensions:
6 columns: 0
7 lines: 0
8
9 padding:
10 x: 44
11 y: 44
12
13# Display tabs using this many cells (changes require restart)
14tabspaces: 4
15
16# When true, bold text is drawn using the bright variant of colors.
17draw_bold_text_with_bright_colors: false
18
19# Font configuration (changes require restart)
20#
21# Important font attributes like antialiasing, subpixel aa, and hinting can be
22# controlled through fontconfig. Specifically, the following attributes should
23# have an effect:
24#
25# * hintstyle
26# * antialias
27# * lcdfilter
28# * rgba
29#
30# For instance, if you wish to disable subpixel antialiasing, you might set the
31# rgba property to "none". If you wish to completely disable antialiasing, you
32# can set antialias to false.
33#
34# Please see these resources for more information on how to use fontconfig
35#
36# * https://wiki.archlinux.org/index.php/font_configuration#Fontconfig_configuration
37# * file:///usr/share/doc/fontconfig/fontconfig-user.html
38font:
39 # The normal (roman) font face to use.
40 normal:
41 family: Basier Square Mono # should be "Menlo" or something on macOS.
42 # Style can be specified to pick a specific face.
43 style: Regular
44
45 # The bold font face
46 bold:
47 family: Basier Square Mono # should be "Menlo" or something on macOS.
48 # Style can be specified to pick a specific face.
49 style: Bold
50
51 # The italic font face
52 italic:
53 family: Basier Square Mono # should be "Menlo" or something on macOS.
54 # Style can be specified to pick a specific face.
55 style: Italic
56
57 # Point size of the font
58 size: 13.0
59
60 # Offset is the extra space around each character. offset.y can be thought of
61 # as modifying the linespacing, and offset.x as modifying the letter spacing.
62 offset:
63 x: 0
64 y: 0
65
66 # Glyph offset determines the locations of the glyphs within their cells with
67 # the default being at the bottom. Increase the x offset to move the glyph to
68 # the right, increase the y offset to move the glyph upward.
69 glyph_offset:
70 x: 0
71 y: 0
72
73 # OS X only: use thin stroke font rendering. Thin strokes are suitable
74 # for retina displays, but for non-retina you probably want this set to
75 # false.
76 use_thin_strokes: false
77
78# Should display the render timer
79debug.render_timer: false
80
81# Use custom cursor colors. If true, display the cursor in the cursor.foreground
82# and cursor.background colors, otherwise invert the colors of the cursor.
83custom_cursor_colors: false
84
85# Colorscheme
86
87colors:
88 # Default colors
89 primary:
90 background: '0xfafafa'
91 foreground: '0x383a42'
92
93 # Colors the cursor will use if `custom_cursor_colors` is true
94 cursor:
95 text: '0xfafafa'
96 cursor: '0x383a42'
97
98 # Normal colors
99 normal:
100 black: '0xfafafa'
101 red: '0xca1243'
102 green: '0x50a14f'
103 yellow: '0xc18401'
104 blue: '0x4078f2'
105 magenta: '0xa626a4'
106 cyan: '0x0184bc'
107 white: '0x383a42'
108
109 # Bright colors
110 bright:
111 black: '0xa0a1a7'
112 red: '0xd75f00'
113 green: '0xf0f0f1'
114 yellow: '0xe5e5e6'
115 blue: '0x696c77'
116 magenta: '0x202227'
117 cyan: '0x986801'
118 white: '0x090a0b'
119
120# Visual Bell
121#
122# Any time the BEL code is received, Alacritty "rings" the visual bell. Once
123# rung, the terminal background will be set to white and transition back to the
124# default background color. You can control the rate of this transition by
125# setting the `duration` property (represented in milliseconds). You can also
126# configure the transition function by setting the `animation` property.
127#
128# Possible values for `animation`
129# `Ease`
130# `EaseOut`
131# `EaseOutSine`
132# `EaseOutQuad`
133# `EaseOutCubic`
134# `EaseOutQuart`
135# `EaseOutQuint`
136# `EaseOutExpo`
137# `EaseOutCirc`
138# `Linear`
139#
140# To completely disable the visual bell, set its duration to 0.
141#
142visual_bell:
143 animation: EaseOutExpo
144 duration: 0
145
146# Background opacity
147background_opacity: 1.0
148
149# Mouse bindings
150#
151# Currently doesn't support modifiers. Both the `mouse` and `action` fields must
152# be specified.
153#
154# Values for `mouse`:
155# - Middle
156# - Left
157# - Right
158# - Numeric identifier such as `5`
159#
160# Values for `action`:
161# - Paste
162# - PasteSelection
163# - Copy (TODO)
164mouse_bindings:
165 - { mouse: Middle, action: PasteSelection }
166
167mouse:
168 double_click: { threshold: 300 }
169 triple_click: { threshold: 300 }
170
171selection:
172 semantic_escape_chars: ",│`|:\"' ()[]{}<>"
173
174hide_cursor_when_typing: false
175
176# Style of the cursor
177#
178# Values for 'cursor_style':
179# - Block
180# - Underline
181# - Beam
182cursor_style: underline
183
184# Live config reload (changes require restart)
185live_config_reload: true
186
187# Shell
188#
189# You can set shell.program to the path of your favorite shell, e.g. /bin/fish.
190# Entries in shell.args are passed unmodified as arguments to the shell.
191# shell:
192# program: /bin/bash
193# args:
194# - --login
195
196
197# Key bindings
198#
199# Each binding is defined as an object with some properties. Most of the
200# properties are optional. All of the alphabetical keys should have a letter for
201# the `key` value such as `V`. Function keys are probably what you would expect
202# as well (F1, F2, ..). The number keys above the main keyboard are encoded as
203# `Key1`, `Key2`, etc. Keys on the number pad are encoded `Number1`, `Number2`,
204# etc. These all match the glutin::VirtualKeyCode variants.
205#
206# Possible values for `mods`
207# `Command`, `Super` refer to the super/command/windows key
208# `Control` for the control key
209# `Shift` for the Shift key
210# `Alt` and `Option` refer to alt/option
211#
212# mods may be combined with a `|`. For example, requiring control and shift
213# looks like:
214#
215# mods: Control|Shift
216#
217# The parser is currently quite sensitive to whitespace and capitalization -
218# capitalization must match exactly, and piped items must not have whitespace
219# around them.
220#
221# Either an `action`, `chars`, or `command` field must be present.
222# `action` must be one of `Paste`, `PasteSelection`, `Copy`, or `Quit`.
223# `chars` writes the specified string every time that binding is activated.
224# These should generally be escape sequences, but they can be configured to
225# send arbitrary strings of bytes.
226# `command` must be a map containing a `program` string, and `args` array of
227# strings. For example:
228# - { ... , command: { program: "alacritty", args: ["-e", "vttest"] } }
229#
230# Want to add a binding (e.g. "PageUp") but are unsure what the X sequence
231# (e.g. "\x1b[5~") is? Open another terminal (like xterm) without tmux,
232# then run `showkey -a` to get the sequence associated to a key combination.
233key_bindings:
234 - { key: V, mods: Control|Shift, action: Paste }
235 - { key: C, mods: Control|Shift, action: Copy }
236 - { key: Q, mods: Command, action: Quit }
237 - { key: W, mods: Command, action: Quit }
238 - { key: Insert, mods: Shift, action: PasteSelection }
239 - { key: Key0, mods: Control, action: ResetFontSize }
240 - { key: Equals, mods: Control, action: IncreaseFontSize }
241 - { key: Subtract, mods: Control, action: DecreaseFontSize }
242 - { key: Home, chars: "\x1bOH", mode: AppCursor }
243 - { key: Home, chars: "\x1b[H", mode: ~AppCursor }
244 - { key: End, chars: "\x1bOF", mode: AppCursor }
245 - { key: End, chars: "\x1b[F", mode: ~AppCursor }
246 - { key: PageUp, mods: Shift, chars: "\x1b[5;2~" }
247 - { key: PageUp, mods: Control, chars: "\x1b[5;5~" }
248 - { key: PageUp, chars: "\x1b[5~" }
249 - { key: PageDown, mods: Shift, chars: "\x1b[6;2~" }
250 - { key: PageDown, mods: Control, chars: "\x1b[6;5~" }
251 - { key: PageDown, chars: "\x1b[6~" }
252 - { key: Tab, mods: Shift, chars: "\x1b[Z" }
253 - { key: Back, chars: "\x7f" }
254 - { key: Back, mods: Alt, chars: "\x1b\x7f" }
255 - { key: Insert, chars: "\x1b[2~" }
256 - { key: Delete, chars: "\x1b[3~" }
257 - { key: Left, mods: Shift, chars: "\x1b[1;2D" }
258 - { key: Left, mods: Control, chars: "\x1b[1;5D" }
259 - { key: Left, mods: Alt, chars: "\x1b[1;3D" }
260 - { key: Left, chars: "\x1b[D", mode: ~AppCursor }
261 - { key: Left, chars: "\x1bOD", mode: AppCursor }
262 - { key: Right, mods: Shift, chars: "\x1b[1;2C" }
263 - { key: Right, mods: Control, chars: "\x1b[1;5C" }
264 - { key: Right, mods: Alt, chars: "\x1b[1;3C" }
265 - { key: Right, chars: "\x1b[C", mode: ~AppCursor }
266 - { key: Right, chars: "\x1bOC", mode: AppCursor }
267 - { key: Up, mods: Shift, chars: "\x1b[1;2A" }
268 - { key: Up, mods: Control, chars: "\x1b[1;5A" }
269 - { key: Up, mods: Alt, chars: "\x1b[1;3A" }
270 - { key: Up, chars: "\x1b[A", mode: ~AppCursor }
271 - { key: Up, chars: "\x1bOA", mode: AppCursor }
272 - { key: Down, mods: Shift, chars: "\x1b[1;2B" }
273 - { key: Down, mods: Control, chars: "\x1b[1;5B" }
274 - { key: Down, mods: Alt, chars: "\x1b[1;3B" }
275 - { key: Down, chars: "\x1b[B", mode: ~AppCursor }
276 - { key: Down, chars: "\x1bOB", mode: AppCursor }
277 - { key: F1, chars: "\x1bOP" }
278 - { key: F2, chars: "\x1bOQ" }
279 - { key: F3, chars: "\x1bOR" }
280 - { key: F4, chars: "\x1bOS" }
281 - { key: F5, chars: "\x1b[15~" }
282 - { key: F6, chars: "\x1b[17~" }
283 - { key: F7, chars: "\x1b[18~" }
284 - { key: F8, chars: "\x1b[19~" }
285 - { key: F9, chars: "\x1b[20~" }
286 - { key: F10, chars: "\x1b[21~" }
287 - { key: F11, chars: "\x1b[23~" }
288 - { key: F12, chars: "\x1b[24~" }
289 - { key: F1, mods: Shift, chars: "\x1b[1;2P" }
290 - { key: F2, mods: Shift, chars: "\x1b[1;2Q" }
291 - { key: F3, mods: Shift, chars: "\x1b[1;2R" }
292 - { key: F4, mods: Shift, chars: "\x1b[1;2S" }
293 - { key: F5, mods: Shift, chars: "\x1b[15;2~" }
294 - { key: F6, mods: Shift, chars: "\x1b[17;2~" }
295 - { key: F7, mods: Shift, chars: "\x1b[18;2~" }
296 - { key: F8, mods: Shift, chars: "\x1b[19;2~" }
297 - { key: F9, mods: Shift, chars: "\x1b[20;2~" }
298 - { key: F10, mods: Shift, chars: "\x1b[21;2~" }
299 - { key: F11, mods: Shift, chars: "\x1b[23;2~" }
300 - { key: F12, mods: Shift, chars: "\x1b[24;2~" }
301 - { key: F1, mods: Control, chars: "\x1b[1;5P" }
302 - { key: F2, mods: Control, chars: "\x1b[1;5Q" }
303 - { key: F3, mods: Control, chars: "\x1b[1;5R" }
304 - { key: F4, mods: Control, chars: "\x1b[1;5S" }
305 - { key: F5, mods: Control, chars: "\x1b[15;5~" }
306 - { key: F6, mods: Control, chars: "\x1b[17;5~" }
307 - { key: F7, mods: Control, chars: "\x1b[18;5~" }
308 - { key: F8, mods: Control, chars: "\x1b[19;5~" }
309 - { key: F9, mods: Control, chars: "\x1b[20;5~" }
310 - { key: F10, mods: Control, chars: "\x1b[21;5~" }
311 - { key: F11, mods: Control, chars: "\x1b[23;5~" }
312 - { key: F12, mods: Control, chars: "\x1b[24;5~" }
313 - { key: F1, mods: Alt, chars: "\x1b[1;6P" }
314 - { key: F2, mods: Alt, chars: "\x1b[1;6Q" }
315 - { key: F3, mods: Alt, chars: "\x1b[1;6R" }
316 - { key: F4, mods: Alt, chars: "\x1b[1;6S" }
317 - { key: F5, mods: Alt, chars: "\x1b[15;6~" }
318 - { key: F6, mods: Alt, chars: "\x1b[17;6~" }
319 - { key: F7, mods: Alt, chars: "\x1b[18;6~" }
320 - { key: F8, mods: Alt, chars: "\x1b[19;6~" }
321 - { key: F9, mods: Alt, chars: "\x1b[20;6~" }
322 - { key: F10, mods: Alt, chars: "\x1b[21;6~" }
323 - { key: F11, mods: Alt, chars: "\x1b[23;6~" }
324 - { key: F12, mods: Alt, chars: "\x1b[24;6~" }
325 - { key: F1, mods: Super, chars: "\x1b[1;3P" }
326 - { key: F2, mods: Super, chars: "\x1b[1;3Q" }
327 - { key: F3, mods: Super, chars: "\x1b[1;3R" }
328 - { key: F4, mods: Super, chars: "\x1b[1;3S" }
329 - { key: F5, mods: Super, chars: "\x1b[15;3~" }
330 - { key: F6, mods: Super, chars: "\x1b[17;3~" }
331 - { key: F7, mods: Super, chars: "\x1b[18;3~" }
332 - { key: F8, mods: Super, chars: "\x1b[19;3~" }
333 - { key: F9, mods: Super, chars: "\x1b[20;3~" }
334 - { key: F10, mods: Super, chars: "\x1b[21;3~" }
335 - { key: F11, mods: Super, chars: "\x1b[23;3~" }
336 - { key: F12, mods: Super, chars: "\x1b[24;3~" }
diff --git a/bash/.bash_aliases b/bash/.bash_aliases
new file mode 100644
index 0000000..fa78f7b
--- /dev/null
+++ b/bash/.bash_aliases
@@ -0,0 +1,30 @@
1
2alias ...='cd -- ../..'
3alias grep='grep --color=auto'
4alias l='ls -CF'
5alias la='ls -A'
6alias ll='ls -alF'
7alias ls='ls -F --color=always'
8alias nerdz='~/scripts/nerdinfo.sh'
9alias o='xdg-open'
10alias rless='less -r'
11alias spdtst='curl -o /dev/null http://speedtest.wdc01.softlayer.com/downloads/test10.zip'
12alias tmux='tmux -u'
13alias tree='tree -C'
14alias vim='nvim'
15alias vime='nvim ~/.vim/vimrc'
16
17# git aliases
18alias gb='git branch -v'
19alias gc='git commit --verbose'
20alias gd='git diff --minimal'
21alias ggp='git push'
22alias gl='git log -p --abbrev-commit --pretty=medium'
23alias glo='git log --pretty=oneline --abbrev-commit'
24alias gst='git status --short'
25
26# xbps
27alias +='sudo xbps-install'
28alias ?='xbps-query -Rs'
29alias ~='sudo xbps-remove'
30
diff --git a/bash/.bash_profile b/bash/.bash_profile
new file mode 100644
index 0000000..d7df6a9
--- /dev/null
+++ b/bash/.bash_profile
@@ -0,0 +1,8 @@
1# .bash_profile
2
3# Get the aliases and functions
4[ -f $HOME/.bashrc ] && . $HOME/.bashrc
5
6
7
8export PATH="$HOME/.poetry/bin:$PATH"
diff --git a/bash/.bash_prompt b/bash/.bash_prompt
new file mode 100755
index 0000000..667d32a
--- /dev/null
+++ b/bash/.bash_prompt
@@ -0,0 +1,52 @@
1red="\e[31m"
2grn="\e[32m"
3ylw="\e[33m"
4cyn="\e[36m"
5blu="\e[34m"
6prp="\e[35m"
7bprp="\e[35;1m"
8gry="\e[94m"
9rst="\e[0m"
10
11git_branch() {
12 local git_status="$(git status 2> /dev/null)"
13 local on_branch="On branch ([^${IFS}]*)"
14 local on_commit="HEAD detached at ([^${IFS}]*)"
15
16 if [[ $git_status =~ $on_branch ]]; then
17 local branch=${BASH_REMATCH[1]}
18 echo -ne "\001${cyn}\002 $branch\001${rst}\002"
19 elif [[ $git_status =~ $on_commit ]]; then
20 local commit=${BASH_REMATCH[1]}
21 echo -ne "\001${prp}\002 $commit\001${rst}\002"
22 fi
23}
24
25prompt_pwd() {
26 if [ "$PWD" == "$HOME" ]; then
27 echo ""
28 elif [ "$PWD" == "/" ]; then
29 echo "/"
30 else
31 path="$(echo $PWD | sed -e "s-$HOME/--g")"
32 echo -ne " \001${gry}\002$path/\001${rst}\002"
33 fi
34}
35
36rootornot() {
37 if [[ "$(id -u)" -eq 0 ]]; then
38 echo -ne "\001${red}\002#\001${rst}\002"
39 else
40 echo -ne "$"
41 fi
42}
43
44host() {
45 if [ "$HOSTNAME" == "localhost" ]; then
46 echo -ne "(phone)"
47 fi
48}
49
50PS1='\n$(pista)'
51
52PS2=" > "
diff --git a/bash/.bashrc b/bash/.bashrc
new file mode 100644
index 0000000..c61dc42
--- /dev/null
+++ b/bash/.bashrc
@@ -0,0 +1,144 @@
1export PATH=$PATH":$HOME/.cargo/bin"
2export PATH=$PATH":$HOME/.poetry/bin"
3export PATH=$PATH":$HOME/scripts"
4export PATH=$PATH":$HOME/bin"
5export PATH=$PATH":$HOME/.cabal/bin"
6export PATH=$PATH":$HOME/leet/flutter/bin"
7export PATH=$PATH":$HOME/.local/bin"
8export PATH=$PATH":/usr/lib/jvm/jdk-14/bin"
9export PATH=$PATH":/usr/local/texlive/2020/bin/x86_64-linux/"
10export PATH=$PATH":/usr/local/go/bin"
11
12export AIRFLOW_HOME="$HOME/.config/airflow"
13export ANDROID_HOME="$HOME/leet/ndk/android-ndk-r21c/toolchains"
14export EDITOR=/bin/nvim
15export MANPAGER="less"
16export BROWSER="/bin/firefox"
17export GPG_TTY=$(tty)
18export TERM=xterm-256color-italic
19export TZ='Asia/Kolkata'
20export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --color=bw'
21
22export GUILE_LOAD_PATH="/usr/local/share/guile/3.0:/usr/local/share/guile"
23
24export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
25
26case $- in
27 *i*) ;;
28 *) return;;
29esac
30
31# better history syncing
32shopt -s histappend
33export HISTCONTROL=ignoreboth:erasedups
34HISTSIZE=1000
35HISTFILESIZE=2000
36export PROMPT_COMMAND=''
37export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"
38
39# cool options for cool kids
40shopt -s \
41 autocd \
42 globstar \
43 checkwinsize \
44 cdspell \
45 dirspell \
46 expand_aliases \
47 dotglob \
48 gnu_errfmt \
49 histreedit \
50 nocasematch
51
52bind 'set completion-ignore-case on'
53bind 'set show-all-if-ambiguous on'
54bind 'set colored-stats on'
55bind 'set completion-display-width 1'
56bind 'TAB:menu-complete'
57bind "t: $HOME/scripts/tmux-fzf.sh"
58bind Space:magic-space
59
60if ! shopt -oq posix; then
61 if [ -f /usr/share/bash-completion/bash_completion ]; then
62 . /usr/share/bash-completion/bash_completion
63 elif [ -f /etc/bash_completion ]; then
64 . /etc/bash_completion
65 fi
66fi
67
68# local bash completions
69for cf in "$HOME"/.bash_completion.d/* ; do
70 . $cf
71done
72
73[ -f ~/.bash_aliases ] && . ~/.bash_aliases
74[ -f ~/.bash_prompt ] && . ~/.bash_prompt
75[ -f ~/.fzf.bash ] && source ~/.fzf.bash
76
77export NVM_DIR="$HOME/.nvm"
78[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
79[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
80
81# pfetch
82export PF_INFO="ascii title os kernel uptime pkgs shell "
83export PF_SEP=" "
84export PF_COL1=7
85export PF_COL2=7
86export PF_COL3=6
87export PF_ALIGN="9"
88export PF_ASCII="void"
89
90export _JAVA_AWT_WM_NONREPARENTING=1
91
92# [[ -f ~/.bash-preexec.sh ]] && source ~/.bash-preexec.sh
93# [[ -f ~/.bash_zoxide.sh ]] && source ~/.bash_zoxide.sh
94#
95# export PATH_TO_FX="$HOME/dloads/javafx/javafx-sdk-11.0.2/lib"
96# export JAVA_HOME="/usr/lib/jvm/jdk-14"
97#
98# for file in `find ~/dloads/nlp/stanford-corenlp-full-2018-10-05/ -name "*.jar"`; do
99# export CLASSPATH="$CLASSPATH:`realpath $file`"
100# done
101
102# tabtab source for packages
103# uninstall by removing these lines
104[ -f ~/.config/tabtab/__tabtab.bash ] && . ~/.config/tabtab/__tabtab.bash || true
105
106# Pista stuff
107# prompt string to display, for regular users
108export PROMPT_CHAR="$"
109export PROMPT_CHAR_COLOR="cyan"
110
111# prompt string to display, for the root user
112export PROMPT_CHAR_ROOT="#"
113export PROMPT_CHAR_ROOT_COLOR="magenta"
114
115# if SHORTEN_CWD is set to 1, `/home/nerdypepper/code` is shortened to
116# `/h/n/code`
117export SHORTEN_CWD=1
118export CWD_COLOR="white"
119
120# if EXPAND_TILDE is set to 0, `/home/nerdypepper` is shortened to `~`
121export EXPAND_TILDE=0
122
123# there are three possible states for a git repo
124# - unstaged (working tree has been modified)
125# - staged (staging area has been modified)
126# - clean (all staged changes have committed)
127
128# symbol to represent clean repo state
129export GIT_CLEAN="·"
130export GIT_CLEAN_COLOR="green"
131
132# symbol to represent unstaged repo state
133export GIT_WT_MODIFIED="×"
134export GIT_WT_MODIFIED_COLOR="red"
135
136# symbol to represent staged repo state
137export GIT_INDEX_MODIFIED="±"
138export GIT_INDEX_MODIFIED_COLOR="yellow"
139
140# if HEAD ref peels to branch
141export BRANCH_COLOR="bright black"
142
143# if HEAD ref peels to a commit (detached state)
144export COMMIT_COLOR="green"
diff --git a/cmus/.config/cmus/cmus-status-display.sh b/cmus/.config/cmus/cmus-status-display.sh
new file mode 100755
index 0000000..83dae0d
--- /dev/null
+++ b/cmus/.config/cmus/cmus-status-display.sh
@@ -0,0 +1,8 @@
1#!/usr/bin/env bash
2
3artist=$( cmus-remote -Q | grep tag\ artist\ | sed 's/tag artist //' )
4title=$( cmus-remote -Q | grep tag\ title\ | sed 's/tag title //' )
5album=$( cmus-remote -Q | grep tag\ album\ | sed 's/tag album //' )
6
7xdotool key "ctrl+space" &> /dev/null
8notify-send -u low "${title}" "${album} · ${artist}"
diff --git a/cmus/.config/cmus/nerdz.theme b/cmus/.config/cmus/nerdz.theme
new file mode 100644
index 0000000..1cc89b7
--- /dev/null
+++ b/cmus/.config/cmus/nerdz.theme
@@ -0,0 +1,57 @@
1# Directory colors
2set color_win_dir=default
3
4# Normal text
5set color_win_fg=242
6
7# Window background color.
8set color_win_bg=default
9
10# Command line color.
11set color_cmdline_bg=default
12set color_cmdline_fg=default
13
14# Color of error messages displayed on the command line.
15set color_error=lightred
16
17# Color of informational messages displayed on the command line.
18set color_info=lightyellow
19
20# Color of currently playing track.
21set color_win_cur=5
22
23# Color of the separator line between windows in view (1).
24set color_separator=254
25
26# Color of window titles (topmost line of the screen).
27set color_win_title_bg=default
28set color_win_title_fg=black
29
30# Status line color.
31set color_statusline_bg=default
32set color_statusline_fg=gray
33
34# Color of the line displaying currently playing track.
35set color_titleline_bg=0
36set color_titleline_fg=5
37
38# Color of the selected row which is also the currently playing track in active window.
39set color_win_cur_sel_bg=0
40set color_win_cur_sel_fg=15
41
42# Color of the selected row which is also the currently playing track in inactive window.
43set color_win_inactive_cur_sel_bg=0
44set color_win_inactive_cur_sel_fg=15
45
46# Color of selected row in inactive window.
47set color_win_inactive_sel_bg=0
48set color_win_inactive_sel_fg=15
49
50# Color of selected row in active window.
51set color_win_sel_bg=0
52set color_win_sel_fg=15
53
54# Command line color.
55set color_cmdline_bg=default
56set color_cmdline_fg=default
57
diff --git a/compton/.config/compton.conf b/compton/.config/compton.conf
new file mode 100644
index 0000000..764d287
--- /dev/null
+++ b/compton/.config/compton.conf
@@ -0,0 +1,90 @@
1# Shadow
2shadow = false;
3no-dnd-shadow = true;
4shadow-dock = true;
5clear-shadow = true;
6shadow-radius = 60;
7shadow-offset-x = -60;
8shadow-offset-y = -60;
9shadow-opacity = 0.20;
10corner-radius = 0;
11# shadow-red = 0.0;
12# shadow-green = 0.0;
13# shadow-blue = 0.0;
14shadow-exclude = [
15 "name = 'Notification'",
16 "class_g = 'Conky'",
17 "class_g ?= 'Notify-osd'",
18 "class_g = 'Cairo-clock'",
19 "_GTK_FRAME_EXTENTS@:c"
20];
21# shadow-exclude = "n:e:Notification";
22# shadow-exclude-reg = "x10+0+0";
23# xinerama-shadow-crop = true;
24
25# Opacity
26menu-opacity = 1;
27inactive-opacity = 1;
28active-opacity = 1;
29frame-opacity = 1;
30inactive-opacity-override = false;
31alpha-step = 0.00;
32# inactive-dim-fixed = true;
33#blur-background = true;
34#blur-kern = "7x7box";
35# blur-kern = "5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1";
36blur-background-exclude = [
37 "name = 'panel_overlay'",
38 "window_type = 'window'",
39 "window_type = 'dock'",
40 "window_type = 'desktop'",
41# "window_type = 'bar'",
42 "_GTK_FRAME_EXTENTS@:c"
43];
44# opacity-rule = [ "80:class_g = 'URxvt'" ];
45
46# Fading
47fading = true;
48#fade-delta = 10;
49fade-in-step = 0.04;
50fade-out-step = 0.04;
51# no-fading-openclose = true;
52# no-fading-destroyed-argb = true;
53fade-exclude = [ ];
54
55# Other
56backend = "xrender";
57mark-wmwin-focused = true;
58mark-ovredir-focused = true;
59# use-ewmh-active-win = true;
60detect-rounded-corners = true;
61detect-client-opacity = true;
62refresh-rate = 0;
63vsync = "none";
64dbe = false;
65paint-on-overlay = true;
66# sw-opti = true;
67# unredir-if-possible = true;
68# unredir-if-possible-delay = 5000;
69# unredir-if-possible-exclude = [ ];
70focus-exclude = [ "class_g = 'Cairo-clock'" ];
71detect-transient = true;
72detect-client-leader = true;
73invert-color-include = [ ];
74# resize-damage = 1;
75
76# GLX backend
77# glx-no-stencil = true;
78glx-copy-from-front = false;
79# glx-use-copysubbuffermesa = true;
80# glx-no-rebind-pixmap = true;
81glx-swap-method = "undefined";
82# glx-use-gpushader4 = true;
83# xrender-sync = true;
84# xrender-sync-fence = true;
85
86# Window type settings
87wintypes:
88{
89 tooltip = { fade = true; shadow = true; opacity = 0.75; focus = true; };
90};
diff --git a/dunst/.config/dunst/dunstrc b/dunst/.config/dunst/dunstrc
new file mode 100644
index 0000000..d8be41a
--- /dev/null
+++ b/dunst/.config/dunst/dunstrc
@@ -0,0 +1,67 @@
1
2# _ _____
3# | \| ||\ |(_ |
4# |_/|_|| \|__) |
5#
6
7[global]
8 font = Iosevka Nerd 11
9 allow_markup = no
10 format = "%s\n%b"
11 sort = yes
12 indicate_hidden = yes
13 alignment = right
14 bounce_freq = 0
15 show_age_threshold = 60
16 word_wrap = yes
17 ignore_newline = no
18 geometry = "300x8-20+20"
19 shrink = yes
20 transparency = 0
21 idle_threshold = 120
22 monitor = 0
23 follow = mouse
24 sticky_history = yes
25 history_length = 20
26 show_indicators = yes
27 line_height = 0
28 separator_height = 0
29 padding = 20
30 horizontal_padding = 20
31 separator_color = auto
32 startup_notification = false
33 dmenu = /usr/bin/dmenu -p dunst:
34 browser = /usr/bin/firefox -new-tab
35 icon_position = off
36 icon_folders = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/
37
38[frame]
39 width = 2
40 color = "#303030"
41
42[shortcuts]
43
44 close = ctrl+space
45
46 close_all = ctrl+shift+space
47
48 history = ctrl+grave
49
50 context = ctrl+shift+period
51
52[urgency_low]
53 background = "#000000"
54 foreground = "#eeffff"
55 timeout = 2
56
57[urgency_normal]
58 background = "#000000"
59 foreground = "#eeffff"
60 timeout = 10
61
62[urgency_critical]
63 background = "#000000"
64 foreground = "#eeffff"
65 timeout = 0
66
67
diff --git a/git/.gitconfig b/git/.gitconfig
new file mode 100644
index 0000000..aabb3cd
--- /dev/null
+++ b/git/.gitconfig
@@ -0,0 +1,36 @@
1[user]
2 email = [email protected]
3 name = Akshay
4
5[commit]
6 verbose = true
7
8[core]
9 pager = delta
10 hooksPath = "/home/np/.hooks/"
11
12[interactive]
13 diffFilter = delta --color-only
14
15[delta]
16 features = decorations labels
17 syntax-theme = none
18 zero-style = 8
19 navigate = true
20
21[delta "decorations"]
22 file-decoration-style = none
23 whitespace-error-style = 22 reverse
24 minus-style = 7 "#440000"
25 minus-emph-style = 7 bold "#990000"
26 plus-style = 7 "#003300"
27 plus-emph-style = 7 bold "#009900"
28 file-style = 7 italic
29 hunk-header-style = 7
30 hunk-header-decoration-style = 8 ul
31
32[delta "labels"]
33 file-modified-label = " MODIFIED "
34 file-removed-label = " REMOVED "
35 file-added-label = " ADDED "
36 file-renamed-label = " RENAMED "
diff --git a/nvim/.config/nvim/after/.netrwhist b/nvim/.config/nvim/after/.netrwhist
new file mode 100644
index 0000000..abf607f
--- /dev/null
+++ b/nvim/.config/nvim/after/.netrwhist
@@ -0,0 +1,4 @@
1let g:netrw_dirhistmax =10
2let g:netrw_dirhistcnt =2
3let g:netrw_dirhist_2='/home/np/dotfiles/vim/.vim/plugin'
4let g:netrw_dirhist_1='/home/np/code/rustuff/dijo/src'
diff --git a/nvim/.config/nvim/after/syntax/python.vim b/nvim/.config/nvim/after/syntax/python.vim
new file mode 100644
index 0000000..278cdc2
--- /dev/null
+++ b/nvim/.config/nvim/after/syntax/python.vim
@@ -0,0 +1,6 @@
1syntax keyword pyNiceLambda lambda conceal cchar=λ
2highlight link pyNiceLambda secondAccent
3
4highlight! link Conceal Noise
5
6setlocal conceallevel=1
diff --git a/nvim/.config/nvim/after/syntax/scheme.vim b/nvim/.config/nvim/after/syntax/scheme.vim
new file mode 100644
index 0000000..9a2972b
--- /dev/null
+++ b/nvim/.config/nvim/after/syntax/scheme.vim
@@ -0,0 +1,19 @@
1syntax keyword scmNiceLambda lambda conceal cchar=λ
2
3syntax clear schemeFunction
4
5syntax match scmNiceOperator "<=" conceal cchar=≤
6syntax match scmNiceOperator ">=" conceal cchar=≥
7
8syn region scmNiceQuote matchgroup=secondAccent start=/'[`']*/ end=/[ \t\n()\[\]";]/me=e-1
9syn region scmNiceQuote matchgroup=secondAccent start=/'['`]*"/ skip=/\\[\\"]/ end=/"/
10syn region scmNiceQuote matchgroup=secondAccent start=/'['`]*|/ skip=/\\[\\|]/ end=/|/
11syn region scmNiceQuote matchgroup=secondAccent start=/'['`]*#\?(/ end=/)/ contains=ALLBUT,schemeQuasiquote,schemeQuasiquoteForm,schemeUnquote,schemeForm,schemeDatumCommentForm,schemeImport,@schemeImportCluster,@schemeSyntaxCluster
12
13highlight link scmNiceLambda schemeSyntax
14highlight link scmNiceOperator Noise
15highlight link scmNiceQuote secondAccent
16
17highlight! link Conceal Noise
18
19setlocal conceallevel=1
diff --git a/nvim/.config/nvim/autoload/plug.vim.old b/nvim/.config/nvim/autoload/plug.vim.old
new file mode 100644
index 0000000..2571fe3
--- /dev/null
+++ b/nvim/.config/nvim/autoload/plug.vim.old
@@ -0,0 +1,2540 @@
1" vim-plug: Vim plugin manager
2" ============================
3"
4" Download plug.vim and put it in ~/.vim/autoload
5"
6" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
7" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
8"
9" Edit your .vimrc
10"
11" call plug#begin('~/.vim/plugged')
12"
13" " Make sure you use single quotes
14"
15" " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
16" Plug 'junegunn/vim-easy-align'
17"
18" " Any valid git URL is allowed
19" Plug 'https://github.com/junegunn/vim-github-dashboard.git'
20"
21" " Multiple Plug commands can be written in a single line using | separators
22" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
23"
24" " On-demand loading
25" Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
26" Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
27"
28" " Using a non-master branch
29" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
30"
31" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
32" Plug 'fatih/vim-go', { 'tag': '*' }
33"
34" " Plugin options
35" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }
36"
37" " Plugin outside ~/.vim/plugged with post-update hook
38" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
39"
40" " Unmanaged plugin (manually installed and updated)
41" Plug '~/my-prototype-plugin'
42"
43" " Initialize plugin system
44" call plug#end()
45"
46" Then reload .vimrc and :PlugInstall to install plugins.
47"
48" Plug options:
49"
50"| Option | Description |
51"| ----------------------- | ------------------------------------------------ |
52"| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use |
53"| `rtp` | Subdirectory that contains Vim plugin |
54"| `dir` | Custom directory for the plugin |
55"| `as` | Use different name for the plugin |
56"| `do` | Post-update hook (string or funcref) |
57"| `on` | On-demand loading: Commands or `<Plug>`-mappings |
58"| `for` | On-demand loading: File types |
59"| `frozen` | Do not update unless explicitly specified |
60"
61" More information: https://github.com/junegunn/vim-plug
62"
63"
64" Copyright (c) 2017 Junegunn Choi
65"
66" MIT License
67"
68" Permission is hereby granted, free of charge, to any person obtaining
69" a copy of this software and associated documentation files (the
70" "Software"), to deal in the Software without restriction, including
71" without limitation the rights to use, copy, modify, merge, publish,
72" distribute, sublicense, and/or sell copies of the Software, and to
73" permit persons to whom the Software is furnished to do so, subject to
74" the following conditions:
75"
76" The above copyright notice and this permission notice shall be
77" included in all copies or substantial portions of the Software.
78"
79" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
80" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
81" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
82" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
83" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
84" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
85" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
86
87if exists('g:loaded_plug')
88 finish
89endif
90let g:loaded_plug = 1
91
92let s:cpo_save = &cpo
93set cpo&vim
94
95let s:plug_src = 'https://github.com/junegunn/vim-plug.git'
96let s:plug_tab = get(s:, 'plug_tab', -1)
97let s:plug_buf = get(s:, 'plug_buf', -1)
98let s:mac_gui = has('gui_macvim') && has('gui_running')
99let s:is_win = has('win32')
100let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win)
101let s:vim8 = has('patch-8.0.0039') && exists('*job_start')
102let s:me = resolve(expand('<sfile>:p'))
103let s:base_spec = { 'branch': 'master', 'frozen': 0 }
104let s:TYPE = {
105\ 'string': type(''),
106\ 'list': type([]),
107\ 'dict': type({}),
108\ 'funcref': type(function('call'))
109\ }
110let s:loaded = get(s:, 'loaded', {})
111let s:triggers = get(s:, 'triggers', {})
112
113function! plug#begin(...)
114 if a:0 > 0
115 let s:plug_home_org = a:1
116 let home = s:path(fnamemodify(expand(a:1), ':p'))
117 elseif exists('g:plug_home')
118 let home = s:path(g:plug_home)
119 elseif !empty(&rtp)
120 let home = s:path(split(&rtp, ',')[0]) . '/plugged'
121 else
122 return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.')
123 endif
124 if fnamemodify(home, ':t') ==# 'plugin' && fnamemodify(home, ':h') ==# s:first_rtp
125 return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.')
126 endif
127
128 let g:plug_home = home
129 let g:plugs = {}
130 let g:plugs_order = []
131 let s:triggers = {}
132
133 call s:define_commands()
134 return 1
135endfunction
136
137function! s:define_commands()
138 command! -nargs=+ -bar Plug call plug#(<args>)
139 if !executable('git')
140 return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.')
141 endif
142 command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(<bang>0, [<f-args>])
143 command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(<bang>0, [<f-args>])
144 command! -nargs=0 -bar -bang PlugClean call s:clean(<bang>0)
145 command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif
146 command! -nargs=0 -bar PlugStatus call s:status()
147 command! -nargs=0 -bar PlugDiff call s:diff()
148 command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(<bang>0, <f-args>)
149endfunction
150
151function! s:to_a(v)
152 return type(a:v) == s:TYPE.list ? a:v : [a:v]
153endfunction
154
155function! s:to_s(v)
156 return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n"
157endfunction
158
159function! s:glob(from, pattern)
160 return s:lines(globpath(a:from, a:pattern))
161endfunction
162
163function! s:source(from, ...)
164 let found = 0
165 for pattern in a:000
166 for vim in s:glob(a:from, pattern)
167 execute 'source' s:esc(vim)
168 let found = 1
169 endfor
170 endfor
171 return found
172endfunction
173
174function! s:assoc(dict, key, val)
175 let a:dict[a:key] = add(get(a:dict, a:key, []), a:val)
176endfunction
177
178function! s:ask(message, ...)
179 call inputsave()
180 echohl WarningMsg
181 let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) '))
182 echohl None
183 call inputrestore()
184 echo "\r"
185 return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0
186endfunction
187
188function! s:ask_no_interrupt(...)
189 try
190 return call('s:ask', a:000)
191 catch
192 return 0
193 endtry
194endfunction
195
196function! s:lazy(plug, opt)
197 return has_key(a:plug, a:opt) &&
198 \ (empty(s:to_a(a:plug[a:opt])) ||
199 \ !isdirectory(a:plug.dir) ||
200 \ len(s:glob(s:rtp(a:plug), 'plugin')) ||
201 \ len(s:glob(s:rtp(a:plug), 'after/plugin')))
202endfunction
203
204function! plug#end()
205 if !exists('g:plugs')
206 return s:err('Call plug#begin() first')
207 endif
208
209 if exists('#PlugLOD')
210 augroup PlugLOD
211 autocmd!
212 augroup END
213 augroup! PlugLOD
214 endif
215 let lod = { 'ft': {}, 'map': {}, 'cmd': {} }
216
217 if exists('g:did_load_filetypes')
218 filetype off
219 endif
220 for name in g:plugs_order
221 if !has_key(g:plugs, name)
222 continue
223 endif
224 let plug = g:plugs[name]
225 if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for')
226 let s:loaded[name] = 1
227 continue
228 endif
229
230 if has_key(plug, 'on')
231 let s:triggers[name] = { 'map': [], 'cmd': [] }
232 for cmd in s:to_a(plug.on)
233 if cmd =~? '^<Plug>.\+'
234 if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i'))
235 call s:assoc(lod.map, cmd, name)
236 endif
237 call add(s:triggers[name].map, cmd)
238 elseif cmd =~# '^[A-Z]'
239 let cmd = substitute(cmd, '!*$', '', '')
240 if exists(':'.cmd) != 2
241 call s:assoc(lod.cmd, cmd, name)
242 endif
243 call add(s:triggers[name].cmd, cmd)
244 else
245 call s:err('Invalid `on` option: '.cmd.
246 \ '. Should start with an uppercase letter or `<Plug>`.')
247 endif
248 endfor
249 endif
250
251 if has_key(plug, 'for')
252 let types = s:to_a(plug.for)
253 if !empty(types)
254 augroup filetypedetect
255 call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim')
256 augroup END
257 endif
258 for type in types
259 call s:assoc(lod.ft, type, name)
260 endfor
261 endif
262 endfor
263
264 for [cmd, names] in items(lod.cmd)
265 execute printf(
266 \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "<bang>", <line1>, <line2>, <q-args>, %s)',
267 \ cmd, string(cmd), string(names))
268 endfor
269
270 for [map, names] in items(lod.map)
271 for [mode, map_prefix, key_prefix] in
272 \ [['i', '<C-O>', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']]
273 execute printf(
274 \ '%snoremap <silent> %s %s:<C-U>call <SID>lod_map(%s, %s, %s, "%s")<CR>',
275 \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix)
276 endfor
277 endfor
278
279 for [ft, names] in items(lod.ft)
280 augroup PlugLOD
281 execute printf('autocmd FileType %s call <SID>lod_ft(%s, %s)',
282 \ ft, string(ft), string(names))
283 augroup END
284 endfor
285
286 call s:reorg_rtp()
287 filetype plugin indent on
288 if has('vim_starting')
289 if has('syntax') && !exists('g:syntax_on')
290 syntax enable
291 end
292 else
293 call s:reload_plugins()
294 endif
295endfunction
296
297function! s:loaded_names()
298 return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)')
299endfunction
300
301function! s:load_plugin(spec)
302 call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim')
303endfunction
304
305function! s:reload_plugins()
306 for name in s:loaded_names()
307 call s:load_plugin(g:plugs[name])
308 endfor
309endfunction
310
311function! s:trim(str)
312 return substitute(a:str, '[\/]\+$', '', '')
313endfunction
314
315function! s:version_requirement(val, min)
316 for idx in range(0, len(a:min) - 1)
317 let v = get(a:val, idx, 0)
318 if v < a:min[idx] | return 0
319 elseif v > a:min[idx] | return 1
320 endif
321 endfor
322 return 1
323endfunction
324
325function! s:git_version_requirement(...)
326 if !exists('s:git_version')
327 let s:git_version = map(split(split(s:system('git --version'))[2], '\.'), 'str2nr(v:val)')
328 endif
329 return s:version_requirement(s:git_version, a:000)
330endfunction
331
332function! s:progress_opt(base)
333 return a:base && !s:is_win &&
334 \ s:git_version_requirement(1, 7, 1) ? '--progress' : ''
335endfunction
336
337if s:is_win
338 function! s:rtp(spec)
339 return s:path(a:spec.dir . get(a:spec, 'rtp', ''))
340 endfunction
341
342 function! s:path(path)
343 return s:trim(substitute(a:path, '/', '\', 'g'))
344 endfunction
345
346 function! s:dirpath(path)
347 return s:path(a:path) . '\'
348 endfunction
349
350 function! s:is_local_plug(repo)
351 return a:repo =~? '^[a-z]:\|^[%~]'
352 endfunction
353
354 " Copied from fzf
355 function! s:wrap_cmds(cmds)
356 return map([
357 \ '@echo off',
358 \ 'setlocal enabledelayedexpansion',
359 \ 'for /f "tokens=*" %%a in (''chcp'') do for %%b in (%%a) do set origchcp=%%b',
360 \ 'chcp 65001 > nul'
361 \ ]
362 \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds])
363 \ + ['chcp !origchcp! > nul', 'endlocal'],
364 \ 'v:val."\r"')
365 endfunction
366
367 function! s:batchfile(cmd)
368 let batchfile = tempname().'.bat'
369 call writefile(s:wrap_cmds(a:cmd), batchfile)
370 let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 1})
371 if &shell =~# 'powershell\.exe$'
372 let cmd = '& ' . cmd
373 endif
374 return [batchfile, cmd]
375 endfunction
376else
377 function! s:rtp(spec)
378 return s:dirpath(a:spec.dir . get(a:spec, 'rtp', ''))
379 endfunction
380
381 function! s:path(path)
382 return s:trim(a:path)
383 endfunction
384
385 function! s:dirpath(path)
386 return substitute(a:path, '[/\\]*$', '/', '')
387 endfunction
388
389 function! s:is_local_plug(repo)
390 return a:repo[0] =~ '[/$~]'
391 endfunction
392endif
393
394function! s:err(msg)
395 echohl ErrorMsg
396 echom '[vim-plug] '.a:msg
397 echohl None
398endfunction
399
400function! s:warn(cmd, msg)
401 echohl WarningMsg
402 execute a:cmd 'a:msg'
403 echohl None
404endfunction
405
406function! s:esc(path)
407 return escape(a:path, ' ')
408endfunction
409
410function! s:escrtp(path)
411 return escape(a:path, ' ,')
412endfunction
413
414function! s:remove_rtp()
415 for name in s:loaded_names()
416 let rtp = s:rtp(g:plugs[name])
417 execute 'set rtp-='.s:escrtp(rtp)
418 let after = globpath(rtp, 'after')
419 if isdirectory(after)
420 execute 'set rtp-='.s:escrtp(after)
421 endif
422 endfor
423endfunction
424
425function! s:reorg_rtp()
426 if !empty(s:first_rtp)
427 execute 'set rtp-='.s:first_rtp
428 execute 'set rtp-='.s:last_rtp
429 endif
430
431 " &rtp is modified from outside
432 if exists('s:prtp') && s:prtp !=# &rtp
433 call s:remove_rtp()
434 unlet! s:middle
435 endif
436
437 let s:middle = get(s:, 'middle', &rtp)
438 let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])')
439 let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)')
440 let rtp = join(map(rtps, 'escape(v:val, ",")'), ',')
441 \ . ','.s:middle.','
442 \ . join(map(afters, 'escape(v:val, ",")'), ',')
443 let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g')
444 let s:prtp = &rtp
445
446 if !empty(s:first_rtp)
447 execute 'set rtp^='.s:first_rtp
448 execute 'set rtp+='.s:last_rtp
449 endif
450endfunction
451
452function! s:doautocmd(...)
453 if exists('#'.join(a:000, '#'))
454 execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '<nomodeline>' : '') join(a:000)
455 endif
456endfunction
457
458function! s:dobufread(names)
459 for name in a:names
460 let path = s:rtp(g:plugs[name])
461 for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin']
462 if len(finddir(dir, path))
463 if exists('#BufRead')
464 doautocmd BufRead
465 endif
466 return
467 endif
468 endfor
469 endfor
470endfunction
471
472function! plug#load(...)
473 if a:0 == 0
474 return s:err('Argument missing: plugin name(s) required')
475 endif
476 if !exists('g:plugs')
477 return s:err('plug#begin was not called')
478 endif
479 let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000
480 let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)')
481 if !empty(unknowns)
482 let s = len(unknowns) > 1 ? 's' : ''
483 return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', ')))
484 end
485 let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)')
486 if !empty(unloaded)
487 for name in unloaded
488 call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
489 endfor
490 call s:dobufread(unloaded)
491 return 1
492 end
493 return 0
494endfunction
495
496function! s:remove_triggers(name)
497 if !has_key(s:triggers, a:name)
498 return
499 endif
500 for cmd in s:triggers[a:name].cmd
501 execute 'silent! delc' cmd
502 endfor
503 for map in s:triggers[a:name].map
504 execute 'silent! unmap' map
505 execute 'silent! iunmap' map
506 endfor
507 call remove(s:triggers, a:name)
508endfunction
509
510function! s:lod(names, types, ...)
511 for name in a:names
512 call s:remove_triggers(name)
513 let s:loaded[name] = 1
514 endfor
515 call s:reorg_rtp()
516
517 for name in a:names
518 let rtp = s:rtp(g:plugs[name])
519 for dir in a:types
520 call s:source(rtp, dir.'/**/*.vim')
521 endfor
522 if a:0
523 if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2))
524 execute 'runtime' a:1
525 endif
526 call s:source(rtp, a:2)
527 endif
528 call s:doautocmd('User', name)
529 endfor
530endfunction
531
532function! s:lod_ft(pat, names)
533 let syn = 'syntax/'.a:pat.'.vim'
534 call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn)
535 execute 'autocmd! PlugLOD FileType' a:pat
536 call s:doautocmd('filetypeplugin', 'FileType')
537 call s:doautocmd('filetypeindent', 'FileType')
538endfunction
539
540function! s:lod_cmd(cmd, bang, l1, l2, args, names)
541 call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
542 call s:dobufread(a:names)
543 execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args)
544endfunction
545
546function! s:lod_map(map, names, with_prefix, prefix)
547 call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
548 call s:dobufread(a:names)
549 let extra = ''
550 while 1
551 let c = getchar(0)
552 if c == 0
553 break
554 endif
555 let extra .= nr2char(c)
556 endwhile
557
558 if a:with_prefix
559 let prefix = v:count ? v:count : ''
560 let prefix .= '"'.v:register.a:prefix
561 if mode(1) == 'no'
562 if v:operator == 'c'
563 let prefix = "\<esc>" . prefix
564 endif
565 let prefix .= v:operator
566 endif
567 call feedkeys(prefix, 'n')
568 endif
569 call feedkeys(substitute(a:map, '^<Plug>', "\<Plug>", '') . extra)
570endfunction
571
572function! plug#(repo, ...)
573 if a:0 > 1
574 return s:err('Invalid number of arguments (1..2)')
575 endif
576
577 try
578 let repo = s:trim(a:repo)
579 let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec
580 let name = get(opts, 'as', fnamemodify(repo, ':t:s?\.git$??'))
581 let spec = extend(s:infer_properties(name, repo), opts)
582 if !has_key(g:plugs, name)
583 call add(g:plugs_order, name)
584 endif
585 let g:plugs[name] = spec
586 let s:loaded[name] = get(s:loaded, name, 0)
587 catch
588 return s:err(v:exception)
589 endtry
590endfunction
591
592function! s:parse_options(arg)
593 let opts = copy(s:base_spec)
594 let type = type(a:arg)
595 if type == s:TYPE.string
596 let opts.tag = a:arg
597 elseif type == s:TYPE.dict
598 call extend(opts, a:arg)
599 if has_key(opts, 'dir')
600 let opts.dir = s:dirpath(expand(opts.dir))
601 endif
602 else
603 throw 'Invalid argument type (expected: string or dictionary)'
604 endif
605 return opts
606endfunction
607
608function! s:infer_properties(name, repo)
609 let repo = a:repo
610 if s:is_local_plug(repo)
611 return { 'dir': s:dirpath(expand(repo)) }
612 else
613 if repo =~ ':'
614 let uri = repo
615 else
616 if repo !~ '/'
617 throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo)
618 endif
619 let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git')
620 let uri = printf(fmt, repo)
621 endif
622 return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri }
623 endif
624endfunction
625
626function! s:install(force, names)
627 call s:update_impl(0, a:force, a:names)
628endfunction
629
630function! s:update(force, names)
631 call s:update_impl(1, a:force, a:names)
632endfunction
633
634function! plug#helptags()
635 if !exists('g:plugs')
636 return s:err('plug#begin was not called')
637 endif
638 for spec in values(g:plugs)
639 let docd = join([s:rtp(spec), 'doc'], '/')
640 if isdirectory(docd)
641 silent! execute 'helptags' s:esc(docd)
642 endif
643 endfor
644 return 1
645endfunction
646
647function! s:syntax()
648 syntax clear
649 syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber
650 syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX
651 syn match plugNumber /[0-9]\+[0-9.]*/ contained
652 syn match plugBracket /[[\]]/ contained
653 syn match plugX /x/ contained
654 syn match plugDash /^-/
655 syn match plugPlus /^+/
656 syn match plugStar /^*/
657 syn match plugMessage /\(^- \)\@<=.*/
658 syn match plugName /\(^- \)\@<=[^ ]*:/
659 syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/
660 syn match plugTag /(tag: [^)]\+)/
661 syn match plugInstall /\(^+ \)\@<=[^:]*/
662 syn match plugUpdate /\(^* \)\@<=[^:]*/
663 syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag
664 syn match plugEdge /^ \X\+$/
665 syn match plugEdge /^ \X*/ contained nextgroup=plugSha
666 syn match plugSha /[0-9a-f]\{7,9}/ contained
667 syn match plugRelDate /([^)]*)$/ contained
668 syn match plugNotLoaded /(not loaded)$/
669 syn match plugError /^x.*/
670 syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/
671 syn match plugH2 /^.*:\n-\+$/
672 syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean
673 hi def link plug1 Title
674 hi def link plug2 Repeat
675 hi def link plugH2 Type
676 hi def link plugX Exception
677 hi def link plugBracket Structure
678 hi def link plugNumber Number
679
680 hi def link plugDash Special
681 hi def link plugPlus Constant
682 hi def link plugStar Boolean
683
684 hi def link plugMessage Function
685 hi def link plugName Label
686 hi def link plugInstall Function
687 hi def link plugUpdate Type
688
689 hi def link plugError Error
690 hi def link plugDeleted Ignore
691 hi def link plugRelDate Comment
692 hi def link plugEdge PreProc
693 hi def link plugSha Identifier
694 hi def link plugTag Constant
695
696 hi def link plugNotLoaded Comment
697endfunction
698
699function! s:lpad(str, len)
700 return a:str . repeat(' ', a:len - len(a:str))
701endfunction
702
703function! s:lines(msg)
704 return split(a:msg, "[\r\n]")
705endfunction
706
707function! s:lastline(msg)
708 return get(s:lines(a:msg), -1, '')
709endfunction
710
711function! s:new_window()
712 execute get(g:, 'plug_window', 'vertical topleft new')
713endfunction
714
715function! s:plug_window_exists()
716 let buflist = tabpagebuflist(s:plug_tab)
717 return !empty(buflist) && index(buflist, s:plug_buf) >= 0
718endfunction
719
720function! s:switch_in()
721 if !s:plug_window_exists()
722 return 0
723 endif
724
725 if winbufnr(0) != s:plug_buf
726 let s:pos = [tabpagenr(), winnr(), winsaveview()]
727 execute 'normal!' s:plug_tab.'gt'
728 let winnr = bufwinnr(s:plug_buf)
729 execute winnr.'wincmd w'
730 call add(s:pos, winsaveview())
731 else
732 let s:pos = [winsaveview()]
733 endif
734
735 setlocal modifiable
736 return 1
737endfunction
738
739function! s:switch_out(...)
740 call winrestview(s:pos[-1])
741 setlocal nomodifiable
742 if a:0 > 0
743 execute a:1
744 endif
745
746 if len(s:pos) > 1
747 execute 'normal!' s:pos[0].'gt'
748 execute s:pos[1] 'wincmd w'
749 call winrestview(s:pos[2])
750 endif
751endfunction
752
753function! s:finish_bindings()
754 nnoremap <silent> <buffer> R :call <SID>retry()<cr>
755 nnoremap <silent> <buffer> D :PlugDiff<cr>
756 nnoremap <silent> <buffer> S :PlugStatus<cr>
757 nnoremap <silent> <buffer> U :call <SID>status_update()<cr>
758 xnoremap <silent> <buffer> U :call <SID>status_update()<cr>
759 nnoremap <silent> <buffer> ]] :silent! call <SID>section('')<cr>
760 nnoremap <silent> <buffer> [[ :silent! call <SID>section('b')<cr>
761endfunction
762
763function! s:prepare(...)
764 if empty(getcwd())
765 throw 'Invalid current working directory. Cannot proceed.'
766 endif
767
768 for evar in ['$GIT_DIR', '$GIT_WORK_TREE']
769 if exists(evar)
770 throw evar.' detected. Cannot proceed.'
771 endif
772 endfor
773
774 call s:job_abort()
775 if s:switch_in()
776 if b:plug_preview == 1
777 pc
778 endif
779 enew
780 else
781 call s:new_window()
782 endif
783
784 nnoremap <silent> <buffer> q :if b:plug_preview==1<bar>pc<bar>endif<bar>bd<cr>
785 if a:0 == 0
786 call s:finish_bindings()
787 endif
788 let b:plug_preview = -1
789 let s:plug_tab = tabpagenr()
790 let s:plug_buf = winbufnr(0)
791 call s:assign_name()
792
793 for k in ['<cr>', 'L', 'o', 'X', 'd', 'dd']
794 execute 'silent! unmap <buffer>' k
795 endfor
796 setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell
797 if exists('+colorcolumn')
798 setlocal colorcolumn=
799 endif
800 setf vim-plug
801 if exists('g:syntax_on')
802 call s:syntax()
803 endif
804endfunction
805
806function! s:assign_name()
807 " Assign buffer name
808 let prefix = '[Plugins]'
809 let name = prefix
810 let idx = 2
811 while bufexists(name)
812 let name = printf('%s (%s)', prefix, idx)
813 let idx = idx + 1
814 endwhile
815 silent! execute 'f' fnameescape(name)
816endfunction
817
818function! s:chsh(swap)
819 let prev = [&shell, &shellcmdflag, &shellredir]
820 if !s:is_win && a:swap
821 set shell=sh shellredir=>%s\ 2>&1
822 endif
823 return prev
824endfunction
825
826function! s:bang(cmd, ...)
827 try
828 let [sh, shellcmdflag, shrd] = s:chsh(a:0)
829 " FIXME: Escaping is incomplete. We could use shellescape with eval,
830 " but it won't work on Windows.
831 let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd
832 if s:is_win
833 let [batchfile, cmd] = s:batchfile(cmd)
834 endif
835 let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%')
836 execute "normal! :execute g:_plug_bang\<cr>\<cr>"
837 finally
838 unlet g:_plug_bang
839 let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
840 if s:is_win
841 call delete(batchfile)
842 endif
843 endtry
844 return v:shell_error ? 'Exit status: ' . v:shell_error : ''
845endfunction
846
847function! s:regress_bar()
848 let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '')
849 call s:progress_bar(2, bar, len(bar))
850endfunction
851
852function! s:is_updated(dir)
853 return !empty(s:system_chomp('git log --pretty=format:"%h" "HEAD...HEAD@{1}"', a:dir))
854endfunction
855
856function! s:do(pull, force, todo)
857 for [name, spec] in items(a:todo)
858 if !isdirectory(spec.dir)
859 continue
860 endif
861 let installed = has_key(s:update.new, name)
862 let updated = installed ? 0 :
863 \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir))
864 if a:force || installed || updated
865 execute 'cd' s:esc(spec.dir)
866 call append(3, '- Post-update hook for '. name .' ... ')
867 let error = ''
868 let type = type(spec.do)
869 if type == s:TYPE.string
870 if spec.do[0] == ':'
871 if !get(s:loaded, name, 0)
872 let s:loaded[name] = 1
873 call s:reorg_rtp()
874 endif
875 call s:load_plugin(spec)
876 try
877 execute spec.do[1:]
878 catch
879 let error = v:exception
880 endtry
881 if !s:plug_window_exists()
882 cd -
883 throw 'Warning: vim-plug was terminated by the post-update hook of '.name
884 endif
885 else
886 let error = s:bang(spec.do)
887 endif
888 elseif type == s:TYPE.funcref
889 try
890 let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged')
891 call spec.do({ 'name': name, 'status': status, 'force': a:force })
892 catch
893 let error = v:exception
894 endtry
895 else
896 let error = 'Invalid hook type'
897 endif
898 call s:switch_in()
899 call setline(4, empty(error) ? (getline(4) . 'OK')
900 \ : ('x' . getline(4)[1:] . error))
901 if !empty(error)
902 call add(s:update.errors, name)
903 call s:regress_bar()
904 endif
905 cd -
906 endif
907 endfor
908endfunction
909
910function! s:hash_match(a, b)
911 return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0
912endfunction
913
914function! s:checkout(spec)
915 let sha = a:spec.commit
916 let output = s:system('git rev-parse HEAD', a:spec.dir)
917 if !v:shell_error && !s:hash_match(sha, s:lines(output)[0])
918 let output = s:system(
919 \ 'git fetch --depth 999999 && git checkout '.s:esc(sha).' --', a:spec.dir)
920 endif
921 return output
922endfunction
923
924function! s:finish(pull)
925 let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen'))
926 if new_frozen
927 let s = new_frozen > 1 ? 's' : ''
928 call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s))
929 endif
930 call append(3, '- Finishing ... ') | 4
931 redraw
932 call plug#helptags()
933 call plug#end()
934 call setline(4, getline(4) . 'Done!')
935 redraw
936 let msgs = []
937 if !empty(s:update.errors)
938 call add(msgs, "Press 'R' to retry.")
939 endif
940 if a:pull && len(s:update.new) < len(filter(getline(5, '$'),
941 \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'"))
942 call add(msgs, "Press 'D' to see the updated changes.")
943 endif
944 echo join(msgs, ' ')
945 call s:finish_bindings()
946endfunction
947
948function! s:retry()
949 if empty(s:update.errors)
950 return
951 endif
952 echo
953 call s:update_impl(s:update.pull, s:update.force,
954 \ extend(copy(s:update.errors), [s:update.threads]))
955endfunction
956
957function! s:is_managed(name)
958 return has_key(g:plugs[a:name], 'uri')
959endfunction
960
961function! s:names(...)
962 return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)'))
963endfunction
964
965function! s:check_ruby()
966 silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'")
967 if !exists('g:plug_ruby')
968 redraw!
969 return s:warn('echom', 'Warning: Ruby interface is broken')
970 endif
971 let ruby_version = split(g:plug_ruby, '\.')
972 unlet g:plug_ruby
973 return s:version_requirement(ruby_version, [1, 8, 7])
974endfunction
975
976function! s:update_impl(pull, force, args) abort
977 let sync = index(a:args, '--sync') >= 0 || has('vim_starting')
978 let args = filter(copy(a:args), 'v:val != "--sync"')
979 let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ?
980 \ remove(args, -1) : get(g:, 'plug_threads', 16)
981
982 let managed = filter(copy(g:plugs), 's:is_managed(v:key)')
983 let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') :
984 \ filter(managed, 'index(args, v:key) >= 0')
985
986 if empty(todo)
987 return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install'))
988 endif
989
990 if !s:is_win && s:git_version_requirement(2, 3)
991 let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : ''
992 let $GIT_TERMINAL_PROMPT = 0
993 for plug in values(todo)
994 let plug.uri = substitute(plug.uri,
995 \ '^https://git::@github\.com', 'https://github.com', '')
996 endfor
997 endif
998
999 if !isdirectory(g:plug_home)
1000 try
1001 call mkdir(g:plug_home, 'p')
1002 catch
1003 return s:err(printf('Invalid plug directory: %s. '.
1004 \ 'Try to call plug#begin with a valid directory', g:plug_home))
1005 endtry
1006 endif
1007
1008 if has('nvim') && !exists('*jobwait') && threads > 1
1009 call s:warn('echom', '[vim-plug] Update Neovim for parallel installer')
1010 endif
1011
1012 let use_job = s:nvim || s:vim8
1013 let python = (has('python') || has('python3')) && !use_job
1014 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()
1015
1016 let s:update = {
1017 \ 'start': reltime(),
1018 \ 'all': todo,
1019 \ 'todo': copy(todo),
1020 \ 'errors': [],
1021 \ 'pull': a:pull,
1022 \ 'force': a:force,
1023 \ 'new': {},
1024 \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1,
1025 \ 'bar': '',
1026 \ 'fin': 0
1027 \ }
1028
1029 call s:prepare(1)
1030 call append(0, ['', ''])
1031 normal! 2G
1032 silent! redraw
1033
1034 let s:clone_opt = get(g:, 'plug_shallow', 1) ?
1035 \ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : ''
1036
1037 if has('win32unix')
1038 let s:clone_opt .= ' -c core.eol=lf -c core.autocrlf=input'
1039 endif
1040
1041 let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : ''
1042
1043 " Python version requirement (>= 2.7)
1044 if python && !has('python3') && !ruby && !use_job && s:update.threads > 1
1045 redir => pyv
1046 silent python import platform; print platform.python_version()
1047 redir END
1048 let python = s:version_requirement(
1049 \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6])
1050 endif
1051
1052 if (python || ruby) && s:update.threads > 1
1053 try
1054 let imd = &imd
1055 if s:mac_gui
1056 set noimd
1057 endif
1058 if ruby
1059 call s:update_ruby()
1060 else
1061 call s:update_python()
1062 endif
1063 catch
1064 let lines = getline(4, '$')
1065 let printed = {}
1066 silent! 4,$d _
1067 for line in lines
1068 let name = s:extract_name(line, '.', '')
1069 if empty(name) || !has_key(printed, name)
1070 call append('$', line)
1071 if !empty(name)
1072 let printed[name] = 1
1073 if line[0] == 'x' && index(s:update.errors, name) < 0
1074 call add(s:update.errors, name)
1075 end
1076 endif
1077 endif
1078 endfor
1079 finally
1080 let &imd = imd
1081 call s:update_finish()
1082 endtry
1083 else
1084 call s:update_vim()
1085 while use_job && sync
1086 sleep 100m
1087 if s:update.fin
1088 break
1089 endif
1090 endwhile
1091 endif
1092endfunction
1093
1094function! s:log4(name, msg)
1095 call setline(4, printf('- %s (%s)', a:msg, a:name))
1096 redraw
1097endfunction
1098
1099function! s:update_finish()
1100 if exists('s:git_terminal_prompt')
1101 let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt
1102 endif
1103 if s:switch_in()
1104 call append(3, '- Updating ...') | 4
1105 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))'))
1106 let [pos, _] = s:logpos(name)
1107 if !pos
1108 continue
1109 endif
1110 if has_key(spec, 'commit')
1111 call s:log4(name, 'Checking out '.spec.commit)
1112 let out = s:checkout(spec)
1113 elseif has_key(spec, 'tag')
1114 let tag = spec.tag
1115 if tag =~ '\*'
1116 let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir))
1117 if !v:shell_error && !empty(tags)
1118 let tag = tags[0]
1119 call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag))
1120 call append(3, '')
1121 endif
1122 endif
1123 call s:log4(name, 'Checking out '.tag)
1124 let out = s:system('git checkout -q '.s:esc(tag).' -- 2>&1', spec.dir)
1125 else
1126 let branch = s:esc(get(spec, 'branch', 'master'))
1127 call s:log4(name, 'Merging origin/'.branch)
1128 let out = s:system('git checkout -q '.branch.' -- 2>&1'
1129 \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only origin/'.branch.' 2>&1')), spec.dir)
1130 endif
1131 if !v:shell_error && filereadable(spec.dir.'/.gitmodules') &&
1132 \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir))
1133 call s:log4(name, 'Updating submodules. This may take a while.')
1134 let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir)
1135 endif
1136 let msg = s:format_message(v:shell_error ? 'x': '-', name, out)
1137 if v:shell_error
1138 call add(s:update.errors, name)
1139 call s:regress_bar()
1140 silent execute pos 'd _'
1141 call append(4, msg) | 4
1142 elseif !empty(out)
1143 call setline(pos, msg[0])
1144 endif
1145 redraw
1146 endfor
1147 silent 4 d _
1148 try
1149 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")'))
1150 catch
1151 call s:warn('echom', v:exception)
1152 call s:warn('echo', '')
1153 return
1154 endtry
1155 call s:finish(s:update.pull)
1156 call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.')
1157 call s:switch_out('normal! gg')
1158 endif
1159endfunction
1160
1161function! s:job_abort()
1162 if (!s:nvim && !s:vim8) || !exists('s:jobs')
1163 return
1164 endif
1165
1166 for [name, j] in items(s:jobs)
1167 if s:nvim
1168 silent! call jobstop(j.jobid)
1169 elseif s:vim8
1170 silent! call job_stop(j.jobid)
1171 endif
1172 if j.new
1173 call s:system('rm -rf ' . plug#shellescape(g:plugs[name].dir))
1174 endif
1175 endfor
1176 let s:jobs = {}
1177endfunction
1178
1179function! s:last_non_empty_line(lines)
1180 let len = len(a:lines)
1181 for idx in range(len)
1182 let line = a:lines[len-idx-1]
1183 if !empty(line)
1184 return line
1185 endif
1186 endfor
1187 return ''
1188endfunction
1189
1190function! s:job_out_cb(self, data) abort
1191 let self = a:self
1192 let data = remove(self.lines, -1) . a:data
1193 let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]')
1194 call extend(self.lines, lines)
1195 " To reduce the number of buffer updates
1196 let self.tick = get(self, 'tick', -1) + 1
1197 if !self.running || self.tick % len(s:jobs) == 0
1198 let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-')
1199 let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines)
1200 call s:log(bullet, self.name, result)
1201 endif
1202endfunction
1203
1204function! s:job_exit_cb(self, data) abort
1205 let a:self.running = 0
1206 let a:self.error = a:data != 0
1207 call s:reap(a:self.name)
1208 call s:tick()
1209endfunction
1210
1211function! s:job_cb(fn, job, ch, data)
1212 if !s:plug_window_exists() " plug window closed
1213 return s:job_abort()
1214 endif
1215 call call(a:fn, [a:job, a:data])
1216endfunction
1217
1218function! s:nvim_cb(job_id, data, event) dict abort
1219 return a:event == 'stdout' ?
1220 \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) :
1221 \ s:job_cb('s:job_exit_cb', self, 0, a:data)
1222endfunction
1223
1224function! s:spawn(name, cmd, opts)
1225 let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''],
1226 \ 'new': get(a:opts, 'new', 0) }
1227 let s:jobs[a:name] = job
1228 let cmd = has_key(a:opts, 'dir') ? s:with_cd(a:cmd, a:opts.dir, 0) : a:cmd
1229 let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd]
1230
1231 if s:nvim
1232 call extend(job, {
1233 \ 'on_stdout': function('s:nvim_cb'),
1234 \ 'on_exit': function('s:nvim_cb'),
1235 \ })
1236 let jid = jobstart(argv, job)
1237 if jid > 0
1238 let job.jobid = jid
1239 else
1240 let job.running = 0
1241 let job.error = 1
1242 let job.lines = [jid < 0 ? argv[0].' is not executable' :
1243 \ 'Invalid arguments (or job table is full)']
1244 endif
1245 elseif s:vim8
1246 let jid = job_start(s:is_win ? join(argv, ' ') : argv, {
1247 \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]),
1248 \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]),
1249 \ 'out_mode': 'raw'
1250 \})
1251 if job_status(jid) == 'run'
1252 let job.jobid = jid
1253 else
1254 let job.running = 0
1255 let job.error = 1
1256 let job.lines = ['Failed to start job']
1257 endif
1258 else
1259 let job.lines = s:lines(call('s:system', [cmd]))
1260 let job.error = v:shell_error != 0
1261 let job.running = 0
1262 endif
1263endfunction
1264
1265function! s:reap(name)
1266 let job = s:jobs[a:name]
1267 if job.error
1268 call add(s:update.errors, a:name)
1269 elseif get(job, 'new', 0)
1270 let s:update.new[a:name] = 1
1271 endif
1272 let s:update.bar .= job.error ? 'x' : '='
1273
1274 let bullet = job.error ? 'x' : '-'
1275 let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines)
1276 call s:log(bullet, a:name, empty(result) ? 'OK' : result)
1277 call s:bar()
1278
1279 call remove(s:jobs, a:name)
1280endfunction
1281
1282function! s:bar()
1283 if s:switch_in()
1284 let total = len(s:update.all)
1285 call setline(1, (s:update.pull ? 'Updating' : 'Installing').
1286 \ ' plugins ('.len(s:update.bar).'/'.total.')')
1287 call s:progress_bar(2, s:update.bar, total)
1288 call s:switch_out()
1289 endif
1290endfunction
1291
1292function! s:logpos(name)
1293 for i in range(4, line('$'))
1294 if getline(i) =~# '^[-+x*] '.a:name.':'
1295 for j in range(i + 1, line('$'))
1296 if getline(j) !~ '^ '
1297 return [i, j - 1]
1298 endif
1299 endfor
1300 return [i, i]
1301 endif
1302 endfor
1303 return [0, 0]
1304endfunction
1305
1306function! s:log(bullet, name, lines)
1307 if s:switch_in()
1308 let [b, e] = s:logpos(a:name)
1309 if b > 0
1310 silent execute printf('%d,%d d _', b, e)
1311 if b > winheight('.')
1312 let b = 4
1313 endif
1314 else
1315 let b = 4
1316 endif
1317 " FIXME For some reason, nomodifiable is set after :d in vim8
1318 setlocal modifiable
1319 call append(b - 1, s:format_message(a:bullet, a:name, a:lines))
1320 call s:switch_out()
1321 endif
1322endfunction
1323
1324function! s:update_vim()
1325 let s:jobs = {}
1326
1327 call s:bar()
1328 call s:tick()
1329endfunction
1330
1331function! s:tick()
1332 let pull = s:update.pull
1333 let prog = s:progress_opt(s:nvim || s:vim8)
1334while 1 " Without TCO, Vim stack is bound to explode
1335 if empty(s:update.todo)
1336 if empty(s:jobs) && !s:update.fin
1337 call s:update_finish()
1338 let s:update.fin = 1
1339 endif
1340 return
1341 endif
1342
1343 let name = keys(s:update.todo)[0]
1344 let spec = remove(s:update.todo, name)
1345 let new = empty(globpath(spec.dir, '.git', 1))
1346
1347 call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...')
1348 redraw
1349
1350 let has_tag = has_key(spec, 'tag')
1351 if !new
1352 let [error, _] = s:git_validate(spec, 0)
1353 if empty(error)
1354 if pull
1355 let fetch_opt = (has_tag && !empty(globpath(spec.dir, '.git/shallow'))) ? '--depth 99999999' : ''
1356 call s:spawn(name, printf('git fetch %s %s 2>&1', fetch_opt, prog), { 'dir': spec.dir })
1357 else
1358 let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 }
1359 endif
1360 else
1361 let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 }
1362 endif
1363 else
1364 call s:spawn(name,
1365 \ printf('git clone %s %s %s %s 2>&1',
1366 \ has_tag ? '' : s:clone_opt,
1367 \ prog,
1368 \ plug#shellescape(spec.uri, {'script': 0}),
1369 \ plug#shellescape(s:trim(spec.dir), {'script': 0})), { 'new': 1 })
1370 endif
1371
1372 if !s:jobs[name].running
1373 call s:reap(name)
1374 endif
1375 if len(s:jobs) >= s:update.threads
1376 break
1377 endif
1378endwhile
1379endfunction
1380
1381function! s:update_python()
1382let py_exe = has('python') ? 'python' : 'python3'
1383execute py_exe "<< EOF"
1384import datetime
1385import functools
1386import os
1387try:
1388 import queue
1389except ImportError:
1390 import Queue as queue
1391import random
1392import re
1393import shutil
1394import signal
1395import subprocess
1396import tempfile
1397import threading as thr
1398import time
1399import traceback
1400import vim
1401
1402G_NVIM = vim.eval("has('nvim')") == '1'
1403G_PULL = vim.eval('s:update.pull') == '1'
1404G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1
1405G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)'))
1406G_CLONE_OPT = vim.eval('s:clone_opt')
1407G_PROGRESS = vim.eval('s:progress_opt(1)')
1408G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads'))
1409G_STOP = thr.Event()
1410G_IS_WIN = vim.eval('s:is_win') == '1'
1411
1412class PlugError(Exception):
1413 def __init__(self, msg):
1414 self.msg = msg
1415class CmdTimedOut(PlugError):
1416 pass
1417class CmdFailed(PlugError):
1418 pass
1419class InvalidURI(PlugError):
1420 pass
1421class Action(object):
1422 INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-']
1423
1424class Buffer(object):
1425 def __init__(self, lock, num_plugs, is_pull):
1426 self.bar = ''
1427 self.event = 'Updating' if is_pull else 'Installing'
1428 self.lock = lock
1429 self.maxy = int(vim.eval('winheight(".")'))
1430 self.num_plugs = num_plugs
1431
1432 def __where(self, name):
1433 """ Find first line with name in current buffer. Return line num. """
1434 found, lnum = False, 0
1435 matcher = re.compile('^[-+x*] {0}:'.format(name))
1436 for line in vim.current.buffer:
1437 if matcher.search(line) is not None:
1438 found = True
1439 break
1440 lnum += 1
1441
1442 if not found:
1443 lnum = -1
1444 return lnum
1445
1446 def header(self):
1447 curbuf = vim.current.buffer
1448 curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs)
1449
1450 num_spaces = self.num_plugs - len(self.bar)
1451 curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ')
1452
1453 with self.lock:
1454 vim.command('normal! 2G')
1455 vim.command('redraw')
1456
1457 def write(self, action, name, lines):
1458 first, rest = lines[0], lines[1:]
1459 msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)]
1460 msg.extend([' ' + line for line in rest])
1461
1462 try:
1463 if action == Action.ERROR:
1464 self.bar += 'x'
1465 vim.command("call add(s:update.errors, '{0}')".format(name))
1466 elif action == Action.DONE:
1467 self.bar += '='
1468
1469 curbuf = vim.current.buffer
1470 lnum = self.__where(name)
1471 if lnum != -1: # Found matching line num
1472 del curbuf[lnum]
1473 if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]):
1474 lnum = 3
1475 else:
1476 lnum = 3
1477 curbuf.append(msg, lnum)
1478
1479 self.header()
1480 except vim.error:
1481 pass
1482
1483class Command(object):
1484 CD = 'cd /d' if G_IS_WIN else 'cd'
1485
1486 def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None):
1487 self.cmd = cmd
1488 if cmd_dir:
1489 self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd)
1490 self.timeout = timeout
1491 self.callback = cb if cb else (lambda msg: None)
1492 self.clean = clean if clean else (lambda: None)
1493 self.proc = None
1494
1495 @property
1496 def alive(self):
1497 """ Returns true only if command still running. """
1498 return self.proc and self.proc.poll() is None
1499
1500 def execute(self, ntries=3):
1501 """ Execute the command with ntries if CmdTimedOut.
1502 Returns the output of the command if no Exception.
1503 """
1504 attempt, finished, limit = 0, False, self.timeout
1505
1506 while not finished:
1507 try:
1508 attempt += 1
1509 result = self.try_command()
1510 finished = True
1511 return result
1512 except CmdTimedOut:
1513 if attempt != ntries:
1514 self.notify_retry()
1515 self.timeout += limit
1516 else:
1517 raise
1518
1519 def notify_retry(self):
1520 """ Retry required for command, notify user. """
1521 for count in range(3, 0, -1):
1522 if G_STOP.is_set():
1523 raise KeyboardInterrupt
1524 msg = 'Timeout. Will retry in {0} second{1} ...'.format(
1525 count, 's' if count != 1 else '')
1526 self.callback([msg])
1527 time.sleep(1)
1528 self.callback(['Retrying ...'])
1529
1530 def try_command(self):
1531 """ Execute a cmd & poll for callback. Returns list of output.
1532 Raises CmdFailed -> return code for Popen isn't 0
1533 Raises CmdTimedOut -> command exceeded timeout without new output
1534 """
1535 first_line = True
1536
1537 try:
1538 tfile = tempfile.NamedTemporaryFile(mode='w+b')
1539 preexec_fn = not G_IS_WIN and os.setsid or None
1540 self.proc = subprocess.Popen(self.cmd, stdout=tfile,
1541 stderr=subprocess.STDOUT,
1542 stdin=subprocess.PIPE, shell=True,
1543 preexec_fn=preexec_fn)
1544 thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,))
1545 thrd.start()
1546
1547 thread_not_started = True
1548 while thread_not_started:
1549 try:
1550 thrd.join(0.1)
1551 thread_not_started = False
1552 except RuntimeError:
1553 pass
1554
1555 while self.alive:
1556 if G_STOP.is_set():
1557 raise KeyboardInterrupt
1558
1559 if first_line or random.random() < G_LOG_PROB:
1560 first_line = False
1561 line = '' if G_IS_WIN else nonblock_read(tfile.name)
1562 if line:
1563 self.callback([line])
1564
1565 time_diff = time.time() - os.path.getmtime(tfile.name)
1566 if time_diff > self.timeout:
1567 raise CmdTimedOut(['Timeout!'])
1568
1569 thrd.join(0.5)
1570
1571 tfile.seek(0)
1572 result = [line.decode('utf-8', 'replace').rstrip() for line in tfile]
1573
1574 if self.proc.returncode != 0:
1575 raise CmdFailed([''] + result)
1576
1577 return result
1578 except:
1579 self.terminate()
1580 raise
1581
1582 def terminate(self):
1583 """ Terminate process and cleanup. """
1584 if self.alive:
1585 if G_IS_WIN:
1586 os.kill(self.proc.pid, signal.SIGINT)
1587 else:
1588 os.killpg(self.proc.pid, signal.SIGTERM)
1589 self.clean()
1590
1591class Plugin(object):
1592 def __init__(self, name, args, buf_q, lock):
1593 self.name = name
1594 self.args = args
1595 self.buf_q = buf_q
1596 self.lock = lock
1597 self.tag = args.get('tag', 0)
1598
1599 def manage(self):
1600 try:
1601 if os.path.exists(self.args['dir']):
1602 self.update()
1603 else:
1604 self.install()
1605 with self.lock:
1606 thread_vim_command("let s:update.new['{0}'] = 1".format(self.name))
1607 except PlugError as exc:
1608 self.write(Action.ERROR, self.name, exc.msg)
1609 except KeyboardInterrupt:
1610 G_STOP.set()
1611 self.write(Action.ERROR, self.name, ['Interrupted!'])
1612 except:
1613 # Any exception except those above print stack trace
1614 msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip())
1615 self.write(Action.ERROR, self.name, msg.split('\n'))
1616 raise
1617
1618 def install(self):
1619 target = self.args['dir']
1620 if target[-1] == '\\':
1621 target = target[0:-1]
1622
1623 def clean(target):
1624 def _clean():
1625 try:
1626 shutil.rmtree(target)
1627 except OSError:
1628 pass
1629 return _clean
1630
1631 self.write(Action.INSTALL, self.name, ['Installing ...'])
1632 callback = functools.partial(self.write, Action.INSTALL, self.name)
1633 cmd = 'git clone {0} {1} {2} {3} 2>&1'.format(
1634 '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'],
1635 esc(target))
1636 com = Command(cmd, None, G_TIMEOUT, callback, clean(target))
1637 result = com.execute(G_RETRIES)
1638 self.write(Action.DONE, self.name, result[-1:])
1639
1640 def repo_uri(self):
1641 cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url'
1642 command = Command(cmd, self.args['dir'], G_TIMEOUT,)
1643 result = command.execute(G_RETRIES)
1644 return result[-1]
1645
1646 def update(self):
1647 actual_uri = self.repo_uri()
1648 expect_uri = self.args['uri']
1649 regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$')
1650 ma = regex.match(actual_uri)
1651 mb = regex.match(expect_uri)
1652 if ma is None or mb is None or ma.groups() != mb.groups():
1653 msg = ['',
1654 'Invalid URI: {0}'.format(actual_uri),
1655 'Expected {0}'.format(expect_uri),
1656 'PlugClean required.']
1657 raise InvalidURI(msg)
1658
1659 if G_PULL:
1660 self.write(Action.UPDATE, self.name, ['Updating ...'])
1661 callback = functools.partial(self.write, Action.UPDATE, self.name)
1662 fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else ''
1663 cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS)
1664 com = Command(cmd, self.args['dir'], G_TIMEOUT, callback)
1665 result = com.execute(G_RETRIES)
1666 self.write(Action.DONE, self.name, result[-1:])
1667 else:
1668 self.write(Action.DONE, self.name, ['Already installed'])
1669
1670 def write(self, action, name, msg):
1671 self.buf_q.put((action, name, msg))
1672
1673class PlugThread(thr.Thread):
1674 def __init__(self, tname, args):
1675 super(PlugThread, self).__init__()
1676 self.tname = tname
1677 self.args = args
1678
1679 def run(self):
1680 thr.current_thread().name = self.tname
1681 buf_q, work_q, lock = self.args
1682
1683 try:
1684 while not G_STOP.is_set():
1685 name, args = work_q.get_nowait()
1686 plug = Plugin(name, args, buf_q, lock)
1687 plug.manage()
1688 work_q.task_done()
1689 except queue.Empty:
1690 pass
1691
1692class RefreshThread(thr.Thread):
1693 def __init__(self, lock):
1694 super(RefreshThread, self).__init__()
1695 self.lock = lock
1696 self.running = True
1697
1698 def run(self):
1699 while self.running:
1700 with self.lock:
1701 thread_vim_command('noautocmd normal! a')
1702 time.sleep(0.33)
1703
1704 def stop(self):
1705 self.running = False
1706
1707if G_NVIM:
1708 def thread_vim_command(cmd):
1709 vim.session.threadsafe_call(lambda: vim.command(cmd))
1710else:
1711 def thread_vim_command(cmd):
1712 vim.command(cmd)
1713
1714def esc(name):
1715 return '"' + name.replace('"', '\"') + '"'
1716
1717def nonblock_read(fname):
1718 """ Read a file with nonblock flag. Return the last line. """
1719 fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK)
1720 buf = os.read(fread, 100000).decode('utf-8', 'replace')
1721 os.close(fread)
1722
1723 line = buf.rstrip('\r\n')
1724 left = max(line.rfind('\r'), line.rfind('\n'))
1725 if left != -1:
1726 left += 1
1727 line = line[left:]
1728
1729 return line
1730
1731def main():
1732 thr.current_thread().name = 'main'
1733 nthreads = int(vim.eval('s:update.threads'))
1734 plugs = vim.eval('s:update.todo')
1735 mac_gui = vim.eval('s:mac_gui') == '1'
1736
1737 lock = thr.Lock()
1738 buf = Buffer(lock, len(plugs), G_PULL)
1739 buf_q, work_q = queue.Queue(), queue.Queue()
1740 for work in plugs.items():
1741 work_q.put(work)
1742
1743 start_cnt = thr.active_count()
1744 for num in range(nthreads):
1745 tname = 'PlugT-{0:02}'.format(num)
1746 thread = PlugThread(tname, (buf_q, work_q, lock))
1747 thread.start()
1748 if mac_gui:
1749 rthread = RefreshThread(lock)
1750 rthread.start()
1751
1752 while not buf_q.empty() or thr.active_count() != start_cnt:
1753 try:
1754 action, name, msg = buf_q.get(True, 0.25)
1755 buf.write(action, name, ['OK'] if not msg else msg)
1756 buf_q.task_done()
1757 except queue.Empty:
1758 pass
1759 except KeyboardInterrupt:
1760 G_STOP.set()
1761
1762 if mac_gui:
1763 rthread.stop()
1764 rthread.join()
1765
1766main()
1767EOF
1768endfunction
1769
1770function! s:update_ruby()
1771 ruby << EOF
1772 module PlugStream
1773 SEP = ["\r", "\n", nil]
1774 def get_line
1775 buffer = ''
1776 loop do
1777 char = readchar rescue return
1778 if SEP.include? char.chr
1779 buffer << $/
1780 break
1781 else
1782 buffer << char
1783 end
1784 end
1785 buffer
1786 end
1787 end unless defined?(PlugStream)
1788
1789 def esc arg
1790 %["#{arg.gsub('"', '\"')}"]
1791 end
1792
1793 def killall pid
1794 pids = [pid]
1795 if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM
1796 pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil }
1797 else
1798 unless `which pgrep 2> /dev/null`.empty?
1799 children = pids
1800 until children.empty?
1801 children = children.map { |pid|
1802 `pgrep -P #{pid}`.lines.map { |l| l.chomp }
1803 }.flatten
1804 pids += children
1805 end
1806 end
1807 pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil }
1808 end
1809 end
1810
1811 def compare_git_uri a, b
1812 regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$}
1813 regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1)
1814 end
1815
1816 require 'thread'
1817 require 'fileutils'
1818 require 'timeout'
1819 running = true
1820 iswin = VIM::evaluate('s:is_win').to_i == 1
1821 pull = VIM::evaluate('s:update.pull').to_i == 1
1822 base = VIM::evaluate('g:plug_home')
1823 all = VIM::evaluate('s:update.todo')
1824 limit = VIM::evaluate('get(g:, "plug_timeout", 60)')
1825 tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1
1826 nthr = VIM::evaluate('s:update.threads').to_i
1827 maxy = VIM::evaluate('winheight(".")').to_i
1828 vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/
1829 cd = iswin ? 'cd /d' : 'cd'
1830 tot = VIM::evaluate('len(s:update.todo)') || 0
1831 bar = ''
1832 skip = 'Already installed'
1833 mtx = Mutex.new
1834 take1 = proc { mtx.synchronize { running && all.shift } }
1835 logh = proc {
1836 cnt = bar.length
1837 $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})"
1838 $curbuf[2] = '[' + bar.ljust(tot) + ']'
1839 VIM::command('normal! 2G')
1840 VIM::command('redraw')
1841 }
1842 where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } }
1843 log = proc { |name, result, type|
1844 mtx.synchronize do
1845 ing = ![true, false].include?(type)
1846 bar += type ? '=' : 'x' unless ing
1847 b = case type
1848 when :install then '+' when :update then '*'
1849 when true, nil then '-' else
1850 VIM::command("call add(s:update.errors, '#{name}')")
1851 'x'
1852 end
1853 result =
1854 if type || type.nil?
1855 ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"]
1856 elsif result =~ /^Interrupted|^Timeout/
1857 ["#{b} #{name}: #{result}"]
1858 else
1859 ["#{b} #{name}"] + result.lines.map { |l| " " << l }
1860 end
1861 if lnum = where.call(name)
1862 $curbuf.delete lnum
1863 lnum = 4 if ing && lnum > maxy
1864 end
1865 result.each_with_index do |line, offset|
1866 $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp)
1867 end
1868 logh.call
1869 end
1870 }
1871 bt = proc { |cmd, name, type, cleanup|
1872 tried = timeout = 0
1873 begin
1874 tried += 1
1875 timeout += limit
1876 fd = nil
1877 data = ''
1878 if iswin
1879 Timeout::timeout(timeout) do
1880 tmp = VIM::evaluate('tempname()')
1881 system("(#{cmd}) > #{tmp}")
1882 data = File.read(tmp).chomp
1883 File.unlink tmp rescue nil
1884 end
1885 else
1886 fd = IO.popen(cmd).extend(PlugStream)
1887 first_line = true
1888 log_prob = 1.0 / nthr
1889 while line = Timeout::timeout(timeout) { fd.get_line }
1890 data << line
1891 log.call name, line.chomp, type if name && (first_line || rand < log_prob)
1892 first_line = false
1893 end
1894 fd.close
1895 end
1896 [$? == 0, data.chomp]
1897 rescue Timeout::Error, Interrupt => e
1898 if fd && !fd.closed?
1899 killall fd.pid
1900 fd.close
1901 end
1902 cleanup.call if cleanup
1903 if e.is_a?(Timeout::Error) && tried < tries
1904 3.downto(1) do |countdown|
1905 s = countdown > 1 ? 's' : ''
1906 log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type
1907 sleep 1
1908 end
1909 log.call name, 'Retrying ...', type
1910 retry
1911 end
1912 [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"]
1913 end
1914 }
1915 main = Thread.current
1916 threads = []
1917 watcher = Thread.new {
1918 if vim7
1919 while VIM::evaluate('getchar(1)')
1920 sleep 0.1
1921 end
1922 else
1923 require 'io/console' # >= Ruby 1.9
1924 nil until IO.console.getch == 3.chr
1925 end
1926 mtx.synchronize do
1927 running = false
1928 threads.each { |t| t.raise Interrupt } unless vim7
1929 end
1930 threads.each { |t| t.join rescue nil }
1931 main.kill
1932 }
1933 refresh = Thread.new {
1934 while true
1935 mtx.synchronize do
1936 break unless running
1937 VIM::command('noautocmd normal! a')
1938 end
1939 sleep 0.2
1940 end
1941 } if VIM::evaluate('s:mac_gui') == 1
1942
1943 clone_opt = VIM::evaluate('s:clone_opt')
1944 progress = VIM::evaluate('s:progress_opt(1)')
1945 nthr.times do
1946 mtx.synchronize do
1947 threads << Thread.new {
1948 while pair = take1.call
1949 name = pair.first
1950 dir, uri, tag = pair.last.values_at *%w[dir uri tag]
1951 exists = File.directory? dir
1952 ok, result =
1953 if exists
1954 chdir = "#{cd} #{iswin ? dir : esc(dir)}"
1955 ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil
1956 current_uri = data.lines.to_a.last
1957 if !ret
1958 if data =~ /^Interrupted|^Timeout/
1959 [false, data]
1960 else
1961 [false, [data.chomp, "PlugClean required."].join($/)]
1962 end
1963 elsif !compare_git_uri(current_uri, uri)
1964 [false, ["Invalid URI: #{current_uri}",
1965 "Expected: #{uri}",
1966 "PlugClean required."].join($/)]
1967 else
1968 if pull
1969 log.call name, 'Updating ...', :update
1970 fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : ''
1971 bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil
1972 else
1973 [true, skip]
1974 end
1975 end
1976 else
1977 d = esc dir.sub(%r{[\\/]+$}, '')
1978 log.call name, 'Installing ...', :install
1979 bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc {
1980 FileUtils.rm_rf dir
1981 }
1982 end
1983 mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok
1984 log.call name, result, ok
1985 end
1986 } if running
1987 end
1988 end
1989 threads.each { |t| t.join rescue nil }
1990 logh.call
1991 refresh.kill if refresh
1992 watcher.kill
1993EOF
1994endfunction
1995
1996function! s:shellesc_cmd(arg, script)
1997 let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g')
1998 return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g')
1999endfunction
2000
2001function! s:shellesc_ps1(arg)
2002 return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'"
2003endfunction
2004
2005function! plug#shellescape(arg, ...)
2006 let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {}
2007 let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh')
2008 let script = get(opts, 'script', 1)
2009 if shell =~# 'cmd\.exe$'
2010 return s:shellesc_cmd(a:arg, script)
2011 elseif shell =~# 'powershell\.exe$' || shell =~# 'pwsh$'
2012 return s:shellesc_ps1(a:arg)
2013 endif
2014 return shellescape(a:arg)
2015endfunction
2016
2017function! s:glob_dir(path)
2018 return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)')
2019endfunction
2020
2021function! s:progress_bar(line, bar, total)
2022 call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']')
2023endfunction
2024
2025function! s:compare_git_uri(a, b)
2026 " See `git help clone'
2027 " https:// [user@] github.com[:port] / junegunn/vim-plug [.git]
2028 " [git@] github.com[:port] : junegunn/vim-plug [.git]
2029 " file:// / junegunn/vim-plug [/]
2030 " / junegunn/vim-plug [/]
2031 let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$'
2032 let ma = matchlist(a:a, pat)
2033 let mb = matchlist(a:b, pat)
2034 return ma[1:2] ==# mb[1:2]
2035endfunction
2036
2037function! s:format_message(bullet, name, message)
2038 if a:bullet != 'x'
2039 return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))]
2040 else
2041 let lines = map(s:lines(a:message), '" ".v:val')
2042 return extend([printf('x %s:', a:name)], lines)
2043 endif
2044endfunction
2045
2046function! s:with_cd(cmd, dir, ...)
2047 let script = a:0 > 0 ? a:1 : 1
2048 return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd)
2049endfunction
2050
2051function! s:system(cmd, ...)
2052 try
2053 let [sh, shellcmdflag, shrd] = s:chsh(1)
2054 let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd
2055 if s:is_win
2056 let [batchfile, cmd] = s:batchfile(cmd)
2057 endif
2058 return system(cmd)
2059 finally
2060 let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
2061 if s:is_win
2062 call delete(batchfile)
2063 endif
2064 endtry
2065endfunction
2066
2067function! s:system_chomp(...)
2068 let ret = call('s:system', a:000)
2069 return v:shell_error ? '' : substitute(ret, '\n$', '', '')
2070endfunction
2071
2072function! s:git_validate(spec, check_branch)
2073 let err = ''
2074 if isdirectory(a:spec.dir)
2075 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))
2076 let remote = result[-1]
2077 if v:shell_error
2078 let err = join([remote, 'PlugClean required.'], "\n")
2079 elseif !s:compare_git_uri(remote, a:spec.uri)
2080 let err = join(['Invalid URI: '.remote,
2081 \ 'Expected: '.a:spec.uri,
2082 \ 'PlugClean required.'], "\n")
2083 elseif a:check_branch && has_key(a:spec, 'commit')
2084 let result = s:lines(s:system('git rev-parse HEAD 2>&1', a:spec.dir))
2085 let sha = result[-1]
2086 if v:shell_error
2087 let err = join(add(result, 'PlugClean required.'), "\n")
2088 elseif !s:hash_match(sha, a:spec.commit)
2089 let err = join([printf('Invalid HEAD (expected: %s, actual: %s)',
2090 \ a:spec.commit[:6], sha[:6]),
2091 \ 'PlugUpdate required.'], "\n")
2092 endif
2093 elseif a:check_branch
2094 let branch = result[0]
2095 " Check tag
2096 if has_key(a:spec, 'tag')
2097 let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir)
2098 if a:spec.tag !=# tag && a:spec.tag !~ '\*'
2099 let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.',
2100 \ (empty(tag) ? 'N/A' : tag), a:spec.tag)
2101 endif
2102 " Check branch
2103 elseif a:spec.branch !=# branch
2104 let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.',
2105 \ branch, a:spec.branch)
2106 endif
2107 if empty(err)
2108 let [ahead, behind] = split(s:lastline(s:system(printf(
2109 \ 'git rev-list --count --left-right HEAD...origin/%s',
2110 \ a:spec.branch), a:spec.dir)), '\t')
2111 if !v:shell_error && ahead
2112 if behind
2113 " Only mention PlugClean if diverged, otherwise it's likely to be
2114 " pushable (and probably not that messed up).
2115 let err = printf(
2116 \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n"
2117 \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', a:spec.branch, ahead, behind)
2118 else
2119 let err = printf("Ahead of origin/%s by %d commit(s).\n"
2120 \ .'Cannot update until local changes are pushed.',
2121 \ a:spec.branch, ahead)
2122 endif
2123 endif
2124 endif
2125 endif
2126 else
2127 let err = 'Not found'
2128 endif
2129 return [err, err =~# 'PlugClean']
2130endfunction
2131
2132function! s:rm_rf(dir)
2133 if isdirectory(a:dir)
2134 call s:system((s:is_win ? 'rmdir /S /Q ' : 'rm -rf ') . plug#shellescape(a:dir))
2135 endif
2136endfunction
2137
2138function! s:clean(force)
2139 call s:prepare()
2140 call append(0, 'Searching for invalid plugins in '.g:plug_home)
2141 call append(1, '')
2142
2143 " List of valid directories
2144 let dirs = []
2145 let errs = {}
2146 let [cnt, total] = [0, len(g:plugs)]
2147 for [name, spec] in items(g:plugs)
2148 if !s:is_managed(name)
2149 call add(dirs, spec.dir)
2150 else
2151 let [err, clean] = s:git_validate(spec, 1)
2152 if clean
2153 let errs[spec.dir] = s:lines(err)[0]
2154 else
2155 call add(dirs, spec.dir)
2156 endif
2157 endif
2158 let cnt += 1
2159 call s:progress_bar(2, repeat('=', cnt), total)
2160 normal! 2G
2161 redraw
2162 endfor
2163
2164 let allowed = {}
2165 for dir in dirs
2166 let allowed[s:dirpath(fnamemodify(dir, ':h:h'))] = 1
2167 let allowed[dir] = 1
2168 for child in s:glob_dir(dir)
2169 let allowed[child] = 1
2170 endfor
2171 endfor
2172
2173 let todo = []
2174 let found = sort(s:glob_dir(g:plug_home))
2175 while !empty(found)
2176 let f = remove(found, 0)
2177 if !has_key(allowed, f) && isdirectory(f)
2178 call add(todo, f)
2179 call append(line('$'), '- ' . f)
2180 if has_key(errs, f)
2181 call append(line('$'), ' ' . errs[f])
2182 endif
2183 let found = filter(found, 'stridx(v:val, f) != 0')
2184 end
2185 endwhile
2186
2187 4
2188 redraw
2189 if empty(todo)
2190 call append(line('$'), 'Already clean.')
2191 else
2192 let s:clean_count = 0
2193 call append(3, ['Directories to delete:', ''])
2194 redraw!
2195 if a:force || s:ask_no_interrupt('Delete all directories?')
2196 call s:delete([6, line('$')], 1)
2197 else
2198 call setline(4, 'Cancelled.')
2199 nnoremap <silent> <buffer> d :set opfunc=<sid>delete_op<cr>g@
2200 nmap <silent> <buffer> dd d_
2201 xnoremap <silent> <buffer> d :<c-u>call <sid>delete_op(visualmode(), 1)<cr>
2202 echo 'Delete the lines (d{motion}) to delete the corresponding directories'
2203 endif
2204 endif
2205 4
2206 setlocal nomodifiable
2207endfunction
2208
2209function! s:delete_op(type, ...)
2210 call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0)
2211endfunction
2212
2213function! s:delete(range, force)
2214 let [l1, l2] = a:range
2215 let force = a:force
2216 while l1 <= l2
2217 let line = getline(l1)
2218 if line =~ '^- ' && isdirectory(line[2:])
2219 execute l1
2220 redraw!
2221 let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1)
2222 let force = force || answer > 1
2223 if answer
2224 call s:rm_rf(line[2:])
2225 setlocal modifiable
2226 call setline(l1, '~'.line[1:])
2227 let s:clean_count += 1
2228 call setline(4, printf('Removed %d directories.', s:clean_count))
2229 setlocal nomodifiable
2230 endif
2231 endif
2232 let l1 += 1
2233 endwhile
2234endfunction
2235
2236function! s:upgrade()
2237 echo 'Downloading the latest version of vim-plug'
2238 redraw
2239 let tmp = tempname()
2240 let new = tmp . '/plug.vim'
2241
2242 try
2243 let out = s:system(printf('git clone --depth 1 %s %s', plug#shellescape(s:plug_src), plug#shellescape(tmp)))
2244 if v:shell_error
2245 return s:err('Error upgrading vim-plug: '. out)
2246 endif
2247
2248 if readfile(s:me) ==# readfile(new)
2249 echo 'vim-plug is already up-to-date'
2250 return 0
2251 else
2252 call rename(s:me, s:me . '.old')
2253 call rename(new, s:me)
2254 unlet g:loaded_plug
2255 echo 'vim-plug has been upgraded'
2256 return 1
2257 endif
2258 finally
2259 silent! call s:rm_rf(tmp)
2260 endtry
2261endfunction
2262
2263function! s:upgrade_specs()
2264 for spec in values(g:plugs)
2265 let spec.frozen = get(spec, 'frozen', 0)
2266 endfor
2267endfunction
2268
2269function! s:status()
2270 call s:prepare()
2271 call append(0, 'Checking plugins')
2272 call append(1, '')
2273
2274 let ecnt = 0
2275 let unloaded = 0
2276 let [cnt, total] = [0, len(g:plugs)]
2277 for [name, spec] in items(g:plugs)
2278 let is_dir = isdirectory(spec.dir)
2279 if has_key(spec, 'uri')
2280 if is_dir
2281 let [err, _] = s:git_validate(spec, 1)
2282 let [valid, msg] = [empty(err), empty(err) ? 'OK' : err]
2283 else
2284 let [valid, msg] = [0, 'Not found. Try PlugInstall.']
2285 endif
2286 else
2287 if is_dir
2288 let [valid, msg] = [1, 'OK']
2289 else
2290 let [valid, msg] = [0, 'Not found.']
2291 endif
2292 endif
2293 let cnt += 1
2294 let ecnt += !valid
2295 " `s:loaded` entry can be missing if PlugUpgraded
2296 if is_dir && get(s:loaded, name, -1) == 0
2297 let unloaded = 1
2298 let msg .= ' (not loaded)'
2299 endif
2300 call s:progress_bar(2, repeat('=', cnt), total)
2301 call append(3, s:format_message(valid ? '-' : 'x', name, msg))
2302 normal! 2G
2303 redraw
2304 endfor
2305 call setline(1, 'Finished. '.ecnt.' error(s).')
2306 normal! gg
2307 setlocal nomodifiable
2308 if unloaded
2309 echo "Press 'L' on each line to load plugin, or 'U' to update"
2310 nnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr>
2311 xnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr>
2312 end
2313endfunction
2314
2315function! s:extract_name(str, prefix, suffix)
2316 return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$')
2317endfunction
2318
2319function! s:status_load(lnum)
2320 let line = getline(a:lnum)
2321 let name = s:extract_name(line, '-', '(not loaded)')
2322 if !empty(name)
2323 call plug#load(name)
2324 setlocal modifiable
2325 call setline(a:lnum, substitute(line, ' (not loaded)$', '', ''))
2326 setlocal nomodifiable
2327 endif
2328endfunction
2329
2330function! s:status_update() range
2331 let lines = getline(a:firstline, a:lastline)
2332 let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)')
2333 if !empty(names)
2334 echo
2335 execute 'PlugUpdate' join(names)
2336 endif
2337endfunction
2338
2339function! s:is_preview_window_open()
2340 silent! wincmd P
2341 if &previewwindow
2342 wincmd p
2343 return 1
2344 endif
2345endfunction
2346
2347function! s:find_name(lnum)
2348 for lnum in reverse(range(1, a:lnum))
2349 let line = getline(lnum)
2350 if empty(line)
2351 return ''
2352 endif
2353 let name = s:extract_name(line, '-', '')
2354 if !empty(name)
2355 return name
2356 endif
2357 endfor
2358 return ''
2359endfunction
2360
2361function! s:preview_commit()
2362 if b:plug_preview < 0
2363 let b:plug_preview = !s:is_preview_window_open()
2364 endif
2365
2366 let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}')
2367 if empty(sha)
2368 return
2369 endif
2370
2371 let name = s:find_name(line('.'))
2372 if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir)
2373 return
2374 endif
2375
2376 if exists('g:plug_pwindow') && !s:is_preview_window_open()
2377 execute g:plug_pwindow
2378 execute 'e' sha
2379 else
2380 execute 'pedit' sha
2381 wincmd P
2382 endif
2383 setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable
2384 try
2385 let [sh, shellcmdflag, shrd] = s:chsh(1)
2386 let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && git show --no-color --pretty=medium '.sha
2387 if s:is_win
2388 let [batchfile, cmd] = s:batchfile(cmd)
2389 endif
2390 execute 'silent %!' cmd
2391 finally
2392 let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
2393 if s:is_win
2394 call delete(batchfile)
2395 endif
2396 endtry
2397 setlocal nomodifiable
2398 nnoremap <silent> <buffer> q :q<cr>
2399 wincmd p
2400endfunction
2401
2402function! s:section(flags)
2403 call search('\(^[x-] \)\@<=[^:]\+:', a:flags)
2404endfunction
2405
2406function! s:format_git_log(line)
2407 let indent = ' '
2408 let tokens = split(a:line, nr2char(1))
2409 if len(tokens) != 5
2410 return indent.substitute(a:line, '\s*$', '', '')
2411 endif
2412 let [graph, sha, refs, subject, date] = tokens
2413 let tag = matchstr(refs, 'tag: [^,)]\+')
2414 let tag = empty(tag) ? ' ' : ' ('.tag.') '
2415 return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date)
2416endfunction
2417
2418function! s:append_ul(lnum, text)
2419 call append(a:lnum, ['', a:text, repeat('-', len(a:text))])
2420endfunction
2421
2422function! s:diff()
2423 call s:prepare()
2424 call append(0, ['Collecting changes ...', ''])
2425 let cnts = [0, 0]
2426 let bar = ''
2427 let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)')
2428 call s:progress_bar(2, bar, len(total))
2429 for origin in [1, 0]
2430 let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))'))))
2431 if empty(plugs)
2432 continue
2433 endif
2434 call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:')
2435 for [k, v] in plugs
2436 let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..'
2437 let cmd = 'git log --graph --color=never '.join(map(['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range], 'plug#shellescape(v:val)'))
2438 if has_key(v, 'rtp')
2439 let cmd .= ' -- '.plug#shellescape(v.rtp)
2440 endif
2441 let diff = s:system_chomp(cmd, v.dir)
2442 if !empty(diff)
2443 let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : ''
2444 call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)')))
2445 let cnts[origin] += 1
2446 endif
2447 let bar .= '='
2448 call s:progress_bar(2, bar, len(total))
2449 normal! 2G
2450 redraw
2451 endfor
2452 if !cnts[origin]
2453 call append(5, ['', 'N/A'])
2454 endif
2455 endfor
2456 call setline(1, printf('%d plugin(s) updated.', cnts[0])
2457 \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : ''))
2458
2459 if cnts[0] || cnts[1]
2460 nnoremap <silent> <buffer> <plug>(plug-preview) :silent! call <SID>preview_commit()<cr>
2461 if empty(maparg("\<cr>", 'n'))
2462 nmap <buffer> <cr> <plug>(plug-preview)
2463 endif
2464 if empty(maparg('o', 'n'))
2465 nmap <buffer> o <plug>(plug-preview)
2466 endif
2467 endif
2468 if cnts[0]
2469 nnoremap <silent> <buffer> X :call <SID>revert()<cr>
2470 echo "Press 'X' on each block to revert the update"
2471 endif
2472 normal! gg
2473 setlocal nomodifiable
2474endfunction
2475
2476function! s:revert()
2477 if search('^Pending updates', 'bnW')
2478 return
2479 endif
2480
2481 let name = s:find_name(line('.'))
2482 if empty(name) || !has_key(g:plugs, name) ||
2483 \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y'
2484 return
2485 endif
2486
2487 call s:system('git reset --hard HEAD@{1} && git checkout '.s:esc(g:plugs[name].branch).' --', g:plugs[name].dir)
2488 setlocal modifiable
2489 normal! "_dap
2490 setlocal nomodifiable
2491 echo 'Reverted'
2492endfunction
2493
2494function! s:snapshot(force, ...) abort
2495 call s:prepare()
2496 setf vim
2497 call append(0, ['" Generated by vim-plug',
2498 \ '" '.strftime("%c"),
2499 \ '" :source this file in vim to restore the snapshot',
2500 \ '" or execute: vim -S snapshot.vim',
2501 \ '', '', 'PlugUpdate!'])
2502 1
2503 let anchor = line('$') - 3
2504 let names = sort(keys(filter(copy(g:plugs),
2505 \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)')))
2506 for name in reverse(names)
2507 let sha = s:system_chomp('git rev-parse --short HEAD', g:plugs[name].dir)
2508 if !empty(sha)
2509 call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha))
2510 redraw
2511 endif
2512 endfor
2513
2514 if a:0 > 0
2515 let fn = expand(a:1)
2516 if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?'))
2517 return
2518 endif
2519 call writefile(getline(1, '$'), fn)
2520 echo 'Saved as '.a:1
2521 silent execute 'e' s:esc(fn)
2522 setf vim
2523 endif
2524endfunction
2525
2526function! s:split_rtp()
2527 return split(&rtp, '\\\@<!,')
2528endfunction
2529
2530let s:first_rtp = s:escrtp(get(s:split_rtp(), 0, ''))
2531let s:last_rtp = s:escrtp(get(s:split_rtp(), -1, ''))
2532
2533if exists('g:plugs')
2534 let g:plugs_order = get(g:, 'plugs_order', keys(g:plugs))
2535 call s:upgrade_specs()
2536 call s:define_commands()
2537endif
2538
2539let &cpo = s:cpo_save
2540unlet s:cpo_save
diff --git a/nvim/.config/nvim/coc-settings.json b/nvim/.config/nvim/coc-settings.json
new file mode 100644
index 0000000..872ca3d
--- /dev/null
+++ b/nvim/.config/nvim/coc-settings.json
@@ -0,0 +1,54 @@
1{
2 "suggest.timeout": 500,
3 "coc.source.vimtex.enable": true,
4 "coc.preferences.formatOnSaveFiletypes": [
5 "dart",
6 "python"
7 ],
8 "languageserver": {
9 "bash": {
10 "command": "bash-language-server",
11 "args": ["start"],
12 "filetypes": ["sh"],
13 "ignoredRootPaths": ["~"]
14 },
15 "ccls": {
16 "command": "ccls",
17 "filetypes": ["c", "cpp", "objc", "objcpp"],
18 "rootPatterns": [".ccls", "compile_commands.json", ".vim/", ".git/", ".hg/"],
19 "initializationOptions": {
20 "cache": {
21 "directory": "/tmp/ccls"
22 },
23 "cformatpath": "/bin/clang-format"
24 }
25 },
26 "haskell": {
27 "command": "hie-wrapper",
28 "args": ["--lsp"],
29 "rootPatterns": [
30 "stack.yaml",
31 "cabal.config",
32 "package.yaml"
33 ],
34 "filetypes": [
35 "hs",
36 "lhs",
37 "haskell"
38 ],
39 "initializationOptions": {
40 "languageServerHaskell": {
41 "hlintOn": true
42 }
43 }
44 }
45 },
46 "diagnostic.errorSign": "×",
47 "diagnostic.warningSign": "!",
48 "python.formatting.provider": "black",
49 "python.jediEnabled": true,
50 "rust-analyzer.serverPath": "~/.cargo/bin/rust-analyzer",
51 "rust-analyzer.inlayHints.chainingHints": true,
52 "rust-analyzer.procMacro.enable": true,
53 "rust-analyzer.lruCapacity": 12
54}
diff --git a/nvim/.config/nvim/ftplugin/asm.vim b/nvim/.config/nvim/ftplugin/asm.vim
new file mode 100644
index 0000000..dde370b
--- /dev/null
+++ b/nvim/.config/nvim/ftplugin/asm.vim
@@ -0,0 +1 @@
syntax off
diff --git a/nvim/.config/nvim/ftplugin/javascript.vim b/nvim/.config/nvim/ftplugin/javascript.vim
new file mode 100644
index 0000000..454c153
--- /dev/null
+++ b/nvim/.config/nvim/ftplugin/javascript.vim
@@ -0,0 +1,8 @@
1setlocal tabstop=2
2setlocal shiftwidth=2
3setlocal softtabstop=2
4setlocal formatoptions=croq
5setlocal expandtab
6setlocal autoindent
7setlocal smarttab
8
diff --git a/nvim/.config/nvim/ftplugin/python.vim b/nvim/.config/nvim/ftplugin/python.vim
new file mode 100644
index 0000000..2a918fb
--- /dev/null
+++ b/nvim/.config/nvim/ftplugin/python.vim
@@ -0,0 +1,7 @@
1setlocal tabstop=4
2setlocal softtabstop=4
3setlocal shiftwidth=4
4setlocal expandtab
5setlocal autoindent
6setlocal smarttab
7setlocal formatoptions=croql
diff --git a/nvim/.config/nvim/ftplugin/rust.vim b/nvim/.config/nvim/ftplugin/rust.vim
new file mode 100644
index 0000000..cfd90ec
--- /dev/null
+++ b/nvim/.config/nvim/ftplugin/rust.vim
@@ -0,0 +1 @@
setlocal ts=4 sts=4 sw=4 expandtab
diff --git a/nvim/.config/nvim/ftplugin/scheme.vim b/nvim/.config/nvim/ftplugin/scheme.vim
new file mode 100644
index 0000000..ac0ba6e
--- /dev/null
+++ b/nvim/.config/nvim/ftplugin/scheme.vim
@@ -0,0 +1,10 @@
1setlocal tabstop=2
2setlocal softtabstop=2
3setlocal shiftwidth=2
4setlocal expandtab
5setlocal autoindent
6setlocal smarttab
7setlocal formatoptions=croql
8
9CocDisable
10let b:AutoPairs = {"(": ")", "[": "]", "{": "}", '"': '"' }
diff --git a/nvim/.config/nvim/ftplugin/tex.vim b/nvim/.config/nvim/ftplugin/tex.vim
new file mode 100644
index 0000000..2b63637
--- /dev/null
+++ b/nvim/.config/nvim/ftplugin/tex.vim
@@ -0,0 +1,3 @@
1setlocal wrap
2nnoremap j gj
3nnoremap k gk
diff --git a/nvim/.config/nvim/ftplugin/typescript.vim b/nvim/.config/nvim/ftplugin/typescript.vim
new file mode 100644
index 0000000..c6132bb
--- /dev/null
+++ b/nvim/.config/nvim/ftplugin/typescript.vim
@@ -0,0 +1,7 @@
1setlocal tabstop=2
2setlocal shiftwidth=2
3setlocal softtabstop=2
4setlocal formatoptions=croq
5setlocal expandtab
6setlocal autoindent
7setlocal smarttab
diff --git a/nvim/.config/nvim/init.vim b/nvim/.config/nvim/init.vim
new file mode 100644
index 0000000..3de2adb
--- /dev/null
+++ b/nvim/.config/nvim/init.vim
@@ -0,0 +1,185 @@
1let &t_ZM = "\e[3m"
2
3" vim-plugs
4call plug#begin('~/.local/share/nvim/plugged')
5
6Plug 'airblade/vim-gitgutter'
7Plug 'andymass/vim-matchup'
8Plug 'godlygeek/tabular'
9Plug 'jiangmiao/auto-pairs'
10Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
11Plug 'junegunn/fzf.vim'
12Plug 'mattn/emmet-vim', {'for': ['javascript.jsx', 'html', 'css']}
13Plug 'neoclide/coc.nvim', {'do': { -> coc#util#install()}, 'branch': 'release'}
14Plug 'wellle/targets.vim'
15Plug 'editorconfig/editorconfig-vim'
16
17" tpope
18Plug 'tpope/vim-repeat'
19Plug 'tpope/vim-surround'
20Plug 'tpope/vim-unimpaired'
21Plug 'tpope/vim-fugitive'
22
23" syntax and friends
24Plug 'leafgarland/typescript-vim', {'for' : 'typescript'}
25Plug 'mxw/vim-jsx', {'for' : 'javascript.jsx'}
26Plug 'pangloss/vim-javascript', {'for' : ['javascript.jsx', 'javascript']}
27Plug 'rust-lang/rust.vim', {'for': 'rust'}
28Plug 'lervag/vimtex', {'for': 'tex'}
29Plug 'neovimhaskell/haskell-vim', {'for': 'haskell'}
30
31" colorschemes
32Plug 'nerdypepper/agila.vim'
33Plug 'nerdypepper/chestnut.vim'
34Plug 'nerdypepper/vim-colors-plain', { 'branch': 'duotone' }
35
36call plug#end()
37
38" augroups
39
40augroup plaintext
41 autocmd!
42 autocmd FileType text,markdown setlocal ts=2 sts=2 sw=2 expandtab textwidth=60
43augroup END
44
45augroup webdev
46 autocmd!
47 autocmd FileType less,css,html,js?,ts? setlocal ts=2 sts=2 sw=2 expandtab
48 autocmd FileType less,css,html nnoremap <Leader>s viB:sort<cr>
49augroup END
50
51augroup restorecursor
52 autocmd BufReadPost *
53 \ if line("'\"") > 1 && line("'\"") <= line("$") |
54 \ execute "normal! g`\"" |
55 \ endif
56augroup END
57
58" general settings
59set nobackup
60set nowritebackup
61set noswapfile " get rid of swapfiles everywhere
62set dir=/tmp
63
64syntax on
65
66set omnifunc=syntaxcomplete#Complete
67set completefunc=LanguageClient#complete
68set list
69filetype off
70filetype plugin indent on
71set laststatus=2
72set nowrap
73set noshowmode
74set listchars=tab:┊\ ,nbsp:␣,trail:·,extends:>,precedes:<
75set fillchars=vert:\│
76set ignorecase
77set smartcase
78set sidescroll=40
79set incsearch
80set hlsearch
81set undofile
82set undodir=~/tmp
83set path+=**
84set backspace=indent,eol,start
85set hidden
86set wildmenu
87set foldmethod=manual
88set complete=.,w,b,i,u,t,
89set background=dark
90set mouse=a
91set conceallevel=0
92set nocursorline
93set nonumber
94set grepprg=rg\ --vimgrep\ --no-heading
95set grepformat=%f:%l:%c:%m,%f:%l:%m
96set cmdheight=2
97set shortmess+=c
98set updatetime=300
99set signcolumn=yes
100set inccommand=split
101
102let g:netrw_browsex_viewer= "xdg-open"
103
104colorscheme plain
105
106set shiftwidth=4 " indent = 4 spaces
107set expandtab
108set tabstop=4 " tab = 4 spaces
109set softtabstop=4 " backspace through spaces
110
111" Functions
112function! GetTabber() " a lil function that integrates well with Tabular.vim
113 let c = nr2char(getchar())
114 :execute 'Tabularize /' . c
115endfunction
116
117" Ugh
118:command! WQ wq
119:command! Wq wq
120:command! Wqa wqa
121:command! W w
122:command! Q q
123
124" abbreviations
125abclear
126iab #i #include
127iab #d #define
128cab dst put =strftime('%d %a, %b %Y')<cr>
129cab vg vimgrep
130
131
132" plugin settings
133
134" emmet
135let g:user_emmet_mode='a'
136let g:user_emmet_leader_key='<C-X>'
137
138" gitgutter
139let g:gitgutter_override_sign_column_highlight = 0
140let g:gitgutter_sign_added = '+' " '┃'
141let g:gitgutter_sign_modified = '~' " '┃'
142let g:gitgutter_sign_removed = '-' " '┃'
143let g:gitgutter_sign_removed_first_line = '-' " '┃'
144let g:gitgutter_sign_modified_removed = '~' " '┃'
145
146highlight GitGutterAdd ctermfg=8
147highlight GitGutterChange ctermfg=8
148highlight GitGutterDelete ctermfg=8
149
150" rust.vim
151let g:rustfmt_autosave = 1
152
153" fzf colors
154let g:fzf_colors =
155\ { 'fg': ['fg', 'Normal'],
156 \ 'bg': ['bg', 'Normal'],
157 \ 'hl': ['fg', 'Comment'],
158 \ 'fg+': ['fg', 'CursorLine', 'CursorColumn', 'Normal'],
159 \ 'bg+': ['bg', 'CursorLine', 'CursorColumn'],
160 \ 'hl+': ['fg', 'Statement'],
161 \ 'info': ['fg', 'PreProc'],
162 \ 'border': ['fg', 'Ignore'],
163 \ 'prompt': ['fg', 'Conditional'],
164 \ 'pointer': ['fg', 'Exception'],
165 \ 'marker': ['fg', 'Keyword'],
166 \ 'spinner': ['fg', 'Label'],
167 \ 'header': ['fg', 'Comment'] }
168
169" indentLine
170let g:indentLine_setColors = 0
171let g:indentLine_char = '┆'
172
173let g:latex_view_general_viewer = 'zathura'
174let g:vimtex_view_method = "zathura"
175
176" man pages
177let g:ft_man_open_mode = 'tab'
178
179" vim-matchup
180let g:matchup_matchparen_deferred = 1
181let g:matchup_matchparen_hi_surround_always = 1
182
183" coc-nvim
184hi CocHintSign ctermfg=7
185let g:python3_host_prog="/usr/bin/python3"
diff --git a/nvim/.config/nvim/plugin/help.vim b/nvim/.config/nvim/plugin/help.vim
new file mode 100644
index 0000000..9e1c998
--- /dev/null
+++ b/nvim/.config/nvim/plugin/help.vim
@@ -0,0 +1,16 @@
1" Only apply to .txt files...
2augroup HelpInTabs
3 autocmd!
4 autocmd BufEnter *.txt call HelpInNewTab()
5augroup END
6
7" Only apply to help files...
8function! HelpInNewTab ()
9 if &buftype == 'help' && g:help_in_tabs
10 "Convert the help window to a tab...
11 execute "normal \<C-W>T"
12 endif
13endfunction
14
15let g:help_in_tabs = 1
16
diff --git a/nvim/.config/nvim/plugin/ignores.vim b/nvim/.config/nvim/plugin/ignores.vim
new file mode 100644
index 0000000..3ab37f0
--- /dev/null
+++ b/nvim/.config/nvim/plugin/ignores.vim
@@ -0,0 +1,11 @@
1set wildignore+=.git,.hg,.svn
2set wildignore+=*.aux,*.out,*.toc
3set wildignore+=*.o,*.obj,*.exe,*.dll,*.manifest,*.rbc,*.class
4set wildignore+=*.ai,*.bmp,*.gif,*.ico,*.jpg,*.jpeg,*.png,*.psd,*.webp
5set wildignore+=*.avi,*.divx,*.mp4,*.webm,*.mov,*.m2ts,*.mkv,*.vob,*.mpg,*.mpeg
6set wildignore+=*.mp3,*.oga,*.ogg,*.wav,*.flac
7set wildignore+=*.eot,*.otf,*.ttf,*.woff
8set wildignore+=*.doc,*.pdf,*.cbr,*.cbz
9set wildignore+=*.zip,*.tar.gz,*.tar.bz2,*.rar,*.tar.xz,*.kgb
10set wildignore+=*.swp,.lock,.DS_Store,._*
11
diff --git a/nvim/.config/nvim/plugin/maps.vim b/nvim/.config/nvim/plugin/maps.vim
new file mode 100644
index 0000000..55990d2
--- /dev/null
+++ b/nvim/.config/nvim/plugin/maps.vim
@@ -0,0 +1,78 @@
1mapclear
2
3let mapleader=' '
4
5" clipboard
6map <leader>cc :w !xclip -sel c<CR>
7
8" normal
9nnoremap <Leader>o : only<cr>
10" nnoremap <Leader>l : Lines<cr>
11nnoremap <Leader>b : Buffers<cr>
12nnoremap <Leader>n : bnext<cr>
13nnoremap <Leader>p : bprev<cr>
14nnoremap <Leader>z : FZF<cr>
15nnoremap <Leader>l : Lines<cr>
16nnoremap <Leader>w : MtaJumpToOtherTag<cr>
17nnoremap <Leader>t : call GetTabber()<cr>
18nnoremap <Leader><ESC> : nohlsearch<cr>
19nnoremap <C-l> :nohlsearch<cr>:diffupdate<cr>:syntax sync fromstart<cr><c-l>
20nnoremap H H:exec 'norm! '. &scrolloff . 'k'<cr>
21nnoremap L L:exec 'norm! '. &scrolloff . 'j'<cr>
22nnoremap <expr> gb '`[' . strpart(getregtype(), 0, 1) . '`]'
23
24
25nnoremap <F10> :echo "hi<" . synIDattr(synID(line("."),col("."),1),"name") . '> trans<'
26 \ . synIDattr(synID(line("."),col("."),0),"name") . "> lo<"
27 \ . synIDattr(synIDtrans(synID(line("."),col("."),1)),"name") . ">"<CR>
28
29cmap w!! %!sudo tee > /dev/null %
30
31" visual
32vnoremap > >gv
33vnoremap < <gv
34
35" operator-pending
36onoremap ax a`
37onoremap ix i`
38
39" visual block
40xnoremap + g<C-a>
41xnoremap - g<C-x>
42
43" COC keymaps
44inoremap <silent><expr> <TAB>
45 \ pumvisible() ? "\<C-n>" :
46 \ <SID>check_back_space() ? "\<TAB>" :
47 \ coc#refresh()
48inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"
49
50function! s:check_back_space() abort
51 let col = col('.') - 1
52 return !col || getline('.')[col - 1] =~# '\s'
53endfunction
54
55inoremap <silent><expr> <c-space> coc#refresh()
56
57inoremap <expr> <cr> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
58
59nmap <silent> [g <Plug>(coc-diagnostic-prev)
60nmap <silent> ]g <Plug>(coc-diagnostic-next)
61nmap <silent> gd <Plug>(coc-definition)
62nmap <silent> gy <Plug>(coc-type-definition)
63nmap <silent> gr <Plug>(coc-references)
64
65nnoremap <silent> K :call <SID>show_documentation()<CR>
66
67function! s:show_documentation()
68 if (index(['vim','help'], &filetype) >= 0)
69 execute 'h '.expand('<cword>')
70 else
71 call CocAction('doHover')
72 endif
73endfunction
74
75nmap <leader>rn <Plug>(coc-rename)
76
77xmap <leader>f <Plug>(coc-format-selected)
78nmap <leader>f <Plug>(coc-format-selected)
diff --git a/nvim/.config/nvim/plugin/statusline.vim b/nvim/.config/nvim/plugin/statusline.vim
new file mode 100644
index 0000000..a25fb6d
--- /dev/null
+++ b/nvim/.config/nvim/plugin/statusline.vim
@@ -0,0 +1,136 @@
1scriptencoding utf-8
2
3" statusline
4
5let g:currentmode={
6 \ 'n' : 'NORMAL ',
7 \ 'no' : 'N·OPERATOR PENDING ',
8 \ 'v' : 'VISUAL ',
9 \ 'V' : 'V·LINE ',
10 \ '' : 'V·BLOCK ',
11 \ 's' : 'SELECT ',
12 \ 'S' : 'S·LINE ',
13 \ '' : 'S·BLOCK ',
14 \ 'i' : 'INSERT ',
15 \ 'R' : 'REPLACE ',
16 \ 'Rv' : 'V·REPLACE ',
17 \ 'c' : 'COMMAND ',
18 \ 'cv' : 'VIM EX ',
19 \ 'ce' : 'EX ',
20 \ 'r' : 'PROMPT ',
21 \ 'rm' : 'MORE ',
22 \ 'r?' : 'CONFIRM ',
23 \ '!' : 'SHELL ',
24 \ 't' : 'TERMINAL '}
25
26hi PrimaryBlock ctermfg=00 ctermbg=6
27hi SecondaryBlock ctermfg=07 ctermbg=10
28hi Blanks ctermfg=11 ctermbg=0
29
30hi User1 ctermfg=01 ctermbg=0
31hi User2 ctermfg=02 ctermbg=0
32hi User3 ctermfg=03 ctermbg=0
33hi User4 ctermfg=04 ctermbg=0
34hi User5 ctermfg=05 ctermbg=0
35hi User6 ctermfg=06 ctermbg=0
36hi User7 ctermfg=07 ctermbg=0
37hi User8 ctermfg=08 ctermbg=0
38hi User9 ctermfg=09 ctermbg=0
39
40highlight EndOfBuffer ctermfg=black ctermbg=black
41
42function! GitBranch()
43 return system("git rev-parse --abbrev-ref HEAD 2>/dev/null | tr -d '\n'")
44endfunction
45
46function! StatuslineGit()
47 let l:branchname = GitBranch()
48 return strlen(l:branchname) > 0?' '.l:branchname.' ':''
49endfunction
50
51function! ReadOnly() abort
52 if !&modifiable && &readonly
53 return ' RO'
54 elseif &modifiable && &readonly
55 return 'RO'
56 elseif !&modifiable && !&readonly
57 return ''
58 else
59 return ''
60 endif
61endfunction
62
63function! Filepath() abort
64 let l:basename = expand('%:h')
65 let l:filename = expand('%:t')
66 let l:extension = expand('%:e')
67 let l:prefix = (l:basename ==# '' || l:basename ==# '.') ?
68 \ '' : substitute(l:basename . '/', '\C^' . $HOME, '~', '')
69
70 if empty(l:prefix) && empty(l:filename)
71 return printf('%%8*%%f%%*%s %%m%%*', '%8*')
72 elseif empty(l:prefix)
73 return printf('%%8*%%f%%*%s %%m%%*', '%6*')
74 else
75 return printf('%%8*%s%%*%s%s%%*', l:prefix, &modified ? '%6*' : '%8*', l:filename)
76 endif
77endfunction
78
79function! LinterStatus() abort
80 let info = get(b:, 'coc_diagnostic_info', {})
81 if empty(info) | return '' | endif
82 let msgs = []
83 if get(info, 'error', 0)
84 call add(msgs, printf('%%5*%s×%%*', info['error']))
85 endif
86 if get(info, 'warning', 0)
87 call add(msgs, printf('%%3*%s!%%*', info['warning']))
88 endif
89 return join(msgs, ' ')
90endfunction
91
92function! StatusLine(mode) abort
93 let l:line=''
94
95 " help or man pages
96 if &filetype ==# 'help' || &filetype ==# 'man'
97 let l:line.=' %#StatusLineNC# ['. &filetype .'] %f '
98 return l:line
99 endif
100
101 " active
102 if a:mode ==# 'active'
103 let l:line.='%7*%{StatuslineGit()}'
104 let l:line.='%<'
105 let l:line.=Filepath()
106
107 let l:line.='%5*'
108 let l:line.=' %{ReadOnly()} %w%*'
109 let l:line.='%9* %=%*'
110
111 let l:line.='%7* %l,%c %*'
112 let l:line.='%8* %{g:currentmode[mode()]}%*'
113 let l:line.=' '
114 let l:line.=LinterStatus()
115 let l:line.=' '
116 let l:line.='%8*'. &filetype
117
118 else
119 " inactive
120 let l:line.='%#Blanks#'
121 let l:line.='%f %5*%m%*'
122 let l:line.='%#Blanks# %=%*'
123 endif
124
125 let l:line.='%*'
126
127 return l:line
128endfunction
129
130set statusline=%!StatusLine('active')
131augroup MyStatusLine
132 autocmd!
133 autocmd WinEnter * setl statusline=%!StatusLine('active')
134 autocmd WinLeave * setl statusline=%!StatusLine('inactive')
135augroup END
136
diff --git a/nvim/.config/nvim/plugin/textobjs.vim b/nvim/.config/nvim/plugin/textobjs.vim
new file mode 100644
index 0000000..16f9a46
--- /dev/null
+++ b/nvim/.config/nvim/plugin/textobjs.vim
@@ -0,0 +1,27 @@
1" line text-objects
2xnoremap il g_o^
3onoremap il :normal vil<CR>
4xnoremap al $o0
5onoremap al :normal val<CR>
6
7" buffer text-objects
8" -------------------
9" i% a%
10xnoremap i% :<C-u>let z = @/\|1;/^./kz<CR>G??<CR>:let @/ = z<CR>V'z
11onoremap i% :normal vi%<CR>
12xnoremap a% GoggV
13onoremap a% :normal va%<CR>
14
15" comment text-objects
16" --------------------
17" i? a?
18xnoremap <buffer> i? ?/\*<CR>o/\*\/<CR>
19onoremap <buffer> i? :normal vi?<CR>
20
21" square brackets text-objects
22" ----------------------------
23" ir ar
24xnoremap ir i[
25xnoremap ar a[
26onoremap ir :normal vi[<CR>
27onoremap ar :normal va[<CR>
diff --git a/nvim/.config/nvim/syntax/proto.vim b/nvim/.config/nvim/syntax/proto.vim
new file mode 100644
index 0000000..8545631
--- /dev/null
+++ b/nvim/.config/nvim/syntax/proto.vim
@@ -0,0 +1,106 @@
1" Protocol Buffers - Google's data interchange format
2" Copyright 2008 Google Inc. All rights reserved.
3" https://developers.google.com/protocol-buffers/
4"
5" Redistribution and use in source and binary forms, with or without
6" modification, are permitted provided that the following conditions are
7" met:
8"
9" * Redistributions of source code must retain the above copyright
10" notice, this list of conditions and the following disclaimer.
11" * Redistributions in binary form must reproduce the above
12" copyright notice, this list of conditions and the following disclaimer
13" in the documentation and/or other materials provided with the
14" distribution.
15" * Neither the name of Google Inc. nor the names of its
16" contributors may be used to endorse or promote products derived from
17" this software without specific prior written permission.
18"
19" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20" "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22" A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23" OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29" OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31" This is the Vim syntax file for Google Protocol Buffers.
32"
33" Usage:
34"
35" 1. cp proto.vim ~/.vim/syntax/
36" 2. Add the following to ~/.vimrc:
37"
38" augroup filetype
39" au! BufRead,BufNewFile *.proto setfiletype proto
40" augroup end
41"
42" Or just create a new file called ~/.vim/ftdetect/proto.vim with the
43" previous lines on it.
44
45if version < 600
46 syntax clear
47elseif exists("b:current_syntax")
48 finish
49endif
50
51syn case match
52
53syn keyword pbTodo contained TODO FIXME XXX
54syn cluster pbCommentGrp contains=pbTodo
55
56syn keyword pbSyntax syntax import option
57syn keyword pbStructure package message group oneof
58syn keyword pbRepeat optional required repeated
59syn keyword pbDefault default
60syn keyword pbExtend extend extensions to max reserved
61syn keyword pbRPC service rpc returns
62
63syn keyword pbType int32 int64 uint32 uint64 sint32 sint64
64syn keyword pbType fixed32 fixed64 sfixed32 sfixed64
65syn keyword pbType float double bool string bytes
66syn keyword pbTypedef enum
67syn keyword pbBool true false
68
69syn match pbInt /-\?\<\d\+\>/
70syn match pbInt /\<0[xX]\x+\>/
71syn match pbFloat /\<-\?\d*\(\.\d*\)\?/
72syn region pbComment start="\/\*" end="\*\/" contains=@pbCommentGrp
73syn region pbComment start="//" skip="\\$" end="$" keepend contains=@pbCommentGrp
74syn region pbString start=/"/ skip=/\\./ end=/"/
75syn region pbString start=/'/ skip=/\\./ end=/'/
76
77if version >= 508 || !exists("did_proto_syn_inits")
78 if version < 508
79 let did_proto_syn_inits = 1
80 command -nargs=+ HiLink hi link <args>
81 else
82 command -nargs=+ HiLink hi def link <args>
83 endif
84
85 HiLink pbTodo Todo
86
87 HiLink pbSyntax Include
88 HiLink pbStructure Structure
89 HiLink pbRepeat Repeat
90 HiLink pbDefault Keyword
91 HiLink pbExtend Keyword
92 HiLink pbRPC Keyword
93 HiLink pbType Type
94 HiLink pbTypedef Typedef
95 HiLink pbBool Boolean
96
97 HiLink pbInt Number
98 HiLink pbFloat Float
99 HiLink pbComment Comment
100 HiLink pbString String
101
102 delcommand HiLink
103endif
104
105let b:current_syntax = "proto"
106
diff --git a/polybar/.config/polybar/config b/polybar/.config/polybar/config
new file mode 100644
index 0000000..b7cd3ce
--- /dev/null
+++ b/polybar/.config/polybar/config
@@ -0,0 +1,234 @@
1; ---------- global --------------
2
3[colors]
4foreground = ${xrdb:color7}
5foreground_bright = ${xrdb:color8}
6background = ${xrdb:color0}
7modb = ${xrdb:color11}
8modb1 = ${xrdb:color0}
9modb2 = ${xrdb:color0}
10red = ${xrdb:color1}
11orange = ${xrdb:color9}
12yellow = ${xrdb:color3}
13green = ${xrdb:color2}
14cyan = ${xrdb:color6}
15blue = ${xrdb:color4}
16magenta = ${xrdb:color5}
17brown = ${xrdb:color7}
18
19[global/wm]
20margin-top = 0
21margin-bottom = 0
22override-redirect = true
23
24
25; ------------ bars ---------------
26
27[bar/time]
28width = 400
29height = 70
30offset-x = 20
31offset-y = 1010
32locale = en_US.UTF-8
33background = #00FFFFFF
34foreground = ${colors.foreground}
35modules-left = time
36modules-center =
37modules-right =
38padding = 0
39font-0 = undefined:size=18:antialias=true;0
40
41[bar/date]
42width = 400
43height = 70
44offset-x = 20
45offset-y = 960
46locale = en_US.UTF-8
47background = #00FFFFFF
48foreground = ${colors.foreground}
49modules-left = date
50modules-center =
51modules-right =
52padding = 0
53radius = 0
54font-0 = undefined:size=18:antialias=true;0
55font-1 = scientifica:size=18:antialias=true;0
56
57[bar/music]
58width = 400
59height = 70
60offset-x = 20
61offset-y = 20
62locale = en_US.UTF-8
63background = #00FFFFFF
64foreground = ${colors.foreground}
65modules-left = cmusnp
66modules-center =
67modules-right =
68padding = 0
69radius = 0
70font-0 = undefined:size=18:antialias=true;0
71font-1 = scientifica:size=18:antialias=true;0
72
73
74; ---------- modules ---------------
75
76[module/workspace]
77type = custom/script
78interval = 0.01
79exec = echo $(( $(xprop -root _NET_CURRENT_DESKTOP | sed -e 's/_NET_CURRENT_DESKTOP(CARDINAL) = //') + 1))
80format-padding = 2
81format-font = 1
82
83[module/date]
84type = custom/script
85interval = 1.0
86exec = /home/np/scripts/date.sh
87format-prefix-foreground = ${colors.green}
88format-padding = 0
89format-foreground = ${colors.foreground}
90
91
92[module/time]
93type = custom/script
94interval = 1.0
95exec = echo "$(date +%p) $(date +%I:%M)"
96format-prefix-foreground = ${colors.green}
97format-padding = 0
98format-foreground = ${colors.foreground}
99
100[module/music_pop]
101type = custom/script
102format-text = <label>
103label = 
104interval = 1.0
105exec = echo label
106click-left = /home/np/scripts/hidebars.sh -s
107click-right = /home/np/scripts/hidebars.sh -h
108format-padding = 1
109format-foreground = ${colors.foreground}
110format-background = ${colors.background}
111
112[module/previous]
113type = custom/script
114format-text = <label>
115label = 
116exec = echo label
117click-left = cmus-remote -r -p && ~/scripts/popups/cover.sh
118click-right = wmctrl -s 5
119format-foreground = ${colors.green}
120format-background = ${colors.background}
121format-padding = 1
122
123[module/next]
124type = custom/script
125format-text = <label>
126label = 
127exec = echo label
128click-left = cmus-remote -n -p && ~/scripts/popups/cover.sh
129click-right = wmctrl -s 5
130format-foreground = ${colors.green}
131format-background = ${colors.background}
132format-padding = 1
133
134[module/playpause]
135type = custom/script
136exec = exec ~/scripts/playpause.sh
137click-left = cmus-remote -u
138click-right = wmctrl -s 5
139interval = 1
140scroll-up = exec amixer sset Master 2%+
141scroll-down = exec amixer sset Master 2%-
142format-foreground = ${colors.green}
143format-background = ${colors.background}
144format-padding = 1
145
146[module/2bws]
147type = custom/script
148exec = bash ~/scripts/2bws.sh
149interval = 0.01
150format-padding = 3
151format-foreground = ${colors.background}
152scroll-up = exec ~/scripts/wscycle.sh -f
153scroll-down = exec ~/scripts/wscycle.sh -r
154
155[module/bat]
156type = custom/script
157exec = ~/scripts/bat -i
158interval = 100
159format-padding = 4
160format-background = ${colors.background}
161format-foreground = ${colors.foreground}
162
163[module/vol]
164type = custom/script
165exec = ~/scripts/vol -q
166interval = 0.01
167format-padding = 2
168scroll-up = ~/scripts/vol -i
169scroll-down = ~/scripts/vol -d
170
171[module/net]
172type = custom/script
173exec = exec ~/scripts/netwrk.sh
174interval = 5
175format-padding = 2
176format-background = ${colors.foreground}
177click-left = urxvtc -g 50x22 -b 0 -e nmtui
178
179[module/album]
180type = custom/script
181exec = ~/scripts/music.sh -b
182interval = 2
183format-padding = 2
184click-left = cmus-remote -u
185scroll-up = exec amixer sset Master 2%+
186scroll-down = exec amixer sset Master 2%-
187
188[module/artist]
189type = custom/script
190exec = ~/scripts/music.sh -a
191interval = 2
192format-padding = 2
193click-left = cmus-remote -u
194scroll-up = exec amixer sset Master 2%+
195scroll-down = exec amixer sset Master 2%-
196
197[module/track]
198type = custom/script
199exec = ~/scripts/music.sh -t
200interval = 2
201format-padding = 2
202click-left = cmus-remote -u
203scroll-up = exec amixer sset Master 2%+
204scroll-down = exec amixer sset Master 2%-
205
206[module/cmusnp]
207type = custom/script
208interval = 0.1
209format-text = <label>
210exec = bash ~/scripts/cmusnp.sh
211click-left = cmus-remote -u
212click-right = wmctrl -s 5
213scroll-up = exec amixer sset Master 2%+
214scroll-down = exec amixer sset Master 2%-
215format-foreground = ${colors.foreground}
216padding = 0
217
218[module/brit]
219type = custom/script
220exec = echo "$( light -b | sed 's/\..*//' )%"
221scroll-up = exec light -A 3
222scroll-down = exec light -U 3
223click-left = redshift -O 4000
224click-right = redshift -O 6500
225format-foreground = ${colors.foreground
226format-padding = 2
227interval = 0.01
228
229[module/separator]
230type = custom/script
231format-text = <label>
232label = " "
233exec = echo label
234format-foreground = ${colors.foreground}
diff --git a/scripts/scripts/2bws.sh b/scripts/scripts/2bws.sh
new file mode 100755
index 0000000..6f81baa
--- /dev/null
+++ b/scripts/scripts/2bws.sh
@@ -0,0 +1,40 @@
1#!/usr/bin/env bash
2# display workspace status
3# requires wmctrl
4
5# get the current workspace
6ws=$( xprop -root _NET_CURRENT_DESKTOP | sed -e 's/_NET_CURRENT_DESKTOP(CARDINAL) = //' )
7
8# icons
9CURRENT=●
10OCCUPIED=●
11UNOCCUPIED=·
12
13# colors
14current="$( ~/scripts/get_xres color5 )"
15occupied="$( ~/scripts/get_xres color8 )"
16unoccupied="$( ~/scripts/get_xres color8 )"
17
18# print workspaces to stdout
19draw() {
20 for i in {0..5}; do
21 # get the number of windows in each workspace
22 windows=$( wmctrl -l | cut -d ' ' -f3 | grep $i | wc -l )
23
24
25 if [[ $i -eq $ws ]]
26 then
27 # current workspace
28 echo -ne "%{F$current} $CURRENT "
29 else
30 if [[ $windows -eq 0 ]]
31 then
32 echo -ne "%{F$unoccupied} $UNOCCUPIED "
33 else
34 echo -ne "%{F$occupied} $OCCUPIED "
35 fi
36 fi
37 done
38}
39
40draw
diff --git a/scripts/scripts/bar.sh b/scripts/scripts/bar.sh
new file mode 100755
index 0000000..1903462
--- /dev/null
+++ b/scripts/scripts/bar.sh
@@ -0,0 +1,75 @@
1#! /usr/bin/env bash
2
3
4fg="$(get_xres color15)"
5fg_light="$(get_xres color10)"
6bg="$(get_xres color0)"
7# %{F$fg} $(date +%d/%m) %{F$fg_light} $(date +%Y)
8
9(while true; do echo -e "\n$(date +%H)\n$(date +%M)\n"; sleep 10; done) | dzen2 \
10 -e "onstart=uncollapse;" \
11 -fg "$fg" \
12 -bg "$fg_light" \
13 -tw 0 \
14 -l 3 \
15 -x 20 \
16 -y 600 \
17 -w 70 \
18 -h 30 \
19 -sa c \
20 -p &
21
22(echo -e "\n"; while true; do echo -e "$(bat -i)"; sleep 1; done )| dzen2 \
23 -e "onstart=uncollapse;" \
24 -fg "$fg" \
25 -bg "$fg_light" \
26 -tw 70 \
27 -l 4 \
28 -x 20 \
29 -y 500 \
30 -w 70 \
31 -h 15 \
32 -sa c \
33 -p &
34
35ws=$( xprop -root _NET_CURRENT_DESKTOP | sed -e 's/_NET_CURRENT_DESKTOP(CARDINAL) = //' )
36
37# colors
38current="$( ~/scripts/get_xres color5 )"
39occupied="$( ~/scripts/get_xres color8 )"
40unoccupied="$( ~/scripts/get_xres color8 )"
41
42# print workspaces to stdout
43draw() {
44 for i in {0..5}; do
45 # get the number of windows in each workspace
46 windows=$( wmctrl -l | cut -d ' ' -f3 | grep $i | wc -l )
47
48
49 if [[ $i -eq $ws ]]
50 then
51 # current workspace
52 echo -ne "^($current)O"
53 else
54 if [[ $windows -eq 0 ]]
55 then
56 echo -ne "^($unoccupied)o"
57 else
58 echo -ne "^($occupied)x"
59 fi
60 fi
61 done
62}
63
64# echo -e "\n\n$(draw)\n" | dzen2 \
65# -e "onstart=uncollapse;" \
66# -fg "$fg" \
67# -bg "$fg_light" \
68# -tw 70 \
69# -l 4 \
70# -x 20 \
71# -y 500 \
72# -w 70 \
73# -h 15 \
74# -sa c \
75# -p &
diff --git a/scripts/scripts/bat b/scripts/scripts/bat
new file mode 100755
index 0000000..6746d82
--- /dev/null
+++ b/scripts/scripts/bat
@@ -0,0 +1,56 @@
1#!/usr/bin/env bash
2
3red="\e[31m"
4grn="\e[32m"
5ylw="\e[33m"
6cyn="\e[36m"
7blu="\e[34m"
8prp="\e[35m"
9bprp="\e[35;1m"
10rst="\e[0m"
11
12icon="$( ~/scripts/get_xres color4 )"
13fg="$( ~/scripts/get_xres color8 )"
14
15bat_status=""
16bat_status=$( cat /sys/class/power_supply/BAT0/capacity )
17charging_status=$( cat /sys/class/power_supply/BAT0/status )
18
19health() {
20 for i in {0..4}
21 do
22 if [[ $i -le $(( $bat_status/20 )) ]]; then
23 echo -ne "#[fg=colour1]• "
24 else
25 echo -ne "#[fg=colour8]• "
26 fi
27 done
28 echo
29}
30
31bat_status_small() {
32 if [[ "$charging_status" = *Charging* ]]; then
33 echo -ne "+$bat_status%"
34 else
35 echo -ne "$bat_status%"
36 fi
37}
38
39[ -z "$1" ] && {
40 bat_status_small
41}
42
43while getopts qi options
44do
45 case $options in
46 i)
47 bat_status_small
48 ;;
49 q)
50 if [[ "$charging_status" = *Charging* ]]; then
51 echo -ne "+ $(health)"
52 else
53 health
54 fi
55 esac
56done
diff --git a/scripts/scripts/bluetooth.sh b/scripts/scripts/bluetooth.sh
new file mode 100755
index 0000000..85b7f08
--- /dev/null
+++ b/scripts/scripts/bluetooth.sh
@@ -0,0 +1,14 @@
1#!/usr/bin/env bash
2
3connections=$( hcitool con )
4devices=$( hcitool dev | wc -l )
5
6if [ $devices = 1 ]
7then
8 echo -n ""
9elif [[ $devices > 1 && $connections = "Connections:" ]]
10then
11 echo -n ""
12else
13 echo -n ""
14fi
diff --git a/scripts/scripts/blur.sh b/scripts/scripts/blur.sh
new file mode 100755
index 0000000..9349b03
--- /dev/null
+++ b/scripts/scripts/blur.sh
@@ -0,0 +1,25 @@
1#! /usr/bin/env bash
2
3state="unblurred"
4while :; do
5 current_workspace="$(xprop -root _NET_CURRENT_DESKTOP | awk '{print $3}')"
6 if [[ -n "$current_workspace" ]]; then
7 num_windows="$(echo "$(wmctrl -l)" | awk -F" " '{print $2}' | grep ^$current_workspace)"
8 if [ -n "$num_windows" ]; then
9 if [ "$state" != "blurred" ]; then
10 for i in {0..6}; do
11 feh --bg-fill ~/pics/blurs/busy"$i".jpg
12 done
13 fi
14 state="blurred"
15 else
16 if [ "$state" != "unblurred" ]; then
17 for i in $(seq 5 -1 0); do
18 feh --bg-fill ~/pics/blurs/busy"$i".jpg
19 done
20 feh --bg-fill ~/pics/blurs/busy.jpg
21 fi
22 state="unblurred"
23 fi
24 fi
25done
diff --git a/scripts/scripts/cmusnp.sh b/scripts/scripts/cmusnp.sh
new file mode 100755
index 0000000..b43c7e8
--- /dev/null
+++ b/scripts/scripts/cmusnp.sh
@@ -0,0 +1,45 @@
1#!/usr/bin/env bash
2# Display currently playing song from cmus
3# Requires cmus
4
5# colors
6active="$( ~/scripts/get_xres color7 )"
7inactive="$( ~/scripts/get_xres color7 )"
8
9np_string=""
10
11trunc() {
12 max_length=$1
13 text=$2
14 length=${#text}
15 (( length > max_length )) &&
16 text=${text::$(( max_length ))}...
17 echo "$text"
18}
19
20if pgrep -x "cmus" > /dev/null
21then
22 status=$( cmus-remote -Q | grep status\ | sed 's/status //' )
23 artist=$( cmus-remote -Q | grep tag\ artist\ | sed 's/tag artist //' )
24 title=$( cmus-remote -Q | grep tag\ title\ | sed 's/tag title //' )
25
26 np_string="$title - $artist"
27 np_string=$( trunc 35 "$np_string" )
28
29 spc=$(( $(( 32 - ${#np_string} ))/2 ))
30 spc="$( printf "%${spc}s" )"
31
32 if [[ "$status" = *playing* ]]
33 then
34 echo -ne "%{F#FF0000}%{F#FFFFFF}PAUSE"
35 elif [[ "$status" = *paused* ]]
36 then
37 echo -ne "PLAY"
38 elif [[ "$status" = *stopped* ]]
39 then
40 echo -ne "START"
41 fi
42
43else
44 echo
45fi
diff --git a/scripts/scripts/date.sh b/scripts/scripts/date.sh
new file mode 100755
index 0000000..f97bdc9
--- /dev/null
+++ b/scripts/scripts/date.sh
@@ -0,0 +1,4 @@
1#! /usr/bin/env bash
2
3month="$(date +%B)"
4printf "%s $(date +%e) $(date +%Y)" "${month^^}"
diff --git a/scripts/scripts/doot b/scripts/scripts/doot
new file mode 100755
index 0000000..defb363
--- /dev/null
+++ b/scripts/scripts/doot
@@ -0,0 +1,53 @@
1#!/usr/bin/env bash
2red="\e[31m"
3grn="\e[32m"
4ylw="\e[33m"
5cyn="\e[36m"
6blu="\e[34m"
7prp="\e[35m"
8bprp="\e[35;1m"
9gry="\e[94m"
10rst="\e[0m"
11
12COL=$(tput cols)
13ROW=$(tput lines)
14((PADY = ROW / 2 - 1 - ${#ENTS[@]} / 2))
15((PADX = COL / 2 - LEN / 2))
16
17for ((i = 0; i < PADX; ++i)); do
18 PADC="$PADC "
19done
20
21for ((i = 0; i < PADY; ++i)); do
22 PADR="$PADR\n"
23done
24clear
25printf "%b" "$PADR"
26
27echo -ne "$ylw$PADC"
28echo -e ' _/_'
29echo -n "$PADC"
30echo -n '/'
31echo -ne "$rst"
32echo -n '`▅_▅'\'''
33echo -ne "$ylw"
34echo '\'
35echo -n "$PADC"
36echo -n '\'
37echo -ne "$prp"
38echo -ne ' vwv '
39echo -ne "$ylw"
40echo -e '/'
41echo -n "$PADC"
42echo -n ' `---'\'''
43
44echo -e "$rst"
45
46for ((i = 0; i < PADX - 5; ++i)); do
47 PADT="$PADT "
48done
49
50echo "$PADT$USER @ $HOSTNAME"
51echo "$PADT$(uptime -p)"
52
53read x
diff --git a/scripts/scripts/draw.sh b/scripts/scripts/draw.sh
new file mode 100755
index 0000000..8e34904
--- /dev/null
+++ b/scripts/scripts/draw.sh
@@ -0,0 +1,11 @@
1#!/usr/bin/env bash
2# Spawn terminals interactively
3# Requires slop, urxvt
4
5read -r X Y W H < <(slop -f "%x %y %w %h" -b 4 -c 0.8,0.8,0.8,0.8 -t 0 )
6(( W /= 14 ))
7(( H /= 25 ))
8
9g=${W}x${H}+${X}+${Y}
10
11urxvtc -geometry $g
diff --git a/scripts/scripts/get_xres b/scripts/scripts/get_xres
new file mode 100755
index 0000000..9276ef4
--- /dev/null
+++ b/scripts/scripts/get_xres
@@ -0,0 +1,3 @@
1#!/usr/bin/env bash
2
3xrdb -query | grep -w $1 | awk '{print $2}'
diff --git a/scripts/scripts/hidebars.sh b/scripts/scripts/hidebars.sh
new file mode 100755
index 0000000..6f449d6
--- /dev/null
+++ b/scripts/scripts/hidebars.sh
@@ -0,0 +1,23 @@
1#!/usr/bin/env bash
2
3pkill n30f
4while getopts hs options
5do
6 case $options in
7 h) # hide
8 pkill -f polybar\ artist
9 pkill -f polybar\ track
10 pkill -f polybar\ album
11 ;;
12 s) # show
13 if pgrep -f polybar\ artist > /dev/null; then
14 ~/scripts/popups/cover.sh
15 else
16 polybar artist &
17 polybar track &
18 polybar album &
19 ~/scripts/popups/cover.sh
20 fi
21 ;;
22 esac
23done
diff --git a/scripts/scripts/img.sh b/scripts/scripts/img.sh
new file mode 100755
index 0000000..baea386
--- /dev/null
+++ b/scripts/scripts/img.sh
@@ -0,0 +1,32 @@
1#!/bin/bash
2
3# z3bra -- 2014-01-21
4# http://blog.z3bra.org/2014/01/images-in-terminal.html
5
6test -z "$1" && exit
7
8W3MIMGDISPLAY="/usr/lib/w3m/w3mimgdisplay"
9FILENAME=$1
10FONTH=14 # Size of one terminal row
11FONTW=8 # Size of one terminal column
12COLUMNS=`tput cols`
13LINES=`tput lines`
14
15read width height <<< `echo -e "5;$FILENAME" | $W3MIMGDISPLAY`
16
17max_width=$(($FONTW * $COLUMNS))
18max_height=$(($FONTH * $(($LINES - 2)))) # substract one line for prompt
19
20if test $width -gt $max_width; then
21height=$(($height * $max_width / $width))
22width=$max_width
23fi
24if test $height -gt $max_height; then
25width=$(($width * $max_height / $height))
26height=$max_height
27fi
28
29w3m_command="0;1;0;0;$width;$height;;;;;$FILENAME\n4;\n3;"
30
31tput cup $(($height/$FONTH)) 0
32echo -e $w3m_command|$W3MIMGDISPLAY
diff --git a/scripts/scripts/music.sh b/scripts/scripts/music.sh
new file mode 100755
index 0000000..1de3bc0
--- /dev/null
+++ b/scripts/scripts/music.sh
@@ -0,0 +1,16 @@
1#!/usr/bin/env bash
2
3while getopts abt options
4do
5 case $options in
6 a)
7 cmus-remote -Q | grep tag\ artist\ | sed 's/tag artist //'
8 ;;
9 b)
10 cmus-remote -Q | grep tag\ album\ | sed 's/tag album //'
11 ;;
12 t)
13 cmus-remote -Q | grep tag\ title\ | sed 's/tag title //'
14 ;;
15 esac
16done
diff --git a/scripts/scripts/netwrk.sh b/scripts/scripts/netwrk.sh
new file mode 100755
index 0000000..4fec3a5
--- /dev/null
+++ b/scripts/scripts/netwrk.sh
@@ -0,0 +1,10 @@
1#!/usr/bin/env bash
2
3status=$( nmcli | sed -n 1p | awk '{print $2}' )
4
5if [ $status = "connected" ]
6then
7 echo -n ''
8else
9 echo -n ''
10fi
diff --git a/scripts/scripts/playpause.sh b/scripts/scripts/playpause.sh
new file mode 100755
index 0000000..72ba0fb
--- /dev/null
+++ b/scripts/scripts/playpause.sh
@@ -0,0 +1,17 @@
1#!/usr/bin/env bash
2# Interactive polybar icon for music controls
3# Requires cmus
4
5if pgrep -x "cmus" > /dev/null
6then
7 status=$( cmus-remote -Q | grep status\ | sed 's/status //' )
8 if [[ "$status" == *playing* ]]; then
9 echo -ne " %{F$(get_xres color2)} "
10 elif [[ "$status" == *paused* ]]; then
11 echo -ne " %{F$(get_xres color2)} "
12 elif [[ "$status" == *stopped* ]]; then
13 echo -ne " %{F$(get_xres color2)} "
14 fi
15else
16 echo -ne "  "
17fi
diff --git a/scripts/scripts/popups/cover.sh b/scripts/scripts/popups/cover.sh
new file mode 100755
index 0000000..356e5ba
--- /dev/null
+++ b/scripts/scripts/popups/cover.sh
@@ -0,0 +1,14 @@
1#!/usr/bin/env bash
2
3folder=$( cmus-remote -Q | grep -w file | sed 's/file //' )
4cover=${folder%/*}/cover.png
5
6convert "$cover" -resize 200x200 ~/tmp/cover.png
7
8if pgrep n30f > /dev/null
9then
10 pkill n30f
11 n30f -x 20 -y 700 ~/tmp/cover.png -c "hidebars.sh -h" -d
12else
13 n30f -x 20 -y 700 ~/tmp/cover.png -c "hidebars.sh -h" -d
14fi
diff --git a/scripts/scripts/record b/scripts/scripts/record
new file mode 100755
index 0000000..bc59fb7
--- /dev/null
+++ b/scripts/scripts/record
@@ -0,0 +1,23 @@
1#!/bin/bash
2slop=$(slop -f "%x %y %w %h %g %i") || exit 1
3read -r X Y W H G ID < <(echo $slop)
4ffmpeg \
5 -f x11grab \
6 -s "$W"x"$H" \
7 -i :0.0+$X,$Y \
8 -f alsa \
9 -thread_queue_size 512 \
10 -ac 2 \
11 -ar 48000 \
12 -i hw:0 \
13 -framerate 60 \
14 -vcodec libx264 \
15 -threads 4 \
16 -y \
17 "$HOME"/tmp/x.mkv
18
19ffmpeg \
20 -i "$HOME"/tmp/x.mkv \
21 -pix_fmt yuv420p \
22 -vf scale=-2:1080 \
23 "/home/np/vids/rec/$1"
diff --git a/scripts/scripts/restartbars.sh b/scripts/scripts/restartbars.sh
new file mode 100755
index 0000000..44d339f
--- /dev/null
+++ b/scripts/scripts/restartbars.sh
@@ -0,0 +1,6 @@
1#!/usr/bin/env bash
2
3pkill polybar
4polybar time &
5polybar date &
6polybar music &
diff --git a/scripts/scripts/time.sh b/scripts/scripts/time.sh
new file mode 100755
index 0000000..66b0fbe
--- /dev/null
+++ b/scripts/scripts/time.sh
@@ -0,0 +1,6 @@
1#!/usr/bin/env bash
2
3fg="$(get_xres color15)"
4fg_light="$(get_xres color8)"
5# %{F$fg} $(date +%d/%m) %{F$fg_light} $(date +%Y)
6echo -ne "$(date +%p) $(date +%I:%M)"
diff --git a/scripts/scripts/tmux-fzf.sh b/scripts/scripts/tmux-fzf.sh
new file mode 100755
index 0000000..9caa7ea
--- /dev/null
+++ b/scripts/scripts/tmux-fzf.sh
@@ -0,0 +1,15 @@
1#! /usr/bin/env bash
2
3function __fzf() {
4 fzf --cycle --height 7 --reverse
5}
6
7function __list_to_fzf() {
8 tmux ls -F "#{session_name}" | __fzf
9}
10
11if [ -n "$TMUX" ]; then
12 tmux switch-client -t "$(__list_to_fzf)"
13else
14 tmux a -dt "$(tmux ls -F "#{session_name}" | __fzf)"
15fi
diff --git a/scripts/scripts/up b/scripts/scripts/up
new file mode 100755
index 0000000..6b9ece4
--- /dev/null
+++ b/scripts/scripts/up
@@ -0,0 +1,20 @@
1#!/usr/bin/env bash
2
3id=$( cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 2 | head -n 1 )
4
5if [ $# != 1 ]; then
6 echo "needs an arg"
7else
8 if [ -f "$1" ]; then
9 ext="${1##*.}"
10 id="$id.$ext"
11 scp -P 22222 "$1" ferrn:~/www/nerd/uploads/"$id"
12 echo "https://u.peppe.rs/$id"
13 if hash xclip 2> /dev/null; then
14 echo "https://u.peppe.rs/$id" | xclip -selection clipboard
15 echo "https://u.peppe.rs/$id" | xclip -i
16 fi
17 else
18 echo "file does not exist"
19 fi
20fi
diff --git a/scripts/scripts/url.sh b/scripts/scripts/url.sh
new file mode 100755
index 0000000..6b3264d
--- /dev/null
+++ b/scripts/scripts/url.sh
@@ -0,0 +1,4 @@
1#! /usr/bin/env bash
2
3echo "$1" | xclip -i
4echo "$1" | xclip -sel c
diff --git a/scripts/scripts/vol b/scripts/scripts/vol
new file mode 100755
index 0000000..8ed96da
--- /dev/null
+++ b/scripts/scripts/vol
@@ -0,0 +1,21 @@
1#!/usr/bin/env bash
2
3fg="$( ~/scripts/get_xres color7 )"
4icon="$( ~/scripts/get_xres color2 )"
5
6while getopts idq options
7do
8 case $options in
9 i)
10 amixer sset Master 2%+
11 ;;
12
13 d)
14 amixer sset Master 2%-
15 ;;
16 q)
17 cur_vol=$( amixer sget Master | awk -F"[][]" '/dB/ { print $2 }' )
18 echo " %{F$fg}$cur_vol"
19 ;;
20 esac
21done
diff --git a/scripts/scripts/wscycle.sh b/scripts/scripts/wscycle.sh
new file mode 100755
index 0000000..7ea608d
--- /dev/null
+++ b/scripts/scripts/wscycle.sh
@@ -0,0 +1,30 @@
1#!/usr/bin/env bash
2# cycle through workspaces
3
4# get the current ws
5ws=$( xprop -root _NET_CURRENT_DESKTOP | sed -e 's/_NET_CURRENT_DESKTOP(CARDINAL) = //' )
6total=5
7
8while getopts fr options
9do
10 case $options in
11 f)
12 if [[ $ws -eq $total ]]
13 then
14 wmctrl -s 0
15 else
16 ws=$(( $ws + 1 ))
17 wmctrl -s $ws
18 fi
19 ;;
20 r)
21 if [[ $ws -eq 0 ]]
22 then
23 wmctrl -s $total
24 else
25 ws=$(( $ws - 1 ))
26 wmctrl -s $ws
27 fi
28 ;;
29 esac
30done
diff --git a/scripts/scripts/zatheme.sh b/scripts/scripts/zatheme.sh
new file mode 100755
index 0000000..4cda119
--- /dev/null
+++ b/scripts/scripts/zatheme.sh
@@ -0,0 +1,37 @@
1#!/usr/bin/env bash
2
3
4echo 'set incremental-search true
5
6set recolor "true"
7
8set default-bg "'$( get_xres color0 )'"
9set default-fg "'$( get_xres color7 )'"
10
11set completion-bg "'$( get_xres color0 )'"
12set completion-fg "'$( get_xres color7 )'"
13set completion-highlight-bg "'$( get_xres color5 )'"
14set completion-highlight-fg "'$( get_xres color7 )'"
15
16set statusbar-bg "'$( get_xres color0 )'"
17set statusbar-fg "'$( get_xres color7 )'"
18
19set inputbar-bg "'$( get_xres color0 )'"
20set inputbar-fg "'$( get_xres color7 )'"
21
22set recolor-darkcolor "'$( get_xres color7 )'"
23set recolor-lightcolor "'$( get_xres color0 )'"
24
25set window-height "800"
26set window-width "600"
27
28set adjust-open "width"
29set smooth-scroll true
30set statusbar-home-tilde "true"
31set statusbar-h-padding "50"
32set statusbar-v-padding "50"
33set guioptions "s"
34
35set font "Input 10"
36
37' > ~/.config/zathura/zathurarc
diff --git a/sxhkd/.config/sxhkd/sxhkdrc b/sxhkd/.config/sxhkd/sxhkdrc
new file mode 100644
index 0000000..c389784
--- /dev/null
+++ b/sxhkd/.config/sxhkd/sxhkdrc
@@ -0,0 +1,14 @@
1XF86Audio{Lower,Raise}Volume
2 amixer sset Master 2%{-,+}
3
4XF86AudioMute
5 amixer sset Master toggle
6
7XF86MonBrightness{Down,Up}
8 xbacklight -{dec,inc} 5
9
10super + Escape
11 pkill -USR1 -x sxhkd
12
13ctrl + Escape
14 xcursorlocate
diff --git a/tmux/.tmux.conf b/tmux/.tmux.conf
new file mode 100644
index 0000000..9b6d18e
--- /dev/null
+++ b/tmux/.tmux.conf
@@ -0,0 +1,62 @@
1set -g prefix C-a
2unbind-key C-b
3bind-key C-a send-prefix
4
5bind r source-file ~/.tmux.conf
6
7set-option -g default-terminal xterm-256color-italic
8set escape-time 20
9
10set -g mouse on
11
12set -g base-index 1
13setw -g pane-base-index 1
14
15# pane binds
16bind -n M-j select-pane -D
17bind -n M-k select-pane -U
18bind-key v split-window -h -c "#{pane_current_path}"
19bind-key h split-window -v -c "#{pane_current_path}"
20bind-key '"' split-window -v -c "#{pane_current_path}"
21
22# window binds
23bind -n M-h previous-window
24bind -n M-l next-window
25bind-key s choose-session
26bind-key c new-window -c "#{pane_current_path}"
27bind-key ) swap-window -t +1
28bind-key ( swap-window -t -1
29bind-key [ copy-mode
30
31bind-key u capture-pane \; save-buffer /tmp/tmux-buffer \; new-window -n "urlview" '$SHELL -c "urlview < /tmp/tmux-buffer"'
32
33# statusline hide / unhide
34bind -n M-down set -q status off
35bind -n M-up set -q status on
36
37bind-key -T copy-mode-vi v send-keys -X begin-selection
38bind-key -T copy-mode-vi y send-keys -X copy-pipe "xclip -i -sel p -f | xclip -i -sel c "
39bind-key -T copy-mode-vi r send-keys -X rectangle-toggle
40bind P paste-buffer
41
42bind E command-prompt -p "Command:" \
43 "run \"tmux list-panes -a -F '##{session_name}:##{window_index}.##{pane_index}' \
44 | xargs -I PANE tmux send-keys -t PANE '%1' Enter\""
45
46set-window-option -g allow-rename off
47
48set -g pane-border-style fg=colour11
49set -g pane-active-border-style fg=colour8
50
51set -g status-justify right
52set -g status-right ""
53set -g status-style "bg=colour0"
54set -ag status-style "fg=colour7"
55
56set -g window-status-current-format "#[fg=colour15] #W"
57set -g window-status-format "#[fg=colour8] #W"
58
59set -g status-left-length 100
60set -g status-left "#[fg=colour15]#(date +"%H%M") #[fg=colour8]hrs "
61set -ag status-left "#[fg=colour15]#(date +"%d/%m")#[fg=colour8] #(date +"%Y") "
62set -ag status-left "#[fg=colour7]#(~/scripts/bat -q)#[fg=colour12]"
diff --git a/weechat/.weechat/weechat.conf b/weechat/.weechat/weechat.conf
new file mode 100644
index 0000000..5afd93b
--- /dev/null
+++ b/weechat/.weechat/weechat.conf
@@ -0,0 +1,719 @@
1#
2# weechat -- weechat.conf
3#
4# WARNING: It is NOT recommended to edit this file by hand,
5# especially if WeeChat is running.
6#
7# Use /set or similar command to change settings in WeeChat.
8#
9# For more info, see: https://weechat.org/doc/quickstart
10#
11
12[debug]
13
14[startup]
15command_after_plugins = ""
16command_before_plugins = ""
17display_logo = on
18display_version = on
19sys_rlimit = ""
20
21[look]
22align_end_of_lines = message
23align_multiline_words = on
24bar_more_down = "++"
25bar_more_left = "<<"
26bar_more_right = ">>"
27bar_more_up = "--"
28bare_display_exit_on_input = on
29bare_display_time_format = "%H:%M"
30buffer_auto_renumber = on
31buffer_notify_default = all
32buffer_position = end
33buffer_search_case_sensitive = off
34buffer_search_force_default = off
35buffer_search_regex = off
36buffer_search_where = prefix_message
37buffer_time_format = ""
38buffer_time_same = ""
39color_basic_force_bold = off
40color_inactive_buffer = on
41color_inactive_message = on
42color_inactive_prefix = on
43color_inactive_prefix_buffer = on
44color_inactive_time = off
45color_inactive_window = on
46color_nick_offline = off
47color_pairs_auto_reset = 5
48color_real_white = on
49command_chars = ""
50command_incomplete = off
51confirm_quit = off
52confirm_upgrade = off
53day_change = on
54day_change_message_1date = "-- %a, %d %b %Y --"
55day_change_message_2dates = "-- %%a, %%d %%b %%Y (%a, %d %b %Y) --"
56eat_newline_glitch = off
57emphasized_attributes = ""
58highlight = "NerdyPepper,nerdz,nerdy"
59highlight_regex = ""
60highlight_tags = ""
61hotlist_add_conditions = "${away} || ${buffer} != ${window.buffer}"
62hotlist_buffer_separator = ", "
63hotlist_count_max = 2
64hotlist_count_min_msg = 2
65hotlist_names_count = 3
66hotlist_names_length = 0
67hotlist_names_level = 12
68hotlist_names_merged_buffers = off
69hotlist_prefix = "H: "
70hotlist_remove = merged
71hotlist_short_names = on
72hotlist_sort = group_time_asc
73hotlist_suffix = ""
74hotlist_unique_numbers = on
75input_cursor_scroll = 20
76input_share = none
77input_share_overwrite = off
78input_undo_max = 32
79item_away_message = on
80item_buffer_filter = "*"
81item_buffer_zoom = "!"
82item_mouse_status = "M"
83item_time_format = "%I.%M%p"
84jump_current_to_previous_buffer = on
85jump_previous_buffer_when_closing = on
86jump_smart_back_to_buffer = on
87key_bind_safe = on
88key_grab_delay = 800
89mouse = on
90mouse_timer_delay = 100
91nick_color_force = ""
92nick_color_hash = djb2
93nick_color_stop_chars = "_|["
94nick_prefix = " "
95nick_suffix = ""
96paste_auto_add_newline = on
97paste_bracketed = on
98paste_bracketed_timer_delay = 10
99paste_max_lines = 3
100prefix_action = "· "
101prefix_align = right
102prefix_align_max = 15
103prefix_align_min = 0
104prefix_align_more = " "
105prefix_align_more_after = on
106prefix_buffer_align = right
107prefix_buffer_align_max = 0
108prefix_buffer_align_more = " "
109prefix_buffer_align_more_after = on
110prefix_error = " × "
111prefix_join = " · "
112prefix_network = " - "
113prefix_quit = " · "
114prefix_same_nick = " "
115prefix_same_nick_middle = ""
116prefix_suffix = ""
117quote_nick_prefix = "<"
118quote_nick_suffix = ">"
119quote_time_format = "%H%M"
120read_marker = line
121read_marker_always_show = off
122read_marker_string = "─"
123save_config_on_exit = on
124save_config_with_fsync = off
125save_layout_on_exit = all
126scroll_amount = 3
127scroll_bottom_after_switch = off
128scroll_page_percent = 100
129search_text_not_found_alert = on
130separator_horizontal = " "
131separator_vertical = " "
132tab_width = 1
133time_format = "%a, %d %b %Y %T"
134window_auto_zoom = off
135window_separator_horizontal = on
136window_separator_vertical = on
137window_title = "WeeChat ${info:version}"
138word_chars_highlight = "!\u00A0,-,_,|,alnum"
139word_chars_input = "!\u00A0,-,_,|,alnum"
140
141[palette]
142
143[color]
144bar_more = gray
145chat = default
146chat_bg = default
147chat_buffer = white
148chat_channel = white
149chat_day_change = cyan
150chat_delimiters = gray
151chat_highlight = 5
152chat_highlight_bg = black
153chat_host = cyan
154chat_inactive_buffer = darkgray
155chat_inactive_window = darkgray
156chat_nick = lightcyan
157chat_nick_colors = "8"
158chat_nick_offline = darkgray
159chat_nick_offline_highlight = darkgray
160chat_nick_offline_highlight_bg = 3
161chat_nick_other = cyan
162chat_nick_prefix = green
163chat_nick_self = 6
164chat_nick_suffix = green
165chat_prefix_action = 7
166chat_prefix_buffer = green
167chat_prefix_buffer_inactive_buffer = default
168chat_prefix_error = red
169chat_prefix_join = 2
170chat_prefix_more = 7
171chat_prefix_network = cyan
172chat_prefix_quit = 1
173chat_prefix_suffix = white
174chat_read_marker = 11
175chat_read_marker_bg = default
176chat_server = magenta
177chat_tags = red
178chat_text_found = 3
179chat_text_found_bg = lightmagenta
180chat_time = darkgray
181chat_time_delimiters = darkgray
182chat_value = cyan
183chat_value_null = blue
184emphasized = 3
185emphasized_bg = 170
186input_actions = 46
187input_text_not_found = red
188item_away = 3
189nicklist_away = cyan
190nicklist_group = 8
191separator = 11
192status_count_highlight = 170
193status_count_msg = 130
194status_count_other = default
195status_count_private = 113
196status_data_highlight = lightmagenta
197status_data_msg = 3
198status_data_other = default
199status_data_private = 46
200status_filter = 113
201status_more = 3
202status_mouse = 113
203status_name = white
204status_name_ssl = 46
205status_nicklist_count = default
206status_number = 3
207status_time = default
208
209[completion]
210base_word_until_cursor = on
211command_inline = on
212default_template = "%(nicks)|%(irc_channels)"
213nick_add_space = on
214nick_case_sensitive = off
215nick_completer = ","
216nick_first_only = off
217nick_ignore_chars = "[]-^"
218partial_completion_alert = on
219partial_completion_command = off
220partial_completion_command_arg = off
221partial_completion_count = on
222partial_completion_other = off
223partial_completion_templates = "config_options"
224
225[history]
226display_default = 0
227max_buffer_lines_minutes = 0
228max_buffer_lines_number = 4096
229max_commands = 100
230max_visited_buffers = 50
231
232[proxy]
233hive.address = "127.0.0.1"
234hive.ipv6 = off
235hive.password = ""
236hive.port = 44444
237hive.type = socks5
238hive.username = ""
239
240[network]
241connection_timeout = 60
242gnutls_ca_file = "/etc/ssl/certs/ca-certificates.crt"
243gnutls_handshake_timeout = 30
244proxy_curl = ""
245
246[plugin]
247autoload = "*"
248debug = off
249extension = ".so"
250path = "%h/plugins"
251save_config_on_unload = on
252
253[bar]
254buddylist.color_bg = default
255buddylist.color_delim = default
256buddylist.color_fg = default
257buddylist.conditions = ""
258buddylist.filling_left_right = vertical
259buddylist.filling_top_bottom = horizontal
260buddylist.hidden = on
261buddylist.items = "buddylist"
262buddylist.position = left
263buddylist.priority = 0
264buddylist.separator = on
265buddylist.size = 0
266buddylist.size_max = 0
267buddylist.type = root
268buffers.color_bg = 0
269buffers.color_delim = default
270buffers.color_fg = default
271buffers.conditions = ""
272buffers.filling_left_right = vertical
273buffers.filling_top_bottom = columns_vertical
274buffers.hidden = on
275buffers.items = ""
276buffers.position = left
277buffers.priority = 0
278buffers.separator = on
279buffers.size = 0
280buffers.size_max = 0
281buffers.type = root
282buflist.color_bg = 0
283buflist.color_delim = lightcyan
284buflist.color_fg = 7
285buflist.conditions = ""
286buflist.filling_left_right = vertical
287buflist.filling_top_bottom = columns_horizontal
288buflist.hidden = off
289buflist.items = "buffers"
290buflist.position = right
291buflist.priority = 0
292buflist.separator = off
293buflist.size = 15
294buflist.size_max = 15
295buflist.type = root
296fset.color_bg = default
297fset.color_delim = cyan
298fset.color_fg = default
299fset.conditions = "${buffer.full_name} == fset.fset"
300fset.filling_left_right = vertical
301fset.filling_top_bottom = horizontal
302fset.hidden = off
303fset.items = "fset"
304fset.position = top
305fset.priority = 0
306fset.separator = on
307fset.size = 3
308fset.size_max = 3
309fset.type = window
310input.color_bg = default
311input.color_delim = 7
312input.color_fg = 7
313input.conditions = ""
314input.filling_left_right = vertical
315input.filling_top_bottom = horizontal
316input.hidden = off
317input.items = "$,input_text"
318input.position = bottom
319input.priority = 1000
320input.separator = on
321input.size = 1
322input.size_max = 0
323input.type = window
324isetbar.color_bg = default
325isetbar.color_delim = cyan
326isetbar.color_fg = default
327isetbar.conditions = ""
328isetbar.filling_left_right = vertical
329isetbar.filling_top_bottom = horizontal
330isetbar.hidden = on
331isetbar.items = "isetbar_help"
332isetbar.position = top
333isetbar.priority = 0
334isetbar.separator = on
335isetbar.size = 3
336isetbar.size_max = 3
337isetbar.type = window
338nicklist.color_bg = default
339nicklist.color_delim = cyan
340nicklist.color_fg = 8
341nicklist.conditions = "nicklist"
342nicklist.filling_left_right = vertical
343nicklist.filling_top_bottom = columns_vertical
344nicklist.hidden = on
345nicklist.items = "buffer_nicklist"
346nicklist.position = right
347nicklist.priority = 200
348nicklist.separator = on
349nicklist.size = 0
350nicklist.size_max = 0
351nicklist.type = window
352status.color_bg = 10
353status.color_delim = cyan
354status.color_fg = default
355status.conditions = ""
356status.filling_left_right = vertical
357status.filling_top_bottom = horizontal
358status.hidden = on
359status.items = "[time],[buffer_count],[buffer_plugin],buffer_number+:+buffer_name+{buffer_nicklist_count}+buffer_filter,[lag],[hotlist],completion,scroll"
360status.position = bottom
361status.priority = 500
362status.separator = off
363status.size = 1
364status.size_max = 0
365status.type = window
366title.color_bg = 10
367title.color_delim = cyan
368title.color_fg = default
369title.conditions = ""
370title.filling_left_right = vertical
371title.filling_top_bottom = horizontal
372title.hidden = on
373title.items = "buffer_title"
374title.position = top
375title.priority = 500
376title.separator = off
377title.size = 1
378title.size_max = 0
379title.type = window
380
381[layout]
382default.buffer = "core;weechat;1"
383default.buffer = "fset;fset;2"
384default.window = "1;0;0;0;fset;fset"
385default.current = on
386
387[notify]
388
389[filter]
390irc_smart = on;*;irc_smart_filter;*
391
392[key]
393ctrl-? = "/input delete_previous_char"
394ctrl-A = "/input move_beginning_of_line"
395ctrl-B = "/input move_previous_char"
396ctrl-Cb = "/input insert \x02"
397ctrl-Cc = "/input insert \x03"
398ctrl-Ci = "/input insert \x1D"
399ctrl-Co = "/input insert \x0F"
400ctrl-Cr = "/input insert \x12"
401ctrl-Cu = "/input insert \x15"
402ctrl-D = "/input delete_next_char"
403ctrl-E = "/input move_end_of_line"
404ctrl-F = "/input move_next_char"
405ctrl-H = "/input delete_previous_char"
406ctrl-I = "/input complete_next"
407ctrl-J = "/input return"
408ctrl-K = "/input delete_end_of_line"
409ctrl-L = "/window refresh"
410ctrl-M = "/input return"
411ctrl-N = "/buffer +1"
412ctrl-P = "/buffer -1"
413ctrl-R = "/input search_text"
414ctrl-Sctrl-U = "/input set_unread"
415ctrl-T = "/input transpose_chars"
416ctrl-U = "/input delete_beginning_of_line"
417ctrl-W = "/input delete_previous_word"
418ctrl-X = "/input switch_active_buffer"
419ctrl-Y = "/input clipboard_paste"
420meta-meta-OP = "/bar scroll buflist * b"
421meta-meta-OQ = "/bar scroll buflist * e"
422meta-meta2-11~ = "/bar scroll buflist * b"
423meta-meta2-12~ = "/bar scroll buflist * e"
424meta-meta2-1~ = "/window scroll_top"
425meta-meta2-23~ = "/bar scroll nicklist * yb"
426meta-meta2-24~ = "/bar scroll nicklist * ye"
427meta-meta2-4~ = "/window scroll_bottom"
428meta-meta2-5~ = "/window scroll_up"
429meta-meta2-6~ = "/window scroll_down"
430meta-meta2-7~ = "/window scroll_top"
431meta-meta2-8~ = "/window scroll_bottom"
432meta-meta2-A = "/buffer -1"
433meta-meta2-B = "/buffer +1"
434meta-meta2-C = "/buffer +1"
435meta-meta2-D = "/buffer -1"
436meta-0 = "/buffer *10"
437meta-1 = "/buffer *1"
438meta-2 = "/buffer *2"
439meta-3 = "/buffer *3"
440meta-4 = "/buffer *4"
441meta-5 = "/buffer *5"
442meta-6 = "/buffer *6"
443meta-7 = "/buffer *7"
444meta-8 = "/buffer *8"
445meta-9 = "/buffer *9"
446meta-< = "/input jump_previously_visited_buffer"
447meta-= = "/filter toggle"
448meta-> = "/input jump_next_visited_buffer"
449meta-OA = "/input history_global_previous"
450meta-OB = "/input history_global_next"
451meta-OC = "/input move_next_word"
452meta-OD = "/input move_previous_word"
453meta-OF = "/input move_end_of_line"
454meta-OH = "/input move_beginning_of_line"
455meta-OP = "/bar scroll buflist * -100%"
456meta-OQ = "/bar scroll buflist * +100%"
457meta-Oa = "/input history_global_previous"
458meta-Ob = "/input history_global_next"
459meta-Oc = "/input move_next_word"
460meta-Od = "/input move_previous_word"
461meta2-11^ = "/bar scroll buflist * -100%"
462meta2-11~ = "/bar scroll buflist * -100%"
463meta2-12^ = "/bar scroll buflist * +100%"
464meta2-12~ = "/bar scroll buflist * +100%"
465meta2-15~ = "/buffer -1"
466meta2-17~ = "/buffer +1"
467meta2-18~ = "/window -1"
468meta2-19~ = "/window +1"
469meta2-1;3A = "/buffer -1"
470meta2-1;3B = "/buffer +1"
471meta2-1;3C = "/buffer +1"
472meta2-1;3D = "/buffer -1"
473meta2-1;3P = "/bar scroll buflist * b"
474meta2-1;3Q = "/bar scroll buflist * e"
475meta2-1;5A = "/input history_global_previous"
476meta2-1;5B = "/input history_global_next"
477meta2-1;5P = "/bar scroll buflist * -100%"
478meta2-1;5Q = "/bar scroll buflist * +100%"
479meta2-1~ = "/input move_beginning_of_line"
480meta2-20~ = "/bar scroll title * x-50%"
481meta2-21~ = "/bar scroll title * x+50%"
482meta2-23~ = "/bar scroll nicklist * y-100%"
483meta2-24~ = "/bar scroll nicklist * y+100%"
484meta2-3~ = "/input delete_next_char"
485meta2-4~ = "/input move_end_of_line"
486meta2-5;3~ = "/window scroll_up"
487meta2-5~ = "/window page_up"
488meta2-6;3~ = "/window scroll_down"
489meta2-6~ = "/window page_down"
490meta2-7~ = "/input move_beginning_of_line"
491meta2-8~ = "/input move_end_of_line"
492meta2-A = "/input history_previous"
493meta2-B = "/input history_next"
494meta2-C = "/input move_next_char"
495meta2-D = "/input move_previous_char"
496meta2-F = "/input move_end_of_line"
497meta2-G = "/window page_down"
498meta2-H = "/input move_beginning_of_line"
499meta2-I = "/window page_up"
500meta2-Z = "/input complete_previous"
501meta-_ = "/input redo"
502meta-a = "/input jump_smart"
503meta-b = "/input move_previous_word"
504meta-d = "/input delete_next_word"
505meta-f = "/input move_next_word"
506meta-g = "/go"
507meta-h = "/input hotlist_clear"
508meta-jmeta-l = "/input jump_last_buffer"
509meta-jmeta-r = "/server raw"
510meta-jmeta-s = "/server jump"
511meta-j01 = "/buffer 1"
512meta-j02 = "/buffer 2"
513meta-j03 = "/buffer 3"
514meta-j04 = "/buffer 4"
515meta-j05 = "/buffer 5"
516meta-j06 = "/buffer 6"
517meta-j07 = "/buffer 7"
518meta-j08 = "/buffer 8"
519meta-j09 = "/buffer 9"
520meta-j10 = "/buffer 10"
521meta-j11 = "/buffer 11"
522meta-j12 = "/buffer 12"
523meta-j13 = "/buffer 13"
524meta-j14 = "/buffer 14"
525meta-j15 = "/buffer 15"
526meta-j16 = "/buffer 16"
527meta-j17 = "/buffer 17"
528meta-j18 = "/buffer 18"
529meta-j19 = "/buffer 19"
530meta-j20 = "/buffer 20"
531meta-j21 = "/buffer 21"
532meta-j22 = "/buffer 22"
533meta-j23 = "/buffer 23"
534meta-j24 = "/buffer 24"
535meta-j25 = "/buffer 25"
536meta-j26 = "/buffer 26"
537meta-j27 = "/buffer 27"
538meta-j28 = "/buffer 28"
539meta-j29 = "/buffer 29"
540meta-j30 = "/buffer 30"
541meta-j31 = "/buffer 31"
542meta-j32 = "/buffer 32"
543meta-j33 = "/buffer 33"
544meta-j34 = "/buffer 34"
545meta-j35 = "/buffer 35"
546meta-j36 = "/buffer 36"
547meta-j37 = "/buffer 37"
548meta-j38 = "/buffer 38"
549meta-j39 = "/buffer 39"
550meta-j40 = "/buffer 40"
551meta-j41 = "/buffer 41"
552meta-j42 = "/buffer 42"
553meta-j43 = "/buffer 43"
554meta-j44 = "/buffer 44"
555meta-j45 = "/buffer 45"
556meta-j46 = "/buffer 46"
557meta-j47 = "/buffer 47"
558meta-j48 = "/buffer 48"
559meta-j49 = "/buffer 49"
560meta-j50 = "/buffer 50"
561meta-j51 = "/buffer 51"
562meta-j52 = "/buffer 52"
563meta-j53 = "/buffer 53"
564meta-j54 = "/buffer 54"
565meta-j55 = "/buffer 55"
566meta-j56 = "/buffer 56"
567meta-j57 = "/buffer 57"
568meta-j58 = "/buffer 58"
569meta-j59 = "/buffer 59"
570meta-j60 = "/buffer 60"
571meta-j61 = "/buffer 61"
572meta-j62 = "/buffer 62"
573meta-j63 = "/buffer 63"
574meta-j64 = "/buffer 64"
575meta-j65 = "/buffer 65"
576meta-j66 = "/buffer 66"
577meta-j67 = "/buffer 67"
578meta-j68 = "/buffer 68"
579meta-j69 = "/buffer 69"
580meta-j70 = "/buffer 70"
581meta-j71 = "/buffer 71"
582meta-j72 = "/buffer 72"
583meta-j73 = "/buffer 73"
584meta-j74 = "/buffer 74"
585meta-j75 = "/buffer 75"
586meta-j76 = "/buffer 76"
587meta-j77 = "/buffer 77"
588meta-j78 = "/buffer 78"
589meta-j79 = "/buffer 79"
590meta-j80 = "/buffer 80"
591meta-j81 = "/buffer 81"
592meta-j82 = "/buffer 82"
593meta-j83 = "/buffer 83"
594meta-j84 = "/buffer 84"
595meta-j85 = "/buffer 85"
596meta-j86 = "/buffer 86"
597meta-j87 = "/buffer 87"
598meta-j88 = "/buffer 88"
599meta-j89 = "/buffer 89"
600meta-j90 = "/buffer 90"
601meta-j91 = "/buffer 91"
602meta-j92 = "/buffer 92"
603meta-j93 = "/buffer 93"
604meta-j94 = "/buffer 94"
605meta-j95 = "/buffer 95"
606meta-j96 = "/buffer 96"
607meta-j97 = "/buffer 97"
608meta-j98 = "/buffer 98"
609meta-j99 = "/buffer 99"
610meta-k = "/input grab_key_command"
611meta-m = "/bar toggle buffers"
612meta-n = "/bar toggle nicklist"
613meta-p = "/window bare"
614meta-r = "/input delete_line"
615meta-u = "/input scroll_unread"
616meta-wmeta-meta2-A = "/window up"
617meta-wmeta-meta2-B = "/window down"
618meta-wmeta-meta2-C = "/window right"
619meta-wmeta-meta2-D = "/window left"
620meta-wmeta2-1;3A = "/window up"
621meta-wmeta2-1;3B = "/window down"
622meta-wmeta2-1;3C = "/window right"
623meta-wmeta2-1;3D = "/window left"
624meta-wmeta-b = "/window balance"
625meta-wmeta-s = "/window swap"
626meta-z = "/window zoom"
627ctrl-_ = "/input undo"
628
629[key_search]
630ctrl-I = "/input search_switch_where"
631ctrl-J = "/input search_stop_here"
632ctrl-M = "/input search_stop_here"
633ctrl-Q = "/input search_stop"
634ctrl-R = "/input search_switch_regex"
635meta2-A = "/input search_previous"
636meta2-B = "/input search_next"
637meta-c = "/input search_switch_case"
638
639[key_cursor]
640ctrl-J = "/cursor stop"
641ctrl-M = "/cursor stop"
642meta-meta2-A = "/cursor move area_up"
643meta-meta2-B = "/cursor move area_down"
644meta-meta2-C = "/cursor move area_right"
645meta-meta2-D = "/cursor move area_left"
646meta2-1;3A = "/cursor move area_up"
647meta2-1;3B = "/cursor move area_down"
648meta2-1;3C = "/cursor move area_right"
649meta2-1;3D = "/cursor move area_left"
650meta2-A = "/cursor move up"
651meta2-B = "/cursor move down"
652meta2-C = "/cursor move right"
653meta2-D = "/cursor move left"
654@chat(python.*):D = "hsignal:slack_cursor_delete"
655@chat(python.*):L = "hsignal:slack_cursor_linkarchive"
656@chat(python.*):M = "hsignal:slack_cursor_message"
657@chat(python.*):R = "hsignal:slack_cursor_reply"
658@chat(python.*):T = "hsignal:slack_cursor_thread"
659@item(buffer_nicklist):K = "/window ${_window_number};/kickban ${nick}"
660@item(buffer_nicklist):b = "/window ${_window_number};/ban ${nick}"
661@item(buffer_nicklist):k = "/window ${_window_number};/kick ${nick}"
662@item(buffer_nicklist):q = "/window ${_window_number};/query ${nick};/cursor stop"
663@item(buffer_nicklist):w = "/window ${_window_number};/whois ${nick}"
664@chat:Q = "hsignal:chat_quote_time_prefix_message;/cursor stop"
665@chat:m = "hsignal:chat_quote_message;/cursor stop"
666@chat:q = "hsignal:chat_quote_prefix_message;/cursor stop"
667
668[key_mouse]
669@item(buffer_nicklist)>item(buddylist):button1-gesture-* = "hsignal:buddylist_mouse"
670@chat(*)>item(buddylist):button1-gesture-* = "hsignal:buddylist_mouse"
671@bar(buffers):ctrl-wheeldown = "hsignal:buffers_mouse"
672@bar(buffers):ctrl-wheelup = "hsignal:buffers_mouse"
673@bar(buflist):ctrl-wheeldown = "hsignal:buflist_mouse"
674@bar(buflist):ctrl-wheelup = "hsignal:buflist_mouse"
675@bar(input):button2 = "/input grab_mouse_area"
676@bar(nicklist):button1-gesture-down = "/bar scroll nicklist ${_window_number} +100%"
677@bar(nicklist):button1-gesture-down-long = "/bar scroll nicklist ${_window_number} e"
678@bar(nicklist):button1-gesture-up = "/bar scroll nicklist ${_window_number} -100%"
679@bar(nicklist):button1-gesture-up-long = "/bar scroll nicklist ${_window_number} b"
680@chat(fset.fset):button1 = "/window ${_window_number};/fset -go ${_chat_line_y}"
681@chat(fset.fset):button2* = "hsignal:fset_mouse"
682@chat(fset.fset):wheeldown = "/fset -down 5"
683@chat(fset.fset):wheelup = "/fset -up 5"
684@chat(perl.iset):button1 = "hsignal:iset_mouse"
685@chat(perl.iset):button2* = "hsignal:iset_mouse"
686@chat(perl.iset):wheeldown = "/repeat 5 /iset **down"
687@chat(perl.iset):wheelup = "/repeat 5 /iset **up"
688@chat(python.*):button2 = "hsignal:slack_mouse"
689@chat(script.scripts):button1 = "/window ${_window_number};/script go ${_chat_line_y}"
690@chat(script.scripts):button2 = "/window ${_window_number};/script go ${_chat_line_y};/script installremove -q ${script_name_with_extension}"
691@chat(script.scripts):wheeldown = "/script down 5"
692@chat(script.scripts):wheelup = "/script up 5"
693@item(buddylist):button1* = "hsignal:buddylist_mouse"
694@item(buddylist):button1-gesture-* = "hsignal:buddylist_mouse"
695@item(buffer_nicklist):button1 = "/window ${_window_number};/query ${nick}"
696@item(buffer_nicklist):button1-gesture-left = "/window ${_window_number};/kick ${nick}"
697@item(buffer_nicklist):button1-gesture-left-long = "/window ${_window_number};/kickban ${nick}"
698@item(buffer_nicklist):button2 = "/window ${_window_number};/whois ${nick}"
699@item(buffer_nicklist):button2-gesture-left = "/window ${_window_number};/ban ${nick}"
700@item(buffers):button1* = "hsignal:buffers_mouse"
701@item(buffers):button2* = "hsignal:buffers_mouse"
702@item(buflist):button1* = "hsignal:buflist_mouse"
703@item(buflist):button2* = "hsignal:buflist_mouse"
704@item(buflist2):button1* = "hsignal:buflist_mouse"
705@item(buflist2):button2* = "hsignal:buflist_mouse"
706@item(buflist3):button1* = "hsignal:buflist_mouse"
707@item(buflist3):button2* = "hsignal:buflist_mouse"
708@bar:wheeldown = "/bar scroll ${_bar_name} ${_window_number} +20%"
709@bar:wheelup = "/bar scroll ${_bar_name} ${_window_number} -20%"
710@chat:button1 = "/window ${_window_number}"
711@chat:button1-gesture-left = "/window ${_window_number};/buffer -1"
712@chat:button1-gesture-left-long = "/window ${_window_number};/buffer 1"
713@chat:button1-gesture-right = "/window ${_window_number};/buffer +1"
714@chat:button1-gesture-right-long = "/window ${_window_number};/input jump_last_buffer"
715@chat:ctrl-wheeldown = "/window scroll_horiz -window ${_window_number} +10%"
716@chat:ctrl-wheelup = "/window scroll_horiz -window ${_window_number} -10%"
717@chat:wheeldown = "/window scroll_down -window ${_window_number}"
718@chat:wheelup = "/window scroll_up -window ${_window_number}"
719@*:button3 = "/cursor go ${_x},${_y}"
diff --git a/zathura/.config/zathura/zathurarc b/zathura/.config/zathura/zathurarc
new file mode 100644
index 0000000..cae43b1
--- /dev/null
+++ b/zathura/.config/zathura/zathurarc
@@ -0,0 +1,34 @@
1set incremental-search true
2
3set recolor "true"
4
5set default-bg "#ffffff"
6set default-fg "#4d4d4c"
7
8set completion-bg "#ffffff"
9set completion-fg "#4d4d4c"
10set completion-highlight-bg "#ff0080"
11set completion-highlight-fg "#4d4d4c"
12
13# set statusbar-bg "#ff0080"
14# set statusbar-fg "#ffffff"
15
16set inputbar-bg "#ffffff"
17set inputbar-fg "#4d4d4c"
18
19set recolor-darkcolor "#4d4d4c"
20set recolor-lightcolor "#ffffff"
21
22set window-height "800"
23set window-width "600"
24
25set adjust-open "width"
26set smooth-scroll true
27set statusbar-home-tilde "true"
28set statusbar-h-padding "50"
29set statusbar-v-padding "50"
30set guioptions ""
31
32set font "SF Mono 10"
33
34