Lastly, I use Evil mode. I think modal keybindings are simple and more ergonomic than standard Emacs style, and Vim keybindings are what I'm comfortable with and are pervasive throughout computing.
** TODOs
*** TODO Turn keybinding and hook declarations into use-package declarations where possible
-*** TODO Put configs with passwords in here with some kind of authentication
-- Offlineimap
-- irc.el
+*** TODO Include offlineimap config
** License
Released under the [[https://opensource.org/licenses/MIT][MIT license]] by Armaan Bhojwani, 2021. Note that many snippets are taken from online, and other sources, who are credited for their work at the snippet.
* Package management
(add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
(add-to-list 'org-structure-template-alist '("sp" . "src conf :tangle ~/.spectrwm.conf"))
(add-to-list 'org-structure-template-alist '("ash" . "src shell :tangle ~/.config/ash/ashrc"))
- (add-to-list 'org-structure-template-alist '("al" . "src yml :tangle ~/.config/alacritty/alacritty.yml"))
(add-to-list 'org-structure-template-alist '("ipy" . "src python :tangle ~/.ipython/"))
(add-to-list 'org-structure-template-alist '("pi" . "src conf :tangle ~/.config/picom/picom.conf"))
(add-to-list 'org-structure-template-alist '("git" . "src conf :tangle ~/.gitconfig"))
(add-to-list 'org-structure-template-alist '("za" . "src conf :tangle ~/.config/zathura/zathurarc"))
(add-to-list 'org-structure-template-alist '("ff1" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css"))
(add-to-list 'org-structure-template-alist '("ff2" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css"))
- (add-to-list 'org-structure-template-alist '("xr" . "src conf :tangle ~/.Xresources")))
+ (add-to-list 'org-structure-template-alist '("xr" . "src conf :tangle ~/.Xresources"))
+ (add-to-list 'org-structure-template-alist '("tm" . "src conf :tangle ~/.tmux.conf"))
+ (add-to-list 'org-structure-template-alist '("gp" . "src conf :tangle ~/.gnupg/gpg.conf"))
+ (add-to-list 'org-structure-template-alist '("ag" . "src conf :tangle ~/.gnupg/gpg-agent.conf")))
#+end_src
* Autocompletion
** Ivy
#+begin_src emacs-lisp
(use-package ivy-prescient
:after counsel
- :custom
- (ivy-prescient-enable-filtering nil)
+ :custom (ivy-prescient-enable-filtering nil)
:config
(prescient-persist-mode)
(ivy-prescient-mode))
message-citation-line-function 'message-insert-formatted-citation-line
mu4e-completing-read-function 'ivy-completing-read
mu4e-confirm-quit nil
+ mu4e-view-use-gnus t
mail-user-agent 'mu4e-user-agent
+ mail-context-policy 'pick-first
mu4e-contexts
`( ,(make-mu4e-context
:name "school"
:key ?b))
:hook ((mu4e-compose-mode . flyspell-mode)
(mu4e-compose-mode . auto-fill-mode)
- (mu4e-view-mode-hook . turn-on-visual-line-mode)))
+ (mu4e-view-mode-hook . turn-on-visual-line-mode)
+ (message-send-hook . (lambda () (unless (yes-or-no-p "Ya sure 'bout that?")
+ (signal 'quit nil))))))
+#+end_src
+Discourage Gnus from displaying HTML emails
+#+begin_src emacs-lisp
+ (with-eval-after-load "mm-decode"
+ (add-to-list 'mm-discouraged-alternatives "text/html")
+ (add-to-list 'mm-discouraged-alternatives "text/richtext"))
#+end_src
** Default browser
Set EWW as default browser except for videos.
:bind (("C-c w" . eww))
:hook (eww-after-render-hook prot-eww--rename-buffer))
#+end_src
-*** Better entrypoint
+*** Keybinding
#+begin_src emacs-lisp
- ;; From https://protesilaos.com/dotemacs/
- (defun prot-eww-browse-dwim (url &optional arg)
- "Visit a URL, maybe from `eww-prompt-history', with completion.
-
- With optional prefix ARG (\\[universal-argument]) open URL in a
- new eww buffer.
-
- If URL does not look like a valid link, run a web query using
- `eww-search-prefix'.
-
- When called from an eww buffer, provide the current link as
- initial input."
- (interactive
- (list
- (completing-read "Query:" eww-prompt-history
- nil nil (plist-get eww-data :url) 'eww-prompt-history)
- current-prefix-arg))
- (eww url (if arg 4 nil)))
-
- (global-set-key (kbd "C-c w") 'prot-eww-browse-dwim)
+ (global-set-key (kbd "C-c w") 'eww)
#+end_src
** IRC
-#+begin_src emacs-lisp
- (use-package erc
- :straight (:type built-in)
- :config
- (load "~/.emacs.d/irc.el")
- (acheam-irc)
- (erc-notifications-enable)
- (erc-smiley-disable))
+Circe is a really nice IRC client, that claims to be above RCIRC and below ERC in terms of features. ERC felt a bit messy and finicky to me, and Circe has all the features that I need. This setup gets the password for my bouncer (Pounce) instances via my =~/.authinfo.gpg= file.
+#+begin_src emacs-lisp
+ (defun fetch-password (&rest params)
+ (require 'auth-source)
+ (let ((match (car (apply 'auth-source-search params))))
+ (if match
+ (let ((secret (plist-get match :secret)))
+ (if (functionp secret)
+ (funcall secret)
+ secret))
+ (error "Password not found for %S" params))))
- (use-package erc-hl-nicks
- :config (erc-hl-nicks-mode 1))
-#+end_src
-** Emacs Anywhere
-Use Emacs globally. Use the Emacs daemon and bind a key in your wm to =emacsclient --eval "(emacs-everywhere)"=.
-#+begin_src emacs-lisp
- (use-package emacs-everywhere)
+ (use-package circe
+ :config
+ (enable-lui-track)
+ (enable-circe-color-nicks)
+ (circe "libera")
+ (circe "oftc")
+ (circe "tilde")
+ (setq circe-networks '(("libera"
+ :host "irc.armaanb.net"
+ :nick "emacs"
+ :use-tls t
+ :port "6698"
+ :pass (lambda (null) (fetch-password
+ :login "emacs"
+ :machine "irc.armaanb.net"
+ :port 6698)))
+ ("oftc"
+ :host "irc.armaanb.net"
+ :nick "emacs"
+ :use-tls t
+ :port "6699"
+ :pass (lambda (null) (fetch-password
+ :login "emacs"
+ :machine "irc.armaanb.net"
+ :port 6699)))
+ ("tilde"
+ :host "irc.armaanb.net"
+ :nick "emacs"
+ :use-tls t
+ :port "6696"
+ :pass (lambda (null) (fetch-password
+ :login "emacs"
+ :machine "irc.armaanb.net"
+ :port 6696)))
+ ))
+ :custom (circe-default-part-message "goodbye!")
+ :bind (:map circe-mode-map ("C-c C-r" . circe-reconnect-all)))
#+end_src
* Emacs IDE
** Code cleanup
:straight (git-email :repo "https://git.sr.ht/~yoctocell/git-email")
:config (git-email-piem-mode))
#+end_src
+** Java
+*** Evaluate current buffer
+Stolen from https://stackoverflow.com/questions/19953924/how-do-you-run-java-codes-in-emacs
+#+begin_src emacs-lisp
+ (defun java-eval-buffer ()
+ "run current program (that requires no input)"
+ (interactive)
+ (let* ((source (file-name-nondirectory buffer-file-name))
+ (out (file-name-sans-extension source))
+ (class (concat out ".class")))
+ (save-buffer)
+ (shell-command (format "rm -f %s && javac %s" class source))
+ (if (file-exists-p class)
+ (shell-command (format "java %s" out) "*scratch*")
+ (progn
+ (set (make-local-variable 'compile-command)
+ (format "javac %s" source))
+ (command-execute 'compile)))))
+#+end_src
* General text editing
** Indentation
Indent after every change.
#+begin_src emacs-lisp
(setq ispell-silently-savep t)
#+end_src
+** Open file as root
+#+begin_src emacs-lisp
+ (defun doas-edit (&optional arg)
+ "Edit currently visited file as root.
+
+ With a prefix ARG prompt for a file to visit.
+ Will also prompt for a file to visit if current
+ buffer is not visiting a file.
+
+ Modified from Emacs Redux."
+ (interactive "P")
+ (if (or arg (not buffer-file-name))
+ (find-file (concat "/doas:root@localhost:"
+ (ido-read-file-name "Find file(as root): ")))
+ (find-alternate-file (concat "/doas:root@localhost:" buffer-file-name))))
+
+ (global-set-key (kbd "C-x C-r") #'doas-edit)
+#+end_src
* Keybindings
** Switch windows
#+begin_src emacs-lisp
"0c" '0x0-upload-kill-ring
"0p" '0x0-upload-popup))
#+end_src
+** Automatically clean buffers
+#+begin_src emacs-lisp
+ ;; Don't kill Circe buffers
+ (add-to-list 'clean-buffer-list-kill-never-regexps (lambda (buffer-name)
+ (with-current-buffer buffer-name
+ (derived-mode-p 'lui-mode))))
+ (midnight-mode)
+#+end_src
* Tangles
** Spectrwm
*** General settings
*** Keybindings
**** WM actions
#+begin_src conf :tangle ~/.spectrwm.conf
- program[term] = alacritty
+ program[term] = st -e tmux
program[screenshot_all] = flameshot gui
program[notif] = /home/armaa/Code/scripts/setter status
program[pass] = /home/armaa/Code/scripts/passmenu
#+end_src
**** Programs
#+begin_src conf :tangle ~/.spectrwm.conf
- program[aerc] = alacritty -e aerc
- program[catgirl] = alacritty --hold -e sh -c "while : ; do ssh root@armaanb.net -t abduco -A irc catgirl freenode; sleep 2; done"
+ program[email] = emacsclient -c --eval "(mu4e)"
+ program[irc] = emacsclient -c --eval '(switch-to-buffer "irc.armaanb.net:6698")'
+ program[rss] = emacsclient -c --eval '(elfeed)'
program[emacs] = emacsclient -c
program[firefox] = firefox
- program[calc] = alacritty -e because -l
- program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
+ program[calc] = st -e because -l
- bind[aerc] = MOD+Control+1
- bind[catgirl] = MOD+Control+2
- bind[firefox] = MOD+Control+3
- bind[emacs-anywhere] = MOD+Control+4
+ bind[email] = MOD+Control+1
+ bind[irc] = MOD+Control+2
+ bind[rss] = MOD+Control+3
+ bind[firefox] = MOD+Control+4
bind[calc] = MOD+Control+5
bind[emacs] = MOD+Control+Return
#+end_src
echo "${color}== upgrading flatpaks ==${reset}"
flatpak update
echo ""
- echo "${color}== upgrading zsh plugins ==${reset}"
- zpe-pull
- echo ""
echo "${color}== updating nvim plugins ==${reset}"
nvim +PlugUpdate +PlugUpgrade +qall
echo "Updated nvim plugins"
echo "${color}== cleaning flatpaks ==${reset}"
flatpak remove --unused
echo ""
- echo "${color}== cleaning zsh plugins ==${reset}"
- zpe-clean
- echo ""
echo "${color}== cleaning nvim plugins ==${reset}"
nvim +PlugClean +qall
echo "Cleaned nvim plugins"
finger() {
user=$(echo "$1" | cut -f 1 -d '@')
host=$(echo "$1" | cut -f 2 -d '@')
- echo $user | nc "$host" 79 -N
+ echo $user | nc "$host" 79
}
#+end_src
**** Upload to ftp.armaanb.net
echo "https://ftp.armaanb.net/pub/"$(basename "$1") | tee /dev/tty | xclip -sel c
}
#+end_src
+*** Exports
+#+begin_src shell :tangle ~/.config/ash/ashrc
+ export EDITOR="emacsclient -c"
+ export VISUAL="$EDITOR"
+ export TERM=xterm-256color # for compatability
+
+ export GPG_TTY="$(tty)"
+ export MANPAGER='nvim +Man!'
+ export PAGER='less'
+
+ export GTK_USE_PORTAL=1
+
+ export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
+ export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
+ export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
+ export PATH="$PATH:/home/armaa/.cargo/bin"
+ export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
+ export PATH="$PATH:/usr/sbin"
+ export PATH="$PATH:/opt/FreeTube/freetube"
+
+ export LC_ALL="en_US.UTF-8"
+ export LC_CTYPE="en_US.UTF-8"
+ export LANGUAGE="en_US.UTF-8"
+
+ export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
+ export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
+ export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
+ export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
+ export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
+ export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
+#+end_src
*** Aliases
**** SSH
#+begin_src shell :tangle ~/.config/ash/ashrc
#+end_src
**** File management
#+begin_src shell :tangle ~/.config/ash/ashrc
- alias ls='exa -lh --icons --git --group-directories-first'
- alias la='exa -lha --icons --git --group-directories-first'
+ alias ls='ls -lh --group-directories-first'
+ alias la='ls -A'
alias df='df -h / /boot'
alias du='du -h'
alias free='free -h'
alias cp='cp -riv'
alias rm='rm -iv'
alias mv='mv -iv'
- alias ln='ln -iv'
- alias grep='grep -in --exclude-dir=.git --color=auto'
- alias fname='find -name'
+ alias ln='ln -v'
+ alias grep='grep -in --color=auto'
alias mkdir='mkdir -pv'
- alias unar='atool -x'
- alias wget='wget -e robots=off'
- alias lanex='~/.local/share/lxc/lxc'
- alias vim='nvim'
+ alias lanex='java -jar ~/.local/share/lxc/lanxchange.jar'
+ emacs() { $EDITOR "$@" & }
+ alias vim="emacs"
#+end_src
**** System management
#+begin_src shell :tangle ~/.config/ash/ashrc
- alias jctl='journalctl -p 3 -xb'
alias pkill='pkill -i'
- alias cx='chmod +x'
- alias redoas='doas $(fc -ln -1)'
alias crontab='crontab-argh'
- alias sudo='doas ' # allows aliases to be run with doas
+ alias sudo='doas'
alias pasu='git -C ~/.password-store push'
alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
yadm push'
**** Networking
#+begin_src shell :tangle ~/.config/ash/ashrc
alias ping='ping -c 10'
- alias speed='speedtest-cli'
- alias ip='ip --color=auto'
- alias cip='curl https://armaanb.net/ip'
alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
alias plan='T=$(mktemp) && \
echo "\nLast updated: $(date -R)" >> "$TT" && \
fold -sw 72 "$TT" > "$T"| \
rsync "$T" root@armaanb.net:/etc/finger/plan.txt'
- alias wttr='curl -s "wttr.in/02445?n" | head -n -3'
-#+end_src
-**** Other
-#+begin_src shell :tangle ~/.config/ash/ashrc
- alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
- iflag=fullblock status=progress'
- alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
- iflag=fullblock status=progress'
- alias ts='gen-shell -c task'
- alias ts='gen-shell -c task'
- alias tetris='autoload -Uz tetriscurses && tetriscurses'
- alias news='newsboat'
- alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
- alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
- --restrict-filenames -o '%(title)s.%(ext)s'"
- alias cal="cal -3 --color=auto"
- alias bc='bc -l'
#+end_src
**** Virtual machines, chroots
#+begin_src shell :tangle ~/.config/ash/ashrc
#+end_src
**** Python
#+begin_src shell :tangle ~/.config/ash/ashrc
- alias ipy="ipython"
- alias zpy="zconda && ipython"
- alias math="ipython --profile=math"
- alias pypi="python setup.py sdist && twine upload dist/*"
alias pip="python -m pip"
alias black="black -l 79"
#+end_src
**** Devour
#+begin_src shell :tangle ~/.config/ash/ashrc
alias zathura='devour zathura'
- alias mpv='devour mpv'
- alias sql='devour sqlitebrowser'
alias cad='devour openscad'
alias feh='devour feh'
#+end_src
-**** Package management (Pacman)
+**** Pacman
#+begin_src shell :tangle ~/.config/ash/ashrc
alias aps='yay -Ss'
alias api='yay -Syu'
alias apii='doas pacman -S'
alias app='yay -Rns'
- alias apc='yay -Sc'
- alias apo='yay -Qttd'
alias azf='pacman -Q | fzf'
alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
- alias ufetch='ufetch-arch'
- alias reflect='reflector --verbose --sort rate --save \
- ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
-#+end_src
-**** Package management (KISS)
-#+begin_src shell :tangle ~/.config/ash/ashrc
- alias kzf="kiss s \* | xargs -l basename | \
- fzf --preview 'kiss search {} | xargs -l dirname'"
#+end_src
-*** Exports
+**** Other
#+begin_src shell :tangle ~/.config/ash/ashrc
- export EDITOR="emacsclient -c"
- export VISUAL="$EDITOR"
- export TERM=xterm-256color # for compatability
-
- export GPG_TTY="$(tty)"
- export MANPAGER='nvim +Man!'
- export PAGER='less'
-
- export GTK_USE_PORTAL=1
-
- export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
- export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
- export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
- export PATH="$PATH:/home/armaa/.cargo/bin"
- export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
- export PATH="$PATH:/usr/sbin"
- export PATH="$PATH:/opt/FreeTube/freetube"
-
- export LC_ALL="en_US.UTF-8"
- export LC_CTYPE="en_US.UTF-8"
- export LANGUAGE="en_US.UTF-8"
-
- export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
- export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
- export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
- export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
- export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
- export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
-#+end_src
-** Alacritty
-*** Appearance
-#+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
-font:
- normal:
- family: JetBrains Mono Nerd Font
- style: Medium
- italic:
- style: Italic
- Bold:
- style: Bold
- size: 7
- ligatures: true # Requires ligature patch
-
-window:
- padding:
- x: 5
- y: 5
-
-background_opacity: 1
-#+end_src
-*** Color scheme
-Modus vivendi. Source: https://github.com/ishan9299/Nixos/blob/d4bbb7536be95b59466bb9cca4d671be46e04e81/user/alacritty/alacritty.yml#L30-L118
-#+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
-colors:
- # Default colors
- primary:
- background: '#000000'
- foreground: '#ffffff'
-
- cursor:
- text: '#000000'
- background: '#ffffff'
-
- # Normal colors (except green it is from intense colors)
- normal:
- black: '#000000'
- red: '#ff8059'
- green: '#00fc50'
- yellow: '#eecc00'
- blue: '#29aeff'
- magenta: '#feacd0'
- cyan: '#00d3d0'
- white: '#eeeeee'
-
- # Bright colors [all the faint colors in the modus theme]
- bright:
- black: '#555555'
- red: '#ffa0a0'
- green: '#88cf88'
- yellow: '#d2b580'
- blue: '#92baff'
- magenta: '#e0b2d6'
- cyan: '#a0bfdf'
- white: '#ffffff'
-
- # dim [all the intense colors in modus theme]
- dim:
- black: '#222222'
- red: '#fb6859'
- green: '#00fc50'
- yellow: '#ffdd00'
- blue: '#00a2ff'
- magenta: '#ff8bd4'
- cyan: '#30ffc0'
- white: '#dddddd'
+ alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
+ iflag=fullblock status=progress'
+ alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
+ iflag=fullblock status=progress'
+ alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
+ --restrict-filenames -o '%(title)s.%(ext)s'"
+ alias cal="cal -3 --color=auto"
+ alias bc='bc -l'
#+end_src
** IPython
-*** General
-Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
#+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
c.TerminalInteractiveShell.editing_mode = 'vi'
c.InteractiveShell.colors = 'linux'
c.TerminalInteractiveShell.confirm_exit = False
#+end_src
-*** Math
-#+begin_src python :tangle ~/.ipython/profile_math/startup.py
- from math import *
-
- def deg(x):
- return x * (180 / pi)
-
- def rad(x):
- return x * (pi / 180)
-
- def rad(x, unit):
- return (x * (pi / 180)) / unit
-
- def csc(x):
- return 1 / sin(x)
-
- def sec(x):
- return 1 / cos(x)
-
- def cot(x):
- return 1 / tan(x)
-#+end_src
** MPV
Make MPV play a little bit smoother.
#+begin_src conf :tangle ~/.config/mpv/mpv.conf
transition: 0.1s margin-top ease-out;
}
#+end_src
-** Black screen by default
+*** Black screen by default
+userChrome.css:
#+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
#main-window,
#browser,
color: #fff !important;
}
#+end_src
+
+userContent.css:
#+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
@-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
body {
}
#+end_src
** Xresources
-*** Color scheme
-Modus operandi.
+Modus operandi theme.
#+begin_src conf :tangle ~/.Xresources
! special
,*.foreground: #ffffff
,*.color7: #eeeeee
,*.color15: #dddddd
#+end_src
-*** Copy paste
-#+begin_src conf :tangle ~/.Xresources
- xterm*VT100.Translations: #override \
- Shift <KeyPress> Insert: insert-selection(CLIPBOARD) \n\
- Ctrl Shift <Key>V: insert-selection(CLIPBOARD) \n\
- Ctrl Shift <Key>C: copy-selection(CLIPBOARD) \n\
- Ctrl <Btn1Up>: exec-formatted("xdg-open '%t'", PRIMARY)
-#+end_src
-*** Blink cursor
-#+begin_src conf :tangle ~/.Xresources
- xterm*cursorBlink: true
+** Tmux
+#+begin_src conf :tangle ~/.tmux.conf
+ set -g status off
+ set -g mouse on
+ set-window-option -g mode-keys vi
+ bind-key -T copy-mode-vi 'v' send -X begin-selection
+ bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard'
#+end_src
-*** Alt keys
-#+begin_src conf :tangle ~/.Xresources
- XTerm*eightBitInput: false
- XTerm*eightBitOutput: true
+** GPG
+*** Config
+#+begin_src conf :tangle ~/.gnupg/gpg.conf
+ default-key 3C9ED82FFE788E4A
+ use-agent
+#+end_src
+*** Agent
+#+begin_src conf :tangle ~/.gnupg/gpg-agent.conf
+ pinentry-program /sbin/pinentry-gnome3
+ max-cache-ttl 600
+ default-cache-ttl 600
+ allow-emacs-pinentry
#+end_src