initial public commit

main
Brian Picciano 7 years ago committed by mediocregopher
commit 07ab3a77b4
  1. 1
      .gitignore
  2. 103
      README.md
  3. 861
      alacritty/alacritty.yml
  4. 35
      alacritty/default.nix
  5. BIN
      alacritty/fonts/SourceCodePro-Black.ttf
  6. BIN
      alacritty/fonts/SourceCodePro-Bold.ttf
  7. BIN
      alacritty/fonts/SourceCodePro-ExtraLight.ttf
  8. BIN
      alacritty/fonts/SourceCodePro-Light.ttf
  9. BIN
      alacritty/fonts/SourceCodePro-Medium.ttf
  10. BIN
      alacritty/fonts/SourceCodePro-Regular.ttf
  11. BIN
      alacritty/fonts/SourceCodePro-Semibold.ttf
  12. 17
      appimage.nix
  13. 9
      awesome/awesome.desktop
  14. 43
      awesome/bat.lua
  15. BIN
      awesome/bin/cricket
  16. BIN
      awesome/bin/imgavg
  17. 4
      awesome/bin/random_i3lock.sh
  18. 4
      awesome/bin/scrot-gobin.sh
  19. 50
      awesome/bin/sysstats.sh
  20. 26
      awesome/default.nix
  21. BIN
      awesome/helper.png
  22. 13
      awesome/mediocregopher-sysstats.service
  23. 40
      awesome/pulseaudio.lua
  24. 544
      awesome/rc.lua
  25. 3
      awesome/theme/README
  26. BIN
      awesome/theme/background.png
  27. BIN
      awesome/theme/background_white.png
  28. BIN
      awesome/theme/layouts/dwindle.png
  29. BIN
      awesome/theme/layouts/dwindlew.png
  30. BIN
      awesome/theme/layouts/fairh.png
  31. BIN
      awesome/theme/layouts/fairhw.png
  32. BIN
      awesome/theme/layouts/fairv.png
  33. BIN
      awesome/theme/layouts/fairvw.png
  34. BIN
      awesome/theme/layouts/floating.png
  35. BIN
      awesome/theme/layouts/floatingw.png
  36. BIN
      awesome/theme/layouts/fullscreen.png
  37. BIN
      awesome/theme/layouts/fullscreenw.png
  38. BIN
      awesome/theme/layouts/magnifier.png
  39. BIN
      awesome/theme/layouts/magnifierw.png
  40. BIN
      awesome/theme/layouts/max.png
  41. BIN
      awesome/theme/layouts/maxw.png
  42. BIN
      awesome/theme/layouts/spiral.png
  43. BIN
      awesome/theme/layouts/spiralw.png
  44. BIN
      awesome/theme/layouts/tile.png
  45. BIN
      awesome/theme/layouts/tilebottom.png
  46. BIN
      awesome/theme/layouts/tilebottomw.png
  47. BIN
      awesome/theme/layouts/tileleft.png
  48. BIN
      awesome/theme/layouts/tileleftw.png
  49. BIN
      awesome/theme/layouts/tiletop.png
  50. BIN
      awesome/theme/layouts/tiletopw.png
  51. BIN
      awesome/theme/layouts/tilew.png
  52. BIN
      awesome/theme/submenu.png
  53. BIN
      awesome/theme/taglist/squarefw.png
  54. BIN
      awesome/theme/taglist/squarew.png
  55. 105
      awesome/theme/theme.lua
  56. BIN
      awesome/theme/titlebar/close_focus.png
  57. BIN
      awesome/theme/titlebar/close_normal.png
  58. BIN
      awesome/theme/titlebar/floating_focus_active.png
  59. BIN
      awesome/theme/titlebar/floating_focus_inactive.png
  60. BIN
      awesome/theme/titlebar/floating_normal_active.png
  61. BIN
      awesome/theme/titlebar/floating_normal_inactive.png
  62. BIN
      awesome/theme/titlebar/maximized_focus_active.png
  63. BIN
      awesome/theme/titlebar/maximized_focus_inactive.png
  64. BIN
      awesome/theme/titlebar/maximized_normal_active.png
  65. BIN
      awesome/theme/titlebar/maximized_normal_inactive.png
  66. BIN
      awesome/theme/titlebar/ontop_focus_active.png
  67. BIN
      awesome/theme/titlebar/ontop_focus_inactive.png
  68. BIN
      awesome/theme/titlebar/ontop_normal_active.png
  69. BIN
      awesome/theme/titlebar/ontop_normal_inactive.png
  70. BIN
      awesome/theme/titlebar/sticky_focus_active.png
  71. BIN
      awesome/theme/titlebar/sticky_focus_inactive.png
  72. BIN
      awesome/theme/titlebar/sticky_normal_active.png
  73. BIN
      awesome/theme/titlebar/sticky_normal_inactive.png
  74. 29
      base/gitconfig
  75. 921
      bin/git-remote-gcrypt
  76. 5
      bin/go-playground
  77. 3
      bin/sshfs
  78. BIN
      bonzi.png
  79. 130
      default.nix
  80. 94
      nvim/default.nix
  81. 170
      nvim/init.vim
  82. 41
      pkgs.nix
  83. BIN
      wallpapers/4k-oled-wallpaper-of-the-m87-black-hole-2560×1440.jpg
  84. BIN
      wallpapers/4o1bisow7ps21.png
  85. BIN
      wallpapers/7nmbvhlv21s21.jpg
  86. BIN
      wallpapers/abra.jpg
  87. BIN
      wallpapers/articuno.jpg
  88. BIN
      wallpapers/big_71d0086eab49280fed10d14d573893a876b5eaf4.png
  89. BIN
      wallpapers/big_aaf416dcccb774b6e508f40e34bd040f72c3d854.jpg
  90. BIN
      wallpapers/big_b1f7b91cb5f611733e723dfcd394364997738589.jpg
  91. BIN
      wallpapers/big_c52f705c7d5b9b74b96c30b5c44361fb04b7d0c7.png
  92. BIN
      wallpapers/bmc5i4njj4t21.png
  93. BIN
      wallpapers/charizard.jpg
  94. BIN
      wallpapers/cubone.jpg
  95. BIN
      wallpapers/dragonair.jpg
  96. BIN
      wallpapers/dratini.jpg
  97. BIN
      wallpapers/efo9jncq20s21.jpg
  98. BIN
      wallpapers/elochki-by-hangmoon-2560×1440.jpg
  99. BIN
      wallpapers/evee.jpg
  100. BIN
      wallpapers/gastly.jpg
  101. Some files were not shown because too many files have changed in this diff Show More

1
.gitignore vendored

@ -0,0 +1 @@
result

