Skip to content

Latest commit

 

History

History
1367 lines (1141 loc) · 32.3 KB

README.org

File metadata and controls

1367 lines (1141 loc) · 32.3 KB

Hi there! That’s my dotfiles. Most of config files are now generated by org-babel from this file (yes, from README.org). That’s literate programming applied to dotfiles. To generate all files you can open this file in emacs and press M-x org-babel-tangle. Or from command line with:

emacs README.org --batch -f org-babel-tangle

I keep this document in sync with generated config files just in case I won’t have access to my emacs. However, I recommend against looking at them—they’re just a generated mess; you’ll have much better time reading this doc instead—trust me.

Pieces not (yet) covered in this document are:

  • emacs configuration at .emacs.d/;
  • vim configuration at .vimrc and .vim/;
  • awesome wm configuration at .config/awesome/;
  • scripts at bin/;
  • irssi config at .irssi;

NixOS

I’m a NixOS user. What’s cool about it is that I can describe all my system configuration in one file (/etc/nixos/configuration.nix), so I can just copy it to other machine, call nixos-rebuild and have system with the same software, system settings, etc.

It looks like this:

{ config, pkgs, ... }:
{
  imports = [
    {
      nixpkgs.config.allowUnfree = true;

      # The NixOS release to be compatible with for stateful data such as databases.
      system.stateVersion = "15.09";
    }

    <<nixos-section>>
  ];
}

This <<nixos-section>> is replaced by other parts of this doc.

Default locations

This moves nixos configuration from the default location to the dotfiles/nixos/configuration.nix.

This also disables channel mechanism and makes nixos use Nixpkgs in the dotfiles/channels directory. I usually follow nixpkgs-unstable, but that gives me more control.

{
  nix.nixPath =
    let dotfiles = "/home/rasen/dotfiles";
    in [
      "nixos-config=${dotfiles}/nixos/configuration.nix"
      "dotfiles=${dotfiles}"
      "${dotfiles}/channels"
    ];
}

If you want to override default configuration location, use -I flag:

sudo nixos-rebuild switch -I nixos-config=/etc/nixos/configuration.nix

Save config

Save nixos-config in the Nix store, so I can later retrieve it. The config for the current system is located at /var/run/current-system/configuration.nix.

{
  system.copySystemConfiguration = true;
}

Users

I’m the only user of the system:

{
  users.extraUsers.rasen = {
    isNormalUser = true;
    uid = 1000;
    extraGroups = [ "users" "wheel" ];
    initialPassword = "HelloWorld";
  };
}

initialPassword is used only first time when user is created. It must be changed as soon as possible with passwd.

Machines

I have two machines. Currently, only one is running NixOS, but I hope to eventually transfer the second one to NixOS, too.

Larry

This one is a laptop that needs the proprietary driver for Wi-Fi card (this wl and broadcom_sta).

{
  imports = [ <nixpkgs/nixos/modules/installer/scan/not-detected.nix> ];

  boot.initrd.availableKernelModules = [ "ahci" "xhci_hcd" ];
  boot.initrd.kernelModules = [ "wl" ];

  boot.kernelModules = [ "kvm-intel" "wl" ];
  boot.extraModulePackages = [ config.boot.kernelPackages.broadcom_sta ];
}

I have two partitions (usual “separate home” setup).

{
  fileSystems = {
    "/" = {
      device = "/dev/disk/by-uuid/ba82dd25-a9e5-436f-ae76-4ee44d53b2c6";
      fsType = "ext4";
    };
    "/home" = {
      device = "/dev/disk/by-uuid/b27c07d0-aaf7-44a1-87e1-5a2cb30954ec";
      fsType = "ext4";
    };
  };
}

There are also two swap partitions, but one of them is from my slow hdd, so I probably shouldn’t use it.

{
  swapDevices = [
    # TODO: set priority
    # { device = "/dev/disk/by-uuid/f0bd0438-3324-4295-9981-07015fa0af5e"; }
    { device = "/dev/disk/by-uuid/75822d9d-c5f0-495f-b089-f57d0de5246d"; }
  ];
}

