From dcc3f2d5d9455ddddfc1a558672eb992448beade Mon Sep 17 00:00:00 2001 From: Nick Anderson Date: Thu, 14 Apr 2016 16:48:33 -0500 Subject: [PATCH] Add: CFEngine config-files layer --- layers/+config-files/cfengine/README.org | 118 ++++++++++++++++++++ layers/+config-files/cfengine/config.el | 15 +++ layers/+config-files/cfengine/img/agent.png | Bin 0 -> 10031 bytes layers/+config-files/cfengine/packages.el | 47 ++++++++ 4 files changed, 180 insertions(+) create mode 100644 layers/+config-files/cfengine/README.org create mode 100644 layers/+config-files/cfengine/config.el create mode 100644 layers/+config-files/cfengine/img/agent.png create mode 100644 layers/+config-files/cfengine/packages.el diff --git a/layers/+config-files/cfengine/README.org b/layers/+config-files/cfengine/README.org new file mode 100644 index 000000000..240da93a5 --- /dev/null +++ b/layers/+config-files/cfengine/README.org @@ -0,0 +1,118 @@ +#+TITLE: CFEngine layer +#+HTML_HEAD_EXTRA: + +#+CAPTION: logo +# The maximum height of the logo should be 200 pixels. +[[file:./img/agent.png]] + +* Table of Contents :TOC_4_org:noexport: + - [[Description][Description]] + - [[Install & Configuration][Install & Configuration]] + - [[Key bindings][Key bindings]] + +* Description +This layer makes working with CFEngine policy easier: + - Syntax highlighting + - On the fly syntax checks + - Auto completion + +* Install & Configuration + +Add =cfengine= to the =dotspacemacs-configuration-layers= in your =~/.spacemacs= +to use this layer. + +For working with CFEngine policy I highly recommend the =syntax-checking=, and +=auto-completion= layers. + +Here is an example: + +#+begin_src emacs-lisp + (defun dotspacemacs/layers () + "Configuration Layers declaration. + You should not put any user code in this function besides modifying the variable + values." + (setq-default + dotspacemacs-configuration-layers + '( + ;; ---------------------------------------------------------------- + ;; Example of useful layers you may want to use right away. + ;; Uncomment some layer names and press (Vim style) or + ;; (Emacs style) to install them. + ;; ---------------------------------------------------------------- + + ;; ---------------------------------------------------------------- + ;; CFEngine Related Layers + ;; ---------------------------------------------------------------- + cfengine + syntax-checking + auto-completion + + ;; ---------------------------------------------------------------- + ;; Other Userful Layers + ;; ---------------------------------------------------------------- + git + github + markdown + org + spell-checking + ) + + ;; Delete whitespace while saving buffer. Possible values are `all' + ;; to aggressively delete empty line and long sequences of whitespace, + ;; `trailing' to delete only the whitespace at end of lines, `changed'to + ;; delete only whitespace for changed lines or `nil' to disable cleanup. + ;; (default nil) + ;; + ;; ---------------------------------------------------------------- + ;; This is conservative, if you want to cleanup traling whitespace + ;; left by the efforts from others consider setting it to `trailing'. + ;; ---------------------------------------------------------------- + dotspacemacs-whitespace-cleanup 'changed + + ;; ----------------------------------------------------------------) + + (defun dotspacemacs/user-config () + "Configuration function for user code. + This function is called at the very end of Spacemacs initialization after + layers configuration. You are free to put any user code." + + ;; ---------------------------------------------------------------- + ;; Enable line numbering for CFEngine policy files + ;; ---------------------------------------------------------------- + (add-hook 'cfengine3-mode-hook + (lambda () + (linum-mode 1))) + + ;; ---------------------------------------------------------------- + ;; "Easy template" for quickly inserting cfengine3 code blocks in + ;; org-mode. Simply type = "value", + comment => "Indented 2 spaces from promiser"; + } +#+end_src + +* Key bindings + +| Key Binding | Description | +|-------------+-----------------------| +| ~ m j~ | Reformats JSON string | diff --git a/layers/+config-files/cfengine/config.el b/layers/+config-files/cfengine/config.el new file mode 100644 index 000000000..11274c71a --- /dev/null +++ b/layers/+config-files/cfengine/config.el @@ -0,0 +1,15 @@ +;; Figure out which cfengine mode (cfengine2 or cfengine3) to use for =.cf= +;; files based on file content. +;; (add-to-list 'auto-mode-alist '("\\.cf\\'" . cfengine-auto-mode)) +(add-to-list 'auto-mode-alist '("\\.cf\\'" . cfengine3-mode)) + +;; Perhaps we should bind this to something some day. +;; (global-set-key [(control f4)] 'cfengine3-reformat-json-string) + +;; Enable eldoc-mode for cfengine +;; This puts function prototypes into the minibuffer when hovering +;; over the function. +(add-hook 'cfengine3-mode-hook 'eldoc-mode) + +;; Enable auto completion for cfengine +(spacemacs|defvar-company-backends cfengine3-mode) diff --git a/layers/+config-files/cfengine/img/agent.png b/layers/+config-files/cfengine/img/agent.png new file mode 100644 index 0000000000000000000000000000000000000000..d5b7dc92c9de0a4e80855e74af3f48292760c45a GIT binary patch literal 10031 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 P+y+oqP?xWkwFvni$i{ts literal 0 HcmV?d00001 diff --git a/layers/+config-files/cfengine/packages.el b/layers/+config-files/cfengine/packages.el new file mode 100644 index 000000000..bf969b602 --- /dev/null +++ b/layers/+config-files/cfengine/packages.el @@ -0,0 +1,47 @@ +;;; packages.el --- cfengine layer packages file for Spacemacs. +;; +;; Copyright (c) 2012-2016 Sylvain Benner & Contributors +;; +;; Author: Nick Anderson +;; URL: https://github.com/syl20bnr/spacemacs +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 + +;;; Commentary: + +;; See the Spacemacs documentation and FAQs for instructions on how to implement +;; a new layer: +;; +;; SPC h SPC layers RET +;; +;; +;; Briefly, each package to be installed or configured by this layer should be +;; added to `cfengine-packages'. Then, for each package PACKAGE: +;; +;; - If PACKAGE is not referenced by any other Spacemacs layer, define a +;; function `cfengine/init-PACKAGE' to load and initialize the package. + +;; - Otherwise, PACKAGE is already referenced by another Spacemacs layer, so +;; define the functions `cfengine/pre-init-PACKAGE' and/or +;; `cfengine/post-init-PACKAGE' to customize the package as it is loaded. + +(setq cfengine-packages + '( + flycheck + company)) + ;; cfengine3-mode is included in emacs itself. + +(defun cfengine/init-cfengine() + (use-package cfengine3-mode + :init + (progn + (spacemacs/set-leader-keys-for-major-mode 'cfengine3-mode + "j" 'cfengine3-reformat-json-string)))) + +(defun cfengine/post-init-company () + (spacemacs|add-company-hook cfengine3-mode)) + +(defun cfengine/post-init-flycheck () + (spacemacs/add-flycheck-hook 'cfengine3-mode-hook))