summaryrefslogtreecommitdiff
path: root/emacs/custom
diff options
context:
space:
mode:
Diffstat (limited to 'emacs/custom')
-rw-r--r--emacs/custom/fcuny-conf.el32
-rw-r--r--emacs/custom/fcuny-defuns.el55
-rw-r--r--emacs/custom/fcuny-edit.el39
-rw-r--r--emacs/custom/fcuny-eshell.el39
-rw-r--r--emacs/custom/fcuny-flycheck.el27
-rw-r--r--emacs/custom/fcuny-git.el76
-rw-r--r--emacs/custom/fcuny-navigation.el128
-rw-r--r--emacs/custom/fcuny-org.el113
-rw-r--r--emacs/custom/fcuny-prog.el99
-rw-r--r--emacs/custom/fcuny-settings.el56
-rw-r--r--emacs/custom/fcuny-text.el31
-rw-r--r--emacs/custom/fcuny-twitter.el13
-rw-r--r--emacs/custom/fcuny-ui.el83
-rw-r--r--emacs/custom/fcuny-vars.el16
14 files changed, 807 insertions, 0 deletions
diff --git a/emacs/custom/fcuny-conf.el b/emacs/custom/fcuny-conf.el
new file mode 100644
index 0000000..97d1d1f
--- /dev/null
+++ b/emacs/custom/fcuny-conf.el
@@ -0,0 +1,32 @@
+(use-package dockerfile-mode
+ :ensure t
+ :mode "Dockerfile[a-zA-Z.-]*\\'")
+
+(use-package yaml-mode
+ ;; At Twitter, we use PROJECT files to define a project and the
+ ;; format is YAML
+ :mode (("PROJECT" . yaml-mode))
+ :ensure t)
+
+(use-package js-mode
+ :custom
+ (json-reformat:indent-width 2)
+ (js-indent-level 2)
+ :hook ((json-mode . flyspell-prog-mode)
+ (json-mode . flycheck-mode))
+ :init
+ (if (fcuny/check-work-machine-p)
+ (add-to-list 'auto-mode-alist '("\\.workflow$" . js-mode))))
+
+(use-package jq-format
+ :ensure t)
+
+(use-package protobuf-mode
+ :ensure t
+ :hook ((protobuf-mode . flyspell-prog-mode)
+ (protobuf-mode . flycheck-mode)))
+
+(use-package systemd
+ :ensure t)
+
+(provide 'fcuny-conf)
diff --git a/emacs/custom/fcuny-defuns.el b/emacs/custom/fcuny-defuns.el
new file mode 100644
index 0000000..48a9d97
--- /dev/null
+++ b/emacs/custom/fcuny-defuns.el
@@ -0,0 +1,55 @@
+(defun fcuny/remove-mysql-columns ()
+ "Removes from text. This is useful when I want to drop the column separator from some text coming from a mysql query."
+ (interactive)
+ (while (search-forward-regexp "\s?|\s?")
+ (replace-match " ")))
+
+(defun fcuny/copy-whole-buffer ()
+ "Selects the buffer and copy it."
+ (interactive)
+ (save-excursion
+ (mark-whole-buffer)
+ (copy-region-as-kill 1 (buffer-size))))
+
+(defun fcuny/check-work-machine-p ()
+ "Returns t if this is a work machine"
+ (string-match "tw-mbp.*" (system-name)))
+
+(defun fcuny/build-python-checker ()
+ "Compiles a newer version of the checker for Python."
+ (interactive)
+ (let ((output (make-temp-file "checker-foo"))
+ (errors (make-temp-file "checker-errors"))
+ (default-directory "~/workspace/source"))
+ (let ((status (call-process "~/workspace/source/pants" nil `(,output ,errors) nil "-q" "binary" "src/python/twitter/devprod/checkstyle:check")))
+ (if (zerop status)
+ (message "Built check.pex successfully")
+ (message (buffer-file-name output))))))
+
+;; from https://karl-voit.at/2014/08/10/bookmarks-with-orgmode/
+(defun fcuny/string-replace (this withthat in)
+ "replace THIS with WITHTHAT' in the string IN"
+ (with-temp-buffer
+ (insert in)
+ (goto-char (point-min))
+ (replace-string this withthat)
+ (buffer-substring (point-min) (point-max))))
+
+(defun fcuny/get-page-title (url)
+ "Make URL into an org-mode link."
+ (let ((title))
+ (with-current-buffer (url-retrieve-synchronously url)
+ (goto-char (point-min))
+ (re-search-forward "<title>\\([^<]*\\)</title>" nil t 1)
+ (setq title (match-string 1))
+ (goto-char (point-min))
+ (re-search-forward "charset=\\([-0-9a-zA-Z]*\\)" nil t 1)
+ (fcuny/string-replace "&nbsp;" " "
+ ;;(decode-coding-string title (intern (match-string 1)))
+ ;; following line fixes charset issues from
+ ;; previous line:
+ (decode-coding-string title 'utf-8))
+ (concat "[[" url "][" title "]]"))))
+
+
+(provide 'fcuny-defuns)
diff --git a/emacs/custom/fcuny-edit.el b/emacs/custom/fcuny-edit.el
new file mode 100644
index 0000000..8ca5214
--- /dev/null
+++ b/emacs/custom/fcuny-edit.el
@@ -0,0 +1,39 @@
+(use-package autorevert
+ :config
+ (setq global-auto-revert-non-file-buffers t)
+ (setq auto-revert-verbose nil)
+ (global-auto-revert-mode t))
+
+(use-package whitespace
+ :hook ((prog-mode . fcuny/whitespace-setup)
+ (conf-mode . fcuny/whitespace-setup)
+ (outline-mode . fcuny/whitespace-setup)
+ (yaml-mode . fcuny/whitespace-setup))
+
+ :custom
+ (whitespace-style '(face))
+ (show-trailing-whitespace nil)
+
+ :init
+ (defun fcuny/whitespace-setup ()
+ (setq show-trailing-whitespace t)))
+
+(use-package electric-pair-mode
+ :commands electric-pair-mode
+ :hook (prog-mode . electric-pair-mode))
+
+(use-package paren
+ :ensure t
+ :custom
+ (show-paren-delay 0)
+ (show-paren-when-point-inside-paren t)
+ (show-paren-when-point-in-periphery t)
+ :config
+ (show-paren-mode 1))
+
+(global-set-key (kbd "M-j") 'join-line)
+
+;; don't assume that sentences should have two spaces after period.
+(setq sentence-end-double-space nil)
+
+(provide 'fcuny-edit)
diff --git a/emacs/custom/fcuny-eshell.el b/emacs/custom/fcuny-eshell.el
new file mode 100644
index 0000000..113964c
--- /dev/null
+++ b/emacs/custom/fcuny-eshell.el
@@ -0,0 +1,39 @@
+(use-package eshell
+ :hook (eshell-mode . fcuny/eshell-mode-setup)
+
+ :custom
+ (eshell-scroll-to-bottom-on-input 'all)
+ (eshell-error-if-no-glob t)
+ (eshell-hist-ignoredups t)
+ (eshell-save-history-on-exit t)
+ (eshell-prefer-lisp-functions nil)
+ (eshell-destroy-buffer-when-process-dies t)
+
+ :init
+ (defun fcuny/eshell-mode-setup ()
+ (eshell/alias "e" "find-file $1")
+ (eshell/alias "emacs" "find-file $1")
+ (eshell/alias "ee" "find-file-other-window $1")
+
+ (eshell/alias "gs" "magit-status")
+ (eshell/alias "gd" "magit-diff-unstaged")
+ (eshell/alias "gds" "magit-diff-staged")
+ (eshell/alias "d" "dired $1"))
+
+ (defun eshell/gst (&rest args)
+ (magit-status (pop args) nil)
+ (eshell/echo)) ;; The echo command suppresses output
+
+ (defun fcuny/eshell-here ()
+ "Opens up a new shell in the directory associated with the current
+buffer's file. The eshell is renamed to match that directory to make
+multiple eshell windows easier."
+ (interactive)
+ (let* ((height (/ (window-total-height) 3)))
+ (split-window-vertically (- height))
+ (other-window 1)
+ (eshell "new")
+ (insert (concat "ls"))
+ (eshell-send-input))))
+
+(provide 'fcuny-eshell)
diff --git a/emacs/custom/fcuny-flycheck.el b/emacs/custom/fcuny-flycheck.el
new file mode 100644
index 0000000..e1805b2
--- /dev/null
+++ b/emacs/custom/fcuny-flycheck.el
@@ -0,0 +1,27 @@
+(eval-when-compile
+ (require 'use-package)
+ (require 'fcuny-flycheck-py))
+
+(use-package flycheck
+ :ensure t
+ :hook (prog-mode . flycheck-mode )
+ :custom
+ (flycheck-idle-change-delay 2)
+ (flycheck-emacs-lisp-load-path 'inherit)
+ (flycheck-highlighting-mode 'lines)
+ (flycheck-check-syntax-automatically '(mode-enabled save))
+ (flycheck-disabled-checkers '(emacs-lisp-checkdoc))
+ :config
+ (progn
+ (flycheck-define-checker fcuny/source-check-python
+ "A syntax checker for python source code in Source, using `check.pex'"
+ :command ("check.pex" source)
+ ;;; errors are reported like this:
+ ;;; E241:ERROR <file name>:<line> <message>
+ :error-patterns ((error line-start (id (1+ nonl)) ":ERROR" (1+ nonl) ":" line (message) line-end)
+ (warning line-start (id (1+ nonl)) ":WARNING" (1+ nonl) ":" line (message) line-end))
+ :predicate fcuny/check-source-predicate-python-p
+ :modes (python-mode))
+ (add-to-list 'flycheck-checkers 'fcuny/source-check-python)))
+
+(provide 'fcuny-flycheck)
diff --git a/emacs/custom/fcuny-git.el b/emacs/custom/fcuny-git.el
new file mode 100644
index 0000000..e3b8c45
--- /dev/null
+++ b/emacs/custom/fcuny-git.el
@@ -0,0 +1,76 @@
+(require 'fcuny-defuns)
+
+(use-package gitconfig-mode
+ :ensure t)
+
+(use-package gitattributes-mode
+ :ensure t)
+
+(use-package gitignore-mode
+ :ensure t)
+
+(use-package magit
+ :ensure t
+ :after (flyspell)
+ :bind (("C-x g" . magit-status))
+ :custom
+ (vc-follow-symlinks t))
+
+(use-package git-commit
+ :ensure t
+ :after magit
+ :hook (git-commit-mode . fcuny/git-commit-auto-fill)
+ :custom
+ (git-commit-summary-max-length 50)
+ :preface
+ (defun fcuny/git-commit-auto-fill ()
+ "Ensures that the commit body does not exceed 72 characters."
+ (setq-local fill-column 72)
+ (setq-local comment-auto-fill-only-comments nil)))
+
+;; from https://sideshowcoder.com/2020/07/02/opening-sourcegraph-from-emacs/
+;; in a repo, add the following in .git/config:
+;;
+;; [git-link]
+;; remote = mysourcegraph.sourcegraph
+;; [remote "mysourcegraph.sourcegraph"]
+;; url = https://sourcegraph.twitter.biz/gitpuppet.twitter.biz/puppet-twitter
+;;
+(use-package git-link
+ :ensure t
+ :config
+ (defun git-link-sourcegraph (hostname dirname filename _branch commit start end)
+ (let ((line-or-range (if end (format "%s-%s" start end) start)))
+ (format "https://%s/%s@%s/-/blob/%s#L%s"
+ hostname
+ dirname
+ commit
+ filename
+ line-or-range)))
+
+ (defun git-link-commit-sourcegraph (hostname dirname commit)
+ (format "https://%s/%s/-/commit/%s"
+ hostname
+ dirname
+ commit))
+
+ (add-to-list 'git-link-remote-alist '("sourcegraph" git-link-sourcegraph))
+ (add-to-list 'git-link-commit-remote-alist '("sourcegraph" git-link-commit-sourcegraph))
+
+ (setq git-link-open-in-browser 't))
+
+;; https://magit.vc/manual/magit/Per_002dRepository-Configuration.html
+;; we don't want to refresh buffers in source. This should help with
+;; performances.
+(dir-locals-set-class-variables 'huge-git-repository
+ '((nil . ((magit-refresh-buffers . nil)))))
+
+(dir-locals-set-directory-class
+ "/Users/fcuny/workspace/source" 'huge-git-repository)
+
+;; https://magit.vc/manual/magit/Performance.html
+;; disable Git from the VC mode, since we use magit. This should help
+;; with performances.
+(setq vc-handled-backends (delq 'Git vc-handled-backends))
+
+(provide 'fcuny-git)
diff --git a/emacs/custom/fcuny-navigation.el b/emacs/custom/fcuny-navigation.el
new file mode 100644
index 0000000..49309a5
--- /dev/null
+++ b/emacs/custom/fcuny-navigation.el
@@ -0,0 +1,128 @@
+(require 'fcuny-vars)
+
+(use-package bookmark
+ :custom
+ (bookmark-default-file (expand-file-name "bookmarks" fcuny/path-emacs-var))
+ (bookmark-save-flag 1))
+
+(use-package ls-lisp
+ :ensure nil
+ :custom
+ (ls-lisp-use-insert-directory-program nil)
+ (ls-lisp-dirs-first t))
+
+(use-package dired
+ :defer t
+ :bind (("C-x C-d" . dired)
+ ("C-x C-j" . dired-jump))
+ :init
+ (setq-default dired-dwim-target t)
+ (setq-default dired-listing-switches "-alh")
+ (setq dired-recursive-deletes 'always)
+ (setq dired-recursive-copies 'always))
+
+(use-package dired-x
+ :ensure nil
+ :config
+ (progn
+ (setq dired-omit-verbose nil)
+ ;; hide backup, autosave, *.*~ files
+ ;; omit mode can be toggled using `C-x M-o' in dired buffer.
+ (add-hook 'dired-mode-hook #'dired-omit-mode)
+ (setq dired-omit-files
+ (concat dired-omit-files "\\|^.DS_Store$\\|^.localized$\\|^.projectile$\\|^.git$"))))
+
+(use-package ibuffer
+ :bind ("C-x C-b" . ibuffer)
+ :custom
+ (ibuffer-saved-filter-groups
+ (quote (("default"
+ ("org" (mode . org-mode))
+ ("go" (mode . go-mode))
+ ("python" (mode . python-mode))
+ ("config" (or
+ (name . "\\.conf$")
+ (name . "\\.json$")
+ (mode . yaml-mode)))
+ ("puppet" (or
+ (mode . "\\.erb$")
+ (mode . puppet-mode)))
+ ("scripts" (mode . sh-mode))
+ ("documentation" (or
+ (mode . markdown-mode)
+ (mode . rst-mode)))
+ ("dired" (mode . dired-mode))
+ ("Emacs" (or
+ (mode . emacs-lisp-mode)
+ (name . "^\\*scratch\\*$")
+ (name . "^\\.emacs")
+ (name . "^\\*Messages\\*$")))))))
+ :init
+ (add-hook 'ibuffer-mode-hook (lambda () (ibuffer-switch-to-saved-filter-groups "default"))))
+
+(use-package recentf
+ :init (recentf-mode 1)
+ :config
+ (add-to-list 'recentf-exclude "\\.emacs.d")
+ (add-to-list 'recentf-exclude ".+tmp......\\.org")
+ (setq recentf-max-saved-items 500
+ recentf-save-file (expand-file-name "var/recentf" user-emacs-directory)))
+
+(use-package rg
+ :ensure t
+ :custom
+ (rg-group-result t)
+ (rg-show-columns t)
+ (rg-align-position-numbers t)
+ (rg-align-line-number-field-length 3)
+ (rg-align-column-number-field-length 3)
+ (rg-align-line-column-separator "#")
+ (rg-align-position-content-separator "|"))
+
+(use-package counsel
+ :diminish counsel-mode
+ :ensure t
+ :after ivy
+ :init (counsel-mode 1)
+ :bind
+ (("M-x" . counsel-M-x)
+ ("C-x C-f" . counsel-find-file)
+ ("C-x C-r" . counsel-recentf)
+ ("C-c i " . counsel-imenu)
+ ("C-c f" . counsel-git)
+ ("C-c /" . counsel-rg)
+ ("C-x r l" . counsel-bookmark))
+ :custom
+ (counsel-find-file-ignore-regexp "\\.git\\|\\.DS_Store\\|\\.localized\\'")
+ (counsel-find-file-at-point t))
+
+(use-package ivy
+ :ensure t
+ :diminish ivy-mode
+ :init (ivy-mode 1)
+ :custom
+ (ivy-use-virtual-buffers t)
+ (ivy-count-format "(%d/%d) ")
+ (ivy-height 20)
+ (ivy-use-selectable-prompt t)
+ :bind (("C-x b" . ivy-switch-buffer)
+ ("C-s" . swiper)))
+
+(use-package ivy-rich
+ :ensure t
+ :after (ivy)
+ :config
+ (ivy-rich-mode 1)
+ :custom
+ (ivy-extra-directories '("../" "./"))
+ (ivy-virtual-abbreviate 'full)
+ (ivy-rich-switch-buffer-align-virtual-buffer t)
+ (ivy-rich-path-style 'abbrev))
+
+(use-package which-key
+ :diminish which-key-mode
+ :ensure t
+ :config
+ (which-key-mode))
+
+(provide 'fcuny-navigation)
diff --git a/emacs/custom/fcuny-org.el b/emacs/custom/fcuny-org.el
new file mode 100644
index 0000000..92e0e65
--- /dev/null
+++ b/emacs/custom/fcuny-org.el
@@ -0,0 +1,113 @@
+(require 'fcuny-vars)
+
+(use-package htmlize
+ :ensure t)
+
+(use-package org
+ :ensure t
+ :mode (("\\.txt\\'" . org-mode))
+ :hook ((org-mode . org-indent-mode)
+ (org-mode . org-hide-block-all)
+ (org-mode . visual-line-mode)
+ (org-capture-after-finalize . org-save-all-org-buffers)
+ (org-capture-prepare-finalize . org-save-all-org-buffers))
+ :bind (("C-c c" . org-capture)
+ ("C-c a" . org-agenda))
+
+ :config
+ (defvar load-language-list '((emacs-lisp . t)
+ (python . t)
+ (shell . t)))
+ (use-package ob-go
+ :ensure t
+ :init (cl-pushnew '(go . t) load-language-list))
+
+ (org-babel-do-load-languages 'org-babel-load-languages
+ load-language-list)
+
+ :custom
+ (org-id-locations-file (concat fcuny/path-emacs-var "/org-id-locations"))
+
+ (org-directory (expand-file-name "~/Documents/Notebooks"))
+ (org-default-inbox-file (concat org-directory "/inbox.org"))
+ (org-default-notes-file (concat org-directory "/notes.org"))
+ (org-default-habit-file (concat org-directory "/habits.org"))
+ (org-default-tasks-file (concat org-directory "/personal-tasks.org"))
+ (org-default-work-tasks-file (concat org-directory "/work-tasks.org"))
+ (org-default-journal-file (concat org-directory "/personal-journal.org"))
+ (org-default-work-journal-file (concat org-directory "/work-journal.org"))
+ (org-default-interview-file (concat org-directory "/interviews.org"))
+
+ ;; when archiving, inherit the tags from the parent
+ (org-archive-subtree-add-inherited-tags t)
+
+ ;; display unicode characters
+ (org-pretty-entities t)
+
+ ;; log the time of completion
+ (org-log-done 'time)
+
+ ;; priorities
+ (org-priority-start-cycle-with-default nil) ;; Start one over/under default value.
+ (org-lowest-priority ?F)
+ (org-default-priority ?D) ;; Ensures unset tasks have low priority.
+
+ ;; agenda related
+ (calendar-week-start-day 1) ;; org-mode uses calendar for the date picker, and I want this to start on Monday
+ (org-agenda-start-on-weekday 1) ;; this is specific to org-agenda
+ (org-agenda-files `(,org-default-tasks-file
+ ,org-default-work-tasks-file
+ ,org-default-habit-file))
+
+ ;; org babel related
+ ;; prevent the conversion of spaces into tabs (necessary for Python code exports)
+ (org-src-fontify-natively t)
+ (org-src-preserve-indentation t)
+ (org-edit-src-content-indentation t)
+
+ ;; I want to follow links on RET
+ (org-return-follows-link t)
+
+ ;; some configurations for exporting document
+ (org-export-with-toc nil)
+ (org-export-with-section-numbers nil)
+
+ ;; A few abbreviations I use regularly
+ (org-link-abbrev-alist
+ '(("src" . "~/workspace/%s")
+ ("jira" . "https://jira.twitter.biz/browse/%s")
+ ("ph" . "https://phabricator.twitter.biz/%s")
+ ("go" . "http://go/%s")))
+
+ ;; entries
+ (org-blank-before-new-entry nil)
+ (org-blank-before-new-entry (quote ((heading . nil)
+ (plain-list-item . nil))))
+
+ ;; see https://github.com/abo-abo/swiper/issues/986
+ (org-goto-interface 'outline-path-completion)
+
+ (org-reverse-note-order t)
+
+ (org-capture-templates
+ `(("t" "Todo [inbox]" entry
+ (file+headline ,org-default-inbox-file "Tasks")
+ "* TODO [#D] %?\n:PROPERTIES:\n:ID: %(shell-command-to-string \"uuidgen\"):CREATED: %U\n:END:\n")
+
+ ("n" "Note" entry
+ (file ,org-default-notes-file)
+ "* NOTE %?\n:PROPERTIES:\n:ID: %(shell-command-to-string \"uuidgen\"):CREATED: %U\n:END:\n")
+
+ ("j" "Journal" entry
+ (file+olp+datetree ,org-default-journal-file)
+ "* %?\n:PROPERTIES:\n:ID: %(shell-command-to-string \"uuidgen\"):CREATED: %U\n:END:\n" :tree-type month)
+
+ ("i" "Interview notes" entry
+ (file+olp+datetree ,org-default-interview-file)
+ (file ,(concat fcuny/path-emacs-etc "/interview.org")))
+
+ ("J" "Work Journal" entry
+ (file+olp+datetree ,org-default-work-journal-file)
+ "* %?\n:PROPERTIES:\n:ID: %(shell-command-to-string \"uuidgen\"):CREATED: %U\n:END:\n" :tree-type month))))
+
+(provide 'fcuny-org)
diff --git a/emacs/custom/fcuny-prog.el b/emacs/custom/fcuny-prog.el
new file mode 100644
index 0000000..9717df0
--- /dev/null
+++ b/emacs/custom/fcuny-prog.el
@@ -0,0 +1,99 @@
+(require 'fcuny-vars)
+
+(use-package auto-fill
+ :hook (prog-mode . auto-fill-mode)
+ :custom
+ ;; this does not seem to work ..
+ (comment-fill-column 80)
+ (comment-auto-fill-only-comments t))
+
+(use-package company
+ :ensure t
+ :diminish company-mode
+ :custom
+ (company-minimum-prefix-length 2)
+ (company-tooltip-align-annotations t)
+ (company-tooltip-limit 12)
+ (company-idle-delay 1))
+
+(use-package lsp-mode
+ :ensure t
+ :commands (lsp lsp-deferred)
+ :diminish lsp-mode
+ :hook (((go-mode) . lsp-deferred)
+ (lsp-mode . (lambda() (let ((lsp-keymap-prefix "C-c l"))
+ (lsp-enable-which-key-integration)))))
+ :config
+ (define-key lsp-mode-map (kbd "C-c l") lsp-command-map)
+ :bind
+ (("C-c l i" . lsp-ui-imenu))
+ :custom
+ (lsp-session-file (expand-file-name "lsp-session-v1" fcuny/path-emacs-var))
+ (lsp-enable-snippet t)
+ (lsp-signature-doc-lines 5)
+ (lsp-modeline-diagnostic-scope :workspace)
+ (lsp-completion-provider :capf)
+ (lsp-completion-enable t)
+ (lsp-enable-indentation t)
+ (lsp-prefer-flymake nil))
+
+(use-package lsp-ui
+ :ensure t
+ :hook (lsp-mode . lsp-ui-mode)
+ :commands lsp-ui-mode
+ :custom
+ (lsp-ui-doc-delay 0.4)
+ (lsp-ui-doc-enable t)
+ (lsp-ui-doc-position 'top)
+ (lsp-ui-doc-include-signature t)
+ (lsp-ui-peek-enable t)
+ (lsp-ui-sideline-enable t)
+ (lsp-ui-imenu-enable t)
+ (lsp-ui-flycheck-enable t))
+
+(use-package lsp-ivy
+ :ensure t
+ :commands lsp-ivy-workspace-symbol)
+
+(use-package sh-script
+ :mode ("bashrc" . sh-mode)
+ :hook (after-save . executable-make-buffer-file-executable-if-script-p)
+ :config
+ (setq-default sh-indentation 2
+ sh-basic-offset 2))
+
+(use-package python
+ :mode (("\\.py$" . python-mode)
+ ("\\.aurora$" . python-mode))
+ :commands python-mode
+ :hook ((python-mode . eldoc-mode))
+ :custom (python-indent-offset 2))
+
+(use-package make-mode
+ :config
+ (add-hook 'makefile-mode-hook (lambda () (setq-local tab-width 2))))
+
+(use-package go-mode
+ :ensure t
+ :hook ((before-save . lsp-format-buffer)
+ (before-save . lsp-organize-imports))
+ :config
+ (when (memq window-system '(mac ns))
+ (exec-path-from-shell-copy-env "GOPATH"))
+ :custom
+ (tab-width 4))
+
+(use-package gotest
+ :ensure t)
+
+(use-package lisp-mode
+ :bind
+ (("C-c C-e" . eval-buffer)
+ ("C-c C-r" . eval-region)))
+
+(use-package puppet-mode
+ :ensure t
+ :bind (:map puppet-mode-map
+ ("C-c |" . puppet-align-block)))
+
+(provide 'fcuny-prog)
diff --git a/emacs/custom/fcuny-settings.el b/emacs/custom/fcuny-settings.el
new file mode 100644
index 0000000..a5ecc87
--- /dev/null
+++ b/emacs/custom/fcuny-settings.el
@@ -0,0 +1,56 @@
+(require 'fcuny-vars)
+
+;; set utf-8 as the default encoding
+(prefer-coding-system 'utf-8-unix)
+(setq locale-coding-system 'utf-8)
+(set-language-environment 'utf-8)
+(set-terminal-coding-system 'utf-8)
+(set-keyboard-coding-system 'utf-8)
+
+;; alias yes-or-no to y-or-n
+(fset 'yes-or-no-p 'y-or-n-p)
+
+(setq auto-save-default nil) ;; don't auto save files
+(setq auto-save-list-file-prefix nil) ;; no backups
+(setq create-lockfiles nil) ;; don't use a lock file
+(setq custom-file fcuny/custom-settings) ;; where to save custom settings
+(setq make-backup-files nil) ;; really no backups
+(setq minibuffer-message-timeout 0.5) ;; How long to display an echo-area message
+(setq next-screen-context-lines 5) ;; scroll 5 lines at a time
+(setq require-final-newline t) ;; ensure newline exists at the end of the file
+(setq ring-bell-function 'ignore) ;; really no bell
+(setq tab-always-indent 'complete) ;; when using TAB, always indent
+(setq visible-bell nil) ;; no bell
+(setq column-number-mode t) ;; show column number in the mode line
+(setq-default indent-tabs-mode nil) ;; turn off tab indentation
+(setq-default cursor-type 'hbar) ;; cursor is a horizontal bar
+(setq vc-handled-backends nil) ;; don't use the VC backend, it's too slow with source
+(setq-default delete-by-moving-to-trash t) ;; delete files by moving them to the trash
+(setq initial-scratch-message "") ;; empty scratch buffer
+
+(custom-set-variables
+ '(use-file-dialog nil)
+ '(use-dialog-box nil)
+ '(inhibit-startup-screen t)
+ '(inhibit-startup-message t)
+ '(inhibit-startup-echo-area-message t))
+
+(setq user-full-name "franck cuny"
+ user-mail-address "franck@fcuny.net"
+ add-log-mailing-address "franck@fcuny.net")
+
+(use-package midnight
+ :config
+ (midnight-mode t))
+
+(use-package server
+ :hook (after-init . server-start))
+
+(use-package exec-path-from-shell
+ :ensure t
+ :init (exec-path-from-shell-initialize)
+ (when (memq window-system '(mac ns))
+ (exec-path-from-shell-initialize))
+ (exec-path-from-shell-copy-env "GOPATH"))
+
+(provide 'fcuny-settings)
diff --git a/emacs/custom/fcuny-text.el b/emacs/custom/fcuny-text.el
new file mode 100644
index 0000000..45198a1
--- /dev/null
+++ b/emacs/custom/fcuny-text.el
@@ -0,0 +1,31 @@
+(use-package flyspell
+ :ensure t
+ :if (executable-find "aspell")
+ :hook ((text-mode . flyspell-mode)
+ (prog-mode . flyspell-prog-mode))
+ :custom
+ (ispell-dictionary "en_US")
+ (ispell-program-name "aspell")
+ :config
+ (use-package flyspell-correct-ivy
+ :after flyspell
+ :ensure t
+ :bind (:map flyspell-mode-map
+ ("C-M-:" . flyspell-correct-at-point))
+ :custom
+ (flyspell-correct-interface #'flyspell-correct-ivy)))
+
+(use-package markdown-mode
+ :ensure t
+ :after (flyspell)
+ :commands (markdown-mode gfm-mode)
+ :mode (("README\\.md\\'" . gfm-mode)
+ ("\\.md\\'" . gfm-mode)
+ ("\\.markdown\\'" . gfm-mode))
+ :custom
+ (markdown-fontify-code-blocks-natively t)
+ :config
+ (when (executable-find "pandoc")
+ (setq markdown-command "pandoc -f markdown -t html")))
+
+(provide 'fcuny-text)
diff --git a/emacs/custom/fcuny-twitter.el b/emacs/custom/fcuny-twitter.el
new file mode 100644
index 0000000..ea3e424
--- /dev/null
+++ b/emacs/custom/fcuny-twitter.el
@@ -0,0 +1,13 @@
+(require 'fcuny-vars)
+
+(use-package pants
+ :load-path (lambda () (expand-file-name "pants.el" fcuny/path-workspace))
+ :mode (("BUILD\\'" . pants-build-mode))
+ :commands (pants-build-fmt pants-run-fmt pants-run-test pants-run-binary pants-run-python-repl)
+ :custom
+ (pants-completion-system 'ivy)
+ (pants-bury-compilation-buffer +1)
+ (pants-build-format-exec (expand-file-name "source/pants-support/buildifier/bin/buildifier" fcuny/path-workspace))
+ (pants-source-tree-root (expand-file-name "source" fcuny/path-workspace)))
+
+(provide 'fcuny-twitter)
diff --git a/emacs/custom/fcuny-ui.el b/emacs/custom/fcuny-ui.el
new file mode 100644
index 0000000..5daef2e
--- /dev/null
+++ b/emacs/custom/fcuny-ui.el
@@ -0,0 +1,83 @@
+(use-package fringe
+ :custom
+ (left-fringe-width 5)
+ (right-fringe-width 5))
+
+(use-package scroll-bar
+ :config
+ (scroll-bar-mode -1))
+
+(use-package tool-bar
+ :config
+ (tool-bar-mode -1))
+
+(use-package menu-bar
+ :config
+ (menu-bar-mode -1))
+
+(use-package modus-themes
+ :ensure t
+ :init
+ (use-package modus-operandi-theme)
+ (use-package modus-vivendi-theme)
+ :config (load-theme 'modus-operandi t)
+ :custom
+ (modus-themes-bold-constructs t)
+ (modus-themes-fringes nil)
+ (modus-themes-slanted-constructs t)
+ (modus-themes-mode-line '3d)
+ (modus-themes-syntax nil)
+ (Modus-themes-intense-hl-line nil)
+ (modus-themes-paren-match 'intense-bold)
+ (modus-themes-links 'neutral-underline)
+ (modus-themes-prompts 'subtle)
+ (modus-themes-completions nil)
+ (modus-themes-region 'bg-only-no-extend)
+ (modus-themes-diffs 'bg-only)
+ (modus-themes-variable-pitch-headings t)
+ (modus-themes-scale-headings t)
+ (modus-themes-scale-1 1.1)
+ (modus-themes-scale-2 1.15)
+ (modus-themes-scale-3 1.21)
+ (modus-themes-scale-4 1.27)
+ (modus-themes-scale-5 1.33))
+
+(use-package diminish
+ :ensure t)
+
+(use-package frame
+ :config
+ (blink-cursor-mode -1)
+ (setq frame-title-format "%b")
+ (when (memq window-system '(mac ns))
+ (set-frame-font "Source Code Pro-14")
+ (add-to-list 'default-frame-alist '(fullscreen . maximized))
+ (add-to-list 'default-frame-alist '(ns-appearance . nil))
+ (add-to-list 'default-frame-alist '(ns-transparent-titlebar . nil))
+ (setq ns-use-native-fullscreen nil)
+ (setq mac-allow-anti-aliasing t))
+ (when (memq window-system '(x))
+ (set-frame-font "Source Code Pro-11")
+ ;; this is a fall back in the case we have unicode characeters.
+ ;; For example, with this settings, the following source is
+ ;; rendered correctly 😇 😀 and 🤢
+ (set-fontset-font "fontset-default" nil
+ (font-spec :name "Noto Color Emoji"))))
+
+(use-package hl-line
+ :hook ((prog-mode text-mode conf-mode special-mode) . hl-line-mode)
+ :custom
+ ;; Not having to render the hl-line overlay in multiple buffers offers a tiny
+ ;; performance boost. I also don't need to see it in other buffers.
+ (hl-line-sticky-flag nil)
+ (global-hl-line-sticky-flag nil))
+
+(use-package uniquify
+ :defer 5
+ :config
+ ;; don't muck with special buffers
+ (setq uniquify-ignore-buffers-re "^\\*")
+ (setq uniquify-buffer-name-style 'forward)
+ (setq uniquify-separator "/"))
+
+(provide 'fcuny-ui)
diff --git a/emacs/custom/fcuny-vars.el b/emacs/custom/fcuny-vars.el
new file mode 100644
index 0000000..f3efe6a
--- /dev/null
+++ b/emacs/custom/fcuny-vars.el
@@ -0,0 +1,16 @@
+(defvar fcuny/path-emacs-var (expand-file-name "var" user-emacs-directory)
+ "Path to some files for Emacs.")
+
+(defvar fcuny/path-emacs-etc (expand-file-name "etc" user-emacs-directory)
+ "Path to some files for Emacs.")
+
+(defvar fcuny/custom-settings (expand-file-name "emacs-custom.el" fcuny/path-emacs-var)
+ "Path to emacs custom variables.")
+
+(defvar fcuny/path-emacs-elpa (expand-file-name "elpa" fcuny/path-emacs-var)
+ "Path to elpa's local files.")
+
+(defvar fcuny/path-workspace (expand-file-name "workspace" (getenv "HOME"))
+ "Path to the workspace.")
+
+(provide 'fcuny-vars)