@ -0,0 +1 @@ |
||||
result |
@ -0,0 +1,103 @@ |
||||
# Mediocre Loadout |
||||
|
||||
This repo contains everything needed to build my loadout, which is everything |
||||
which I tend to take from one linux machine to the next. This includes: |
||||
|
||||
* My development environment (neovim + plugins + a lot of customization) |
||||
* My shell (zsh + plugins + a custom theme) |
||||
* My window manager (awesome + plugins + a lot of customization) |
||||
|
||||
I'm calling the result the "Mediocre Loadout". It is designed to be completely |
||||
agnostic to the system it is running on, and to make little to no mutations to |
||||
that system. |
||||
|
||||
# Build/Installation/Usage options |
||||
|
||||
To build the Mediocre Loadout you must have a working |
||||
[nix](https://nixos.org/manual/nix/stable/) installation, as well as an `x86_64` |
||||
machine. That's it. |
||||
|
||||
There are multiple build/installation options: |
||||
|
||||
## nix Derivation |
||||
|
||||
To build the nix derivation of the loadout you can do: |
||||
|
||||
``` |
||||
nix-build -A loadout |
||||
``` |
||||
|
||||
This will place the result in the `result` symlink in the root directory. |
||||
Components of the loadout can then be executed from the `bin` subdirectory, |
||||
e.g.: |
||||
|
||||
``` |
||||
./result/bin/nvim |
||||
``` |
||||
|
||||
## nix Environment |
||||
|
||||
Alternatively, to install it to your nix profile do: |
||||
|
||||
``` |
||||
nix-env -i default.nix -A loadout |
||||
``` |
||||
|
||||
Assuming your nix environment is set up correctly, you should be able to execute |
||||
components directly: |
||||
|
||||
``` |
||||
nvim |
||||
``` |
||||
|
||||
## AppImage |
||||
|
||||
An [AppImage](https://appimage.org/) binary can be built which can run any |
||||
component of the loadout individually. This binary can be copied from one |
||||
machine to the next without any of them requiring nix or any other dependencry |
||||
to run it. |
||||
|
||||
To build the binary: |
||||
|
||||
``` |
||||
nix-build -A appimage |
||||
``` |
||||
|
||||
The resulting binary will be placed in the `result` symlink in the root |
||||
directory. |
||||
|
||||
Specific components of the loadout can be run by passing an argument to the |
||||
binary: |
||||
|
||||
``` |
||||
./Mediocre_Loadout-x86_64.AppImage nvim |
||||
``` |
||||
|
||||
# Available Components |
||||
|
||||
Components of the loadout can be run separate from the others, depending on what |
||||
you're trying to do. The following components are available to be run: |
||||
|
||||
* `zsh` (`shell` in the AppImage): My terminal shell. There's some customization |
||||
to it but it should be pretty self-explanatory to "just use". |
||||
|
||||
* `nvim` (`editor` in the AppImage): My neovim development environment, plus all |
||||
plugins I use. I mostly work in golang, so it's most tuned for that, but it |
||||
does fine for general dev work. `Ctrl-N` will open NerdTree, `<backslash>tn` |
||||
will open a terminal tab, and `<backslash>th`/`<backslash>tl` can be used to |
||||
navigate tabs. There's a lot more customization that's been done, see the |
||||
`nvim/init.vim` file. |
||||
|
||||
* `alacritty` (`gui` in the AppImage, might be broken): Terminal which I use. |
||||
Yes, I always use a light-mode theme, because I work in well lit spaces |
||||
generally. There's not much else to this. |
||||
|
||||
* `awesome` (`wm` in the AppImage, almost definitely broken): My window manager. |
||||
There's so much customization I couldn't begin to start. `Meta+Enter` should |
||||
open a terminal, where `Meta` is probably the windows key on your keyboard. |
||||
|
||||
# Status |
||||
|
||||
This configuration is still fairly new, and so expect it to be fairly broken. |
||||
I'll be updating it as I go though, so it should stabalize into something |
||||
functional. |
@ -0,0 +1,861 @@ |
||||
# Configuration for Alacritty, the GPU enhanced terminal emulator. |
||||
|
||||
# Import additional configuration files |
||||
# |
||||
# Imports are loaded in order, skipping all missing files, with the importing |
||||
# file being loaded last. If a field is already present in a previous import, it |
||||
# will be replaced. |
||||
# |
||||
# All imports must either be absolute paths starting with `/`, or paths relative |
||||
# to the user's home directory starting with `~/`. |
||||
#import: |
||||
# - /path/to/alacritty.yml |
||||
|
||||
# Any items in the `env` entry below will be added as |
||||
# environment variables. Some entries may override variables |
||||
# set by alacritty itself. |
||||
env: |
||||
# TERM variable |
||||
# |
||||
# This value is used to set the `$TERM` environment variable for |
||||
# each instance of Alacritty. If it is not present, alacritty will |
||||
# check the local terminfo database and use `alacritty` if it is |
||||
# available, otherwise `xterm-256color` is used. |
||||
#TERM: alacritty |
||||
|
||||
#window: |
||||
# Window dimensions (changes require restart) |
||||
# |
||||
# Number of lines/columns (not pixels) in the terminal. The number of columns |
||||
# must be at least `2`, while using a value of `0` for columns and lines will |
||||
# fall back to the window manager's recommended size. |
||||
#dimensions: |
||||
# columns: 0 |
||||
# lines: 0 |
||||
|
||||
# Window position (changes require restart) |
||||
# |
||||
# Specified in number of pixels. |
||||
# If the position is not set, the window manager will handle the placement. |
||||
#position: |
||||
# x: 0 |
||||
# y: 0 |
||||
|
||||
# Window padding (changes require restart) |
||||
# |
||||
# Blank space added around the window in pixels. This padding is scaled |
||||
# by DPI and the specified value is always added at both opposing sides. |
||||
#padding: |
||||
# x: 0 |
||||
# y: 0 |
||||
|
||||
# Spread additional padding evenly around the terminal content. |
||||
#dynamic_padding: false |
||||
|
||||
# Window decorations |
||||
# |
||||
# Values for `decorations`: |
||||
# - full: Borders and title bar |
||||
# - none: Neither borders nor title bar |
||||
# |
||||
# Values for `decorations` (macOS only): |
||||
# - transparent: Title bar, transparent background and title bar buttons |
||||
# - buttonless: Title bar, transparent background and no title bar buttons |
||||
decorations: none |
||||
|
||||
# Startup Mode (changes require restart) |
||||
# |
||||
# Values for `startup_mode`: |
||||
# - Windowed |
||||
# - Maximized |
||||
# - Fullscreen |
||||
# |
||||
# Values for `startup_mode` (macOS only): |
||||
# - SimpleFullscreen |
||||
#startup_mode: Windowed |
||||
|
||||
# Window title |
||||
#title: Alacritty |
||||
|
||||
# Allow terminal applications to change Alacritty's window title. |
||||
#dynamic_title: true |
||||
|
||||
# Window class (Linux/BSD only): |
||||
#class: |
||||
# Application instance name |
||||
#instance: Alacritty |
||||
# General application class |
||||
#general: Alacritty |
||||
|
||||
# GTK theme variant (Linux/BSD only) |
||||
# |
||||
# Override the variant of the GTK theme. Commonly supported values are `dark` |
||||
# and `light`. Set this to `None` to use the default theme variant. |
||||
#gtk_theme_variant: None |
||||
|
||||
#scrolling: |
||||
# Maximum number of lines in the scrollback buffer. |
||||
# Specifying '0' will disable scrolling. |
||||
#history: 10000 |
||||
|
||||
# Scrolling distance multiplier. |
||||
#multiplier: 3 |
||||
|
||||
## Font configuration |
||||
#font: |
||||
# size: 7 |
||||
|
||||
# |
||||
#TODO I'd like to restore this font configuration, but I can't cause nix |
||||
#doesn't play nicely with fontconfig |
||||
font: |
||||
# Normal (roman) font face |
||||
normal: |
||||
# Font family |
||||
# |
||||
# Default: |
||||
# - (macOS) Menlo |
||||
# - (Linux/BSD) monospace |
||||
# - (Windows) Consolas |
||||
family: Source Code Pro |
||||
|
||||
# The `style` can be specified to pick a specific face. |
||||
style: Regular |
||||
|
||||
# Bold font face |
||||
bold: |
||||
# Font family |
||||
# |
||||
# If the bold family is not specified, it will fall back to the |
||||
# value specified for the normal font. |
||||
family: Source Code Pro |
||||
|
||||
# The `style` can be specified to pick a specific face. |
||||
style: Bold |
||||
|
||||
# Italic font face |
||||
italic: |
||||
# Font family |
||||
# |
||||
# If the italic family is not specified, it will fall back to the |
||||
# value specified for the normal font. |
||||
family: Source Code Pro |
||||
|
||||
# The `style` can be specified to pick a specific face. |
||||
style: Italic |
||||
|
||||
# Bold italic font face |
||||
bold_italic: |
||||
# Font family |
||||
# |
||||
# If the bold italic family is not specified, it will fall back to the |
||||
# value specified for the normal font. |
||||
family: Source Code Pro |
||||
|
||||
# The `style` can be specified to pick a specific face. |
||||
style: Bold Italic |
||||
|
||||
# Point size |
||||
size: 6.3 |
||||
|
||||
# Offset is the extra space around each character. `offset.y` can be thought |
||||
# of as modifying the line spacing, and `offset.x` as modifying the letter |
||||
# spacing. |
||||
#offset: |
||||
# x: 0 |
||||
# y: 0 |
||||
|
||||
# Glyph offset determines the locations of the glyphs within their cells with |
||||
# the default being at the bottom. Increasing `x` moves the glyph to the |
||||
# right, increasing `y` moves the glyph upward. |
||||
#glyph_offset: |
||||
# x: 0 |
||||
# y: 0 |
||||
|
||||
# Thin stroke font rendering (macOS only) |
||||
# |
||||
# Thin strokes are suitable for retina displays, but for non-retina screens |
||||
# it is recommended to set `use_thin_strokes` to `false`. |
||||
#use_thin_strokes: true |
||||
|
||||
# If `true`, bold text is drawn using the bright color variants. |
||||
#draw_bold_text_with_bright_colors: false |
||||
|
||||
# Base16 PaperColor Light 256 - alacritty color config |
||||
# Jon Leopard (http://github.com/jonleopard) based on PaperColor Theme (https://github.com/NLKNguyen/papercolor-theme) |
||||
colors: |
||||
# Default colors |
||||
primary: |
||||
background: '0xeeeeee' |
||||
foreground: '0x444444' |
||||
|
||||
# Colors the cursor will use if `custom_cursor_colors` is true |
||||
cursor: |
||||
text: '0xeeeeee' |
||||
cursor: '0x444444' |
||||
|
||||
# Normal colors |
||||
normal: |
||||
black: '0xeeeeee' |
||||
red: '0xbcbcbc' |
||||
green: '0x8700af' |
||||
yellow: '0xd70087' |
||||
blue: '0xd75f00' |
||||
magenta: '0x005faf' |
||||
cyan: '0xd75f00' |
||||
white: '0x444444' |
||||
|
||||
# Bright colors |
||||
bright: |
||||
black: '0x5f8700' |
||||
red: '0xbcbcbc' |
||||
green: '0x8700af' |
||||
yellow: '0xd70087' |
||||
blue: '0xd75f00' |
||||
magenta: '0x005faf' |
||||
cyan: '0xd75f00' |
||||
white: '0x878787' |
||||
|
||||
indexed_colors: |
||||
- { index: 16, color: '0xd70000' } |
||||
- { index: 17, color: '0x005f87' } |
||||
- { index: 18, color: '0xaf0000' } |
||||
- { index: 19, color: '0x008700' } |
||||
- { index: 20, color: '0x0087af' } |
||||
- { index: 21, color: '0x005f87' } |
||||
|
||||
# Colors (Tomorrow Night) |
||||
#colors: |
||||
# Default colors |
||||
#primary: |
||||
# background: '#1d1f21' |
||||
# foreground: '#c5c8c6' |
||||
|
||||
# Bright and dim foreground colors |
||||
# |
||||
# The dimmed foreground color is calculated automatically if it is not |
||||
# present. If the bright foreground color is not set, or |
||||
# `draw_bold_text_with_bright_colors` is `false`, the normal foreground |
||||
# color will be used. |
||||
#dim_foreground: '#828482' |
||||
#bright_foreground: '#eaeaea' |
||||
|
||||
# Cursor colors |
||||
# |
||||
# Colors which should be used to draw the terminal cursor. |
||||
# |
||||
# Allowed values are CellForeground and CellBackground, which reference the |
||||
# affected cell, or hexadecimal colors like #ff00ff. |
||||
#cursor: |
||||
# text: CellBackground |
||||
# cursor: CellForeground |
||||
|
||||
# Vi mode cursor colors |
||||
# |
||||
# Colors for the cursor when the vi mode is active. |
||||
# |
||||
# Allowed values are CellForeground and CellBackground, which reference the |
||||
# affected cell, or hexadecimal colors like #ff00ff. |
||||
#vi_mode_cursor: |
||||
# text: CellBackground |
||||
# cursor: CellForeground |
||||
|
||||
# Search colors |
||||
# |
||||
# Colors used for the search bar and match highlighting. |
||||
#search: |
||||
# Allowed values are CellForeground and CellBackground, which reference the |
||||
# affected cell, or hexadecimal colors like #ff00ff. |
||||
#matches: |
||||
# foreground: '#000000' |
||||
# background: '#ffffff' |
||||
#focused_match: |
||||
# foreground: CellBackground |
||||
# background: CellForeground |
||||
|
||||
#bar: |
||||
# background: '#c5c8c6' |
||||
# foreground: '#1d1f21' |
||||
|
||||
# Line indicator |
||||
# |
||||
# Color used for the indicator displaying the position in history during |
||||
# search and vi mode. |
||||
# |
||||
# By default, these will use the opposing primary color. |
||||
#line_indicator: |
||||
# foreground: None |
||||
# background: None |
||||
|
||||
# Selection colors |
||||
# |
||||
# Colors which should be used to draw the selection area. |
||||
# |
||||
# Allowed values are CellForeground and CellBackground, which reference the |
||||
# affected cell, or hexadecimal colors like #ff00ff. |
||||
#selection: |
||||
# text: CellBackground |
||||
# background: CellForeground |
||||
|
||||
# Normal colors |
||||
#normal: |
||||
# black: '#1d1f21' |
||||
# red: '#cc6666' |
||||
# green: '#b5bd68' |
||||
# yellow: '#f0c674' |
||||
# blue: '#81a2be' |
||||
# magenta: '#b294bb' |
||||
# cyan: '#8abeb7' |
||||
# white: '#c5c8c6' |
||||
|
||||
# Bright colors |
||||
#bright: |
||||
# black: '#666666' |
||||
# red: '#d54e53' |
||||
# green: '#b9ca4a' |
||||
# yellow: '#e7c547' |
||||
# blue: '#7aa6da' |
||||
# magenta: '#c397d8' |
||||
# cyan: '#70c0b1' |
||||
# white: '#eaeaea' |
||||
|
||||
# Dim colors |
||||
# |
||||
# If the dim colors are not set, they will be calculated automatically based |
||||
# on the `normal` colors. |
||||
#dim: |
||||
# black: '#131415' |
||||
# red: '#864343' |
||||
# green: '#777c44' |
||||
# yellow: '#9e824c' |
||||
# blue: '#556a7d' |
||||
# magenta: '#75617b' |
||||
# cyan: '#5b7d78' |
||||
# white: '#828482' |
||||
|
||||
# Indexed Colors |
||||
# |
||||
# The indexed colors include all colors from 16 to 256. |
||||
# When these are not set, they're filled with sensible defaults. |
||||
# |
||||
# Example: |
||||
# `- { index: 16, color: '#ff00ff' }` |
||||
# |
||||
#indexed_colors: [] |
||||
|
||||
# Bell |
||||
# |
||||
# The bell is rung every time the BEL control character is received. |
||||
#bell: |
||||
# Visual Bell Animation |
||||
# |
||||
# Animation effect for flashing the screen when the visual bell is rung. |
||||
# |
||||
# Values for `animation`: |
||||
# - Ease |
||||
# - EaseOut |
||||
# - EaseOutSine |
||||
# - EaseOutQuad |
||||
# - EaseOutCubic |
||||
# - EaseOutQuart |
||||
# - EaseOutQuint |
||||
# - EaseOutExpo |
||||
# - EaseOutCirc |
||||
# - Linear |
||||
#animation: EaseOutExpo |
||||
|
||||
# Duration of the visual bell flash in milliseconds. A `duration` of `0` will |
||||
# disable the visual bell animation. |
||||
#duration: 0 |
||||
|
||||
# Visual bell animation color. |
||||
#color: '#ffffff' |
||||
|
||||
# Bell Command |
||||
# |
||||
# This program is executed whenever the bell is rung. |
||||
# |
||||
# When set to `command: None`, no command will be executed. |
||||
# |
||||
# Example: |
||||
# command: |
||||
# program: notify-send |
||||
# args: ["Hello, World!"] |
||||
# |
||||
#command: None |
||||
|
||||
# Background opacity |
||||
# |
||||
# Window opacity as a floating point number from `0.0` to `1.0`. |
||||
# The value `0.0` is completely transparent and `1.0` is opaque. |
||||
#background_opacity: 1.0 |
||||
|
||||
#selection: |
||||
# This string contains all characters that are used as separators for |
||||
# "semantic words" in Alacritty. |
||||
#semantic_escape_chars: ",│`|:\"' ()[]{}<>\t" |
||||
|
||||
# When set to `true`, selected text will be copied to the primary clipboard. |
||||
#save_to_clipboard: false |
||||
|
||||
#cursor: |
||||
# Cursor style |
||||
#style: |
||||
# Cursor shape |
||||
# |
||||
# Values for `shape`: |
||||
# - ▇ Block |
||||
# - _ Underline |
||||
# - | Beam |
||||
#shape: Block |
||||
|
||||
# Cursor blinking state |
||||
# |
||||
# Values for `blinking`: |
||||
# - Never: Prevent the cursor from ever blinking |
||||
# - Off: Disable blinking by default |
||||
# - On: Enable blinking by default |
||||
# - Always: Force the cursor to always blink |
||||
#blinking: Off |
||||
|
||||
# Vi mode cursor style |
||||
# |
||||
# If the vi mode cursor style is `None` or not specified, it will fall back to |
||||
# the style of the active value of the normal cursor. |
||||
# |
||||
# See `cursor.style` for available options. |
||||
#vi_mode_style: None |
||||
|
||||
# Cursor blinking interval in milliseconds. |
||||
#blink_interval: 750 |
||||
|
||||
# If this is `true`, the cursor will be rendered as a hollow box when the |
||||
# window is not focused. |
||||
#unfocused_hollow: true |
||||
|
||||
# Thickness of the cursor relative to the cell width as floating point number |
||||
# from `0.0` to `1.0`. |
||||
#thickness: 0.15 |
||||
|
||||
# Live config reload (changes require restart) |
||||
#live_config_reload: true |
||||
|
||||
# Shell |
||||
# |
||||
# You can set `shell.program` to the path of your favorite shell, e.g. |
||||
# `/bin/fish`. Entries in `shell.args` are passed unmodified as arguments to the |
||||
# shell. |
||||
# |
||||
# Default: |
||||
# - (macOS) /bin/bash --login |
||||
# - (Linux/BSD) user login shell |
||||
# - (Windows) powershell |
||||
#shell: |
||||
# program: /bin/bash |
||||
# args: |
||||
# - --login |
||||
|
||||
# Startup directory |
||||
# |
||||
# Directory the shell is started in. If this is unset, or `None`, the working |
||||
# directory of the parent process will be used. |
||||
#working_directory: None |
||||
|
||||
# Send ESC (\x1b) before characters when alt is pressed. |
||||
#alt_send_esc: true |
||||
|
||||
#mouse: |
||||
# Click settings |
||||
# |
||||
# The `double_click` and `triple_click` settings control the time |
||||
# alacritty should wait for accepting multiple clicks as one double |
||||
# or triple click. |
||||
#double_click: { threshold: 300 } |
||||
#triple_click: { threshold: 300 } |
||||
|
||||
# If this is `true`, the cursor is temporarily hidden when typing. |
||||
#hide_when_typing: false |
||||
|
||||
#url: |
||||
# URL launcher |
||||
# |
||||
# This program is executed when clicking on a text which is recognized as a |
||||
# URL. The URL is always added to the command as the last parameter. |
||||
# |
||||
# When set to `launcher: None`, URL launching will be disabled completely. |
||||
# |
||||
# Default: |
||||
# - (macOS) open |
||||
# - (Linux/BSD) xdg-open |
||||
# - (Windows) explorer |
||||
#launcher: |
||||
# program: xdg-open |
||||
# args: [] |
||||
|
||||
# URL modifiers |
||||
# |
||||
# These are the modifiers that need to be held down for opening URLs when |
||||
# clicking on them. The available modifiers are documented in the key |
||||
# binding section. |
||||
#modifiers: None |
||||
|
||||
# Mouse bindings |
||||
# |
||||
# Mouse bindings are specified as a list of objects, much like the key |
||||
# bindings further below. |
||||
# |
||||
# To trigger mouse bindings when an application running within Alacritty |
||||
# captures the mouse, the `Shift` modifier is automatically added as a |
||||
# requirement. |
||||
# |
||||
# Each mouse binding will specify a: |
||||
# |
||||
# - `mouse`: |
||||
# |
||||
# - Middle |
||||
# - Left |
||||
# - Right |
||||
# - Numeric identifier such as `5` |
||||
# |
||||
# - `action` (see key bindings) |
||||
# |
||||
# And optionally: |
||||
# |
||||
# - `mods` (see key bindings) |
||||
#mouse_bindings: |
||||
# - { mouse: Middle, action: PasteSelection } |
||||
|
||||
# Key bindings |
||||
# |
||||
# Key bindings are specified as a list of objects. For example, this is the |
||||
# default paste binding: |
||||
# |
||||
# `- { key: V, mods: Control|Shift, action: Paste }` |
||||
# |
||||
# Each key binding will specify a: |
||||
# |
||||
# - `key`: Identifier of the key pressed |
||||
# |
||||
# - A-Z |
||||
# - F1-F24 |
||||
# - Key0-Key9 |
||||
# |
||||
# A full list with available key codes can be found here: |
||||
# https://docs.rs/glutin/*/glutin/event/enum.VirtualKeyCode.html#variants |
||||
# |
||||
# Instead of using the name of the keys, the `key` field also supports using |
||||
# the scancode of the desired key. Scancodes have to be specified as a |
||||
# decimal number. This command will allow you to display the hex scancodes |
||||
# for certain keys: |
||||
# |
||||
# `showkey --scancodes`. |
||||
# |
||||
# Then exactly one of: |
||||
# |
||||
# - `chars`: Send a byte sequence to the running application |
||||
# |
||||
# The `chars` field writes the specified string to the terminal. This makes |
||||
# it possible to pass escape sequences. To find escape codes for bindings |
||||
# like `PageUp` (`"\x1b[5~"`), you can run the command `showkey -a` outside |
||||
# of tmux. Note that applications use terminfo to map escape sequences back |
||||
# to keys. It is therefore required to update the terminfo when changing an |
||||
# escape sequence. |
||||
# |
||||
# - `action`: Execute a predefined action |
||||
# |
||||
# - ToggleViMode |
||||
# - SearchForward |
||||
# Start searching toward the right of the search origin. |
||||
# - SearchBackward |
||||
# Start searching toward the left of the search origin. |
||||
# - Copy |
||||
# - Paste |
||||
# - IncreaseFontSize |
||||
# - DecreaseFontSize |
||||
# - ResetFontSize |
||||
# - ScrollPageUp |
||||
# - ScrollPageDown |
||||
# - ScrollHalfPageUp |
||||
# - ScrollHalfPageDown |
||||
# - ScrollLineUp |
||||
# - ScrollLineDown |
||||
# - ScrollToTop |
||||
# - ScrollToBottom |
||||
# - ClearHistory |
||||
# Remove the terminal's scrollback history. |
||||
# - Hide |
||||
# Hide the Alacritty window. |
||||
# - Minimize |
||||
# Minimize the Alacritty window. |
||||
# - Quit |
||||
# Quit Alacritty. |
||||
# - ToggleFullscreen |
||||
# - SpawnNewInstance |
||||
# Spawn a new instance of Alacritty. |
||||
# - ClearLogNotice |
||||
# Clear Alacritty's UI warning and error notice. |
||||
# - ClearSelection |
||||
# Remove the active selection. |
||||
# - ReceiveChar |
||||
# - None |
||||
# |
||||
# - Vi mode exclusive actions: |
||||
# |
||||
# - Open |
||||
# Open URLs at the cursor location with the launcher configured in |
||||
# `url.launcher`. |
||||
# - ToggleNormalSelection |
||||
# - ToggleLineSelection |
||||
# - ToggleBlockSelection |
||||
# - ToggleSemanticSelection |
||||
# Toggle semantic selection based on `selection.semantic_escape_chars`. |
||||
# |
||||
# - Vi mode exclusive cursor motion actions: |
||||
# |
||||
# - Up |
||||
# One line up. |
||||
# - Down |
||||
# One line down. |
||||
# - Left |
||||
# One character left. |
||||
# - Right |
||||
# One character right. |
||||
# - First |
||||
# First column, or beginning of the line when already at the first column. |
||||
# - Last |
||||
# Last column, or beginning of the line when already at the last column. |
||||
# - FirstOccupied |
||||
# First non-empty cell in this terminal row, or first non-empty cell of |
||||
# the line when already at the first cell of the row. |
||||
# - High |
||||
# Top of the screen. |
||||
# - Middle |
||||
# Center of the screen. |
||||
# - Low |
||||
# Bottom of the screen. |
||||
# - SemanticLeft |
||||
# Start of the previous semantically separated word. |
||||
# - SemanticRight |
||||
# Start of the next semantically separated word. |
||||
# - SemanticLeftEnd |
||||
# End of the previous semantically separated word. |
||||
# - SemanticRightEnd |
||||
# End of the next semantically separated word. |
||||
# - WordLeft |
||||
# Start of the previous whitespace separated word. |
||||
# - WordRight |
||||
# Start of the next whitespace separated word. |
||||
# - WordLeftEnd |
||||
# End of the previous whitespace separated word. |
||||
# - WordRightEnd |
||||
# End of the next whitespace separated word. |
||||
# - Bracket |
||||
# Character matching the bracket at the cursor's location. |
||||
# - SearchNext |
||||
# Beginning of the next match. |
||||
# - SearchPrevious |
||||
# Beginning of the previous match. |
||||
# - SearchStart |
||||
# Start of the match to the left of the vi mode cursor. |
||||
# - SearchEnd |
||||
# End of the match to the right of the vi mode cursor. |
||||
# |
||||
# - Search mode exclusive actions: |
||||
# - SearchFocusNext |
||||
# Move the focus to the next search match. |
||||
# - SearchFocusPrevious |
||||
# Move the focus to the previous search match. |
||||
# - SearchConfirm |
||||
# - SearchCancel |
||||
# - SearchClear |
||||
# Reset the search regex. |
||||
# - SearchDeleteWord |
||||
# Delete the last word in the search regex. |
||||
# - SearchHistoryPrevious |
||||
# Go to the previous regex in the search history. |
||||
# - SearchHistoryNext |
||||
# Go to the next regex in the search history. |
||||
# |
||||
# - macOS exclusive actions: |
||||
# - ToggleSimpleFullscreen |
||||
# Enter fullscreen without occupying another space. |
||||
# |
||||
# - Linux/BSD exclusive actions: |
||||
# |
||||
# - CopySelection |
||||
# Copy from the selection buffer. |
||||
# - PasteSelection |
||||
# Paste from the selection buffer. |
||||
# |
||||
# - `command`: Fork and execute a specified command plus arguments |
||||
# |
||||
# The `command` field must be a map containing a `program` string and an |
||||
# `args` array of command line parameter strings. For example: |
||||
# `{ program: "alacritty", args: ["-e", "vttest"] }` |
||||
# |
||||
# And optionally: |
||||
# |
||||
# - `mods`: Key modifiers to filter binding actions |
||||
# |
||||
# - Command |
||||
# - Control |
||||
# - Option |
||||
# - Super |
||||
# - Shift |
||||
# - Alt |
||||
# |
||||
# Multiple `mods` can be combined using `|` like this: |
||||
# `mods: Control|Shift`. |
||||
# Whitespace and capitalization are relevant and must match the example. |
||||
# |
||||
# - `mode`: Indicate a binding for only specific terminal reported modes |
||||
# |
||||
# This is mainly used to send applications the correct escape sequences |
||||
# when in different modes. |
||||
# |
||||
# - AppCursor |
||||
# - AppKeypad |
||||
# - Search |
||||
# - Alt |
||||
# - Vi |
||||
# |
||||
# A `~` operator can be used before a mode to apply the binding whenever |
||||
# the mode is *not* active, e.g. `~Alt`. |
||||
# |
||||
# Bindings are always filled by default, but will be replaced when a new |
||||
# binding with the same triggers is defined. To unset a default binding, it can |
||||
# be mapped to the `ReceiveChar` action. Alternatively, you can use `None` for |
||||
# a no-op if you do not wish to receive input characters for that binding. |
||||
# |
||||
# If the same trigger is assigned to multiple actions, all of them are executed |
||||
# in the order they were defined in. |
||||
#key_bindings: |
||||
#- { key: Paste, action: Paste } |
||||
#- { key: Copy, action: Copy } |
||||
#- { key: L, mods: Control, action: ClearLogNotice } |
||||
#- { key: L, mods: Control, mode: ~Vi|~Search, chars: "\x0c" } |
||||
#- { key: PageUp, mods: Shift, mode: ~Alt, action: ScrollPageUp, } |
||||
#- { key: PageDown, mods: Shift, mode: ~Alt, action: ScrollPageDown } |
||||
#- { key: Home, mods: Shift, mode: ~Alt, action: ScrollToTop, } |
||||
#- { key: End, mods: Shift, mode: ~Alt, action: ScrollToBottom } |
||||
|
||||
# Vi Mode |
||||
#- { key: Space, mods: Shift|Control, mode: Vi|~Search, action: ScrollToBottom } |
||||
#- { key: Space, mods: Shift|Control, mode: ~Search, action: ToggleViMode } |
||||
#- { key: Escape, mode: Vi|~Search, action: ClearSelection } |
||||
#- { key: I, mode: Vi|~Search, action: ScrollToBottom } |
||||
#- { key: I, mode: Vi|~Search, action: ToggleViMode } |
||||
#- { key: C, mods: Control, mode: Vi|~Search, action: ToggleViMode } |
||||
#- { key: Y, mods: Control, mode: Vi|~Search, action: ScrollLineUp } |
||||
#- { key: E, mods: Control, mode: Vi|~Search, action: ScrollLineDown } |
||||
#- { key: G, mode: Vi|~Search, action: ScrollToTop } |
||||
#- { key: G, mods: Shift, mode: Vi|~Search, action: ScrollToBottom } |
||||
#- { key: B, mods: Control, mode: Vi|~Search, action: ScrollPageUp } |
||||
#- { key: F, mods: Control, mode: Vi|~Search, action: ScrollPageDown } |
||||
#- { key: U, mods: Control, mode: Vi|~Search, action: ScrollHalfPageUp } |
||||
#- { key: D, mods: Control, mode: Vi|~Search, action: ScrollHalfPageDown } |
||||
#- { key: Y, mode: Vi|~Search, action: Copy } |
||||
#- { key: Y, mode: Vi|~Search, action: ClearSelection } |
||||
#- { key: Copy, mode: Vi|~Search, action: ClearSelection } |
||||
#- { key: V, mode: Vi|~Search, action: ToggleNormalSelection } |
||||
#- { key: V, mods: Shift, mode: Vi|~Search, action: ToggleLineSelection } |
||||
#- { key: V, mods: Control, mode: Vi|~Search, action: ToggleBlockSelection } |
||||
#- { key: V, mods: Alt, mode: Vi|~Search, action: ToggleSemanticSelection } |
||||
#- { key: Return, mode: Vi|~Search, action: Open } |
||||
#- { key: K, mode: Vi|~Search, action: Up } |
||||
#- { key: J, mode: Vi|~Search, action: Down } |
||||
#- { key: H, mode: Vi|~Search, action: Left } |
||||
#- { key: L, mode: Vi|~Search, action: Right } |
||||
#- { key: Up, mode: Vi|~Search, action: Up } |
||||
#- { key: Down, mode: Vi|~Search, action: Down } |
||||
#- { key: Left, mode: Vi|~Search, action: Left } |
||||
#- { key: Right, mode: Vi|~Search, action: Right } |
||||
#- { key: Key0, mode: Vi|~Search, action: First } |
||||
#- { key: Key4, mods: Shift, mode: Vi|~Search, action: Last } |
||||
#- { key: Key6, mods: Shift, mode: Vi|~Search, action: FirstOccupied } |
||||
#- { key: H, mods: Shift, mode: Vi|~Search, action: High } |
||||
#- { key: M, mods: Shift, mode: Vi|~Search, action: Middle } |
||||
#- { key: L, mods: Shift, mode: Vi|~Search, action: Low } |
||||
#- { key: B, mode: Vi|~Search, action: SemanticLeft } |
||||
#- { key: W, mode: Vi|~Search, action: SemanticRight } |
||||
#- { key: E, mode: Vi|~Search, action: SemanticRightEnd } |
||||
#- { key: B, mods: Shift, mode: Vi|~Search, action: WordLeft } |
||||
#- { key: W, mods: Shift, mode: Vi|~Search, action: WordRight } |
||||
#- { key: E, mods: Shift, mode: Vi|~Search, action: WordRightEnd } |
||||
#- { key: Key5, mods: Shift, mode: Vi|~Search, action: Bracket } |
||||
#- { key: Slash, mode: Vi|~Search, action: SearchForward } |
||||
#- { key: Slash, mods: Shift, mode: Vi|~Search, action: SearchBackward } |
||||
#- { key: N, mode: Vi|~Search, action: SearchNext } |
||||
#- { key: N, mods: Shift, mode: Vi|~Search, action: SearchPrevious } |
||||
|
||||
# Search Mode |
||||
#- { key: Return, mode: Search|Vi, action: SearchConfirm } |
||||
#- { key: Escape, mode: Search, action: SearchCancel } |
||||
#- { key: C, mods: Control, mode: Search, action: SearchCancel } |
||||
#- { key: U, mods: Control, mode: Search, action: SearchClear } |
||||
#- { key: W, mods: Control, mode: Search, action: SearchDeleteWord } |
||||
#- { key: P, mods: Control, mode: Search, action: SearchHistoryPrevious } |
||||
#- { key: N, mods: Control, mode: Search, action: SearchHistoryNext } |
||||
#- { key: Up, mode: Search, action: SearchHistoryPrevious } |
||||
#- { key: Down, mode: Search, action: SearchHistoryNext } |
||||
#- { key: Return, mode: Search|~Vi, action: SearchFocusNext } |
||||
#- { key: Return, mods: Shift, mode: Search|~Vi, action: SearchFocusPrevious } |
||||
|
||||
# (Windows, Linux, and BSD only) |
||||
#- { key: V, mods: Control|Shift, mode: ~Vi, action: Paste } |
||||
#- { key: C, mods: Control|Shift, action: Copy } |
||||
#- { key: F, mods: Control|Shift, mode: ~Search, action: SearchForward } |
||||
#- { key: B, mods: Control|Shift, mode: ~Search, action: SearchBackward } |
||||
#- { key: C, mods: Control|Shift, mode: Vi|~Search, action: ClearSelection } |
||||
#- { key: Insert, mods: Shift, action: PasteSelection } |
||||
#- { key: Key0, mods: Control, action: ResetFontSize } |
||||
#- { key: Equals, mods: Control, action: IncreaseFontSize } |
||||
#- { key: Plus, mods: Control, action: IncreaseFontSize } |
||||
#- { key: NumpadAdd, mods: Control, action: IncreaseFontSize } |
||||
#- { key: Minus, mods: Control, action: DecreaseFontSize } |
||||
#- { key: NumpadSubtract, mods: Control, action: DecreaseFontSize } |
||||
|
||||
# (Windows only) |
||||
#- { key: Return, mods: Alt, action: ToggleFullscreen } |
||||
|
||||
# (macOS only) |
||||
#- { key: K, mods: Command, mode: ~Vi|~Search, chars: "\x0c" } |
||||
#- { key: K, mods: Command, mode: ~Vi|~Search, action: ClearHistory } |
||||
#- { key: Key0, mods: Command, action: ResetFontSize } |
||||
#- { key: Equals, mods: Command, action: IncreaseFontSize } |
||||
#- { key: Plus, mods: Command, action: IncreaseFontSize } |
||||
#- { key: NumpadAdd, mods: Command, action: IncreaseFontSize } |
||||
#- { key: Minus, mods: Command, action: DecreaseFontSize } |
||||
#- { key: NumpadSubtract, mods: Command, action: DecreaseFontSize } |
||||
#- { key: V, mods: Command, action: Paste } |
||||
#- { key: C, mods: Command, action: Copy } |
||||
#- { key: C, mods: Command, mode: Vi|~Search, action: ClearSelection } |
||||
#- { key: H, mods: Command, action: Hide } |
||||
#- { key: M, mods: Command, action: Minimize } |
||||
#- { key: Q, mods: Command, action: Quit } |
||||
#- { key: W, mods: Command, action: Quit } |
||||
#- { key: N, mods: Command, action: SpawnNewInstance } |
||||
#- { key: F, mods: Command|Control, action: ToggleFullscreen } |
||||
#- { key: F, mods: Command, mode: ~Search, action: SearchForward } |
||||
#- { key: B, mods: Command, mode: ~Search, action: SearchBackward } |
||||
|
||||
#debug: |
||||
# Display the time it takes to redraw each frame. |
||||
#render_timer: false |
||||
|
||||
# Keep the log file after quitting Alacritty. |
||||
#persistent_logging: false |
||||
|
||||
# Log level |
||||
# |
||||
# Values for `log_level`: |
||||
# - Off |
||||
# - Error |
||||
# - Warn |
||||
# - Info |
||||
# - Debug |
||||
# - Trace |
||||
#log_level: Warn |
||||
|
||||
# Print all received window events. |
||||
#print_events: false |
@ -0,0 +1,35 @@ |
||||
{ |
||||
|
||||
pkgs ? (import ../pkgs.nix) {}, |
||||
zsh ? pkgs.zsh, |
||||
|
||||
}: rec { |
||||
|
||||
# TODO figure out a way to provide my font to alacritty at runtime. fontconfig |
||||
# is a hot mess... |
||||
# |
||||
#dataDir = pkgs.stdenv.mkDerivation { |
||||
# name = "alacritty-dataDir"; |
||||
# src = ./fonts; |
||||
# buildInputs = [ pkgs.fontconfig ]; |
||||
# builder = builtins.toFile "builder.sh" '' |
||||
# source $stdenv/setup |
||||
# mkdir "$out" |
||||
# cp -r "$src" "$out"/fonts |
||||
# chmod -R +w "$out" |
||||
|
||||
# env |
||||
|
||||
# export FONTCONFIG_FILE="$out"/fontconfig |
||||
# fc-cache --verbose "$out"/fonts |
||||
|
||||
# ''; |
||||
#}; |
||||
|
||||
alacritty = pkgs.writeScriptBin "alacritty" '' |
||||
#!${pkgs.bash}/bin/bash |
||||
exec ${pkgs.nixgl}/bin/nixGLIntel ${pkgs.alacritty}/bin/alacritty \ |
||||
--config-file ${./alacritty.yml} \ |
||||
-e "${zsh}/bin/zsh" |
||||
''; |
||||
} |
@ -0,0 +1,17 @@ |
||||
{ |
||||
|
||||
pkgsSrc ? ./pkgs.nix, |
||||
|
||||
}: let |
||||
|
||||
nixBundle = builtins.fetchGit { |
||||
url = "https://github.com/matthewbauer/nix-bundle.git"; |
||||
rev = "223f4ffc4179aa318c34dc873a08cb00090db829"; |
||||
}; |
||||
|
||||
appimageTop = (import "${nixBundle}/appimage-top.nix") { |
||||
nixpkgs' = pkgsSrc; |
||||
}; |
||||
|
||||
in { name, target }: |
||||
appimageTop.appimage (appimageTop.appdir { inherit name target; }) |
@ -0,0 +1,9 @@ |
||||
# For use in ubuntu, just copy into /usr/share/xsessions |
||||
|
||||
[Desktop Entry] |
||||
Name=awesome |
||||
Comment=Highly configurable framework window manager |
||||
Exec=/home/mediocregopher/.nix-profile/bin/awesome |
||||
Type=Application |
||||
Icon=/usr/share/pixmaps/awesome.xpm |
||||
Keywords=Window manager |
@ -0,0 +1,43 @@ |
||||
local io = io |
||||
local math = math |
||||
local tonumber = tonumber |
||||
local string = string |
||||
local naughty = require("naughty") |
||||
|
||||
function batteryInfo() |
||||
for i=0,1 do |
||||
local dir = "/sys/class/power_supply/BAT" .. tostring(i) .. "/" |
||||
local f_status = io.popen("cat " .. dir .. "status 2>/dev/null") |
||||
local c_status = f_status:read() |
||||
f_status:close() |
||||
|
||||
if c_status and c_status ~= "" then |
||||
local prefix = "energy" |
||||
local f_now = io.popen("cat " .. dir .. prefix .. "_now 2>/dev/null") |
||||
local c_now_str = f_now:read() |
||||
f_now:close() |
||||
|
||||
if not c_now_str or c_now_str == "" then |
||||
prefix = "charge" |
||||
local f_now = io.popen("cat " .. dir .. prefix .. "_now") |
||||
c_now_str = f_now:read() |
||||
f_now:close() |
||||
end |
||||
|
||||
local f_full = io.popen("cat " .. dir .. prefix .. "_full") |
||||
local c_full_str = f_full:read() |
||||
f_full:close() |
||||
|
||||
local c_now = tonumber(c_now_str) |
||||
local c_full = tonumber(c_full_str) |
||||
|
||||
local charging = (c_status == "Charging" or c_status == "Full") |
||||
|
||||
if c_now ~= nil and c_full ~= nil then |
||||
local percent = math.floor((c_now/c_full) * 100) |
||||
return percent, charging |
||||
end |
||||
end |
||||
end |
||||
return nil, charging |
||||
end |
@ -0,0 +1,4 @@ |
||||
#!/bin/sh |
||||
|
||||
R=`find "$1" | grep -P 'png$' | sort -R | head -n1` |
||||
exec i3lock -i $R -t |
@ -0,0 +1,4 @@ |
||||
#!/bin/sh |
||||
|
||||
scrot -o -s "/tmp/shot.png" |
||||
eog /tmp/shot.png |
@ -0,0 +1,50 @@ |
||||
#!/bin/bash |
||||
|
||||
cd $(dirname "$0") |
||||
|
||||
sep=" | " |
||||
|
||||
out=$(/home/mediocregopher/.config/awesome/bin/cricket \ |
||||
--limit 1 \ |
||||
--ping-hosts 8.8.8.8 \ |
||||
--net-interval "" \ |
||||
--disk-interval "" \ |
||||
--disk-io-interval "") |
||||
|
||||
function outNum { |
||||
echo "$out" | grep "$1" | grep -oP "$2=\"[0-9]+\"" | grep -oP '[0-9]+' |
||||
} |
||||
|
||||
echo -n "ping:$(outNum "ping result" "tookMSAvg")ms" |
||||
|
||||
echo -n "$sep" |
||||
|
||||
memBarSize=10 |
||||
memPer=$(outNum "mem stats" "memUsedPer") |
||||
memUsed=$(expr $memPer / $memBarSize) |
||||
memUnused=$(expr $memBarSize - $memUsed) |
||||
echo -n "mem:" |
||||
for i in $(seq $memUsed); do echo -n "█"; done |
||||
for i in $(seq $memUnused); do echo -n "░"; done |
||||
for i in $(seq $(expr $memBarSize - $memUsed - $memUnused)); do echo -n "░"; done |
||||
|
||||
echo -n "$sep" |
||||
|
||||
cpuBarSize=20 |
||||
cpuIdle=$(outNum "cpu stats" "cpuIdle") |
||||
cpuSys=$(outNum "cpu stats" "cpuSystem") |
||||
cpuUser=$(outNum "cpu stats" "cpuUser") |
||||
cpuTot=$(expr $cpuIdle + $cpuSys + $cpuUser) |
||||
function cpuL { |
||||
python -c "print(int($1 / $cpuTot * $cpuBarSize))" |
||||
} |
||||
cpuLIdle=$(cpuL $cpuIdle) |
||||
cpuLSys=$(cpuL $cpuSys) |
||||
cpuLUser=$(cpuL $cpuUser) |
||||
echo -n "cpu:" |
||||
for i in $(seq $cpuLUser); do echo -n "█"; done |
||||
for i in $(seq $cpuLSys); do echo -n "▓"; done |
||||
for i in $(seq $cpuLIdle); do echo -n "░"; done |
||||
for i in $(seq $(expr $cpuBarSize - $cpuLIdle - $cpuLSys - $cpuLUser)); do echo -n "░"; done |
||||
|
||||
echo "" |
@ -0,0 +1,26 @@ |
||||
{ |
||||
|
||||
pkgs ? (import ../pkgs.nix) {}, |
||||
|
||||
}: rec { |
||||
|
||||
cfg = ./.; |
||||
wp = ../wallpapers; |
||||
|
||||
dirsLua = pkgs.writeTextDir "dirs.lua" '' |
||||
home_dir = os.getenv("HOME").."/" |
||||
conf_dir = "${cfg}/" |
||||
wp_dir = "${wp}/" |
||||
''; |
||||
|
||||
awesome = pkgs.writeScriptBin "awesome" '' |
||||
#!${pkgs.bash}/bin/bash |
||||
echo "[$(date)] New awesome session starting" > ~/.awesome.log |
||||
exec ${pkgs.awesome}/bin/awesome \ |
||||
-c ${cfg}/rc.lua \ |
||||
--search ${dirsLua} \ |
||||
--search ${cfg} \ |
||||
2>&1 2>>~/.awesome.log |
||||
''; |
||||
|
||||
} |
After Width: | Height: | Size: 26 KiB |
@ -0,0 +1,13 @@ |
||||
[Unit] |
||||
Description=mediocregopher's sysstats |
||||
Requires=network.target |
||||
After=network.target |
||||
|
||||
[Service] |
||||
Restart=always |
||||
RestartSec=1s |
||||
User=mediocregopher |
||||
ExecStart=/bin/bash -c 'while [ 1 ]; do out=$(~/.config/awesome/bin/sysstats.sh); echo "$out" > /tmp/sysstats; sleep 1; done' |
||||
|
||||
[Install] |
||||
WantedBy=multi-user.target |
@ -0,0 +1,40 @@ |
||||
local io = io |
||||
local math = math |
||||
local tonumber = tonumber |
||||
local tostring = tostring |
||||
local string = string |
||||
local naughty = require("naughty") |
||||
|
||||
function volumeInfo() |
||||
volmin = 0 |
||||
volmax = 65536 |
||||
local f = io.popen("pacmd dump |grep set-sink-volume|grep analog-stereo") |
||||
local g = io.popen("pacmd dump |grep set-sink-mute|grep analog-stereo") |
||||
local v = f:read() |
||||
local mute = g:read() |
||||
if mute ~= nil and string.find(mute, "no") then |
||||
volume = math.floor(tonumber(string.sub(v, string.find(v, 'x')-1)) * 100 / volmax) |
||||
else |
||||
volume = "off" |
||||
end |
||||
f:close() |
||||
g:close() |
||||
return "vol:"..volume.." " |
||||
end |
||||
|
||||
function muteAll() |
||||
local outh = io.popen("pactl list short sources | awk '{print $1}'") |
||||
while true do |
||||
local i = outh:read() |
||||
if i == nil then break end |
||||
io.popen("pactl set-source-mute " .. i .. " 1"):close() |
||||
end |
||||
outh:close() |
||||
end |
||||
|
||||
function unmuted() |
||||
local outh = io.popen("pactl list sources | grep 'Mute: no'") |
||||
local any = outh:read() |
||||
outh:close() |
||||
return any ~= nil |
||||
end |
@ -0,0 +1,544 @@ |
||||
-- Standard awesome library |
||||
local gears = require("gears") |
||||
local awful = require("awful") |
||||
awful.rules = require("awful.rules") |
||||
require("awful.autofocus") |
||||
-- Widget and layout library |
||||
local wibox = require("wibox") |
||||
-- Notification library |
||||
local naughty = require("naughty") |
||||
local menubar = require("menubar") |
||||
|
||||
local function debug(msg) |
||||
if not msg then msg = "" end |
||||
naughty.notify({ text = "debug: " .. msg }) |
||||
end |
||||
|
||||
local function info(msg) |
||||
naughty.notify({ text = msg }) |
||||
end |
||||
|
||||
require("dirs") |
||||
require("bat") |
||||
require("pulseaudio") |
||||
muteAll() -- pre-emptively mute all mics, just in-case |
||||
|
||||
-- for sanity |
||||
local home_dir = os.getenv("HOME").."/" |
||||
|
||||
-- {{{ Naughty config (the notification library) |
||||
naughty.config.defaults.position = "bottom_right" |
||||
naughty.config.defaults.width = 250 |
||||
naughty.config.defaults.icon=conf_dir .. "helper.png" |
||||
naughty.config.defaults.icon_size = 75 |
||||
-- }}} |
||||
|
||||
-- {{{ Error handling |
||||
-- Check if awesome encountered an error during startup and fell back to |
||||
-- another config (This code will only ever execute for the fallback config) |
||||
if awesome.startup_errors then |
||||
naughty.notify({ preset = naughty.config.presets.critical, |
||||
title = "Oops, there were errors during startup!", |
||||
text = awesome.startup_errors }) |
||||
end |
||||
|
||||
-- Handle runtime errors after startup |
||||
do |
||||
local in_error = false |
||||
awesome.connect_signal("debug::error", function (err) |
||||
-- Make sure we don't go into an endless error loop |
||||
if in_error then return end |
||||
in_error = true |
||||
|
||||
naughty.notify({ preset = naughty.config.presets.critical, |
||||
title = "Oops, an error happened!", |
||||
text = err }) |
||||
in_error = false |
||||
end) |
||||
end |
||||
-- }}} |
||||
|
||||
|
||||
local beautiful = require("beautiful") |
||||
|
||||
-- {{{ Wallpaper |
||||
-- we do this here, before the theme is loaded, because our theme depends on |
||||
-- knowing what our wallpaper is, cause this shit is cray |
||||
function rand_wp() |
||||
local ls = io.popen("ls " .. wp_dir .. " | shuf -n1") |
||||
local wp = ls:read("*l") |
||||
return wp_dir .. '/' .. wp |
||||
end |
||||
|
||||
function rand_wp_lock() |
||||
awful.spawn(conf_dir.."bin/random_i3lock.sh "..wp_dir, false) |
||||
end |
||||
|
||||
local wp = rand_wp() |
||||
local imgavg = io.popen("cat " .. wp .. " | " .. conf_dir .. "/bin/imgavg") |
||||
local avgcolor = imgavg:read() |
||||
local comcolor = imgavg:read() |
||||
imgavg:close() |
||||
|
||||
for s = 1, screen.count() do |
||||
gears.wallpaper.maximized(wp, s, true) |
||||
end |
||||
-- }}} |
||||
|
||||
require("theme/theme") |
||||
local theme = load_theme(avgcolor, comcolor) |
||||
beautiful.init(theme) |
||||
|
||||
-- This is used later as the default terminal and editor to run. |
||||
terminal = "alacritty" |
||||
|
||||
editor = os.getenv("EDITOR") or "nano" |
||||
editor_cmd = terminal .. " -e " .. editor |
||||
|
||||
-- Default modkey. |
||||
-- Usually, Mod4 is the key with a logo between Control and Alt. |
||||
-- If you do not like this or do not have such a key, |
||||
-- I suggest you to remap Mod4 to another key using xmodmap or other tools. |
||||
-- However, you can use another modifier like Mod1, but it may interact with others. |
||||
modkey = "Mod4" |
||||
|
||||
-- Table of layouts to cover with awful.layout.inc, order matters. |
||||
local layouts = |
||||
{ |
||||
awful.layout.suit.fair, |
||||
awful.layout.suit.fair.horizontal, |
||||
awful.layout.suit.tile, |
||||
awful.layout.suit.tile.left, |
||||
awful.layout.suit.tile.bottom, |
||||
awful.layout.suit.tile.top, |
||||
-- awful.layout.suit.spiral, |
||||
-- awful.layout.suit.spiral.dwindle, |
||||
-- awful.layout.suit.max, |
||||
-- awful.layout.suit.max.fullscreen, |
||||
-- awful.layout.suit.magnifier, |
||||
awful.layout.suit.floating |
||||
} |
||||
-- }}} |
||||
|
||||
|
||||
-- {{{ Tags |
||||
-- Define a tag table which hold all screen tags. |
||||
tags = {} |
||||
for s = 1, screen.count() do |
||||
-- Each screen has its own tag table. |
||||
tags[s] = awful.tag({ 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s, layouts[1]) |
||||
end |
||||
-- }}} |
||||
|
||||
-- Menubar configuration |
||||
menubar.utils.terminal = terminal -- Set the terminal for applications that require it |
||||
|
||||
-- {{{ Wibox |
||||
|
||||
-- {{{ Battery widget |
||||
local battimerintvl = 4 |
||||
batwidget = wibox.widget.textbox("") |
||||
battimer = gears.timer({ timeout = battimerintvl }) |
||||
battimer:connect_signal("timeout", |
||||
function() |
||||
local batlevel, charging = batteryInfo() |
||||
if batlevel == nil then batlevel = "unk" |
||||
elseif (tonumber(batlevel) < 10) then |
||||
naughty.notify({ |
||||
preset = naughty.config.presets.critical, |
||||
title="ALERT", |
||||
text="BATTERY LEVEL LOW", |
||||
timeout=battimerintvl-1, |
||||
}) |
||||
end |
||||
if charging then |
||||
batwidget:set_markup('bat:'..batlevel) |
||||
else |
||||
batwidget:set_markup('<b>bat:'..batlevel..'</b>') |
||||
end |
||||
end) |
||||
battimer:start() |
||||
-- }}} |
||||
|
||||
-- {{{ sysstats widget |
||||
sysstatswidget = wibox.widget.textbox("") |
||||
sysstatstimer = gears.timer({ timeout = 1 }) |
||||
sysstatstimer:connect_signal("timeout", |
||||
function() |
||||
local sysstats = "??? STATS ???" |
||||
local f_sysstats = io.open("/tmp/sysstats") |
||||
if f_sysstats then |
||||
c_sysstats = f_sysstats:read() |
||||
f_sysstats:close() |
||||
if c_sysstats then sysstats = c_sysstats end |
||||
end |
||||
sysstatswidget:set_markup(sysstats) |
||||
end) |
||||
sysstatstimer:start() |
||||
-- }}} |
||||
|
||||
-- {{{ notifier for when my mic isn't muted |
||||
local unmuteNot |
||||
mutechecktimer = gears.timer({ timeout = 0.5 }) |
||||
mutechecktimer:connect_signal("timeout", |
||||
function() |
||||
local anyUnmuted = unmuted() |
||||
if unmuteNot and not anyUnmuted then |
||||
naughty.destroy(unmuteNot, naughty.notificationClosedReason.dismissedByUser) |
||||
unmuteNot = nil |
||||
elseif not unmuteNot and anyUnmuted then |
||||
unmuteNot = naughty.notify({ |
||||
preset = naughty.config.presets.critical, |
||||
text = "Mic is hot!", |
||||
timeout = 0, |
||||
}) |
||||
end |
||||
end) |
||||
mutechecktimer:start() |
||||
-- }}} |
||||
|
||||
|
||||
-- Create a textclock widget |
||||
mytextclock = wibox.widget.textclock("%a <b>%d</b>/%m <b>%H:%M</b> %z") |
||||
myutctextclock = wibox.widget.textclock("%a %d/%m %H:%M %z", 60, "Z") |
||||
|
||||
-- Create a wibox for each screen and add it |
||||
mywibox = {} |
||||
mypromptbox = {} |
||||
mylayoutbox = {} |
||||
mytaglist = {} |
||||
mytaglist.buttons = awful.util.table.join( |
||||
awful.button({ }, 1, awful.tag.viewonly), |
||||
awful.button({ modkey }, 1, awful.client.movetotag), |
||||
awful.button({ }, 3, awful.tag.viewtoggle), |
||||
awful.button({ modkey }, 3, awful.client.toggletag), |
||||
awful.button({ }, 4, function(t) awful.tag.viewnext(awful.tag.getscreen(t)) end), |
||||
awful.button({ }, 5, function(t) awful.tag.viewprev(awful.tag.getscreen(t)) end) |
||||
) |
||||
mytasklist = {} |
||||
mytasklist.buttons = awful.util.table.join( |
||||
awful.button({ }, 1, function (c) |
||||
if c == client.focus then |
||||
c.minimized = true |
||||
else |
||||
-- Without this, the following |
||||
-- :isvisible() makes no sense |
||||
c.minimized = false |
||||
if not c:isvisible() then |
||||
awful.tag.viewonly(c:tags()[1]) |
||||
end |
||||
-- This will also un-minimize |
||||
-- the client, if needed |
||||
client.focus = c |
||||
c:raise() |
||||
end |
||||
end), |
||||
awful.button({ }, 3, function () |
||||
if instance then |
||||
instance:hide() |
||||
instance = nil |
||||
else |
||||
instance = awful.menu.clients({ |
||||
theme = { width = 250 } |
||||
}) |
||||
end |
||||
end), |
||||
awful.button({ }, 4, function () |
||||
awful.client.focus.byidx(1) |
||||
if client.focus then client.focus:raise() end |
||||
end), |
||||
awful.button({ }, 5, function () |
||||
awful.client.focus.byidx(-1) |
||||
if client.focus then client.focus:raise() end |
||||
end)) |
||||
|
||||
for s = 1, screen.count() do |
||||
-- Create a promptbox for each screen |
||||
mypromptbox[s] = awful.widget.prompt() |
||||
-- Create an imagebox widget which will contains an icon indicating which layout we're using. |
||||
-- We need one layoutbox per screen. |
||||
mylayoutbox[s] = awful.widget.layoutbox(s) |
||||
mylayoutbox[s]:buttons(awful.util.table.join( |
||||
awful.button({ }, 1, function () awful.layout.inc(layouts, 1) end), |
||||
awful.button({ }, 3, function () awful.layout.inc(layouts, -1) end), |
||||
awful.button({ }, 4, function () awful.layout.inc(layouts, 1) end), |
||||
awful.button({ }, 5, function () awful.layout.inc(layouts, -1) end))) |
||||
-- Create a taglist widget |
||||
mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.filter.all, mytaglist.buttons) |
||||
|
||||
-- Create a tasklist widget |
||||
mytasklist[s] = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons) |
||||
|
||||
-- Create the wibox |
||||
mywibox[s] = awful.wibar({ position = "top", screen = s }) |
||||
|
||||
-- Widgets that are aligned to the left |
||||
local left_layout = wibox.layout.fixed.horizontal() |
||||
left_layout:add(mylayoutbox[s]) |
||||
left_layout:add(mypromptbox[s]) |
||||
|
||||
-- Widgets that are aligned to the right |
||||
local right_sep = " | " |
||||
local right_layout = wibox.layout.fixed.horizontal() |
||||
--right_layout:add(wibox.widget.textbox(right_sep)) |
||||
right_layout:add(sysstatswidget) |
||||
right_layout:add(wibox.widget.textbox(right_sep)) |
||||
right_layout:add(batwidget) |
||||
right_layout:add(wibox.widget.textbox(right_sep)) |
||||
right_layout:add(wibox.widget.systray()) |
||||
right_layout:add(wibox.widget.textbox(right_sep)) |
||||
right_layout:add(mytaglist[s]) |
||||
right_layout:add(wibox.widget.textbox(right_sep)) |
||||
right_layout:add(myutctextclock) |
||||
right_layout:add(wibox.widget.textbox(right_sep)) |
||||
right_layout:add(mytextclock) |
||||
|
||||
-- Now bring it all together (with the tasklist in the middle) |
||||
local layout = wibox.layout.align.horizontal() |
||||
layout:set_left(left_layout) |
||||
layout:set_middle(mytasklist[s]) |
||||
layout:set_right(right_layout) |
||||
|
||||
mywibox[s]:set_widget(layout) |
||||
end |
||||
-- }}} |
||||
|
||||
local function focused() |
||||
return awful.screen.focused().index |
||||
end |
||||
|
||||
-- {{{ Mouse bindings |
||||
root.buttons(awful.util.table.join( |
||||
-- awful.button({ }, 3, function () mymainmenu:toggle() end), |
||||
awful.button({ }, 4, awful.tag.viewnext), |
||||
awful.button({ }, 5, awful.tag.viewprev) |
||||
)) |
||||
-- }}} |
||||
|
||||
-- {{{ Key bindings |
||||
globalkeys = awful.util.table.join( |
||||
awful.key({ modkey, }, "Left", awful.tag.viewprev ), |
||||
awful.key({ modkey, }, "Right", awful.tag.viewnext ), |
||||
|
||||
-- j and k are used for moving around windows and moving windows around |
||||
awful.key({ modkey, }, "j", |
||||
function () |
||||
awful.client.focus.byidx( 1) |
||||
if client.focus then client.focus:raise() end |
||||
end), |
||||
awful.key({ modkey, }, "k", |
||||
function () |
||||
awful.client.focus.byidx(-1) |
||||
if client.focus then client.focus:raise() end |
||||
end), |
||||
awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end), |
||||
awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end), |
||||
awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end), |
||||
awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end), |
||||
|
||||
-- h and l are for resizing |
||||
awful.key({ modkey, }, "l", function () awful.tag.incmwfact( 0.05) end), |
||||
awful.key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end), |
||||
awful.key({ modkey, "Control" }, "h", function () awful.tag.incnmaster( 1) end), |
||||
awful.key({ modkey, "Control" }, "l", function () awful.tag.incnmaster(-1) end), |
||||
|
||||
-- Space is for changing the layout |
||||
awful.key({ modkey, }, "space", function () awful.layout.inc(layouts, 1) end), |
||||
awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, -1) end), |
||||
|
||||
|
||||
-- r is for restart, awesome or the whole computer |
||||
awful.key({ modkey }, "r", awesome.restart), |
||||
awful.key({ modkey, "Control" }, "r", |
||||
function () |
||||
info("rebooting") |
||||
awful.spawn("systemctl reboot") |
||||
end), |
||||
|
||||
-- Escape is for quitting, either the current program, all of awesome, or |
||||
-- or all of everything (suspend) (current program is under clientkeys) |
||||
awful.key({ modkey, "Control" }, "Escape", awesome.quit), |
||||
awful.key({ modkey, "Control", "Shift" }, "Escape", |
||||
function () |
||||
info("hibernating") |
||||
awful.spawn("systemctl hibernate") |
||||
end), |
||||
|
||||
-- n is for minimizing and unminimizing (minimmize is implemented under |
||||
-- clientkeys) |
||||
awful.key({ modkey, "Control" }, "n", awful.client.restore), |
||||
|
||||
-- Prompt |
||||
awful.key({ modkey }, "p", function () |
||||
local screen = awful.screen.focused().index |
||||
mywibox[screen].visible = true |
||||
mypromptbox[screen]:run() |
||||
end), |
||||
|
||||
--Terminal |
||||
awful.key({ modkey }, "Return", function () |
||||
awful.spawn(terminal) |
||||
end), |
||||
|
||||
--PrintScreen |
||||
awful.key({}, "Print", false, function () awful.spawn(conf_dir.."bin/scrot-gobin.sh",false) end), |
||||
awful.key({ "Control" }, "Print", function () |
||||
local scr_dir = home_dir..'Screenshots' |
||||
awful.spawn("mkdir -p "..scr_dir, false) |
||||
awful.spawn("scrot -e 'mv $f "..scr_dir.."/ 2>/dev/null'",false) |
||||
naughty.notify({ text = "Screenshot taken" }) |
||||
end), |
||||
|
||||
--Lock screen |
||||
awful.key({ modkey, "Control" }, "Delete", rand_wp_lock), |
||||
|
||||
awful.key( { }, "XF86AudioRaiseVolume", function() |
||||
awful.spawn("/usr/bin/pactl set-sink-volume @DEFAULT_SINK@ +5%", false) |
||||
awful.spawn("/usr/bin/pactl set-sink-mute @DEFAULT_SINK@ 0", false) |
||||
end), |
||||
|
||||
awful.key( { }, "XF86AudioLowerVolume", function() |
||||
awful.spawn("/usr/bin/pactl set-sink-volume @DEFAULT_SINK@ -5%", false) |
||||
awful.spawn("/usr/bin/pactl set-sink-mute @DEFAULT_SINK@ 0", false) |
||||
end), |
||||
|
||||
awful.key( { }, "XF86AudioMute", function() |
||||
awful.spawn("/usr/bin/pactl set-sink-mute @DEFAULT_SINK@ toggle", false) |
||||
end), |
||||
|
||||
awful.key( { }, "XF86MonBrightnessUp", function() |
||||
awful.spawn("/usr/bin/xbacklight -inc 5", false) |
||||
end), |
||||
|
||||
awful.key( { }, "XF86MonBrightnessDown", function() |
||||
awful.spawn("/usr/bin/xbacklight -dec 5", false) |
||||
end), |
||||
|
||||
-- Push to talk |
||||
awful.key( { modkey }, "q", function() |
||||
awful.spawn("/usr/bin/pactl set-source-mute @DEFAULT_SOURCE@ 0") |
||||
end, |
||||
muteAll, |
||||
{ }) |
||||
) |
||||
|
||||
globalkeys = awful.util.table.join(globalkeys, |
||||
awful.key( { modkey }, "a", function() |
||||
info(tostring(os.time())) |
||||
end) |
||||
) |
||||
|
||||
clientkeys = awful.util.table.join( |
||||
awful.key({ modkey, }, "f", function (c) c.fullscreen = not c.fullscreen end), |
||||
awful.key({ modkey, }, "Escape", function (c) c:kill() end), |
||||
awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle ), |
||||
awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end), |
||||
awful.key({ modkey, }, "n", |
||||
function (c) |
||||
-- The client currently has the input focus, so it cannot be |
||||
-- minimized, since minimized clients can't have the focus. |
||||
c.minimized = true |
||||
end), |
||||
awful.key({ modkey, }, "m", |
||||
function (c) |
||||
c.maximized_horizontal = not c.maximized_horizontal |
||||
c.maximized_vertical = not c.maximized_vertical |
||||
end) |
||||
) |
||||
|
||||
-- Bind all key numbers to tags. |
||||
-- Be careful: we use keycodes to make it works on any keyboard layout. |
||||
-- This should map on the top row of your keyboard, usually 1 to 9. |
||||
for i = 1, 9 do |
||||
globalkeys = awful.util.table.join(globalkeys, |
||||
-- View tag only. |
||||
awful.key({ modkey }, "#" .. i + 9, |
||||
function () |
||||
local screen = awful.screen.focused() |
||||
local tag = screen.tags[i] |
||||
if tag then |
||||
tag:view_only() |
||||
end |
||||
end), |
||||
-- Toggle tag. |
||||
awful.key({ modkey, "Control" }, "#" .. i + 9, |
||||
function () |
||||
local screen = awful.screen.focused() |
||||
local tag = screen.tags[i] |
||||
if tag then |
||||
awful.tag.viewtoggle(tag) |
||||
end |
||||
end), |
||||
-- Move client to tag. |
||||
awful.key({ modkey, "Shift" }, "#" .. i + 9, |
||||
function () |
||||
if client.focus then |
||||
local screen = awful.screen.focused() |
||||
local tag = screen.tags[i] |
||||
if tag then |
||||
client.focus:move_to_tag(tag) |
||||
end |
||||
end |
||||
end)) |
||||
end |
||||
|
||||
clientbuttons = awful.util.table.join( |
||||
awful.button({ }, 1, function (c) client.focus = c; c:raise() end), |
||||
awful.button({ modkey }, 1, awful.mouse.client.move), |
||||
awful.button({ modkey }, 3, awful.mouse.client.resize)) |
||||
|
||||
-- Set keys |
||||
root.keys(globalkeys) |
||||
-- }}} |
||||
|
||||
-- {{{ Rules |
||||
-- Rules to apply to new clients (through the "manage" signal). |
||||
awful.rules.rules = { |
||||
-- All clients will match this rule. |
||||
{ rule = { }, |
||||
properties = { border_width = beautiful.border_width, |
||||
border_color = beautiful.border_normal, |
||||
focus = awful.client.focus.filter, |
||||
raise = true, |
||||
keys = clientkeys, |
||||
buttons = clientbuttons } }, |
||||
{ rule = { class = "MPlayer" }, |
||||
properties = { floating = true } }, |
||||
{ rule = { class = "pinentry" }, |
||||
properties = { floating = true } }, |
||||
{ rule = { class = "gimp" }, |
||||
properties = { floating = true } } |
||||
-- Set Firefox to always map on tags number 2 of screen 1. |
||||
-- { rule = { class = "Firefox" }, |
||||
-- properties = { tag = tags[1][2] } }, |
||||
} |
||||
-- }}} |
||||
|
||||
-- {{{ Signals |
||||
-- Signal function to execute when a new client appears. |
||||
client.connect_signal("manage", function (c, startup) |
||||
-- Enable sloppy focus |
||||
c:connect_signal("mouse::enter", function(c) |
||||
if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier |
||||
and awful.client.focus.filter(c) then |
||||
client.focus = c |
||||
end |
||||
end) |
||||
|
||||
if not startup then |
||||
-- Set the windows at the slave, |
||||
-- i.e. put it at the end of others instead of setting it master. |
||||
-- awful.client.setslave(c) |
||||
|
||||
-- Put windows in a smart way, only if they does not set an initial position. |
||||
if not c.size_hints.user_position and not c.size_hints.program_position then |
||||
c:move_to_screen(awful.screen.focused()) |
||||
awful.placement.no_overlap(c) |
||||
awful.placement.no_offscreen(c) |
||||
end |
||||
end |
||||
end) |
||||
|
||||
client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end) |
||||
client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) |
||||
-- }}} |
@ -0,0 +1,3 @@ |
||||
Background images: |
||||
Mikael Eriksson <mikael_eriksson@miffe.org> |
||||
Licensed under CC-BY-SA-3.0 |
After Width: | Height: | Size: 220 KiB |
After Width: | Height: | Size: 265 KiB |
After Width: | Height: | Size: 967 B |
After Width: | Height: | Size: 997 B |
After Width: | Height: | Size: 194 B |
After Width: | Height: | Size: 194 B |
After Width: | Height: | Size: 201 B |
After Width: | Height: | Size: 201 B |
After Width: | Height: | Size: 395 B |
After Width: | Height: | Size: 388 B |
After Width: | Height: | Size: 202 B |
After Width: | Height: | Size: 202 B |
After Width: | Height: | Size: 209 B |
After Width: | Height: | Size: 209 B |
After Width: | Height: | Size: 321 B |
After Width: | Height: | Size: 321 B |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 174 B |
After Width: | Height: | Size: 195 B |
After Width: | Height: | Size: 216 B |
After Width: | Height: | Size: 172 B |
After Width: | Height: | Size: 170 B |
After Width: | Height: | Size: 195 B |
After Width: | Height: | Size: 215 B |
After Width: | Height: | Size: 168 B |
After Width: | Height: | Size: 440 B |
After Width: | Height: | Size: 187 B |
After Width: | Height: | Size: 193 B |
@ -0,0 +1,105 @@ |
||||
--------------------------- |
||||
-- Default awesome theme -- |
||||
--------------------------- |
||||
|
||||
function load_theme(avgcolor, comcolor) |
||||
if not avgcolor then avgcolor = "#000000" end |
||||
if not comcolor then comcolor = "#FFFFFF" end |
||||
|
||||
local theme = {} |
||||
|
||||
theme.font = "sans 8" |
||||
|
||||
--theme.bg_normal = "#222222" |
||||
theme.bg_normal = avgcolor |
||||
theme.bg_focus = theme.bg_normal |
||||
theme.bg_urgent = "#ff0000" -- TODO should be opposite of bg_normal |
||||
theme.bg_minimize = theme.bg_normal |
||||
theme.bg_systray = theme.bg_normal |
||||
|
||||
|
||||
--theme.fg_normal = "#aaaaaa" |
||||
theme.fg_normal = comcolor |
||||
theme.fg_focus = comcolor |
||||
theme.fg_urgent = "#ffffff" |
||||
theme.fg_minimize = comcolor |
||||
|
||||
theme.border_width = 1 |
||||
theme.border_normal = "#000000" |
||||
theme.border_focus = "#535d6c" |
||||
theme.border_marked = "#91231c" |
||||
|
||||
-- There are other variable sets |
||||
-- overriding the default one when |
||||
-- defined, the sets are: |
||||
-- [taglist|tasklist]_[bg|fg]_[focus|urgent] |
||||
-- titlebar_[bg|fg]_[normal|focus] |
||||
-- tooltip_[font|opacity|fg_color|bg_color|border_width|border_color] |
||||
-- mouse_finder_[color|timeout|animate_timeout|radius|factor] |
||||
-- Example: |
||||
--theme.taglist_bg_focus = "#ff0000" |
||||
|
||||
-- Display the taglist squares |
||||
theme.taglist_squares_sel = "/usr/share/awesome/themes/default/taglist/squarefw.png" |
||||
theme.taglist_squares_unsel = "/usr/share/awesome/themes/default/taglist/squarew.png" |
||||
|
||||
-- Variables set for theming the menu: |
||||
-- menu_[bg|fg]_[normal|focus] |
||||
-- menu_[border_color|border_width] |
||||
theme.menu_submenu_icon = "/usr/share/awesome/themes/default/submenu.png" |
||||
theme.menu_height = 15 |
||||
theme.menu_width = 100 |
||||
|
||||
-- You can add as many variables as |
||||
-- you wish and access them by using |
||||
-- beautiful.variable in your rc.lua |
||||
--theme.bg_widget = "#cc0000" |
||||
|
||||
-- Define the image to load |
||||
theme.titlebar_close_button_normal = "/usr/share/awesome/themes/default/titlebar/close_normal.png" |
||||
theme.titlebar_close_button_focus = "/usr/share/awesome/themes/default/titlebar/close_focus.png" |
||||
|
||||
theme.titlebar_ontop_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/ontop_normal_inactive.png" |
||||
theme.titlebar_ontop_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/ontop_focus_inactive.png" |
||||
theme.titlebar_ontop_button_normal_active = "/usr/share/awesome/themes/default/titlebar/ontop_normal_active.png" |
||||
theme.titlebar_ontop_button_focus_active = "/usr/share/awesome/themes/default/titlebar/ontop_focus_active.png" |
||||
|
||||
theme.titlebar_sticky_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/sticky_normal_inactive.png" |
||||
theme.titlebar_sticky_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/sticky_focus_inactive.png" |
||||
theme.titlebar_sticky_button_normal_active = "/usr/share/awesome/themes/default/titlebar/sticky_normal_active.png" |
||||
theme.titlebar_sticky_button_focus_active = "/usr/share/awesome/themes/default/titlebar/sticky_focus_active.png" |
||||
|
||||
theme.titlebar_floating_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/floating_normal_inactive.png" |
||||
theme.titlebar_floating_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/floating_focus_inactive.png" |
||||
theme.titlebar_floating_button_normal_active = "/usr/share/awesome/themes/default/titlebar/floating_normal_active.png" |
||||
theme.titlebar_floating_button_focus_active = "/usr/share/awesome/themes/default/titlebar/floating_focus_active.png" |
||||
|
||||
theme.titlebar_maximized_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/maximized_normal_inactive.png" |
||||
theme.titlebar_maximized_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/maximized_focus_inactive.png" |
||||
theme.titlebar_maximized_button_normal_active = "/usr/share/awesome/themes/default/titlebar/maximized_normal_active.png" |
||||
theme.titlebar_maximized_button_focus_active = "/usr/share/awesome/themes/default/titlebar/maximized_focus_active.png" |
||||
|
||||
theme.wallpaper = "/usr/share/awesome/themes/default/background.png" |
||||
|
||||
-- You can use your own layout icons like this: |
||||
theme.layout_fairh = "/usr/share/awesome/themes/default/layouts/fairhw.png" |
||||
theme.layout_fairv = "/usr/share/awesome/themes/default/layouts/fairvw.png" |
||||
theme.layout_floating = "/usr/share/awesome/themes/default/layouts/floatingw.png" |
||||
theme.layout_magnifier = "/usr/share/awesome/themes/default/layouts/magnifierw.png" |
||||
theme.layout_max = "/usr/share/awesome/themes/default/layouts/maxw.png" |
||||
theme.layout_fullscreen = "/usr/share/awesome/themes/default/layouts/fullscreenw.png" |
||||
theme.layout_tilebottom = "/usr/share/awesome/themes/default/layouts/tilebottomw.png" |
||||
theme.layout_tileleft = "/usr/share/awesome/themes/default/layouts/tileleftw.png" |
||||
theme.layout_tile = "/usr/share/awesome/themes/default/layouts/tilew.png" |
||||
theme.layout_tiletop = "/usr/share/awesome/themes/default/layouts/tiletopw.png" |
||||
theme.layout_spiral = "/usr/share/awesome/themes/default/layouts/spiralw.png" |
||||
theme.layout_dwindle = "/usr/share/awesome/themes/default/layouts/dwindlew.png" |
||||
|
||||
theme.awesome_icon = "/usr/share/awesome/icons/awesome16.png" |
||||
|
||||
-- Define the icon theme for application icons. If not set then the icons |
||||
-- from /usr/share/icons and /usr/share/icons/hicolor will be used. |
||||
theme.icon_theme = nil |
||||
|
||||
return theme |
||||
end |
After Width: | Height: | Size: 666 B |
After Width: | Height: | Size: 830 B |
After Width: | Height: | Size: 598 B |
After Width: | Height: | Size: 549 B |
After Width: | Height: | Size: 814 B |
After Width: | Height: | Size: 553 B |
After Width: | Height: | Size: 1013 B |
After Width: | Height: | Size: 754 B |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 740 B |
After Width: | Height: | Size: 774 B |
After Width: | Height: | Size: 679 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 682 B |
After Width: | Height: | Size: 833 B |
After Width: | Height: | Size: 624 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 601 B |
@ -0,0 +1,29 @@ |
||||
[push] |
||||
default = simple |
||||
|
||||
[alias] |
||||
#Shows diff in log |
||||
ll = log --stat --abbrev-commit |
||||
|
||||
#Show all aliases |
||||
alias = !git config --list | grep 'alias\\.' | sed 's/alias\\.\\([^=]*\\)=\\(.*\\)/\\1\\t=> \\2/' | sort |
||||
|
||||
#Full sync of local database |
||||
sync = fetch -pv --all |
||||
|
||||
cam = commit -a -m |
||||
lug = log --color --graph --date=short --pretty=format:'%Cgreen%cd (%cr)%Creset %C(bold blue)%an%Creset %Cred%h%Creset -%C(yellow)%d%Creset %s' --abbrev-commit |
||||
purr = pull --rebase |
||||
chk = checkout |
||||
from = !git fetch origin master && git rebase -i origin/master |
||||
|
||||
# print local branches and their last commit times |
||||
blanch = for-each-ref --sort=authordate --format '%(HEAD)%(align:left,40)%(refname:short)%(end) | %(align:left,20)%(authordate:iso)%(end) | %(subject)' refs/heads |
||||
|
||||
# checkout master and delete previously checked out branch |
||||
close = !git checkout master && git branch -D @{-1} |
||||
|
||||
[color] |
||||
branch = auto |
||||
diff = auto |
||||
status = auto |
@ -0,0 +1,921 @@ |
||||
#!/bin/sh |
||||
|
||||
# git-remote-gcrypt |
||||
# |
||||
# Copyright (c) 2013 engla |
||||
# Copyright (c) 2013, 2014 Joey Hess <id@joeyh.name> |
||||
# Copyright (c) 2016 Sean Whitton <spwhitton@spwhitton.name> and contributors |
||||
# |
||||
# This program is free software: you can redistribute it and/or modify |
||||
# it under the terms of the GNU General Public License as published by |
||||
# the Free Software Foundation, either version 3 of the License, or |
||||
# (at your option) version 2 or any later version. |
||||
# |
||||
# This program is distributed in the hope that it will be useful, |
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
# GNU General Public License for more details. |
||||
# |
||||
# You should have received a copy of the GNU General Public License |
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
# |
||||
# See README.rst for usage instructions |
||||
|
||||
set -e # errexit |
||||
set -f # noglob |
||||
set -C # noclobber |
||||
|
||||
export GITCEPTION="${GITCEPTION:-}+" # Reuse $Gref except when stacked |
||||
Gref="refs/gcrypt/gitception$GITCEPTION" |
||||
Gref_rbranch="refs/heads/master" |
||||
Packkey_bytes=63 # nbr random bytes for packfile keys, any >= 256 bit is ok |
||||
Hashtype=SHA256 # SHA512 SHA384 SHA256 SHA224 supported. |
||||
Manifestfile=91bd0c092128cf2e60e1a608c31e92caf1f9c1595f83f2890ef17c0e4881aa0a |
||||
Hex40="[a-f0-9]" |
||||
Hex40=$Hex40$Hex40$Hex40$Hex40$Hex40$Hex40$Hex40$Hex40 |
||||
Hex40=$Hex40$Hex40$Hex40$Hex40$Hex40 # Match SHA-1 hexdigest |
||||
GPG="$(git config --get "gpg.program" '.+' || echo gpg)" |
||||
|
||||
Did_find_repo= # yes for connected, no for no repo |
||||
Localdir="${GIT_DIR:=.git}/remote-gcrypt" |
||||
Tempdir= |
||||
|
||||
Repoid= |
||||
Refslist= |
||||
Packlist= |
||||
Keeplist= |
||||
Extnlist= |
||||
Repack_limit=25 |
||||
|
||||
Recipients= |
||||
|
||||
# compat/utility functions |
||||
# xfeed: The most basic output function puts $1 into the stdin of $2..$# |
||||
xfeed() |
||||
{ |
||||
local input_= |
||||
input_=$1; shift |
||||
"$@" <<EOF |
||||
$input_ |
||||
EOF |
||||
} |
||||
xecho() { xfeed "$*" cat; } |
||||
xecho_n() { xecho "$@" | tr -d \\n ; } # kill newlines |
||||
echo_git() { xecho "$@" ; } # Code clarity |
||||
echo_info() { xecho "gcrypt:" "$@" >&2; } |
||||
echo_die() { echo_info "$@" ; exit 1; } |
||||
|
||||
isnull() { case "$1" in "") return 0;; *) return 1;; esac; } |
||||
isnonnull() { ! isnull "$1"; } |
||||
iseq() { case "$1" in "$2") return 0;; *) return 1;; esac; } |
||||
isnoteq() { ! iseq "$1" "$2"; } |
||||
negate() { ! "$@"; } |
||||
|
||||
# Execute $@ or die |
||||
pipefail() |
||||
{ |
||||
"$@" || { echo_info "'$1' failed!"; kill $$; exit 1; } |
||||
} |
||||
|
||||
isurl() { isnull "${2%%$1://*}"; } |
||||
islocalrepo() { isnull "${1##/*}" && [ ! -e "$1/HEAD" ]; } |
||||
|
||||
xgrep() { command grep "$@" || : ; } |
||||
|
||||
# setvar is used for named return variables |
||||
# $1 *must* be a valid variable name, $2 is any value |
||||
# |
||||
# Conventions |
||||
# return variable names are passed with a @ prefix |
||||
# return variable functions use f_ prefix local vars |
||||
# return var consumers use r_ prefix vars (or Titlecase globals) |
||||
setvar() |
||||
{ |
||||
isnull "${1##@*}" || echo_die "Missing @ for return variable: $1" |
||||
eval ${1#@}=\$2 |
||||
} |
||||
|
||||
Newline=" |
||||
" |
||||
|
||||
# $1 is return var, $2 is value appended with newline separator |
||||
append_to() |
||||
{ |
||||
local f_append_tmp_= |
||||
eval f_append_tmp_=\$${1#@} |
||||
isnull "$f_append_tmp_" || f_append_tmp_=$f_append_tmp_$Newline |
||||
setvar "$1" "$f_append_tmp_$2" |
||||
} |
||||
|
||||
# Pick words from each line |
||||
# $1 return variable name |
||||
# $2 input value |
||||
pick_fields_1_2() |
||||
{ |
||||
local f_ret= f_one= f_two= |
||||
while read f_one f_two _ # from << here-document |
||||
do |
||||
f_ret="$f_ret$f_one $f_two$Newline" |
||||
done <<EOF |
||||
$2 |
||||
EOF |
||||
setvar "$1" "${f_ret#$Newline}" |
||||
} |
||||
|
||||
# Take all lines matching $2 (full line) |
||||
# $1 return variable name |
||||
# $2 filter word |
||||
# $3 input value |
||||
# if $1 is a literal `!', the match is reversed (and arguments shift) |
||||
# we instead remove all lines matching |
||||
filter_to() |
||||
{ |
||||
local f_neg= f_line= f_ret= IFS= |
||||
isnoteq "$1" "!" || { f_neg=negate; shift; } |
||||
IFS=$Newline |
||||
for f_line in $3 |
||||
do |
||||
$f_neg isnonnull "${f_line##$2}" || f_ret=$f_ret$f_line$Newline |
||||
done |
||||
setvar "$1" "${f_ret%$Newline}" |
||||
} |
||||
|
||||
# Output the number of lines in $1 |
||||
line_count() |
||||
{ |
||||
local IFS= |
||||
IFS=$Newline |
||||
set -- $1 |
||||
xecho "$#" |
||||
} |
||||
|
||||
|
||||
## gitception part |
||||
# Fetch giturl $1, file $2 |
||||
gitception_get() |
||||
{ |
||||
# Take care to preserve FETCH_HEAD |
||||
local ret_=: obj_id= fet_head="$GIT_DIR/FETCH_HEAD" |
||||
[ -e "$fet_head" ] && command mv -f "$fet_head" "$fet_head.$$~" || : |
||||
git fetch -q -f "$1" "$Gref_rbranch:$Gref" >/dev/null && |
||||
obj_id="$(git ls-tree "$Gref" | xgrep -E '\b'"$2"'$' | awk '{print $3}')" && |
||||
isnonnull "$obj_id" && git cat-file blob "$obj_id" && ret_=: || |
||||
{ ret_=false && : ; } |
||||
[ -e "$fet_head.$$~" ] && command mv -f "$fet_head.$$~" "$fet_head" || : |
||||
$ret_ |
||||
} |
||||
|
||||
anon_commit() |
||||
{ |
||||
GIT_AUTHOR_NAME="root" GIT_AUTHOR_EMAIL="root@localhost" \ |
||||
GIT_AUTHOR_DATE="1356994801 -0400" GIT_COMMITTER_NAME="root" \ |
||||
GIT_COMMITTER_EMAIL="root@localhost" \ |
||||
GIT_COMMITTER_DATE="1356994801 -0400" \ |
||||
git commit-tree "$@" <<EOF |
||||
Initial commit |
||||
EOF |
||||
} |
||||
|
||||
# Get 'tree' from $1, change file $2 to obj id $3 |
||||
update_tree() |
||||
{ |
||||
local tab_=" " |
||||
# $2 is a filename from the repo format |
||||
(set +e; |
||||
git ls-tree "$1" | xgrep -v -E '\b'"$2"'$'; |
||||
xecho "100644 blob $3$tab_$2" |
||||
) | git mktree |
||||
} |
||||
|
||||
# Put giturl $1, file $2 |
||||
# depends on previous GET to set $Gref and depends on PUT_FINAL later |
||||
gitception_put() |
||||
{ |
||||
local obj_id= tree_id= commit_id= |
||||
obj_id=$(git hash-object -w --stdin) && |
||||
tree_id=$(update_tree "$Gref" "$2" "$obj_id") && |
||||
commit_id=$(anon_commit "$tree_id") && |
||||
git update-ref "$Gref" "$commit_id" |
||||
} |
||||
|
||||
# Remove giturl $1, file $2 |
||||
# depends on previous GET like put |
||||
gitception_remove() |
||||
{ |
||||
local tree_id= commit_id= tab_=" " |
||||
# $2 is a filename from the repo format |
||||
tree_id=$(git ls-tree "$Gref" | xgrep -v -E '\b'"$2"'$' | git mktree) && |
||||
commit_id=$(anon_commit "$tree_id") && |
||||
git update-ref "$Gref" "$commit_id" |
||||
} |
||||
|
||||
gitception_new_repo() |
||||
{ |
||||
local commit_id= empty_tree=4b825dc642cb6eb9a060e54bf8d69288fbee4904 |
||||
# get any file to update Gref, and if it's not updated we create empty |
||||
git update-ref -d "$Gref" || : |
||||
gitception_get "$1" "x" 2>/dev/null >&2 || : |
||||
git rev-parse -q --verify "$Gref" >/dev/null && return 0 || |
||||
commit_id=$(anon_commit "$empty_tree") && |
||||
git update-ref "$Gref" "$commit_id" |
||||
} |
||||
## end gitception |
||||
|
||||
# Fetch repo $1, file $2, tmpfile in $3 |
||||
GET() |
||||
{ |
||||
if isurl sftp "$1" |
||||
then |
||||
(exec 0>&-; curl -s -S -k "$1/$2") > "$3" |
||||
elif isurl rsync "$1" |
||||
then |
||||
(exec 0>&-; rsync -I -W "${1#rsync://}"/"$2" "$3" >&2) |
||||
elif islocalrepo "$1" |
||||
then |
||||
cat "$1/$2" > "$3" |
||||
else |
||||
gitception_get "${1#gitception://}" "$2" > "$3" |
||||
fi |
||||
} |
||||
|
||||
# Put repo $1, file $2 or fail, tmpfile in $3 |
||||
PUT() |
||||
{ |
||||
if isurl sftp "$1" |
||||
then |
||||
curl -s -S -k --ftp-create-dirs -T "$3" "$1/$2" |
||||
elif isurl rsync "$1" |
||||
then |
||||
rsync -I -W "$3" "${1#rsync://}"/"$2" >&2 |
||||
elif islocalrepo "$1" |
||||
then |
||||
cat >| "$1/$2" < "$3" |
||||
else |
||||
gitception_put "${1#gitception://}" "$2" < "$3" |
||||
fi |
||||
} |
||||
|
||||
# Put all PUT changes for repo $1 at once |
||||
PUT_FINAL() |
||||
{ |
||||
if isurl sftp "$1" || islocalrepo "$1" || isurl rsync "$1" |
||||
then |
||||
: |
||||
else |
||||
git push --quiet -f "${1#gitception://}" "$Gref:$Gref_rbranch" |
||||
fi |
||||
} |
||||
|
||||
# Put directory for repo $1 |
||||
PUTREPO() |
||||
{ |
||||
if isurl sftp "$1" |
||||
then |
||||
: |
||||
elif isurl rsync "$1" |
||||
then |
||||
rsync -q -r --exclude='*' "$Localdir/" "${1#rsync://}" >&2 |
||||
elif islocalrepo "$1" |
||||
then |
||||
mkdir -p "$1" |
||||
else |
||||
gitception_new_repo "${1#gitception://}" |
||||
fi |
||||
} |
||||
|
||||
# For repo $1, delete all newline-separated files in $2 |
||||
REMOVE() |
||||
{ |
||||
local fn_= |
||||
if isurl sftp "$1" |
||||
then |
||||
# FIXME |
||||
echo_info "sftp: Ignore remove request $1/$2" |
||||
elif isurl rsync "$1" |
||||
then |
||||
xfeed "$2" rsync -I -W -v -r --delete --include-from=- \ |
||||
--exclude='*' "$Localdir"/ "${1#rsync://}/" >&2 |
||||
elif islocalrepo "$1" |
||||
then |
||||
for fn_ in $2; do |
||||
rm -f "$1"/"$fn_" |
||||
done |
||||
else |
||||
for fn_ in $2; do |
||||
gitception_remove "${1#gitception://}" "$fn_" |
||||
done |
||||
fi |
||||
} |
||||
|
||||
CLEAN_FINAL() |
||||
{ |
||||
if isurl sftp "$1" || islocalrepo "$1" || isurl rsync "$1" |
||||
then |
||||
: |
||||
else |
||||
git update-ref -d "$Gref" || : |
||||
fi |
||||
} |
||||
|
||||
ENCRYPT() |
||||
{ |
||||
rungpg --batch --force-mdc --compress-algo none --trust-model=always --passphrase-fd 3 -c 3<<EOF |
||||
$1 |
||||
EOF |
||||
} |
||||
|
||||
DECRYPT() |
||||
{ |
||||
rungpg -q --batch --no-default-keyring --secret-keyring /dev/null \ |
||||
--keyring /dev/null --passphrase-fd 3 -d 3<<EOF |
||||
$1 |
||||
EOF |
||||
} |
||||
|
||||
# Encrypt to recipients $1 |
||||
PRIVENCRYPT() |
||||
{ |
||||
set -- $1 |
||||
if isnonnull "$Conf_signkey"; then |
||||
set -- "$@" -u "$Conf_signkey" |
||||
fi |
||||
rungpg --compress-algo none --trust-model=always -se "$@" |
||||
} |
||||
|
||||
# $1 is the match for good signature, $2 is the textual signers list |
||||
PRIVDECRYPT() |
||||
{ |
||||
local status_= |
||||
exec 4>&1 && |
||||
status_=$(rungpg --status-fd 3 -q -d 3>&1 1>&4) && |
||||
xfeed "$status_" grep "^\[GNUPG:\] ENC_TO " >/dev/null && |
||||
(xfeed "$status_" grep -e "$1" >/dev/null || { |
||||
echo_info "Failed to verify manifest signature!" && |
||||
echo_info "Only accepting signatories: ${2:-(none)}" && |
||||
return 1 |
||||
}) |
||||
} |
||||
|
||||
# Generate $1 random bytes |
||||
genkey() |
||||
{ |
||||
rungpg --armor --gen-rand 1 "$1" |
||||
} |
||||
|
||||
gpg_hash() |
||||
{ |
||||
local hash_= |
||||
hash_=$(rungpg --with-colons --print-md "$1" | tr A-F a-f) |
||||
hash_=${hash_#:*:} |
||||
xecho "${hash_%:}" |
||||
} |
||||
|
||||
rungpg() |
||||
{ |
||||
if isnonnull "$Conf_gpg_args"; then |
||||
set -- "$Conf_gpg_args" "$@" |
||||
fi |
||||
# gpg will fail to run when there is no controlling tty, |
||||
# due to trying to print messages to it, even if a gpg agent is set |
||||
# up. --no-tty fixes this. |
||||
if [ "x$GPG_AGENT_INFO" != "x" ]; then |
||||
${GPG} --no-tty $@ |
||||
else |
||||
${GPG} $@ |
||||
fi |
||||
} |
||||
|
||||
# Pass the branch/ref by pipe to git |
||||
safe_git_rev_parse() |
||||
{ |
||||
git cat-file --batch-check 2>/dev/null | |
||||
xgrep -v "missing" | cut -f 1 -d ' ' |
||||
} |
||||
|
||||
make_new_repo() |
||||
{ |
||||
echo_info "Setting up new repository" |
||||
PUTREPO "$URL" |
||||
|
||||
# Needed assumption: the same user should have no duplicate Repoid |
||||
Repoid=":id:$(genkey 15)" |
||||
iseq "${NAME#gcrypt::}" "$URL" || |
||||
git config "remote.$NAME.gcrypt-id" "$Repoid" |
||||
echo_info "Remote ID is $Repoid" |
||||
Extnlist="extn comment" |
||||
} |
||||
|
||||
|
||||
# $1 return var for goodsig match, $2 return var for signers text |
||||
read_config() |
||||
{ |
||||
local recp_= r_tail= r_keyinfo= r_keyfpr= gpg_list= cap_= conf_part= good_sig= signers_= |
||||
Conf_signkey=$(git config --get "remote.$NAME.gcrypt-signingkey" '.+' || |
||||
git config --path user.signingkey || :) |
||||
conf_part=$(git config --get "remote.$NAME.gcrypt-participants" '.+' || |
||||
git config --get gcrypt.participants '.+' || :) |
||||
Conf_pubish_participants=$(git config --get --bool "remote.$NAME.gcrypt-publish-participants" '.+' || |
||||
git config --get --bool gcrypt.publish-participants || :) |
||||
Conf_gpg_args=$(git config --get gcrypt.gpg-args '.+' || :) |
||||
|
||||
# Figure out which keys we should encrypt to or accept signatures from |
||||
if isnull "$conf_part" || iseq "$conf_part" simple |
||||
then |
||||
signers_="(default keyring)" |
||||
Recipients="--throw-keyids --default-recipient-self" |
||||
good_sig="^\[GNUPG:\] GOODSIG " |
||||
setvar "$1" "$good_sig" |
||||
setvar "$2" "$signers_" |
||||
return 0 |
||||
fi |
||||
|
||||
for recp_ in $conf_part |
||||
do |
||||
gpg_list=$(rungpg --with-colons --fingerprint -k "$recp_") |
||||
r_tail_=$(echo "$recp_" | sed -e 's/^0x//') |
||||
filter_to @r_keyinfo "pub*" "$gpg_list" |
||||
if echo "$recp_" | grep -E -q '^[xA-F0-9]+$'; then # is $recp_ a keyid? |
||||
filter_to @r_keyfpr "fpr*$r_tail_*" "$gpg_list" |
||||
else |
||||
filter_to @r_keyfpr "fpr*" "$gpg_list" |
||||
fi |
||||
isnull "$r_keyinfo" || isnonnull "${r_keyinfo##*"$Newline"*}" || |
||||
echo_info "WARNING: '$recp_' matches multiple keys, using one" |
||||
isnull "$r_keyfpr" || isnonnull "${r_keyfpr##*"$Newline"*}" || |
||||
echo_info "WARNING: '$recp_' matches multiple fingerprints, using one" |
||||
r_keyinfo=${r_keyinfo%%"$Newline"*} |
||||
r_keyfpr=${r_keyfpr%%"$Newline"*} |
||||
keyid_=$(xfeed "$r_keyinfo" cut -f 5 -d :) |
||||
fprid_=$(xfeed "$r_keyfpr" cut -f 10 -d :) |
||||
|
||||
isnonnull "$fprid_" && |
||||
signers_="$signers_ $keyid_" && |
||||
append_to @good_sig "^\[GNUPG:\] VALIDSIG .*$fprid_$" || { |
||||
echo_info "WARNING: Skipping missing key $recp_" |
||||
continue |
||||
} |
||||
# Check 'E'ncrypt capability |
||||
cap_=$(xfeed "$r_keyinfo" cut -f 12 -d :) |
||||
if ! iseq "${cap_#*E}" "$cap_"; then |
||||
if [ "$Conf_pubish_participants" = true ]; then |
||||
Recipients="$Recipients -r $keyid_" |
||||
else |
||||
Recipients="$Recipients -R $keyid_" |
||||
fi |
||||
fi |
||||
done |
||||
|
||||
if isnull "$Recipients" |
||||
then |
||||
echo_info "You have not configured any keys you can encrypt to" \ |
||||
"for this repository" |
||||
echo_info "Use ::" |
||||
echo_info " git config gcrypt.participants YOURKEYID" |
||||
exit 1 |
||||
fi |
||||
setvar "$1" "$good_sig" |
||||
setvar "$2" "$signers_" |
||||
} |
||||
|
||||
ensure_connected() |
||||
{ |
||||
local manifest_= r_repoid= r_name= url_frag= r_sigmatch= r_signers= \ |
||||
tmp_manifest= |
||||
|
||||
if isnonnull "$Did_find_repo" |
||||
then |
||||
return |
||||
fi |
||||
Did_find_repo=no |
||||
read_config @r_sigmatch @r_signers |
||||
|
||||
iseq "${NAME#gcrypt::}" "$URL" || r_name=$NAME |
||||
|
||||
if isurl gitception "$URL" && isnonnull "$r_name"; then |
||||
git config "remote.$r_name.url" "gcrypt::${URL#gitception://}" |
||||
echo_info "Updated URL for $r_name, gitception:// -> ()" |
||||
fi |
||||
|
||||
# Find the URL fragment |
||||
url_frag=${URL##*"#"} |
||||
isnoteq "$url_frag" "$URL" || url_frag= |
||||
URL=${URL%"#$url_frag"} |
||||
|
||||
# manifestfile -- sha224 hash if we can, else the default location |
||||
if isurl sftp "$URL" || islocalrepo "$URL" || isurl rsync "$URL" |
||||
then |
||||
# not for gitception |
||||
isnull "$url_frag" || |
||||
Manifestfile=$(xecho_n "$url_frag" | gpg_hash SHA224) |
||||
else |
||||
isnull "$url_frag" || Gref_rbranch="refs/heads/$url_frag" |
||||
fi |
||||
|
||||
Repoid= |
||||
isnull "$r_name" || |
||||
Repoid=$(git config "remote.$r_name.gcrypt-id" || :) |
||||
|
||||
|
||||
tmp_manifest="$Tempdir/maniF" |
||||
GET "$URL" "$Manifestfile" "$tmp_manifest" 2>/dev/null || { |
||||
echo_info "Repository not found: $URL" |
||||
if ! isnull "$Repoid"; then |
||||
echo_info "..but repository ID is set. Aborting." |
||||
return 1 |
||||
else |
||||
return 0 |
||||
fi |
||||
} |
||||
|
||||
Did_find_repo=yes |
||||
echo_info "Decrypting manifest" |
||||
manifest_=$(PRIVDECRYPT "$r_sigmatch" "$r_signers" < "$tmp_manifest") && |
||||
isnonnull "$manifest_" || |
||||
echo_die "Failed to decrypt manifest!" |
||||
rm -f "$tmp_manifest" |
||||
|
||||
filter_to @Refslist "$Hex40 *" "$manifest_" |
||||
filter_to @Packlist "pack :*:* *" "$manifest_" |
||||
filter_to @Keeplist "keep :*:*" "$manifest_" |
||||
filter_to @Extnlist "extn *" "$manifest_" |
||||
filter_to @r_repoid "repo *" "$manifest_" |
||||
|
||||
r_repoid=${r_repoid#repo } |
||||
r_repoid=${r_repoid% *} |
||||
if isnull "$Repoid" |
||||
then |
||||
echo_info "Remote ID is $r_repoid" |
||||
Repoid=$r_repoid |
||||
elif isnoteq "$r_repoid" "$Repoid" |
||||
then |
||||
echo_info "WARNING:" |
||||
echo_info "WARNING: Remote ID has changed!" |
||||
echo_info "WARNING: from $Repoid" |
||||
echo_info "WARNING: to $r_repoid" |
||||
echo_info "WARNING:" |
||||
Repoid=$r_repoid |
||||
else |
||||
return 0 |
||||
fi |
||||
|
||||
isnull "$r_name" || git config "remote.$r_name.gcrypt-id" "$r_repoid" |
||||
} |
||||
|
||||
# $1 is the hash type (SHA256 etc) |
||||
# $2 the pack id |
||||
# $3 the key |
||||
get_verify_decrypt_pack() |
||||
{ |
||||
local rcv_id= tmp_encrypted= |
||||
tmp_encrypted="$Tempdir/packF" |
||||
GET "$URL" "$2" "$tmp_encrypted" && |
||||
rcv_id=$(gpg_hash "$1" < "$tmp_encrypted") && |
||||
iseq "$rcv_id" "$2" || echo_die "Packfile $2 does not match digest!" |
||||
DECRYPT "$3" < "$tmp_encrypted" |
||||
rm -f "$tmp_encrypted" |
||||
} |
||||
|
||||
# download all packlines (pack :SHA256:a32abc1231) from stdin (or die) |
||||
# $1 destdir (when repack, else "") |
||||
get_pack_files() |
||||
{ |
||||
local pack_id= r_pack_key_line= htype_= pack_= key_= |
||||
while IFS=': ' read -r _ htype_ pack_ # <<here-document |
||||
do |
||||
isnonnull "$pack_" || continue |
||||
|
||||
# Get the Packlist line with the key |
||||
pack_id=":${htype_}:$pack_" |
||||
filter_to @r_pack_key_line "pack $pack_id *" "$Packlist" |
||||
key_=${r_pack_key_line#pack $pack_id } |
||||
|
||||
if isnonnull "${pack_##$Hex40*}" || |
||||
isnoteq "$htype_" SHA256 && isnoteq "$htype_" SHA224 && |
||||
isnoteq "$htype_" SHA384 && isnoteq "$htype_" SHA512 |
||||
then |
||||
echo_die "Packline malformed: $pack_id" |
||||
fi |
||||
|
||||
get_verify_decrypt_pack "$htype_" "$pack_" "$key_" | \ |
||||
if isnull "${1:-}" |
||||
then |
||||
# add to local pack list |
||||
git index-pack -v --stdin >/dev/null |
||||
xecho "pack $pack_id" >> "$Localdir/have_packs$GITCEPTION" |
||||
else |
||||
git index-pack -v --stdin "$1/${pack_}.pack" >/dev/null |
||||
fi |
||||
done |
||||
} |
||||
|
||||
# Download and unpack remote packfiles |
||||
# $1 return var for list of packfiles to delete |
||||
repack_if_needed() |
||||
{ |
||||
local n_= m_= kline_= r_line= r_keep_packlist= r_del_list= |
||||
|
||||
isnonnull "$Packlist" || return 0 |
||||
|
||||
if isnonnull "${GCRYPT_FULL_REPACK:-}" |
||||
then |
||||
Keeplist= |
||||
Repack_limit=0 |
||||
fi |
||||
|
||||
pick_fields_1_2 @r_del_list "$Packlist" |
||||
|
||||
n_=$(line_count "$Packlist") |
||||
m_=$(line_count "$Keeplist") |
||||
if iseq 0 "$(( $Repack_limit < ($n_ - $m_) ))"; then |
||||
return |
||||
fi |
||||
echo_info "Repacking remote $NAME, ..." |
||||
|
||||
mkdir "$Tempdir/pack" |
||||
|
||||
# Split packages to keep and to repack |
||||
if isnonnull "$Keeplist"; then |
||||
while read -r _ kline_ _ # <<here-document |
||||
do |
||||
isnonnull "$kline_" || continue |
||||
filter_to @r_line "pack $kline_ *" "$Packlist" |
||||
append_to @r_keep_packlist "$r_line" |
||||
filter_to ! @r_del_list "pack $kline_" "$r_del_list" |
||||
done <<EOF |
||||
$Keeplist |
||||
EOF |
||||
fi |
||||
|
||||
xfeed "$r_del_list" get_pack_files "$Tempdir/pack/" |
||||
|
||||
(set +f; pipefail git verify-pack -v "$Tempdir"/pack/*.idx) | |
||||
grep -E '^[0-9a-f]{40}' | cut -f 1 -d ' ' |
||||
|
||||
Packlist=$r_keep_packlist |
||||
setvar "$1" "$r_del_list" |
||||
} |
||||
|
||||
do_capabilities() |
||||
{ |
||||
echo_git fetch |
||||
echo_git push |
||||
echo_git |
||||
} |
||||
|
||||
do_list() |
||||
{ |
||||
local obj_id= ref_name= line_= |
||||
ensure_connected |
||||
|
||||
xecho "$Refslist" | while read line_ |
||||
do |
||||
isnonnull "$line_" || break |
||||
obj_id=${line_%% *} |
||||
ref_name=${line_##* } |
||||
echo_git "$obj_id" "$ref_name" |
||||
if iseq "$ref_name" "refs/heads/master" |
||||
then |
||||
echo_git "@refs/heads/master HEAD" |
||||
fi |
||||
done |
||||
|
||||
# end with blank line |
||||
echo_git |
||||
} |
||||
|
||||
do_fetch() |
||||
{ |
||||
# Download packs in the manifest that don't appear in have_packs |
||||
local pneed_= premote_= |
||||
|
||||
ensure_connected |
||||
|
||||
# The `+` for $GITCEPTION is pointless but we will be safe for stacking |
||||
pick_fields_1_2 @premote_ "$Packlist" |
||||
if [ -s "$Localdir/have_packs+" ] |
||||
then |
||||
pneed_=$(xfeed "$premote_" xgrep -v -x -f "$Localdir/have_packs+") |
||||
else |
||||
pneed_=$premote_ |
||||
fi |
||||
|
||||
xfeed "$pneed_" get_pack_files |
||||
|
||||
echo_git # end with blank line |
||||
} |
||||
|
||||
# do_push PUSHARGS (multiple lines like +src:dst, with both + and src opt.) |
||||
do_push() |
||||
{ |
||||
# Security protocol: |
||||
# Each git packfile is encrypted and then named for the encrypted |
||||
# file's hash. The manifest is updated with the pack id. |
||||
# The manifest is encrypted. |
||||
local r_revlist= pack_id= key_= obj_= src_= dst_= \ |
||||
r_pack_delete= tmp_encrypted= tmp_objlist= tmp_manifest= |
||||
|
||||
ensure_connected |
||||
|
||||
if iseq "$Did_find_repo" "no" |
||||
then |
||||
make_new_repo |
||||
fi |
||||
|
||||
if isnonnull "$Refslist" |
||||
then |
||||
# mark all remote refs with ^<sha-1> (if sha-1 exists locally) |
||||
r_revlist=$(xfeed "$Refslist" cut -f 1 -d ' ' | |
||||
safe_git_rev_parse | sed -e 's/^\(.\)/^&/') |
||||
fi |
||||
|
||||
while IFS=: read -r src_ dst_ # << +src:dst |
||||
do |
||||
src_=${src_#+} |
||||
filter_to ! @Refslist "$Hex40 $dst_" "$Refslist" |
||||
|
||||
if isnonnull "$src_" |
||||
then |
||||
append_to @r_revlist "$src_" |
||||
obj_=$(xfeed "$src_" safe_git_rev_parse) |
||||
append_to @Refslist "$obj_ $dst_" |
||||
fi |
||||
done <<EOF |
||||
$1 |
||||
EOF |
||||
|
||||
tmp_encrypted="$Tempdir/packP" |
||||
tmp_objlist="$Tempdir/objlP" |
||||
|
||||
{ |
||||
xfeed "$r_revlist" git rev-list --objects --stdin -- |
||||
repack_if_needed @r_pack_delete |
||||
} > "$tmp_objlist" |
||||
|
||||
# Only send pack if we have any objects to send |
||||
if [ -s "$tmp_objlist" ] |
||||
then |
||||
key_=$(genkey "$Packkey_bytes") |
||||
pack_id=$(export GIT_ALTERNATE_OBJECT_DIRECTORIES=$Tempdir; |
||||
pipefail git pack-objects --stdout < "$tmp_objlist" | |
||||
pipefail ENCRYPT "$key_" | |
||||
tee "$tmp_encrypted" | gpg_hash "$Hashtype") |
||||
|
||||
append_to @Packlist "pack :${Hashtype}:$pack_id $key_" |
||||
if isnonnull "$r_pack_delete" |
||||
then |
||||
append_to @Keeplist "keep :${Hashtype}:$pack_id 1" |
||||
fi |
||||
fi |
||||
|
||||
# Generate manifest |
||||
echo_info "Encrypting to: $Recipients" |
||||
echo_info "Requesting manifest signature" |
||||
|
||||
tmp_manifest="$Tempdir/maniP" |
||||
PRIVENCRYPT "$Recipients" > "$tmp_manifest" <<EOF |
||||
$Refslist |
||||
$Packlist |
||||
$Keeplist |
||||
repo $Repoid |
||||
$Extnlist |
||||
EOF |
||||
|
||||
# Upload pack |
||||
if [ -s "$tmp_objlist" ] |
||||
then |
||||
PUT "$URL" "$pack_id" "$tmp_encrypted" |
||||
fi |
||||
|
||||
# Upload manifest |
||||
PUT "$URL" "$Manifestfile" "$tmp_manifest" |
||||
|
||||
rm -f "$tmp_encrypted" |
||||
rm -f "$tmp_objlist" |
||||
rm -f "$tmp_manifest" |
||||
|
||||
# Delete packs |
||||
if isnonnull "$r_pack_delete"; then |
||||
REMOVE "$URL" "$(xecho "$r_pack_delete" | \ |
||||
while IFS=': ' read -r _ _ pack_ |
||||
do |
||||
isnonnull "$pack_" || continue |
||||
xecho "$pack_" |
||||
done)" |
||||
fi |
||||
|
||||
PUT_FINAL "$URL" |
||||
|
||||
# ok all updates |
||||
while IFS=: read -r src_ dst_ # << +src:dst |
||||
do |
||||
echo_git "ok $dst_" |
||||
done <<EOF |
||||
$1 |
||||
EOF |
||||
|
||||
echo_git |
||||
} |
||||
|
||||
cleanup_tmpfiles() |
||||
{ |
||||
if isnonnull "${Tempdir%%*."$$"}"; then |
||||
echo_die "Unexpected Tempdir value: $Tempdir" |
||||
fi |
||||
rm -r -f -- "${Tempdir}" >&2 |
||||
} |
||||
|
||||
setup() |
||||
{ |
||||
mkdir -p "$Localdir" |
||||
|
||||
# Set up a subdirectory in /tmp |
||||
temp_key=$(genkey 9 | tr '/' _) |
||||
Tempdir="${TMPDIR:-/tmp}/git-remote-gcrypt-${temp_key}.$$" |
||||
case "${MSYSTEM:-unknown}" in |
||||
MSYS*|MINGW*) |
||||
mkdir "${Tempdir}" |
||||
echo_info "Warning: Not securing tempdir ${Tempdir} because we are on mingw/msys" |
||||
;; |
||||
unknown|*) |
||||
mkdir -m 700 "${Tempdir}" |
||||
;; |
||||
esac |
||||
|
||||
trap cleanup_tmpfiles EXIT |
||||
trap 'exit 1' 1 2 3 15 |
||||
} |
||||
|
||||
# handle git-remote-helpers protocol |
||||
gcrypt_main_loop() |
||||
{ |
||||
local input_= input_inner= r_args= temp_key= |
||||
|
||||
NAME=$1 # Remote name |
||||
URL=$2 # Remote URL |
||||
|
||||
setup |
||||
|
||||
while read input_ |
||||
do |
||||
case "$input_" in |
||||
capabilities) |
||||
do_capabilities |
||||
;; |
||||
list|list\ for-push) |
||||
do_list |
||||
;; |
||||
fetch\ *) |
||||
r_args=${input_##fetch } |
||||
while read input_inner |
||||
do |
||||
case "$input_inner" in |
||||
fetch*) |
||||
r_args= #ignored |
||||
;; |
||||
*) |
||||
break |
||||
;; |
||||
esac |
||||
done |
||||
do_fetch "$r_args" |
||||
;; |
||||
push\ *) |
||||
r_args=${input_##push } |
||||
while read input_inner |
||||
do |
||||
case "$input_inner" in |
||||
push\ *) |
||||
append_to @r_args "${input_inner#push }" |
||||
;; |
||||
*) |
||||
break |
||||
;; |
||||
esac |
||||
done |
||||
do_push "$r_args" |
||||
;; |
||||
?*) |
||||
echo_die "Unknown input!" |
||||
;; |
||||
*) |
||||
CLEAN_FINAL "$URL" |
||||
exit 0 |
||||
;; |
||||
esac |
||||
done |
||||
} |
||||
|
||||
if [ "x$1" = x--check ] |
||||
then |
||||
NAME=dummy-gcrypt-check |
||||
URL=$2 |
||||
setup |
||||
ensure_connected |
||||
git remote remove $NAME 2>/dev/null || true |
||||
if iseq "$Did_find_repo" "no" |
||||
then |
||||
exit 100 |
||||
fi |
||||
else |
||||
gcrypt_main_loop "$@" |
||||
fi |
@ -0,0 +1,5 @@ |
||||
#!/bin/sh |
||||
cd "$(mktemp -d)"; |
||||
go mod init local-playground; |
||||
echo -e 'package main\n\nimport (\n\t"fmt"\n)\n\nfunc main() {\n\tfmt.Println("aloha")\n}\n' > main.go; |
||||
$EDITOR main.go; |
@ -0,0 +1,3 @@ |
||||
#!/usr/bin/env bash |
||||
|
||||
/usr/bin/sshfs -oTCPKeepAlive=yes -oServerAliveCountMax=1 -oServerAliveInterval=5 $@ |
@ -0,0 +1,130 @@ |
||||
{ |
||||
|
||||
pkgsSrc ? ./pkgs.nix |
||||
|
||||
}: rec { |
||||
|
||||
pkgs = (import pkgsSrc) {}; |
||||
|
||||
gitConfig = pkgs.writeTextDir "git/config" |
||||
(builtins.readFile ./base/gitconfig); |
||||
|
||||
git = pkgs.writeScriptBin "git" '' |
||||
#!${pkgs.bash}/bin/bash |
||||
export XDG_CONFIG_HOME=${gitConfig} |
||||
exec ${pkgs.git}/bin/git "$@" |
||||
''; |
||||
|
||||
zsh = ((import ./zsh) { inherit pkgs; }).zsh; |
||||
|
||||
loadout = pkgs.buildEnv { |
||||
name = "loadout"; |
||||
paths = [ |
||||
|
||||
pkgs.gnugrep |
||||
pkgs.ag |
||||
pkgs.gawk |
||||
|
||||
git |
||||
pkgs.mercurial |
||||
pkgs.breezy # bzr |
||||
|
||||
pkgs.gcc |
||||
pkgs.gnumake |
||||
pkgs.cmake |
||||
pkgs.strace |
||||
|
||||
pkgs.curl |
||||
pkgs.wget |
||||
pkgs.rsync |
||||
|
||||
pkgs.hostname |
||||
pkgs.netcat |
||||
pkgs.nmap |
||||
pkgs.dnsutils |
||||
pkgs.openssh |
||||
|
||||
pkgs.tmux |
||||
|
||||
pkgs.ncdu |
||||
pkgs.htop |
||||
|
||||
pkgs.unzip |
||||
pkgs.unrar |
||||
pkgs.gzip |
||||
|
||||
pkgs.jq |
||||
pkgs.yq |
||||
pkgs.go |
||||
|
||||
pkgs.xsel |
||||
pkgs.pavucontrol |
||||
|
||||
(pkgs.nerdfonts.override { fonts = [ "SourceCodePro" ]; }) |
||||
|
||||
((import ./nvim) { inherit pkgs; }).nvim |
||||
zsh |
||||
((import ./alacritty) { inherit pkgs zsh; }).alacritty |
||||
((import ./awesome) { inherit pkgs; }).awesome |
||||
]; |
||||
}; |
||||
|
||||
appimageEntrypoint = pkgs.writeScriptBin "mediocre-loadout" '' |
||||
#!${pkgs.bash}/bin/bash |
||||
|
||||
cmd="$1"; shift; |
||||
|
||||
if [ "$cmd" = "editor" ]; then exec nvim "$@"; fi |
||||
if [ "$cmd" = "shell" ]; then exec zsh "$@"; fi |
||||
if [ "$cmd" = "gui" ]; then exec alacritty "$@"; fi |
||||
if [ "$cmd" = "wm" ]; then exec awesome "$@"; fi |
||||
|
||||
echo "USAGE: $0 [editor|shell|gui|wm] [passthrough args...]" |
||||
exit 1 |
||||
''; |
||||
|
||||
appimageIcon = pkgs.stdenv.mkDerivation { |
||||
name = "mediocre-loadout-icon"; |
||||
src = ./bonzi.png; |
||||
builder = builtins.toFile "builder.sh" '' |
||||
source $stdenv/setup |
||||
dir=share/icons/hicolor/256x256/apps |
||||
mkdir -p "$out"/$dir |
||||
cp $src "$out"/$dir/mediocre-loadout.png |
||||
''; |
||||
}; |
||||
|
||||
appimageDesktopFile = pkgs.writeTextDir "share/applications/mediocre-loadout.desktop" '' |
||||
[Desktop Entry] |
||||
Name=Mediocre Loadout |
||||
Exec=mediocre-loadout gui |
||||
Icon=mediocre-loadout |
||||
Type=Application |
||||
Categories=Utility; |
||||
''; |
||||
|
||||
appimageTarget = pkgs.buildEnv { |
||||
name = "mediocre-loadout-target"; |
||||
paths = [ |
||||
loadout |
||||
appimageEntrypoint |
||||
appimageIcon |
||||
appimageDesktopFile |
||||
]; |
||||
}; |
||||
|
||||
appimageTargetFlat = pkgs.stdenv.mkDerivation { |
||||
name = "mediocre-loadout-target-flat"; |
||||
src = appimageTarget; |
||||
builder = builtins.toFile "builder.sh" '' |
||||
source $stdenv/setup |
||||
cp -rL "$src" "$out" |
||||
''; |
||||
}; |
||||
|
||||
appimage = ((import ./appimage.nix) { pkgsSrc = pkgsSrc; }) { |
||||
name = "mediocre-loadout"; |
||||
target = appimageTargetFlat; |
||||
}; |
||||
|
||||
} |
@ -0,0 +1,94 @@ |
||||
{ |
||||
|
||||
pkgs ? (import ../pkgs.nix) {}, |
||||
|
||||
}: rec { |
||||
|
||||
goimports = pkgs.buildGoModule rec { |
||||
pname = "goimports"; |
||||
version = "v0.1.7"; |
||||
src = builtins.fetchGit { |
||||
url = "https://go.googlesource.com/tools"; |
||||
rev = "0df0ca0f43117120bd7cc900ebf765f9b799438a"; |
||||
}; |
||||
vendorSha256 = "1vs4vbl3kh8lbqrm4yqqn27ammlqj7jdbi0ca9s4fkja2sk45ibi"; |
||||
subPackages = [ "cmd/goimports" ]; |
||||
}; |
||||
|
||||
# the gocode-gomod which comes with nixpkgs places the binary at |
||||
# gocode-gomod, we gotta rename it |
||||
gocode = pkgs.stdenv.mkDerivation { |
||||
name = "gocode"; |
||||
src = pkgs.gocode-gomod; |
||||
builder = builtins.toFile "builder.sh" '' |
||||
source $stdenv/setup |
||||
mkdir -p "$out"/bin/ |
||||
cp "$src"/bin/gocode-gomod "$out"/bin/gocode |
||||
''; |
||||
}; |
||||
|
||||
env = pkgs.buildEnv { |
||||
name = "nvim-env"; |
||||
paths = [ |
||||
pkgs.vimPlugins.vim-plug |
||||
pkgs.vimPlugins.deoplete-nvim |
||||
pkgs.vimPlugins.deoplete-go |
||||
pkgs.vimPlugins.nerdtree |
||||
pkgs.vimPlugins.nerdtree-git-plugin |
||||
pkgs.vimPlugins.vim-gitgutter |
||||
pkgs.vimPlugins.neomake |
||||
pkgs.vimPlugins.papercolor-theme |
||||
pkgs.vimPlugins.vim-go |
||||
pkgs.vimPlugins.vim-nix |
||||
|
||||
pkgs.golangci-lint |
||||
pkgs.gopls |
||||
gocode |
||||
goimports |
||||
]; |
||||
}; |
||||
|
||||
envPlugins = "${env}/share/vim-plugins"; |
||||
|
||||
init = pkgs.writeText "nvim-init" '' |
||||
source ${envPlugins}/vim-plug/plug.vim |
||||
|
||||
call plug#begin('${envPlugins}') |
||||
Plug '${envPlugins}/deoplete-nvim' |
||||
Plug '${envPlugins}/deoplete-go', { 'for': 'go' } |
||||
Plug '${envPlugins}/nerdtree', { 'on': 'NERDTreeToggle' } |
||||
Plug '${envPlugins}/nerdtree-git-plugin' |
||||
Plug '${envPlugins}/vim-gitgutter' |
||||
Plug '${envPlugins}/neomake' |
||||
Plug '${envPlugins}/papercolor-theme' |
||||
Plug '${envPlugins}/vim-go', { 'for': 'go' } |
||||
Plug '${envPlugins}/vim-nix', { 'for': 'nix' } |
||||
call plug#end() |
||||
|
||||
source ${./init.vim} |
||||
''; |
||||
|
||||
nvimRaw = pkgs.writeScriptBin "nvim" '' |
||||
#!${pkgs.bash}/bin/bash |
||||
export PATH=${env}/bin:$PATH |
||||
exec ${pkgs.neovim}/bin/nvim -u ${init} "$@" |
||||
''; |
||||
|
||||
rplugin = pkgs.stdenv.mkDerivation { |
||||
name = "nvim-rplugin"; |
||||
buildInputs = [ pkgs.git nvimRaw ]; |
||||
builder = builtins.toFile "builder.sh" '' |
||||
source $stdenv/setup |
||||
mkdir -p "$out"/ |
||||
export NVIM_RPLUGIN_MANIFEST="$out"/rplugin.vim |
||||
nvim -c ':UpdateRemotePlugins' -c ':exit' >/dev/null |
||||
''; |
||||
}; |
||||
|
||||
nvim = pkgs.writeScriptBin "nvim" '' |
||||
#!${pkgs.bash}/bin/bash |
||||
export NVIM_RPLUGIN_MANIFEST=${rplugin}/rplugin.vim |
||||
exec ${nvimRaw}/bin/nvim "$@" |
||||
''; |
||||
|
||||
} |
@ -0,0 +1,170 @@ |
||||
" PaperColor ############################################################### |
||||
|
||||
set background=light |
||||
colorscheme PaperColor |
||||
|
||||
" Deoplete ################################################################# |
||||
let g:deoplete#enable_at_startup = 1 |
||||
" use tab to cycle |
||||
inoremap <expr><tab> pumvisible() ? "\<c-n>" : "\<tab>" |
||||
" close preview when leaving insert |
||||
autocmd InsertLeave,CompleteDone * if pumvisible() == 0 | pclose | endif |
||||
|
||||
" NERDTree ################################################################# |
||||
let NERDTreeMouseMode=3 |
||||
let NERDTreeMinimalUI=1 |
||||
let NERDTreeAutoDeleteBuffer=1 |
||||
let NERDTreeHighlightCursorline=1 |
||||
let NERDTreeShowHidden=1 |
||||
let g:NERDTreeIndicatorMapCustom = { |
||||
\ "Modified" : "Δ", |
||||
\ "Staged" : "✚", |
||||
\ "Untracked" : "✭", |
||||
\ "Renamed" : "➜", |
||||
\ "Unmerged" : "☢", |
||||
\ "Deleted" : "-", |
||||
\ "Dirty" : "Δ", |
||||
\ "Clean" : "", |
||||
\ "Unknown" : "" |
||||
\ } |
||||
|
||||
map <C-n> :NERDTreeToggle<CR> |
||||
" always enter term buffer in insert mode |
||||
autocmd BufEnter * if &buftype == 'terminal' | :startinsert | endif |
||||
|
||||
" vim-go ################################################################### |
||||
" |
||||
"use goimports for formatting instead of gofmt |
||||
let g:go_fmt_command = "goimports" |
||||
|
||||
" neomake ################################################################## |
||||
autocmd! BufWritePost * Neomake |
||||
"let g:neomake_verbose=3 |
||||
"let g:neomake_logfile='/tmp/neomake.log' |
||||
|
||||
" the sidebar sign placement wasn't playing nice with gitgutter, so use the |
||||
" location list instead. But location list is kinda dumb cause it pops open |
||||
" multiple times and at weird times, sooo.... fuck it |
||||
"let g:neomake_open_list=2 |
||||
let g:neomake_open_list=0 |
||||
let g:neomake_place_signs=0 |
||||
|
||||
let g:neomake_go_enabled_makers = ['go', 'golangcilint'] |
||||
let g:neomake_go_golangcilint_maker = { |
||||
\ 'exe': 'golangci-lint', |
||||
\ 'args': [ |
||||
\ 'run', |
||||
\ '--no-config', |
||||
\ '--out-format=line-number', |
||||
\ '--print-issued-lines=false', |
||||
\ '-E=durationcheck', |
||||
\ '-E=errorlint', |
||||
\ '-E=exportloopref', |
||||
\ '-E=forbidigo', |
||||
\ '-E=gochecknoinits', |
||||
\ '-E=godot', |
||||
\ '-E=goimports', |
||||
\ '-E=misspell', |
||||
\ '-E=revive', |
||||
\ '-E=unconvert', |
||||
\ '-E=unparam', |
||||
\ '.' |
||||
\ ], |
||||
\ 'output_stream': 'stdout', |
||||
\ 'append_file': 0, |
||||
\ 'cwd': '%:h', |
||||
\ 'errorformat': |
||||
\ '%f:%l:%c: %m,' . |
||||
\ '%f:%l: %m' |
||||
\ } |
||||
|
||||
let g:neomake_markdown_enabled_makers = ['misspell'] |
||||
let g:neomake_markdown_misspell_maker = { |
||||
\ 'errorformat': '%f:%l:%c:%m', |
||||
\ } |
||||
|
||||
" mine ##################################################################### |
||||
|
||||
"Makes current line/column highlighted, and set text width |
||||
set tw=80 |
||||
set colorcolumn=+1 |
||||
"autocmd bufenter * set cursorline cursorcolumn colorcolumn=+1 |
||||
"autocmd bufleave * set nocursorline nocursorcolumn colorcolumn=0 |
||||
hi ColorColumn ctermfg=none ctermbg=grey cterm=none |
||||
"hi CursorLine ctermfg=none ctermbg=lightgrey cterm=none |
||||
"hi CursorColumn ctermfg=none ctermbg=lightgrey cterm=none |
||||
|
||||
"Buffers scroll a bit so cursor doens't go all the way to the bottom before |
||||
"scroll begins |
||||
set scrolloff=3 |
||||
|
||||
"Makes all .swp files go to /tmp instead of . CAUSE FUCK DA POLICE |
||||
set backupdir=/tmp |
||||
set directory=/tmp |
||||
|
||||
"Better indenting |
||||
set autoindent |
||||
set expandtab |
||||
set tabstop=4 |
||||
set shiftwidth=4 |
||||
|
||||
"Show eol and tabs |
||||
set list |
||||
set listchars=trail:░,tab:►\ ,extends:>,precedes:< |
||||
|
||||
"Don't highlight search matches, don't jump while mid-search |
||||
set noincsearch |
||||
set nohlsearch |
||||
|
||||
"We want certain types to only have 2 space for tabs |
||||
au FileType clojure setlocal tabstop=2 shiftwidth=2 |
||||
au FileType ruby setlocal tabstop=2 shiftwidth=2 |
||||
au FileType yaml setlocal tabstop=2 shiftwidth=2 |
||||
au FileType html setlocal tabstop=2 shiftwidth=2 |
||||
au FileType proto setlocal tabstop=2 shiftwidth=2 |
||||
au FileType javascript setlocal tabstop=2 shiftwidth=2 |
||||
|
||||
"We want certain types to use tabs instead of spaces |
||||
au FileType go setlocal nolist noexpandtab |
||||
au FileType make setlocal nolist noexpandtab |
||||
|
||||
"terminal shortcuts |
||||
tnoremap <leader><leader> \ |
||||
tnoremap <leader> <C-\><C-n> |
||||
"tab shortcuts for terminal mode have terminal escape code preceding them |
||||
tnoremap <leader>tn <C-\><C-n>:tabe term://zsh<CR> |
||||
tnoremap <leader>tN <C-\><C-n>:tabe<CR> |
||||
tnoremap <leader>ts <C-\><C-n>:vs term://zsh<CR> |
||||
tnoremap <leader>tS <C-\><C-n>:vnew<CR> |
||||
tnoremap <leader>ti <C-\><C-n>:sp term://zsh<CR> |
||||
tnoremap <leader>tI <C-\><C-n>:new<CR> |
||||
tnoremap <leader>th <C-\><C-n>gT |
||||
tnoremap <leader>tH <C-\><C-n>:-tabmove<CR> |
||||
tnoremap <leader>tl <C-\><C-n>gt |
||||
tnoremap <leader>tL <C-\><C-n>:+tabmove<CR> |
||||
tnoremap <leader>tx <C-\><C-n>:tabclose<CR> |
||||
|
||||
"tab shortcuts |
||||
noremap <leader>tn :tabe term://zsh<CR> |
||||
noremap <leader>tN :tabe<CR> |
||||
noremap <leader>ts :vs term://zsh<CR> |
||||
noremap <leader>tS :vnew<CR> |
||||
noremap <leader>ti :sp term://zsh<CR> |
||||
noremap <leader>tI :new<CR> |
||||
noremap <leader>th gT |
||||
noremap <leader>tH :-tabmove<CR> |
||||
noremap <leader>tl gt |
||||
noremap <leader>tL :+tabmove<CR> |
||||
noremap <leader>tx :tabclose<CR> |
||||
|
||||
" yank/paste into/from clipboard |
||||
set clipboard+=unnamedplus |
||||
|
||||
"Clojure specific mappings |
||||
" Eval outerform |
||||
au FileType clojure nmap <buffer> cpP :Eval<cr> |
||||
" Eval full page |
||||
au FileType clojure nmap <buffer> cpR :%Eval<cr> |
||||
|
||||
" Disable Ex mode! |
||||
nnoremap Q <Nop> |
@ -0,0 +1,41 @@ |
||||
let |
||||
|
||||
src = builtins.fetchTarball { |
||||
name = "nixpkgs-2105"; |
||||
url = "https://github.com/nixos/nixpkgs/archive/7e9b0dff974c89e070da1ad85713ff3c20b0ca97.tar.gz"; |
||||
sha256 = "1ckzhh24mgz6jd1xhfgx0i9mijk6xjqxwsshnvq789xsavrmsc36"; |
||||
}; |
||||
|
||||
normalPkgs = (import src) {}; |
||||
|
||||
config = { |
||||
allowUnfree = true; |
||||
packageOverrides = pkgs: { |
||||
|
||||
go = builtins.fetchTarball { |
||||
url = "https://golang.org/dl/go1.17.1.linux-amd64.tar.gz"; |
||||
sha256 = "1196h1jx9cn5ks1y9r95z0q2s6m6ssvnx7jd34g435jvxjgb2c94"; |
||||
}; |
||||
|
||||
nixgl = let |
||||
|
||||
src = builtins.fetchTarball { |
||||
name = "nixgl-unstable"; |
||||
url = "https://github.com/guibou/nixGL/archive/51f19871a31b15b482ac4c80976da173289e77fb.tar.gz"; |
||||
sha256 = "0dj2apbx5iqvkiixyz1dzx4id51iw9s2isp1f9x60a03f5sqcvvi"; |
||||
}; |
||||
|
||||
nixgl = (import src) { |
||||
inherit pkgs; |
||||
enable32bits = false; |
||||
}; |
||||
|
||||
in nixgl.nixGLIntel; |
||||
|
||||
}; |
||||
}; |
||||
|
||||
in pkgsArg: |
||||
(import src) ( |
||||
normalPkgs.lib.attrsets.recursiveUpdate { config = config; } pkgsArg |
||||
) |
After Width: | Height: | Size: 404 KiB |
After Width: | Height: | Size: 5.6 MiB |
After Width: | Height: | Size: 485 KiB |
After Width: | Height: | Size: 64 KiB |
After Width: | Height: | Size: 128 KiB |
After Width: | Height: | Size: 755 KiB |
After Width: | Height: | Size: 373 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 233 KiB |
After Width: | Height: | Size: 2.3 MiB |
After Width: | Height: | Size: 42 KiB |
After Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 271 KiB |
After Width: | Height: | Size: 370 KiB |
After Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 47 KiB |