From aa38f3e0b2bc3e0adf7adbf2bde2914bf1674d17 Mon Sep 17 00:00:00 2001 From: Carolyn Saunders Date: Sat, 4 Mar 2017 14:31:11 -0800 Subject: [PATCH] Small upgrades. I'm moving to Void Linux! --- .config/bspwm/bspwmrc | 4 +- compton.conf => .config/compton.conf | 1 + .config/mutt/muttrc | 28 ++ .config/nvim/init.vim | 1 - .config/termite/config | 2 +- .scripts/bar.sh | 14 +- .scripts/battery.sh | 2 +- .scripts/bitcoin.sh | 5 + .scripts/checkmail.sh | 2 +- .scripts/cpu.sh | 2 +- .scripts/fehbg.sh | 2 +- .scripts/imap.sh | 2 +- .scripts/mail.sh | 2 +- .scripts/maildir-notmuch-sync | 2 +- .scripts/memory.sh | 2 +- .scripts/monitor.sh | 5 + .scripts/networkname.sh | 2 +- .scripts/offlineimap-notify.sh | 2 +- .scripts/tasks.sh | 2 +- .scripts/volume.sh | 2 +- .scripts/workspaces.sh | 2 +- nixos/configuration.nix | 9 +- nixos/st-config.h | 464 +++++++++++++++++++++++++++ 23 files changed, 531 insertions(+), 28 deletions(-) rename compton.conf => .config/compton.conf (97%) create mode 100644 .config/mutt/muttrc create mode 100755 .scripts/bitcoin.sh create mode 100755 .scripts/monitor.sh create mode 100644 nixos/st-config.h diff --git a/.config/bspwm/bspwmrc b/.config/bspwm/bspwmrc index 9b37fe3..242bd56 100755 --- a/.config/bspwm/bspwmrc +++ b/.config/bspwm/bspwmrc @@ -13,8 +13,8 @@ bspc config split_ratio 0.50 bspc config focus_follows_pointer true bspc config pointer_follows_monitor true -bspc config focused_border_color "#7986cb" -bspc config active_border_color "#7986cb" +bspc config focused_border_color "#7e57c2" +bspc config active_border_color "#7e57c2" bspc config normal_border_color "#121315" bspc config presel_feedback_color "#181818" diff --git a/compton.conf b/.config/compton.conf similarity index 97% rename from compton.conf rename to .config/compton.conf index d012bc1..be48a72 100644 --- a/compton.conf +++ b/.config/compton.conf @@ -13,6 +13,7 @@ shadow-opacity = 0.9; # The translucency for shadows. (default .75) # shadow-green = 0.0; # Green color value of shadow. (0.0 - 1.0, defaults to 0) # shadow-blue = 0.0; # Blue color value of shadow. (0.0 - 1.0, defaults to 0) # shadow-exclude = '!focused' ; # Exclude conditions for shadows. +shadow-exclude = "g:ei:Notify-osd"; shadow-ignore-shaped = true; # Opacity diff --git a/.config/mutt/muttrc b/.config/mutt/muttrc new file mode 100644 index 0000000..0b0b68a --- /dev/null +++ b/.config/mutt/muttrc @@ -0,0 +1,28 @@ +source "gpg -d ~/.config/mutt/passwords.gpg |" + +set folder = imaps://imap.gmail.com/ +set imap_user = gigavinyl@gmail.com +set smtp_url=smtps://$imap_user:$imap_pass@smtp.gmail.com +set spoolfile = +INBOX +mailboxes = +INBOX + +# Store message headers locally to speed things up. +# If hcache is a folder, Mutt will create sub cache folders for each account which may speeds things up even more. +set header_cache = ~/.cache/mutt + +# Store messages locally to speed things up, like searching message bodies. +# Can be the same folder as header_cache. +# This will cost important disk usage according to your e-mail amount. +set message_cachedir = "~/.cache/mutt" + +# Specify where to save and/or look for postponed messages. +set postponed = +[Gmail]/Drafts + +# Allow Mutt to open new imap connection automatically. +unset imap_passive + +# Keep IMAP connection alive by polling intermittently (time in seconds). +set imap_keepalive = 300 + +# How often to check for new mail (time in seconds). +set mail_check = 120 diff --git a/.config/nvim/init.vim b/.config/nvim/init.vim index 832abd9..500ded0 100644 --- a/.config/nvim/init.vim +++ b/.config/nvim/init.vim @@ -15,7 +15,6 @@ Plug 'ntpeters/vim-better-whitespace' Plug 'jiangmiao/auto-pairs' Plug 'scrooloose/nerdcommenter' Plug 'neovimhaskell/haskell-vim', {'for' : 'haskell'} -Plug 'mkasa/neco-ghc-lushtags', {'for' : 'haskell', 'do' : 'cp $HOME/.config/nvim/plugged/neco-ghc-lushtags/bin/ghc-mod-cache $HOME/.local/bin/'} Plug 'Twinside/vim-hoogle', {'for' : 'haskell'} Plug 'mkasa/lushtags', {'for' : 'haskell'} Plug 'scrooloose/nerdtree', {'on' : 'NERDTreeToggle'} diff --git a/.config/termite/config b/.config/termite/config index 30080b0..0d88e3e 100644 --- a/.config/termite/config +++ b/.config/termite/config @@ -1,5 +1,5 @@ [options] -font = SauceCodePro Nerd Font 11 +font = GohuFont 12 [colors] diff --git a/.scripts/bar.sh b/.scripts/bar.sh index 807f068..46c2687 100755 --- a/.scripts/bar.sh +++ b/.scripts/bar.sh @@ -1,8 +1,8 @@ -#!/bin/bash +#!/usr/bin/env bash pkill admiral -font="GohuFont:style=Regular:size=9" +font="GohuFont:style=Regular:size=10" fallback_font="FontAwesome:size=8" background="#cc111314" foreground="#bcbdc3" @@ -29,11 +29,11 @@ else y_offset=15 fi -for m in $monitors; do +#for m in $monitors; do #admiral | lemonbar -a $a -g "${x}x${y}+${x_offset}+${y_offset}" -f $font -f $fallback_font -B $background -F $foreground | sh & admiral | lemonbar -a $a -f $font -f $fallback_font -B $background -F $foreground | sh & # the following line gets the width of the current monitor - monitor_width=$(xrandr | grep '*' | ruby -e "puts gets.strip.split[0].split('x')" | head -n 1) - let x_offset+=$monitor_width - echo "Started bar on $m" -done + #monitor_width=$(xrandr | grep '*' | ruby -e "puts gets.strip.split[0].split('x')" | head -n 1) + #let x_offset+=$monitor_width + #echo "Started bar on $m" +#done diff --git a/.scripts/battery.sh b/.scripts/battery.sh index 3b1f758..2a15a21 100755 --- a/.scripts/battery.sh +++ b/.scripts/battery.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash status=$(acpi | awk '{orint $3;}' | sed 's/,//g') capacity=$(acpi | awk '{print $4;}' | sed 's/%//g' | sed 's/,//g') diff --git a/.scripts/bitcoin.sh b/.scripts/bitcoin.sh new file mode 100755 index 0000000..e144e5c --- /dev/null +++ b/.scripts/bitcoin.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +price=$(curl -sSL https://coinbase.com/api/v1/prices/historical | head -n 1 | sed 's|^.*,|$|' | sed 's|\(\.[0-9]$\)|\10|') + +echo "BTC: $price" diff --git a/.scripts/checkmail.sh b/.scripts/checkmail.sh index 3ad48cf..39048e9 100755 --- a/.scripts/checkmail.sh +++ b/.scripts/checkmail.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env bash STATE=`nmcli networking connectivity` diff --git a/.scripts/cpu.sh b/.scripts/cpu.sh index 42481c4..024922c 100755 --- a/.scripts/cpu.sh +++ b/.scripts/cpu.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash percent=$(top -bn1 | grep "Cpu(s)" | \ sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \ awk '{print 100 - $1}') diff --git a/.scripts/fehbg.sh b/.scripts/fehbg.sh index 1a1c96f..a001acb 100755 --- a/.scripts/fehbg.sh +++ b/.scripts/fehbg.sh @@ -1,2 +1,2 @@ -#!/bin/bash +#!/usr/bin/env bash feh --randomize --bg-fill ~/Wallpapers/* diff --git a/.scripts/imap.sh b/.scripts/imap.sh index a3b989c..fcc6561 100755 --- a/.scripts/imap.sh +++ b/.scripts/imap.sh @@ -1,3 +1,3 @@ -#!/bin/bash +#!/usr/bin/env bash $HOME/.scripts/mail/archive.sh ; mbsync -a -V ; notmuch new diff --git a/.scripts/mail.sh b/.scripts/mail.sh index 25f5db4..f52e8f4 100755 --- a/.scripts/mail.sh +++ b/.scripts/mail.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env bash NEWEMAILS=$(notmuch search tag:unread and not tag:archive | wc -l) echo "Mail: $NEWEMAILS" diff --git a/.scripts/maildir-notmuch-sync b/.scripts/maildir-notmuch-sync index 12cfb4e..3447e6f 100755 --- a/.scripts/maildir-notmuch-sync +++ b/.scripts/maildir-notmuch-sync @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # ---------------------------------------------------------------------- # maildir-notmuch-sync diff --git a/.scripts/memory.sh b/.scripts/memory.sh index b160e0c..c994a64 100755 --- a/.scripts/memory.sh +++ b/.scripts/memory.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash used=$(free | grep Mem | awk '{print $3/$2 * 100.0}') sparks=$(spark 0 $used 100) echo "Mem: $(echo "($used+0.5)/1" | bc)% [${sparks:1:1}]" diff --git a/.scripts/monitor.sh b/.scripts/monitor.sh new file mode 100755 index 0000000..8ceabb8 --- /dev/null +++ b/.scripts/monitor.sh @@ -0,0 +1,5 @@ +#!/usr/env/bin bash + +xrandr --output HDMI1 --auto --right-of eDP1 +xset mouse 2 0 +$HOME/.scripts/fehbg.sh diff --git a/.scripts/networkname.sh b/.scripts/networkname.sh index ae3d0f2..28a6457 100755 --- a/.scripts/networkname.sh +++ b/.scripts/networkname.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash nname=$(nmcli connection show --active | grep wireless | awk '{print $1;}') echo -en "%{A:connman-gtk:}%{F#7d8fa3}\uf1eb%{F-} " if [[ $nname != "" ]]; then diff --git a/.scripts/offlineimap-notify.sh b/.scripts/offlineimap-notify.sh index 61c8897..ef92982 100755 --- a/.scripts/offlineimap-notify.sh +++ b/.scripts/offlineimap-notify.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env bash #run OfflineIMAP once, with quiet interface imapactive=`ps -ef | grep offlineimap | grep -v grep | wc -l` diff --git a/.scripts/tasks.sh b/.scripts/tasks.sh index 5ff3569..607ef8c 100755 --- a/.scripts/tasks.sh +++ b/.scripts/tasks.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env bash today="$(task list due:today | grep tasks | awk '{print $1;}')" total="$(task list | grep tasks | awk '{print $1;}')" echo "Tasks: $today/$total" diff --git a/.scripts/volume.sh b/.scripts/volume.sh index 2c3dd43..d4628c0 100755 --- a/.scripts/volume.sh +++ b/.scripts/volume.sh @@ -1,2 +1,2 @@ -#!/bin/bash +#!/usr/bin/env bash echo -e "Vol: %{A:pavucontrol:}%{F#95b47b}\uf027%{F-} $(awk -F[][] '{ print $2 }' <(amixer sget Master) | tail -n 1)%{A}" diff --git a/.scripts/workspaces.sh b/.scripts/workspaces.sh index 671a111..261f107 100755 --- a/.scripts/workspaces.sh +++ b/.scripts/workspaces.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash chds() { echo -en "%{A:bspc desktop -f $1:}$2%{A} " diff --git a/nixos/configuration.nix b/nixos/configuration.nix index 7d07bf4..21282fd 100644 --- a/nixos/configuration.nix +++ b/nixos/configuration.nix @@ -122,6 +122,7 @@ dropbox-cli electrum elmPackages.elm + emacs feh gcc gimp @@ -129,11 +130,15 @@ gitAndTools.hub gnumake gnupg1 + guile haskellPackages.apply-refact haskellPackages.cabal-install + haskellPackages.ghc-mod + haskellPackages.hakyll haskellPackages.hakyll haskellPackages.hlint haskellPackages.hoogle + haskellPackages.pointfree haskellPackages.shake haskellPackages.stack haskellPackages.stylish-haskell @@ -162,7 +167,6 @@ vlc weechat wget - wireshark xautolock xfce.thunar xflux @@ -170,9 +174,6 @@ yubikey-personalization yubikey-personalization-gui zscroll - (pkgs.lib.overrideDerivation pkgs.st (attrs: { - configFile = builtins.readFile ./st-config.h; - })) ]; # List services that you want to enable: diff --git a/nixos/st-config.h b/nixos/st-config.h new file mode 100644 index 0000000..b5e6a5b --- /dev/null +++ b/nixos/st-config.h @@ -0,0 +1,464 @@ +static const char *colorname[] = { + + /* 8 normal colors */ + [0] = "#3c3e42", /* black */ + [1] = "#dd6880", /* red */ + [2] = "#83b879", /* green */ + [3] = "#dec790", /* yellow */ + [4] = "#95b5e4", /* blue */ + [5] = "#c1a3e0", /* magenta */ + [6] = "#64c1d4", /* cyan */ + [7] = "#9a9da3", /* white */ + + /* 8 bright colors */ + [8] = "#4f5558", /* black */ + [9] = "#de889a", /* red */ + [10] = "#99c490", /* green */ + [11] = "#e7d09a", /* yellow */ + [12] = "#a0beea", /* blue */ + [13] = "#cbacea", /* magenta */ + [14] = "#88d1df", /* cyan */ + [15] = "#b4b7bb", /* white */ + + /* special colors */ + [256] = "#212121", /* background */ + [257] = "#aeb1b7", /* foreground */ +}; + +/* +* default colors (colorname index) +* foreground, background, cursor +*/ +static unsigned int defaultfg = 257; +static unsigned int defaultbg = 256; +static unsigned int defaultcs = 257; + +/* +* colors used, when the specific fg == defaultfg. so in reverse mode this +* will reverse too. another logic would only make the simple feature too +* complex. +*/ +static unsigned int defaultitalic = 7; +static unsigned int defaultunderline = 7; + +static char font[] = "GohuFont:pixelsize=12:antialias=false"; + +static int borderpx = 2; + +/* + * What program is execed by st depends of these precedence rules: + * 1: program passed with -e + * 2: utmp option + * 3: SHELL environment variable + * 4: value of shell in /etc/passwd + * 5: value of shell in config.h + */ +static char shell[] = "/usr/bin/env zsh"; +static char *utmp = NULL; +static char stty_args[] = "stty raw pass8 nl -echo -iexten -cstopb 38400"; + +/* identification sequence returned in DA and DECID */ +static char vtiden[] = "\033[?6c"; + +/* Kerning / character bounding-box multipliers */ +static float cwscale = 1.0; +static float chscale = 1.0; + +/* + * word delimiter string + * + * More advanced example: " `'\"()[]{}" + */ +static char worddelimiters[] = " "; + +/* selection timeouts (in milliseconds) */ +static unsigned int doubleclicktimeout = 300; +static unsigned int tripleclicktimeout = 600; + +/* alt screens */ +static int allowaltscreen = 1; + +/* frames per second st should at maximum draw to the screen */ +static unsigned int xfps = 120; +static unsigned int actionfps = 30; + +/* + * blinking timeout (set to 0 to disable blinking) for the terminal blinking + * attribute. + */ +static unsigned int blinktimeout = 800; + +/* + * thickness of underline and bar cursors + */ +static unsigned int cursorthickness = 2; + +/* + * bell volume. It must be a value between -100 and 100. Use 0 for disabling + * it + */ +static int bellvolume = 0; + +/* default TERM value */ +static char termname[] = "st-256color"; + +/* + * spaces per tab + * + * When you are changing this value, don't forget to adapt the »it« value in + * the st.info and appropriately install the st.info in the environment where + * you use this st version. + * + * it#$tabspaces, + * + * Secondly make sure your kernel is not expanding tabs. When running `stty + * -a` »tab0« should appear. You can tell the terminal to not expand tabs by + * running following command: + * + * stty tabs + */ +static unsigned int tabspaces = 8; + +/* + * Default shape of cursor + * 2: Block ("█") + * 4: Underline ("_") + * 6: Bar ("|") + * 7: Snowman ("☃") + */ +static unsigned int cursorshape = 2; + +/* + * Default columns and rows numbers + */ + +static unsigned int cols = 80; +static unsigned int rows = 24; + +/* + * Default colour and shape of the mouse cursor + */ +static unsigned int mouseshape = XC_xterm; +static unsigned int mousefg = 7; +static unsigned int mousebg = 0; + +/* + * Color used to display font attributes when fontconfig selected a font which + * doesn't match the ones requested. + */ +static unsigned int defaultattr = 11; + +/* + * Internal mouse shortcuts. + * Beware that overloading Button1 will disable the selection. + */ +static MouseShortcut mshortcuts[] = { + /* button mask string */ + { Button4, XK_ANY_MOD, "\031" }, + { Button5, XK_ANY_MOD, "\005" }, +}; + +/* Internal keyboard shortcuts. */ +#define MODKEY Mod1Mask + +static Shortcut shortcuts[] = { + /* mask keysym function argument */ + { XK_ANY_MOD, XK_Break, sendbreak, {.i = 0} }, + { ControlMask, XK_Print, toggleprinter, {.i = 0} }, + { ShiftMask, XK_Print, printscreen, {.i = 0} }, + { XK_ANY_MOD, XK_Print, printsel, {.i = 0} }, + { MODKEY|ShiftMask, XK_Prior, xzoom, {.f = +1} }, + { MODKEY|ShiftMask, XK_Next, xzoom, {.f = -1} }, + { MODKEY|ShiftMask, XK_Home, xzoomreset, {.f = 0} }, + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { MODKEY|ShiftMask, XK_Insert, clippaste, {.i = 0} }, + { MODKEY|ShiftMask, XK_C, clipcopy, {.i = 0} }, + { MODKEY|ShiftMask, XK_V, clippaste, {.i = 0} }, + { MODKEY, XK_Num_Lock, numlock, {.i = 0} }, + { MODKEY, XK_Control_L, iso14755, {.i = 0} }, +}; + +/* + * Special keys (change & recompile st.info accordingly) + * + * Mask value: + * * Use XK_ANY_MOD to match the key no matter modifiers state + * * Use XK_NO_MOD to match the key alone (no modifiers) + * appkey value: + * * 0: no value + * * > 0: keypad application mode enabled + * * = 2: term.numlock = 1 + * * < 0: keypad application mode disabled + * appcursor value: + * * 0: no value + * * > 0: cursor application mode enabled + * * < 0: cursor application mode disabled + * crlf value + * * 0: no value + * * > 0: crlf mode is enabled + * * < 0: crlf mode is disabled + * + * Be careful with the order of the definitions because st searches in + * this table sequentially, so any XK_ANY_MOD must be in the last + * position for a key. + */ + +/* + * If you want keys other than the X11 function keys (0xFD00 - 0xFFFF) + * to be mapped below, add them to this array. + */ +static KeySym mappedkeys[] = { -1 }; + +/* + * State bits to ignore when matching key or button events. By default, + * numlock (Mod2Mask) and keyboard layout (XK_SWITCH_MOD) are ignored. + */ +static uint ignoremod = Mod2Mask|XK_SWITCH_MOD; + +/* + * Override mouse-select while mask is active (when MODE_MOUSE is set). + * Note that if you want to use ShiftMask with selmasks, set this to an other + * modifier, set to 0 to not use it. + */ +static uint forceselmod = ShiftMask; + +/* + * This is the huge key array which defines all compatibility to the Linux + * world. Please decide about changes wisely. + */ +static Key key[] = { + /* keysym mask string appkey appcursor crlf */ + { XK_KP_Home, ShiftMask, "\033[2J", 0, -1, 0}, + { XK_KP_Home, ShiftMask, "\033[1;2H", 0, +1, 0}, + { XK_KP_Home, XK_ANY_MOD, "\033[H", 0, -1, 0}, + { XK_KP_Home, XK_ANY_MOD, "\033[1~", 0, +1, 0}, + { XK_KP_Up, XK_ANY_MOD, "\033Ox", +1, 0, 0}, + { XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1, 0}, + { XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1, 0}, + { XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0, 0}, + { XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1, 0}, + { XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1, 0}, + { XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0, 0}, + { XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1, 0}, + { XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1, 0}, + { XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0, 0}, + { XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1, 0}, + { XK_KP_Right, XK_ANY_MOD, "\033OC", 0, +1, 0}, + { XK_KP_Prior, ShiftMask, "\033[5;2~", 0, 0, 0}, + { XK_KP_Prior, XK_ANY_MOD, "\033[5~", 0, 0, 0}, + { XK_KP_Begin, XK_ANY_MOD, "\033[E", 0, 0, 0}, + { XK_KP_End, ControlMask, "\033[J", -1, 0, 0}, + { XK_KP_End, ControlMask, "\033[1;5F", +1, 0, 0}, + { XK_KP_End, ShiftMask, "\033[K", -1, 0, 0}, + { XK_KP_End, ShiftMask, "\033[1;2F", +1, 0, 0}, + { XK_KP_End, XK_ANY_MOD, "\033[4~", 0, 0, 0}, + { XK_KP_Next, ShiftMask, "\033[6;2~", 0, 0, 0}, + { XK_KP_Next, XK_ANY_MOD, "\033[6~", 0, 0, 0}, + { XK_KP_Insert, ShiftMask, "\033[2;2~", +1, 0, 0}, + { XK_KP_Insert, ShiftMask, "\033[4l", -1, 0, 0}, + { XK_KP_Insert, ControlMask, "\033[L", -1, 0, 0}, + { XK_KP_Insert, ControlMask, "\033[2;5~", +1, 0, 0}, + { XK_KP_Insert, XK_ANY_MOD, "\033[4h", -1, 0, 0}, + { XK_KP_Insert, XK_ANY_MOD, "\033[2~", +1, 0, 0}, + { XK_KP_Delete, ControlMask, "\033[M", -1, 0, 0}, + { XK_KP_Delete, ControlMask, "\033[3;5~", +1, 0, 0}, + { XK_KP_Delete, ShiftMask, "\033[2K", -1, 0, 0}, + { XK_KP_Delete, ShiftMask, "\033[3;2~", +1, 0, 0}, + { XK_KP_Delete, XK_ANY_MOD, "\033[P", -1, 0, 0}, + { XK_KP_Delete, XK_ANY_MOD, "\033[3~", +1, 0, 0}, + { XK_KP_Multiply, XK_ANY_MOD, "\033Oj", +2, 0, 0}, + { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0, 0}, + { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0, 0}, + { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0, -1}, + { XK_KP_Enter, XK_ANY_MOD, "\r\n", -1, 0, +1}, + { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0, 0}, + { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0, 0}, + { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0, 0}, + { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0, 0}, + { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0, 0}, + { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0, 0}, + { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0, 0}, + { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0, 0}, + { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0, 0}, + { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0, 0}, + { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0, 0}, + { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0, 0}, + { XK_KP_9, XK_ANY_MOD, "\033Oy", +2, 0, 0}, + { XK_Up, ShiftMask, "\033[1;2A", 0, 0, 0}, + { XK_Up, Mod1Mask, "\033[1;3A", 0, 0, 0}, + { XK_Up, ShiftMask|Mod1Mask,"\033[1;4A", 0, 0, 0}, + { XK_Up, ControlMask, "\033[1;5A", 0, 0, 0}, + { XK_Up, ShiftMask|ControlMask,"\033[1;6A", 0, 0, 0}, + { XK_Up, ControlMask|Mod1Mask,"\033[1;7A", 0, 0, 0}, + { XK_Up,ShiftMask|ControlMask|Mod1Mask,"\033[1;8A", 0, 0, 0}, + { XK_Up, XK_ANY_MOD, "\033[A", 0, -1, 0}, + { XK_Up, XK_ANY_MOD, "\033OA", 0, +1, 0}, + { XK_Down, ShiftMask, "\033[1;2B", 0, 0, 0}, + { XK_Down, Mod1Mask, "\033[1;3B", 0, 0, 0}, + { XK_Down, ShiftMask|Mod1Mask,"\033[1;4B", 0, 0, 0}, + { XK_Down, ControlMask, "\033[1;5B", 0, 0, 0}, + { XK_Down, ShiftMask|ControlMask,"\033[1;6B", 0, 0, 0}, + { XK_Down, ControlMask|Mod1Mask,"\033[1;7B", 0, 0, 0}, + { XK_Down,ShiftMask|ControlMask|Mod1Mask,"\033[1;8B",0, 0, 0}, + { XK_Down, XK_ANY_MOD, "\033[B", 0, -1, 0}, + { XK_Down, XK_ANY_MOD, "\033OB", 0, +1, 0}, + { XK_Left, ShiftMask, "\033[1;2D", 0, 0, 0}, + { XK_Left, Mod1Mask, "\033[1;3D", 0, 0, 0}, + { XK_Left, ShiftMask|Mod1Mask,"\033[1;4D", 0, 0, 0}, + { XK_Left, ControlMask, "\033[1;5D", 0, 0, 0}, + { XK_Left, ShiftMask|ControlMask,"\033[1;6D", 0, 0, 0}, + { XK_Left, ControlMask|Mod1Mask,"\033[1;7D", 0, 0, 0}, + { XK_Left,ShiftMask|ControlMask|Mod1Mask,"\033[1;8D",0, 0, 0}, + { XK_Left, XK_ANY_MOD, "\033[D", 0, -1, 0}, + { XK_Left, XK_ANY_MOD, "\033OD", 0, +1, 0}, + { XK_Right, ShiftMask, "\033[1;2C", 0, 0, 0}, + { XK_Right, Mod1Mask, "\033[1;3C", 0, 0, 0}, + { XK_Right, ShiftMask|Mod1Mask,"\033[1;4C", 0, 0, 0}, + { XK_Right, ControlMask, "\033[1;5C", 0, 0, 0}, + { XK_Right, ShiftMask|ControlMask,"\033[1;6C", 0, 0, 0}, + { XK_Right, ControlMask|Mod1Mask,"\033[1;7C", 0, 0, 0}, + { XK_Right,ShiftMask|ControlMask|Mod1Mask,"\033[1;8C",0, 0, 0}, + { XK_Right, XK_ANY_MOD, "\033[C", 0, -1, 0}, + { XK_Right, XK_ANY_MOD, "\033OC", 0, +1, 0}, + { XK_ISO_Left_Tab, ShiftMask, "\033[Z", 0, 0, 0}, + { XK_Return, Mod1Mask, "\033\r", 0, 0, -1}, + { XK_Return, Mod1Mask, "\033\r\n", 0, 0, +1}, + { XK_Return, XK_ANY_MOD, "\r", 0, 0, -1}, + { XK_Return, XK_ANY_MOD, "\r\n", 0, 0, +1}, + { XK_Insert, ShiftMask, "\033[4l", -1, 0, 0}, + { XK_Insert, ShiftMask, "\033[2;2~", +1, 0, 0}, + { XK_Insert, ControlMask, "\033[L", -1, 0, 0}, + { XK_Insert, ControlMask, "\033[2;5~", +1, 0, 0}, + { XK_Insert, XK_ANY_MOD, "\033[4h", -1, 0, 0}, + { XK_Insert, XK_ANY_MOD, "\033[2~", +1, 0, 0}, + { XK_Delete, ControlMask, "\033[M", -1, 0, 0}, + { XK_Delete, ControlMask, "\033[3;5~", +1, 0, 0}, + { XK_Delete, ShiftMask, "\033[2K", -1, 0, 0}, + { XK_Delete, ShiftMask, "\033[3;2~", +1, 0, 0}, + { XK_Delete, XK_ANY_MOD, "\033[P", -1, 0, 0}, + { XK_Delete, XK_ANY_MOD, "\033[3~", +1, 0, 0}, + { XK_BackSpace, XK_NO_MOD, "\177", 0, 0, 0}, + { XK_BackSpace, Mod1Mask, "\033\177", 0, 0, 0}, + { XK_Home, ShiftMask, "\033[2J", 0, -1, 0}, + { XK_Home, ShiftMask, "\033[1;2H", 0, +1, 0}, + { XK_Home, XK_ANY_MOD, "\033[H", 0, -1, 0}, + { XK_Home, XK_ANY_MOD, "\033[1~", 0, +1, 0}, + { XK_End, ControlMask, "\033[J", -1, 0, 0}, + { XK_End, ControlMask, "\033[1;5F", +1, 0, 0}, + { XK_End, ShiftMask, "\033[K", -1, 0, 0}, + { XK_End, ShiftMask, "\033[1;2F", +1, 0, 0}, + { XK_End, XK_ANY_MOD, "\033[4~", 0, 0, 0}, + { XK_Prior, ControlMask, "\033[5;5~", 0, 0, 0}, + { XK_Prior, ShiftMask, "\033[5;2~", 0, 0, 0}, + { XK_Prior, XK_ANY_MOD, "\033[5~", 0, 0, 0}, + { XK_Next, ControlMask, "\033[6;5~", 0, 0, 0}, + { XK_Next, ShiftMask, "\033[6;2~", 0, 0, 0}, + { XK_Next, XK_ANY_MOD, "\033[6~", 0, 0, 0}, + { XK_F1, XK_NO_MOD, "\033OP" , 0, 0, 0}, + { XK_F1, /* F13 */ ShiftMask, "\033[1;2P", 0, 0, 0}, + { XK_F1, /* F25 */ ControlMask, "\033[1;5P", 0, 0, 0}, + { XK_F1, /* F37 */ Mod4Mask, "\033[1;6P", 0, 0, 0}, + { XK_F1, /* F49 */ Mod1Mask, "\033[1;3P", 0, 0, 0}, + { XK_F1, /* F61 */ Mod3Mask, "\033[1;4P", 0, 0, 0}, + { XK_F2, XK_NO_MOD, "\033OQ" , 0, 0, 0}, + { XK_F2, /* F14 */ ShiftMask, "\033[1;2Q", 0, 0, 0}, + { XK_F2, /* F26 */ ControlMask, "\033[1;5Q", 0, 0, 0}, + { XK_F2, /* F38 */ Mod4Mask, "\033[1;6Q", 0, 0, 0}, + { XK_F2, /* F50 */ Mod1Mask, "\033[1;3Q", 0, 0, 0}, + { XK_F2, /* F62 */ Mod3Mask, "\033[1;4Q", 0, 0, 0}, + { XK_F3, XK_NO_MOD, "\033OR" , 0, 0, 0}, + { XK_F3, /* F15 */ ShiftMask, "\033[1;2R", 0, 0, 0}, + { XK_F3, /* F27 */ ControlMask, "\033[1;5R", 0, 0, 0}, + { XK_F3, /* F39 */ Mod4Mask, "\033[1;6R", 0, 0, 0}, + { XK_F3, /* F51 */ Mod1Mask, "\033[1;3R", 0, 0, 0}, + { XK_F3, /* F63 */ Mod3Mask, "\033[1;4R", 0, 0, 0}, + { XK_F4, XK_NO_MOD, "\033OS" , 0, 0, 0}, + { XK_F4, /* F16 */ ShiftMask, "\033[1;2S", 0, 0, 0}, + { XK_F4, /* F28 */ ControlMask, "\033[1;5S", 0, 0, 0}, + { XK_F4, /* F40 */ Mod4Mask, "\033[1;6S", 0, 0, 0}, + { XK_F4, /* F52 */ Mod1Mask, "\033[1;3S", 0, 0, 0}, + { XK_F5, XK_NO_MOD, "\033[15~", 0, 0, 0}, + { XK_F5, /* F17 */ ShiftMask, "\033[15;2~", 0, 0, 0}, + { XK_F5, /* F29 */ ControlMask, "\033[15;5~", 0, 0, 0}, + { XK_F5, /* F41 */ Mod4Mask, "\033[15;6~", 0, 0, 0}, + { XK_F5, /* F53 */ Mod1Mask, "\033[15;3~", 0, 0, 0}, + { XK_F6, XK_NO_MOD, "\033[17~", 0, 0, 0}, + { XK_F6, /* F18 */ ShiftMask, "\033[17;2~", 0, 0, 0}, + { XK_F6, /* F30 */ ControlMask, "\033[17;5~", 0, 0, 0}, + { XK_F6, /* F42 */ Mod4Mask, "\033[17;6~", 0, 0, 0}, + { XK_F6, /* F54 */ Mod1Mask, "\033[17;3~", 0, 0, 0}, + { XK_F7, XK_NO_MOD, "\033[18~", 0, 0, 0}, + { XK_F7, /* F19 */ ShiftMask, "\033[18;2~", 0, 0, 0}, + { XK_F7, /* F31 */ ControlMask, "\033[18;5~", 0, 0, 0}, + { XK_F7, /* F43 */ Mod4Mask, "\033[18;6~", 0, 0, 0}, + { XK_F7, /* F55 */ Mod1Mask, "\033[18;3~", 0, 0, 0}, + { XK_F8, XK_NO_MOD, "\033[19~", 0, 0, 0}, + { XK_F8, /* F20 */ ShiftMask, "\033[19;2~", 0, 0, 0}, + { XK_F8, /* F32 */ ControlMask, "\033[19;5~", 0, 0, 0}, + { XK_F8, /* F44 */ Mod4Mask, "\033[19;6~", 0, 0, 0}, + { XK_F8, /* F56 */ Mod1Mask, "\033[19;3~", 0, 0, 0}, + { XK_F9, XK_NO_MOD, "\033[20~", 0, 0, 0}, + { XK_F9, /* F21 */ ShiftMask, "\033[20;2~", 0, 0, 0}, + { XK_F9, /* F33 */ ControlMask, "\033[20;5~", 0, 0, 0}, + { XK_F9, /* F45 */ Mod4Mask, "\033[20;6~", 0, 0, 0}, + { XK_F9, /* F57 */ Mod1Mask, "\033[20;3~", 0, 0, 0}, + { XK_F10, XK_NO_MOD, "\033[21~", 0, 0, 0}, + { XK_F10, /* F22 */ ShiftMask, "\033[21;2~", 0, 0, 0}, + { XK_F10, /* F34 */ ControlMask, "\033[21;5~", 0, 0, 0}, + { XK_F10, /* F46 */ Mod4Mask, "\033[21;6~", 0, 0, 0}, + { XK_F10, /* F58 */ Mod1Mask, "\033[21;3~", 0, 0, 0}, + { XK_F11, XK_NO_MOD, "\033[23~", 0, 0, 0}, + { XK_F11, /* F23 */ ShiftMask, "\033[23;2~", 0, 0, 0}, + { XK_F11, /* F35 */ ControlMask, "\033[23;5~", 0, 0, 0}, + { XK_F11, /* F47 */ Mod4Mask, "\033[23;6~", 0, 0, 0}, + { XK_F11, /* F59 */ Mod1Mask, "\033[23;3~", 0, 0, 0}, + { XK_F12, XK_NO_MOD, "\033[24~", 0, 0, 0}, + { XK_F12, /* F24 */ ShiftMask, "\033[24;2~", 0, 0, 0}, + { XK_F12, /* F36 */ ControlMask, "\033[24;5~", 0, 0, 0}, + { XK_F12, /* F48 */ Mod4Mask, "\033[24;6~", 0, 0, 0}, + { XK_F12, /* F60 */ Mod1Mask, "\033[24;3~", 0, 0, 0}, + { XK_F13, XK_NO_MOD, "\033[1;2P", 0, 0, 0}, + { XK_F14, XK_NO_MOD, "\033[1;2Q", 0, 0, 0}, + { XK_F15, XK_NO_MOD, "\033[1;2R", 0, 0, 0}, + { XK_F16, XK_NO_MOD, "\033[1;2S", 0, 0, 0}, + { XK_F17, XK_NO_MOD, "\033[15;2~", 0, 0, 0}, + { XK_F18, XK_NO_MOD, "\033[17;2~", 0, 0, 0}, + { XK_F19, XK_NO_MOD, "\033[18;2~", 0, 0, 0}, + { XK_F20, XK_NO_MOD, "\033[19;2~", 0, 0, 0}, + { XK_F21, XK_NO_MOD, "\033[20;2~", 0, 0, 0}, + { XK_F22, XK_NO_MOD, "\033[21;2~", 0, 0, 0}, + { XK_F23, XK_NO_MOD, "\033[23;2~", 0, 0, 0}, + { XK_F24, XK_NO_MOD, "\033[24;2~", 0, 0, 0}, + { XK_F25, XK_NO_MOD, "\033[1;5P", 0, 0, 0}, + { XK_F26, XK_NO_MOD, "\033[1;5Q", 0, 0, 0}, + { XK_F27, XK_NO_MOD, "\033[1;5R", 0, 0, 0}, + { XK_F28, XK_NO_MOD, "\033[1;5S", 0, 0, 0}, + { XK_F29, XK_NO_MOD, "\033[15;5~", 0, 0, 0}, + { XK_F30, XK_NO_MOD, "\033[17;5~", 0, 0, 0}, + { XK_F31, XK_NO_MOD, "\033[18;5~", 0, 0, 0}, + { XK_F32, XK_NO_MOD, "\033[19;5~", 0, 0, 0}, + { XK_F33, XK_NO_MOD, "\033[20;5~", 0, 0, 0}, + { XK_F34, XK_NO_MOD, "\033[21;5~", 0, 0, 0}, + { XK_F35, XK_NO_MOD, "\033[23;5~", 0, 0, 0}, +}; + +/* + * Selection types' masks. + * Use the same masks as usual. + * Button1Mask is always unset, to make masks match between ButtonPress. + * ButtonRelease and MotionNotify. + * If no match is found, regular selection is used. + */ +static uint selmasks[] = { + [SEL_RECTANGULAR] = Mod1Mask, +}; + +/* + * Printable characters in ASCII, used to estimate the advance width + * of single wide characters. + */ +static char ascii_printable[] = + " !\"#$%&'()*+,-./0123456789:;<=>?" + "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" + "`abcdefghijklmnopqrstuvwxyz{|}~"; +