mirror of https://github.com/Flinner/dots.git
				
				
				
			
		
			
				
	
	
		
			226 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			Org Mode
		
	
	
	
			
		
		
	
	
			226 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			Org Mode
		
	
	
	
#+BEGIN_SRC
 | 
						|
       ___           ___           ___           ___           ___           ___           ___
 | 
						|
      /  /\         /__/\         /  /\         /__/\         /  /\         /  /\         /  /\
 | 
						|
     /  /:/         \  \:\       /  /:/_       |  |::\       /  /::\       /  /:/        /  /:/_
 | 
						|
    /  /:/           \__\:\     /  /:/ /\      |  |:|:\     /  /:/\:\     /  /:/        /  /:/ /\
 | 
						|
   /  /:/  ___   ___ /  /::\   /  /:/ /:/_   __|__|:|\:\   /  /:/~/::\   /  /:/  ___   /  /:/ /::\
 | 
						|
  /__/:/  /  /\ /__/\  /:/\:\ /__/:/ /:/ /\ /__/::::| \:\ /__/:/ /:/\:\ /__/:/  /  /\ /__/:/ /:/\:\
 | 
						|
  \  \:\ /  /:/ \  \:\/:/__\/ \  \:\/:/ /:/ \  \:\~~\__\/ \  \:\/:/__\/ \  \:\ /  /:/ \  \:\/:/~/:/
 | 
						|
   \  \:\  /:/   \  \::/       \  \::/ /:/   \  \:\        \  \::/       \  \:\  /:/   \  \2.0 /:/
 | 
						|
    \  \:\/:/     \  \:\        \  \:\/:/     \  \:\        \  \:\        \  \:\/:/     \__\/ /:/
 | 
						|
     \  \::/       \  \:\        \  \::/       \  \:\        \  \:\        \  \::/        /__/:/
 | 
						|
      \__\/         \__\/         \__\/         \__\/         \__\/         \__\/         \__\/
 | 
						|
 | 
						|
                                          222222222222222
 | 
						|
                                         2:::::::::::::::22
 | 
						|
                                         2::::::222222:::::2
 | 
						|
                                         2222222     2:::::2
 | 
						|
                                                     2:::::2
 | 
						|
                                                     2:::::2
 | 
						|
                                                  2222::::2
 | 
						|
                                             22222::::::22
 | 
						|
                                           22::::::::222
 | 
						|
                                          2:::::22222
 | 
						|
                                         2:::::2
 | 
						|
                                         2:::::2
 | 
						|
                                         2:::::2       222222
 | 
						|
                                         2::::::2222222:::::2
 | 
						|
                                         2::::::::::::::::::2
 | 
						|
                                         22222222222222222222
 | 
						|
 | 
						|
#+END_SRC
 | 
						|
 | 
						|
* Chemacs
 | 
						|
 | 
						|
Chemacs 2 is an Emacs profile switcher, it makes it easy to run multiple Emacs
 | 
						|
configurations side by side.
 | 
						|
 | 
						|
Think of it as a bootloader for Emacs.
 | 
						|
 | 
						|
** Differences from Chemacs 1
 | 
						|
 | 
						|
Emacs intialization used to have a single entry point, either =~/.emacs= or
 | 
						|
=~/.emacs.d/init.el=. More recent Emacsen have introduced a second startup
 | 
						|
script, =~/.emacs/early-init.el=, which runs earlier in the boot process, and
 | 
						|
can be used for things that should happen very early on, like tweaking the GC,
 | 
						|
or disabling UI elements.
 | 
						|
 | 
						|
Chemacs 2 supports =early-init.el=, Chemacs 1 does not. This does also imply
 | 
						|
that Chemacs 2 needs to be installed as =~/.emacs.d= (a directory), rather than
 | 
						|
simply linking it to =~/.emacs= (a single file).
 | 
						|
 | 
						|
** Rationale
 | 
						|
 | 
						|
Emacs configuration is either kept in a =~/.emacs= file or, more commonly, in a
 | 
						|
=~/.emacs.d= directory. These paths are hard-coded. If you want to try out
 | 
						|
someone else's configuration, or run different distributions like Prelude or
 | 
						|
Spacemacs, then you either need to swap out =~/.emacs.d=, or run Emacs with a
 | 
						|
different =$HOME= directory set.
 | 
						|
 | 
						|
This last approach is quite common, but has some real drawbacks, since now
 | 
						|
packages will no longer know where your actual home directory is.
 | 
						|
 | 
						|
All of these makes trying out different Emacs configurations and distributions
 | 
						|
needlessly cumbersome.
 | 
						|
 | 
						|
Various approaches to solving this have been floated over the years. There's an
 | 
						|
Emacs patch around that adds an extra command line option, and various examples
 | 
						|
of how to add a command line option in userspace from Emacs Lisp.
 | 
						|
 | 
						|
