diff --git a/Makefile b/Makefile index 2371d3f..3cbd25a 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,5 @@ # Makefile is here to make it possible to use this whole shebang # outside of emacs. -.PHONY: tangle tangle-next DEST:=$(HOME) LAST:=$(shell cat .last || echo 0) NEXT:=$(shell l=$(LAST); ((l=l+1)); echo $$l) @@ -8,7 +7,10 @@ NEXTGEN:=$(PWD)/generation/$(NEXT) LASTGEN:=$(PWD)/generation/$(LAST) TANGLERS:=$(shell ls -d *.org) GEN:=$(LAST) -OPTIONS:= +OPTS:= +HOST:=$(shell uname -n) +USEROPTS:=$(OPTS):$(HOST) +NAME:=default INSTALLDIRS=tmp $(NEXTGEN) $(LASTGEN) generation/$(GEN) @@ -27,6 +29,7 @@ diff: generation/$(GEN) next: diff +.PHONY: tangle-next tangle-next: $(MAKE) tangle $(MAKE) generation @@ -38,12 +41,17 @@ copy: cd $(PWD)/generation/$(GEN) && find . -type f -exec rm -f $(DEST)/{} \; cd $(PWD)/generation/$(GEN) && cp -r . $(DEST) +.PHONY: tangle tangle: tmp - /usr/bin/env emacs --script ./etangle $(TANGLERS) - @echo + USEROPTS=$(USEROPTS) /usr/bin/env emacs --script ./etangle $(TANGLERS) clean: -rm -fr tmp nuke: clean -rm -fr .last generation + +.PHONY: option +option: + echo "(setq $(NAME)-p t)" > options/$(NAME).el + echo "(setq $(NAME)-p nil)" > options/no-$(NAME).el diff --git a/bin.org b/bin.org index 3f9da3c..68ed7f7 100644 --- a/bin.org +++ b/bin.org @@ -3,17 +3,21 @@ #+STARTUP: hidestars #+STARTUP: odd #+BABEL: :cache yes -#+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no +#+PROPERTY: header-args :cache yes +#+PROPERTY: header-args :padline no +#+PROPERTY: header-args :mkdirp yes +#+PROPERTY: header-args :comments no +#+PROPERTY: header-args :replace yes +#+PROPERTY: header-args :tangle-mode (identity #o755) ~/bin files and other shenanigans * ~/bin/cidr - A stupid script I wrote ages ago to help me be lazy with cidr notation for stuff. Setup the wrong netmask a few times and you too, will wish for something similar. -#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/cidr :results replace :tangle-mode (identity #o755) +#+BEGIN_SRC perl :tangle tmp/bin/cidr #!/usr/bin/env perl # # Convert input ip/cidr|netmask|hexnetmask to useable network information. @@ -159,7 +163,6 @@ foreach my $arg (@ARGV){ #+END_SRC * ~/bin/dns - Just a silly dns script that slighly mimics the old host utility of yore. Can also do reverse lookups. @@ -171,7 +174,7 @@ $ dns 216.58.216.206 ord31s21-in-f206.1e100.net is 216.58.216.206 ord31s21-in-f206.1e100.net is also ord31s21-in-f206.1e100.net -#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/dns :results replace :tangle-mode (identity #o755) +#+BEGIN_SRC perl :tangle tmp/bin/dns #!/usr/bin/env perl # # Stupid script to help with dns information. Solaris 9/8 lack the host utility. @@ -213,10 +216,9 @@ exit 0; #+END_SRC * ~/bin/ts - Stupid simple timestamp script that just takes input, and prefixes a timestamp to to output. Thats it. -#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/ts :results replace :tangle-mode (identity #o755) +#+BEGIN_SRC perl :tangle tmp/bin/ts #!/usr/bin/env perl # # Timestamp stdin and then print to stdout and flush. @@ -239,7 +241,6 @@ while(){ #+END_SRC * ~/bin/diskhog - Old script I wrote after I had to figure out where space was used and it was mostly all in a directory with a ton of small files. Written in anger. Not all that useful nominally. @@ -266,7 +267,7 @@ $ diskhog -n 4 /tmp 420.57k /private/tmp/sysp.xml 161.17k /private/tmp/KSOutOfProcessFetcher.12572.ppfIhqX0vjaTSb8AJYobDV7Cu68= -#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/diskhog :results replace :tangle-mode (identity #o755) +#+BEGIN_SRC perl :tangle tmp/bin/diskhog #!/usr/bin/env perl # # Find out who is hogging disk space and where. @@ -421,7 +422,6 @@ if ($debug){ #+END_SRC * ~/bin/ifinfo - I don't remember now why I wrote this but its just a simpler view of interfaces on a system. @@ -435,7 +435,7 @@ bridge100@1500 192.168.64.1/24 a:b:c:d:e:f Comes in slightly handy, no guarantees it parses ifconfig right tho. -#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/ifinfo :results replace :tangle-mode (identity #o755) +#+BEGIN_SRC perl :tangle tmp/bin/ifinfo #!/usr/bin/env perl # # Because ifconfig output is... overly verbose. @@ -651,33 +651,33 @@ if (scalar(@output) < 1){ Mostly because I use iso8601 timestamps and its nice to use them generally without depending on gnu date. -#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/iso8601 :results replace :tangle-mode (identity #o755) -#!/usr/bin/env perl -#-*-mode: Perl; coding: utf-8;-*- -use strict; -use warnings; -use POSIX qw(strftime); -use Getopt::Long; - -my $short = 0; -GetOptions('short' => \$short, - 's' => \$short - ); +#+BEGIN_SRC perl :tangle tmp/bin/iso8601 + #!/usr/bin/env perl + #-*-mode: Perl; coding: utf-8;-*- + use strict; + use warnings; + use POSIX qw(strftime); + use Getopt::Long; + + my $short = 0; + GetOptions('short' => \$short, + 's' => \$short + ); -my $now = time; -if ($short) { - print strftime('%Y%m%dT%H%M%SZ', (gmtime $now)) . "\n"; -} else { - print strftime('%Y-%m-%dT%H:%M:%SZ', (gmtime $now)) . "\n"; -} -exit 0; + my $now = time; + if ($short) { + print strftime('%Y%m%dT%H%M%SZ', (gmtime $now)) . "\n"; + } else { + print strftime('%Y-%m-%dT%H:%M:%SZ', (gmtime $now)) . "\n"; + } + exit 0; #+END_SRC * ~/bin/whoson Basically getent passwd $username/$uid to show who is on a system. -#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/whoson :results replace :tangle-mode (identity #o755) +#+BEGIN_SRC perl :tangle tmp/bin/whoson #!/usr/bin/env perl # # Because i'm lazy and sick of typing in getent passwd $someusername/uid @@ -715,7 +715,7 @@ foreach my $user (keys %users){ Silly wrapper perl script that makes it easier to get at the gecos string for a $user/$uid. -#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/gecos :results replace :tangle-mode (identity #o755) +#+BEGIN_SRC perl :tangle tmp/bin/gecos #!/usr/bin/env perl # # Dumb wrapper to get the gecos information from a uid/username. @@ -737,7 +737,7 @@ foreach my $input (@ARGV){ Stupid perl script to mimic hatimerun for systems that don't have it. -#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/hatimerun :results replace :tangle-mode (identity #o755) +#+BEGIN_SRC perl :tangle tmp/bin/hatimerun #!/usr/bin/env perl # # hatimerun in perl, sorta @@ -806,7 +806,7 @@ if ($@){ Silly perl based ptree alike implementation. Mad old code that should be avoided at all costs but it works and I'm not fixing it unless I need to. -#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/ptree.pl :results replace :tangle-mode (identity #o755) +#+BEGIN_SRC perl :tangle tmp/bin/ptree.pl #!/usr/bin/env perl # # ptree for linux/darwin/solaris. I got sick of ps and pstree on linux. @@ -984,7 +984,7 @@ exit 0; Just find out if a port responds to anything tcp related or not. -#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/portchk :results replace :tangle-mode (identity #o755) +#+BEGIN_SRC perl :tangle tmp/bin/portchk #!/usr/bin/env perl # # Dumb wrapper to get the gecos information from a uid/username. @@ -1002,6 +1002,49 @@ foreach my $input (@ARGV){ } #+END_SRC +* ~/bin/nix-update + +More for nix on macos, but just merges NixOS/nipkgs origin/master to the current branch in a tmux window and watches it. + +#+BEGIN_SRC sh :tangle (tangle/file "bin/nix-update" (bound-and-true-p nix-p)) + #!/usr/bin/env sh + #-*-mode: Shell-script; coding: utf-8;-*- + # File: tmux-nix.sh + # Copyright: 2017 Mitch Tishmack + # Description: instantiate tmux nix session + export script=$(basename "$0") + export dir=$(cd "$(dirname "$0")"; pwd) + export iam=${dir}/${script} + set -e + + session=nix + + cd ~/src/github.com/NixOS/nixpkgs + + if ! tmux has-session -t ${session}; then + tmux new-session -d -s ${session} -n nix + tmux send-keys -t ${session}:0 'sleep 30 + while true; do + blah=$(nix-env -iA --dry-run stdboth nixpkgs.default | grep /nix); echo "${blah}" | head -n $(echo "$LINES - 2" | bc); echo "${blah}" | grep -c /nix | ts + echo "${blah}" | grep /nix > /dev/null 2>&1 + if [ $? -eq 0 ]; then + sleep 60 + clear + else + exit 0 + fi + done + ' C-m + tmux split-window -v -t ${session}:0 + tmux send-keys -t ${session}:0.1 'git fetch --all && git merge origin/master && + time nix-env -iA nixpkgs.default && nix-env -u --leq && exit 0 + ' C-m + tmux select-window -t ${session}:0 + fi + tmux attach -t ${session} + + +#+END_SRC * ~/bin/notify OSX only really, just fires off a notification when its ran. @@ -1010,8 +1053,7 @@ Example: notify "some command" "not ok" First param is the message, second title of the notification. - -#+BEGIN_SRC sh :mkdirp yes :tangle (when (eq osx-p t) "tmp/bin/notify") :results replace :tangle-mode (identity #o755) +#+BEGIN_SRC sh :tangle (tangle/file "bin/notify" (bound-and-true-p macos-p)) #!/bin/sh message=${1:="no message"} title='' @@ -1027,25 +1069,27 @@ osascript -e "${notification}" * ~/bin/today -Stupid ruby script I wrote to highlight the week/day in a calendar. - -#+BEGIN_SRC ruby :mkdirp yes :tangle tmp/bin/today :results replace :tangle-mode (identity #o755) -#!/usr/bin/env ruby -cal, today, week_color, day_color, reset = %x(cal).split(%r(\n)), Time.now.day, %x(tput sgr0;tput setab 4;tput setaf 7), %x(tput sgr0; tput setab 0;tput setaf 7;tput bold), %x(tput sgr0) -done=false -cal.each do |line| - if done then - puts line - next - end - if(line =~ /^(.*\s+?)#{today}(\s+?.*)$/ or - line =~ /^(.*\s+?)#{today}$/ or - line =~ /^()#{today}(\s+?.*)$/ or - line =~ /^#{today}$/ ) then - puts "#{week_color}#{$1}#{day_color}#{today}#{week_color}#{$2}#{reset}" - done=true - else - puts line +Stupid ruby script I wrote to highlight the week/day in a calendar. I don't remember why I wrote it. + +TODO: why the hell is :mkdirp yes needed here but nowhere else? + +#+BEGIN_SRC ruby :tangle tmp/bin/today :mkdirp yes + #!/usr/bin/env ruby + cal, today, week_color, day_color, reset = %x(cal).split(%r(\n)), Time.now.day, %x(tput sgr0;tput setab 4;tput setaf 7), %x(tput sgr0; tput setab 0;tput setaf 7;tput bold), %x(tput sgr0) + done=false + cal.each do |line| + if done then + puts line + next + end + if(line =~ /^(.*\s+?)#{today}(\s+?.*)$/ or + line =~ /^(.*\s+?)#{today}$/ or + line =~ /^()#{today}(\s+?.*)$/ or + line =~ /^#{today}$/ ) then + puts "#{week_color}#{$1}#{day_color}#{today}#{week_color}#{$2}#{reset}" + done=true + else + puts line + end end -end #+END_SRC diff --git a/defaults.el b/defaults.el deleted file mode 100644 index 6c260e4..0000000 --- a/defaults.el +++ /dev/null @@ -1,23 +0,0 @@ -;;-*-mode: emacs-lisp; coding: utf-8;-*- -;; All these variables control what/how readme.org gets tangled -;; into dotfiles. Off by default set to t to turn them on as -;; needed. - -;; OS types -(setq bsd-p nil) -(setq linux-p nil) -(setq osx-p nil) - -;; Optional things -(setq nix-p nil) -(setq tmux-p nil) -(setq git-p nil) -(setq emacs-p nil) -(setq vim-p nil) -(setq zsh-p nil) -(setq mosh-p nil) -(setq x-p nil) - -;; Language specific -(setq haskell-p nil) -(setq perl-p nil) diff --git a/dotprofile.org b/dotprofile.org index cd90f88..8b7909c 100644 --- a/dotprofile.org +++ b/dotprofile.org @@ -3,7 +3,12 @@ #+STARTUP: hidestars #+STARTUP: odd #+BABEL: :cache yes -#+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no :tangle tmp/.profile +#+PROPERTY: header-args :cache yes +#+PROPERTY: header-args :padline no +#+PROPERTY: header-args :mkdirp yes +#+PROPERTY: header-args :comments no +#+PROPERTY: header-args :replace yes +#+PROPERTY: header-args :tangle tmp/.profile ~/.profile setup in all its peculiarities. @@ -22,7 +27,7 @@ OSX uses hostname -s for getting hostname -#+BEGIN_SRC sh :tangle (when (eq osx-p t) "tmp/.profile") +#+BEGIN_SRC sh :tangle (tangle/file ".profile" (bound-and-true-p macos-p)) _host=$(hostname -s) #+END_SRC @@ -34,7 +39,7 @@ _host=${_host:=${_uname_n}} * PATH ** haskell -#+BEGIN_SRC sh :tangle (when (eq haskell-p t) "tmp/.profile") +#+BEGIN_SRC sh :tangle (tangle/file ".profile" (bound-and-true-p haskell-p)) PATH="${PATH}:${HOME}/.cabal/bin" #+END_SRC @@ -183,7 +188,7 @@ cconv() #+END_SRC ** git -#+BEGIN_SRC sh :tangle (when (eq git-p t) "tmp/.profile") +#+BEGIN_SRC sh :tangle (tangle/file ".profile" (bound-and-true-p git-p)) maybe_git_repo() { # assume https if input doesn't contain a protocol @@ -225,7 +230,7 @@ bb() } #+END_SRC ** haskell -#+BEGIN_SRC sh :tangle (when (eq haskell-p t) "tmp/.profile") +#+BEGIN_SRC sh :tangle (tangle/file ".profile" (bound-and-true-p haskell-p)) hmap() { ghc -e "interact ($*)" @@ -242,7 +247,7 @@ hmapw() } #+END_SRC ** nix -#+BEGIN_SRC sh :tangle (when (eq nix-p t) "tmp/.profile") +#+BEGIN_SRC sh :tangle (tangle/file ".profile" (bound-and-true-p nix-p)) mk_nix_shell() { cabal2nix --sha256="0" . \ @@ -284,7 +289,7 @@ nix-off() { Workaround stupid ssl crap with recent nix. -#+BEGIN_SRC sh :tangle (when (and (eq nix-p t) (eq osx-p t)) "tmp/.profile") +#+BEGIN_SRC sh :tangle (tangle/file ".profile" (and (bound-and-true-p nix-p) (bound-and-true-p macos-p))) if [ ! -e ${HOME}/.nonix ]; then SSL_CERT_FILE="${HOME}/.nix-profile/etc/ssl/certs/ca-bundle.crt" GIT_SSL_CAINFO=$SSL_CERT_FILE @@ -293,7 +298,7 @@ if [ ! -e ${HOME}/.nonix ]; then fi #+END_SRC -#+BEGIN_SRC sh :tangle (when (eq nix-p t) "tmp/.profile") +#+BEGIN_SRC sh :tangle (tangle/file ".profile" (bound-and-true-p nix-p)) if [ ! -e ${HOME}/.nonix ]; then nix_env_setup fi @@ -306,7 +311,7 @@ TODO Add linux ca-bundle detection set -xg SSL_CERT_FILE /etc/ssl/certs/ca-certificates.crt ** tmux -#+BEGIN_SRC sh :tangle (when (eq tmux-p t) "tmp/.profile") +#+BEGIN_SRC sh :tangle (tangle/file ".profile" (bound-and-true-p tmux-p)) t() { if [ -z "$1" ]; then @@ -319,7 +324,7 @@ t() } #+END_SRC ** x -#+BEGIN_SRC sh :tangle (when (eq x-p t) "tmp/.profile") +#+BEGIN_SRC sh :tangle (tangle/file ".profile" (bound-and-true-p x-p)) modmap() { [ -f "${HOME}/.Xmodmap" ] && xmodmap "${HOME}/.Xmodmap" @@ -356,24 +361,24 @@ alias kille=emacsclient -e "(kill-emacs)" #+END_SRC ** osx -#+BEGIN_SRC sh :tangle (when (eq osx-p t) "tmp/.profile") +#+BEGIN_SRC sh :tangle (tangle/file ".profile" (bound-and-true-p macos-p)) alias o='open -a' #+END_SRC ** git -#+BEGIN_SRC sh :tangle (when (eq git-p t) "tmp/.profile") +#+BEGIN_SRC sh :tangle (tangle/file ".profile" (bound-and-true-p git-p)) alias g=git #+END_SRC ** haskell -#+BEGIN_SRC sh :tangle (when (eq haskell-p t) "tmp/.profile") +#+BEGIN_SRC sh :tangle (tangle/file ".profile" (bound-and-true-p haskell-p)) alias ghce="ghc -e ':l ~/.ghc.hs' -e" #+END_SRC ** mosh -#+BEGIN_SRC sh :tangle (when (eq mosh-p t) "tmp/.profile") +#+BEGIN_SRC sh :tangle (tangle/file ".profile" (bound-and-true-p mosh-p)) alias m=mosh #+END_SRC ** tmux -#+BEGIN_SRC sh :tangle (when (eq tmux-p t) "tmp/.profile") +#+BEGIN_SRC sh :tangle (tangle/file ".profile" (bound-and-true-p tmux-p)) alias tl='tmux ls' #+END_SRC diff --git a/emacs.org b/emacs.org index b34c349..e5f5f65 100644 --- a/emacs.org +++ b/emacs.org @@ -3,29 +3,22 @@ #+STARTUP: hidestars #+STARTUP: odd #+BABEL: :cache yes -#+PROPERTY: header-args :tangle tmp/.emacs.d/init.el :cache yes :padline no :mkdirp yes :comments no +#+PROPERTY: header-args :cache yes +#+PROPERTY: header-args :padline no +#+PROPERTY: header-args :mkdirp yes +#+PROPERTY: header-args :comments no +#+PROPERTY: header-args :results replace +#+PROPERTY: header-args :tangle tmp/.emacs.d/init.el * prelude Startup related tasks/setup that might be used later on. -*** tangle functions - -Duplicated from tangle.el just to make using org easier. - -TODO: make this stuff work sanely in emacs org mode and -via external tangling. Not tangled for now. - -#+BEGIN_SRC emacs-lisp :tangle no - (defun tangle/yn (p) (if (bound-and-true-p p) "yes" "no")) - (defun tangle/file (p file) (if (bound-and-true-p p) (concat "tmp/" file) "no")) -#+END_SRC - *** emacs package setup Setup the builtin emacs package manager. -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC emacs-lisp :tangle tmp/.emacs.d/init.el :mkdirp yes (require 'package) (package-initialize) #+END_SRC @@ -38,6 +31,18 @@ Add in the standard package archive urls. (add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/") t) #+END_SRC +*** tangle functions + +Duplicated from tangle.el just to make using org easier. + +TODO: make this stuff work sanely in emacs org mode and +via external tangling. Not tangled for now. + +#+BEGIN_SRC emacs-lisp + (defun tangle/yn (p) (if (bound-and-true-p p) "yes" "no")) + (defun tangle/file (file p) (if (bound-and-true-p p) (concat "tmp/" file) "no")) +#+END_SRC + *** emacs gc speedup #+BEGIN_SRC emacs-lisp @@ -719,7 +724,7 @@ setups. Not tangled into the config intentionally. -#+BEGIN_SRC emacs-lisp :tangle=no +#+BEGIN_SRC emacs-lisp :tangle no (defun pkg-config-add-lib-cflags (pkg-config-lib) "This function will add necessary header file path of a specified by `pkg-config-lib' to `flycheck-clang-include-path', which make it diff --git a/etangle b/etangle index 2b9bbbb..7e15621 100755 --- a/etangle +++ b/etangle @@ -4,12 +4,18 @@ (require 'org-install) (require 'org) -(load-file "./tangle.el") +(defun tangle/yn (p) (if (bound-and-true-p p) "yes" "no")) +(defun tangle/file (file p) (if (eval p) (concat "tmp/" file) "no")) -(load-defaults-or-options) +(if (getenv "USEROPTS") + (dolist (fnam (split-string (getenv "USEROPTS") ":")) + (if (not (member fnam '("" nil))) + (load-file (concat "./options/" fnam ".el")) + )) + ) ;; Iterate through all the files given and tangle them (dolist (file command-line-args-left) - (princ file) + (print (format "tangling: %s" file)) (org-babel-tangle-file file)) diff --git a/git.org b/git.org index 7553f36..c5d6eb5 100644 --- a/git.org +++ b/git.org @@ -3,41 +3,42 @@ #+STARTUP: hidestars #+STARTUP: odd #+BABEL: :cache yes -#+PROPERTY: header-args :cache yes :padline no :comments no +#+PROPERTY: header-args :cache yes +#+PROPERTY: header-args :padline no +#+PROPERTY: header-args :mkdirp yes +#+PROPERTY: header-args :comments no +#+PROPERTY: header-args :replace yes General git configuration split out into sections mostly. * ~/.gitconfig -:PROPERTIES: -:header-args: :tangle tmp/.gitconfig :comments no :padline no :cache yes :mkdirp yes -:END: ** pager -#+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig") -[pager] - color = true +#+BEGIN_SRC conf :tangle (tangle/file ".gitconfig" (bound-and-true-p git-p)) + [pager] + color = true #+END_SRC ** color -#+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig") -[color] - status = auto - diff = auto - branch = auto -[color "status"] - added = green - changed = blue - untracked = red -[color "branch"] - current = green - local = blue - remote = red -[color "diff"] - meta = blue bold - frag = black reverse - old = red reverse - new = green reverse +#+BEGIN_SRC conf :tangle (tangle/file ".gitconfig" (bound-and-true-p git-p)) + [color] + status = auto + diff = auto + branch = auto + [color "status"] + added = green + changed = blue + untracked = red + [color "branch"] + current = green + local = blue + remote = red + [color "diff"] + meta = blue bold + frag = black reverse + old = red reverse + new = green reverse #+END_SRC ** alias -#+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig") +#+BEGIN_SRC conf :tangle (tangle/file ".gitconfig" (bound-and-true-p git-p)) [alias] begin = !git init && git commit --allow-empty -m 'Initial empty commit' up = !git pull --rebase && git push @@ -76,7 +77,7 @@ General git configuration split out into sections mostly. churn = !git log --all -M -C --name-only --format='format:' "$@" | sort | grep -v '^$' | uniq -c | sort -r | awk 'BEGIN {print "count,file"} {print $1 "," $2}' | egrep -v '^\\s+$' # help the gc a bit and get a bit more space back for a local clone trim = !git reflog expire --expire=now --all && git gc --prune=now - # default remote + # default remote, note depends on the repo having been git cloned defremote = !git branch -rvv | egrep 'HEAD' | awk '{print $1}' | sed -e 's|/HEAD||g' # short sha short = rev-parse --short @@ -84,75 +85,74 @@ General git configuration split out into sections mostly. bcs = log --pretty="%H" --first-parent --no-merges find-merge = !sh -c "commit=$0 && branch=${1:-HEAD} && (git rev-list $commit..$branch --ancestry-path | cat -n; git rev-list $commit..$branch --first-parent | cat -n) | sort -k2 | uniq -f1 -d | sort -n | tail -1 | cut -f2" show-merge = !sh -c "merge=$(git find-merge $0 $1) && [ -n \"$merge\" ] && git show $merge" + # My defremote hack depends on $remote/HEAD to point to somewhere + # which it may not if the git repo wasn't cloned + fixhead = !sh -c "rem=${0:-origin} && branch=${1:-master} && git symbolic-ref refs/remotes/$rem/HEAD refs/remotes/$rem/${branch}" # push branch while setting the upstream to the default remote pbr = !git push --set-upstream $(git defremote) $(git bn) p = !sh -c 'git branch ${1:-$(git defremote)}pr$0@$(iso8601 -s) $(git ls-remote -q ${1:-$(git defremote)} | grep refs/pull-requests/$0/from | cut -c1-8)' - # kinda/sorta git pull -r without the git pull nonsense - cleanmerged = !sh -c "git branch --merged | grep -Ev '^(. master|\*)' | xargs -n1 git branch -d" - prune = !sh -c 'git cleanmerged; git fetch -p; git trim' + # Pull all the commits missed from a git pull --depth N clone + unshallow = pull --unshallow #+END_SRC ** github -#+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig") -[github] - user = mitchty +#+BEGIN_SRC conf :tangle (tangle/file ".gitconfig" (bound-and-true-p git-p)) + [github] + user = mitchty #+END_SRC ** credential -#+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig") -[credential] - helper = netrc -v -f ~/.netrc.gpg -f ~/.netrc +#+BEGIN_SRC conf :tangle (tangle/file ".gitconfig" (bound-and-true-p git-p)) + [credential] + helper = netrc -v -f ~/.netrc.gpg -f ~/.netrc #+END_SRC ** advice -#+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig") -[advice] - statushints = false +#+BEGIN_SRC conf :tangle (tangle/file ".gitconfig" (bound-and-true-p git-p)) + [advice] + statushints = false #+END_SRC ** gui -#+BEGIN_SRC conf :tangle (tangle/file 'git-p ".gitconfig") -[gui] - fontui = -family Monaco -size 8 -weight normal -slant roman -underline 0 -overstrike 0 - fontdiff = -family Monaco -size 8 -weight normal -slant roman -underline 0 -overstrike 0 +#+BEGIN_SRC conf :tangle (tangle/file ".gitconfig" (bound-and-true-p git-p)) + [gui] + fontui = -family Monaco -size 8 -weight normal -slant roman -underline 0 -overstrike 0 + fontdiff = -family Monaco -size 8 -weight normal -slant roman -underline 0 -overstrike 0 #+END_SRC ** http -#+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig") -[http] - postBuffer = 209715200 +#+BEGIN_SRC conf :tangle (tangle/file ".gitconfig" (bound-and-true-p git-p)) + [http] + postBuffer = 209715200 #+END_SRC -q** push -#+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig") -[push] - default = simple +** push +#+BEGIN_SRC conf :tangle (tangle/file ".gitconfig" (bound-and-true-p git-p)) + [push] + default = simple #+END_SRC ** url rewrites -#+BEGIN_SRC conf :tangle (tangle/file 'git-p ".gitconfig") -[url "https://github.com/"] - insteadOf = git://github.com/ +#+BEGIN_SRC conf :tangle (tangle/file ".gitconfig" (bound-and-true-p git-p)) + [url "https://github.com/"] + insteadOf = git://github.com/ #+END_SRC ** username/email -#+BEGIN_SRC conf :tangle (tangle/file 'git-p ".gitconfig") -[user] - name = Mitch Tishmack - email = mitch.tishmack@gmail.com +#+BEGIN_SRC conf :tangle (tangle/file ".gitconfig" (bound-and-true-p git-p)) + [user] + name = Mitch Tishmack + email = mitch.tishmack@gmail.com #+END_SRC * ~/.gitignore -:PROPERTIES: -:header-args: :tangle tmp/.gitignore :comments no :padline no :cache yes :mkdirp yes -:END: Common crap/build artifacts that git should always ignore. -#+BEGIN_SRC conf :tangle no -.*~ -*~ -.\#* -\#* -\#*\# -.\#*\# -.DS_Store -*.pyc -*.rbc -*.elc -*.swp -*.[oa] -*.hi +#+BEGIN_SRC conf :tangle (tangle/file ".gitignore" (bound-and-true-p git-p)) + .*~ + ,*~ + .\#* + \#* + \#*\# + .\#*\# + .DS_Store + ,*.pyc + ,*.rbc + ,*.elc + ,*.swp + ,*.[oa] + ,*.hi #+END_SRC diff --git a/haskell.org b/haskell.org index 801cbd5..03e3791 100644 --- a/haskell.org +++ b/haskell.org @@ -3,7 +3,11 @@ #+STARTUP: hidestars #+STARTUP: odd #+BABEL: :cache yes -#+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no +#+PROPERTY: header-args :cache yes +#+PROPERTY: header-args :padline no +#+PROPERTY: header-args :mkdirp yes +#+PROPERTY: header-args :comments no +#+PROPERTY: header-args :replace yes Haskell setup. diff --git a/misc.org b/misc.org index f0f3d31..8d810e3 100644 --- a/misc.org +++ b/misc.org @@ -3,7 +3,11 @@ #+STARTUP: hidestars #+STARTUP: odd #+BABEL: :cache yes -#+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no +#+PROPERTY: header-args :cache yes +#+PROPERTY: header-args :padline no +#+PROPERTY: header-args :mkdirp yes +#+PROPERTY: header-args :comments no +#+PROPERTY: header-args :replace yes Stuff that didn't fit anywhere else. diff --git a/nix.org b/nix.org index 6bad61f..f0354fc 100644 --- a/nix.org +++ b/nix.org @@ -3,38 +3,47 @@ #+STARTUP: hidestars #+STARTUP: odd #+BABEL: :cache yes -#+PROPERTY: header-args :tangle tmp/.nixpkgs/config.nix :cache yes :padline no :mkdirp yes :comments no +#+PROPERTY: header-args :cache yes +#+PROPERTY: header-args :padline no +#+PROPERTY: header-args :mkdirp yes +#+PROPERTY: header-args :comments no +#+PROPERTY: header-args :replace yes Nix user config.nix setup. -#+BEGIN_SRC conf :tangle (when (eq nix-p t) "tmp/.nixpkgs/config.nix") -{ pkgs }: { - packageOverrides = super: let pkgs = super.pkgs; in with pkgs; rec { - custom-pybugz = with python34Packages; buildPythonPackage rec { - name = "pybugz-${version}"; - version = "0.13"; - src = pkgs.fetchgit { - url = https://github.com/williamh/pybugz.git; - rev = "4dec396d43061c1def9aa19601c89c8aa00742b3"; - sha256 = "1s21jma83cyynmv3696hbrgy0d3sq4j027iplhnw22q2237bk1xd"; +#+BEGIN_SRC conf :mkdirp yes :tangle (tangle/file ".nixpkgs/config.nix" (bound-and-true-p nix-p)) + let + pkgs = import {}; + in + { + packageOverrides = pkgs: with pkgs; + let in rec { + custom-pybugz = with python34Packages; buildPythonPackage rec { + name = "pybugz-${version}"; + version = "0.13"; + src = pkgs.fetchgit { + url = https://github.com/williamh/pybugz.git; + rev = "4dec396d43061c1def9aa19601c89c8aa00742b3"; + sha256 = "1s21jma83cyynmv3696hbrgy0d3sq4j027iplhnw22q2237bk1xd"; + }; + # TODO: Fix this, something to do with how its using unittest + doCheck = false; + buildInputs = [ pkgs.glibcLocales ]; + propagatedBuildInputs = [ six ]; }; - # TODO: Fix this, something to do with how its using unittest - doCheck = false; - buildInputs = [ pkgs.glibcLocales ]; - propagatedBuildInputs = [ six ]; - }; - custom-pinentry = pinentry.override { gtk2 = null; qt4 = null; ncurses = null; }; - custom-youtube-dl = python27Packages.youtube-dl.override { pandoc = null; }; - # 3 unit tests fail on both 27 pylint and 35 pylint, so ignore it - custom-pylint = python35Packages.pylint.override { doCheck = false; }; + custom-pinentry = pinentry.override { gtk2 = null; qt4 = null; ncurses = null; }; + custom-youtube-dl = python27Packages.youtube-dl.override { pandoc = null; }; + # 3 unit tests fail on both 27 pylint and 35 pylint, so ignore it +# custom-pylint = python35Packages.pylint.override { doCheck = false; }; - custom-git = git.override { - pythonSupport = false; - svnSupport = true; - guiSupport = false; - sendEmailSupport = true; - }; + custom-git = git.override { + pythonSupport = false; + svnSupport = true; + guiSupport = false; + sendEmailSupport = true; + }; +<<<<<<< variant A default = buildEnv { name = "default"; ignoreCollisions = true; @@ -146,8 +155,122 @@ Nix user config.nix setup. # ] ++ stdenv.lib.optionals stdenv.isDarwin [ # xhyve ]; +>>>>>>> variant B + default = buildEnv { + name = "default"; + ignoreCollisions = true; + paths = [ + ack + ansible + aria + aspell + aspellDicts.en + bazaarTools + cacert + clang + clang-analyzer + cloc + cscope + ctags + curl + custom-git + custom-pinentry + custom-pybugz +# custom-pylint + custom-youtube-dl + diffutils + docbook5 + duply + emacs + entr + gcc + gdbm + ghostscript + gist + gitAndTools.git-extras + gitAndTools.gitFull + gnumake + gnupg + gnupg1compat + gnutar + graphviz-nox + haskellPackages.ShellCheck + haskellPackages.bake + haskellPackages.cabal-dependency-licenses + haskellPackages.ghc-core + haskellPackages.ghc-mod + haskellPackages.hasktags + haskellPackages.hindent + haskellPackages.hoogle + haskellPackages.hspec + haskellPackages.idris + haskellPackages.intero + haskellPackages.network + haskellPackages.pandoc + haskellPackages.shake + haskellPackages.stack + htop + imagemagick + iperf + jq + keychain + lastpass-cli + less + llvm + mercurial + moreutils + mosh + multimarkdown + multitail + mutt + munge + mr + nox + openssl + p7zip + patchutils + pbzip2 + pigz + pixz + pkgconfig + poppler_utils + postgresql + pv + python27Packages.bugzilla + python27Packages.flake8 + python27Packages.howdoi + python27Packages.pip + python27Packages.pyflakes + python27Packages.virtualenv + readline + rlwrap + rsync + rtags + gmp + silver-searcher + sloccount + sqlite + sshpass + subversionClient + texlive.combined.scheme-full + tmux + tree + unrar + unzip + upx + wakelan + watch + wget + xz + zlib + # If I ever come up with some linux only stuff or figure out xhyve + # ] ++ stdenv.lib.optionals stdenv.isLinux [ + # ] ++ stdenv.lib.optionals stdenv.isDarwin [ + # xhyve + ]; + }; +======= end }; - }; - allowUnfree = true; -} + allowUnfree = true; + } #+END_SRC diff --git a/options/bsd.el b/options/bsd.el new file mode 100644 index 0000000..d182f2c --- /dev/null +++ b/options/bsd.el @@ -0,0 +1 @@ +(setq bsd-p t) diff --git a/options/emacs.el b/options/emacs.el new file mode 100644 index 0000000..eefabfc --- /dev/null +++ b/options/emacs.el @@ -0,0 +1 @@ +(setq emacs-p t) diff --git a/options/git.el b/options/git.el new file mode 100644 index 0000000..a424f46 --- /dev/null +++ b/options/git.el @@ -0,0 +1 @@ +(setq git-p t) diff --git a/options/haskell.el b/options/haskell.el new file mode 100644 index 0000000..d9f0605 --- /dev/null +++ b/options/haskell.el @@ -0,0 +1 @@ +(setq haskell-p t) diff --git a/options/linux.el b/options/linux.el new file mode 100644 index 0000000..c4fc3c6 --- /dev/null +++ b/options/linux.el @@ -0,0 +1 @@ +(setq linux-p t) diff --git a/options/macos.el b/options/macos.el new file mode 100644 index 0000000..88fa000 --- /dev/null +++ b/options/macos.el @@ -0,0 +1 @@ +(setq macos-p t) diff --git a/options/mosh.el b/options/mosh.el new file mode 100644 index 0000000..8417a93 --- /dev/null +++ b/options/mosh.el @@ -0,0 +1 @@ +(setq mosh-p t) diff --git a/options/nix.el b/options/nix.el new file mode 100644 index 0000000..ed0d232 --- /dev/null +++ b/options/nix.el @@ -0,0 +1 @@ +(setq nix-p t) diff --git a/options/no-bsd.el b/options/no-bsd.el new file mode 100644 index 0000000..b858c39 --- /dev/null +++ b/options/no-bsd.el @@ -0,0 +1 @@ +(setq bsd-p nil) diff --git a/options/no-emacs.el b/options/no-emacs.el new file mode 100644 index 0000000..7106b8c --- /dev/null +++ b/options/no-emacs.el @@ -0,0 +1 @@ +(setq emacs-p nil) diff --git a/options/no-git.el b/options/no-git.el new file mode 100644 index 0000000..924d5f3 --- /dev/null +++ b/options/no-git.el @@ -0,0 +1 @@ +(setq git-p nil) diff --git a/options/no-haskell.el b/options/no-haskell.el new file mode 100644 index 0000000..524d412 --- /dev/null +++ b/options/no-haskell.el @@ -0,0 +1 @@ +(setq haskell-p nil) diff --git a/options/no-linux.el b/options/no-linux.el new file mode 100644 index 0000000..4ea7baa --- /dev/null +++ b/options/no-linux.el @@ -0,0 +1 @@ +(setq linux-p nil) diff --git a/options/no-macos.el b/options/no-macos.el new file mode 100644 index 0000000..14bee41 --- /dev/null +++ b/options/no-macos.el @@ -0,0 +1 @@ +(setq macos-p nil) diff --git a/options/no-mosh.el b/options/no-mosh.el new file mode 100644 index 0000000..7320e48 --- /dev/null +++ b/options/no-mosh.el @@ -0,0 +1 @@ +(setq mosh-p nil) diff --git a/options/no-nix.el b/options/no-nix.el new file mode 100644 index 0000000..82f9b8b --- /dev/null +++ b/options/no-nix.el @@ -0,0 +1 @@ +(setq nix-p nil) diff --git a/options/no-perl.el b/options/no-perl.el new file mode 100644 index 0000000..250b871 --- /dev/null +++ b/options/no-perl.el @@ -0,0 +1 @@ +(setq perl-p nil) diff --git a/options/no-tmux.el b/options/no-tmux.el new file mode 100644 index 0000000..a95d088 --- /dev/null +++ b/options/no-tmux.el @@ -0,0 +1 @@ +(setq tmux-p nil) diff --git a/options/no-vim.el b/options/no-vim.el new file mode 100644 index 0000000..2411e8a --- /dev/null +++ b/options/no-vim.el @@ -0,0 +1 @@ +(setq vim-p nil) diff --git a/options/no-x.el b/options/no-x.el new file mode 100644 index 0000000..d577daa --- /dev/null +++ b/options/no-x.el @@ -0,0 +1 @@ +(setq x-p nil) diff --git a/options/no-zsh.el b/options/no-zsh.el new file mode 100644 index 0000000..9c16143 --- /dev/null +++ b/options/no-zsh.el @@ -0,0 +1 @@ +(setq zsh-p nil) diff --git a/options/perl.el b/options/perl.el new file mode 100644 index 0000000..e22a0d8 --- /dev/null +++ b/options/perl.el @@ -0,0 +1 @@ +(setq perl-p t) diff --git a/options/tmux.el b/options/tmux.el new file mode 100644 index 0000000..86b8111 --- /dev/null +++ b/options/tmux.el @@ -0,0 +1 @@ +(setq tmux-p t) diff --git a/options/vim.el b/options/vim.el new file mode 100644 index 0000000..feb740f --- /dev/null +++ b/options/vim.el @@ -0,0 +1 @@ +(setq vim-p t) diff --git a/options/x.el b/options/x.el new file mode 100644 index 0000000..db1d40b --- /dev/null +++ b/options/x.el @@ -0,0 +1 @@ +(setq x-p t) diff --git a/options/zsh.el b/options/zsh.el new file mode 100644 index 0000000..574e135 --- /dev/null +++ b/options/zsh.el @@ -0,0 +1 @@ +(setq zsh-p t) diff --git a/osx-nonix.el b/osx-nonix.el deleted file mode 100644 index 6d1b0d8..0000000 --- a/osx-nonix.el +++ /dev/null @@ -1,23 +0,0 @@ -;;-*-mode: emacs-lisp; coding: utf-8;-*- -;; All these variables control what/how readme.org gets tangled -;; into dotfiles. Off by default set to t to turn them on as -;; needed. - -;; OS types -(setq bsd-p nil) -(setq linux-p nil) -(setq osx-p t) - -;; Optional things -(setq nix-p nil) -(setq tmux-p t) -(setq git-p t) -(setq emacs-p t) -(setq vim-p nil) -(setq zsh-p t) -(setq mosh-p t) -(setq x-p t) - -;; Language specific -(setq haskell-p t) -(setq perl-p t) diff --git a/osx.el b/osx.el deleted file mode 100644 index a9e5b96..0000000 --- a/osx.el +++ /dev/null @@ -1,23 +0,0 @@ -;;-*-mode: emacs-lisp; coding: utf-8;-*- -;; All these variables control what/how readme.org gets tangled -;; into dotfiles. Off by default set to t to turn them on as -;; needed. - -;; OS types -(setq bsd-p nil) -(setq linux-p nil) -(setq osx-p t) - -;; Optional things -(setq nix-p t) -(setq tmux-p t) -(setq git-p t) -(setq emacs-p t) -(setq vim-p nil) -(setq zsh-p t) -(setq mosh-p t) -(setq x-p t) - -;; Language specific -(setq haskell-p t) -(setq perl-p t) diff --git a/perl.org b/perl.org index 7d120a6..e5329c1 100644 --- a/perl.org +++ b/perl.org @@ -3,7 +3,11 @@ #+STARTUP: hidestars #+STARTUP: odd #+BABEL: :cache yes -#+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no +#+PROPERTY: header-args :cache yes +#+PROPERTY: header-args :padline no +#+PROPERTY: header-args :mkdirp yes +#+PROPERTY: header-args :comments no +#+PROPERTY: header-args :replace yes Mostly old holdovers from the days of perl, just perlcritic and perltidy configuration. diff --git a/readme.org b/readme.org index 8c0b855..7d08ce1 100644 --- a/readme.org +++ b/readme.org @@ -21,16 +21,35 @@ my dotfiles in one logical file that can build itself. So now if you want to look at my dotfiles, they're all in here. With one caveat that my emacs configuration is not. That is still separate. Mostly -because it is large enough that it can be on its own. +because it is large enough that it can stand on its own. * Use/Abuse -Use of this setup is simple. There really is one step in general: +Use of this setup is somewhat simple or straightforward. + +There really is one step in general: #+BEGIN_SRC sh :tangle no make #+END_SRC +** Emacs functions to add to init.el + +For all this to work in emacs so you can edit source blocks you'll need +add the following two functions otherwise you'll get an error every time +you try to edit the source block. + +#+BEGIN_SRC emacs-lisp :tangle no + (defun tangle/yn (p) (if (bound-and-true-p p) "yes" "no")) + (defun tangle/file (file p) (if (eval p) (concat "tmp/" file) "no")) +#+END_SRC + +This is also all the "magique" that this whole stupid repo entails. + +But how would you control how things get exported? Well that is done +via files with simple *(setq predicate-p t)* lines inside them. These +are all the *options/name.el* files comprise of. + But lets say you want to export things to another directory than $HOME. No worries, just specify DEST: @@ -38,15 +57,55 @@ worries, just specify DEST: make DEST=/some/other/directory #+END_SRC -But wait, what if you want to export things for an os you're not using? No -worries, just copy options.el to name.el and specify that as OPTIONS too: +But wait, what if you want to export things for an os you're not using? + +Easy, just create a couple options files like so: + +#+BEGIN_SRC sh :tangle no +name=option +echo "(setq ${name}-p t)" > options/${name}.el +echo "(setq ${name}-p nil)" > options/no-${name}.el +#+END_SRC + +And then provide the *name* (without the .el extension) to make via *OPTS*: #+BEGIN_SRC sh :tangle no - make DEST=/some/other/directory OPTIONS=osx + make DEST=/some/other/directory OPTS=macos +#+END_SRC + +This lets you customize things to a ludicrous degree at runtime like so: + +#+BEGIN_SRC sh :tangle no + make OPTS=no-nix:linux:tmux:git:no-zsh +#+END_SRC + +Etc... + +I wouldn't do this exactly, while you could, thats just too much to need to +remember to type. The simplest way to do things is to just create an +*options/$(uname -n).el* file with all the options you need defined. Note that +in the or *BEGIN_SRC* lines you can use elisp to control when/how something should or +should not get tangled. + +Example use of tangle/file, note the final option is just elisp and we just +use *bound-and-true-p* to detect if we have a predicate or not. + +#+BEGIN_SRC emacs-lisp :tangle no + (tangle/file "some/file/name" (bound-and-true-p macos-p)) + (tangle/file "some/file/name" (bound-and-true-p foo-p)) + (tangle/file "some/file/name" (and (bound-and-true-p first-p) (bound-and-true-p second-p))) +#+END_SRC + +By default the makefile will add an option with the name of the system its +running on's *uname -n*. To override this behavior use the *USEROPTS* variable +instead, or invoke things with a null *HOST* like so: + +#+BEGIN_SRC sh :tangle no + make HOST= #+END_SRC Want to copy a specific generation to somewhere else? Or maybe you tested -installing to some DEST, and want to copy that to $HOME? No worries: +installing to some *DEST*, and want to copy that to *$HOME*? No worries: #+BEGIN_SRC sh :tangle no make copy GEN=N @@ -54,6 +113,35 @@ installing to some DEST, and want to copy that to $HOME? No worries: Where N is the generation you want to copy. +Note, to ensure this doesn't by default overwrite hand edited files, a +diff is run across the files that would be copied to and what the tangled +version contains. + +Example, I've commented out some .gitignore lines in *~/.gitignore* manually +and then tried to tangle a new generation over the top. + +#+BEGIN_SRC sh :tangle no +./ddiff /Users/me/src/github.com/mitchty/dotfiles/generation/291 /Users/me +--- .gitignore 2017-03-04 12:49:17.000000000 -0600 ++++ /Users/me/.gitignore 2017-03-04 14:00:24.000000000 -0600 +@@ -8,6 +8,6 @@ + *.pyc + *.rbc + *.elc +-*.swp +-*.[oa] +-*.hi ++#*.swp ++#*.[oa] ++#*.hi +differences between /Users/me/src/github.com/mitchty/dotfiles/generation/291 and /Users/me +#+END_SRC + +This is an attempt to ensure that we don't accidentally overwrite files that may +have customizations on it. + +To force it just run *make copy GEN=N* with *N* as the number to force a copy for. + ** How does it work? It is really rather simple, the [[file:Makefile][Makefile]] isn't that complex. Look at that @@ -70,8 +158,6 @@ files is the users job, not this setup. ** Explanation of what is happening -The file [[file:defaults.el][defaults.el]] controls predicates that change how files get tangled to files. - This allows me to tangle files that would be useful for linux/bsd/etc... without affecting the existing files. @@ -97,16 +183,16 @@ Should be easy enough to either clone this repo or copy things to a new repo and hack in what you need. Your call. But, say you have a heading, take .profile as an example, under an org mode -heading you would just add: +heading you would just add to your *BEGIN_SRC* definition like so: -#+BEGIN_SRC org :tangle no - :PROPERTIES: - :header-args: :tangle tmp/.profile :comments no :padline no :cache yes :mkdirp yes - :END: +#+BEGIN_SRC text :tangle no + #+BEGIN_SRC sh :tangle .profile + stuff + #+END_SRC #+END_SRC -Then any source blocks for that heading will go to tmp/.profile. Its important -that you put everything into ./tmp! This is used to generate things before a +Then any source blocks for that heading will go to *tmp/.profile*. Its important +that you put everything into *tmp*! This is used to generate things before a generation is built. It gives the Makefile a chance to know if the tangling worked or not. @@ -114,12 +200,10 @@ But lets say you don't need to have lots of sub headings, or even control a file in multiple subparts that have predicates to control things. Pretty simple, just add a source block like normal: -#+BEGIN_SRC org :tangle no - ,#+BEGIN_SRC conf :tangle tmp/.example.conf +#+BEGIN_SRC text :tangle no + #+BEGIN_SRC conf :tangle tmp/.example.conf put contents here! - ,#+END_SRC - - + #+END_SRC #+END_SRC * External Tanglers @@ -149,7 +233,7 @@ Language specific | perl | [[file:perl.org][perl.org]] | * TODO -- [ ] Figure out some way to make code blocks editable with :tangle, it sucks not being able to edit blocks as they are. +- [X] Figure out some way to make code blocks editable with :tangle, it sucks not being able to edit blocks as they are. - [ ] Need to have some way to autocleanup old generations. Rm works for now so meh. - [ ] Need to add the ability to detect that make is generating a pointless new generation. Aka generation N and generation N-1 are the same, just leave N and don't increment. - [ ] Maybe checksum file contents somehow and use that? diff --git a/tangle.el b/tangle.el deleted file mode 100644 index de7e9b3..0000000 --- a/tangle.el +++ /dev/null @@ -1,22 +0,0 @@ -;;-*-mode: emacs-lisp; coding: utf-8;-*- -;; File: tangle.el - -;; Load the default options used or what was passed in as OPTIONS -(defun load-defaults-or-options () - (load-file (if (getenv "OPTIONS") - (concat (concat "./" (getenv "OPTIONS")) ".el") - "./defaults.el"))) - -;; Define functions we use in :tangle blocks - -;; tangle/yn -;; tangle to "yes" or "no" if the predicate given exists and defined as t. -;; -;; Iff predicate is bound, and t, "yes" -;; rest is "no" -(defun tangle/yn (p) (load-defaults-or-options) (if (bound-and-true-p p) "yes" "no")) - -;; tangle/file -;; tangle to filename if predicate is bound and t -;; Note, prepends tmp/ to the filename to conform to match expected layout -(defun tangle/file (p file) (load-defaults-or-options) (if (bound-and-true-p p) (concat "tmp/" file) "no")) diff --git a/tmux.org b/tmux.org index d71ecb2..549272a 100644 --- a/tmux.org +++ b/tmux.org @@ -2,12 +2,15 @@ #+AUTHOR: Mitch Tishmack #+STARTUP: hidestars #+STARTUP: odd -#+BABEL: :cache yes -#+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no +#+PROPERTY: header-args :cache yes +#+PROPERTY: header-args :padline no +#+PROPERTY: header-args :mkdirp yes +#+PROPERTY: header-args :comments no +#+PROPERTY: header-args :replace yes Tmux configuration. Pretty boring in most ways. -#+BEGIN_SRC conf :tangle (tangle/file tmux-p ".tmux.conf") +#+BEGIN_SRC conf :tangle (tangle/file ".tmux.conf" (bound-and-true-p tmux-p)) # Setup vi mode by default set-window-option -g mode-keys vi set-window-option -g aggressive-resize on @@ -144,7 +147,7 @@ Tmux configuration. Pretty boring in most ways. Only set xclip for x setup. -#+BEGIN_SRC conf :tangle (eq (tangle/file tmux-p ".tmux.conf") (tangle/file x-p ".tmux.conf")) +#+BEGIN_SRC conf :tangle (tangle/file ".tmux.conf" (and (bound-and-true-p tmux-p) (bound-and-true-p x-p))) bind C-p run "tmux set-buffer \"$(xclip -o)\"; tmux paste-buffer" bind C-y run "tmux save-buffer - | xclip -i" #+END_SRC diff --git a/vim.org b/vim.org index 7b8c3cf..a6103cf 100644 --- a/vim.org +++ b/vim.org @@ -2,12 +2,15 @@ #+AUTHOR: Mitch Tishmack #+STARTUP: hidestars #+STARTUP: odd -#+BABEL: :cache yes -#+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no :tangle tmp/.vimrc +#+PROPERTY: header-args :cache yes +#+PROPERTY: header-args :padline no +#+PROPERTY: header-args :mkdirp yes +#+PROPERTY: header-args :comments no +#+PROPERTY: header-args :replace yes What remains of my days from being a vim user. -#+BEGIN_SRC conf :tangle tmp/.vimrc :results replace +#+BEGIN_SRC conf :tangle tmp/.vimrc set nocompatible set backspace=indent,eol,start set history=50 " keep 50 lines of command line history diff --git a/x.org b/x.org index f1d89d0..05ac2a3 100644 --- a/x.org +++ b/x.org @@ -2,19 +2,19 @@ #+AUTHOR: Mitch Tishmack #+STARTUP: hidestars #+STARTUP: odd -#+BABEL: :cache yes -#+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no +#+PROPERTY: header-args :cache yes +#+PROPERTY: header-args :padline no +#+PROPERTY: header-args :mkdirp yes +#+PROPERTY: header-args :comments no +#+PROPERTY: header-args :replace yes X related configuration, nothing overly huge to be honest just stupid configuration. * ~/.Xdefaults -:PROPERTIES: -:header-args: :tangle (when (eq x-p t) "tmp/.Xdefaults") :comments no :padline no :cache yes :mkdirp yes -:END: X defaults, just urxvt for the moment. Slightly linux/bsd only but not really. -#+BEGIN_SRC conf +#+BEGIN_SRC conf (tangle/file ".Xdefaults" (bound-and-true-p x-p)) ! urxvt generalish stuff ! urxvt*termName: rxvt-256color @@ -35,30 +35,24 @@ urxvt*allowWindowOps: true #+END_SRC * ~/.Xmodmap -:PROPERTIES: -:header-args: :tangle (when (eq x-p t) "tmp/.Xmodmap") :comments no :padline no :cache yes :mkdirp yes -:END: Swap around left/right clicks basically. -#+BEGIN_SRC conf :tangle (when (not (and (eq x-p t) (eq osx-p t))) "tmp/.Xmodmap") +#+BEGIN_SRC conf :tangle (tangle/file ".Xmodmap" (not (and (bound-and-true-p x-p) (bound-and-true-p macos-p)))) pointer = 3 2 1 4 5 #+END_SRC OSX is odd/inverted cause reasons (who cares why). -#+BEGIN_SRC conf :tangle (when (and (eq x-p t) (eq osx-p t)) "tmp/.Xmodmap") +#+BEGIN_SRC conf :tangle (tangle/file ".Xmodmap" (and (bound-and-true-p x-p) (bound-and-true-p macos-p))) pointer = 1 2 3 4 5 #+END_SRC * ~/.Xresources -:PROPERTIES: -:header-args: :tangle (when (eq x-p t) "tmp/.Xresources") :comments no :padline no :cache yes :mkdirp yes -:END: I can't remember why I did all this effort. But I'll remove it some year I bet. -#+BEGIN_SRC conf +#+BEGIN_SRC conf :tangle (tangle/file ".Xresources" (bound-and-true-p x-p)) #define brightblack #ffffff #define normblack #f9f9f9 #define normgreen #00cc33