diff --git a/README.org b/README.org index 6bcfacb..8648abf 100644 --- a/README.org +++ b/README.org @@ -714,6 +714,84 @@ Configure the default capture template for daily entries. :head "#+TITLE: %<%Y-%m-%d>\n"))) #+end_src +** Notes + +#+begin_src emacs-lisp +(defvar dotfiles/bib "~/.local/source/brain/resources.bib") +(defvar dotfiles/notes "~/.local/source/brain/notes/") +#+end_src + +#+begin_src emacs-lisp +(use-package org-noter + :after org + :config + (setq org-noter-always-create-frame nil + org-noter-notes-search-path dotfiles/notes)) +#+end_src + +#+begin_src emacs-lisp +(use-package org-pdftools + :hook (org-mode . org-pdftools-setup-link)) +#+end_src + +#+begin_src emacs-lisp +(use-package org-noter-pdftools + :after org-noter + :config + (with-eval-after-load 'pdf-annot + (add-hook 'pdf-annot-active-handler-functions #'org-noter-pdftools-jump-to-note))) +#+end_src + +#+begin_src emacs-lisp +(setq bibtex-completion-notes-path dotfiles/notes + bibtex-completion-bibliography dotfiles/bib + bibtex-completion-pdf-field "file" + bibtex-completion-notes-template-multiple-files + (concat + "#+TITLE: ${title}\n" + "#+ROAM_KEY: cite:${=key=}\n" + "#* TODO Notes\n" + ":PROPERTIES:\n" + ":CUSTOM_ID: ${=key}\n" + ":NOTER_DOCUMENT: %(orb-process-file-field \"${=key=}\")\n" + ":AUTHOR: ${author-abbrev}\n" + ":JOURNAL: ${journaltitle}\n" + ":DATE: ${date}\n" + ":YEAR: ${year}\n" + ":DOI: ${doi}\n" + ":URL: ${url}\n" + ":END:\n\n")) +#+end_src + +#+begin_src emacs-lisp +(use-package org-ref + :config + (setq org-ref-completion-library 'org-ref-helm-cite + org-ref-get-pdf-filename-function 'org-refg-get-pdf-filename-helm-bibtex + org-ref-default-bibliography dotfiles/bib + org-ref-bibliography-notes dotfiles/notes + org-ref-notes-directory dotfiles/notes + org-ref-notes-function 'orb-edit-notes + org-ref-note-title-format "* TODO %y - %t\n:PROPERTIES:\n:CUSTOM_ID: %k\n:NOTER_DOCUMENT: %F\n:ROAM_KEY: cite:%k\n:AUTHOR: %9a\n:JOURNAL: %j\n:YEAR: %y\n:VOLUME: %v\n:PAGES: %p\n:DOI: %D\n:URL: %U\n:END:\n\n")) +#+end_src + +#+begin_src emacs-lisp +(use-package org-roam-bibtex + :after (org-roam) + :hook (org-roam-mode . org-roam-bibtex-mode) + :config + (setq orb-preformat-keywords + '("=key=" "title" "url" "file" "author-or-editor" "keywords"))) +#+end_src + +#+begin_src emacs-lisp +(add-to-list 'org-roam-capture-templates + '("n" "Notes" plain (function org-roam-capture--get-point) + "" + :file-name "notes/${slug}" + :head "#+TITLE: ${=key=}: ${title}\n#+ROAM_KEY:${ref}\n\n* ${title} :PROPERTIES:\n:CUSTOM_ID: ${=key=}\n:URL: ${url}\n:AUTHOR: ${author-or-editor}\n:NOTER_DOCUMENT:%(orb-process-file-field \"${=key=}\")\n:NOTER_PAGE:\n:END:\n\n")) +#+end_src + ** Agenda Configure agenda sources. diff --git a/config/shell/README.org b/config/shell/README.org new file mode 100644 index 0000000..b674a0e --- /dev/null +++ b/config/shell/README.org @@ -0,0 +1,233 @@ +#+TITLE: Shell +#+AUTHOR: Christopher James Hayward +#+EMAIL: chris@chrishayward.xyz + +#+begin_src shell +ln -s ~/.local/source/dotfiles/config/shell/bashrc ~/.bashrc +ln -s ~/.local/source/dotfiles/config/shell/profile ~/.profile +#+end_src + +* Bash +:PROPERTIES: +:header-args: :tangle ~/.local/source/dotfiles/config/shell/bashrc :results silent +:END: + +Executed by bash for non-login shells. See ~/usr/share/doc/bash/examples/startup-files~ (in the package =bash-doc=) for examples. + +If not running interactively, don't do anything. + +#+begin_src shell +case $- in + *i*) ;; + *) return;; +esac +#+end_src + +Don't put duplicate lines or lines starting with space in the history. + +#+begin_src shell +HISTCONTROL=ignoreboth +#+end_src + +Append to the history file, don't overwrite it. + +#+begin_src shell +shopt -s histappend +#+end_src + +For setting history length see ~HISTSIZE~ and ~HISTFILESIZE~. + +#+begin_src shell +HISTSIZE=1000 +HISTFILESIZE=2000 +#+end_src + +Check the window size after each command and, if necessary, update the values of ~LINES~ and ~COLUMNS~. + +#+begin_src shell +shopt -s checkwinsize +#+end_src + +If set, the pattern ="**"= used in a pathname expansion context will match all files and zero or more directories and subdirectories. + +#+begin_src shell +#shopt -s globstar +#+end_src + +Make less more friendly for non-text input files. + +#+begin_src shell +[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" +#+end_src + +Set variable identifying the chroot you work in (used in the prompt below). + +#+begin_src shell +if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then + debian_chroot=$(cat /etc/debian_chroot) +fi +#+end_src + +Set a fancy prompt (non-color, unless we know we "want" color). + +#+begin_src shell +case "$TERM" in + xterm-color|*-256color) color_prompt=yes;; +esac +#+end_src + +Uncomment for a colored prompt, if the terminal has the capability; turned off by default to not distract the user: the focus in a terminal window should be on the output of commands, not on the prompt. + +#+begin_src shell +#force_color_prompt=yes +#+end_src + +If we have color support; assume it's compliant with =Ecma-48 (ISO/IEC-6429)=. + +#+begin_src shell +if [ -n "$force_color_prompt" ]; then + if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then + color_prompt=yes + else + color_prompt= + fi +fi +#+end_src + +Lack of such support is extremely rare, and such a case would tend to support ~setf~ rather than ~setaf~. + +#+begin_src shell +if [ "$color_prompt" = yes ]; then + PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' +else + PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' +fi +unset color_prompt force_color_prompt +#+end_src + +If this is an xterm set the title to ~user@host:dir~. + +#+begin_src shell +case "$TERM" in +xterm*|rxvt*) + PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1" + ;; +*) + ;; +esac +#+end_src + +Enable color support of ~ls~ and also add handy aliases. + +#+begin_src shell +if [ -x /usr/bin/dircolors ]; then + test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" + alias ls='ls --color=auto' + #alias dir='dir --color=auto' + #alias vdir='vdir --color=auto' + + alias grep='grep --color=auto' + alias fgrep='fgrep --color=auto' + alias egrep='egrep --color=auto' +fi +#+end_src + +Colored =GCC= warnings and errors. + +#+begin_src shell +#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' +#+end_src + +Some more ~ls~ aliases. + +#+begin_src shell +alias ll='ls -alF' +alias la='ls -A' +alias l='ls -CF' +#+end_src + +Add an ~alert~ alias for long running commands. + +#+begin_src shell +alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"' +#+end_src + +Use like so: + +#+begin_example +sleep 10; alert +#+end_example + +You may want to put all your additions into a separate file like ~~/.bash_aliases~, instead of adding them here directly. See ~/usr/share/doc/bash-doc/examples~ in the =bash-doc= package. + +#+begin_src shell +if [ -f ~/.bash_aliases ]; then + . ~/.bash_aliases +fi +#+end_src + +Enable programmable completion features. You don't need to enable this, if it's already enabled in ~/etc/bash.bashrc~ and ~/etc/profile~ sources ~/etc/bash.bashrc~. + +#+begin_src shell +if ! shopt -oq posix; then + if [ -f /usr/share/bash-completion/bash_completion ]; then + . /usr/share/bash-completion/bash_completion + elif [ -f /etc/bash_completion ]; then + . /etc/bash_completion + fi +fi +#+end_src + +* Profile +:PROPERTIES: +:header-args: :tangle ~/.local/source/dotfiles/config/shell/profile :results silent +:END: + +Executed by the command interpreter for login shells. + +This file is *not* read by bash, if ~~/.bash_profile~ or ~~/.bash_login~ exists. See =/usr/share/doc/bash/examples/startup-files= for examples. The files are located in the bash-doc package. + +The default umask is set in ~/etc/profile~. For =SSH= logins, install and configure the =libpam-umask= package. + +#+begin_src shell +#umask 022 +#+end_src + +If we're running =bash= make sure to include ~~/.bashrc~ if it exists. + +#+begin_src shell +if [ -n "$BASH_VERSION" ]; then + if [ -f "$HOME/.bashrc" ]; then + . "$HOME/.bashrc" + fi +fi +#+end_src + +Add private bin directories to the ~$PATH~ (if they exist). ++ ~$HOME/bin~ ++ ~$HOME/.local/bin~ + +#+begin_src shell +if [ -d "$HOME/bin" ]; then + PATH="$HOME/bin:$PATH" +fi +if [ -d "$HOME/.local/bin" ]; then + PATH="$HOME/.local/bin:$PATH" +fi +#+end_src + +Add ~$HOME/go/bin~ to the ~$PATH~ if it exists. + +#+begin_src shell +if [ -d "$HOME/go/bin" ]; then + PATH="$HOME/go/bin:$PATH" +fi +#+end_src + +Auto run =startx= on login if there's no display server running. + +#+begin_src shell +if [ -z "${DISPLAY}" ] && [ "${XDG_VTNR}" -eq 1 ]; then + exec startx +fi +#+end_src diff --git a/config/shell/bashrc b/config/shell/bashrc new file mode 100644 index 0000000..3014438 --- /dev/null +++ b/config/shell/bashrc @@ -0,0 +1,81 @@ +case $- in + *i*) ;; + *) return;; +esac + +HISTCONTROL=ignoreboth + +shopt -s histappend + +HISTSIZE=1000 +HISTFILESIZE=2000 + +shopt -s checkwinsize + +#shopt -s globstar + +[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" + +if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then + debian_chroot=$(cat /etc/debian_chroot) +fi + +case "$TERM" in + xterm-color|*-256color) color_prompt=yes;; +esac + +#force_color_prompt=yes + +if [ -n "$force_color_prompt" ]; then + if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then + color_prompt=yes + else + color_prompt= + fi +fi + +if [ "$color_prompt" = yes ]; then + PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' +else + PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' +fi +unset color_prompt force_color_prompt + +case "$TERM" in +xterm*|rxvt*) + PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1" + ;; +*) + ;; +esac + +if [ -x /usr/bin/dircolors ]; then + test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" + alias ls='ls --color=auto' + #alias dir='dir --color=auto' + #alias vdir='vdir --color=auto' + + alias grep='grep --color=auto' + alias fgrep='fgrep --color=auto' + alias egrep='egrep --color=auto' +fi + +#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' + +alias ll='ls -alF' +alias la='ls -A' +alias l='ls -CF' + +alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"' + +if [ -f ~/.bash_aliases ]; then + . ~/.bash_aliases +fi + +if ! shopt -oq posix; then + if [ -f /usr/share/bash-completion/bash_completion ]; then + . /usr/share/bash-completion/bash_completion + elif [ -f /etc/bash_completion ]; then + . /etc/bash_completion + fi +fi diff --git a/config/shell/profile b/config/shell/profile new file mode 100644 index 0000000..39cc24e --- /dev/null +++ b/config/shell/profile @@ -0,0 +1,22 @@ +#umask 022 + +if [ -n "$BASH_VERSION" ]; then + if [ -f "$HOME/.bashrc" ]; then + . "$HOME/.bashrc" + fi +fi + +if [ -d "$HOME/bin" ]; then + PATH="$HOME/bin:$PATH" +fi +if [ -d "$HOME/.local/bin" ]; then + PATH="$HOME/.local/bin:$PATH" +fi + +if [ -d "$HOME/go/bin" ]; then + PATH="$HOME/go/bin:$PATH" +fi + +if [ -z "${DISPLAY}" ] && [ "${XDG_VTNR}" -eq 1 ]; then + exec startx +fi diff --git a/config/x11/xinitrc b/config/x11/xinitrc new file mode 100644 index 0000000..322bf3e --- /dev/null +++ b/config/x11/xinitrc @@ -0,0 +1 @@ +exec dbus-launch --exit-with-session emacs -mm --debug-init \ No newline at end of file diff --git a/init.el b/init.el index 10abdbc..0f25eb2 100644 --- a/init.el +++ b/init.el @@ -317,6 +317,66 @@ :file-name "daily/%<%Y-%m-%d>" :head "#+TITLE: %<%Y-%m-%d>\n"))) +(defvar dotfiles/bib "~/.local/source/brain/resources.bib") +(defvar dotfiles/notes "~/.local/source/brain/notes/") + +(use-package org-noter + :after org + :config + (setq org-noter-always-create-frame nil + org-noter-notes-search-path dotfiles/notes)) + +(use-package org-pdftools + :hook (org-mode . org-pdftools-setup-link)) + +(use-package org-noter-pdftools + :after org-noter + :config + (with-eval-after-load 'pdf-annot + (add-hook 'pdf-annot-active-handler-functions #'org-noter-pdftools-jump-to-note))) + +(setq bibtex-completion-notes-path dotfiles/notes + bibtex-completion-bibliography dotfiles/bib + bibtex-completion-pdf-field "file" + bibtex-completion-notes-template-multiple-files + (concat + "#+TITLE: ${title}\n" + "#+ROAM_KEY: cite:${=key=}\n" + "#* TODO Notes\n" + ":PROPERTIES:\n" + ":CUSTOM_ID: ${=key}\n" + ":NOTER_DOCUMENT: %(orb-process-file-field \"${=key=}\")\n" + ":AUTHOR: ${author-abbrev}\n" + ":JOURNAL: ${journaltitle}\n" + ":DATE: ${date}\n" + ":YEAR: ${year}\n" + ":DOI: ${doi}\n" + ":URL: ${url}\n" + ":END:\n\n")) + +(use-package org-ref + :config + (setq org-ref-completion-library 'org-ref-helm-cite + org-ref-get-pdf-filename-function 'org-refg-get-pdf-filename-helm-bibtex + org-ref-default-bibliography dotfiles/bib + org-ref-bibliography-notes dotfiles/notes + org-ref-notes-directory dotfiles/notes + org-ref-notes-function 'orb-edit-notes + org-ref-note-title-format "* TODO %y - %t\n:PROPERTIES:\n:CUSTOM_ID: %k\n:NOTER_DOCUMENT: %F\n:ROAM_KEY: cite:%k\n:AUTHOR: %9a\n:JOURNAL: %j\n:YEAR: %y\n:VOLUME: %v\n:PAGES: %p\n:DOI: %D\n:URL: %U\n:END:\n\n")) + +(use-package org-roam-bibtex + :after (org-roam) + :hook (org-roam-mode . org-roam-bibtex-mode) + :config + (setq orb-preformat-keywords + '("=key=" "title" "url" "file" "author-or-editor" "keywords"))) + +(add-to-list 'org-roam-capture-templates + '("n" "Notes" plain (function org-roam-capture--get-point) + "" + :file-name "notes/${slug}" + :head "#+TITLE: ${=key=}: ${title}\n#+ROAM_KEY:${ref}\n\n* ${title} :PROPERTIES:\n:CUSTOM_ID: ${=key=}\n:URL: ${url}\n:AUTHOR: ${author-or-editor}\n:NOTER_DOCUMENT:%(orb-process-file-field \"${=key=}\")\n:NOTER_PAGE:\n:END:\n\n")) + (setq org-agenda-files '("~/.local/source/brain/daily/" "~/.local/source/secrets/org/"))