Chemacs tries to implement this idea in a user-friendly way, taking care of the
 | 
						|
various edge cases and use cases that come up.
 | 
						|
 | 
						|
** Installation
 | 
						|
 | 
						|
Clone the Chemacs 2 repository as =$HOME/.emacs.d=. Note that if you already
 | 
						|
have an Emacs setup in =~/.emacs.d= you need to move it out of the way first. If
 | 
						|
you have an =~/.emacs= startup script then move that out of the way as well.
 | 
						|
 | 
						|
#+BEGIN_SRC shell
 | 
						|
  [ -f ~/.emacs ] && mv ~/.emacs ~/.emacs.bak
 | 
						|
  [ -d ~/.emacs.d ] && mv ~/.emacs.d ~/.emacs.default
 | 
						|
  git clone https://github.com/plexus/chemacs2.git ~/.emacs.d
 | 
						|
#+END_SRC
 | 
						|
 | 
						|
Note that this is different from Chemacs 1. Before Chemacs installed itself as
 | 
						|
=~/.emacs= and you could have your own default setup in =~/.emacs.d=. This
 | 
						|
approach no longer works because of =~/.emacs.d/early-init.el=, so Chemacs 2
 | 
						|
needs to be installed as =~/.emacs.d=.
 | 
						|
 | 
						|
Next you will need to create a =~/.emacs-profiles.el= file, for details see
 | 
						|
below.
 | 
						|
 | 
						|
#+begin_src emacs-lisp
 | 
						|
  (("default" . ((user-emacs-directory . "~/.emacs.default"))))
 | 
						|
#+end_src
 | 
						|
 | 
						|
** Usage
 | 
						|
 | 
						|
Chemacs adds an extra command line option to Emacs, =--with-profile=. Profiles
 | 
						|
are configured in =~/.emacs-profiles.el=.
 | 
						|
 | 
						|
If no profile is given at the command line then the =default= profile is used.
 | 
						|
 | 
						|
#+BEGIN_SRC shell
 | 
						|
$ emacs --with-profile my-profile
 | 
						|
#+END_SRC
 | 
						|
 | 
						|
There is an option for using profile that is not preconfigured in =~/.emacs-profiles.el=. To accomplish that you can directly provide the profile via the command line, like so
 | 
						|
#+BEGIN_SRC shell
 | 
						|
$ emacs --with-profile '((user-emacs-directory . "/path/to/config"))'
 | 
						|
#+END_SRC
 | 
						|
This method supports all the profile options given below.
 | 
						|
 | 
						|
** .emacs-profiles.el
 | 
						|
 | 
						|
This file contains an association list, with the keys/cars being the profile
 | 
						|
names, and the values/cdrs their configuration.
 | 
						|
 | 
						|
The main thing to configure is the =user-emacs-directory=
 | 
						|
 | 
						|
#+BEGIN_SRC emacs-lisp
 | 
						|
  (("default" . ((user-emacs-directory . "~/.emacs.default")))
 | 
						|
   ("spacemacs" . ((user-emacs-directory . "~/spacemacs"))))
 | 
						|
#+END_SRC
 | 
						|
 | 
						|
Chemacs will set this to be the =user-emacs-directory= in use, and load
 | 
						|
=init.el= from that directory.
 | 
						|
 | 
						|
Other things you can configure
 | 
						|
 | 
						|
- =custom-file= : The file where Customize stores its customizations. If this
 | 
						|
  isn't configured, and the =custom-file= variable is still unset after loading
 | 
						|
  the profile's =init.el=, then this will get set to the profile's =init.el=
 | 
						|
- =server-name= : Sets the =server-name= variable, so you can distinguish multiple
 | 
						|
  instances with =emacsclient -s <server-name>=.
 | 
						|
- =env= An association list of environment variables. These will get set before
 | 
						|
  loading the profile, so they can influence the initialization, and they are
 | 
						|
  visible to any subprocesses spawned from Emacs.
 | 
						|
