From f41a99d20af0cfa66e9c2fa6e6490c15689615a6 Mon Sep 17 00:00:00 2001 From: brettlangdon Date: Wed, 21 May 2014 09:19:57 -0400 Subject: [PATCH] add editorconfig to emacs --- emacs | 3 +- emacs.d/editorconfig.el | 164 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 emacs.d/editorconfig.el diff --git a/emacs b/emacs index 9d32ca4..a94c4fe 100644 --- a/emacs +++ b/emacs @@ -1,5 +1,4 @@ ; load all the other good things -(add-to-list 'load-path "~/.emacs.d") (add-to-list 'load-path "~/.emacs.d/powerline-2.2") (add-to-list 'load-path "~/.emacs.d/elpa/projectile-0.9.2") @@ -33,7 +32,7 @@ (setq-default c-basic-offset 4 tab-width 4 indent-tabs-mode nil) - +(load "~/.emacs.d/editorconfig") ;auto-indent (define-key global-map (kbd "RET") 'newline-and-indent) diff --git a/emacs.d/editorconfig.el b/emacs.d/editorconfig.el new file mode 100644 index 0000000..1a1fa61 --- /dev/null +++ b/emacs.d/editorconfig.el @@ -0,0 +1,164 @@ +;;; editorconfig.el --- EditorConfig Emacs extension + +;; Copyright (C) 2011-2013 EditorConfig Team + +;; Author: EditorConfig Team +;; Version: 0.3 +;; URL: http://github.com/editorconfig/editorconfig-emacs#readme + +;; See +;; http://github.com/editorconfig/editorconfig-emacs/graphs/contributors +;; or the CONTRIBUTORS file for the list of contributors. + +;; Redistribution and use in source and binary forms, with or without +;; modification, are permitted provided that the following conditions are met: +;; +;; 1. Redistributions of source code must retain the above copyright notice, +;; this list of conditions and the following disclaimer. +;; 2. Redistributions in binary form must reproduce the above copyright notice, +;; this list of conditions and the following disclaimer in the documentation +;; and/or other materials provided with the distribution. + +;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +;; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +;; ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +;; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +;; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +;; POSSIBILITY OF SUCH DAMAGE. + +;;; Commentary: + +;; EditorConfig helps developers define and maintain consistent +;; coding styles between different editors and IDEs. + +;; The EditorConfig project consists of a file format for defining +;; coding styles and a collection of text editor plugins that enable +;; editors to read the file format and adhere to defined styles. +;; EditorConfig files are easily readable and they work nicely with +;; version control systems. + +;;; Code: + +(defvar edconf-exec-path "editorconfig") + +(defun edconf-set-indentation (style &optional size tab_width) + (setq web-mode-indent-style 2) + "Set indentation type from given style and size" + (when (equal style "space") + (setq indent-tabs-mode nil + size (string-to-number size) + LaTeX-indent-level size + LaTeX-item-indent size + TeX-brace-indent-level size + c-basic-offset size + cperl-indent-level size + haskell-indent-offset size + shm-indent-spaces size + js-indent-level size + js2-basic-offset size + lisp-indent-offset size + perl-indent-level size + py-indent-offset size + python-indent size + ruby-indent-level size + sh-basic-offset size + web-mode-markup-indent-offset size + web-mode-css-indent-offset size + web-mode-code-indent-offset size + ;(make-local-variable 'sgml-basic-offset) size + tab-stop-list (let ((stops (cons size ()))) + (while (< (car stops) 120) + (setq stops (cons + (+ size (car stops)) + stops))) + (nreverse stops)))) + (when (equal style "tab") + (setq indent-tabs-mode t)) + (if tab_width + (setq tab-width (string-to-number tab_width)))) + +(defun edconf-set-line-ending (end-of-line) + "Set line ending style to CR, LF, or CRLF" + (set-buffer-file-coding-system + (cond + ((equal end-of-line "lf") 'undecided-unix) + ((equal end-of-line "cr") 'undecided-mac) + ((equal end-of-line "crlf") 'undecided-dos) + (t 'undecided)) + nil t)) + +(defun edconf-set-trailing-nl (final-newline) + (cond + ((equal final-newline "true") + ;; keep prefs around how/when the nl is added, if set - otherwise add on save + (setq require-final-newline (or require-final-newline t) + mode-require-final-newline (or mode-require-final-newline t))) + ((equal final-newline "false") + ;; FIXME: Add functionality for actually REMOVING any trailing newlines here! + ;; (rather than just making sure we don't automagically ADD a new one) + (setq require-final-newline nil + mode-require-final-newline nil)))) + +(defun edconf-set-trailing-ws (trim-trailing-ws) + "set up trimming of trailing whitespace at end of lines" + (make-local-variable 'write-file-functions) ;; just current buffer + (when (equal trim-trailing-ws "true") + ;; when true we push delete-trailing-whitespace (emacs > 21) + ;; to write-file-functions + (add-to-list + 'write-file-functions + 'delete-trailing-whitespace)) + (when (equal trim-trailing-ws "false") + ;; when false we remove every delete-trailing-whitespace + ;; from write-file-functions + (setq + write-file-functions + (delete + 'delete-trailing-whitespace + write-file-functions)))) + +(defun edconf-get-properties () + "Call EditorConfig core and return output" + (let ((oldbuf (current-buffer))) + (call-process edconf-exec-path nil "ecbuffer" nil (buffer-file-name oldbuf)) + (set-buffer (get-buffer "ecbuffer")) + (let (props-string) + (setq props-string (buffer-string)) + (set-buffer oldbuf) + (kill-buffer (get-buffer "ecbuffer")) + props-string))) + +(defun edconf-parse-properties (props-string) + "Create properties hash table from string of properties" + (let (props-list properties) + (setq props-list (split-string props-string "\n") + properties (make-hash-table :test 'equal)) + (dolist (prop props-list properties) + (let ((key-val (split-string prop " *= *"))) + (when (> (length key-val) 1) + (let ((key (intern (car key-val))) + (val (mapconcat 'identity (cdr key-val) ""))) + (puthash key val properties))))))) + +;;;###autoload +(defun edconf-find-file-hook () + (when (executable-find edconf-exec-path) + (let ((props (edconf-parse-properties (edconf-get-properties)))) + (edconf-set-indentation (gethash 'indent_style props) + (gethash 'indent_size props) + (gethash 'tab_width props)) + (edconf-set-line-ending (gethash 'end_of_line props)) + (edconf-set-trailing-nl (gethash 'insert_final_newline props)) + (edconf-set-trailing-ws (gethash 'trim_trailing_whitespace props))))) + +;;;###autoload +(add-hook 'find-file-hook 'edconf-find-file-hook) + +(provide 'editorconfig) + +;;; editorconfig.el ends here