@ -0,0 +1,103 @@
# Mediocre Loadout
This repo contains everything needed to build my loadout, which is everything
which I tend to take from one linux machine to the next. This includes:
* My development environment (neovim + plugins + a lot of customization)
* My shell (zsh + plugins + a custom theme)
* My window manager (awesome + plugins + a lot of customization)
I'm calling the result the "Mediocre Loadout". It is designed to be completely
agnostic to the system it is running on, and to make little to no mutations to
that system.
# Build/Installation/Usage options
To build the Mediocre Loadout you must have a working
[nix](https://nixos.org/manual/nix/stable/) installation, as well as an `x86_64`
machine. That's it.
There are multiple build/installation options:
## nix Derivation
To build the nix derivation of the loadout you can do:
```
nix-build -A loadout
```
This will place the result in the `result` symlink in the root directory.
Components of the loadout can then be executed from the `bin` subdirectory,
e.g.:
```
./result/bin/nvim
```
## nix Environment
Alternatively, to install it to your nix profile do:
```
nix-env -i default.nix -A loadout
```
Assuming your nix environment is set up correctly, you should be able to execute
components directly:
```
nvim
```
## AppImage
An [AppImage](https://appimage.org/) binary can be built which can run any
component of the loadout individually. This binary can be copied from one
machine to the next without any of them requiring nix or any other dependencry
to run it.
To build the binary:
```
nix-build -A appimage
```
The resulting binary will be placed in the `result` symlink in the root
directory.
Specific components of the loadout can be run by passing an argument to the
binary:
```
./Mediocre_Loadout-x86_64.AppImage nvim
```
# Available Components
Components of the loadout can be run separate from the others, depending on what
you're trying to do. The following components are available to be run:
* `zsh` (`shell` in the AppImage): My terminal shell. There's some customization
to it but it should be pretty self-explanatory to "just use".
* `nvim` (`editor` in the AppImage): My neovim development environment, plus all
plugins I use. I mostly work in golang, so it's most tuned for that, but it
does fine for general dev work. `Ctrl-N` will open NerdTree, `<backslash>tn`
will open a terminal tab, and `<backslash>th`/`<backslash>tl` can be used to
navigate tabs. There's a lot more customization that's been done, see the
`nvim/init.vim` file.
* `alacritty` (`gui` in the AppImage, might be broken): Terminal which I use.
Yes, I always use a light-mode theme, because I work in well lit spaces
generally. There's not much else to this.
* `awesome` (`wm` in the AppImage, almost definitely broken): My window manager.
There's so much customization I couldn't begin to start. `Meta+Enter` should
open a terminal, where `Meta` is probably the windows key on your keyboard.
# Status
This configuration is still fairly new, and so expect it to be fairly broken.
I'll be updating it as I go though, so it should stabalize into something
functional.

@ -0,0 +1,861 @@
# Configuration for Alacritty, the GPU enhanced terminal emulator.
# Import additional configuration files
#
# Imports are loaded in order, skipping all missing files, with the importing
# file being loaded last. If a field is already present in a previous import, it
# will be replaced.
#
# All imports must either be absolute paths starting with `/`, or paths relative
# to the user's home directory starting with `~/`.
#import:
# - /path/to/alacritty.yml
# Any items in the `env` entry below will be added as
# environment variables. Some entries may override variables
# set by alacritty itself.
env:
# TERM variable
#
# This value is used to set the `$TERM` environment variable for
# each instance of Alacritty. If it is not present, alacritty will
# check the local terminfo database and use `alacritty` if it is
# available, otherwise `xterm-256color` is used.
#TERM: alacritty
#window:
# Window dimensions (changes require restart)
#
# Number of lines/columns (not pixels) in the terminal. The number of columns
# must be at least `2`, while using a value of `0` for columns and lines will
# fall back to the window manager's recommended size.
#dimensions:
# columns: 0
# lines: 0
# Window position (changes require restart)
#
# Specified in number of pixels.
# If the position is not set, the window manager will handle the placement.
#position:
# x: 0
# y: 0
# Window padding (changes require restart)
#
# Blank space added around the window in pixels. This padding is scaled
# by DPI and the specified value is always added at both opposing sides.
#padding:
# x: 0
# y: 0
# Spread additional padding evenly around the terminal content.
#dynamic_padding: false
# Window decorations
#
# Values for `decorations`:
# - full: Borders and title bar
# - none: Neither borders nor title bar
#
# Values for `decorations` (macOS only):
# - transparent: Title bar, transparent background and title bar buttons
# - buttonless: Title bar, transparent background and no title bar buttons
decorations: none
# Startup Mode (changes require restart)
#
# Values for `startup_mode`:
# - Windowed
# - Maximized
# - Fullscreen
#
# Values for `startup_mode` (macOS only):
# - SimpleFullscreen
#startup_mode: Windowed
# Window title
#title: Alacritty
# Allow terminal applications to change Alacritty's window title.
#dynamic_title: true
# Window class (Linux/BSD only):
#class:
# Application instance name
#instance: Alacritty
# General application class
#general: Alacritty
# GTK theme variant (Linux/BSD only)
#
# Override the variant of the GTK theme. Commonly supported values are `dark`
# and `light`. Set this to `None` to use the default theme variant.
#gtk_theme_variant: None
#scrolling:
# Maximum number of lines in the scrollback buffer.
# Specifying '0' will disable scrolling.
#history: 10000
# Scrolling distance multiplier.
#multiplier: 3
## Font configuration
#font:
# size: 7
#
#TODO I'd like to restore this font configuration, but I can't cause nix
#doesn't play nicely with fontconfig
font:
# Normal (roman) font face
normal:
# Font family
#
# Default:
# - (macOS) Menlo
# - (Linux/BSD) monospace
# - (Windows) Consolas
family: Source Code Pro
# The `style` can be specified to pick a specific face.
style: Regular
# Bold font face
bold:
# Font family
#
# If the bold family is not specified, it will fall back to the
# value specified for the normal font.
family: Source Code Pro
# The `style` can be specified to pick a specific face.
style: Bold
# Italic font face
italic:
# Font family
#
# If the italic family is not specified, it will fall back to the
# value specified for the normal font.
family: Source Code Pro
# The `style` can be specified to pick a specific face.
style: Italic
# Bold italic font face
bold_italic:
# Font family
#
# If the bold italic family is not specified, it will fall back to the
# value specified for the normal font.
family: Source Code Pro
# The `style` can be specified to pick a specific face.
style: Bold Italic
# Point size
size: 6.3
# Offset is the extra space around each character. `offset.y` can be thought
# of as modifying the line spacing, and `offset.x` as modifying the letter
# spacing.
#offset:
# x: 0
# y: 0
# Glyph offset determines the locations of the glyphs within their cells with
# the default being at the bottom. Increasing `x` moves the glyph to the
# right, increasing `y` moves the glyph upward.
#glyph_offset:
# x: 0
# y: 0
# Thin stroke font rendering (macOS only)
#
# Thin strokes are suitable for retina displays, but for non-retina screens
# it is recommended to set `use_thin_strokes` to `false`.
#use_thin_strokes: true
# If `true`, bold text is drawn using the bright color variants.
#draw_bold_text_with_bright_colors: false
# Base16 PaperColor Light 256 - alacritty color config
# Jon Leopard (http://github.com/jonleopard) based on PaperColor Theme (https://github.com/NLKNguyen/papercolor-theme)
colors:
# Default colors
primary:
background: '0xeeeeee'
foreground: '0x444444'
# Colors the cursor will use if `custom_cursor_colors` is true
cursor:
text: '0xeeeeee'
cursor: '0x444444'
# Normal colors
normal:
black: '0xeeeeee'
red: '0xbcbcbc'
green: '0x8700af'
yellow: '0xd70087'
blue: '0xd75f00'
magenta: '0x005faf'
cyan: '0xd75f00'
white: '0x444444'
# Bright colors
bright:
black: '0x5f8700'
red: '0xbcbcbc'
green: '0x8700af'
yellow: '0xd70087'
blue: '0xd75f00'
magenta: '0x005faf'
cyan: '0xd75f00'
white: '0x878787'
indexed_colors:
- { index: 16, color: '0xd70000' }
- { index: 17, color: '0x005f87' }
- { index: 18, color: '0xaf0000' }
- { index: 19, color: '0x008700' }
- { index: 20, color: '0x0087af' }
- { index: 21, color: '0x005f87' }
# Colors (Tomorrow Night)
#colors:
# Default colors
#primary:
# background: '#1d1f21'
# foreground: '#c5c8c6'
# Bright and dim foreground colors
#
# The dimmed foreground color is calculated automatically if it is not
# present. If the bright foreground color is not set, or
# `draw_bold_text_with_bright_colors` is `false`, the normal foreground
# color will be used.
#dim_foreground: '#828482'
#bright_foreground: '#eaeaea'
# Cursor colors
#
# Colors which should be used to draw the terminal cursor.
#
# Allowed values are CellForeground and CellBackground, which reference the
# affected cell, or hexadecimal colors like #ff00ff.
#cursor:
# text: CellBackground
# cursor: CellForeground
# Vi mode cursor colors
#
# Colors for the cursor when the vi mode is active.
#
# Allowed values are CellForeground and CellBackground, which reference the
# affected cell, or hexadecimal colors like #ff00ff.
#vi_mode_cursor:
# text: CellBackground
# cursor: CellForeground
# Search colors
#
# Colors used for the search bar and match highlighting.
#search:
# Allowed values are CellForeground and CellBackground, which reference the
# affected cell, or hexadecimal colors like #ff00ff.
#matches:
# foreground: '#000000'
# background: '#ffffff'
#focused_match:
# foreground: CellBackground
# background: CellForeground
#bar:
# background: '#c5c8c6'
# foreground: '#1d1f21'
# Line indicator
#
# Color used for the indicator displaying the position in history during
# search and vi mode.
#
# By default, these will use the opposing primary color.
#line_indicator:
# foreground: None
# background: None
# Selection colors
#
# Colors which should be used to draw the selection area.
#
# Allowed values are CellForeground and CellBackground, which reference the
# affected cell, or hexadecimal colors like #ff00ff.
#selection:
# text: CellBackground
# background: CellForeground
# Normal colors
#normal:
# black: '#1d1f21'
# red: '#cc6666'
# green: '#b5bd68'
# yellow: '#f0c674'
# blue: '#81a2be'
# magenta: '#b294bb'
# cyan: '#8abeb7'
# white: '#c5c8c6'
# Bright colors
#bright:
# black: '#666666'
# red: '#d54e53'
# green: '#b9ca4a'
# yellow: '#e7c547'
# blue: '#7aa6da'
# magenta: '#c397d8'
# cyan: '#70c0b1'
# white: '#eaeaea'
# Dim colors
#
# If the dim colors are not set, they will be calculated automatically based
# on the `normal` colors.
#dim:
# black: '#131415'
# red: '#864343'
# green: '#777c44'
# yellow: '#9e824c'
# blue: '#556a7d'
# magenta: '#75617b'
# cyan: '#5b7d78'
# white: '#828482'
# Indexed Colors
#
# The indexed colors include all colors from 16 to 256.
# When these are not set, they're filled with sensible defaults.
#
# Example:
# `- { index: 16, color: '#ff00ff' }`
#
#indexed_colors: []
# Bell
#
# The bell is rung every time the BEL control character is received.
#bell:
# Visual Bell Animation
#
# Animation effect for flashing the screen when the visual bell is rung.
#
# Values for `animation`:
# - Ease
# - EaseOut
# - EaseOutSine
# - EaseOutQuad
# - EaseOutCubic
# - EaseOutQuart
# - EaseOutQuint
# - EaseOutExpo
# - EaseOutCirc
# - Linear
#animation: EaseOutExpo
# Duration of the visual bell flash in milliseconds. A `duration` of `0` will
# disable the visual bell animation.
#duration: 0
# Visual bell animation color.
#color: '#ffffff'
# Bell Command
#
# This program is executed whenever the bell is rung.
#
# When set to `command: None`, no command will be executed.
#
# Example:
# command:
# program: notify-send
# args: ["Hello, World!"]
#
#command: None
# Background opacity
#
# Window opacity as a floating point number from `0.0` to `1.0`.
# The value `0.0` is completely transparent and `1.0` is opaque.
#background_opacity: 1.0
#selection:
# This string contains all characters that are used as separators for
# "semantic words" in Alacritty.
#semantic_escape_chars: ",│`|:\"' ()[]{}<>\t"
# When set to `true`, selected text will be copied to the primary clipboard.
#save_to_clipboard: false
#cursor:
# Cursor style
#style:
# Cursor shape
#
# Values for `shape`:
# - ▇ Block
# - _ Underline
# - | Beam
#shape: Block
# Cursor blinking state
#
# Values for `blinking`:
# - Never: Prevent the cursor from ever blinking
# - Off: Disable blinking by default
# - On: Enable blinking by default
# - Always: Force the cursor to always blink
#blinking: Off
# Vi mode cursor style
#
# If the vi mode cursor style is `None` or not specified, it will fall back to
# the style of the active value of the normal cursor.
#
# See `cursor.style` for available options.
#vi_mode_style: None
# Cursor blinking interval in milliseconds.
#blink_interval: 750
# If this is `true`, the cursor will be rendered as a hollow box when the
# window is not focused.
#unfocused_hollow: true
# Thickness of the cursor relative to the cell width as floating point number
# from `0.0` to `1.0`.
#thickness: 0.15
# Live config reload (changes require restart)
#live_config_reload: true
# Shell
#
# You can set `shell.program` to the path of your favorite shell, e.g.
# `/bin/fish`. Entries in `shell.args` are passed unmodified as arguments to the
# shell.
#
# Default:
# - (macOS) /bin/bash --login
# - (Linux/BSD) user login shell
# - (Windows) powershell
#shell:
# program: /bin/bash
# args:
# - --login
# Startup directory
#
# Directory the shell is started in. If this is unset, or `None`, the working
# directory of the parent process will be used.
#working_directory: None
# Send ESC (\x1b) before characters when alt is pressed.
#alt_send_esc: true
#mouse:
# Click settings
#
# The `double_click` and `triple_click` settings control the time
# alacritty should wait for accepting multiple clicks as one double
# or triple click.
#double_click: { threshold: 300 }
#triple_click: { threshold: 300 }
# If this is `true`, the cursor is temporarily hidden when typing.
#hide_when_typing: false
#url:
# URL launcher
#
# This program is executed when clicking on a text which is recognized as a
# URL. The URL is always added to the command as the last parameter.
#
# When set to `launcher: None`, URL launching will be disabled completely.
#
# Default:
# - (macOS) open
# - (Linux/BSD) xdg-open
# - (Windows) explorer
#launcher:
# program: xdg-open
# args: []
# URL modifiers
#
# These are the modifiers that need to be held down for opening URLs when
# clicking on them. The available modifiers are documented in the key
# binding section.
#modifiers: None
# Mouse bindings
#
# Mouse bindings are specified as a list of objects, much like the key
# bindings further below.
#
# To trigger mouse bindings when an application running within Alacritty
# captures the mouse, the `Shift` modifier is automatically added as a
# requirement.
#
# Each mouse binding will specify a:
#
# - `mouse`:
#
# - Middle
# - Left
# - Right
# - Numeric identifier such as `5`
#
# - `action` (see key bindings)
#
# And optionally:
#
# - `mods` (see key bindings)
#mouse_bindings:
# - { mouse: Middle, action: PasteSelection }
# Key bindings
#
# Key bindings are specified as a list of objects. For example, this is the
# default paste binding:
#
# `- { key: V, mods: Control|Shift, action: Paste }`
#
# Each key binding will specify a:
#
# - `key`: Identifier of the key pressed
#
# - A-Z
# - F1-F24
# - Key0-Key9
#
# A full list with available key codes can be found here:
# https://docs.rs/glutin/*/glutin/event/enum.VirtualKeyCode.html#variants
#
# Instead of using the name of the keys, the `key` field also supports using
# the scancode of the desired key. Scancodes have to be specified as a
# decimal number. This command will allow you to display the hex scancodes
# for certain keys:
#
# `showkey --scancodes`.
#
# Then exactly one of:
#
# - `chars`: Send a byte sequence to the running application
#
# The `chars` field writes the specified string to the terminal. This makes
# it possible to pass escape sequences. To find escape codes for bindings
# like `PageUp` (`"\x1b[5~"`), you can run the command `showkey -a` outside
# of tmux. Note that applications use terminfo to map escape sequences back
# to keys. It is therefore required to update the terminfo when changing an
# escape sequence.
#
# - `action`: Execute a predefined action
#
# - ToggleViMode
# - SearchForward
# Start searching toward the right of the search origin.
# - SearchBackward
# Start searching toward the left of the search origin.
# - Copy
# - Paste
# - IncreaseFontSize
# - DecreaseFontSize
# - ResetFontSize
# - ScrollPageUp
# - ScrollPageDown
# - ScrollHalfPageUp
# - ScrollHalfPageDown
# - ScrollLineUp
# - ScrollLineDown
# - ScrollToTop
# - ScrollToBottom
# - ClearHistory
# Remove the terminal's scrollback history.
# - Hide
# Hide the Alacritty window.
# - Minimize
# Minimize the Alacritty window.
# - Quit
# Quit Alacritty.
# - ToggleFullscreen
# - SpawnNewInstance
# Spawn a new instance of Alacritty.
# - ClearLogNotice
# Clear Alacritty's UI warning and error notice.
# - ClearSelection
# Remove the active selection.
# - ReceiveChar
# - None
#
# - Vi mode exclusive actions:
#
# - Open
# Open URLs at the cursor location with the launcher configured in
# `url.launcher`.
# - ToggleNormalSelection
# - ToggleLineSelection
# - ToggleBlockSelection
# - ToggleSemanticSelection
# Toggle semantic selection based on `selection.semantic_escape_chars`.
#
# - Vi mode exclusive cursor motion actions:
#
# - Up
# One line up.
# - Down
# One line down.
# - Left
# One character left.
# - Right
# One character right.
# - First
# First column, or beginning of the line when already at the first column.
# - Last
# Last column, or beginning of the line when already at the last column.
# - FirstOccupied
# First non-empty cell in this terminal row, or first non-empty cell of
# the line when already at the first cell of the row.
# - High
# Top of the screen.
# - Middle
# Center of the screen.
# - Low
# Bottom of the screen.
# - SemanticLeft
# Start of the previous semantically separated word.
# - SemanticRight
# Start of the next semantically separated word.
# - SemanticLeftEnd
# End of the previous semantically separated word.
# - SemanticRightEnd
# End of the next semantically separated word.
# - WordLeft
# Start of the previous whitespace separated word.
# - WordRight
# Start of the next whitespace separated word.
# - WordLeftEnd
# End of the previous whitespace separated word.
# - WordRightEnd
# End of the next whitespace separated word.
# - Bracket
# Character matching the bracket at the cursor's location.
# - SearchNext
# Beginning of the next match.
# - SearchPrevious
# Beginning of the previous match.
# - SearchStart
# Start of the match to the left of the vi mode cursor.
# - SearchEnd
# End of the match to the right of the vi mode cursor.
#
# - Search mode exclusive actions:
# - SearchFocusNext
# Move the focus to the next search match.
# - SearchFocusPrevious
# Move the focus to the previous search match.
# - SearchConfirm
# - SearchCancel
# - SearchClear
# Reset the search regex.
# - SearchDeleteWord
# Delete the last word in the search regex.
# - SearchHistoryPrevious
# Go to the previous regex in the search history.
# - SearchHistoryNext
# Go to the next regex in the search history.
#
# - macOS exclusive actions:
# - ToggleSimpleFullscreen
# Enter fullscreen without occupying another space.
#
# - Linux/BSD exclusive actions:
#
# - CopySelection
# Copy from the selection buffer.
# - PasteSelection
# Paste from the selection buffer.
#
# - `command`: Fork and execute a specified command plus arguments
#
# The `command` field must be a map containing a `program` string and an
# `args` array of command line parameter strings. For example:
# `{ program: "alacritty", args: ["-e", "vttest"] }`
#
# And optionally:
#
# - `mods`: Key modifiers to filter binding actions
#
# - Command
# - Control
# - Option
# - Super
# - Shift
# - Alt
#
# Multiple `mods` can be combined using `|` like this:
# `mods: Control|Shift`.
# Whitespace and capitalization are relevant and must match the example.
#
# - `mode`: Indicate a binding for only specific terminal reported modes
#
# This is mainly used to send applications the correct escape sequences
# when in different modes.
#
# - AppCursor
# - AppKeypad
# - Search
# - Alt
# - Vi
#
# A `~` operator can be used before a mode to apply the binding whenever
# the mode is *not* active, e.g. `~Alt`.
#
# Bindings are always filled by default, but will be replaced when a new
# binding with the same triggers is defined. To unset a default binding, it can
# be mapped to the `ReceiveChar` action. Alternatively, you can use `None` for
# a no-op if you do not wish to receive input characters for that binding.
#
# If the same trigger is assigned to multiple actions, all of them are executed
# in the order they were defined in.
#key_bindings:
#- { key: Paste, action: Paste }
#- { key: Copy, action: Copy }
#- { key: L, mods: Control, action: ClearLogNotice }
#- { key: L, mods: Control, mode: ~Vi|~Search, chars: "\x0c" }
#- { key: PageUp, mods: Shift, mode: ~Alt, action: ScrollPageUp, }
#- { key: PageDown, mods: Shift, mode: ~Alt, action: ScrollPageDown }
#- { key: Home, mods: Shift, mode: ~Alt, action: ScrollToTop, }
#- { key: End, mods: Shift, mode: ~Alt, action: ScrollToBottom }
# Vi Mode
#- { key: Space, mods: Shift|Control, mode: Vi|~Search, action: ScrollToBottom }
#- { key: Space, mods: Shift|Control, mode: ~Search, action: ToggleViMode }
#- { key: Escape, mode: Vi|~Search, action: ClearSelection }
#- { key: I, mode: Vi|~Search, action: ScrollToBottom }
#- { key: I, mode: Vi|~Search, action: ToggleViMode }
#- { key: C, mods: Control, mode: Vi|~Search, action: ToggleViMode }
#- { key: Y, mods: Control, mode: Vi|~Search, action: ScrollLineUp }
#- { key: E, mods: Control, mode: Vi|~Search, action: ScrollLineDown }
#- { key: G, mode: Vi|~Search, action: ScrollToTop }
#- { key: G, mods: Shift, mode: Vi|~Search, action: ScrollToBottom }
#- { key: B, mods: Control, mode: Vi|~Search, action: ScrollPageUp }
#- { key: F, mods: Control, mode: Vi|~Search, action: ScrollPageDown }
#- { key: U, mods: Control, mode: Vi|~Search, action: ScrollHalfPageUp }
#- { key: D, mods: Control, mode: Vi|~Search, action: ScrollHalfPageDown }
#- { key: Y, mode: Vi|~Search, action: Copy }
#- { key: Y, mode: Vi|~Search, action: ClearSelection }
#- { key: Copy, mode: Vi|~Search, action: ClearSelection }
#- { key: V, mode: Vi|~Search, action: ToggleNormalSelection }
#- { key: V, mods: Shift, mode: Vi|~Search, action: ToggleLineSelection }
#- { key: V, mods: Control, mode: Vi|~Search, action: ToggleBlockSelection }
#- { key: V, mods: Alt, mode: Vi|~Search, action: ToggleSemanticSelection }
#- { key: Return, mode: Vi|~Search, action: Open }
#- { key: K, mode: Vi|~Search, action: Up }
#- { key: J, mode: Vi|~Search, action: Down }
#- { key: H, mode: Vi|~Search, action: Left }
#- { key: L, mode: Vi|~Search, action: Right }
#- { key: Up, mode: Vi|~Search, action: Up }
#- { key: Down, mode: Vi|~Search, action: Down }
#- { key: Left, mode: Vi|~Search, action: Left }
#- { key: Right, mode: Vi|~Search, action: Right }
#- { key: Key0, mode: Vi|~Search, action: First }
#- { key: Key4, mods: Shift, mode: Vi|~Search, action: Last }
#- { key: Key6, mods: Shift, mode: Vi|~Search, action: FirstOccupied }
#- { key: H, mods: Shift, mode: Vi|~Search, action: High }
#- { key: M, mods: Shift, mode: Vi|~Search, action: Middle }
#- { key: L, mods: Shift, mode: Vi|~Search, action: Low }
#- { key: B, mode: Vi|~Search, action: SemanticLeft }
#- { key: W, mode: Vi|~Search, action: SemanticRight }
#- { key: E, mode: Vi|~Search, action: SemanticRightEnd }
#- { key: B, mods: Shift, mode: Vi|~Search, action: WordLeft }
#- { key: W, mods: Shift, mode: Vi|~Search, action: WordRight }
#- { key: E, mods: Shift, mode: Vi|~Search, action: WordRightEnd }
#- { key: Key5, mods: Shift, mode: Vi|~Search, action: Bracket }
#- { key: Slash, mode: Vi|~Search, action: SearchForward }
#- { key: Slash, mods: Shift, mode: Vi|~Search, action: SearchBackward }
#- { key: N, mode: Vi|~Search, action: SearchNext }
#- { key: N, mods: Shift, mode: Vi|~Search, action: SearchPrevious }
# Search Mode
#- { key: Return, mode: Search|Vi, action: SearchConfirm }
#- { key: Escape, mode: Search, action: SearchCancel }
#- { key: C, mods: Control, mode: Search, action: SearchCancel }
#- { key: U, mods: Control, mode: Search, action: SearchClear }
#- { key: W, mods: Control, mode: Search, action: SearchDeleteWord }
#- { key: P, mods: Control, mode: Search, action: SearchHistoryPrevious }
#- { key: N, mods: Control, mode: Search, action: SearchHistoryNext }
#- { key: Up, mode: Search, action: SearchHistoryPrevious }
#- { key: Down, mode: Search, action: SearchHistoryNext }
#- { key: Return, mode: Search|~Vi, action: SearchFocusNext }
#- { key: Return, mods: Shift, mode: Search|~Vi, action: SearchFocusPrevious }
# (Windows, Linux, and BSD only)
#- { key: V, mods: Control|Shift, mode: ~Vi, action: Paste }
#- { key: C, mods: Control|Shift, action: Copy }
#- { key: F, mods: Control|Shift, mode: ~Search, action: SearchForward }
#- { key: B, mods: Control|Shift, mode: ~Search, action: SearchBackward }
#- { key: C, mods: Control|Shift, mode: Vi|~Search, action: ClearSelection }
#- { key: Insert, mods: Shift, action: PasteSelection }
#- { key: Key0, mods: Control, action: ResetFontSize }
#- { key: Equals, mods: Control, action: IncreaseFontSize }
#- { key: Plus, mods: Control, action: IncreaseFontSize }
#- { key: NumpadAdd, mods: Control, action: IncreaseFontSize }
#- { key: Minus, mods: Control, action: DecreaseFontSize }
#- { key: NumpadSubtract, mods: Control, action: DecreaseFontSize }
# (Windows only)
#- { key: Return, mods: Alt, action: ToggleFullscreen }
# (macOS only)
#- { key: K, mods: Command, mode: ~Vi|~Search, chars: "\x0c" }
#- { key: K, mods: Command, mode: ~Vi|~Search, action: ClearHistory }
#- { key: Key0, mods: Command, action: ResetFontSize }
#- { key: Equals, mods: Command, action: IncreaseFontSize }
#- { key: Plus, mods: Command, action: IncreaseFontSize }
#- { key: NumpadAdd, mods: Command, action: IncreaseFontSize }
#- { key: Minus, mods: Command, action: DecreaseFontSize }
#- { key: NumpadSubtract, mods: Command, action: DecreaseFontSize }
#- { key: V, mods: Command, action: Paste }
#- { key: C, mods: Command, action: Copy }
#- { key: C, mods: Command, mode: Vi|~Search, action: ClearSelection }
#- { key: H, mods: Command, action: Hide }
#- { key: M, mods: Command, action: Minimize }
#- { key: Q, mods: Command, action: Quit }
#- { key: W, mods: Command, action: Quit }
#- { key: N, mods: Command, action: SpawnNewInstance }
#- { key: F, mods: Command|Control, action: ToggleFullscreen }
#- { key: F, mods: Command, mode: ~Search, action: SearchForward }
#- { key: B, mods: Command, mode: ~Search, action: SearchBackward }
#debug:
# Display the time it takes to redraw each frame.
#render_timer: false
# Keep the log file after quitting Alacritty.
#persistent_logging: false
# Log level
#
# Values for `log_level`:
# - Off
# - Error
# - Warn
# - Info
# - Debug
# - Trace
#log_level: Warn
# Print all received window events.
#print_events: false

@ -0,0 +1,35 @@
{
pkgs ? (import ../pkgs.nix) {},
zsh ? pkgs.zsh,
}: rec {
# TODO figure out a way to provide my font to alacritty at runtime. fontconfig
# is a hot mess...
#
#dataDir = pkgs.stdenv.mkDerivation {
# name = "alacritty-dataDir";
# src = ./fonts;
# buildInputs = [ pkgs.fontconfig ];
# builder = builtins.toFile "builder.sh" ''
# source $stdenv/setup
# mkdir "$out"
# cp -r "$src" "$out"/fonts
# chmod -R +w "$out"
# env
# export FONTCONFIG_FILE="$out"/fontconfig
# fc-cache --verbose "$out"/fonts
# '';
#};
alacritty = pkgs.writeScriptBin "alacritty" ''
#!${pkgs.bash}/bin/bash
exec ${pkgs.nixgl}/bin/nixGLIntel ${pkgs.alacritty}/bin/alacritty \
--config-file ${./alacritty.yml} \
-e "${zsh}/bin/zsh"
'';
}

@ -0,0 +1,17 @@
{
pkgsSrc ? ./pkgs.nix,
}: let
nixBundle = builtins.fetchGit {
url = "https://github.com/matthewbauer/nix-bundle.git";
rev = "223f4ffc4179aa318c34dc873a08cb00090db829";
};
appimageTop = (import "${nixBundle}/appimage-top.nix") {
nixpkgs' = pkgsSrc;
};
in { name, target }:
appimageTop.appimage (appimageTop.appdir { inherit name target; })

@ -0,0 +1,9 @@
# For use in ubuntu, just copy into /usr/share/xsessions
[Desktop Entry]
Name=awesome
Comment=Highly configurable framework window manager
Exec=/home/mediocregopher/.nix-profile/bin/awesome
Type=Application
Icon=/usr/share/pixmaps/awesome.xpm
Keywords=Window manager

@ -0,0 +1,43 @@
local io = io
local math = math
local tonumber = tonumber
local string = string
local naughty = require("naughty")
function batteryInfo()
for i=0,1 do
local dir = "/sys/class/power_supply/BAT" .. tostring(i) .. "/"
local f_status = io.popen("cat " .. dir .. "status 2>/dev/null")
local c_status = f_status:read()
f_status:close()
if c_status and c_status ~= "" then
local prefix = "energy"
local f_now = io.popen("cat " .. dir .. prefix .. "_now 2>/dev/null")
local c_now_str = f_now:read()
f_now:close()
if not c_now_str or c_now_str == "" then
prefix = "charge"
local f_now = io.popen("cat " .. dir .. prefix .. "_now")
c_now_str = f_now:read()
f_now:close()
end
local f_full = io.popen("cat " .. dir .. prefix .. "_full")
local c_full_str = f_full:read()
f_full:close()
local c_now = tonumber(c_now_str)
local c_full = tonumber(c_full_str)
local charging = (c_status == "Charging" or c_status == "Full")
if c_now ~= nil and c_full ~= nil then
local percent = math.floor((c_now/c_full) * 100)
return percent, charging
end
end
end
return nil, charging
end

Binary file not shown.

Binary file not shown.

@ -0,0 +1,4 @@
#!/bin/sh
R=`find "$1" | grep -P 'png$' | sort -R | head -n1`
exec i3lock -i $R -t

@ -0,0 +1,4 @@
#!/bin/sh
scrot -o -s "/tmp/shot.png"
eog /tmp/shot.png

@ -0,0 +1,50 @@
#!/bin/bash
cd $(dirname "$0")
sep=" | "
out=$(/home/mediocregopher/.config/awesome/bin/cricket \
--limit 1 \
--ping-hosts 8.8.8.8 \
--net-interval "" \
--disk-interval "" \
--disk-io-interval "")
function outNum {
echo "$out" | grep "$1" | grep -oP "$2=\"[0-9]+\"" | grep -oP '[0-9]+'
}
echo -n "ping:$(outNum "ping result" "tookMSAvg")ms"
echo -n "$sep"
memBarSize=10
memPer=$(outNum "mem stats" "memUsedPer")
memUsed=$(expr $memPer / $memBarSize)
memUnused=$(expr $memBarSize - $memUsed)
echo -n "mem:"
for i in $(seq $memUsed); do echo -n "█"; done
for i in $(seq $memUnused); do echo -n "░"; done
for i in $(seq $(expr $memBarSize - $memUsed - $memUnused)); do echo -n "░"; done
echo -n "$sep"
cpuBarSize=20
cpuIdle=$(outNum "cpu stats" "cpuIdle")
cpuSys=$(outNum "cpu stats" "cpuSystem")
cpuUser=$(outNum "cpu stats" "cpuUser")
cpuTot=$(expr $cpuIdle + $cpuSys + $cpuUser)
function cpuL {
python -c "print(int($1 / $cpuTot * $cpuBarSize))"
}
cpuLIdle=$(cpuL $cpuIdle)
cpuLSys=$(cpuL $cpuSys)
cpuLUser=$(cpuL $cpuUser)
echo -n "cpu:"
for i in $(seq $cpuLUser); do echo -n "█"; done
for i in $(seq $cpuLSys); do echo -n "▓"; done
for i in $(seq $cpuLIdle); do echo -n "░"; done
for i in $(seq $(expr $cpuBarSize - $cpuLIdle - $cpuLSys - $cpuLUser)); do echo -n "░"; done
echo ""

@ -0,0 +1,26 @@
{
pkgs ? (import ../pkgs.nix) {},
}: rec {
cfg = ./.;
wp = ../wallpapers;
dirsLua = pkgs.writeTextDir "dirs.lua" ''
home_dir = os.getenv("HOME").."/"
conf_dir = "${cfg}/"
wp_dir = "${wp}/"
'';
awesome = pkgs.writeScriptBin "awesome" ''
#!${pkgs.bash}/bin/bash
echo "[$(date)] New awesome session starting" > ~/.awesome.log
exec ${pkgs.awesome}/bin/awesome \
-c ${cfg}/rc.lua \
--search ${dirsLua} \
--search ${cfg} \
2>&1 2>>~/.awesome.log
'';
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

@ -0,0 +1,13 @@
[Unit]
Description=mediocregopher's sysstats
Requires=network.target
After=network.target
[Service]
Restart=always
RestartSec=1s
User=mediocregopher
ExecStart=/bin/bash -c 'while [ 1 ]; do out=$(~/.config/awesome/bin/sysstats.sh); echo "$out" > /tmp/sysstats; sleep 1; done'
[Install]
WantedBy=multi-user.target

@ -0,0 +1,40 @@
local io = io
local math = math
local tonumber = tonumber
local tostring = tostring
local string = string
local naughty = require("naughty")
function volumeInfo()
volmin = 0
volmax = 65536
local f = io.popen("pacmd dump |grep set-sink-volume|grep analog-stereo")
local g = io.popen("pacmd dump |grep set-sink-mute|grep analog-stereo")
local v = f:read()
local mute = g:read()
if mute ~= nil and string.find(mute, "no") then
volume = math.floor(tonumber(string.sub(v, string.find(v, 'x')-1)) * 100 / volmax)
else
volume = "off"
end
f:close()
g:close()
return "vol:"..volume.." "
end
function muteAll()
local outh = io.popen("pactl list short sources | awk '{print $1}'")
while true do
local i = outh:read()
if i == nil then break end
io.popen("pactl set-source-mute " .. i .. " 1"):close()
end
outh:close()
end
function unmuted()
local outh = io.popen("pactl list sources | grep 'Mute: no'")
local any = outh:read()
outh:close()
return any ~= nil
end

@ -0,0 +1,544 @@
-- Standard awesome library
local gears = require("gears")
local awful = require("awful")
awful.rules = require("awful.rules")
require("awful.autofocus")
-- Widget and layout library
local wibox = require("wibox")
-- Notification library
local naughty = require("naughty")
local menubar = require("menubar")
local function debug(msg)
if not msg then msg = "" end
naughty.notify({ text = "debug: " .. msg })
end
local function info(msg)
naughty.notify({ text = msg })
end
require("dirs")
require("bat")
require("pulseaudio")
muteAll() -- pre-emptively mute all mics, just in-case
-- for sanity
local home_dir = os.getenv("HOME").."/"
-- {{{ Naughty config (the notification library)
naughty.config.defaults.position = "bottom_right"
naughty.config.defaults.width = 250
naughty.config.defaults.icon=conf_dir .. "helper.png"
naughty.config.defaults.icon_size = 75
-- }}}
-- {{{ Error handling
-- Check if awesome encountered an error during startup and fell back to
-- another config (This code will only ever execute for the fallback config)
if awesome.startup_errors then
naughty.notify({ preset = naughty.config.presets.critical,
title = "Oops, there were errors during startup!",
text = awesome.startup_errors })
end
-- Handle runtime errors after startup
do
local in_error = false
awesome.connect_signal("debug::error", function (err)
-- Make sure we don't go into an endless error loop
if in_error then return end
in_error = true
naughty.notify({ preset = naughty.config.presets.critical,
title = "Oops, an error happened!",
text = err })
in_error = false
end)
end
-- }}}
local beautiful = require("beautiful")
-- {{{ Wallpaper
-- we do this here, before the theme is loaded, because our theme depends on
-- knowing what our wallpaper is, cause this shit is cray
function rand_wp()
local ls = io.popen("ls " .. wp_dir .. " | shuf -n1")
local wp = ls:read("*l")
return wp_dir .. '/' .. wp
end
function rand_wp_lock()
awful.spawn(conf_dir.."bin/random_i3lock.sh "..wp_dir, false)
end
local wp = rand_wp()
local imgavg = io.popen("cat " .. wp .. " | " .. conf_dir .. "/bin/imgavg")
local avgcolor = imgavg:read()
local comcolor = imgavg:read()
imgavg:close()
for s = 1, screen.count() do
gears.wallpaper.maximized(wp, s, true)
end
-- }}}
require("theme/theme")
local theme = load_theme(avgcolor, comcolor)
beautiful.init(theme)
-- This is used later as the default terminal and editor to run.
terminal = "alacritty"
editor = os.getenv("EDITOR") or "nano"
editor_cmd = terminal .. " -e " .. editor
-- Default modkey.
-- Usually, Mod4 is the key with a logo between Control and Alt.
-- If you do not like this or do not have such a key,
-- I suggest you to remap Mod4 to another key using xmodmap or other tools.
-- However, you can use another modifier like Mod1, but it may interact with others.
modkey = "Mod4"
-- Table of layouts to cover with awful.layout.inc, order matters.
local layouts =
{
awful.layout.suit.fair,
awful.layout.suit.fair.horizontal,
awful.layout.suit.tile,
awful.layout.suit.tile.left,
awful.layout.suit.tile.bottom,
awful.layout.suit.tile.top,
-- awful.layout.suit.spiral,
-- awful.layout.suit.spiral.dwindle,
-- awful.layout.suit.max,
-- awful.layout.suit.max.fullscreen,
-- awful.layout.suit.magnifier,
awful.layout.suit.floating
}
-- }}}
-- {{{ Tags
-- Define a tag table which hold all screen tags.
tags = {}
for s = 1, screen.count() do
-- Each screen has its own tag table.
tags[s] = awful.tag({ 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s, layouts[1])
end
-- }}}
-- Menubar configuration
menubar.utils.terminal = terminal -- Set the terminal for applications that require it
-- {{{ Wibox
-- {{{ Battery widget
local battimerintvl = 4
batwidget = wibox.widget.textbox("")
battimer = gears.timer({ timeout = battimerintvl })
battimer:connect_signal("timeout",
function()
local batlevel, charging = batteryInfo()
if batlevel == nil then batlevel = "unk"
elseif (tonumber(batlevel) < 10) then
naughty.notify({
preset = naughty.config.presets.critical,
title="ALERT",
text="BATTERY LEVEL LOW",
timeout=battimerintvl-1,
})
end
if charging then
batwidget:set_markup('bat:'..batlevel)
else
batwidget:set_markup('<b>bat:'..batlevel..'</b>')
end
end)
battimer:start()
-- }}}
-- {{{ sysstats widget
sysstatswidget = wibox.widget.textbox("")
sysstatstimer = gears.timer({ timeout = 1 })
sysstatstimer:connect_signal("timeout",
function()
local sysstats = "??? STATS ???"
local f_sysstats = io.open("/tmp/sysstats")
if f_sysstats then
c_sysstats = f_sysstats:read()
f_sysstats:close()
if c_sysstats then sysstats = c_sysstats end
end
sysstatswidget:set_markup(sysstats)
end)
sysstatstimer:start()
-- }}}
-- {{{ notifier for when my mic isn't muted
local unmuteNot
mutechecktimer = gears.timer({ timeout = 0.5 })
mutechecktimer:connect_signal("timeout",
function()
local anyUnmuted = unmuted()
if unmuteNot and not anyUnmuted then
naughty.destroy(unmuteNot, naughty.notificationClosedReason.dismissedByUser)
unmuteNot = nil
elseif not unmuteNot and anyUnmuted then
unmuteNot = naughty.notify({
preset = naughty.config.presets.critical,
text = "Mic is hot!",
timeout = 0,
})
end
end)
mutechecktimer:start()
-- }}}
-- Create a textclock widget
mytextclock = wibox.widget.textclock("%a <b>%d</b>/%m <b>%H:%M</b> %z")
myutctextclock = wibox.widget.textclock("%a %d/%m %H:%M %z", 60, "Z")
-- Create a wibox for each screen and add it
mywibox = {}
mypromptbox = {}
mylayoutbox = {}
mytaglist = {}
mytaglist.buttons = awful.util.table.join(
awful.button({ }, 1, awful.tag.viewonly),
awful.button({ modkey }, 1, awful.client.movetotag),
awful.button({ }, 3, awful.tag.viewtoggle),
awful.button({ modkey }, 3, awful.client.toggletag),
awful.button({ }, 4, function(t) awful.tag.viewnext(awful.tag.getscreen(t)) end),
awful.button({ }, 5, function(t) awful.tag.viewprev(awful.tag.getscreen(t)) end)
)
mytasklist = {}
mytasklist.buttons = awful.util.table.join(
awful.button({ }, 1, function (c)
if c == client.focus then
c.minimized = true
else
-- Without this, the following
-- :isvisible() makes no sense
c.minimized = false
if not c:isvisible() then
awful.tag.viewonly(c:tags()[1])
end
-- This will also un-minimize
-- the client, if needed
client.focus = c
c:raise()
end
end),
awful.button({ }, 3, function ()
if instance then
instance:hide()
instance = nil
else
instance = awful.menu.clients({
theme = { width = 250 }
})
end
end),
awful.button({ }, 4, function ()
awful.client.focus.byidx(1)
if client.focus then client.focus:raise() end
end),
awful.button({ }, 5, function ()
awful.client.focus.byidx(-1)
if client.focus then client.focus:raise() end
end))
for s = 1, screen.count() do
-- Create a promptbox for each screen
mypromptbox[s] = awful.widget.prompt()
-- Create an imagebox widget which will contains an icon indicating which layout we're using.
-- We need one layoutbox per screen.
mylayoutbox[s] = awful.widget.layoutbox(s)
mylayoutbox[s]:buttons(awful.util.table.join(
awful.button({ }, 1, function () awful.layout.inc(layouts, 1) end),
awful.button({ }, 3, function () awful.layout.inc(layouts, -1) end),
awful.button({ }, 4, function () awful.layout.inc(layouts, 1) end),
awful.button({ }, 5, function () awful.layout.inc(layouts, -1) end)))
-- Create a taglist widget
mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.filter.all, mytaglist.buttons)
-- Create a tasklist widget
mytasklist[s] = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons)
-- Create the wibox
mywibox[s] = awful.wibar({ position = "top", screen = s })
-- Widgets that are aligned to the left
local left_layout = wibox.layout.fixed.horizontal()
left_layout:add(mylayoutbox[s])
left_layout:add(mypromptbox[s])
-- Widgets that are aligned to the right
local right_sep = " | "
local right_layout = wibox.layout.fixed.horizontal()
--right_layout:add(wibox.widget.textbox(right_sep))
right_layout:add(sysstatswidget)
right_layout:add(wibox.widget.textbox(right_sep))
right_layout:add(batwidget)
right_layout:add(wibox.widget.textbox(right_sep))
right_layout:add(wibox.widget.systray())
right_layout:add(wibox.widget.textbox(right_sep))
right_layout:add(mytaglist[s])
right_layout:add(wibox.widget.textbox(right_sep))
right_layout:add(myutctextclock)
right_layout:add(wibox.widget.textbox(right_sep))
right_layout:add(mytextclock)
-- Now bring it all together (with the tasklist in the middle)
local layout = wibox.layout.align.horizontal()
layout:set_left(left_layout)
layout:set_middle(mytasklist[s])
layout:set_right(right_layout)
mywibox[s]:set_widget(layout)
end
-- }}}
local function focused()
return awful.screen.focused().index
end
-- {{{ Mouse bindings
root.buttons(awful.util.table.join(
-- awful.button({ }, 3, function () mymainmenu:toggle() end),
awful.button({ }, 4, awful.tag.viewnext),
awful.button({ }, 5, awful.tag.viewprev)
))
-- }}}
-- {{{ Key bindings
globalkeys = awful.util.table.join(
awful.key({ modkey, }, "Left", awful.tag.viewprev ),
awful.key({ modkey, }, "Right", awful.tag.viewnext ),
-- j and k are used for moving around windows and moving windows around
awful.key({ modkey, }, "j",
function ()
awful.client.focus.byidx( 1)
if client.focus then client.focus:raise() end
end),
awful.key({ modkey, }, "k",
function ()
awful.client.focus.byidx(-1)
if client.focus then client.focus:raise() end
end),
awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end),
awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end),
awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end),
awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end),
-- h and l are for resizing
awful.key({ modkey, }, "l", function () awful.tag.incmwfact( 0.05) end),
awful.key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end),
awful.key({ modkey, "Control" }, "h", function () awful.tag.incnmaster( 1) end),
awful.key({ modkey, "Control" }, "l", function () awful.tag.incnmaster(-1) end),
-- Space is for changing the layout
awful.key({ modkey, }, "space", function () awful.layout.inc(layouts, 1) end),
awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, -1) end),
-- r is for restart, awesome or the whole computer
awful.key({ modkey }, "r", awesome.restart),
awful.key({ modkey, "Control" }, "r",
function ()
info("rebooting")
awful.spawn("systemctl reboot")
end),
-- Escape is for quitting, either the current program, all of awesome, or
-- or all of everything (suspend) (current program is under clientkeys)
awful.key({ modkey, "Control" }, "Escape", awesome.quit),
awful.key({ modkey, "Control", "Shift" }, "Escape",
function ()
info("hibernating")
awful.spawn("systemctl hibernate")
end),
-- n is for minimizing and unminimizing (minimmize is implemented under
-- clientkeys)
awful.key({ modkey, "Control" }, "n", awful.client.restore),
-- Prompt
awful.key({ modkey }, "p", function ()
local screen = awful.screen.focused().index
mywibox[screen].visible = true
mypromptbox[screen]:run()
end),
--Terminal
awful.key({ modkey }, "Return", function ()
awful.spawn(terminal)
end),
--PrintScreen
awful.key({}, "Print", false, function () awful.spawn(conf_dir.."bin/scrot-gobin.sh",false) end),
awful.key({ "Control" }, "Print", function ()
local scr_dir = home_dir..'Screenshots'
awful.spawn("mkdir -p "..scr_dir, false)
awful.spawn("scrot -e 'mv $f "..scr_dir.."/ 2>/dev/null'",false)
naughty.notify({ text = "Screenshot taken" })
end),
--Lock screen
awful.key({ modkey, "Control" }, "Delete", rand_wp_lock),
awful.key( { }, "XF86AudioRaiseVolume", function()
awful.spawn("/usr/bin/pactl set-sink-volume @DEFAULT_SINK@ +5%", false)
awful.spawn("/usr/bin/pactl set-sink-mute @DEFAULT_SINK@ 0", false)
end),
awful.key( { }, "XF86AudioLowerVolume", function()
awful.spawn("/usr/bin/pactl set-sink-volume @DEFAULT_SINK@ -5%", false)
awful.spawn("/usr/bin/pactl set-sink-mute @DEFAULT_SINK@ 0", false)
end),
awful.key( { }, "XF86AudioMute", function()
awful.spawn("/usr/bin/pactl set-sink-mute @DEFAULT_SINK@ toggle", false)
end),
awful.key( { }, "XF86MonBrightnessUp", function()
awful.spawn("/usr/bin/xbacklight -inc 5", false)
end),
awful.key( { }, "XF86MonBrightnessDown", function()
awful.spawn("/usr/bin/xbacklight -dec 5", false)
end),
-- Push to talk
awful.key( { modkey }, "q", function()
awful.spawn("/usr/bin/pactl set-source-mute @DEFAULT_SOURCE@ 0")
end,
muteAll,
{ })
)
globalkeys = awful.util.table.join(globalkeys,
awful.key( { modkey }, "a", function()
info(tostring(os.time()))
end)
)
clientkeys = awful.util.table.join(
awful.key({ modkey, }, "f", function (c) c.fullscreen = not c.fullscreen end),
awful.key({ modkey, }, "Escape", function (c) c:kill() end),
awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle ),
awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end),
awful.key({ modkey, }, "n",
function (c)
-- The client currently has the input focus, so it cannot be
-- minimized, since minimized clients can't have the focus.
c.minimized = true
end),
awful.key({ modkey, }, "m",
function (c)
c.maximized_horizontal = not c.maximized_horizontal
c.maximized_vertical = not c.maximized_vertical
end)
)
-- Bind all key numbers to tags.
-- Be careful: we use keycodes to make it works on any keyboard layout.
-- This should map on the top row of your keyboard, usually 1 to 9.
for i = 1, 9 do
globalkeys = awful.util.table.join(globalkeys,
-- View tag only.
awful.key({ modkey }, "#" .. i + 9,
function ()
local screen = awful.screen.focused()
local tag = screen.tags[i]
if tag then
tag:view_only()
end
end),
-- Toggle tag.
awful.key({ modkey, "Control" }, "#" .. i + 9,
function ()
local screen = awful.screen.focused()
local tag = screen.tags[i]
if tag then
awful.tag.viewtoggle(tag)
end
end),
-- Move client to tag.
awful.key({ modkey, "Shift" }, "#" .. i + 9,
function ()
if client.focus then
local screen = awful.screen.focused()
local tag = screen.tags[i]
if tag then
client.focus:move_to_tag(tag)
end
end
end))
end
clientbuttons = awful.util.table.join(
awful.button({ }, 1, function (c) client.focus = c; c:raise() end),
awful.button({ modkey }, 1, awful.mouse.client.move),
awful.button({ modkey }, 3, awful.mouse.client.resize))
-- Set keys
root.keys(globalkeys)
-- }}}
-- {{{ Rules
-- Rules to apply to new clients (through the "manage" signal).
awful.rules.rules = {
-- All clients will match this rule.
{ rule = { },
properties = { border_width = beautiful.border_width,
border_color = beautiful.border_normal,
focus = awful.client.focus.filter,
raise = true,
keys = clientkeys,
buttons = clientbuttons } },
{ rule = { class = "MPlayer" },
properties = { floating = true } },
{ rule = { class = "pinentry" },
properties = { floating = true } },
{ rule = { class = "gimp" },
properties = { floating = true } }
-- Set Firefox to always map on tags number 2 of screen 1.
-- { rule = { class = "Firefox" },
-- properties = { tag = tags[1][2] } },
}
-- }}}
-- {{{ Signals
-- Signal function to execute when a new client appears.
client.connect_signal("manage", function (c, startup)
-- Enable sloppy focus
c:connect_signal("mouse::enter", function(c)
if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier
and awful.client.focus.filter(c) then
client.focus = c
end
end)
if not startup then
-- Set the windows at the slave,
-- i.e. put it at the end of others instead of setting it master.
-- awful.client.setslave(c)
-- Put windows in a smart way, only if they does not set an initial position.
if not c.size_hints.user_position and not c.size_hints.program_position then
c:move_to_screen(awful.screen.focused())
awful.placement.no_overlap(c)
awful.placement.no_offscreen(c)
end
end
end)
client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end)
client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end)
-- }}}

