From df94b822f48be0f02f9bc8ced29918a41bc5882f Mon Sep 17 00:00:00 2001 From: Sameer Rahmani Date: Tue, 7 Jul 2015 15:55:06 +0430 Subject: [PATCH] first working prototype of fpkg --- fg42 | 2 +- fg42-config.el | 3 +- lib/extensions/editor.el | 14 +++- lib/extensions/editor/about.el | 42 ++++++++++++ lib/extensions/editor/custom.el | 35 ++++++++++ lib/extensions/editor/init.el | 106 +++++++++++++++++++++++++++++++ lib/extensions/editor/version.el | 3 + lib/fg42.el | 6 ++ lib/fg42/base.el | 18 ++++-- lib/fg42/extension.el | 4 ++ lib/fpkg.el | 54 ++++++++++++++-- lib/fpkg/installers.el | 6 ++ 12 files changed, 274 insertions(+), 19 deletions(-) create mode 100644 lib/extensions/editor/about.el create mode 100644 lib/extensions/editor/custom.el create mode 100644 lib/extensions/editor/init.el create mode 100644 lib/extensions/editor/version.el create mode 100644 lib/fpkg/installers.el diff --git a/fg42 b/fg42 index a8b70d6..adb8dc2 100755 --- a/fg42 +++ b/fg42 @@ -1,4 +1,4 @@ #! /bin/sh #cask exec emacs -Q --no-splash --name FG42 --title FG42 -q -l /home/lxsameer/src/FG42/FG42/fg42-config.el "$@" -emacs -l --name FG42 /home/lxsameer/src/FG42/FG42/fg42-config.el "$@" +emacs --name FG42 -Q -q --no-splash --title FG42 -l /home/lxsameer/src/FG42/FG42/fg42-config.el "$@" diff --git a/fg42-config.el b/fg42-config.el index 86d2953..f31611a 100644 --- a/fg42-config.el +++ b/fg42-config.el @@ -2,5 +2,6 @@ (toggle-debug-on-error) (require 'fg42) -(enable-extensions 'editor) +(activate-extensions 'editor) +(fg42-initialize) diff --git a/lib/extensions/editor.el b/lib/extensions/editor.el index bf7b004..e541e1a 100644 --- a/lib/extensions/editor.el +++ b/lib/extensions/editor.el @@ -1,9 +1,17 @@ +(require 'fpkg) (require 'fg42/extension) +(require 'extensions/editor/init) -(defun extension/editor-initialize () - "Base plugin initialization." - (message "inside init")) +;; Dependencies ---------------------------------- +(depends-on 'color-theme) +(depends-on 'ido) +(depends-on 'ido-vertical-mode) +(depends-on 'multiple-cursors) +(depends-on 'expand-region) +(depends-on 'flx-ido) +(depends-on 'dired+) +;; Extension ------------------------------------- (extension editor :version "2.67" :on-initialize extension/editor-initialize) diff --git a/lib/extensions/editor/about.el b/lib/extensions/editor/about.el new file mode 100644 index 0000000..a8ab03d --- /dev/null +++ b/lib/extensions/editor/about.el @@ -0,0 +1,42 @@ + +(defvar about_fg42_msg " +FG42 %%VERSION%% Copyright © 2010-2015 Sameer Rahmani +FG42 release under the term of GPLv2. + +Home page: +\thttp://fg42.lxsameer.com + +Credits: +\tSameer Rahmani (lxsameer) +\tNima Nazari (niman) +\tDanial Parsi (intuxticated) +\tKeyvan Hedayati (k1-hedayati) +" + "About FG42") + + + +(defun about/get_string () + "Get the about message string" + (let (msg) + (setq msg (replace-regexp-in-string "%%VERSION%%" + FG42-VERSION about_fg42_msg)))) + +(defun about-fg42-f () + "Show an small about note" + (interactive) + (let (buf msg) + (setq buf (get-buffer-create "*About FG42*")) + (setq msg (about/get_string)) + (set-buffer buf) + (insert msg) + (view-buffer buf))) + +(define-key-after global-map + [menu-bar help-menu about-kuso] + '("About FG42" . about-fg42-f) + 'about-emacs) +;(define-key-after global-map [menu-bar help-menu kuso-update-everything] '("Update FG42 (everything)" . el-get-update-all) 'getting-new-versions) +;(define-key-after global-map [menu-bar help-menu kuso-update] '("Update FG42" . el-get-update) 'fg42-update-everything) + +(provide 'extensions/editor/about) diff --git a/lib/extensions/editor/custom.el b/lib/extensions/editor/custom.el new file mode 100644 index 0000000..3307951 --- /dev/null +++ b/lib/extensions/editor/custom.el @@ -0,0 +1,35 @@ +;; -------------------------------------------------------------------- +;; Groups +;; -------------------------------------------------------------------- +(defgroup fg42-user-preferences nil + "User preferences group. this group contain user specified options for +FG42" + :group 'fg42 + :tag '"User Preferences" +) + +;; -------------------------------------------------------------------- +;; Custom Variables +;; -------------------------------------------------------------------- +(defcustom developer-name nil + "FG42 use this option as author name in project if the value be non-nil" + :group 'fg42-user-preferences + :type 'string + :tag '"Developer full name" +) + +(defcustom developer-email nil + "FG42 use this option as author email in project if the value be non-nil" + :group 'fg42-user-preferences + :type 'string + :tag '"Developer Email" +) + +(defcustom fg42-workspace "~/src/" + "FG42 use this option as default path for new project." + :group 'fg42-user-preferences + :type 'string + :tag '"Workspace" + ) + +(provide 'extensions/editor/custom) diff --git a/lib/extensions/editor/init.el b/lib/extensions/editor/init.el new file mode 100644 index 0000000..96eda38 --- /dev/null +++ b/lib/extensions/editor/init.el @@ -0,0 +1,106 @@ +;;;###autoload +(defun extension/editor-initialize () + "Base plugin initialization." + (message "Initializing 'editor' extension.") + + ;; Remove splash screen + (setq inhibit-splash-screen t) + + ;; scratch should be scratch + (setq initial-scratch-message nil) + + + ;; Tramp configuration --------------------------------------------- + (setq tramp-default-method "ssh") + + ;; replace strings + (global-set-key (kbd "C-c M-s") 'replace-string) + + ;; Basic Key bindings + (global-set-key (kbd "\C-c m") 'menu-bar-mode) + + ;; Indentation ---------------------------------------------- + ;; Don't allow tab as indent + (setq-default indent-tabs-mode nil) + + ;; Default indent width + (setq tab-width 2) + (add-hook 'before-save-hook 'delete-trailing-whitespace) + + ;; Enhancements --------------------------------------------- + + ;; Global configurations + (tool-bar-mode -1) + (scroll-bar-mode -1) + (setq x-select-enable-clipboard t) + (column-number-mode t) + + ;; linum mode + (global-linum-mode) + (setq linum-format " %3d ") + + (menu-bar-mode -1) + (show-paren-mode t) + (cua-selection-mode t) + + + + ;; expand-region ------------------------------------------- + (global-set-key (kbd "C-=") 'er/expand-region) + + ;; Multiple cursor ----------------------------------------- + ;; multiple cursor configurations + (global-set-key (kbd "C->") 'mc/mark-next-like-this) + (global-set-key (kbd "C-<") 'mc/mark-previous-like-this) + (global-set-key (kbd "C-c C-SPC ") 'mc/mark-all-like-this) + + ;; Key Chord ------------------------------------------------ + ;; (require 'key-chord) + ;; (key-chord-mode 1) + + ;; (key-chord-define-global "hj" 'undo) + ;; (key-chord-define-global "kl" 'right-word) + ;; (key-chord-define-global "sd" 'left-word) + ;; (key-chord-define-global "m," 'forward-paragraph) + ;; (key-chord-define-global "p[" 'backward-paragraph) + + ;; HideShow ------------------------------------------------------- + (global-set-key (kbd "C-\-") 'hs-toggle-hiding) + (hs-minor-mode) + + ;; IDO configurations --------------------------------------------- + (require 'flx-ido) + (require 'ido-vertical-mode) + (ido-mode t) + (ido-everywhere t) + (flx-ido-mode 1) + (setq ido-use-faces nil) + ; If don't want to use the flx's highlights you can turn them off like this + ; (setq flx-ido-use-faces nil) + + (setq ido-enable-flex-matching t) + (ido-vertical-mode 1) + + + ;; Backup files --------------------------------------------- + ;; Put them in one nice place if possible + (if (file-directory-p "~/.backup") + (setq backup-directory-alist '(("." . "~/.backup"))) + (make-directory "~/.backup")) + + (setq backup-by-copying t ; Don't delink hardlinks + delete-old-versions t ; Clean up the backups + version-control t ; Use version numbers on backups, + kept-new-versions 3 ; keep some new versions + kept-old-versions 2) ; and some old ones, too + + ;; get rid of yes-or-no questions - y or n is enough + (defalias 'yes-or-no-p 'y-or-n-p) + + (setq my-path (file-name-directory load-file-name)) + ;; Load about submenu + (require 'extensions/editor/version) + (require 'extensions/editor/about) + (require 'extensions/editor/custom)) + +(provide 'extensions/editor/init) diff --git a/lib/extensions/editor/version.el b/lib/extensions/editor/version.el new file mode 100644 index 0000000..fba7973 --- /dev/null +++ b/lib/extensions/editor/version.el @@ -0,0 +1,3 @@ +(defconst FG42-VERSION "2.0.0") + +(provide 'extensions/editor/version) diff --git a/lib/fg42.el b/lib/fg42.el index 7cefec0..f4f04c6 100644 --- a/lib/fg42.el +++ b/lib/fg42.el @@ -27,4 +27,10 @@ (require 'fpkg) (require 'fg42/base) +(defun fg42-initialize () + "Initialize FG42 editor." + (fpkg-initialize) + (initialize-extensions)) + (provide 'fg42) + diff --git a/lib/fg42/base.el b/lib/fg42/base.el index c1537dd..41e3051 100644 --- a/lib/fg42/base.el +++ b/lib/fg42/base.el @@ -3,17 +3,21 @@ (defun load--extension (extension) "Load a single extension and call its :on-initialize function" - (let ((lib (concat "extensions/" (symbol-name extension))) - (init-func nil)) - - (require (intern lib)) - (setq init-func (fg42-extension-on-initialize (symbol-value extension))) + (let ((lib (concat "extensions/" (symbol-name extension)))) + (require (intern lib)))) + +(defun initialize--extension (extension) + "Initialize given extension by calling its :on-initialize function." + (let ((init-func (fg42-extension-on-initialize (symbol-value extension)))) (funcall (symbol-function init-func)))) +(defun initialize-extensions () + "Call the :on-initialize function on all extensions." + (mapcar 'initialize--extension activated-extensions)) -(defun enable-extensions (&rest extensions) +(defun activate-extensions (&rest extensions) "Mark given plugins to load on FG42" + (setq activated-extensions extensions) (mapcar 'load--extension extensions)) - (provide 'fg42/base) diff --git a/lib/fg42/extension.el b/lib/fg42/extension.el index b12de12..ed79123 100644 --- a/lib/fg42/extension.el +++ b/lib/fg42/extension.el @@ -1,6 +1,10 @@ ;; This library provides some basic means to create a new FG42 extensions (require 'cl-lib) +;; Variables ----------------------------- +(defvar activated-extensions () + "A list of all activated extensions.") + ;; Structures ----------------------------- (cl-defstruct fg42-extension "Each FG42 extension should implement a copy of this structure." diff --git a/lib/fpkg.el b/lib/fpkg.el index 4056f64..74e040a 100644 --- a/lib/fpkg.el +++ b/lib/fpkg.el @@ -25,6 +25,8 @@ ;;; Code: (require 'cl-lib) +(require 'subr-x) +(require 'fpkg/installers) (message "Initializing FPKG") @@ -33,20 +35,58 @@ "Package structure for FG42." name (version "0") - (github nil) - (path nil)) + (path nil) + (source 'elpa)) (defvar required-packages (make-hash-table) "A hash of `fg42-package structure representing required packages.") ;; Functions ---------------------------------- +(defun all-dependencies-installed? () + "Return t if all the dependencies installed." + (let ((result t)) + (dolist (pkg (hash-table-values required-packages)) + (when (not (package-installed-p pkg)) (setq result nil))) + result)) + +(defun install--package (pkg) + "Intall a package via its propreate source." + (let* ((source (fpkg-dependency-source pkg)) + (func-name (concat "install-package-via-" (symbol-name source))) + (install-func + (symbol-function + (intern func-name)))) + (funcall install-func pkg))) + (defun fpkg-initialize () "Initilize the package.el and related stuff to be used in FG42" - (require 'package) - (require 'melpa) - (add-to-list 'package-archives - '("melpa" . "http://melpa.milkbox.net/packages/") t) - (package-initialize)) + (let ((packages (hash-table-values required-packages))) + + (require 'package) + + (add-to-list 'package-archives + '("melpa" . "http://melpa.milkbox.net/packages/") t) + (when (< emacs-major-version 24) + ;; For important compatibility libraries like cl-lib + (add-to-list 'package-archives '("gnu" . "http://elpa.gnu.org/packages/"))) + + ;; Initialize package.el + (package-initialize) + + (setq url-http-attempt-keepalives nil) + + (unless (all-dependencies-installed?) + ;; check for new packages (package versions) + (message "%s" "Refreshing package database...") + (package-refresh-contents) + (message "%s" " done.") + + ;; install the missing packages + (dolist (pkg packages) + (when (not (package-installed-p (fpkg-dependency-name pkg))) + (install--package pkg)))))) + + (defun depends-on (pkgname &rest args) "Global function to specify a single dependency" diff --git a/lib/fpkg/installers.el b/lib/fpkg/installers.el new file mode 100644 index 0000000..3b91739 --- /dev/null +++ b/lib/fpkg/installers.el @@ -0,0 +1,6 @@ +;;; Code: +(defun install-package-via-elpa (pkg) + "Install a package via package.el." + (package-install (fpkg-dependency-name pkg))) + +(provide 'fpkg/installers)