initial public commit
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
result
|
103
README.md
Normal file
@ -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.
|
861
alacritty/alacritty.yml
Normal file
@ -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
|
35
alacritty/default.nix
Normal file
@ -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"
|
||||||
|
'';
|
||||||
|
}
|
BIN
alacritty/fonts/SourceCodePro-Black.ttf
Normal file
BIN
alacritty/fonts/SourceCodePro-Bold.ttf
Normal file
BIN
alacritty/fonts/SourceCodePro-ExtraLight.ttf
Normal file
BIN
alacritty/fonts/SourceCodePro-Light.ttf
Normal file
BIN
alacritty/fonts/SourceCodePro-Medium.ttf
Normal file
BIN
alacritty/fonts/SourceCodePro-Regular.ttf
Normal file
BIN
alacritty/fonts/SourceCodePro-Semibold.ttf
Normal file
17
appimage.nix
Normal file
@ -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; })
|
9
awesome/awesome.desktop
Normal file
@ -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
|
43
awesome/bat.lua
Normal file
@ -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
|
BIN
awesome/bin/cricket
Executable file
BIN
awesome/bin/imgavg
Executable file
4
awesome/bin/random_i3lock.sh
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
R=`find "$1" | grep -P 'png$' | sort -R | head -n1`
|
||||||
|
exec i3lock -i $R -t
|
4
awesome/bin/scrot-gobin.sh
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
scrot -o -s "/tmp/shot.png"
|
||||||
|
eog /tmp/shot.png
|
50
awesome/bin/sysstats.sh
Executable file
@ -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 ""
|
26
awesome/default.nix
Normal file
@ -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
|
||||||
|
'';
|
||||||
|
|
||||||
|
}
|
BIN
awesome/helper.png
Normal file
After Width: | Height: | Size: 26 KiB |
13
awesome/mediocregopher-sysstats.service
Normal file
@ -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
|
40
awesome/pulseaudio.lua
Normal file
@ -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
|
544
awesome/rc.lua
Normal file
@ -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)
|
||||||
|
-- }}}
|
3
awesome/theme/README
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Background images:
|
||||||
|
Mikael Eriksson <mikael_eriksson@miffe.org>
|
||||||
|
Licensed under CC-BY-SA-3.0
|
BIN
awesome/theme/background.png
Normal file
After Width: | Height: | Size: 220 KiB |
BIN
awesome/theme/background_white.png
Normal file
After Width: | Height: | Size: 265 KiB |
BIN
awesome/theme/layouts/dwindle.png
Normal file
After Width: | Height: | Size: 967 B |
BIN
awesome/theme/layouts/dwindlew.png
Normal file
After Width: | Height: | Size: 997 B |
BIN
awesome/theme/layouts/fairh.png
Normal file
After Width: | Height: | Size: 194 B |
BIN
awesome/theme/layouts/fairhw.png
Normal file
After Width: | Height: | Size: 194 B |
BIN
awesome/theme/layouts/fairv.png
Normal file
After Width: | Height: | Size: 201 B |
BIN
awesome/theme/layouts/fairvw.png
Normal file
After Width: | Height: | Size: 201 B |
BIN
awesome/theme/layouts/floating.png
Normal file
After Width: | Height: | Size: 395 B |
BIN
awesome/theme/layouts/floatingw.png
Normal file
After Width: | Height: | Size: 388 B |
BIN
awesome/theme/layouts/fullscreen.png
Normal file
After Width: | Height: | Size: 202 B |
BIN
awesome/theme/layouts/fullscreenw.png
Normal file
After Width: | Height: | Size: 202 B |
BIN
awesome/theme/layouts/magnifier.png
Normal file
After Width: | Height: | Size: 209 B |
BIN
awesome/theme/layouts/magnifierw.png
Normal file
After Width: | Height: | Size: 209 B |
BIN
awesome/theme/layouts/max.png
Normal file
After Width: | Height: | Size: 321 B |
BIN
awesome/theme/layouts/maxw.png
Normal file
After Width: | Height: | Size: 321 B |
BIN
awesome/theme/layouts/spiral.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
awesome/theme/layouts/spiralw.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
awesome/theme/layouts/tile.png
Normal file
After Width: | Height: | Size: 174 B |
BIN
awesome/theme/layouts/tilebottom.png
Normal file
After Width: | Height: | Size: 195 B |
BIN
awesome/theme/layouts/tilebottomw.png
Normal file
After Width: | Height: | Size: 216 B |
BIN
awesome/theme/layouts/tileleft.png
Normal file
After Width: | Height: | Size: 172 B |
BIN
awesome/theme/layouts/tileleftw.png
Normal file
After Width: | Height: | Size: 170 B |
BIN
awesome/theme/layouts/tiletop.png
Normal file
After Width: | Height: | Size: 195 B |
BIN
awesome/theme/layouts/tiletopw.png
Normal file
After Width: | Height: | Size: 215 B |
BIN
awesome/theme/layouts/tilew.png
Normal file
After Width: | Height: | Size: 168 B |
BIN
awesome/theme/submenu.png
Normal file
After Width: | Height: | Size: 440 B |
BIN
awesome/theme/taglist/squarefw.png
Normal file
After Width: | Height: | Size: 187 B |
BIN
awesome/theme/taglist/squarew.png
Normal file
After Width: | Height: | Size: 193 B |
105
awesome/theme/theme.lua
Normal file
@ -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
|
BIN
awesome/theme/titlebar/close_focus.png
Normal file
After Width: | Height: | Size: 666 B |
BIN
awesome/theme/titlebar/close_normal.png
Normal file
After Width: | Height: | Size: 830 B |
BIN
awesome/theme/titlebar/floating_focus_active.png
Normal file
After Width: | Height: | Size: 598 B |
BIN
awesome/theme/titlebar/floating_focus_inactive.png
Normal file
After Width: | Height: | Size: 549 B |
BIN
awesome/theme/titlebar/floating_normal_active.png
Normal file
After Width: | Height: | Size: 814 B |
BIN
awesome/theme/titlebar/floating_normal_inactive.png
Normal file
After Width: | Height: | Size: 553 B |
BIN
awesome/theme/titlebar/maximized_focus_active.png
Normal file
After Width: | Height: | Size: 1013 B |
BIN
awesome/theme/titlebar/maximized_focus_inactive.png
Normal file
After Width: | Height: | Size: 754 B |
BIN
awesome/theme/titlebar/maximized_normal_active.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
awesome/theme/titlebar/maximized_normal_inactive.png
Normal file
After Width: | Height: | Size: 740 B |
BIN
awesome/theme/titlebar/ontop_focus_active.png
Normal file
After Width: | Height: | Size: 774 B |
BIN
awesome/theme/titlebar/ontop_focus_inactive.png
Normal file
After Width: | Height: | Size: 679 B |
BIN
awesome/theme/titlebar/ontop_normal_active.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
awesome/theme/titlebar/ontop_normal_inactive.png
Normal file
After Width: | Height: | Size: 682 B |
BIN
awesome/theme/titlebar/sticky_focus_active.png
Normal file
After Width: | Height: | Size: 833 B |
BIN
awesome/theme/titlebar/sticky_focus_inactive.png
Normal file
After Width: | Height: | Size: 624 B |
BIN
awesome/theme/titlebar/sticky_normal_active.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
awesome/theme/titlebar/sticky_normal_inactive.png
Normal file
After Width: | Height: | Size: 601 B |
29
base/gitconfig
Normal file
@ -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
|
921
bin/git-remote-gcrypt
Executable file
@ -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
|
5
bin/go-playground
Executable file
@ -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;
|
3
bin/sshfs
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
/usr/bin/sshfs -oTCPKeepAlive=yes -oServerAliveCountMax=1 -oServerAliveInterval=5 $@
|
130
default.nix
Normal file
@ -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;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
94
nvim/default.nix
Normal file
@ -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 "$@"
|
||||||
|
'';
|
||||||
|
|
||||||
|
}
|
170
nvim/init.vim
Normal file
@ -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>
|
41
pkgs.nix
Normal file
@ -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
|
||||||
|
)
|
BIN
wallpapers/4k-oled-wallpaper-of-the-m87-black-hole-2560×1440.jpg
Normal file
After Width: | Height: | Size: 404 KiB |
BIN
wallpapers/4o1bisow7ps21.png
Normal file
After Width: | Height: | Size: 5.6 MiB |
BIN
wallpapers/7nmbvhlv21s21.jpg
Normal file
After Width: | Height: | Size: 485 KiB |
BIN
wallpapers/abra.jpg
Normal file
After Width: | Height: | Size: 64 KiB |
BIN
wallpapers/articuno.jpg
Normal file
After Width: | Height: | Size: 128 KiB |
BIN
wallpapers/big_71d0086eab49280fed10d14d573893a876b5eaf4.png
Normal file
After Width: | Height: | Size: 755 KiB |
BIN
wallpapers/big_aaf416dcccb774b6e508f40e34bd040f72c3d854.jpg
Normal file
After Width: | Height: | Size: 373 KiB |
BIN
wallpapers/big_b1f7b91cb5f611733e723dfcd394364997738589.jpg
Normal file
After Width: | Height: | Size: 60 KiB |
BIN
wallpapers/big_c52f705c7d5b9b74b96c30b5c44361fb04b7d0c7.png
Normal file
After Width: | Height: | Size: 233 KiB |
BIN
wallpapers/bmc5i4njj4t21.png
Normal file
After Width: | Height: | Size: 2.3 MiB |
BIN
wallpapers/charizard.jpg
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
wallpapers/cubone.jpg
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
wallpapers/dragonair.jpg
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
wallpapers/dratini.jpg
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
wallpapers/efo9jncq20s21.jpg
Normal file
After Width: | Height: | Size: 271 KiB |
BIN
wallpapers/elochki-by-hangmoon-2560×1440.jpg
Normal file
After Width: | Height: | Size: 370 KiB |
BIN
wallpapers/evee.jpg
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
wallpapers/gastly.jpg
Normal file
After Width: | Height: | Size: 47 KiB |