%% MELPA *MELPA* or *Milkypostman's ELPA* or *Milkypostman's Experimental Lisp Package Repository* if you're not into the whole brevity thing. [ [Packages](#current-list-of-packages) ] [ [Installing](#installing) ] [ [Known Issues](#known-issues) ] [ [Updating Packages](#updating-packages) ] [ [Development](#development) ] **Last Update:** *<%= Time.now.strftime("%Y.%m.%d %H:%M %z") %>* <% def parse str # credit to: http://stackoverflow.com/q/3128406/154508 tokens = str.scan(/#{Regexp.escape("(")}|#{Regexp.escape(")")}|"(?:\\.|[^"])+"|[a-zA-Z0-9\'\-\_\+]+/) stack = [[]] tokens.each do |tok| case tok when "(" stack << [] when ")" stack[-2] << stack.pop when /^"(.*)\"$/ stack[-1] << $1 else stack[-1] << tok end end return stack[-1][-1] end headers = ["Package", "Version", "Description", "Source"] data = parse(File.open("../packages/archive-contents").read)[1..-1] data.map! do |row| pkgname = row[0] pkgurl = "packages/#{row[0]}-#{row[1]}." + (row[-1] == "single" ? "el" : "tar") recipe_url = "https://github.com/milkypostman/melpa/blob/master/recipes/#{pkgname}" descr, source = row[3..-2].join(" "), "other" if descr =~ /(.*?)(\s*-\*-.*?)?\s*\[source:\s*(\w+)\]\s*/ descr, source = $1, $3 end ["[#{pkgname}](#{pkgurl})", row[1][0], descr, "[#{source}](#{recipe_url})"] end data.sort! colwidth = [0,0,0, 9] data.map do |row| row.to_enum(:each_with_index).map do |e,i| colwidth[i] = [colwidth[i], e.length].max end end %> <%= "## Current List of #{data.size} Packages" %> <%= headers.to_enum(:each_with_index).map{ |h,i| h + " "*(colwidth[i]-h.length) }.join(" ") %> <%= colwidth.map{ |w| "-"*w }.join(" ") %> <%= data.map{ |row| row.to_enum(:each_with_index).map{ |c,i| c + " "*(colwidth[i]-c.length) }.join(" ") }.join("\n") %> ## Installing To add the repository put this before the call to `package-initialize` in your `init.el` file. (add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t) Please read about [known issues](#known-issues) below before attempting to install multiple packages at once. ### Customizations There is currently no way in `package.el` to exclude or include versions. So to remedy this there is a `melpa.el` package--available in MELPA--that will allow you to enable only certain packages or exclude certain packages. You can install the package manually by pasting this into yoru `*scratch*` buffer and evaluating it. (progn (switch-to-buffer (url-retrieve-synchronously "https://raw.github.com/milkypostman/melpa/master/melpa.el")) (package-install-from-buffer (package-buffer-info) 'single)) You can then customize two variables: `package-archive-enable-alist` : Optional Alist of enabled packages used by `package-filter'. The format is (ARCHIVE . PACKAGE ...), where ARCHIVE is a string matching an archive name in `package-archives', PACKAGE is a symbol of a package in ARCHIVE to enable. If no ARCHIVE exists in the alist, all packages are enabled. `package-archive-exclude-alist` : Alist of packages excluded by `package-filter'. The format is (ARCHIVE . PACKAGE ...), where ARCHIVE is a string matching an archive name in `package-archives', PACKAGE is a symbol of a package in that archive to exclude. Any specified package is excluded regardless of the value of `package-archive-enable-alist' ## Known Issues Due to the way the HTTP routing works on my provider, the HTTP/1.1 connection will time out for long package installs--where the package is large and takes a while to compile--like *magit* or *evil*. If you run into problems with complaints about the response from the web server consider adding (setq url-http-attempt-keepalives nil) This makes things a tad more slow but means that the install completes correctly. Otherwise the connection times out and the install goes haywire. ### Fixes for `package.el` **Note:** *These fixes are included in the `melpa.el` package.* There are a number of small bugs in Emacs24's `package.el`. First, when installing dependencies, the packages were not getting initialized. Second, the order for dependencies was coming out backwards for what I needed. Both problems are easily patched by some *advice*. (defadvice package-compute-transaction (before package-compute-transaction-reverse (package-list requirements) activate compile) "reverse the requirements" (setq requirements (reverse requirements)) (print requirements)) If you are not using Emacs24 from HEAD, you may also need this to initialize packages after they are downlaoded and installed. (defadvice package-download-tar (after package-download-tar-initialize activate compile) "initialize the package after compilation" (package-initialize)) (defadvice package-download-single (after package-download-single-initialize activate compile) "initialize the package after compilation" (package-initialize)) ## Updating Packages `package.el` now includes a mechanism to upgrade packages. After running `package-list-packages`, type *u* (mark Upgradable packages) and then *x* (eXecute the installs and deletions). When it's done installing all the packages it will ask if you want to delete the obsolete packages and so you can hit *y* (Yes). If you run into a problem installing or upgrading, you may need to go into your `~/.emacs.d/elpa/` directory and delete packages that are installed multiple times. This can happen when the install times out (see [Known Issues](#known-issues)). ## Development [https://github.com/milkypostman/melpa](https://github.com/milkypostman/melpa) Contributions are welcome. Currently, the builder only supports packages using git, subversion, mercurial, and darcs. This covers most of the packages that I am interested in.