Files
kernel_Notes/Zim/Utils/emacs/el-get/doc.txt
2012-08-08 15:17:56 +08:00

397 lines
15 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Content-Type: text/x-zim-wiki
Wiki-Format: zim 0.4
Creation-Date: 2012-01-07T15:54:55+08:00
====== doc ======
Created Saturday 07 January 2012
摘自源代码目录中的README文档
= el-get
Short Story: el-get allows you to install and manage +elisp+ code for
Emacs. It supports lots of __differents types of sources __and is able to
'install' them, 'update' them and 'remove' them, but more importantly it
will __'init'__ them for you.
That means it will** +require+** the 'features' you need,** +load+** the
necessary files, set the 'Info' paths so that **+C-h i+** shows the new
documentation you now depend on, and finally call your own
**+:post-init+ **function for you to setup the extension. Or call it a
package.
== Status and Version Numbers
Current** +el-get+** status is stable, ready for daily use and packed with extra
features that make life easier. There are some more things we could do, as
always, but they will be about smoothing things further.
=== Latest released version
+el-get+ version 2.1 is available, with a boatload of features, including
autoloads support, byte-compiling in an external "clean room" Emacs
instance, custom support, **lazy initialisation support** (defering all init
functions to __+eval-after-load+__), and multi repositories +ELPA+ support.
=== Version numbering
Version String are now inspired by how Emacs itself numbers its versions.
First is the major version number, then a dot, then the minor version
number. The minor version number is 0 when still developping the next major
version. So 3.0 is a developer release while 3.1 will be the next stable
release.
Please note that this versioning policy has been picked while backing
1.2~dev, so 1.0 was a "stable" release in fact. Ah, history.
== How to Install it?
Here's the 'lazy installer':
--------------------------------------
;; So the idea is that you copy/paste this code into your *scratch* buffer,
;; hit C-j, and you have a working el-get.
(url-retrieve
"https://raw.github.com/dimitri/el-get/master/el-get-install.el"
(lambda (s)
(end-of-buffer)
(eval-print-last-sexp)))
--------------------------------------
You have to type +C-j+ with** the cursor at the end of the last line, but**
**still on the line**. 'C-j runs the command eval-print-last-sexp', so it will
evaluate the code you're looking at, and that will +git clone el-get+ at the
'right place'.
Note that you can add this elisp code into your __emacs init file__ directly, as
the installer code will detect if +el-get+ is already installed. Notice
that doing so directly will require internet access to start emacs. You can
avoid this with the following snippet instead:
--------------------------------------
(add-to-list 'load-path "~/.emacs.d/el-get/el-get")
(unless __(require 'el-get nil t)__
(url-retrieve
"https://raw.github.com/dimitri/el-get/master/el-get-install.el"
(lambda (s)
(end-of-buffer)
(eval-print-last-sexp))))
--------------------------------------
See next section for details about how to** setup you emacs** so that it's able
to benefit from +el-get+ automatically.
== How to install the developer version (master branch)?
The 'lazy installer' uses the default +el-get-install.el+ file which targets
the +2.stable+ branch. To install el-get directly on the +master+ branch,
summon the +el-get-master-branch+ variable into existence:
--------------------------------------
;; So the idea is that you copy/paste this code into your *scratch* buffer,
;; hit C-j, and you have a working developper edition of el-get.
(url-retrieve
"https://raw.github.com/dimitri/el-get/master/el-get-install.el"
(lambda (s)
(let (el-get-master-branch)
(end-of-buffer)
(eval-print-last-sexp))))
--------------------------------------
== Basic usage
Now that +el-get+ is installed, simply use **+M-x el-get-install+** and pick
whatever package you need. __ Arrange to__ have +el-get+ part of your setup, so
that at next emacs startup the installed packages are **initialized**. Here's
how to:
通过el-get-install命令安装的package需要在el-get的配置文件中添加一些设置这样
emacs下次启动时el-get才会__自动地配置__它们。
--------------------------------------
(add-to-list 'load-path "~/.emacs.d/el-get/el-get")
(unless (require 'el-get nil t)
(url-retrieve
"https://raw.github.com/dimitri/el-get/master/el-get-install.el"
(lambda (s)
(end-of-buffer)
(eval-print-last-sexp))))
(el-get 'sync)
--------------------------------------
That's the basic setup.
== Advanced setup with local recipes
Of course, my emacs setup is managed in a private git repository. Some
people on +#emacs+ are using +git submodules+ (or was it straight import)
for managing external repositories in there, but all I can say is that I
frown on this idea. I want an easy canonical list of packages I depend on to
run emacs, and I want this documentation to be usable as-is. Enters el-get!
--------------------------------------
(add-to-list 'load-path "~/.emacs.d/el-get/el-get")
(require 'el-get)
;; local sources
(setq __el-get-sources__
'((:name magit
:after (lambda () (global-set-key (kbd "C-x C-z") 'magit-status)))
(:name asciidoc
:type elpa
:after (lambda ()
(autoload 'doc-mode "doc-mode" nil t)
(add-to-list 'auto-mode-alist '("\\.adoc$" . doc-mode))
(add-hook 'doc-mode-hook '(lambda ()
(turn-on-auto-fill)
(require 'asciidoc)))))
(:name lisppaste :type elpa)
(:name dictionary-el :type apt-get)
(:name emacs-goodies-el :type apt-get)))
(setq __my-packages__
(append
'(cssh el-get switch-window vkill google-maps nxhtml xcscope yasnippet)
(mapcar 'el-get-source-name el-get-sources)))
__(el-get 'sync my-packages)__
--------------------------------------
So now you have a pretty good documentation of the packages you want
installed, where to get them, and how to install them. For the advanced
methods (such as elpa or apt-get), you basically just need the package
name. When relying on a bare git repository, you need to give some more
information, such as the URL to clone and the build steps if any. Then also
what features to require and maybe where to find the texinfo documentation
of the package, for automatic inclusion into your local Info menu.
The good news is that not only you now have a solid readable description of
all that in a central place, but this very description is all (el-get) needs
to do its magic. This command will check that each and every package is
installed on your system (in __el-get-dir__) and if that's not the case, it will
actually install it. Then, it will__ init the packages__: that means caring
about the load-path, the Info-directory-list (and dir texinfo menu building)
the loading of the emacs-lisp files, and finally it will require the
features.
== How to use it?
You see that +el-get-sources+ example up there? It __finishes with a single__
__+(el-get)+ call__. That's it. It will 'install' new +sources+ on the list and
only 'init' already installed ones.
The status of each package is tracked into +~/.emacs.d/el-get/__.status.el__+
(by default) and can get the values +required+, +installed+ or +removed+.
=== Sync or async?
Most often you want +el-get-install+ and +el-get-build+ to stay out of the
way and be 'asynchronous', so that you can continue using Emacs while your
new package is getting ready. But imagine you're starting up Emacs after a
+git pull+ on the other computer (after a commute, say), and there's some
newer packages for this instance to consider installing.
Now you want a synchronous install, right?
So, by default +(el-get)+ is asynchronous, but you can ask for it to be
sync, or to still be asynchronous but to wait until it finished before to
give control back:
(el-get 'sync)
(el-get 'wait)
You even get a progress report!
=== Sources
See the documentation of the +el-get-sources+ variable for details. __Please__
__note that +el-get-sources+ is another source location for recipes, adding to__
__your +el-get-recipe-path+.__
Note that you can also give a mix of +packages+ symbols, +inline recipes+
and +source lists+ to +el-get+ as arguments, and completely __bypass__ the
+el-get-sources+ variable.
(el-get 'sync 'package 'name 'list-of-packages-names-or-symbol)
It is still __recommended__ to +(setq el-get-sources '(list of packages))+ then
use +(el-get 'sync)+, so that commands such as +el-get-update+ know which
packages to update.
=== Recipes
Some sources are contributed to +el-get+ directly, so that you only have to
put in the +el-get-sources+ the name of the package you want to
install.
Should you need some __local specific setup__, you can do that by providing a
partial sources **missing the +:type+ property**: your local properties will get
merged into the recipes one.
Also, the variable __+el-get-recipe-path+__ allows you to maintain local recipes
in case you either dislike the default one or are crafting some new one not
commited to the main repository yet. But please do consider sending them
over!
We do not intend to provide recipes for advanced types such as +apt-get+ and
+elpa+ because there's so little to win here, and maintaining a package list
would take too much time.
=== Package setup
The package setup can either go into the __+:after+__ function, or in a file
named __+init-package.el+ in +el-get-user-package-directory+__. Any such named
file will get automatically loaded by +el-get+ at +init+ time, if it exists.
=== Build Commands
__Avoid using +make install+__, which will usually move files into a
"system location." In our case, you probably just want your package
+foo+ to be all installed into +~/.emacs.d/el-get/foo+, right? So, no
+make install+.
=== Byte Compiling
+el-get+ will 'byte compile' the elisp for the package when its source
definition includes a +:compile+ property set to the list of files to byte
compile (or to a single file), or all the +.el+ files found in the package
when there's no +:build+ command.
=== Hooks
+el-get+ offers a variety of specific hooks (read the source), and two
general purposes hooks facilities: +el-get-post-install-hooks+ and
+el-get-post-update-hooks+, called with the package name as argument.
=== Some more commands?
Yes, ok.
M-x el-get-list-packages::
Opens a buffer listing all known packages (those for which you have a
recipe). The listing includes the package name, its status (one of
"available", "installed", "removed" or "required") and the package
description. The description is a free form text and has not been
provided for all recipes. Please also note that
+el-get-emacswiki-refresh+ will create recipes omitting the description
as of now.
M-x el-get-describe::
Prompt for a package name, with completion, then open an +*Help*+ window
with details about the selected package. Those include current status,
website, description, installation method, full recipe, and buttons to
easily install, update or remove the package.
M-x el-get-install::
+
Will prompt for a package name, with completion, then install it. It will
only propose packages that are not already +installed+. Any package that
you have a recipe for is a candidate.
+
Please note that when installing a package that is not in your
+el-get-sources+ or your +el-get+ call means that it will not be initialized
for you automatically at emacs startup. You get a +WARNING+ message when
that's the case.
M-x el-get-cd::
Will prompt for an +installed+ package name, with completion, then open
its directory with dired.
M-x el-get-update::
Will prompt for an installed package name, with completion, then update
it. This will run the +build+ commands and +init+ the package again.
M-x el-get-self-update::
Update only one package, +el-get+ itself.
M-x el-get-update-all::
Will update all packages used in +el-get-sources+. Beware that using
this function can lead to hours of settings review: more often than not
updating a package requires some adjustments to your setup. Updating
all of them at once will require reviewing almost all your setup.
M-x el-get-remove::
Will prompt for an +installed+ package name, with completion, then
remove it. Depending on the +type+ of the package, this often means
simply deleting the directory where the source package lies. Sometime we
have to use external tools instead (+apt-get+, e.g.). No effort is made
to unload the features.
M-x el-get-find-recipe-file::
Will prompt for the name of a package, with completion, then +find-file+
its +recipe+ file.
M-x el-get-make-recipes::
Will prompt for an existing directory where to output all your 'new'
recipe files: one file for each entry in +el-get-sources+ that is not
just a +symbol+ and that is not found anywhere in +el-get-recipe-path+.
M-x el-get-emacswiki-refresh::
Will launch a subprocess that connects to EmacsWiki and fetch from there
the list of elisp scripts hosted. Then produce a recipe file per
script, and store that in the given directory, which default to
+~/.emacs.d/el-get/el-get/recipes/emacswiki/+ if you didn't change
+el-get-dir+.
=== Useful functions
el-get-package-types-alist (statuses &rest types)::
Return an alist of package names that are of given types. Only consider
packages whose status is `member' of STATUSES, which defaults to
installed, required and removed.
ELISP> (el-get-package-types-alist "installed" 'cvs 'emacswiki)
((emacs-w3m . cvs)
(rect-mark . emacswiki)
(icomplete+ . emacswiki)
(php-mode-improved . emacswiki)
(rainbow-delimiters . emacswiki)
(goto-last-change . emacswiki)
(emacs-goodies-el . cvs))
el-get-extra-packages (&rest packages)::
Return installed or required packages that are not in given package
list.
ELISP> (el-get-extra-packages dim-packages)
((verbiste "installed")
(package "installed"))
== Extending it
Please see the documentation for the +el-get-methods+ and provide a patch!
Adding +bzr+ support for example was only about writing 2 functions, mostly
using copy paste. Here's the patch: https://github.com/dimitri/el-get/commit/63e9018102bdeb7b6d9136db231adcd983087217#L0R437
== Upgrade Notes
=== Upgrading to 3.1
A change has been included so that +el-get-sources+ is now __only another__
__source for recipes__, and +(el-get '...)+ will now only install and initialize
known "required" and "installed" packages.
The documentation has been updated to detail the new setup.
If you have packages that have been installed in the past but you no longer
want in your setup, here's how to get them out of the way:
M-: (el-get-save-package-status "package-name-here" "removed")
Please review documentation section 'Advanced setup with local recipes'.