;;; core.el -- Summary ;;; Emacs initialization file ;;; john@d0ty.me ;;; ;;; Commentary: ;;; This is my .emacs. ;;; There are many like it, but this one is mine. ;;; ;;; 2016/12/03 - Just a note: been using Emacs far more heavily as my core ;;; editor @ FB for some reason. (They push a set of packages ;;; called Nuclide for the Atom editor, but I stopped using ;;; that.) ;;; ;;; 2014/03/31 - Well, it isn't actually named .emacs anymore; but this is ;;; the real initialization file, for code and junk. init.el ;;; just does the package load stuff now. Don't know why ;;; package init was built to work like it does in Emacs 24, but ;;; oh well. ;;; ;;; Abandoning el-get for ELPA; ELPA seems more official and ;;; more like what I want anyhow. Of course, this needs the ;;; two-file-dance, but it's worth it. Much of the ;;; infrastructure is based on starter-kit: ;;; ;;; https://github.com/eschulte/emacs24-starter-kit/blob/master/starter-kit.org ;;; ;;; 2014/03/21 - Started to re-work it based on https://github.com/dimitri/emacs-kicker/blob/master/init.el ;;; ;;; This Emacs file has been around for a very long time, and it ;;; has accumulated a lot of stuff. I'd like to try to clean it ;;; up a little bit.... ;;; ;;; ...turns out that lots of the customization still makes ;;; sense. But fetching the packages is still the hard part. ;;; ;;; Code: ;; ================================================================= ;; First, before anything... server goop. ;; ================================================================= (require 'server) (if (not (server-running-p)) (server-start)) ;; ================================================================= ;; Various bits of path setup (init-dir is defined by init.el) ;; ================================================================= (setq autoload-file (concat init-dir "loaddefs.el")) (setq package-user-dir (concat init-dir "elpa")) (setq custom-file (concat init-dir "custom.el")) (load custom-file) ;; ================================================================= ;; FB STUFF ;; ================================================================= (defconst master-dir (getenv "LOCAL_ADMIN_SCRIPTS")) (defconst engshare-master (getenv "ADMIN_SCRIPTS")) (defconst is-fb-environment (or (file-exists-p (expand-file-name "master.emacs" master-dir)) (file-exists-p (expand-file-name "master.emacs" engshare-master)))) (if is-fb-environment (progn ;; Load the master.emacs file which apparently has stuff in it I want? (if (file-exists-p (expand-file-name "master.emacs" master-dir)) (load-library (expand-file-name "master.emacs" master-dir)) (if (file-exists-p (expand-file-name "master.emacs" engshare-master)) (load-library (expand-file-name "master.emacs" engshare-master)))) ;; Set up the proxy for working properly from the devserver. (if (and (getenv "HOSTNAME") (string-match-p ".+\.prn1\.facebook\.com" (getenv "HOSTNAME"))) (setq url-proxy-services '(("no_proxy" . "^\\(localhost\\|10.*\\)") ("http" . "fwdproxy:8080") ("https" . "fwdproxy:8080")))) )) ;; ================================================================= ;; Common stuff that's needed once ;; ================================================================= (require 'cl) (require 'saveplace) (require 'ffap) (require 'uniquify) (require 'ansi-color) (require 'recentf) ;; ================================================================= ;; Packages ;; ================================================================= (setq package-archives '(("gnu" . "http://elpa.gnu.org/packages/") ("org" . "http://orgmode.org/elpa/") ("melpa" . "http://melpa.org/packages/") ("marmalade" . "https://marmalade-repo.org/packages/"))) (when (< emacs-major-version 24) ;; For important compatibility libraries like cl-lib (add-to-list 'package-archives '("gnu" . "http://elpa.gnu.org/packages/"))) (package-initialize) (defvar my-packages (list 'auto-complete ; complete as you type with overlays 'auto-complete-nxml ; Auto-complete for nxml 'color-theme ; Color themes... 'color-theme-monokai ; ...Monokai 'color-theme-solarized ; ...Solarized 'csharp-mode ; C# mode 'exec-path-from-shell ; Fix path on MacOS 'flycheck ; Checking 'flymake ; Compiling 'flyspell ; Spell-checking 'go-autocomplete ; Autocomplete for golang 'go-mode ; Go programming language mode 'js2-mode ; Improved JS mode 'json-mode ; JSON mode 'lua-mode ; LUA 'magit ; Magit! SO GOOD. 'paredit ; Also good for lisps. 'popup ; Pretty completions? 'python-mode ; Python 'ruby-mode ; Major mode for editing Ruby files 'switch-window ; takes over C-x o 'tss ; Typescript, ala https://github.com/aki2o/emacs-tss 'web-mode ; Mixed mode web editing 'zencoding-mode ; http://www.emacswiki.org/emacs/ZenCoding 'tuareg ; ocaml 'merlin ; ocaml completion stuff ) "Libraries that should be installed by default.") (unless package-archive-contents (package-refresh-contents)) (dolist (package my-packages) (unless (package-installed-p package) (package-install package))) ;; ================================================================= ;; Load Path Customization ;; ================================================================= ;; add private lisp directory to load-path. (add-to-list 'load-path "~/site-lisp") ;; ================================================================= ;; EMACS general look and feel ;; ================================================================= ;; If you want to have comments displayed in italics, ;; uncomment the following line. Note that this must ;; be done before font settings! (Emacs 20) (setq w32-enable-italics t) ;; Shut off annoying sound (if (fboundp 'set-message-beep) (set-message-beep 'silent)) ;; Set the icon and frame titles %f file name, %b buffer name (setq frame-title-format "%f") (setq icon-title-format "%b") ;; show column number in status bar (setq column-number-mode t) ;; make searches case-INsensitive (set-default 'case-fold-search t) ;; Enable uppercase or lowercase conversions (put 'downcase-region 'disabled nil) (put 'upcase-region 'disabled nil) ;; Stop blinking! For the love of god, STOP BLINKING!!! (blink-cursor-mode 0) ;; No tool bars! No menu bars! I don't use that stuff anyway. (if (fboundp 'tool-bar-mode) (tool-bar-mode -1)) (if (fboundp 'menu-bar-mode) (menu-bar-mode -1)) ;; Modeline format: (display-time-mode -1) ;; ================================================================ ;; Fonts and windows and the like, only if graphics. ;; ================================================================ ;; ;; (I added this because for some reason on 2016-09-26 my emacs started ;; segfaulting on my devserver when it called find-font, and I'll be damned ;; if I'm going to debug it.) ;; (require 'cl) (if (display-graphic-p) (progn ;; Consolas. (And, to a lesser extent, Inconsolata.) ;; (defun font-candidate (&rest fonts) "Return existing font which first match." (find-if (lambda (f) (find-font (font-spec :name f))) fonts)) (setq my-font-choice (font-candidate "Input Mono-12:weight=light" "Consolas-10" "Inconsolata-11")) ;; This is just here for playing with things. ;; (set-frame-font my-font-choice) ;; ;; To obtain new font string, execute eval-expression, and eval this: ;;(insert(prin1-to-string(w32-select-font))) ;; This will show the required string in the scratch buffer. (setq jd-frame-height (cond ((> (display-pixel-height) 900) 60) ((> (display-pixel-height) 768) 48) ('t 40))) ;; frame settings. default-frame-alist controls what a default frame ;; looks like. (setq default-frame-alist `((font . ,my-font-choice) (width . 91) (height . ,jd-frame-height) ,@default-frame-alist)) ;; initial-frame-alist controls what the first frame looks like. (setq initial-frame-alist `((font . ,my-font-choice) (width . 91) (height . ,jd-frame-height))))) ;; ================================================================= ;; FUN WITH KEY BINDINGS! YAAAAYYY!!! ;; ================================================================= (global-set-key (read-kbd-macro "M-g") 'goto-line) (global-set-key (read-kbd-macro "C-q") 'copy-region-as-kill) (global-set-key (read-kbd-macro "C-w") 'kill-region) (global-set-key (read-kbd-macro "") 'beginning-of-buffer) (global-set-key (read-kbd-macro "") 'end-of-buffer) (global-set-key (read-kbd-macro "M-1") 'new-frame) (global-set-key (read-kbd-macro "M-3") 'delete-frame) (global-set-key (read-kbd-macro "C-x f") 'font-lock-fontify-buffer) ;; In addition, make sure various things are working properly with xterm-keys ;; on under tmux. (This has been the most reliable way to get putty to send ;; the right keystrokes into emacs.) (defadvice terminal-init-screen ;; The advice is named `tmux', and is run before `terminal-init-screen' runs. (before tmux activate) "Apply xterm keymap, allowing use of keys passed through tmux." (if (getenv "TMUX") (let ((map (copy-keymap xterm-function-map))) (set-keymap-parent map (keymap-parent input-decode-map)) (set-keymap-parent input-decode-map map)))) ;; ================================================================= ;; Random Goo. ;; Drunken men who don't know where they are, and no longer care. ;; ================================================================= ;; Font Menus (setq w32-use-w32-font-dialog t) ;; Adaptive fill for everybody! (require 'filladapt) (setq-default filladapt-mode t) ;; We're going to stop doing ido and start doing helm, maybe? (require 'ido) ;; Cleanup all the whitespaces. (add-hook 'before-save-hook 'whitespace-cleanup) ;; Fix path loading on MacOS X (when (memq window-system '(mac ns)) (exec-path-from-shell-initialize)) ;; ================================================================= ;; Text mode configuration. ;; ================================================================= (defun my-text-mode-hook () (setq fill-column 70) (turn-on-auto-fill) (flyspell-mode)) (add-hook 'text-mode-hook 'my-text-mode-hook) ;; ================================================================= ;; CC-Mode configuration. Stuff that makes working in IDL, C, and ;; C++ a whole lot more tolerable. ;; ================================================================= ;; ;; Hey, I know what! Let's force enter to indent the line we're adding, ;; automatically! That might be nifty! ;; ;; Turn on fill mode for c-mode, and put c-context-line-break in ;; for newlines. ;; ;; Also, to get the neat vs-like behaviour, indent the block when you ;; type a closing curly brace... ;; (defun indent-on-closing-bracket (arg) (interactive "p") (let ((m1 (make-marker)) (m2 (make-marker))) (self-insert-command arg) (set-marker m2 (point)) (forward-char 1) (c-backward-token-1 1 t) (set-marker m1 (point)) (goto-char m2) (indent-region m1 m2 nil))) (defun my-c-common-hook () (turn-on-auto-fill) (flyspell-prog-mode) (define-key c-mode-base-map "\C-m" 'c-context-line-break) (set-fill-column 120) (local-set-key "}" 'indent-on-closing-bracket)) (add-hook 'c-mode-common-hook 'my-c-common-hook) ;; Don't know why I need this all of a sudden... (require 'flymake) ;; To make working w/ idl files easier: (defun idl-insert-guid () "Insert a GUID into the current buffer" (interactive) (call-process "uuidgen" nil t) (backward-delete-char 1)) (defun idl-insert-interface () "Insert a well-formed interface definition (complete with new GUID) into the current buffer" (interactive) (insert "[\n") (insert " object,\n") (insert " pointer_default(unique),\n") (insert " uuid(") (idl-insert-guid) (insert ")\n") (insert "]\n") (insert "interface : IUnknown\n") (insert "{\n") (insert "}\n")) (add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode)) (add-to-list 'auto-mode-alist '("\\.w\\'" . c++-mode)) (defun my-makefile-hook () (setq-local indent-tabs-mode nil) ;; Makefiles haven't needed tabs for a long time. ) (add-hook 'makefile-mode-hook 'my-makefile-hook) (add-to-list 'auto-mode-alist '("makefile" . makefile-mode)) (add-to-list 'auto-mode-alist '("sources" . makefile-mode)) (add-to-list 'auto-mode-alist '("dirs" . makefile-mode)) ;; My c-mode stuff: (c-add-style "ms-c" '("gnu" (c-basic-offset . 4) (c-offsets-alist . ((c . c-lineup-C-comments) (inclass . +) (access-label . -) (defun-block-intro . +) (substatement-open . 0) (statement-block-intro . +) (innamespace . +) (statement-case-intro . +) (statement-case-open . 0) (brace-list-intro . +) (substatement . +) (arglist-intro . +) (arglist-close . 0) (statement-case-open . +) )))) (c-add-style "fb-c" '("gnu" (c-basic-offset . 2) (c-offsets-alist . ((c . c-lineup-C-comments) (inclass . +) (access-label . -) (defun-block-intro . +) (substatement-open . 0) (statement-block-intro . +) (innamespace . +) (statement-case-intro . +) (statement-case-open . 0) (brace-list-intro . +) (substatement . +) (arglist-intro . +) (arglist-close . 0) (statement-case-open . +) )))) (defun my-c-mode-hook () (c-set-style (if is-fb-environment "fb-c" "ms-c"))) (add-hook 'c-mode-hook 'my-c-mode-hook) (add-hook 'c++-mode-hook 'my-c-mode-hook) (add-hook 'java-mode-hook 'my-c-mode-hook) (font-lock-add-keywords 'c-mode '(("\\<\\(__try\\)" 1 font-lock-keyword-face t))) (font-lock-add-keywords 'c++-mode '(("\\<\\(__try\\)" 1 font-lock-keyword-face t))) (font-lock-add-keywords 'c-mode '(("\\<\\(__finally\\)" 1 font-lock-keyword-face t))) (font-lock-add-keywords 'c++-mode '(("\\<\\(__finally\\)" 1 font-lock-keyword-face t))) (font-lock-add-keywords 'c-mode '(("\\<\\(__except\\)" 1 font-lock-keyword-face t))) (font-lock-add-keywords 'c++-mode '(("\\<\\(__except\\)" 1 font-lock-keyword-face t))) ;; Warnings and such. (set-face-background 'font-lock-warning-face "Yellow") (set-face-bold-p 'font-lock-warning-face t) (defun add-todo-keyword (word) (font-lock-add-keywords 'c++-mode (list (list (concat "\\<\\(" word "\\):") 1 font-lock-warning-face t))) (font-lock-add-keywords 'c-mode (list (list (concat "\\<\\(" word "\\):") 1 font-lock-warning-face t))) (font-lock-add-keywords 'java-mode (list (list (concat "\\<\\(" word "\\):") 1 font-lock-warning-face t))) (font-lock-add-keywords 'csharp-mode (list (list (concat "\\<\\(" word "\\):") 1 font-lock-warning-face t))) ) (add-todo-keyword "REVIEW") (add-todo-keyword "FIXME") (add-todo-keyword "TODO") (add-todo-keyword "BUG") (add-todo-keyword "BUG BUG") (add-todo-keyword "BUG BUG BUG") (add-todo-keyword "BUGBUG") (add-todo-keyword "BUGBUGBUG") (add-todo-keyword "HACK") (add-todo-keyword "TRICK") (add-todo-keyword "NOTE") ;; Also, comments get a different font: ;;(set-face-font 'font-lock-comment-face "-outline-Bitstream Vera Sans Mono-bold-r-normal-normal-12-90-96-96-c-*-iso10646-1") (defun indent-buffer () "Indent the entire current buffer based on the current mode" (interactive) (indent-region (point-min) (point-max)) (whitespace-cleanup)) (global-set-key (read-kbd-macro "C-c TAB") 'indent-buffer) ;; IDL (c-add-style "ms-idl" '("gnu" (c-basic-offset . 4) (c-offsets-alist . ((c . c-lineup-C-comments) (inclass . +) (access-label . -) (defun-block-intro . +) (substatement-open . 0) (statement-block-intro . +) (innamespace . +) (statement-case-intro . +) (statement-case-open . 0) (brace-list-intro . +) (substatement . +) (arglist-intro . +) (arglist-close . +) (statement-case-open . +) )))) (defun my-idl-mode-hook () (c-set-style "ms-idl")) (add-hook 'idl-mode-hook 'my-idl-mode-hook) ;; http://stackoverflow.com/questions/23553881/emacs-indenting-of-c11-lambda-functions-cc-mode/23553882#23553882 ;; For such a wonderfully small function, it works REALLY REALLY well. (defadvice c-lineup-arglist (around my activate) "Improve indentation of continued C++11 lambda function opened as argument." (setq ad-return-value (if (and (equal major-mode 'c++-mode) (ignore-errors (save-excursion (goto-char (c-langelem-pos langelem)) ;; Detect "[...](" or "[...]{". preceded by "," or "(", ;; and with unclosed brace. (looking-at ".*[(,][ \t]*\\[[^]]*\\][ \t]*[({][^}]*$")))) 0 ; no additional indent ad-do-it))) ; default behavior ;; ================================================================= ;; C#-Mode configuration. ;; ================================================================= ;; zbrad's csharp mode is integrated with cc-mode. ;; (autoload 'csharp-mode "cc-mode") ;; Here is another one that is not. ;;(autoload 'csharp-mode "csharp-mode-0.8.6" "Major mode for editing C# code." t) ;; We're using the one loaded by the package manager, though. (c-add-style "ms-csharp" '((c-basic-offset . 4) (c-comment-only-line-offset . (0 . 0)) (c-offsets-alist . ((c . c-lineup-C-comments) (inclass . +) (namespace-open . 0) (namespace-close . 0) (innamespace . +) (class-open . 0) (class-close . 0) (defun-open . 0) (defun-close . 0) (defun-block-intro . +) (inline-open . 0) (statement-block-intro . +) (brace-list-intro . +) (block-open . -) (substatement-open . 0) (arglist-intro . +) (arglist-close . 0) )))) (defun my-csharp-mode-hook () (turn-on-font-lock) (c-set-style "ms-csharp")) (add-hook 'csharp-mode-hook 'my-csharp-mode-hook) (add-to-list 'auto-mode-alist '("\\.cool$" . csharp-mode)) (add-to-list 'auto-mode-alist '("\\.cs$" . csharp-mode)) ;; ================================================================= ;; "XML" Support ;; ;; nxml-mode FTW. ;; ================================================================= (add-to-list 'auto-mode-alist '("\\.sgml$" . nxml-mode)) (setq auto-mode-alist (append '( ("\\.sgml$" . nxml-mode) ("\\.idd$" . nxml-mode) ("\\.ide$" . nxml-mode) ("\\.htm$" . nxml-mode) ("\\.html$" . nxml-mode) ("\\.xml$" . nxml-mode) ("\\.xsl$" . nxml-mode) ("\\.fo$" . nxml-mode) ("\\.config$" . nxml-mode) ("\\.build$" . nxml-mode) ("\\.mht$" . nxml-mode) ("\\.csproj$" . nxml-mode) ("\\.targets$" . nxml-mode) ("\\.proj$" . nxml-mode) ("\\.manifest$". nxml-mode) ("\\.xsd$" . nxml-mode) ("\\.xaml$" . nxml-mode) ) auto-mode-alist ) ) (defun nxml-indent-on-tag-close (arg) (interactive "p") (self-insert-command arg) (nxml-indent-line)) (defun my-nxml-hook () (turn-on-auto-fill) (set-fill-column 120) (local-set-key "\C-m" 'newline-and-indent) (local-set-key ">" 'nxml-indent-on-tag-close) ;; Why does nxml not play well with font lock mode, huh? (local-set-key (kbd "") 'nxml-complete) (local-set-key (read-kbd-macro "C-x f") 'font-lock-fontify-buffer)) (add-hook 'nxml-mode-hook 'my-nxml-hook) ;; ================================================================= ;; Flycheck ;; ================================================================= (require 'flycheck) ;; disable jshint since we prefer eslint checking (setq-default flycheck-disabled-checkers (append flycheck-disabled-checkers '(javascript-jshint))) ;; use eslint with web-mode for jsx files (flycheck-add-mode 'javascript-eslint 'web-mode) ;; customize flycheck temp file prefix (setq-default flycheck-temp-prefix ".flycheck") ;; disable json-jsonlist checking for json files (setq-default flycheck-disabled-checkers (append flycheck-disabled-checkers '(json-jsonlist))) (flycheck-define-checker python-fb-flake8 "A Python syntax and style checker using FB's Flake8." :command ("flake8" source-original) :standard-input nil :error-filter (lambda (errors) (let ((errors (flycheck-sanitize-errors errors))) (seq-do #'flycheck-flake8-fix-error-level errors) errors)) :error-patterns ((warning line-start (file-name) ":" line ":" (optional column ":") " " (id (one-or-more (any alpha)) (one-or-more digit)) " " (message (one-or-more not-newline)) line-end)) :modes python-mode) (add-to-list 'flycheck-checkers 'python-fb-flake8) (when is-fb-environment (add-hook 'python-mode-hook (lambda () (flycheck-select-checker `python-fb-flake8))) ) (global-flycheck-mode) ;; ================================================================= ;; Python Support ;; ================================================================= (autoload 'python-mode "python-mode" "Python editing mode." t) (setq auto-mode-alist (cons '("\\.py$" . python-mode) auto-mode-alist)) (setq interpreter-mode-alist (cons '("python" . python-mode) interpreter-mode-alist)) ;; ================================================================= ;; JavaScript Support ;; ================================================================= (autoload 'js2-mode "js2-mode" nil t) (add-to-list 'auto-mode-alist '("\\.js$" . js2-mode)) (add-to-list 'auto-mode-alist '("\\.jsx$" . web-mode)) ;; ================================================================= ;; Ruby Mode ;; ================================================================= (autoload 'ruby-mode "ruby-mode" nil t) (add-to-list 'auto-mode-alist '("\\.rb\\'" . ruby-mode)) ;; ================================================================= ;; Powershell Mode ;; ================================================================= (autoload 'powershell-mode "powershell-mode" nil t) (add-to-list 'auto-mode-alist '("\\.ps1\\'" . powershell-mode)) (add-to-list 'auto-mode-alist '("\\.psm1\\'" . powershell-mode)) (defun my-powershell-hook() (set (make-local-variable 'powershell-indent) 2) (set (make-local-variable 'powershell-continuation-indent) 2)) (add-hook 'powershell-mode-hook 'my-powershell-hook) ;; ================================================================= ;; LUA Mode ;; ================================================================= (autoload 'lua-mode "lua-mode" "Lua editing mode." t) (add-to-list 'auto-mode-alist '("\\.lua$" . lua-mode)) (add-to-list 'interpreter-mode-alist '("lua" . lua-mode)) ;; ================================================================= ;; Code Folding ;; ================================================================= (global-set-key (kbd "C-+") 'hs-toggle-hiding) (global-set-key (kbd "C-") 'hs-toggle-hiding) (global-set-key (kbd "M-") 'hs-toggle-hiding) (global-set-key (kbd "C-") 'hs-hide-all) (global-set-key (kbd "M-") 'hs-hide-all) (add-hook 'c-mode-common-hook 'hs-minor-mode) (add-hook 'emacs-lisp-mode-hook 'hs-minor-mode) (add-hook 'java-mode-hook 'hs-minor-mode) (add-hook 'lisp-mode-hook 'hs-minor-mode) (add-hook 'perl-mode-hook 'hs-minor-mode) (add-hook 'sh-mode-hook 'hs-minor-mode) (defun display-code-line-counts (ov) "Put the line counts in the fold overlay OV." (when (eq 'code (overlay-get ov 'hs)) (overlay-put ov 'help-echo (buffer-substring (overlay-start ov) (overlay-end ov))))) (setq hs-set-up-overlay 'display-code-line-counts) ;; ================================================================= ;; Go (#golang) Mode ;; ================================================================= (require 'go-mode) (require 'auto-complete-config) (require 'go-autocomplete) (defun my-go-mode-hook () "My go-mode hook." (auto-complete-mode) ) (add-hook 'go-mode-hook 'my-go-mode-hook) ;; ================================================================= ;; Org-Mode ;; ================================================================= (require 'org) (define-key global-map "\C-cl" 'org-store-link) (define-key global-map "\C-ca" 'org-agenda) (setq org-log-done t) ;; ================================================================= ;; Typescript-Mode ;; ================================================================= (autoload 'typescript-mode "typescript" nil t) (add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode)) (require 'tss) (setq tss-popup-help-key "C-:") (setq tss-jump-to-definition-key "C->") (tss-config-default) ;; ================================================================= ;; Archive mode for appx ;; ================================================================= (add-to-list 'auto-mode-alist '("\\.appx\\'" . archive-mode)) (add-to-list 'auto-coding-alist '("\\.appx\\'" . no-conversion)) ;; ================================================================= ;; Some build stuff; I swiped this from handmade-hero. Good for ;; unibuild setups. ;; ================================================================= (when (featurep 'w32) (setq doty-makescript "build.bat")) (when (featurep 'cocoa) (setq doty-makescript "./build.macosx")) (when (featurep 'x) (setq doty-makescript "./build.linux")) (setq compilation-directory-locked nil) (setq compilation-context-lines 0) (setq compilation-error-regexp-alist (cons '("^\\([0-9]+>\\)?\\(\\(?:[a-zA-Z]:\\)?[^:(\t\n]+\\)(\\([0-9]+\\)) : \\(?:fatal error\\|warnin\\(g\\)\\) C[0-9]+:" 2 3 nil (4)) compilation-error-regexp-alist)) (defun find-project-directory-recursive () "Recursively search for a makefile." (interactive) (if (file-exists-p doty-makescript) t (cd "../") (find-project-directory-recursive))) (defun lock-compilation-directory () "The compilation process should NOT hunt for a makefile." (interactive) (setq compilation-directory-locked t) (message "Compilation directory is locked.")) (defun unlock-compilation-directory () "The compilation process SHOULD hunt for a makefile." (interactive) (setq compilation-directory-locked nil) (message "Compilation directory is roaming.")) (defun find-project-directory () "Find the project directory." (interactive) (setq find-project-from-directory default-directory) (switch-to-buffer-other-window "*compilation*") (if compilation-directory-locked (cd last-compilation-directory) (cd find-project-from-directory) (find-project-directory-recursive) (setq last-compilation-directory default-directory))) (defun make-without-asking () "Make the current build." (interactive) (if (find-project-directory) (compile doty-makescript)) (other-window 1)) (define-key global-map "\C-c\C-m" 'make-without-asking) (defun set-vs-environment () "Load the VS environment variables into the current Emacs process." (interactive) (dolist (ev (split-string (shell-command-to-string "cmd /c \" \"%ProgramFiles(x86)%\\Microsoft Visual Studio 14.0\\VC\\vcvarsall.bat\" x64 && set \"") "[\n]+")) (letrec ((spev (split-string ev "=")) (vn (car spev)) (vv (cadr spev))) (setenv vn vv)))) ;; ================================================================= ;; PHP stuff ;; ================================================================= (if is-fb-environment (progn ;; Hack support for stuff in www (setq hack-for-hiphop-root (expand-file-name "www" "~")) (load "/home/engshare/tools/hack-for-hiphop") (load-library (expand-file-name "emacs-packages/hh-client.el" master-dir)) (require 'hh-client) (defun my-fb-php-hook () (global-set-key (kbd "M-.") 'hh-client-find-definition)) (add-hook 'php-mode-hook 'my-fb-php-hook) )) ;; ================================================================= ;; Magit stuff ;; ================================================================= (global-set-key (kbd "C-x g") 'magit-status) ;; ================================================================= ;; Shell stuff ;; ================================================================= (setenv "PAGER" "cat") (setenv "EDITOR" "emacsclient") (add-hook 'comint-output-filter-functions 'comint-truncate-buffer) (add-hook 'shell-mode-hook 'buffer-disable-undo) ;; ;; Comment all the time ;; (global-set-key (kbd "C-/") 'comment-or-uncomment-region) ;; ================================================================= ;; OCAML stuff ;; ================================================================= (require 'opam-user-setup "~/.emacs.d/opam-user-setup.el") (provide 'core) ;;; core.el ends here