There is also Gentoo on the second drive—it’s good to keep it bootable.

{
  boot.loader.grub = {
    enable = true;
    version = 2;
    device = "/dev/sda";
    extraEntries = ''
      menuentry 'Gentoo' {
        configfile (hd1,1)/grub2/grub.cfg
      }
    '';
  };
}

Boring stuff: 8 hyper-threads, networking (wicd), synaptics (Larry is a laptop).

{
  nix.maxJobs = 8;
  nix.buildCores = 8;

  networking = {
    hostName = "Larry";

    useDHCP = false;
    wicd.enable = true;
    wireless.enable = false;
  };

  services.xserver.synaptics = {
    enable = true;
    twoFingerScroll = true;
    vertEdgeScroll = true;
  };
}

I have nvidia video card and integrated intel-one. I don’t use nvidia one, so next the line disables it:

{
  hardware.nvidiaOptimus.disable = true;
}

Local overlay

As a responsible NixOS user, I refuse to install software blindly with sudo make install. That’s why I should write my own nix-expressions. I keep them in my local overlay until they’re merged upstream.

The entry is just a set of all my packages in nixpkgs-local/default.nix:

{ pkgs ? import <nixpkgs> { } }:

let
  callPackage = pkgs.lib.callPackageWith (pkgs // pkgs.xlibs // self);

  pythonPackages = pkgs.pythonPackages // rec {
    <<nixpkgs-local-python-packages>>
  };

  self = rec {
    <<nixpkgs-local-packages>>
  };

in self

You can install all packages to current user with:

nix-env -f nixpkgs-local/default.nix -i

To make package results testing better, I build them in isolated environment (for more info, see nixos manual):

{
  nix.useSandbox = true;
}

rust-nightly

Won’t submit. As nighties are unstable, it’s unlikely it will be at nixpkgs.

Rust wiki recommends using Ericson2314’s rustc-nightly package. However, it doesn’t pack libstd.

You can get hash with the following command:

nix-prefetch-url --type sha256 https://static.rust-lang.org/dist/$date/rust-nightly-x86_64-unknown-linux-gnu.tar.gz
rust-nightly = callPackage ./pkgs/rust-nightly {
  date = "2016-05-28";
  # TODO: hash should be different depending on the system
  hash = "0f9rx672v97f5bn6mnb1dgyczyf5f8vcjp55yvasflvln1w64krv";
};
{ date, hash
, stdenv, fetchurl, zlib }:

let
  target =
    if stdenv.system == "i686-linux" then "i686-unknown-linux-gnu" else
    if stdenv.system == "x86_64-linux" then "x86_64-unknown-linux-gnu" else
    if stdenv.system == "i686-darwin" then "i868-apple-darwin" else
    if stdenv.system == "x86_64-darwin" then "x86_64-apple-darwin" else
    abort "no snapshot to bootstrap for this platfrom (missing target triple)";

