From 4ef4470266657e1fc731c695427fe3ed3fb593f4 Mon Sep 17 00:00:00 2001 From: Sameer Rahmani Date: Thu, 9 Jul 2015 03:30:45 +0430 Subject: [PATCH] web extension added --- fg42-config.el | 3 +- lib/extensions/development.el | 3 ++ lib/extensions/development/init.el | 18 +++++++ lib/extensions/ruby.el | 17 +++++++ lib/extensions/web.el | 26 ++++++++++ lib/extensions/web/init.el | 80 ++++++++++++++++++++++++++++++ lib/fg42/extension.el | 10 +++- 7 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 lib/extensions/ruby.el create mode 100644 lib/extensions/web.el create mode 100644 lib/extensions/web/init.el diff --git a/fg42-config.el b/fg42-config.el index 521adde..ff4682c 100644 --- a/fg42-config.el +++ b/fg42-config.el @@ -3,6 +3,7 @@ (require 'fg42) (activate-extensions 'editor - 'development) + 'development + 'web) (fg42-initialize) diff --git a/lib/extensions/development.el b/lib/extensions/development.el index 3c96499..40ae814 100644 --- a/lib/extensions/development.el +++ b/lib/extensions/development.el @@ -5,12 +5,15 @@ ;; Dependencies ---------------------------------- (depends-on 'flycheck) (depends-on 'company) +(depends-on 'company-statistics) (depends-on 'projectile) (depends-on 'flyspell) (depends-on 'diff-hl) (depends-on 'magit) (depends-on 'indent-guide) (depends-on 'yasnippet) +;; TODO: Add flycheck-color-modebar +;; TODO Add flycheck-tip ;; Extension ------------------------------------- (extension development diff --git a/lib/extensions/development/init.el b/lib/extensions/development/init.el index 5a5e4f4..447634e 100644 --- a/lib/extensions/development/init.el +++ b/lib/extensions/development/init.el @@ -19,7 +19,25 @@ (ability code-completion () "Use company mode to provides a complete auto completion framwork." + (require 'company) (global-company-mode t) + + ;; Bigger popup window + (setq company-tooltip-limit 20) + + ;; Align annotations to the right tooltip border + (setq company-tooltip-align-annotations 't) + + ;; Decrease delay before autocompletion popup shows + (setq company-idle-delay 0.3) + + ;; Start autocompletion only after typing + (setq company-begin-commands '(self-insert-command)) + + ;; Force complete file names on "C-c /" key + (global-set-key (kbd "C-c /") 'company-files) + + (add-hook 'after-init-hook 'company-statistics-mode) (define-key company-active-map "\t" 'company-yasnippet-or-completion)) (ability yas () diff --git a/lib/extensions/ruby.el b/lib/extensions/ruby.el new file mode 100644 index 0000000..6edb97a --- /dev/null +++ b/lib/extensions/ruby.el @@ -0,0 +1,17 @@ +(require 'fpkg) +(require 'fg42/extension) +(require 'extensions/ruby/init) + +;; Dependencies ---------------------------------- +(depends-on 'company-ruby) +(depends-on 'ruby-mode) +(depends-on 'slim-mode) +(depends-on 'haml-mode) + + +;; Extension ------------------------------------- +(extension ruby + :version "2.67" + :on-initialize extension/ruby-initialize) + +(provide 'extensions/ruby) diff --git a/lib/extensions/web.el b/lib/extensions/web.el new file mode 100644 index 0000000..9c93481 --- /dev/null +++ b/lib/extensions/web.el @@ -0,0 +1,26 @@ +(require 'fpkg) +(require 'fg42/extension) +(require 'extensions/web/init) + +;; Dependencies ---------------------------------- +(depends-on 'emmet-mode) +(depends-on 'company-web) +(depends-on 'web-mode) +(depends-on 'sass-mode) +(depends-on 'scss-mode) +(depends-on 'less-css-mode) +(depends-on 'coffee-mode) +(depends-on 'handlebars-mode) +(depends-on 'js2-mode) +(depends-on 'js2-refactor) +(depends-on 'rainbow-mode) +;(depends-on 'slim-mode) +;(depends-on 'haml-mode) +(depends-on 'mustache-mode) + +;; Extension ------------------------------------- +(extension web + :version "2.67" + :on-initialize extensions/web-initialize) + +(provide 'extensions/web) diff --git a/lib/extensions/web/init.el b/lib/extensions/web/init.el new file mode 100644 index 0000000..f9f0e34 --- /dev/null +++ b/lib/extensions/web/init.el @@ -0,0 +1,80 @@ +;; Functions ------------------------------------------------- +;;;###autoload +(defun web-mode-hook-func () + "Hooks for Web mode." + (with-ability code-completion + (require 'company-web-html) + (set (make-local-variable + 'company-backends) '(company-web-html)) + + (define-key web-mode-map (kbd "C-'") 'company-web-html)) + + (setq web-mode-markup-indent-offset 2)) + +;;;###autoload +(defun extensions/web-activate-modes () + "Activate necessary modes" + (with-ability rainbow + (rainbow-mode t)) + + (with-ability spell + (flyspell-prog-mode)) + + (with-ability flycheck + (flycheck-mode t))) + + +;;;###autoload +(defun extensions/web-initialize () + "Web development plugin initialization." + (message "Initializing 'web' extension.") + + (ability web-editor ('flycheck) + "Gives FG42 the ability to edit web contents." + (require 'web-mode) + + (add-to-list 'auto-mode-alist '("\\.phtml\\'" . web-mode)) + (add-to-list 'auto-mode-alist '("\\.tpl\\.php\\'" . web-mode)) + (add-to-list 'auto-mode-alist '("\\.jsp\\'" . web-mode)) + (add-to-list 'auto-mode-alist '("\\.as[cp]x\\'" . web-mode)) + (add-to-list 'auto-mode-alist '("\\.erb\\'" . web-mode)) + (add-to-list 'auto-mode-alist '("\\.mustache\\'" . web-mode)) + (add-to-list 'auto-mode-alist '("\\.handlebars\\'" . web-mode)) + (add-to-list 'auto-mode-alist '("\\.djhtml\\'" . web-mode)) + (add-to-list 'auto-mode-alist '("\\.html$" . web-mode)) + + + (add-hook 'web-mode-hook 'web-mode-hook-func) + (add-hook 'web-mode-hook 'emmet-mode) + (add-hook 'web-mode-hook 'extensions/web-activate-modes)) + + (ability css-editor + "Gives FG42 the ability to edit CSS." + (add-hook 'css-mode-hook 'extensions/web-activate-modes)) + + (ability sass-editor + "Gives FG42 the ability to edit SASS/SCSS." + + (add-to-list 'auto-mode-alist '("\\.scss$" . scss-mode)) + (add-to-list 'auto-mode-alist '("\\.sass$" . sass-mode)) + + (setq scss-compile-at-save nil) + (setq sass-compile-at-save nil) + + (add-hook 'scss-mode-hook 'extensions/web-activate-modes) + (add-hook 'sass-mode-hook 'extensions/web-activate-modes)) + + (ability less-editor + "Gives FG42 the ability to edit lesscss." + (add-to-list 'auto-mode-alist '("\\.less$" . less-css-mode)) + (add-hook 'less-css-mode-hook 'extensions/web-activate-modes)) + + (ability js-editor + "Gives FG42 the ability to edit Javascript." + (add-hook 'js2-mode-hook 'extensions/web-activate-modes) + (add-to-list 'auto-mode-alist '("\\.js.erb$" . js2-mode)) + (add-to-list 'auto-mode-alist '("\\.js$" . js2-mode)))) + + + +(provide 'extensions/web/init) diff --git a/lib/fg42/extension.el b/lib/fg42/extension.el index a74a4ee..862dc62 100644 --- a/lib/fg42/extension.el +++ b/lib/fg42/extension.el @@ -24,6 +24,7 @@ "Return t if ability was not in disabled-abilities." (if (gethash name disabled-abilities) nil t)) +;; Macros --------------------------------- (defmacro ability (name deps &rest body) "Define an ability with the given name. @@ -33,12 +34,17 @@ to them. *body* is a block of code which will run as the ability initializer code." (declare (doc-string 2) (indent 1)) `(if (active-ability? (intern ,(symbol-name name))) - (if (null (delq t (mapcar 'active-ability? ,deps))) - ,@body))) + (when (null (delq t (mapcar 'active-ability? (quote ,deps)))) + ,@body))) (defmacro extension (name &rest args) "A simple DSL to define new fg42 extension." ;(declare (doc-string 1) (indent 1)) `(setq ,name (apply 'make-fg42-extension :name ,(symbol-name name) (quote ,args)))) +(defmacro with-ability (name &rest body) + "Run the block of code if an ability with the given name was not disable." + `(when (active-ability? (intern ,(symbol-name name))) + ,@body)) + (provide 'fg42/extension)