first working prototype of fpkg

This commit is contained in:
Sameer Rahmani 2015-07-07 15:55:06 +04:30
parent 0795827092
commit df94b822f4
12 changed files with 274 additions and 19 deletions

2
fg42
View File

@ -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 "$@"

View File

@ -2,5 +2,6 @@
(toggle-debug-on-error)
(require 'fg42)
(enable-extensions 'editor)
(activate-extensions 'editor)
(fg42-initialize)

View File

@ -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)

View File

@ -0,0 +1,42 @@
(defvar about_fg42_msg "
FG42 %%VERSION%% Copyright © 2010-2015 Sameer Rahmani <lxsameer@gnu.org>
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)

View File

@ -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)

View File

@ -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)

View File

@ -0,0 +1,3 @@
(defconst FG42-VERSION "2.0.0")
(provide 'extensions/editor/version)

View File

@ -27,4 +27,10 @@
(require 'fpkg)
(require 'fg42/base)
(defun fg42-initialize ()
"Initialize FG42 editor."
(fpkg-initialize)
(initialize-extensions))
(provide 'fg42)

View File

@ -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)

View File

@ -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."

View File

@ -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"

6
lib/fpkg/installers.el Normal file
View File

@ -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)