@ -0,0 +1,3 @@
Background images:
Mikael Eriksson <mikael_eriksson@miffe.org>
Licensed under CC-BY-SA-3.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 997 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 395 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 388 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 B

@ -0,0 +1,105 @@
---------------------------
-- Default awesome theme --
---------------------------
function load_theme(avgcolor, comcolor)
if not avgcolor then avgcolor = "#000000" end
if not comcolor then comcolor = "#FFFFFF" end
local theme = {}
theme.font = "sans 8"
--theme.bg_normal = "#222222"
theme.bg_normal = avgcolor
theme.bg_focus = theme.bg_normal
theme.bg_urgent = "#ff0000" -- TODO should be opposite of bg_normal
theme.bg_minimize = theme.bg_normal
theme.bg_systray = theme.bg_normal
--theme.fg_normal = "#aaaaaa"
theme.fg_normal = comcolor
theme.fg_focus = comcolor
theme.fg_urgent = "#ffffff"
theme.fg_minimize = comcolor
theme.border_width = 1
theme.border_normal = "#000000"
theme.border_focus = "#535d6c"
theme.border_marked = "#91231c"
-- There are other variable sets
-- overriding the default one when
-- defined, the sets are:
-- [taglist|tasklist]_[bg|fg]_[focus|urgent]
-- titlebar_[bg|fg]_[normal|focus]
-- tooltip_[font|opacity|fg_color|bg_color|border_width|border_color]
-- mouse_finder_[color|timeout|animate_timeout|radius|factor]
-- Example:
--theme.taglist_bg_focus = "#ff0000"
-- Display the taglist squares
theme.taglist_squares_sel = "/usr/share/awesome/themes/default/taglist/squarefw.png"
theme.taglist_squares_unsel = "/usr/share/awesome/themes/default/taglist/squarew.png"
-- Variables set for theming the menu:
-- menu_[bg|fg]_[normal|focus]
-- menu_[border_color|border_width]
theme.menu_submenu_icon = "/usr/share/awesome/themes/default/submenu.png"
theme.menu_height = 15
theme.menu_width = 100
-- You can add as many variables as
-- you wish and access them by using
-- beautiful.variable in your rc.lua
--theme.bg_widget = "#cc0000"
-- Define the image to load
theme.titlebar_close_button_normal = "/usr/share/awesome/themes/default/titlebar/close_normal.png"
theme.titlebar_close_button_focus = "/usr/share/awesome/themes/default/titlebar/close_focus.png"
theme.titlebar_ontop_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/ontop_normal_inactive.png"
theme.titlebar_ontop_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/ontop_focus_inactive.png"
theme.titlebar_ontop_button_normal_active = "/usr/share/awesome/themes/default/titlebar/ontop_normal_active.png"
theme.titlebar_ontop_button_focus_active = "/usr/share/awesome/themes/default/titlebar/ontop_focus_active.png"
theme.titlebar_sticky_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/sticky_normal_inactive.png"
theme.titlebar_sticky_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/sticky_focus_inactive.png"
theme.titlebar_sticky_button_normal_active = "/usr/share/awesome/themes/default/titlebar/sticky_normal_active.png"
theme.titlebar_sticky_button_focus_active = "/usr/share/awesome/themes/default/titlebar/sticky_focus_active.png"
theme.titlebar_floating_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/floating_normal_inactive.png"
theme.titlebar_floating_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/floating_focus_inactive.png"
theme.titlebar_floating_button_normal_active = "/usr/share/awesome/themes/default/titlebar/floating_normal_active.png"
theme.titlebar_floating_button_focus_active = "/usr/share/awesome/themes/default/titlebar/floating_focus_active.png"
theme.titlebar_maximized_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/maximized_normal_inactive.png"
theme.titlebar_maximized_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/maximized_focus_inactive.png"
theme.titlebar_maximized_button_normal_active = "/usr/share/awesome/themes/default/titlebar/maximized_normal_active.png"
theme.titlebar_maximized_button_focus_active = "/usr/share/awesome/themes/default/titlebar/maximized_focus_active.png"
theme.wallpaper = "/usr/share/awesome/themes/default/background.png"
-- You can use your own layout icons like this:
theme.layout_fairh = "/usr/share/awesome/themes/default/layouts/fairhw.png"
theme.layout_fairv = "/usr/share/awesome/themes/default/layouts/fairvw.png"
theme.layout_floating = "/usr/share/awesome/themes/default/layouts/floatingw.png"
theme.layout_magnifier = "/usr/share/awesome/themes/default/layouts/magnifierw.png"
theme.layout_max = "/usr/share/awesome/themes/default/layouts/maxw.png"
theme.layout_fullscreen = "/usr/share/awesome/themes/default/layouts/fullscreenw.png"
theme.layout_tilebottom = "/usr/share/awesome/themes/default/layouts/tilebottomw.png"
theme.layout_tileleft = "/usr/share/awesome/themes/default/layouts/tileleftw.png"
theme.layout_tile = "/usr/share/awesome/themes/default/layouts/tilew.png"
theme.layout_tiletop = "/usr/share/awesome/themes/default/layouts/tiletopw.png"
theme.layout_spiral = "/usr/share/awesome/themes/default/layouts/spiralw.png"
theme.layout_dwindle = "/usr/share/awesome/themes/default/layouts/dwindlew.png"
theme.awesome_icon = "/usr/share/awesome/icons/awesome16.png"
-- Define the icon theme for application icons. If not set then the icons
-- from /usr/share/icons and /usr/share/icons/hicolor will be used.
theme.icon_theme = nil
return theme
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 666 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 830 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 598 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 549 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1013 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 754 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 740 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 774 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 679 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 682 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 833 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 624 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 601 B