- =straight-p= Enable the [[https://github.com/raxod502/straight.el][Straight]]
 | 
						|
  functional package manager.
 | 
						|
 | 
						|
Store =.emacs-profiles.el= together with your dotfiles. If you're not yet keeping
 | 
						|
a version controlled directory of dotfiles, then check out
 | 
						|
[[https://github.com/plexus/dotfiles/blob/master/connect-the-dots][connect-the-dots]]
 | 
						|
for a helpful script to do that.
 | 
						|
 | 
						|
** Changing the default profile (e.g. for GUI editors)
 | 
						|
 | 
						|
Where it is not possible to use the =--with-profile= flag, the default profile
 | 
						|
can be set using a =~/.emacs-profile= file.
 | 
						|
 | 
						|
If your =~/.emacs-profiles.el= file contains the following:
 | 
						|
 | 
						|
#+BEGIN_SRC emacs-lisp
 | 
						|
  (("default" . ((user-emacs-directory . "~/.emacs.default")))
 | 
						|
   ("spacemacs" . ((user-emacs-directory . "~/spacemacs")))
 | 
						|
   ("prelude" . ((user-emacs-directory . "~/prelude"))))
 | 
						|
#+END_SRC
 | 
						|
 | 
						|
you can create a file called =~/.emacs-profile=, containing the name of the
 | 
						|
profile you'd like to be used when none is given on the command line:
 | 
						|
 | 
						|
#+BEGIN_SRC shell
 | 
						|
$ echo 'spacemacs' > ~/.emacs-profile
 | 
						|
#+END_SRC
 | 
						|
 | 
						|
This will set the default profile to be the "spacemacs" profile, instead of
 | 
						|
"default". You can change the default by simply changing the contents of this
 | 
						|
file:
 | 
						|
 | 
						|
#+BEGIN_SRC shell
 | 
						|
$ echo 'prelude' > ~/.emacs-profile
 | 
						|
#+END_SRC
 | 
						|
 | 
						|
If this file doesn't exist, then "default" will be used, as before.
 | 
						|
 | 
						|
** Spacemacs
 | 
						|
 | 
						|
Spacemacs is typically installed by cloning the Spacemacs repo to =~/.emacs.d=,
 | 
						|
and doing extra customization from =~/.spacemacs= or =~/.spacemacs.d/init.el=.
 | 
						|
This makes it tedious to switch between version of Spacemacs, or between
 | 
						|
different Spacemacs configurations.
 | 
						|
 | 
						|
With Chemacs you can point your =user-emacs-directory= to wherever you have
 | 
						|
Spacemacs installed, and use the =SPACEMACSDIR= environment variable to point at
 | 
						|
a directory with customizations that are applied on top of the base install.
 | 
						|
 | 
						|
#+BEGIN_SRC emacs-lisp
 | 
						|
(("spacemacs" . ((user-emacs-directory . "~/spacemacs")
 | 
						|
                 (env . (("SPACEMACSDIR" . "~/.spacemacs.d")))))
 | 
						|
 | 
						|
 ("spacemacs-develop" . ((user-emacs-directory . "~/spacemacs/develop")
 | 
						|
                        (env . (("SPACEMACSDIR" . "~/.spacemacs.d")))))
 | 
						|
 | 
						|
 ("new-config" . ((user-emacs-directory . "~/spacemacs/develop")
 | 
						|
                  (env . (("SPACEMACSDIR" . "~/my-spacemacs-config"))))))
 | 
						|
#+END_SRC
 | 
						|
 | 
						|
** DOOM emacs
 | 
						|
 | 
						|
You can add an entry similar to the following to your =.emacs-profiles.el=
 | 
						|
 | 
						|
In the following snippet =~/doom-emacs= is where you have cloned doom emacs.
 | 
						|
 | 
						|
(Depending on when you read this) =DOOMDIR= support is only in =develop= branch of doom emacs. Check commit history of =master= branch of doom emacs
 | 
						|
 | 
						|
#+BEGIN_SRC emacs-lisp
 | 
						|
("doom" . ((user-emacs-directory . "~/doom-emacs")
 | 
						|
           (env . (("DOOMDIR" . "~/doom-config")))))
 | 
						|
#+END_SRC
 | 
						|
 | 
						|
Please refer to [[https://github.com/plexus/chemacs/issues/5][this]] discussion for details.
 | 
						|
 | 
						|
** FreeDesktop Directories
 | 
						|
 | 
						|
Both =~/.emacs-profiles.el= and =~/.emacs-profile= can also be stored under =$XDG_CONFIG_HOME/chemacs= (typically =~/.config/chemacs=) as =$XGD_CONFIG_HOME/chemacs/profiles.el= and =$XDG_CONFIG_HOME/chemacs/profile= respectively.
 | 
						|
 | 
						|
Further, as indicated by the [[http://git.savannah.gnu.org/cgit/emacs.git/tree/etc/NEWS?h=emacs-27][Emacs 27.1 changelog]], Emacs is now compatible with XDG Standards, looking for its configuration files in =${XDG_CONFIG_HOME}/emacs= directory too (provided the traditional =~/.emacs.d= and =~/.emacs= does not exist).
 | 
						|
Therefore, it is perfectly viable to install Chemacs 2 in =${XDG_CONFIG_HOME}/emacs= (usually =~/.config/emacs=) directory - with the aforementioned caveat: _the directory =~/.emacs.d"= and the file ="~/.emacs"= does not exist_.
 | 
						|
 | 
						|
** LICENSE
 | 
						|
 | 
						|
Copyright © Arne Brasseur 2018-2020
 | 
						|
 | 
						|
Distributed under the terms of the GPL v3.
 |