847 lines
32 KiB
EmacsLisp
847 lines
32 KiB
EmacsLisp
;;; 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
|
|
)
|
|
"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 "<home>") 'beginning-of-buffer)
|
|
(global-set-key (read-kbd-macro "<end>") '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 "<C-return>") '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")
|
|
: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
|
|
"stdin:" line ":" (optional column ":") " "
|
|
(id (one-or-more (any alpha)) (one-or-more digit)) " "
|
|
(message (one-or-more not-newline))
|
|
line-end))
|
|
:modes python-mode)
|
|
|
|
(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-<kp-add>") 'hs-toggle-hiding)
|
|
(global-set-key (kbd "M-<kp-add>") 'hs-toggle-hiding)
|
|
(global-set-key (kbd "C-<kp-subtract>") 'hs-hide-all)
|
|
(global-set-key (kbd "M-<kp-subtract>") '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)
|
|
|
|
(provide 'core)
|
|
;;; core.el ends here
|