@ -0,0 +1,29 @@
[push]
default = simple
[alias]
#Shows diff in log
ll = log --stat --abbrev-commit
#Show all aliases
alias = !git config --list | grep 'alias\\.' | sed 's/alias\\.\\([^=]*\\)=\\(.*\\)/\\1\\t=> \\2/' | sort
#Full sync of local database
sync = fetch -pv --all
cam = commit -a -m
lug = log --color --graph --date=short --pretty=format:'%Cgreen%cd (%cr)%Creset %C(bold blue)%an%Creset %Cred%h%Creset -%C(yellow)%d%Creset %s' --abbrev-commit
purr = pull --rebase
chk = checkout
from = !git fetch origin master && git rebase -i origin/master
# print local branches and their last commit times
blanch = for-each-ref --sort=authordate --format '%(HEAD)%(align:left,40)%(refname:short)%(end) | %(align:left,20)%(authordate:iso)%(end) | %(subject)' refs/heads
# checkout master and delete previously checked out branch
close = !git checkout master && git branch -D @{-1}
[color]
branch = auto
diff = auto
status = auto

@ -0,0 +1,921 @@
#!/bin/sh
# git-remote-gcrypt
#
# Copyright (c) 2013 engla
# Copyright (c) 2013, 2014 Joey Hess <id@joeyh.name>
# Copyright (c) 2016 Sean Whitton <spwhitton@spwhitton.name> and contributors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) version 2 or any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# See README.rst for usage instructions
set -e # errexit
set -f # noglob
set -C # noclobber
export GITCEPTION="${GITCEPTION:-}+" # Reuse $Gref except when stacked
Gref="refs/gcrypt/gitception$GITCEPTION"
Gref_rbranch="refs/heads/master"
Packkey_bytes=63 # nbr random bytes for packfile keys, any >= 256 bit is ok
Hashtype=SHA256 # SHA512 SHA384 SHA256 SHA224 supported.
Manifestfile=91bd0c092128cf2e60e1a608c31e92caf1f9c1595f83f2890ef17c0e4881aa0a
Hex40="[a-f0-9]"
Hex40=$Hex40$Hex40$Hex40$Hex40$Hex40$Hex40$Hex40$Hex40
Hex40=$Hex40$Hex40$Hex40$Hex40$Hex40 # Match SHA-1 hexdigest
GPG="$(git config --get "gpg.program" '.+' || echo gpg)"
Did_find_repo= # yes for connected, no for no repo
Localdir="${GIT_DIR:=.git}/remote-gcrypt"
Tempdir=
Repoid=
Refslist=
Packlist=
Keeplist=
Extnlist=
Repack_limit=25
Recipients=
# compat/utility functions
# xfeed: The most basic output function puts $1 into the stdin of $2..$#
xfeed()
{
local input_=
input_=$1; shift
"$@" <<EOF
$input_
EOF
}
xecho() { xfeed "$*" cat; }
xecho_n() { xecho "$@" | tr -d \\n ; } # kill newlines
echo_git() { xecho "$@" ; } # Code clarity
echo_info() { xecho "gcrypt:" "$@" >&2; }
echo_die() { echo_info "$@" ; exit 1; }
isnull() { case "$1" in "") return 0;; *) return 1;; esac; }
isnonnull() { ! isnull "$1"; }
iseq() { case "$1" in "$2") return 0;; *) return 1;; esac; }
isnoteq() { ! iseq "$1" "$2"; }
negate() { ! "$@"; }
# Execute $@ or die
pipefail()
{
"$@" || { echo_info "'$1' failed!"; kill $$; exit 1; }
}
isurl() { isnull "${2%%$1://*}"; }
islocalrepo() { isnull "${1##/*}" && [ ! -e "$1/HEAD" ]; }
xgrep() { command grep "$@" || : ; }
# setvar is used for named return variables
# $1 *must* be a valid variable name, $2 is any value
#
# Conventions
# return variable names are passed with a @ prefix
# return variable functions use f_ prefix local vars
# return var consumers use r_ prefix vars (or Titlecase globals)
setvar()
{
isnull "${1##@*}" || echo_die "Missing @ for return variable: $1"
eval ${1#@}=\$2
}
Newline="
"
# $1 is return var, $2 is value appended with newline separator
append_to()
{
local f_append_tmp_=
eval f_append_tmp_=\$${1#@}
isnull "$f_append_tmp_" || f_append_tmp_=$f_append_tmp_$Newline
setvar "$1" "$f_append_tmp_$2"
}
# Pick words from each line
# $1 return variable name
# $2 input value
pick_fields_1_2()
{
local f_ret= f_one= f_two=
while read f_one f_two _ # from << here-document
do
f_ret="$f_ret$f_one $f_two$Newline"
done <<EOF
$2
EOF
setvar "$1" "${f_ret#$Newline}"
}
# Take all lines matching $2 (full line)
# $1 return variable name
# $2 filter word
# $3 input value
# if $1 is a literal `!', the match is reversed (and arguments shift)
# we instead remove all lines matching
filter_to()
{
local f_neg= f_line= f_ret= IFS=
isnoteq "$1" "!" || { f_neg=negate; shift; }
IFS=$Newline
for f_line in $3
do
$f_neg isnonnull "${f_line##$2}" || f_ret=$f_ret$f_line$Newline
done
setvar "$1" "${f_ret%$Newline}"
}
# Output the number of lines in $1
line_count()
{
local IFS=
IFS=$Newline
set -- $1
xecho "$#"
}
## gitception part
# Fetch giturl $1, file $2
gitception_get()
{
# Take care to preserve FETCH_HEAD
local ret_=: obj_id= fet_head="$GIT_DIR/FETCH_HEAD"
[ -e "$fet_head" ] && command mv -f "$fet_head" "$fet_head.$$~" || :
git fetch -q -f "$1" "$Gref_rbranch:$Gref" >/dev/null &&
obj_id="$(git ls-tree "$Gref" | xgrep -E '\b'"$2"'$' | awk '{print $3}')" &&
isnonnull "$obj_id" && git cat-file blob "$obj_id" && ret_=: ||
{ ret_=false && : ; }
[ -e "$fet_head.$$~" ] && command mv -f "$fet_head.$$~" "$fet_head" || :
$ret_
}
anon_commit()
{
GIT_AUTHOR_NAME="root" GIT_AUTHOR_EMAIL="root@localhost" \
GIT_AUTHOR_DATE="1356994801 -0400" GIT_COMMITTER_NAME="root" \
GIT_COMMITTER_EMAIL="root@localhost" \
GIT_COMMITTER_DATE="1356994801 -0400" \
git commit-tree "$@" <<EOF
Initial commit
EOF
}
# Get 'tree' from $1, change file $2 to obj id $3
update_tree()
{
local tab_=" "
# $2 is a filename from the repo format
(set +e;
git ls-tree "$1" | xgrep -v -E '\b'"$2"'$';
xecho "100644 blob $3$tab_$2"
) | git mktree
}
# Put giturl $1, file $2
# depends on previous GET to set $Gref and depends on PUT_FINAL later
gitception_put()
{
local obj_id= tree_id= commit_id=
obj_id=$(git hash-object -w --stdin) &&
tree_id=$(update_tree "$Gref" "$2" "$obj_id") &&
commit_id=$(anon_commit "$tree_id") &&
git update-ref "$Gref" "$commit_id"
}
# Remove giturl $1, file $2
# depends on previous GET like put
gitception_remove()
{
local tree_id= commit_id= tab_=" "
# $2 is a filename from the repo format
tree_id=$(git ls-tree "$Gref" | xgrep -v -E '\b'"$2"'$' | git mktree) &&
commit_id=$(anon_commit "$tree_id") &&
git update-ref "$Gref" "$commit_id"
}
gitception_new_repo()
{
local commit_id= empty_tree=4b825dc642cb6eb9a060e54bf8d69288fbee4904
# get any file to update Gref, and if it's not updated we create empty
git update-ref -d "$Gref" || :
gitception_get "$1" "x" 2>/dev/null >&2 || :
git rev-parse -q --verify "$Gref" >/dev/null && return 0 ||
commit_id=$(anon_commit "$empty_tree") &&
git update-ref "$Gref" "$commit_id"
}
## end gitception
# Fetch repo $1, file $2, tmpfile in $3
GET()
{
if isurl sftp "$1"
then
(exec 0>&-; curl -s -S -k "$1/$2") > "$3"
elif isurl rsync "$1"
then
(exec 0>&-; rsync -I -W "${1#rsync://}"/"$2" "$3" >&2)
elif islocalrepo "$1"
then
cat "$1/$2" > "$3"
else
gitception_get "${1#gitception://}" "$2" > "$3"
fi
}
# Put repo $1, file $2 or fail, tmpfile in $3
PUT()
{
if isurl sftp "$1"
then
curl -s -S -k --ftp-create-dirs -T "$3" "$1/$2"
elif isurl rsync "$1"
then
rsync -I -W "$3" "${1#rsync://}"/"$2" >&2
elif islocalrepo "$1"
then
cat >| "$1/$2" < "$3"
else
gitception_put "${1#gitception://}" "$2" < "$3"
fi
}
# Put all PUT changes for repo $1 at once
PUT_FINAL()
{
if isurl sftp "$1" || islocalrepo "$1" || isurl rsync "$1"
then
:
else
git push --quiet -f "${1#gitception://}" "$Gref:$Gref_rbranch"
fi
}
# Put directory for repo $1
PUTREPO()
{
if isurl sftp "$1"
then
:
elif isurl rsync "$1"
then
rsync -q -r --exclude='*' "$Localdir/" "${1#rsync://}" >&2
elif islocalrepo "$1"
then
mkdir -p "$1"
else
gitception_new_repo "${1#gitception://}"
fi
}
# For repo $1, delete all newline-separated files in $2
REMOVE()
{
local fn_=
if isurl sftp "$1"
then
# FIXME
echo_info "sftp: Ignore remove request $1/$2"
elif isurl rsync "$1"
then
xfeed "$2" rsync -I -W -v -r --delete --include-from=- \
--exclude='*' "$Localdir"/ "${1#rsync://}/" >&2
elif islocalrepo "$1"
then
for fn_ in $2; do
rm -f "$1"/"$fn_"
done
else
for fn_ in $2; do
gitception_remove "${1#gitception://}" "$fn_"
done
fi
}
CLEAN_FINAL()
{
if isurl sftp "$1" || islocalrepo "$1" || isurl rsync "$1"
then
:
else
git update-ref -d "$Gref" || :
fi
}
ENCRYPT()
{
rungpg --batch --force-mdc --compress-algo none --trust-model=always --passphrase-fd 3 -c 3<<EOF
$1
EOF
}
DECRYPT()
{
rungpg -q --batch --no-default-keyring --secret-keyring /dev/null \
--keyring /dev/null --passphrase-fd 3 -d 3<<EOF
$1
EOF
}
# Encrypt to recipients $1
PRIVENCRYPT()
{
set -- $1
if isnonnull "$Conf_signkey"; then
set -- "$@" -u "$Conf_signkey"
fi
rungpg --compress-algo none --trust-model=always -se "$@"
}
# $1 is the match for good signature, $2 is the textual signers list
PRIVDECRYPT()
{
local status_=
exec 4>&1 &&
status_=$(rungpg --status-fd 3 -q -d 3>&1 1>&4) &&
xfeed "$status_" grep "^\[GNUPG:\] ENC_TO " >/dev/null &&
(xfeed "$status_" grep -e "$1" >/dev/null || {
echo_info "Failed to verify manifest signature!" &&
echo_info "Only accepting signatories: ${2:-(none)}" &&
return 1
})
}
# Generate $1 random bytes
genkey()
{
rungpg --armor --gen-rand 1 "$1"
}
gpg_hash()
{
local hash_=
hash_=$(rungpg --with-colons --print-md "$1" | tr A-F a-f)
hash_=${hash_#:*:}
xecho "${hash_%:}"
}
rungpg()
{
if isnonnull "$Conf_gpg_args"; then
set -- "$Conf_gpg_args" "$@"
fi
# gpg will fail to run when there is no controlling tty,
# due to trying to print messages to it, even if a gpg agent is set
# up. --no-tty fixes this.
if [ "x$GPG_AGENT_INFO" != "x" ]; then
${GPG} --no-tty $@
else
${GPG} $@
fi
}
# Pass the branch/ref by pipe to git
safe_git_rev_parse()
{
git cat-file --batch-check 2>/dev/null |
xgrep -v "missing" | cut -f 1 -d ' '
}
make_new_repo()
{
echo_info "Setting up new repository"
PUTREPO "$URL"
# Needed assumption: the same user should have no duplicate Repoid
Repoid=":id:$(genkey 15)"
iseq "${NAME#gcrypt::}" "$URL" ||
git config "remote.$NAME.gcrypt-id" "$Repoid"
echo_info "Remote ID is $Repoid"
Extnlist="extn comment"
}
# $1 return var for goodsig match, $2 return var for signers text
read_config()
{
local recp_= r_tail= r_keyinfo= r_keyfpr= gpg_list= cap_= conf_part= good_sig= signers_=
Conf_signkey=$(git config --get "remote.$NAME.gcrypt-signingkey" '.+' ||
git config --path user.signingkey || :)
conf_part=$(git config --get "remote.$NAME.gcrypt-participants" '.+' ||
git config --get gcrypt.participants '.+' || :)
Conf_pubish_participants=$(git config --get --bool "remote.$NAME.gcrypt-publish-participants" '.+' ||
git config --get --bool gcrypt.publish-participants || :)
Conf_gpg_args=$(git config --get gcrypt.gpg-args '.+' || :)
# Figure out which keys we should encrypt to or accept signatures from
if isnull "$conf_part" || iseq "$conf_part" simple
then
signers_="(default keyring)"
Recipients="--throw-keyids --default-recipient-self"
good_sig="^\[GNUPG:\] GOODSIG "
setvar "$1" "$good_sig"
setvar "$2" "$signers_"
return 0
fi
for recp_ in $conf_part
do
gpg_list=$(rungpg --with-colons --fingerprint -k "$recp_")
r_tail_=$(echo "$recp_" | sed -e 's/^0x//')
filter_to @r_keyinfo "pub*" "$gpg_list"
if echo "$recp_" | grep -E -q '^[xA-F0-9]+$'; then # is $recp_ a keyid?
filter_to @r_keyfpr "fpr*$r_tail_*" "$gpg_list"
else
filter_to @r_keyfpr "fpr*" "$gpg_list"
fi
isnull "$r_keyinfo" || isnonnull "${r_keyinfo##*"$Newline"*}" ||
echo_info "WARNING: '$recp_' matches multiple keys, using one"
isnull "$r_keyfpr" || isnonnull "${r_keyfpr##*"$Newline"*}" ||
echo_info "WARNING: '$recp_' matches multiple fingerprints, using one"
r_keyinfo=${r_keyinfo%%"$Newline"*}
r_keyfpr=${r_keyfpr%%"$Newline"*}
keyid_=$(xfeed "$r_keyinfo" cut -f 5 -d :)
fprid_=$(xfeed "$r_keyfpr" cut -f 10 -d :)
isnonnull "$fprid_" &&
signers_="$signers_ $keyid_" &&
append_to @good_sig "^\[GNUPG:\] VALIDSIG .*$fprid_$" || {
echo_info "WARNING: Skipping missing key $recp_"
continue
}
# Check 'E'ncrypt capability
cap_=$(xfeed "$r_keyinfo" cut -f 12 -d :)
if ! iseq "${cap_#*E}" "$cap_"; then
if [ "$Conf_pubish_participants" = true ]; then
Recipients="$Recipients -r $keyid_"
else
Recipients="$Recipients -R $keyid_"
fi
fi
done
if isnull "$Recipients"
then
echo_info "You have not configured any keys you can encrypt to" \
"for this repository"
echo_info "Use ::"
echo_info " git config gcrypt.participants YOURKEYID"
exit 1
fi
setvar "$1" "$good_sig"
setvar "$2" "$signers_"
}
ensure_connected()
{
local manifest_= r_repoid= r_name= url_frag= r_sigmatch= r_signers= \
tmp_manifest=
if isnonnull "$Did_find_repo"
then
return
fi
Did_find_repo=no
read_config @r_sigmatch @r_signers
iseq "${NAME#gcrypt::}" "$URL" || r_name=$NAME
if isurl gitception "$URL" && isnonnull "$r_name"; then
git config "remote.$r_name.url" "gcrypt::${URL#gitception://}"
echo_info "Updated URL for $r_name, gitception:// -> ()"
fi
# Find the URL fragment
url_frag=${URL##*"#"}
isnoteq "$url_frag" "$URL" || url_frag=
URL=${URL%"#$url_frag"}
# manifestfile -- sha224 hash if we can, else the default location
if isurl sftp "$URL" || islocalrepo "$URL" || isurl rsync "$URL"
then
# not for gitception
isnull "$url_frag" ||
Manifestfile=$(xecho_n "$url_frag" | gpg_hash SHA224)
else
isnull "$url_frag" || Gref_rbranch="refs/heads/$url_frag"
fi
Repoid=
isnull "$r_name" ||
Repoid=$(git config "remote.$r_name.gcrypt-id" || :)
tmp_manifest="$Tempdir/maniF"
GET "$URL" "$Manifestfile" "$tmp_manifest" 2>/dev/null || {
echo_info "Repository not found: $URL"
if ! isnull "$Repoid"; then
echo_info "..but repository ID is set. Aborting."
return 1
else
return 0
fi
}
Did_find_repo=yes
echo_info "Decrypting manifest"
manifest_=$(PRIVDECRYPT "$r_sigmatch" "$r_signers" < "$tmp_manifest") &&
isnonnull "$manifest_" ||
echo_die "Failed to decrypt manifest!"
rm -f "$tmp_manifest"
filter_to @Refslist "$Hex40 *" "$manifest_"
filter_to @Packlist "pack :*:* *" "$manifest_"
filter_to @Keeplist "keep :*:*" "$manifest_"
filter_to @Extnlist "extn *" "$manifest_"
filter_to @r_repoid "repo *" "$manifest_"
r_repoid=${r_repoid#repo }
r_repoid=${r_repoid% *}
if isnull "$Repoid"
then
echo_info "Remote ID is $r_repoid"
Repoid=$r_repoid
elif isnoteq "$r_repoid" "$Repoid"
then
echo_info "WARNING:"
echo_info "WARNING: Remote ID has changed!"
echo_info "WARNING: from $Repoid"
echo_info "WARNING: to $r_repoid"
echo_info "WARNING:"
Repoid=$r_repoid
else
return 0
fi
isnull "$r_name" || git config "remote.$r_name.gcrypt-id" "$r_repoid"
}
# $1 is the hash type (SHA256 etc)
# $2 the pack id
# $3 the key
get_verify_decrypt_pack()
{
local rcv_id= tmp_encrypted=
tmp_encrypted="$Tempdir/packF"
GET "$URL" "$2" "$tmp_encrypted" &&
rcv_id=$(gpg_hash "$1" < "$tmp_encrypted") &&
iseq "$rcv_id" "$2" || echo_die "Packfile $2 does not match digest!"
DECRYPT "$3" < "$tmp_encrypted"
rm -f "$tmp_encrypted"
}
# download all packlines (pack :SHA256:a32abc1231) from stdin (or die)
# $1 destdir (when repack, else "")
get_pack_files()
{
local pack_id= r_pack_key_line= htype_= pack_= key_=
while IFS=': ' read -r _ htype_ pack_ # <<here-document
do
isnonnull "$pack_" || continue
# Get the Packlist line with the key
pack_id=":${htype_}:$pack_"
filter_to @r_pack_key_line "pack $pack_id *" "$Packlist"
key_=${r_pack_key_line#pack $pack_id }
if isnonnull "${pack_##$Hex40*}" ||
isnoteq "$htype_" SHA256 && isnoteq "$htype_" SHA224 &&
isnoteq "$htype_" SHA384 && isnoteq "$htype_" SHA512
then
echo_die "Packline malformed: $pack_id"
fi
get_verify_decrypt_pack "$htype_" "$pack_" "$key_" | \
if isnull "${1:-}"
then
# add to local pack list
git index-pack -v --stdin >/dev/null
xecho "pack $pack_id" >> "$Localdir/have_packs$GITCEPTION"
else
git index-pack -v --stdin "$1/${pack_}.pack" >/dev/null
fi
done
}
# Download and unpack remote packfiles
# $1 return var for list of packfiles to delete
repack_if_needed()
{
local n_= m_= kline_= r_line= r_keep_packlist= r_del_list=
isnonnull "$Packlist" || return 0
if isnonnull "${GCRYPT_FULL_REPACK:-}"
then
Keeplist=
Repack_limit=0
fi
pick_fields_1_2 @r_del_list "$Packlist"
n_=$(line_count "$Packlist")
m_=$(line_count "$Keeplist")
if iseq 0 "$(( $Repack_limit < ($n_ - $m_) ))"; then
return
fi
echo_info "Repacking remote $NAME, ..."
mkdir "$Tempdir/pack"
# Split packages to keep and to repack
if isnonnull "$Keeplist"; then
while read -r _ kline_ _ # <<here-document
do
isnonnull "$kline_" || continue
filter_to @r_line "pack $kline_ *" "$Packlist"
append_to @r_keep_packlist "$r_line"
filter_to ! @r_del_list "pack $kline_" "$r_del_list"
done <<EOF
$Keeplist
EOF
fi
xfeed "$r_del_list" get_pack_files "$Tempdir/pack/"
(set +f; pipefail git verify-pack -v "$Tempdir"/pack/*.idx) |
grep -E '^[0-9a-f]{40}' | cut -f 1 -d ' '
Packlist=$r_keep_packlist
setvar "$1" "$r_del_list"
}
do_capabilities()
{
echo_git fetch
echo_git push
echo_git
}
do_list()
{
local obj_id= ref_name= line_=
ensure_connected
xecho "$Refslist" | while read line_
do
isnonnull "$line_" || break
obj_id=${line_%% *}
ref_name=${line_##* }
echo_git "$obj_id" "$ref_name"
if iseq "$ref_name" "refs/heads/master"
then
echo_git "@refs/heads/master HEAD"
fi
done
# end with blank line
echo_git
}
do_fetch()
{
# Download packs in the manifest that don't appear in have_packs
local pneed_= premote_=
ensure_connected
# The `+` for $GITCEPTION is pointless but we will be safe for stacking
pick_fields_1_2 @premote_ "$Packlist"
if [ -s "$Localdir/have_packs+" ]
then
pneed_=$(xfeed "$premote_" xgrep -v -x -f "$Localdir/have_packs+")
else
pneed_=$premote_
fi
xfeed "$pneed_" get_pack_files
echo_git # end with blank line
}
# do_push PUSHARGS (multiple lines like +src:dst, with both + and src opt.)
do_push()
{
# Security protocol:
# Each git packfile is encrypted and then named for the encrypted
# file's hash. The manifest is updated with the pack id.
# The manifest is encrypted.
local r_revlist= pack_id= key_= obj_= src_= dst_= \
r_pack_delete= tmp_encrypted= tmp_objlist= tmp_manifest=
ensure_connected
if iseq "$Did_find_repo" "no"
then
make_new_repo
fi
if isnonnull "$Refslist"
then
# mark all remote refs with ^<sha-1> (if sha-1 exists locally)
r_revlist=$(xfeed "$Refslist" cut -f 1 -d ' ' |
safe_git_rev_parse | sed -e 's/^\(.\)/^&/')
fi
while IFS=: read -r src_ dst_ # << +src:dst
do
src_=${src_#+}
filter_to ! @Refslist "$Hex40 $dst_" "$Refslist"
if isnonnull "$src_"
then
append_to @r_revlist "$src_"
obj_=$(xfeed "$src_" safe_git_rev_parse)
append_to @Refslist "$obj_ $dst_"
fi
done <<EOF
$1
EOF
tmp_encrypted="$Tempdir/packP"
tmp_objlist="$Tempdir/objlP"
{
xfeed "$r_revlist" git rev-list --objects --stdin --
repack_if_needed @r_pack_delete
} > "$tmp_objlist"
# Only send pack if we have any objects to send
if [ -s "$tmp_objlist" ]
then
key_=$(genkey "$Packkey_bytes")
pack_id=$(export GIT_ALTERNATE_OBJECT_DIRECTORIES=$Tempdir;
pipefail git pack-objects --stdout < "$tmp_objlist" |
pipefail ENCRYPT "$key_" |
tee "$tmp_encrypted" | gpg_hash "$Hashtype")
append_to @Packlist "pack :${Hashtype}:$pack_id $key_"
if isnonnull "$r_pack_delete"
then
append_to @Keeplist "keep :${Hashtype}:$pack_id 1"
fi
fi
# Generate manifest
echo_info "Encrypting to: $Recipients"
echo_info "Requesting manifest signature"
tmp_manifest="$Tempdir/maniP"
PRIVENCRYPT "$Recipients" > "$tmp_manifest" <<EOF
$Refslist
$Packlist
$Keeplist
repo $Repoid
$Extnlist
EOF
# Upload pack
if [ -s "$tmp_objlist" ]
then
PUT "$URL" "$pack_id" "$tmp_encrypted"
fi
# Upload manifest
PUT "$URL" "$Manifestfile" "$tmp_manifest"
rm -f "$tmp_encrypted"
rm -f "$tmp_objlist"
rm -f "$tmp_manifest"
# Delete packs
if isnonnull "$r_pack_delete"; then
REMOVE "$URL" "$(xecho "$r_pack_delete" | \
while IFS=': ' read -r _ _ pack_
do
isnonnull "$pack_" || continue
xecho "$pack_"
done)"
fi
PUT_FINAL "$URL"
# ok all updates
while IFS=: read -r src_ dst_ # << +src:dst
do
echo_git "ok $dst_"
done <<EOF
$1
EOF
echo_git
}
cleanup_tmpfiles()
{
if isnonnull "${Tempdir%%*."$$"}"; then
echo_die "Unexpected Tempdir value: $Tempdir"
fi
rm -r -f -- "${Tempdir}" >&2
}
setup()
{
mkdir -p "$Localdir"
# Set up a subdirectory in /tmp
temp_key=$(genkey 9 | tr '/' _)
Tempdir="${TMPDIR:-/tmp}/git-remote-gcrypt-${temp_key}.$$"
case "${MSYSTEM:-unknown}" in
MSYS*|MINGW*)
mkdir "${Tempdir}"
echo_info "Warning: Not securing tempdir ${Tempdir} because we are on mingw/msys"
;;
unknown|*)
mkdir -m 700 "${Tempdir}"
;;
esac
trap cleanup_tmpfiles EXIT
trap 'exit 1' 1 2 3 15
}
# handle git-remote-helpers protocol
gcrypt_main_loop()
{
local input_= input_inner= r_args= temp_key=
NAME=$1 # Remote name
URL=$2 # Remote URL
setup
while read input_
do
case "$input_" in
capabilities)
do_capabilities
;;
list|list\ for-push)
do_list
;;
fetch\ *)
r_args=${input_##fetch }
while read input_inner
do
case "$input_inner" in
fetch*)
r_args= #ignored
;;
*)
break
;;
esac
done
do_fetch "$r_args"
;;
push\ *)
r_args=${input_##push }
while read input_inner
do
case "$input_inner" in
push\ *)
append_to @r_args "${input_inner#push }"
;;
*)
break
;;
esac
done
do_push "$r_args"
;;
?*)
echo_die "Unknown input!"
;;
*)
CLEAN_FINAL "$URL"
exit 0
;;
esac
done
}
if [ "x$1" = x--check ]
then
NAME=dummy-gcrypt-check
URL=$2
setup
ensure_connected
git remote remove $NAME 2>/dev/null || true
if iseq "$Did_find_repo" "no"
then
exit 100
fi
else
gcrypt_main_loop "$@"
fi

@ -0,0 +1,5 @@
#!/bin/sh
cd "$(mktemp -d)";
go mod init local-playground;
echo -e 'package main\n\nimport (\n\t"fmt"\n)\n\nfunc main() {\n\tfmt.Println("aloha")\n}\n' > main.go;
$EDITOR main.go;

@ -0,0 +1,3 @@
#!/usr/bin/env bash
/usr/bin/sshfs -oTCPKeepAlive=yes -oServerAliveCountMax=1 -oServerAliveInterval=5 $@

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

@ -0,0 +1,130 @@
{
pkgsSrc ? ./pkgs.nix
}: rec {
pkgs = (import pkgsSrc) {};
gitConfig = pkgs.writeTextDir "git/config"
(builtins.readFile ./base/gitconfig);
git = pkgs.writeScriptBin "git" ''
#!${pkgs.bash}/bin/bash
export XDG_CONFIG_HOME=${gitConfig}
exec ${pkgs.git}/bin/git "$@"
'';
zsh = ((import ./zsh) { inherit pkgs; }).zsh;
loadout = pkgs.buildEnv {
name = "loadout";
paths = [
pkgs.gnugrep
pkgs.ag
pkgs.gawk
git
pkgs.mercurial
pkgs.breezy # bzr
pkgs.gcc
pkgs.gnumake
pkgs.cmake
pkgs.strace
pkgs.curl
pkgs.wget
pkgs.rsync
pkgs.hostname
pkgs.netcat
pkgs.nmap
pkgs.dnsutils
pkgs.openssh
pkgs.tmux
pkgs.ncdu
pkgs.htop
pkgs.unzip
pkgs.unrar
pkgs.gzip
pkgs.jq
pkgs.yq
pkgs.go
pkgs.xsel
pkgs.pavucontrol
(pkgs.nerdfonts.override { fonts = [ "SourceCodePro" ]; })
((import ./nvim) { inherit pkgs; }).nvim
zsh
((import ./alacritty) { inherit pkgs zsh; }).alacritty
((import ./awesome) { inherit pkgs; }).awesome
];
};
appimageEntrypoint = pkgs.writeScriptBin "mediocre-loadout" ''
#!${pkgs.bash}/bin/bash
cmd="$1"; shift;
if [ "$cmd" = "editor" ]; then exec nvim "$@"; fi
if [ "$cmd" = "shell" ]; then exec zsh "$@"; fi
if [ "$cmd" = "gui" ]; then exec alacritty "$@"; fi
if [ "$cmd" = "wm" ]; then exec awesome "$@"; fi
echo "USAGE: $0 [editor|shell|gui|wm] [passthrough args...]"
exit 1
'';
appimageIcon = pkgs.stdenv.mkDerivation {
name = "mediocre-loadout-icon";
src = ./bonzi.png;
builder = builtins.toFile "builder.sh" ''
source $stdenv/setup
dir=share/icons/hicolor/256x256/apps
mkdir -p "$out"/$dir
cp $src "$out"/$dir/mediocre-loadout.png
'';
};
appimageDesktopFile = pkgs.writeTextDir "share/applications/mediocre-loadout.desktop" ''
[Desktop Entry]
Name=Mediocre Loadout
Exec=mediocre-loadout gui
Icon=mediocre-loadout
Type=Application
Categories=Utility;
'';
appimageTarget = pkgs.buildEnv {
name = "mediocre-loadout-target";
paths = [
loadout
appimageEntrypoint
appimageIcon
appimageDesktopFile
];
};
appimageTargetFlat = pkgs.stdenv.mkDerivation {
name = "mediocre-loadout-target-flat";
src = appimageTarget;
builder = builtins.toFile "builder.sh" ''
source $stdenv/setup
cp -rL "$src" "$out"
'';
};
appimage = ((import ./appimage.nix) { pkgsSrc = pkgsSrc; }) {
name = "mediocre-loadout";
target = appimageTargetFlat;
};
}

@ -0,0 +1,94 @@
{
pkgs ? (import ../pkgs.nix) {},
}: rec {
goimports = pkgs.buildGoModule rec {
pname = "goimports";
version = "v0.1.7";
src = builtins.fetchGit {
url = "https://go.googlesource.com/tools";
rev = "0df0ca0f43117120bd7cc900ebf765f9b799438a";
};
vendorSha256 = "1vs4vbl3kh8lbqrm4yqqn27ammlqj7jdbi0ca9s4fkja2sk45ibi";
subPackages = [ "cmd/goimports" ];
};
# the gocode-gomod which comes with nixpkgs places the binary at
# gocode-gomod, we gotta rename it
gocode = pkgs.stdenv.mkDerivation {
name = "gocode";
src = pkgs.gocode-gomod;
builder = builtins.toFile "builder.sh" ''
source $stdenv/setup
mkdir -p "$out"/bin/
cp "$src"/bin/gocode-gomod "$out"/bin/gocode
'';
};
env = pkgs.buildEnv {
name = "nvim-env";
paths = [
pkgs.vimPlugins.vim-plug
pkgs.vimPlugins.deoplete-nvim
pkgs.vimPlugins.deoplete-go
pkgs.vimPlugins.nerdtree
pkgs.vimPlugins.nerdtree-git-plugin
pkgs.vimPlugins.vim-gitgutter
pkgs.vimPlugins.neomake
pkgs.vimPlugins.papercolor-theme
pkgs.vimPlugins.vim-go
pkgs.vimPlugins.vim-nix
pkgs.golangci-lint
pkgs.gopls
gocode
goimports
];
};
envPlugins = "${env}/share/vim-plugins";
init = pkgs.writeText "nvim-init" ''
source ${envPlugins}/vim-plug/plug.vim
call plug#begin('${envPlugins}')
Plug '${envPlugins}/deoplete-nvim'
Plug '${envPlugins}/deoplete-go', { 'for': 'go' }
Plug '${envPlugins}/nerdtree', { 'on': 'NERDTreeToggle' }
Plug '${envPlugins}/nerdtree-git-plugin'
Plug '${envPlugins}/vim-gitgutter'
Plug '${envPlugins}/neomake'
Plug '${envPlugins}/papercolor-theme'
Plug '${envPlugins}/vim-go', { 'for': 'go' }
Plug '${envPlugins}/vim-nix', { 'for': 'nix' }
call plug#end()
source ${./init.vim}
'';
nvimRaw = pkgs.writeScriptBin "nvim" ''
#!${pkgs.bash}/bin/bash
export PATH=${env}/bin:$PATH
exec ${pkgs.neovim}/bin/nvim -u ${init} "$@"
'';
rplugin = pkgs.stdenv.mkDerivation {
name = "nvim-rplugin";
buildInputs = [ pkgs.git nvimRaw ];
builder = builtins.toFile "builder.sh" ''
source $stdenv/setup
mkdir -p "$out"/
export NVIM_RPLUGIN_MANIFEST="$out"/rplugin.vim
nvim -c ':UpdateRemotePlugins' -c ':exit' >/dev/null
'';
};
nvim = pkgs.writeScriptBin "nvim" ''
#!${pkgs.bash}/bin/bash
export NVIM_RPLUGIN_MANIFEST=${rplugin}/rplugin.vim
exec ${nvimRaw}/bin/nvim "$@"
'';
}

@ -0,0 +1,170 @@
" PaperColor ###############################################################
set background=light
colorscheme PaperColor
" Deoplete #################################################################
let g:deoplete#enable_at_startup = 1
" use tab to cycle
inoremap <expr><tab> pumvisible() ? "\<c-n>" : "\<tab>"
" close preview when leaving insert
autocmd InsertLeave,CompleteDone * if pumvisible() == 0 | pclose | endif
" NERDTree #################################################################
let NERDTreeMouseMode=3
let NERDTreeMinimalUI=1
let NERDTreeAutoDeleteBuffer=1
let NERDTreeHighlightCursorline=1
let NERDTreeShowHidden=1
let g:NERDTreeIndicatorMapCustom = {
\ "Modified" : "Δ",
\ "Staged" : "✚",
\ "Untracked" : "✭",
\ "Renamed" : "➜",
\ "Unmerged" : "☢",
\ "Deleted" : "-",
\ "Dirty" : "Δ",
\ "Clean" : "",
\ "Unknown" : ""
\ }
map <C-n> :NERDTreeToggle<CR>
" always enter term buffer in insert mode
autocmd BufEnter * if &buftype == 'terminal' | :startinsert | endif
" vim-go ###################################################################
"
"use goimports for formatting instead of gofmt
let g:go_fmt_command = "goimports"
" neomake ##################################################################
autocmd! BufWritePost * Neomake
"let g:neomake_verbose=3
"let g:neomake_logfile='/tmp/neomake.log'
" the sidebar sign placement wasn't playing nice with gitgutter, so use the
" location list instead. But location list is kinda dumb cause it pops open
" multiple times and at weird times, sooo.... fuck it
"let g:neomake_open_list=2
let g:neomake_open_list=0
let g:neomake_place_signs=0
let g:neomake_go_enabled_makers = ['go', 'golangcilint']
let g:neomake_go_golangcilint_maker = {
\ 'exe': 'golangci-lint',
\ 'args': [
\ 'run',
\ '--no-config',
\ '--out-format=line-number',
\ '--print-issued-lines=false',
\ '-E=durationcheck',
\ '-E=errorlint',
\ '-E=exportloopref',
\ '-E=forbidigo',
\ '-E=gochecknoinits',
\ '-E=godot',
\ '-E=goimports',
\ '-E=misspell',
\ '-E=revive',
\ '-E=unconvert',
\ '-E=unparam',
\ '.'
\ ],
\ 'output_stream': 'stdout',
\ 'append_file': 0,
\ 'cwd': '%:h',
\ 'errorformat':
\ '%f:%l:%c: %m,' .
\ '%f:%l: %m'
\ }
let g:neomake_markdown_enabled_makers = ['misspell']
let g:neomake_markdown_misspell_maker = {
\ 'errorformat': '%f:%l:%c:%m',
\ }
" mine #####################################################################
"Makes current line/column highlighted, and set text width
set tw=80
set colorcolumn=+1
"autocmd bufenter * set cursorline cursorcolumn colorcolumn=+1
"autocmd bufleave * set nocursorline nocursorcolumn colorcolumn=0
hi ColorColumn ctermfg=none ctermbg=grey cterm=none
"hi CursorLine ctermfg=none ctermbg=lightgrey cterm=none
"hi CursorColumn ctermfg=none ctermbg=lightgrey cterm=none
"Buffers scroll a bit so cursor doens't go all the way to the bottom before
"scroll begins
set scrolloff=3
"Makes all .swp files go to /tmp instead of . CAUSE FUCK DA POLICE
set backupdir=/tmp
set directory=/tmp
"Better indenting
set autoindent
set expandtab
set tabstop=4
set shiftwidth=4
"Show eol and tabs
set list
set listchars=trail:░,tab:►\ ,extends:>,precedes:<
"Don't highlight search matches, don't jump while mid-search
set noincsearch
set nohlsearch
"We want certain types to only have 2 space for tabs
au FileType clojure setlocal tabstop=2 shiftwidth=2
au FileType ruby setlocal tabstop=2 shiftwidth=2
au FileType yaml setlocal tabstop=2 shiftwidth=2
au FileType html setlocal tabstop=2 shiftwidth=2
au FileType proto setlocal tabstop=2 shiftwidth=2
au FileType javascript setlocal tabstop=2 shiftwidth=2
"We want certain types to use tabs instead of spaces
au FileType go setlocal nolist noexpandtab
au FileType make setlocal nolist noexpandtab
"terminal shortcuts
tnoremap <leader><leader> \
tnoremap <leader> <C-\><C-n>
"tab shortcuts for terminal mode have terminal escape code preceding them
tnoremap <leader>tn <C-\><C-n>:tabe term://zsh<CR>
tnoremap <leader>tN <C-\><C-n>:tabe<CR>
tnoremap <leader>ts <C-\><C-n>:vs term://zsh<CR>
tnoremap <leader>tS <C-\><C-n>:vnew<CR>
tnoremap <leader>ti <C-\><C-n>:sp term://zsh<CR>
tnoremap <leader>tI <C-\><C-n>:new<CR>
tnoremap <leader>th <C-\><C-n>gT
tnoremap <leader>tH <C-\><C-n>:-tabmove<CR>
tnoremap <leader>tl <C-\><C-n>gt
tnoremap <leader>tL <C-\><C-n>:+tabmove<CR>
tnoremap <leader>tx <C-\><C-n>:tabclose<CR>
"tab shortcuts
noremap <leader>tn :tabe term://zsh<CR>
noremap <leader>tN :tabe<CR>
noremap <leader>ts :vs term://zsh<CR>
noremap <leader>tS :vnew<CR>
noremap <leader>ti :sp term://zsh<CR>
noremap <leader>tI :new<CR>
noremap <leader>th gT
noremap <leader>tH :-tabmove<CR>
noremap <leader>tl gt
noremap <leader>tL :+tabmove<CR>
noremap <leader>tx :tabclose<CR>
" yank/paste into/from clipboard
set clipboard+=unnamedplus
"Clojure specific mappings
" Eval outerform
au FileType clojure nmap <buffer> cpP :Eval<cr>
" Eval full page
au FileType clojure nmap <buffer> cpR :%Eval<cr>
" Disable Ex mode!
nnoremap Q <Nop>

@ -0,0 +1,41 @@
let
src = builtins.fetchTarball {
name = "nixpkgs-2105";
url = "https://github.com/nixos/nixpkgs/archive/7e9b0dff974c89e070da1ad85713ff3c20b0ca97.tar.gz";
sha256 = "1ckzhh24mgz6jd1xhfgx0i9mijk6xjqxwsshnvq789xsavrmsc36";
};
normalPkgs = (import src) {};
config = {
allowUnfree = true;
packageOverrides = pkgs: {
go = builtins.fetchTarball {
url = "https://golang.org/dl/go1.17.1.linux-amd64.tar.gz";
sha256 = "1196h1jx9cn5ks1y9r95z0q2s6m6ssvnx7jd34g435jvxjgb2c94";
};
nixgl = let
src = builtins.fetchTarball {
name = "nixgl-unstable";
url = "https://github.com/guibou/nixGL/archive/51f19871a31b15b482ac4c80976da173289e77fb.tar.gz";
sha256 = "0dj2apbx5iqvkiixyz1dzx4id51iw9s2isp1f9x60a03f5sqcvvi";
};
nixgl = (import src) {
inherit pkgs;
enable32bits = false;
};
in nixgl.nixGLIntel;
};
};
in pkgsArg:
(import src) (
normalPkgs.lib.attrsets.recursiveUpdate { config = config; } pkgsArg
)

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 485 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 755 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save