├── README.md ├── config.nix ├── dotfiles ├── aspell.nix ├── bashrc ├── default.nix ├── gitconfig └── xprofile.nix ├── st ├── config.def.h └── st-no_bold_colors-20160727-308bfbf.diff ├── surf.diff ├── vimx.nix └── withGhc.nix /README.md: -------------------------------------------------------------------------------- 1 | Usage 2 | ===== 3 | 4 | After installing [Nix](https://nixos.org/nix/) or 5 | [NixOS](https://nixos.org/) checkout this repository as your 6 | `~/.nixpkgs` directory. We provide a few different sets of packages 7 | depending on your needs. 8 | 9 | | |Command Line |X | 10 | |-------|--------------|------------| 11 | |small |`coreEnv` |`coreXEnv` | 12 | |large |`baseEnv` |`baseXEnv` | 13 | 14 | The "small" packages are designed to have a minimal dependency tree, and 15 | be quick to install, even from source. The "large" packages ignore this 16 | requirement, and may take a long time to install. 17 | 18 | You can install these packages using the command 19 | 20 | $ nix-env -iA nixos.coreEnv 21 | 22 | or if you aren't on NixOS 23 | 24 | $ nix-env -iA nixpkgs.coreEnv 25 | 26 | Dotfiles 27 | ======== 28 | 29 | Some of my dotfiles are included here. I manage my dotfiles in Nix 30 | by creating an executable that I can run that will update my dotfiles 31 | that I configure in my nix config. See [the dotfiles](./dotfiles) directory 32 | for examples. 33 | 34 | $ nix-env -iA nixos.dotfiles 35 | $ updateDotFiles 36 | 37 | By keeping the `updateDotFiles` executable installed, any derivations 38 | referenced by your dotfiles won't be garbage collected. If you do update 39 | your nixpkgs and re-install `nixos.dotfiles` you should run `updateDotFiles` 40 | immediately in order to avoid accidentally relying on derivations that 41 | may be garbage collected in the near future. 42 | 43 | `updateDotFiles` won't overwrite any customisations you may have made, and 44 | will print out a warning if such files exist. If you want to get the files 45 | that `updateDotFiles` is tyring to give you, simply delete the existing 46 | files. 47 | -------------------------------------------------------------------------------- /config.nix: -------------------------------------------------------------------------------- 1 | { 2 | allowBroken = true; 3 | allowUnfree = true; 4 | packageOverrides = pkgs: rec { 5 | 6 | dvtm = pkgs.stdenv.mkDerivation { 7 | name = "dvtm"; 8 | src = pkgs.fetchFromGitHub { 9 | owner = "luke-clifton"; 10 | repo = "dvtm"; 11 | rev = "2b24c9cb16e618b14e18380f77fdda8dbeb32cf9"; 12 | sha256 = "0j9la6phiiw7m05a0grzr53lq0ly7123bffmvhz1v396ad2riyxb"; 13 | }; 14 | buildInputs = [ pkgs.ncurses ]; 15 | CFLAGS = pkgs.stdenv.lib.optionalString pkgs.stdenv.isDarwin "-D_DARWIN_C_SOURCE"; 16 | installPhase = '' 17 | make PREFIX=$out install 18 | ''; 19 | }; 20 | 21 | # A more complete editing experience, but slightly slower 22 | # loading speeds. 23 | vimx = import ./vimx.nix pkgs; 24 | 25 | st = pkgs.st.override { 26 | conf = (builtins.readFile ./st/config.def.h); 27 | patches = [./st/st-no_bold_colors-20160727-308bfbf.diff]; 28 | }; 29 | 30 | # Due to a bug in Nvidia driver this might require 31 | # WEBKIT_DISABLE_COMPOSITING_MODE=1 32 | # https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=229491 33 | surf = pkgs.surf.override { patches = ./surf.diff; }; 34 | 35 | surfNVidia = pkgs.writeScriptBin "surf" '' 36 | export WEBKIT_DISABLE_COMPOSITING_MODE=1 37 | exec ${surf}/bin/surf "$@" 38 | ''; 39 | 40 | gsasl = pkgs.stdenv.lib.overrideDerivation pkgs.gsasl (oldAttrs : { 41 | nativeBuildInputs = oldAttrs.nativeBuildInputs ++ [pkgs.krb5Full]; 42 | configureFlags = "--with-gssapi-impl=mit"; 43 | }); 44 | 45 | # Build cntlm on OS X 46 | cntlm = with pkgs.stdenv.lib; 47 | overrideDerivation pkgs.cntlm (oldAttrs : { 48 | preConfigure = '' 49 | sed -e 's/gcc/clang/' Makefile > Makefile.clang 50 | sed -i 's/CSS=.*/CSS="xlc_r gcc clang"/' configure 51 | ''; 52 | }); 53 | 54 | # Small core of things I need excluding X stuff. 55 | coreEnv = with pkgs; buildEnv { 56 | name = "coreEnv"; 57 | paths = 58 | let 59 | linux_only = [ 60 | abduco 61 | netcat-openbsd 62 | nq 63 | slmenu 64 | ]; 65 | darwin_only = []; 66 | in [ 67 | ack 68 | curl 69 | dvtm 70 | entr 71 | file 72 | git 73 | gitAndTools.git-crypt 74 | moreutils 75 | pv 76 | vim 77 | wget 78 | which 79 | (pkgs.callPackage ./withGhc.nix {}) 80 | ] 81 | ++ lib.optionals (system == "x86_64-linux") linux_only 82 | ++ lib.optionals (system == "x86_64-darwin") darwin_only; 83 | }; 84 | 85 | # Some core things that I need when using X 86 | coreXEnv = with pkgs; buildEnv { 87 | name = "coreXEnv"; 88 | paths = [ 89 | dmenu 90 | st 91 | xclip 92 | xdotool 93 | ]; 94 | }; 95 | 96 | 97 | # A more complete base system that I don't want to rebuild 98 | # as frequently as core. 99 | baseEnv = with pkgs; buildEnv { 100 | name = "baseEnv"; 101 | paths = [ 102 | aspell 103 | aspellDicts.en 104 | imagemagick 105 | isync 106 | neomutt 107 | openssl 108 | haskellPackages.ShellCheck 109 | vimx 110 | webfs 111 | ] 112 | ++ lib.optionals (system == "x86_64-linux") [ weechat ]; 113 | }; 114 | 115 | baseXEnv = with pkgs; buildEnv { 116 | name = "baseXEnv"; 117 | paths = [ 118 | firefox 119 | mpv 120 | surfNVidia 121 | tabbed 122 | youtube-dl # A version without the X deps would be nice. 123 | zathura 124 | ]; 125 | }; 126 | 127 | # Stuff I need for work 128 | workEnv = with pkgs; buildEnv { 129 | name = "workEnv"; 130 | paths = [ 131 | cntlm 132 | ]; 133 | }; 134 | 135 | # Installs a script to manage your dot-files with nix 136 | dotfiles = import ./dotfiles pkgs.pkgs; 137 | }; 138 | } 139 | -------------------------------------------------------------------------------- /dotfiles/aspell.nix: -------------------------------------------------------------------------------- 1 | pkgs : 2 | pkgs.writeText "aspell.conf" '' 3 | dict-dir ${pkgs.aspellDicts.en}/lib/aspell/ 4 | '' 5 | -------------------------------------------------------------------------------- /dotfiles/bashrc: -------------------------------------------------------------------------------- 1 | export WEBKIT_DISABLE_COMPOSITING_MODE=1 2 | -------------------------------------------------------------------------------- /dotfiles/default.nix: -------------------------------------------------------------------------------- 1 | pkgs : 2 | let 3 | lib = pkgs.lib; 4 | home = builtins.getEnv "HOME"; 5 | dotfiles = { 6 | ".bashrc" = ./bashrc; 7 | ".aspell.conf" = import ./aspell.nix pkgs; 8 | ".gitconfig" = ./gitconfig; 9 | ".xprofile" = import ./xprofile.nix pkgs; 10 | ".ghci" = pkgs.writeText "dot-ghci" '' 11 | :set prompt "λ " 12 | :set prompt2 "| " 13 | ''; 14 | }; 15 | 16 | in 17 | pkgs.writeScriptBin "updateDotFiles" ('' 18 | #! /usr/bin/env sh 19 | PATH=${pkgs.coreutils}/bin 20 | set -e 21 | update_dot() { 22 | local src="$1" 23 | local dst="$HOME/$2" 24 | local hsh="$HOME/.updatedot/$2" 25 | 26 | mkdir -p "$(dirname "$dst")" 27 | mkdir -p "$(dirname "$hsh")" 28 | 29 | if [ -f "$dst" ] 30 | then 31 | if [ -f "$hsh" ] 32 | then 33 | if md5sum --check --status "$hsh" 34 | then 35 | echo "Updating $2" 36 | rm "$dst" 37 | cat "$src" > "$dst" 38 | md5sum "$dst" > "$hsh" 39 | else 40 | echo "$2 has been manually edited, ignoring." 41 | echo "diff '$dst' '$src'" 42 | fi 43 | else 44 | echo "$2 was previously not under our control, ignoring." 45 | fi 46 | else 47 | echo "Installing $2" 48 | cat "$src" > "$dst" 49 | md5sum "$dst" > "$hsh" 50 | fi 51 | } 52 | '' 53 | + lib.concatStringsSep "\n" ( 54 | lib.mapAttrsToList 55 | (name: value: "update_dot \"${value}\" \"${name}\"") 56 | dotfiles 57 | ) 58 | ) 59 | -------------------------------------------------------------------------------- /dotfiles/gitconfig: -------------------------------------------------------------------------------- 1 | [user] 2 | email = lukec@themk.net 3 | name = Luke Clifton 4 | [push] 5 | default = simple 6 | -------------------------------------------------------------------------------- /dotfiles/xprofile.nix: -------------------------------------------------------------------------------- 1 | pkgs : 2 | let 3 | dunstConf = pkgs.writeText "dunstrc" '' 4 | [global] 5 | font = Monospace 12 6 | allow_markup = no 7 | sort = yes 8 | indicate_hidden = yes 9 | alignment = left 10 | bounce_freq = 0 11 | show_age_threshold = 60 12 | ignore_newline = no 13 | geometry = "500x5-30+20" 14 | shrink = no 15 | transparency = 0 16 | idle_threshold = 120 17 | monitor = 0 18 | follow = keyboard 19 | sticky_history = yes 20 | history_length = 20 21 | show_indicators = yes 22 | line_height = 0 23 | separator_height = 2 24 | padding = 8 25 | horizontal_padding = 8 26 | separator_color = frame 27 | startup_notification = false 28 | dmenu = ${pkgs.dmenu}/bin/dmenu -p dunst: 29 | browser = ${pkgs.surf} 30 | icon_position = off 31 | [frame] 32 | width = 3 33 | color = "#aaaaaa" 34 | [shortcuts] 35 | close = ctrl+space 36 | close_all = ctrl+shift+space 37 | history = ctrl+grave 38 | context = ctrl+shift+period 39 | ''; 40 | in 41 | pkgs.writeText "xinitrc" '' 42 | ${pkgs.dunst}/bin/dunst -config ${dunstConf} & 43 | '' 44 | -------------------------------------------------------------------------------- /st/config.def.h: -------------------------------------------------------------------------------- 1 | /* See LICENSE file for copyright and license details. */ 2 | 3 | /* 4 | * appearance 5 | * 6 | * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html 7 | */ 8 | static char font[] = "DejavuSansMono:pixelsize=28:antialias=true:autohint=false"; 9 | static int borderpx = 2; 10 | 11 | /* 12 | * What program is execed by st depends of these precedence rules: 13 | * 1: program passed with -e 14 | * 2: utmp option 15 | * 3: SHELL environment variable 16 | * 4: value of shell in /etc/passwd 17 | * 5: value of shell in config.h 18 | */ 19 | static char *shell = "/bin/sh"; 20 | char *utmp = NULL; 21 | char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400"; 22 | 23 | /* identification sequence returned in DA and DECID */ 24 | char *vtiden = "\033[?6c"; 25 | 26 | /* Kerning / character bounding-box multipliers */ 27 | static float cwscale = 1.0; 28 | static float chscale = 1.0; 29 | 30 | /* 31 | * word delimiter string 32 | * 33 | * More advanced example: " `'\"()[]{}" 34 | */ 35 | char *worddelimiters = "' "; 36 | 37 | /* selection timeouts (in milliseconds) */ 38 | static unsigned int doubleclicktimeout = 300; 39 | static unsigned int tripleclicktimeout = 600; 40 | 41 | /* alt screens */ 42 | int allowaltscreen = 1; 43 | 44 | /* frames per second st should at maximum draw to the screen */ 45 | static unsigned int xfps = 120; 46 | static unsigned int actionfps = 30; 47 | 48 | /* 49 | * blinking timeout (set to 0 to disable blinking) for the terminal blinking 50 | * attribute. 51 | */ 52 | static unsigned int blinktimeout = 800; 53 | 54 | /* 55 | * thickness of underline and bar cursors 56 | */ 57 | static unsigned int cursorthickness = 2; 58 | 59 | /* 60 | * bell volume. It must be a value between -100 and 100. Use 0 for disabling 61 | * it 62 | */ 63 | static int bellvolume = 0; 64 | 65 | /* default TERM value */ 66 | char *termname = "st-256color"; 67 | 68 | /* 69 | * spaces per tab 70 | * 71 | * When you are changing this value, don't forget to adapt the »it« value in 72 | * the st.info and appropriately install the st.info in the environment where 73 | * you use this st version. 74 | * 75 | * it#$tabspaces, 76 | * 77 | * Secondly make sure your kernel is not expanding tabs. When running `stty 78 | * -a` »tab0« should appear. You can tell the terminal to not expand tabs by 79 | * running following command: 80 | * 81 | * stty tabs 82 | */ 83 | unsigned int tabspaces = 8; 84 | 85 | /* Terminal colors (16 first used in escape sequence) */ 86 | static const char *colorname[] = { 87 | /* solarized light */ 88 | "#eee8d5", /* 0: black */ 89 | "#dc322f", /* 1: red */ 90 | "#859900", /* 2: green */ 91 | "#b58900", /* 3: yellow */ 92 | "#268bd2", /* 4: blue */ 93 | "#d33682", /* 5: magenta */ 94 | "#2aa198", /* 6: cyan */ 95 | "#073642", /* 7: white */ 96 | "#fdf6e3", /* 8: brblack */ 97 | "#cb4b16", /* 9: brred */ 98 | "#93a1a1", /* 10: brgreen */ 99 | "#839496", /* 11: bryellow */ 100 | "#657b83", /* 12: brblue */ 101 | "#6c71c4", /* 13: brmagenta*/ 102 | "#586e75", /* 14: brcyan */ 103 | "#002b36", /* 15: brwhite */ 104 | 105 | [255] = 0, 106 | 107 | /* more colors can be added after 255 to use with DefaultXX */ 108 | "#cccccc", 109 | "#555555", 110 | }; 111 | 112 | 113 | /* 114 | * Default colors (colorname index) 115 | * foreground, background, cursor, reverse cursor 116 | */ 117 | unsigned int defaultfg = 12; 118 | unsigned int defaultbg = 8; 119 | static unsigned int defaultcs = 14; 120 | static unsigned int defaultrcs = 15; 121 | 122 | /* 123 | * Default shape of cursor 124 | * 2: Block ("█") 125 | * 4: Underline ("_") 126 | * 6: Bar ("|") 127 | * 7: Snowman ("☃") 128 | */ 129 | static unsigned int cursorshape = 2; 130 | 131 | /* 132 | * Default columns and rows numbers 133 | */ 134 | 135 | static unsigned int cols = 80; 136 | static unsigned int rows = 24; 137 | 138 | /* 139 | * Default colour and shape of the mouse cursor 140 | */ 141 | static unsigned int mouseshape = XC_xterm; 142 | static unsigned int mousefg = 7; 143 | static unsigned int mousebg = 0; 144 | 145 | /* 146 | * Color used to display font attributes when fontconfig selected a font which 147 | * doesn't match the ones requested. 148 | */ 149 | static unsigned int defaultattr = 11; 150 | 151 | /* 152 | * Internal mouse shortcuts. 153 | * Beware that overloading Button1 will disable the selection. 154 | */ 155 | static MouseShortcut mshortcuts[] = { 156 | /* button mask string */ 157 | { Button4, XK_ANY_MOD, "\031" }, 158 | { Button5, XK_ANY_MOD, "\005" }, 159 | }; 160 | 161 | /* Internal keyboard shortcuts. */ 162 | #define MODKEY Mod1Mask 163 | #define TERMMOD (ControlMask|ShiftMask) 164 | 165 | static Shortcut shortcuts[] = { 166 | /* mask keysym function argument */ 167 | { XK_ANY_MOD, XK_Break, sendbreak, {.i = 0} }, 168 | { ControlMask, XK_Print, toggleprinter, {.i = 0} }, 169 | { ShiftMask, XK_Print, printscreen, {.i = 0} }, 170 | { XK_ANY_MOD, XK_Print, printsel, {.i = 0} }, 171 | { TERMMOD, XK_Prior, zoom, {.f = +1} }, 172 | { TERMMOD, XK_Next, zoom, {.f = -1} }, 173 | { TERMMOD, XK_Home, zoomreset, {.f = 0} }, 174 | { TERMMOD, XK_C, clipcopy, {.i = 0} }, 175 | { TERMMOD, XK_V, clippaste, {.i = 0} }, 176 | { TERMMOD, XK_Y, selpaste, {.i = 0} }, 177 | { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, 178 | { TERMMOD, XK_I, iso14755, {.i = 0} }, 179 | }; 180 | 181 | /* 182 | * Special keys (change & recompile st.info accordingly) 183 | * 184 | * Mask value: 185 | * * Use XK_ANY_MOD to match the key no matter modifiers state 186 | * * Use XK_NO_MOD to match the key alone (no modifiers) 187 | * appkey value: 188 | * * 0: no value 189 | * * > 0: keypad application mode enabled 190 | * * = 2: term.numlock = 1 191 | * * < 0: keypad application mode disabled 192 | * appcursor value: 193 | * * 0: no value 194 | * * > 0: cursor application mode enabled 195 | * * < 0: cursor application mode disabled 196 | * crlf value 197 | * * 0: no value 198 | * * > 0: crlf mode is enabled 199 | * * < 0: crlf mode is disabled 200 | * 201 | * Be careful with the order of the definitions because st searches in 202 | * this table sequentially, so any XK_ANY_MOD must be in the last 203 | * position for a key. 204 | */ 205 | 206 | /* 207 | * If you want keys other than the X11 function keys (0xFD00 - 0xFFFF) 208 | * to be mapped below, add them to this array. 209 | */ 210 | static KeySym mappedkeys[] = { -1 }; 211 | 212 | /* 213 | * State bits to ignore when matching key or button events. By default, 214 | * numlock (Mod2Mask) and keyboard layout (XK_SWITCH_MOD) are ignored. 215 | */ 216 | static uint ignoremod = Mod2Mask|XK_SWITCH_MOD; 217 | 218 | /* 219 | * Override mouse-select while mask is active (when MODE_MOUSE is set). 220 | * Note that if you want to use ShiftMask with selmasks, set this to an other 221 | * modifier, set to 0 to not use it. 222 | */ 223 | static uint forceselmod = ShiftMask; 224 | 225 | /* 226 | * This is the huge key array which defines all compatibility to the Linux 227 | * world. Please decide about changes wisely. 228 | */ 229 | static Key key[] = { 230 | /* keysym mask string appkey appcursor */ 231 | { XK_KP_Home, ShiftMask, "\033[2J", 0, -1}, 232 | { XK_KP_Home, ShiftMask, "\033[1;2H", 0, +1}, 233 | { XK_KP_Home, XK_ANY_MOD, "\033[H", 0, -1}, 234 | { XK_KP_Home, XK_ANY_MOD, "\033[1~", 0, +1}, 235 | { XK_KP_Up, XK_ANY_MOD, "\033Ox", +1, 0}, 236 | { XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1}, 237 | { XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1}, 238 | { XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0}, 239 | { XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1}, 240 | { XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1}, 241 | { XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0}, 242 | { XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1}, 243 | { XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1}, 244 | { XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0}, 245 | { XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1}, 246 | { XK_KP_Right, XK_ANY_MOD, "\033OC", 0, +1}, 247 | { XK_KP_Prior, ShiftMask, "\033[5;2~", 0, 0}, 248 | { XK_KP_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, 249 | { XK_KP_Begin, XK_ANY_MOD, "\033[E", 0, 0}, 250 | { XK_KP_End, ControlMask, "\033[J", -1, 0}, 251 | { XK_KP_End, ControlMask, "\033[1;5F", +1, 0}, 252 | { XK_KP_End, ShiftMask, "\033[K", -1, 0}, 253 | { XK_KP_End, ShiftMask, "\033[1;2F", +1, 0}, 254 | { XK_KP_End, XK_ANY_MOD, "\033[4~", 0, 0}, 255 | { XK_KP_Next, ShiftMask, "\033[6;2~", 0, 0}, 256 | { XK_KP_Next, XK_ANY_MOD, "\033[6~", 0, 0}, 257 | { XK_KP_Insert, ShiftMask, "\033[2;2~", +1, 0}, 258 | { XK_KP_Insert, ShiftMask, "\033[4l", -1, 0}, 259 | { XK_KP_Insert, ControlMask, "\033[L", -1, 0}, 260 | { XK_KP_Insert, ControlMask, "\033[2;5~", +1, 0}, 261 | { XK_KP_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, 262 | { XK_KP_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, 263 | { XK_KP_Delete, ControlMask, "\033[M", -1, 0}, 264 | { XK_KP_Delete, ControlMask, "\033[3;5~", +1, 0}, 265 | { XK_KP_Delete, ShiftMask, "\033[2K", -1, 0}, 266 | { XK_KP_Delete, ShiftMask, "\033[3;2~", +1, 0}, 267 | { XK_KP_Delete, XK_ANY_MOD, "\033[P", -1, 0}, 268 | { XK_KP_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, 269 | { XK_KP_Multiply, XK_ANY_MOD, "\033Oj", +2, 0}, 270 | { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0}, 271 | { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0}, 272 | { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0}, 273 | { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0}, 274 | { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0}, 275 | { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0}, 276 | { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0}, 277 | { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0}, 278 | { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0}, 279 | { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0}, 280 | { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0}, 281 | { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0}, 282 | { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0}, 283 | { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0}, 284 | { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0}, 285 | { XK_KP_9, XK_ANY_MOD, "\033Oy", +2, 0}, 286 | { XK_Up, ShiftMask, "\033[1;2A", 0, 0}, 287 | { XK_Up, Mod1Mask, "\033[1;3A", 0, 0}, 288 | { XK_Up, ShiftMask|Mod1Mask,"\033[1;4A", 0, 0}, 289 | { XK_Up, ControlMask, "\033[1;5A", 0, 0}, 290 | { XK_Up, ShiftMask|ControlMask,"\033[1;6A", 0, 0}, 291 | { XK_Up, ControlMask|Mod1Mask,"\033[1;7A", 0, 0}, 292 | { XK_Up,ShiftMask|ControlMask|Mod1Mask,"\033[1;8A", 0, 0}, 293 | { XK_Up, XK_ANY_MOD, "\033[A", 0, -1}, 294 | { XK_Up, XK_ANY_MOD, "\033OA", 0, +1}, 295 | { XK_Down, ShiftMask, "\033[1;2B", 0, 0}, 296 | { XK_Down, Mod1Mask, "\033[1;3B", 0, 0}, 297 | { XK_Down, ShiftMask|Mod1Mask,"\033[1;4B", 0, 0}, 298 | { XK_Down, ControlMask, "\033[1;5B", 0, 0}, 299 | { XK_Down, ShiftMask|ControlMask,"\033[1;6B", 0, 0}, 300 | { XK_Down, ControlMask|Mod1Mask,"\033[1;7B", 0, 0}, 301 | { XK_Down,ShiftMask|ControlMask|Mod1Mask,"\033[1;8B",0, 0}, 302 | { XK_Down, XK_ANY_MOD, "\033[B", 0, -1}, 303 | { XK_Down, XK_ANY_MOD, "\033OB", 0, +1}, 304 | { XK_Left, ShiftMask, "\033[1;2D", 0, 0}, 305 | { XK_Left, Mod1Mask, "\033[1;3D", 0, 0}, 306 | { XK_Left, ShiftMask|Mod1Mask,"\033[1;4D", 0, 0}, 307 | { XK_Left, ControlMask, "\033[1;5D", 0, 0}, 308 | { XK_Left, ShiftMask|ControlMask,"\033[1;6D", 0, 0}, 309 | { XK_Left, ControlMask|Mod1Mask,"\033[1;7D", 0, 0}, 310 | { XK_Left,ShiftMask|ControlMask|Mod1Mask,"\033[1;8D",0, 0}, 311 | { XK_Left, XK_ANY_MOD, "\033[D", 0, -1}, 312 | { XK_Left, XK_ANY_MOD, "\033OD", 0, +1}, 313 | { XK_Right, ShiftMask, "\033[1;2C", 0, 0}, 314 | { XK_Right, Mod1Mask, "\033[1;3C", 0, 0}, 315 | { XK_Right, ShiftMask|Mod1Mask,"\033[1;4C", 0, 0}, 316 | { XK_Right, ControlMask, "\033[1;5C", 0, 0}, 317 | { XK_Right, ShiftMask|ControlMask,"\033[1;6C", 0, 0}, 318 | { XK_Right, ControlMask|Mod1Mask,"\033[1;7C", 0, 0}, 319 | { XK_Right,ShiftMask|ControlMask|Mod1Mask,"\033[1;8C",0, 0}, 320 | { XK_Right, XK_ANY_MOD, "\033[C", 0, -1}, 321 | { XK_Right, XK_ANY_MOD, "\033OC", 0, +1}, 322 | { XK_ISO_Left_Tab, ShiftMask, "\033[Z", 0, 0}, 323 | { XK_Return, Mod1Mask, "\033\r", 0, 0}, 324 | { XK_Return, XK_ANY_MOD, "\r", 0, 0}, 325 | { XK_Insert, ShiftMask, "\033[4l", -1, 0}, 326 | { XK_Insert, ShiftMask, "\033[2;2~", +1, 0}, 327 | { XK_Insert, ControlMask, "\033[L", -1, 0}, 328 | { XK_Insert, ControlMask, "\033[2;5~", +1, 0}, 329 | { XK_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, 330 | { XK_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, 331 | { XK_Delete, ControlMask, "\033[M", -1, 0}, 332 | { XK_Delete, ControlMask, "\033[3;5~", +1, 0}, 333 | { XK_Delete, ShiftMask, "\033[2K", -1, 0}, 334 | { XK_Delete, ShiftMask, "\033[3;2~", +1, 0}, 335 | { XK_Delete, XK_ANY_MOD, "\033[P", -1, 0}, 336 | { XK_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, 337 | { XK_BackSpace, XK_NO_MOD, "\177", 0, 0}, 338 | { XK_BackSpace, Mod1Mask, "\033\177", 0, 0}, 339 | { XK_Home, ShiftMask, "\033[2J", 0, -1}, 340 | { XK_Home, ShiftMask, "\033[1;2H", 0, +1}, 341 | { XK_Home, XK_ANY_MOD, "\033[H", 0, -1}, 342 | { XK_Home, XK_ANY_MOD, "\033[1~", 0, +1}, 343 | { XK_End, ControlMask, "\033[J", -1, 0}, 344 | { XK_End, ControlMask, "\033[1;5F", +1, 0}, 345 | { XK_End, ShiftMask, "\033[K", -1, 0}, 346 | { XK_End, ShiftMask, "\033[1;2F", +1, 0}, 347 | { XK_End, XK_ANY_MOD, "\033[4~", 0, 0}, 348 | { XK_Prior, ControlMask, "\033[5;5~", 0, 0}, 349 | { XK_Prior, ShiftMask, "\033[5;2~", 0, 0}, 350 | { XK_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, 351 | { XK_Next, ControlMask, "\033[6;5~", 0, 0}, 352 | { XK_Next, ShiftMask, "\033[6;2~", 0, 0}, 353 | { XK_Next, XK_ANY_MOD, "\033[6~", 0, 0}, 354 | { XK_F1, XK_NO_MOD, "\033OP" , 0, 0}, 355 | { XK_F1, /* F13 */ ShiftMask, "\033[1;2P", 0, 0}, 356 | { XK_F1, /* F25 */ ControlMask, "\033[1;5P", 0, 0}, 357 | { XK_F1, /* F37 */ Mod4Mask, "\033[1;6P", 0, 0}, 358 | { XK_F1, /* F49 */ Mod1Mask, "\033[1;3P", 0, 0}, 359 | { XK_F1, /* F61 */ Mod3Mask, "\033[1;4P", 0, 0}, 360 | { XK_F2, XK_NO_MOD, "\033OQ" , 0, 0}, 361 | { XK_F2, /* F14 */ ShiftMask, "\033[1;2Q", 0, 0}, 362 | { XK_F2, /* F26 */ ControlMask, "\033[1;5Q", 0, 0}, 363 | { XK_F2, /* F38 */ Mod4Mask, "\033[1;6Q", 0, 0}, 364 | { XK_F2, /* F50 */ Mod1Mask, "\033[1;3Q", 0, 0}, 365 | { XK_F2, /* F62 */ Mod3Mask, "\033[1;4Q", 0, 0}, 366 | { XK_F3, XK_NO_MOD, "\033OR" , 0, 0}, 367 | { XK_F3, /* F15 */ ShiftMask, "\033[1;2R", 0, 0}, 368 | { XK_F3, /* F27 */ ControlMask, "\033[1;5R", 0, 0}, 369 | { XK_F3, /* F39 */ Mod4Mask, "\033[1;6R", 0, 0}, 370 | { XK_F3, /* F51 */ Mod1Mask, "\033[1;3R", 0, 0}, 371 | { XK_F3, /* F63 */ Mod3Mask, "\033[1;4R", 0, 0}, 372 | { XK_F4, XK_NO_MOD, "\033OS" , 0, 0}, 373 | { XK_F4, /* F16 */ ShiftMask, "\033[1;2S", 0, 0}, 374 | { XK_F4, /* F28 */ ControlMask, "\033[1;5S", 0, 0}, 375 | { XK_F4, /* F40 */ Mod4Mask, "\033[1;6S", 0, 0}, 376 | { XK_F4, /* F52 */ Mod1Mask, "\033[1;3S", 0, 0}, 377 | { XK_F5, XK_NO_MOD, "\033[15~", 0, 0}, 378 | { XK_F5, /* F17 */ ShiftMask, "\033[15;2~", 0, 0}, 379 | { XK_F5, /* F29 */ ControlMask, "\033[15;5~", 0, 0}, 380 | { XK_F5, /* F41 */ Mod4Mask, "\033[15;6~", 0, 0}, 381 | { XK_F5, /* F53 */ Mod1Mask, "\033[15;3~", 0, 0}, 382 | { XK_F6, XK_NO_MOD, "\033[17~", 0, 0}, 383 | { XK_F6, /* F18 */ ShiftMask, "\033[17;2~", 0, 0}, 384 | { XK_F6, /* F30 */ ControlMask, "\033[17;5~", 0, 0}, 385 | { XK_F6, /* F42 */ Mod4Mask, "\033[17;6~", 0, 0}, 386 | { XK_F6, /* F54 */ Mod1Mask, "\033[17;3~", 0, 0}, 387 | { XK_F7, XK_NO_MOD, "\033[18~", 0, 0}, 388 | { XK_F7, /* F19 */ ShiftMask, "\033[18;2~", 0, 0}, 389 | { XK_F7, /* F31 */ ControlMask, "\033[18;5~", 0, 0}, 390 | { XK_F7, /* F43 */ Mod4Mask, "\033[18;6~", 0, 0}, 391 | { XK_F7, /* F55 */ Mod1Mask, "\033[18;3~", 0, 0}, 392 | { XK_F8, XK_NO_MOD, "\033[19~", 0, 0}, 393 | { XK_F8, /* F20 */ ShiftMask, "\033[19;2~", 0, 0}, 394 | { XK_F8, /* F32 */ ControlMask, "\033[19;5~", 0, 0}, 395 | { XK_F8, /* F44 */ Mod4Mask, "\033[19;6~", 0, 0}, 396 | { XK_F8, /* F56 */ Mod1Mask, "\033[19;3~", 0, 0}, 397 | { XK_F9, XK_NO_MOD, "\033[20~", 0, 0}, 398 | { XK_F9, /* F21 */ ShiftMask, "\033[20;2~", 0, 0}, 399 | { XK_F9, /* F33 */ ControlMask, "\033[20;5~", 0, 0}, 400 | { XK_F9, /* F45 */ Mod4Mask, "\033[20;6~", 0, 0}, 401 | { XK_F9, /* F57 */ Mod1Mask, "\033[20;3~", 0, 0}, 402 | { XK_F10, XK_NO_MOD, "\033[21~", 0, 0}, 403 | { XK_F10, /* F22 */ ShiftMask, "\033[21;2~", 0, 0}, 404 | { XK_F10, /* F34 */ ControlMask, "\033[21;5~", 0, 0}, 405 | { XK_F10, /* F46 */ Mod4Mask, "\033[21;6~", 0, 0}, 406 | { XK_F10, /* F58 */ Mod1Mask, "\033[21;3~", 0, 0}, 407 | { XK_F11, XK_NO_MOD, "\033[23~", 0, 0}, 408 | { XK_F11, /* F23 */ ShiftMask, "\033[23;2~", 0, 0}, 409 | { XK_F11, /* F35 */ ControlMask, "\033[23;5~", 0, 0}, 410 | { XK_F11, /* F47 */ Mod4Mask, "\033[23;6~", 0, 0}, 411 | { XK_F11, /* F59 */ Mod1Mask, "\033[23;3~", 0, 0}, 412 | { XK_F12, XK_NO_MOD, "\033[24~", 0, 0}, 413 | { XK_F12, /* F24 */ ShiftMask, "\033[24;2~", 0, 0}, 414 | { XK_F12, /* F36 */ ControlMask, "\033[24;5~", 0, 0}, 415 | { XK_F12, /* F48 */ Mod4Mask, "\033[24;6~", 0, 0}, 416 | { XK_F12, /* F60 */ Mod1Mask, "\033[24;3~", 0, 0}, 417 | { XK_F13, XK_NO_MOD, "\033[1;2P", 0, 0}, 418 | { XK_F14, XK_NO_MOD, "\033[1;2Q", 0, 0}, 419 | { XK_F15, XK_NO_MOD, "\033[1;2R", 0, 0}, 420 | { XK_F16, XK_NO_MOD, "\033[1;2S", 0, 0}, 421 | { XK_F17, XK_NO_MOD, "\033[15;2~", 0, 0}, 422 | { XK_F18, XK_NO_MOD, "\033[17;2~", 0, 0}, 423 | { XK_F19, XK_NO_MOD, "\033[18;2~", 0, 0}, 424 | { XK_F20, XK_NO_MOD, "\033[19;2~", 0, 0}, 425 | { XK_F21, XK_NO_MOD, "\033[20;2~", 0, 0}, 426 | { XK_F22, XK_NO_MOD, "\033[21;2~", 0, 0}, 427 | { XK_F23, XK_NO_MOD, "\033[23;2~", 0, 0}, 428 | { XK_F24, XK_NO_MOD, "\033[24;2~", 0, 0}, 429 | { XK_F25, XK_NO_MOD, "\033[1;5P", 0, 0}, 430 | { XK_F26, XK_NO_MOD, "\033[1;5Q", 0, 0}, 431 | { XK_F27, XK_NO_MOD, "\033[1;5R", 0, 0}, 432 | { XK_F28, XK_NO_MOD, "\033[1;5S", 0, 0}, 433 | { XK_F29, XK_NO_MOD, "\033[15;5~", 0, 0}, 434 | { XK_F30, XK_NO_MOD, "\033[17;5~", 0, 0}, 435 | { XK_F31, XK_NO_MOD, "\033[18;5~", 0, 0}, 436 | { XK_F32, XK_NO_MOD, "\033[19;5~", 0, 0}, 437 | { XK_F33, XK_NO_MOD, "\033[20;5~", 0, 0}, 438 | { XK_F34, XK_NO_MOD, "\033[21;5~", 0, 0}, 439 | { XK_F35, XK_NO_MOD, "\033[23;5~", 0, 0}, 440 | }; 441 | 442 | /* 443 | * Selection types' masks. 444 | * Use the same masks as usual. 445 | * Button1Mask is always unset, to make masks match between ButtonPress. 446 | * ButtonRelease and MotionNotify. 447 | * If no match is found, regular selection is used. 448 | */ 449 | static uint selmasks[] = { 450 | [SEL_RECTANGULAR] = Mod1Mask, 451 | }; 452 | 453 | /* 454 | * Printable characters in ASCII, used to estimate the advance width 455 | * of single wide characters. 456 | */ 457 | static char ascii_printable[] = 458 | " !\"#$%&'()*+,-./0123456789:;<=>?" 459 | "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" 460 | "`abcdefghijklmnopqrstuvwxyz{|}~"; 461 | -------------------------------------------------------------------------------- /st/st-no_bold_colors-20160727-308bfbf.diff: -------------------------------------------------------------------------------- 1 | diff --git a/st.c b/st.c 2 | index 2594c65..f6fe717 100644 3 | --- a/x.c 4 | +++ b/x.c 5 | @@ -3719,7 +3719,7 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i 6 | 7 | /* Change basic system colors [0-7] to bright system colors [8-15] */ 8 | if ((base.mode & ATTR_BOLD_FAINT) == ATTR_BOLD && BETWEEN(base.fg, 0, 7)) 9 | - fg = &dc.col[base.fg + 8]; 10 | + fg = &dc.col[base.fg]; 11 | 12 | if (IS_SET(MODE_REVERSE)) { 13 | if (fg == &dc.col[defaultfg]) { 14 | -------------------------------------------------------------------------------- /surf.diff: -------------------------------------------------------------------------------- 1 | diff --git a/config.def.h b/config.def.h 2 | index 6d3135e..70a8d90 100644 3 | --- a/config.def.h 4 | +++ b/config.def.h 5 | @@ -32,7 +32,7 @@ static Parameter defconfig[ParameterLast] = { 6 | SETV(SpellLanguages, ((char *[]){ "en_US", NULL })), 7 | SETB(StrictSSL, 0), 8 | SETB(Style, 1), 9 | - SETF(ZoomLevel, 1.0), 10 | + SETF(ZoomLevel, 2.0), 11 | }; 12 | 13 | static UriParameters uriparams[] = { 14 | @@ -58,7 +58,7 @@ static WebKitFindOptions findopts = WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE | 15 | /* DOWNLOAD(URI, referer) */ 16 | #define DOWNLOAD(d, r) { \ 17 | .v = (const char *[]){ "/bin/sh", "-c", \ 18 | - "st -e /bin/sh -c \"curl -g -L -J -O --user-agent '$1'" \ 19 | + "st -e /bin/sh -c \"cd ~/downloads; curl -g -L -J -O --user-agent '$1'" \ 20 | " --referer '$2' -b $3 -c $3 '$0';" \ 21 | " sleep 5;\"", \ 22 | d, useragent, r, cookiefile, NULL \ 23 | @@ -106,7 +106,6 @@ static Key keys[] = { 24 | { MODKEY, GDK_KEY_slash, spawn, SETPROP("_SURF_FIND", "_SURF_FIND") }, 25 | 26 | { 0, GDK_KEY_Escape, stop, { 0 } }, 27 | - { MODKEY, GDK_KEY_c, stop, { 0 } }, 28 | 29 | { MODKEY|GDK_SHIFT_MASK, GDK_KEY_r, reload, { .b = 1 } }, 30 | { MODKEY, GDK_KEY_r, reload, { .b = 0 } }, 31 | @@ -121,15 +120,12 @@ static Key keys[] = { 32 | { MODKEY, GDK_KEY_k, scroll, { .i = 'u' } }, 33 | { MODKEY, GDK_KEY_b, scroll, { .i = 'U' } }, 34 | { MODKEY, GDK_KEY_space, scroll, { .i = 'D' } }, 35 | - { MODKEY, GDK_KEY_i, scroll, { .i = 'r' } }, 36 | - { MODKEY, GDK_KEY_u, scroll, { .i = 'l' } }, 37 | + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_j, scroll, { .i = 'r' } }, 38 | + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_k, scroll, { .i = 'l' } }, 39 | 40 | - 41 | - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_j, zoom, { .i = -1 } }, 42 | - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_k, zoom, { .i = +1 } }, 43 | { MODKEY|GDK_SHIFT_MASK, GDK_KEY_q, zoom, { .i = 0 } }, 44 | { MODKEY, GDK_KEY_minus, zoom, { .i = -1 } }, 45 | - { MODKEY, GDK_KEY_plus, zoom, { .i = +1 } }, 46 | + { MODKEY, GDK_KEY_equal, zoom, { .i = +1 } }, 47 | 48 | { MODKEY, GDK_KEY_p, clipboard, { .b = 1 } }, 49 | { MODKEY, GDK_KEY_y, clipboard, { .b = 0 } }, 50 | @@ -141,7 +137,7 @@ static Key keys[] = { 51 | 52 | { MODKEY|GDK_SHIFT_MASK, GDK_KEY_a, togglecookiepolicy, { 0 } }, 53 | { 0, GDK_KEY_F11, togglefullscreen, { 0 } }, 54 | - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_o, toggleinspector, { 0 } }, 55 | + { MODKEY, GDK_KEY_i, toggleinspector, { 0 } }, 56 | 57 | { MODKEY|GDK_SHIFT_MASK, GDK_KEY_c, toggle, { .i = CaretBrowsing } }, 58 | { MODKEY|GDK_SHIFT_MASK, GDK_KEY_f, toggle, { .i = FrameFlattening } }, 59 | @@ -159,8 +155,19 @@ static Button buttons[] = { 60 | /* target event mask button function argument stop event */ 61 | { OnLink, 0, 2, clicknewwindow, { .b = 0 }, 1 }, 62 | { OnLink, MODKEY, 2, clicknewwindow, { .b = 1 }, 1 }, 63 | - { OnLink, MODKEY, 1, clicknewwindow, { .b = 1 }, 1 }, 64 | + { OnLink, MODKEY, 1, clicknewwindow, { .b = 0 }, 1 }, 65 | { OnAny, 0, 8, clicknavigate, { .i = -1 }, 1 }, 66 | { OnAny, 0, 9, clicknavigate, { .i = +1 }, 1 }, 67 | { OnMedia, MODKEY, 1, clickexternplayer, { 0 }, 1 }, 68 | }; 69 | + 70 | +static SearchEngine searchengines[] = { 71 | + { "g", "https://encrypted.google.com/search?q=%s"}, 72 | + { "w", "https://en.wikipedia.org/w/index.php?search=%s"}, 73 | + { "h", "https://hackage.haskell.org/packages/search?terms=%s"}, 74 | + { "hh", "https://hackage.haskell.org/package/%s"}, 75 | + { "ghl", "https://github.com/luke-clifton/%s"}, 76 | + { "gh", "https://github.com/%s"}, 77 | + { "c", "https://crates.io/search?q=%s"}, 78 | +}; 79 | + 80 | diff --git a/surf.c b/surf.c 81 | index 93a1629..19561c6 100644 82 | --- a/surf.c 83 | +++ b/surf.c 84 | @@ -129,6 +129,11 @@ typedef struct { 85 | } Button; 86 | 87 | typedef struct { 88 | + char *token; 89 | + char *uri; 90 | +} SearchEngine; 91 | + 92 | +typedef struct { 93 | const char *uri; 94 | Parameter config[ParameterLast]; 95 | regex_t re; 96 | @@ -202,6 +207,7 @@ static void responsereceived(WebKitDownload *d, GParamSpec *ps, Client *c); 97 | static void download(Client *c, WebKitURIResponse *r); 98 | static void closeview(WebKitWebView *v, Client *c); 99 | static void destroywin(GtkWidget* w, Client *c); 100 | +static gchar *parseuri(const gchar *uri); 101 | 102 | /* Hotkeys */ 103 | static void pasteuri(GtkClipboard *clipboard, const char *text, gpointer d); 104 | @@ -473,11 +479,8 @@ loaduri(Client *c, const Arg *a) 105 | g_str_has_prefix(uri, "file://") || 106 | g_str_has_prefix(uri, "about:")) { 107 | url = g_strdup(uri); 108 | - } else if (!stat(uri, &st) && (path = realpath(uri, NULL))) { 109 | - url = g_strdup_printf("file://%s", path); 110 | - free(path); 111 | } else { 112 | - url = g_strdup_printf("http://%s", uri); 113 | + url = parseuri(uri); 114 | } 115 | 116 | setatom(c, AtomUri, url); 117 | @@ -1461,6 +1464,22 @@ destroywin(GtkWidget* w, Client *c) 118 | gtk_main_quit(); 119 | } 120 | 121 | +gchar * 122 | +parseuri(const gchar *uri) { 123 | + guint i; 124 | + 125 | + for (i = 0; i < LENGTH(searchengines); i++) { 126 | + if (searchengines[i].token == NULL || searchengines[i].uri == NULL || 127 | + *(uri + strlen(searchengines[i].token)) != ' ') 128 | + continue; 129 | + if (g_str_has_prefix(uri, searchengines[i].token)) 130 | + return g_strdup_printf(searchengines[i].uri, 131 | + uri + strlen(searchengines[i].token) + 1); 132 | + } 133 | + 134 | + return g_strdup_printf("https://%s", uri); 135 | +} 136 | + 137 | void 138 | pasteuri(GtkClipboard *clipboard, const char *text, gpointer d) 139 | { 140 | @@ -1509,7 +1528,7 @@ zoom(Client *c, const Arg *a) 141 | webkit_web_view_set_zoom_level(c->view, 142 | curconfig[ZoomLevel].val.f - 0.1); 143 | else 144 | - webkit_web_view_set_zoom_level(c->view, 1.0); 145 | + webkit_web_view_set_zoom_level(c->view, 2.0); 146 | 147 | curconfig[ZoomLevel].val.f = webkit_web_view_get_zoom_level(c->view); 148 | } 149 | @@ -1527,6 +1546,7 @@ scroll(Client *c, const Arg *a) 150 | switch (a->i) { 151 | case 'd': 152 | ev->key.keyval = GDK_KEY_Down; 153 | + gdk_event_put(ev); 154 | break; 155 | case 'D': 156 | ev->key.keyval = GDK_KEY_Page_Down; 157 | @@ -1542,6 +1562,7 @@ scroll(Client *c, const Arg *a) 158 | break; 159 | case 'u': 160 | ev->key.keyval = GDK_KEY_Up; 161 | + gdk_event_put(ev); 162 | break; 163 | } 164 | 165 | -------------------------------------------------------------------------------- /vimx.nix: -------------------------------------------------------------------------------- 1 | pkgs: with pkgs; pkgs.vim_configurable.customize { 2 | name = "vimx"; 3 | vimrcConfig.vam.knownPlugins = pkgs.vimPlugins; 4 | vimrcConfig.vam.pluginDictionaries = [ 5 | { name = "colors-solarized"; } 6 | { name = "fugitive"; } 7 | ]; 8 | vimrcConfig.customRC = '' 9 | set hidden 10 | set colorcolumn=80 11 | set backspace=2 12 | set autoindent 13 | filetype on 14 | filetype plugin on 15 | filetype indent off 16 | autocmd FileType haskell setlocal expandtab 17 | autocmd FileType haskell setlocal tabstop=4 18 | autocmd FileType haskell setlocal shiftwidth=4 19 | autocmd FileType haskell setlocal smarttab 20 | ''; 21 | } 22 | -------------------------------------------------------------------------------- /withGhc.nix: -------------------------------------------------------------------------------- 1 | {pkgs}: 2 | with pkgs; 3 | 4 | writeScriptBin "ghcWith" '' 5 | #! ${bash}/bin/bash 6 | PKGS=() 7 | 8 | for i in "$@" 9 | do 10 | shift 11 | if [ "$i" = '--' ] 12 | then 13 | break 14 | else 15 | PKGS+=($i) 16 | fi 17 | done 18 | set -x 19 | PSTR="haskellPackages.ghcWithPackages (p: with p; [ ''${PKGS[*]} ])" 20 | if [ -n "$*" ] 21 | then 22 | exec ${nix}/bin/nix-shell -p "$PSTR" --run "$*" 23 | else 24 | exec ${nix}/bin/nix-shell -p "$PSTR" 25 | fi 26 | '' 27 | --------------------------------------------------------------------------------