in stdenv.mkDerivation rec {
  name = "rust-nightly-${date}";

  src = fetchurl {
    url = "https://static.rust-lang.org/dist/${date}/rust-nightly-${target}.tar.gz";
    sha256 = hash;
  };

  installPhase = ''
    ./install.sh --prefix=$out --disable-ldconfig --without=rust-docs
  '';

  dontStrip = true;

  preFixup = if stdenv.isLinux then let
    rpath = stdenv.lib.concatStringsSep ":" [
      "$out/lib"
      (stdenv.lib.makeLibraryPath [ zlib ])
      ''${stdenv.cc.cc}/lib${stdenv.lib.optionalString stdenv.is64bit "64"}''
    ];
  in
  ''
    for executable in ${stdenv.lib.concatMapStringsSep " " (s: "$out/bin/" + s) [ "cargo" "rustc" "rustdoc" ]}; do
      patchelf --interpreter "${stdenv.glibc.out}/lib/${stdenv.cc.dynamicLinker}" \
        --set-rpath "${rpath}" \
        "$executable"
    done
    for library in $out/lib/*.so; do
      patchelf --set-rpath "${rpath}" "$library"
    done
  '' else "";
}

Services

OpenVPN

All my computers are members of the VPN:

{
  services.openvpn.servers = {
    kaa.config = ''
      client
      dev tap
      port 22
      proto tcp
      tls-client
      persist-key
      persist-tun
      ns-cert-type server
      remote vpn.kaa.org.ua
      ca /root/.vpn/ca.crt
      key /root/.vpn/alexey.shmalko.key
      cert /root/.vpn/alexey.shmalko.crt
    '';
  };
}

Avahi is needed to allow resolution of .local names. For example, you can access this computer by larry.local if we meet at the same local network.

{
  services.avahi = {
    enable = true;
    browseDomains = [ ];
    interfaces = [ "tap0" ];
    nssmdns = true;
    publish = {
      enable = true;
      addresses = true;
    };
  };
}

The following lines are needed to start avahi-daemon automatically. The default service is wantedBy “if-up.target” which doesn’t seem to be activated (maybe because of wicd).

{
  systemd.services.avahi-daemon.wantedBy = [ "multi-user.target" ];
  systemd.services.avahi-daemon.after = [ "openvpn-kaa.target" ];
}

SSH

{
  services.openssh = {
    enable = true;
    passwordAuthentication = false;

    # Disable default firewall rules
    ports = [];
    listenAddresses = [
      { addr = "0.0.0.0"; port = 22; }
    ];
  };

  # allow ssh from VPN network only
  networking.firewall = {
    extraCommands = ''
      ip46tables -D INPUT -i tap0 -p tcp -m tcp --dport 22 -j ACCEPT 2> /dev/null || true
      ip46tables -A INPUT -i tap0 -p tcp -m tcp --dport 22 -j ACCEPT
    '';
  };
}

Mosh

Mosh (mobile shell) is a cool addition to ssh.

{
  programs.mosh.enable = true;
}

Gitolite

I host some git repos on my machines:

{
  services.gitolite = {
    enable = true;
    adminPubkey = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJhMhxIwZJgIY6CNSNEH+BetF/WCUtDFY2KTIl8LcvXNHZTh4ZMc5shTOS/ROT4aH8Awbm0NjMdW33J5tFMN8T7q89YZS8hbBjLEh8J04Y+kndjnllDXU6NnIr/AenMPIZxJZtSvWYx+f3oO6thvkZYcyzxvA5Vi6V1cGx6ni0Kizq/WV/mE/P1nNbwuN3C4lCtiBC9duvoNhp65PctQNohnKQs0vpQcqVlfqBsjQ7hhj2Fjg+Ofmt5NkL+NhKQNqfkYN5QyIAulucjmFAieKR4qQBABopl2F6f8D9IjY8yH46OCrgss4WTf+wxW4EBw/QEfNoKWkgVoZtxXP5pqAz rasen@Larry";
  };
}

dnsmasq

Use dnsmasq as a DNS cache.

{
  services.dnsmasq = {
    enable = true;

    # These are used in addition to resolv.conf
    servers = [ "8.8.8.8" "8.8.4.4" ];

    extraConfig = ''
      listen-address=127.0.0.1
      cache-size=1000

      no-negcache
    '';
  };

  # Put the text in /etc/resolv.conf.head
  #
  # That will prepend dnsmasq server to /etc/resolv.conf (dhcpcd-specific)
  environment.etc."resolv.conf.head".text = ''
    nameserver 127.0.0.1
  '';
}

Firewall

{
  networking.firewall = {
    enable = true;
    allowPing = false;

    connectionTrackingModules = [];
    autoLoadConntrackHelpers = false;
  };
}

Environment

General

I definitely use X server:

{
  services.xserver.enable = true;
}

Use English as my only supported locale:

{
  i18n.supportedLocales = [ "en_US.UTF-8/UTF-8" ];
}

Setup timezone:

{
  time.timeZone = "Europe/Kiev";
}

Login manager

I use SLiM. It stands for Simple Login Manager. It’s fast and has little dependencies. The projects is dead since 2014, but still works fine, so I keep using it.

{
  services.xserver.displayManager.slim.enable = true;
}

Window manager

I use awesome wm:

{
  services.xserver.windowManager.awesome = {
    enable = true;
    luaModules = [ pkgs.luaPackages.luafilesystem ];
  };
}

Disabling xterm makes awesome wm a default choice in slim:

{
  services.xserver.desktopManager.xterm.enable = false;
}

These packages are used by my awesome wm setup:

{
  environment.systemPackages = [
    pkgs.wmname
    pkgs.kbdd
    pkgs.xclip
    pkgs.scrot
  ];
}

Keyboard

Layouts

I use English, Russian, and Ukrainian layouts:

{
  services.xserver.layout = "us,ru,ua";
}

I toggle between them with either Caps Lock, or Menu key—I have two different keyboards, and one doesn’t have Menu when Caps Lock is too far on the second. I never use Caps Lock–the feature, so it’s nice to have Caps LED indicate alternate layouts.

{
  services.xserver.xkbOptions = "grp:caps_toggle,grp:menu_toggle,grp_led:caps";
}

Layout indicator

I use xxkb as a keyboard indicator.

{
  environment.systemPackages = [
    pkgs.xxkb
  ];
}

Its settings are saved in .xxkbrc file. Xxkb just sits in the tray and displays layout image.

XXkb.image.path: /home/rasen/.config/xxkb

XXkb.mainwindow.enable: yes
XXkb.mainwindow.type: tray
XXkb.mainwindow.geometry: 17x14+0+0
XXkb.mainwindow.image.1: en.svg
XXkb.mainwindow.image.2: ru.svg
XXkb.mainwindow.image.3: ua.svg
XXkb.mainwindow.image.4:

XXkb.*.label.enable: no

XXkb.button.enable: no

XXkb.controls.add_when_start: yes
XXkb.controls.add_when_create: yes
XXkb.controls.add_when_change: no
XXkb.controls.focusout: no
XXkb.controls.button_delete: no
XXkb.controls.button_delete_and_forget: yes
XXkb.controls.mainwindow_delete: no

XXkb.mousebutton.1.reverse: no
XXkb.mousebutton.3.reverse: no

XXkb.bell.enable: no

XXkb.ignore.reverse: no

TODO make path relative

The following enables two-state mode—in that mode xxkb switches between one base (English) and one alternative layout (Russian or Ukrainian). Switching of alternate layouts is implemented in awesome wm config.

XXkb.controls.two_state: yes
XXkb.group.base: 1
XXkb.group.alt: 2

Redshift

Redshift adjusts the color temperature of the screen according to the position of the sun. That should improve my sleep.

{
  services.redshift = {
    enable = true;
    latitude = "50.4500";
    longitude = "30.5233";
  };
}

Look and Feel

Qt theme

This makes apps look like in KDE:

{
  environment.systemPackages = [
    pkgs.kde4.oxygen_icons
    pkgs.kde4.kwin_styles
  ];
}

Gtk theme

I like consistency, so oxygen-gtk is a nice choice:

{
  environment.systemPackages = [ pkgs.oxygen-gtk2 pkgs.oxygen-gtk3 ];

  environment.shellInit = ''
    export GTK_PATH=$GTK_PATH:${pkgs.oxygen_gtk}/lib/gtk-2.0
    export GTK2_RC_FILES=$GTK2_RC_FILES:${pkgs.oxygen_gtk}/share/themes/oxygen-gtk/gtk-2.0/gtkrc
  '';
}

Find a way to make deadbeef use oxygen theme

The theme has some issues with deadbeef, so I install adwaita icons to make deadbeef usable.

{
  environment.systemPackages = [
    pkgs.gnome3.adwaita-icon-theme
  ];
}

Fonts

I’m not a font guru, so I just stuffed a bunch of random fonts here.

{
  fonts = {
    enableCoreFonts = true;
    enableFontDir = true;
    enableGhostscriptFonts = false;

    fonts = with pkgs; [
      inconsolata
      corefonts
      dejavu_fonts
      source-code-pro
      ubuntu_font_family
      unifont
    ];
  };
}

Applications

Here go applications (almost) every normal user needs.

KDE apps

I don’t use full KDE but some apps are definitely nice.

{
  environment.systemPackages = [
    pkgs.kde4.gwenview
    pkgs.kde4.kde_baseapps # <-- dolphin
    pkgs.kde4.kde_runtime
    pkgs.kde4.kfilemetadata
    pkgs.kde4.filelight
    pkgs.shared_mime_info
  ];
}

KDE apps may have issues with mime types without this:

{
  environment.pathsToLink = [ "/share" ];
}

Firefox

Though my default browser is google-chrome, it has issues with Java plugin, so I use firefox for that:

{
  environment.systemPackages = [
    pkgs.firefoxWrapper
  ];
}

The following enables jre support:

{
  nixpkgs.config.firefox.jre = true;
}

The default java plugin (pkgs.oraclejdk8) has issues building, so use open alternative for now. (Actually, it works better with my windom manager so I think I’ll stick with it for a while.)

{
  nixpkgs.config.packageOverrides = pkgs: rec {
    jrePlugin = pkgs.icedtea_web;
  };
}

Zathura

Zathura is a cool document viewer with Vim-like bindings.

{
  environment.systemPackages = [
    pkgs.zathura
  ];
}

Enable incremental search (Zathura’s config goes to ~/.config/zathura/zathurarc).

set incremental-search true

Other applications

Don’t require additional setup.

{
  environment.systemPackages = [
    pkgs.google-chrome
    pkgs.skype
    pkgs.libreoffice
    pkgs.qbittorrent
    pkgs.calibre
    pkgs.mnemosyne
    pkgs.deadbeef
    pkgs.wine
    pkgs.vlc
    pkgs.mplayer
    pkgs.smplayer
    pkgs.gparted
    pkgs.unetbootin
    pkgs.kvm
    pkgs.thunderbird
    pkgs.xscreensaver
    pkgs.xss-lock
    pkgs.alarm-clock-applet
  ];
}

Development

Editors

I’m a seasoned Vim user, but I’ve switched to emacs now.

{
  environment.systemPackages = [
    (pkgs.vim_configurable.override { python3 = true; })
    pkgs.emacs
  ];
}

The following packages are needed for emacs plugins:

{
  environment.systemPackages = [
    pkgs.ycmd
    pkgs.rustracer
    pkgs.ditaa
    pkgs.jre
  ];
}

rxvt-unicode

I use urxvt as my terminal emulator:

{
  environment.systemPackages = [
    pkgs.rxvt_unicode
  ];
}

Urxvt gets its setting from .Xresources file. If you ever want to reload it on-the-fly, type the following (or press C-c C-c if you’re in emacs):

xrdb ~/.Xresources

General setup

See rxvt-unicode documentation for the full reference.

urxvt.loginShell:         true
urxvt.saveLines:         65535
urxvt.urgentOnBell:       true

urxvt.scrollBar:         false
urxvt.scrollTtyOutput:   false
urxvt.scrollTtyKeypress:  true
urxvt.secondaryScroll:    true

The next piece disables annoying message when pressing Ctrl+Shift:

urxvt.iso14755: False

Copy-paste with Ctrl+Shift+C, Ctrl+Shift+V:

From urxvt-perls:

Since version 9.20 rxvt-unicode natively supports copying to and pasting from the CLIPBOARD buffer with the Ctrl-Meta-c and Ctrl-Meta-v key bindings. The clipboard.autocopy setting is provided by the selection_to_clipboard extension shipped with rxvt-unicode.

That means, I don’t need perl extensions at all.

Font

I use Terminus font.

{
  fonts = {
    fonts = [
      pkgs.powerline-fonts
      pkgs.terminus_font
    ];
  };
}
URxvt.font: xft:Terminus:normal:size=12

Color theme

I like Molokai color theme.

URxvt*background: #101010
URxvt*foreground: #d0d0d0
URxvt*color0:     #101010
URxvt*color1:     #960050
URxvt*color2:     #66aa11
URxvt*color3:     #c47f2c
URxvt*color4:     #30309b
URxvt*color5:     #7e40a5
URxvt*color6:     #3579a8
URxvt*color7:     #9999aa
URxvt*color8:     #303030
URxvt*color9:     #ff0090
URxvt*color10:    #80ff00
URxvt*color11:    #ffba68
URxvt*color12:    #5f5fee
URxvt*color13:    #bb88dd
URxvt*color14:    #4eb4fa
URxvt*color15:    #d0d0d0

fish

fish is a cool shell, but I haven’t yet configured it properly to switch to it for my day-to-day work.

{
  programs.fish.enable = true;
}

Zsh

Zsh is my default shell:

{
  programs.zsh.enable = true;

  users.defaultUserShell = "/run/current-system/sw/bin/zsh";
}

Prompt

My prompt looks like this (though, the font is different; colors are also wrong at GitHub):

rasen@Larry directory(master|+8…) % command [0] 1:25
source $HOME/.zsh/git-prompt/zshrc.sh

PROMPT='%B%F{green}%n@%m%k %B%F{blue}%1~%b$(git_super_status) %B%F{blue}%# %b%f%k'
RPROMPT="[%?] %T"

The ~/.zsh/git-prompt/ is a submodule, so don’t forget to initialize it!

git submodule update --init --recursive

Aliases

Nothing special, but g=git is a real timesaver.

alias ls='ls --color=auto'
alias grep='grep --color=auto'

alias g="git"

PATH

Install stuff in ~/.local/; ~/bin/ is for my helper scripts (linked to bin directory in dotfiles repo).

export PATH="${HOME}/bin:${PATH}"
export PATH="${HOME}/.local/bin:${PATH}"

export LD_LIBRARY_PATH="${HOME}/.local/lib:${LD_LIBRARY_PATH}"

Other

This part was written long time ago; I’m not sure I understand and use all of it:

autoload -U compinit promptinit
autoload -U colors
compinit
promptinit
colors

# Lines configured by zsh-newuser-install
HISTFILE=~/.histfile
HISTSIZE=1000
SAVEHIST=1000
setopt appendhistory autocd
unsetopt beep
bindkey -e
# End of lines configured by zsh-newuser-install
# The following lines were added by compinstall
zstyle :compinstall filename '/home/rasen/.zshrc'

zstyle ':completion:*:descriptions' format '%U%B%d%b%u'
zstyle ':completion:*:warnings' format '%BSorry, no matches for: %d%b'

setopt correct
setopt hist_ignore_space
setopt hist_ignore_all_dups
setopt extendedglob

setopt listpacked

zstyle ':completion:*' use-cache on
zstyle ':completion:*' cache-path ~/.zsh/cache

zstyle ':completion:*' completer _complete _match _approximate
zstyle ':completion:*:match:*' original only
zstyle ':completion:*:approximate:*' max-errors 1 numeric

zstyle ':completion:*:functions' ignored-patters '_*'

xdvi() { command xdvi ${*:-*.dvi(om[1])} }
zstyle ':completion:*:*:xdvi:*' menu yes select
zstyle ':completion:*:*:xdvi:*' file-sort time

zstyle ':completion:*' squeeze-slashes true

# End of lines added by compinstall
# create a zkbd compatible hash;
# to add other keys to this hash, see: man 5 terminfo
typeset -A key

key[Home]=${terminfo[khome]}

key[End]=${terminfo[kend]}
key[Insert]=${terminfo[kich1]}
key[Delete]=${terminfo[kdch1]}
key[Up]=${terminfo[kcuu1]}
key[Down]=${terminfo[kcud1]}
key[Left]=${terminfo[kcub1]}
key[Right]=${terminfo[kcuf1]}
key[PageUp]=${terminfo[kpp]}
key[PageDown]=${terminfo[knp]}

# setup key accordingly
[[ -n "${key[Home]}"    ]]  && bindkey  "${key[Home]}"    beginning-of-line
[[ -n "${key[End]}"     ]]  && bindkey  "${key[End]}"     end-of-line
[[ -n "${key[Insert]}"  ]]  && bindkey  "${key[Insert]}"  overwrite-mode
[[ -n "${key[Delete]}"  ]]  && bindkey  "${key[Delete]}"  delete-char
[[ -n "${key[Up]}"      ]]  && bindkey  "${key[Up]}"      up-line-or-history
[[ -n "${key[Down]}"    ]]  && bindkey  "${key[Down]}"    down-line-or-history
[[ -n "${key[Left]}"    ]]  && bindkey  "${key[Left]}"    backward-char
[[ -n "${key[Right]}"   ]]  && bindkey  "${key[Right]}"   forward-char

# Finally, make sure the terminal is in application mode, when zle is
# active. Only then are the values from $terminfo valid.
if (( ${+terminfo[smkx]} )) && (( ${+terminfo[rmkx]} )); then
    function zle-line-init () {
        printf '%s' "${terminfo[smkx]}"
    }
    function zle-line-finish () {
        printf '%s' "${terminfo[rmkx]}"
    }
    zle -N zle-line-init
    zle -N zle-line-finish
fi

TODO review this

git

{
  environment.systemPackages = [
    pkgs.gitFull
    pkgs.gitg
  ];
}

Basic info: my name, email, ui, editor, rerere.

[user]
    name = Alexey Shmalko
    email = rasen.dubi@gmail.com

[sendemail]
    smtpencryption = ssl
    smtpserver = smtp.gmail.com
    smtpuser = rasen.dubi@gmail.com
    smtpserverport = 465

[color]
    ui = true

[core]
    editor = vim

[push]
    default = simple

[pull]
    ff = only

[rerere]
    enabled = true

Configure signing with gpg.

[user]
    signingkey = EB3066C3

[gpg]
    program = gpg2

[push]
    gpgSign = if-asked

I have LOTS of aliases:

[alias]
    cl  = clone
    gh-cl = gh-clone
    cr  = cr-fix
    p   = push
    pl  = pull
    f   = fetch
    fa  = fetch --all
    a   = add
    ap  = add -p
    d   = diff
    dl  = diff HEAD~ HEAD
    ds  = diff --staged
    l   = log --show-signature
    l1  = log -1
    lp  = log -p
    c   = commit
    ca  = commit --amend
    co  = checkout
    cb  = checkout -b
    cm  = checkout origin/master
    de  = checkout --detach
    br  = branch
    s   = status
    re  = reset --hard
    dp  = push origin HEAD:refs/drafts/master
    pp  = push origin HEAD:refs/publish/master
    r   = rebase
    rc  = rebase --continue
    ri  = rebase -i
    m   = merge
    t   = tag
    su  = submodule update --init --recursive
    bi  = bisect
    bg  = bisect good
    bb  = bisect bad
    bis = bisect start
    bir = bisect reset

Always push to github with ssh keys instead of login/password.

[url "git@github.com:"]
    pushInsteadOf = https://github.com/

The next is needed for proper resolving of GHC submodules:

[url "git://github.com/ghc/packages-"]
    insteadOf = git://github.com/ghc/packages/

tmux

{
  environment.systemPackages = [
    pkgs.tmux
  ];
}

I like C-a as a prefix.

set -g prefix C-a
unbind-key C-b
bind-key C-a send-prefix

TODO describe other settings

# To make vim work properly
set -g default-terminal "screen-256color"

set -g status-keys vi
setw -g mode-keys vi

set -g history-limit 10000

# Start numbering from 1
set -g base-index 1

# Allows for faster key repetition
set -s escape-time 0

bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

bind-key s split-window
bind-key v split-window -h

bind r source-file ~/.tmux.conf \; display-message "Config reloaded..."

set-window-option -g automatic-rename

Haskell

Needed to work with Haskell:

{
  environment.systemPackages = [
    pkgs.ghc
    pkgs.haskellPackages.ghc-mod
    pkgs.stack
    pkgs.cabal-install
    pkgs.cabal2nix
  ];
}

Embedded

The following packages provide compiler, ARM cross-compiler, debugger, and terminal.

{
  environment.systemPackages = [
    pkgs.gnumake
    pkgs.cmake
    pkgs.binutils
    pkgs.gcc
    pkgs.gcc-arm-embedded
    (pkgs.gdb.override { multitarget = true; })
    pkgs.minicom
    pkgs.openocd
    pkgs.expect
    pkgs.telnet
  ];
}

To allow user use openocd without sudo, we should add him to plugdev group and install openocd udev rules:

{
  users.extraGroups.plugdev = { };
  users.extraUsers.rasen.extraGroups = [ "plugdev" "dialout" ];

  services.udev.packages = [ pkgs.openocd ];
}

Arduino

I teach a course for children involving Arduino programming.

{
  environment.systemPackages = [
    pkgs.arduino
  ];
}

Other terminal goodies

{
  environment.systemPackages = [
    pkgs.wget
    pkgs.htop
    pkgs.psmisc
    pkgs.zip
    pkgs.unzip
    pkgs.unrar
    pkgs.p7zip
    pkgs.irssi
    pkgs.bind
    pkgs.file
    pkgs.which
    pkgs.whois
    pkgs.gnupg
    pkgs.utillinuxCurses

    pkgs.patchelf

    pkgs.man-pages
    pkgs.stdman
    pkgs.posix_man_pages
    pkgs.stdmanpages

    pkgs.nix-repl
    pkgs.nox
    pkgs.python
    pkgs.python3
  ];
}

Games

Steam

We need the following package:

{
  environment.systemPackages = [
    pkgs.steam
  ];
}

It’s also required to enable 32-bit support for opengl and pulseaudio:

{
  hardware.opengl.driSupport32Bit = true;
  hardware.pulseaudio.support32Bit = true;
}

Nethack

I play nethack rarely, but still nice to have my setting in sync.

{
  environment.systemPackages = [
    pkgs.nethack
  ];
}

The following sets my default name, selects a dog, and disables auto-pickup; the last line makes interface a bit friendlier.

OPTIONS=name:rasen
OPTIONS=pettype:dog, dogname:Fido
OPTIONS=!autopickup
OPTIONS=lit_corridor, DECgraphics, showscore, showexp, time, color, hilite_pet

Meta

Setup

There is a setup.sh script in this directory. It just links all files to $HOME:

FILES=".vimrc .vim .nvimrc .nvim .gitconfig .zshrc .zsh .tmux.conf .xxkbrc .Xresources .config/awesome .config/nvim .config/xxkb .nethackrc .emacs.d .ssh bin .config/zathura .irssi"

DEST=$1

if [ -z "$DEST" ]; then
    DEST="$HOME"
fi

BASE=$(cd "$(dirname "$0")" && pwd)

ask_install() {
    FILENAME=$1

    LINK="$DEST/$FILENAME"
    TARGET="$BASE/$FILENAME"

    if [ -e $LINK ]; then
        echo "$LINK exists. Skipping..."
    else
        read -r -p "Link $LINK to $TARGET? [y/N] " response
        case $response in
            [yY][eE][sS]|[yY])
                ln -v -s "$TARGET" "$LINK"
                ;;
        esac
    fi
}

for FILE in $FILES; do
    ask_install $FILE
done

Decrypt keys.

if [ ! -f "$BASE/.ssh/id_rsa" ]; then
    read -r -p "$BASE/.ssh/id_rsa doesn't exist. Decrypt file? [y/N] " response
    case "$response" in
        [yY][eE][sS]|[yY])
            install -m 600 /dev/null "$BASE/.ssh/id_rsa"
            gpg2 --output "$BASE/.ssh/id_rsa" --yes --decrypt "$BASE/.ssh/id_rsa.gpg"
            ;;
    esac
else
    echo "$BASE/.ssh/id_rsa exists. Skipping..."
fi