summaryrefslogtreecommitdiffstats
path: root/emacs/.emacs.d/init.org
diff options
context:
space:
mode:
authorGravatar Tom Willemse2015-09-28 23:03:06 +0200
committerGravatar Tom Willemse2015-09-28 23:03:06 +0200
commit2488743abd583ffd3fccd2217d613ee4ccea665c (patch)
tree0ba0165ab5035b2f380563cdb6cb8b5870f02b0c /emacs/.emacs.d/init.org
parentcb49188ed7e3325859230ded5e632778b2757a44 (diff)
downloaddotfiles-2488743abd583ffd3fccd2217d613ee4ccea665c.tar.gz
dotfiles-2488743abd583ffd3fccd2217d613ee4ccea665c.zip
Finish re-organizing init.org
Diffstat (limited to 'emacs/.emacs.d/init.org')
-rw-r--r--emacs/.emacs.d/init.org761
1 files changed, 393 insertions, 368 deletions
diff --git a/emacs/.emacs.d/init.org b/emacs/.emacs.d/init.org
index 15636c1..50b801a 100644
--- a/emacs/.emacs.d/init.org
+++ b/emacs/.emacs.d/init.org
@@ -151,6 +151,103 @@
(with-eval-after-load ',feature ,@forms)))
#+END_SRC
+*** Turn off minor modes
+
+ This macro creates a function that will turn off a minor mode that
+ passed to it.
+
+ #+BEGIN_SRC emacs-lisp
+ (defmacro turn-off (func)
+ "Create a function that will turn off FUNC when called."
+ `(lambda () (eval (,func -1))))
+ #+END_SRC
+
+*** Change settings
+
+ Sometimes a mode just needs to change a certain setting to a
+ specific value.
+
+ #+BEGIN_SRC emacs-lisp
+ (defmacro change-settings (&rest settings)
+ "Create a function that changes the value of NAME to VALUE."
+ `(lambda () (setq ,@settings)))
+ #+END_SRC
+
+*** Eval after init
+
+ Some things can only really work after all other initialization
+ functions have completed. For example, any functions that require
+ any ELPA packages to be loaded, unless you want to load it in your
+ init manually (and have it loaded again later on after your config
+ has run).
+
+ #+BEGIN_SRC emacs-lisp
+ (defmacro oni:eval-after-init (&rest body)
+ "Defer execution of BODY until after Emacs init."
+ (declare (indent 0))
+ `(add-hook 'emacs-startup-hook #'(lambda () ,@body)))
+ #+END_SRC
+
+*** Whitespace only with tabs
+
+ In some modes I want to see the tabs in a buffer. Though I don't
+ want to be overwhelmed by seeing all spaces and line endings.
+
+ #+BEGIN_SRC emacs-lisp
+ (defvar whitespace-style)
+
+ (defun oni:whitespace-only-tabs ()
+ (setq-local whitespace-style '(face tabs))
+ (whitespace-mode))
+ #+END_SRC
+
+** Useful functions
+
+ During your editing in Emacs you will undoubtedly find the need to
+ define your own editing functions or macros. Here are mine.
+
+*** Delete the contents of the string at point
+
+ First we define the function. It was inspired by [[http://www.masteringemacs.org/][Mickey's post on
+ swapping quote symbols]], mostly copied even. First we check if we
+ are even in a string, and if not we throw an error, after that we
+ move back to the beginning of the string, store that point, go to
+ the end of the string (using =forward-sexp=) and then delete the
+ region between the two points (non-inclusive).
+
+ #+BEGIN_SRC emacs-lisp
+ (defun oni:delete-string-contents ()
+ (interactive)
+
+ (unless (nth 3 (syntax-ppss))
+ (error "You must be in a string for this command to work"))
+
+ (save-excursion
+ (while (nth 3 (syntax-ppss)) (forward-char -1))
+
+ (let ((bos (point)))
+ (forward-sexp)
+ (delete-region (1+ bos) (1- (point))))))
+ #+END_SRC
+
+ Since for interactive functions it's kind of a pain to have to use
+ a personal "namespace" I prefer naming them regularly as if they're
+ just part of the environment. If ever Emacs comes up with a similar
+ function with the same name, I'd prefer using the built-in version.
+
+ #+BEGIN_SRC emacs-lisp
+ (unless (fboundp 'delete-string-contents)
+ (defalias 'delete-string-contents 'oni:delete-string-contents))
+ #+END_SRC
+
+ Lastly, any function worth using often should probably be easily
+ accessible with a keybinding. In my case the {{{key(C-c i s)}}} is
+ inspired by the Vim keybindings like {{{key(ci")}}}.
+
+ #+BEGIN_SRC emacs-lisp
+ (global-set-key (kbd "C-c i s") 'delete-string-contents)
+ #+END_SRC
+
* General customization
These customizations don't belong with any specific mode.
@@ -842,326 +939,248 @@
(setq elnode-do-init nil)
#+END_SRC
-* Minor mode customization
-
- Many minor modes also offer a bit of customization possibilities.
+** js2
-** Robe
+ =js2-mode= isn't just an "improved" JavaScript mode, it's a full-on
+ JavaScript parser. It's easy to notice typo's and such when Emacs
+ can show you that a certain variable is or isn't declared. It does
+ come with some baggage, as it's not immediately clear how I can
+ specify which global names exist. For simple files it is fine to do
+ something like:
- #+BEGIN_SRC emacs-lisp :tangle no
- (depends-on "robe")
+ #+BEGIN_SRC js2 :tangle no
+ /*global $ Routes jQuery */
#+END_SRC
- Robe is a Ruby completion and documentation lookup library.
+ Which will tell =js2-mode= that =$=, =Routes= and =jQuery= are known to be
+ define elsewhere. This doesn't work well for big lists of globals.
-*** Adding completions to autocomplete
+*** Add some known symbols for .conkerorrc/init.js to js2-mode
- To add Robe completions to autocomplete whenever robe is started,
- I use the =robe-mode-hook= to enable this so that it doesn't try to
- get any completions when robe isn't running.
+ Conkeror has a lot of functions, and I don't like seeing them all as
+ unknowns. So add them to known symbols.
+
+ *Note:* See my [[Vacuous defvar][note]] on vacuous defvar for this use of =defvar=.
#+BEGIN_SRC emacs-lisp
- (add-hook 'robe-mode-hook #'ac-robe-setup)
+ (defvar js2-additional-externs)
+
+ (defun oni:js2-add-conkeror-symbols ()
+ "Add known/used conkeror symbols to additional externs."
+ (when (string-suffix-p ".conkerorrc/init.js" (buffer-file-name))
+ (setq js2-additional-externs
+ '( ;; Functions
+ "add_hook" "check_buffer" "co_return" "content_buffer"
+ "define_browser_object_class" "define_key" "define_webjump"
+ "dumpln" "get_current_profile" "get_home_directory"
+ "get_recent_conkeror_window"
+ "hints_minibuffer_annotation_mode" "interactive" "load_spec"
+ "load_spec_uri_string" "load_url_in_new_buffer" "make_file"
+ "make_uri" "mode_line_adder"
+ "open_download_buffer_automatically" "prefix_completer"
+ "read_browser_object" "register_user_stylesheet"
+ "remove_hook" "require" "send_http_request" "session_pref"
+ "shell_command_blind" "theme_load"
+ ;; Variables
+ "Cc" "Ci" "browser_object_history_url" "browser_object_links"
+ "buffer_count_widget" "buffer_icon_widget" "content_buffer"
+ "content_buffer_form_keymap" "content_buffer_normal_keymap"
+ "content_buffer_text_keymap" "content_policy_accept"
+ "content_policy_bytype" "content_policy_reject" "cwd"
+ "default_base_keymap" "default_global_keymap"
+ "downloads_status_widget" "external_content_handlers"
+ "hint_digits" "load_paths" "read_buffer_show_icons"
+ "read_url_handler_list" "session_auto_save_auto_load"
+ "theme_load_paths" "title_format_fn" "url_remoting_fn"
+ ;; Keyword argument
+ "$alternative" "$browser_object" "$completer" "$completions"
+ "$initial_value" "$options" "$prompt" "$sort_order"
+ "$use_bookmarks" "$use_history" "$use_webjumps"))))
+
+ (add-hook 'js2-init-hook #'oni:js2-add-conkeror-symbols)
#+END_SRC
-* Some general-purpose functions and macros
+** Eww
- A configuration as big as mine is bound to have some functions and
- macros that are used in many places.
+ I've been excited about the "Emacs Web Wowser" since I first read
+ about it on the mailing list. Previously I'd used some integration
+ with w3 which was ok, but it certainly didn't match up to a
+ fully-integrated Emacs application.
-** Turn off
+ This application uses =shr= just like Gnus, so there is some overlap
+ here with reading Emails.
- This macro creates a function that will turn off a minor mode that
- passed to it.
+*** Teach eww about <code> tags
- #+BEGIN_SRC emacs-lisp
- (defmacro turn-off (func)
- "Create a function that will turn off FUNC when called."
- `(lambda () (eval (,func -1))))
- #+END_SRC
+ Strangely enough, ~eww~ doesn't seem to be aware of =<code>= HTML tags.
+ Luckily it's trivial to teach it. It does know about =<pre>= HTML
+ tags, and basically I just want =<code>= tags to be treated almost as
+ =<pre>= tags, so to do that we just have to define a =shr-tag-code=
+ function. I've copied the =shr-tag-pre= function and removed the calls
+ to =ensure-newline=, because =<code>= tags are inline tags.
-** Change setting
+ In order to remain a little future-proof, it should only be done if
+ it doesn't already exist.
- Sometimes a mode just needs to change a certain setting to a
- specific value.
+ *Note:* See my [[Vacuous defvar][note]] on vacuous defvar for this use of =defvar=.
- #+BEGIN_SRC emacs-lisp
- (defmacro change-settings (&rest settings)
- "Create a function that changes the value of NAME to VALUE."
- `(lambda () (setq ,@settings)))
- #+END_SRC
+ *Note:* See my [[Function declarations][note]] on function declarations about the use of
+ =declare-function=.
-** Whitespace only with tabs
+ #+BEGIN_SRC emacs-lisp
+ (defvar shr-folding-mode)
+ (declare-function shr-indent "shr")
+ (declare-function shr-generic "shr")
- In some modes I want to see the tabs in a buffer. Though I don't
- want to be overwhelmed by seeing all spaces and line endings.
+ (with-eval-after-load 'shr
+ (unless (fboundp 'shr-tag-code)
+ (defun shr-tag-code (cont)
+ (let ((shr-folding-mode 'none))
+ (shr-indent)
+ (shr-generic cont)))))
+ #+END_SRC
- #+BEGIN_SRC emacs-lisp
- (defvar whitespace-style)
+*** Setup eww-lnum
- (defun oni:whitespace-only-tabs ()
- (setq-local whitespace-style '(face tabs))
- (whitespace-mode))
- #+END_SRC
+ #+BEGIN_SRC emacs-lisp :tangle no
+ (depends-on "eww-lnum")
+ #+END_SRC
-** Eval after init
+ As recommended in the [[https://github.com/m00natic/eww-lnum][README]], set the keys in the =eww-mode-map=.
- Some things can only really work after all other initialization
- functions have completed. For example, any functions that require
- any ELPA packages to be loaded, unless you want to load it in your
- init manually (and have it loaded again later on after your config
- has run).
+ #+BEGIN_SRC emacs-lisp
+ (defvar eww-mode-map)
- #+BEGIN_SRC emacs-lisp
- (defmacro oni:eval-after-init (&rest body)
- "Defer execution of BODY until after Emacs init."
- (declare (indent 0))
- `(add-hook 'emacs-startup-hook #'(lambda () ,@body)))
- #+END_SRC
+ (with-eval-after-load 'eww
+ (define-key eww-mode-map "f" 'eww-lnum-follow)
+ (define-key eww-mode-map "F" 'eww-lnum-universal))
+ #+END_SRC
-* Add some known symbols for .conkerorrc/init.js to js2-mode
-
- Conkeror has a lot of functions, and I don't like seeing them all as
- unknowns. So add them to known symbols.
-
- *Note:* See my [[Vacuous defvar][note]] on vacuous defvar for this use of =defvar=.
-
- #+BEGIN_SRC emacs-lisp
- (defvar js2-additional-externs)
-
- (defun oni:js2-add-conkeror-symbols ()
- "Add known/used conkeror symbols to additional externs."
- (when (string-suffix-p ".conkerorrc/init.js" (buffer-file-name))
- (setq js2-additional-externs
- '( ;; Functions
- "add_hook" "check_buffer" "co_return" "content_buffer"
- "define_browser_object_class" "define_key" "define_webjump"
- "dumpln" "get_current_profile" "get_home_directory"
- "get_recent_conkeror_window"
- "hints_minibuffer_annotation_mode" "interactive" "load_spec"
- "load_spec_uri_string" "load_url_in_new_buffer" "make_file"
- "make_uri" "mode_line_adder"
- "open_download_buffer_automatically" "prefix_completer"
- "read_browser_object" "register_user_stylesheet"
- "remove_hook" "require" "send_http_request" "session_pref"
- "shell_command_blind" "theme_load"
- ;; Variables
- "Cc" "Ci" "browser_object_history_url" "browser_object_links"
- "buffer_count_widget" "buffer_icon_widget" "content_buffer"
- "content_buffer_form_keymap" "content_buffer_normal_keymap"
- "content_buffer_text_keymap" "content_policy_accept"
- "content_policy_bytype" "content_policy_reject" "cwd"
- "default_base_keymap" "default_global_keymap"
- "downloads_status_widget" "external_content_handlers"
- "hint_digits" "load_paths" "read_buffer_show_icons"
- "read_url_handler_list" "session_auto_save_auto_load"
- "theme_load_paths" "title_format_fn" "url_remoting_fn"
- ;; Keyword argument
- "$alternative" "$browser_object" "$completer" "$completions"
- "$initial_value" "$options" "$prompt" "$sort_order"
- "$use_bookmarks" "$use_history" "$use_webjumps"))))
-
- (add-hook 'js2-init-hook #'oni:js2-add-conkeror-symbols)
- #+END_SRC
+** Scheme
-* Teach eww about <code> tags
-
- Strangely enough, ~eww~ doesn't seem to be aware of =<code>= HTML tags.
- Luckily it's trivial to teach it. It does know about =<pre>= HTML
- tags, and basically I just want =<code>= tags to be treated almost as
- =<pre>= tags, so to do that we just have to define a =shr-tag-code=
- function. I've copied the =shr-tag-pre= function and removed the calls
- to =ensure-newline=, because =<code>= tags are inline tags.
-
- In order to remain a little future-proof, it should only be done if
- it doesn't already exist.
-
- *Note:* See my [[Vacuous defvar][note]] on vacuous defvar for this use of =defvar=.
-
- *Note:* See my [[Function declarations][note]] on function declarations about the use of
- =declare-function=.
-
- #+BEGIN_SRC emacs-lisp
- (defvar shr-folding-mode)
- (declare-function shr-indent "shr")
- (declare-function shr-generic "shr")
-
- (with-eval-after-load 'shr
- (unless (fboundp 'shr-tag-code)
- (defun shr-tag-code (cont)
- (let ((shr-folding-mode 'none))
- (shr-indent)
- (shr-generic cont)))))
- #+END_SRC
-
-* Use scheme-mode for scsh interpreted files
-
- Set the major mode for files interpreted by scsh (for example, by
- having ~#!/usr/local/bin/scsh~ at the top) to use =scheme-mode=.
-
- #+BEGIN_SRC emacs-lisp
- (add-to-list 'interpreter-mode-alist '("scsh" . scheme-mode))
- #+END_SRC
-
-* Set default scheme implementation
-
- Set the default implementation for geiser to guile so it doesn't ask
- which implementation to use every time.
-
- #+BEGIN_SRC emacs-lisp
- (defvar geiser-default-implementation)
-
- (with-eval-after-load 'geiser
- (setq geiser-default-implementation 'guile))
- #+END_SRC
-
-* Setup eww-lnum
-
- As recommended in the [[https://github.com/m00natic/eww-lnum][README]], set the keys in the =eww-mode-map=.
-
- #+BEGIN_SRC emacs-lisp
- (defvar eww-mode-map)
-
- (with-eval-after-load 'eww
- (define-key eww-mode-map "f" 'eww-lnum-follow)
- (define-key eww-mode-map "F" 'eww-lnum-universal))
- #+END_SRC
-
-* Don't compile scss files
-
- By default =scss-mode= tries compiling a file each time it's saved. I
- don't have SCSS properly installed globally so this always fails,
- highly annoying.
-
- #+BEGIN_SRC emacs-lisp
- (defvar scss-compile-at-save)
-
- (with-eval-after-load 'scss-mode
- (setq scss-compile-at-save nil))
- #+END_SRC
-
-* Change listings in dired
+ I really like programming in Lisp. One of the more comfortable
+ Lisps is Scheme because most of the implementations I've worked
+ with are more like other compiled or interpreted languages, whereas
+ Common Lisp usually re-compiles on every load. Aside from that,
+ there are some neat programs written in some scheme dialects and of
+ course scsh is the most awesome shell scripting language ever
+ conceived.
- The number of bytes a file is doesn't usually tell me much when it's
- something like ~292837~. I prefer seeing just how many Kb or Mb a
- certain file is. I also don't need to see the ~.~ and ~..~ directories
- when I insert directories into the current dired buffer, as there is
- a great chance that the current and parent directory are already
- shown in the buffer.
+*** Use scheme-mode for scsh interpreted files
- #+BEGIN_SRC emacs-lisp
- (defvar dired-subdir-switches)
+ Set the major mode for files interpreted by scsh (for example, by
+ having ~#!/usr/local/bin/scsh~ at the top) to use =scheme-mode=.
- (with-eval-after-load 'dired
- (setq dired-listing-switches "-alh"
- dired-subdir-switches "-Alh"))
- #+END_SRC
+ #+BEGIN_SRC emacs-lisp
+ (add-to-list 'interpreter-mode-alist '("scsh" . scheme-mode))
+ #+END_SRC
-* Useful functions
+*** Set default scheme implementation
- During your editing in Emacs you will undoubtedly find the need to
- define your own editing functions or macros. Here are mine.
+ Set the default implementation for geiser to guile so it doesn't ask
+ which implementation to use every time.
-** Delete the contents of the string at point
+ #+BEGIN_SRC emacs-lisp
+ (stante-after geiser-impl
+ (setq geiser-default-implementation 'guile))
+ #+END_SRC
- First we define the function. It was inspired by [[http://www.masteringemacs.org/][Mickey's post on
- swapping quote symbols]], mostly copied even. First we check if we
- are even in a string, and if not we throw an error, after that we
- move back to the beginning of the string, store that point, go to
- the end of the string (using =forward-sexp=) and then delete the
- region between the two points (non-inclusive).
+** SCSS
- #+BEGIN_SRC emacs-lisp
- (defun oni:delete-string-contents ()
- (interactive)
+ SCSS is a CSS preprocessor that makes writing CSS files much more
+ fun. Add autocompletion and some custom imenu function.
- (unless (nth 3 (syntax-ppss))
- (error "You must be in a string for this command to work"))
+ #+BEGIN_SRC emacs-lisp
+ (add-hook 'scss-mode-hook 'auto-complete-mode)
+ (add-hook 'scss-mode-hook 'scss-imenu-setup)
+ #+END_SRC
- (save-excursion
- (while (nth 3 (syntax-ppss)) (forward-char -1))
+** Dired
- (let ((bos (point)))
- (forward-sexp)
- (delete-region (1+ bos) (1- (point))))))
- #+END_SRC
+ Dired is an excellent file manager.
- Since for interactive functions it's kind of a pain to have to use
- a personal "namespace" I prefer naming them regularly as if they're
- just part of the environment. If ever Emacs comes up with a similar
- function with the same name, I'd prefer using the built-in version.
+*** Change listings in dired
- #+BEGIN_SRC emacs-lisp
- (unless (fboundp 'delete-string-contents)
- (defalias 'delete-string-contents 'oni:delete-string-contents))
- #+END_SRC
+ The number of bytes a file is doesn't usually tell me much when it's
+ something like ~292837~. I prefer seeing just how many Kb or Mb a
+ certain file is. I also don't need to see the ~.~ and ~..~ directories
+ when I insert directories into the current dired buffer, as there is
+ a great chance that the current and parent directory are already
+ shown in the buffer.
- Lastly, any function worth using often should probably be easily
- accessible with a keybinding. In my case the {{{key(C-c i s)}}} is
- inspired by the Vim keybindings like {{{key(ci")}}}.
+ #+BEGIN_SRC emacs-lisp
+ (defvar dired-subdir-switches)
- #+BEGIN_SRC emacs-lisp
- (global-set-key (kbd "C-c i s") 'delete-string-contents)
- #+END_SRC
+ (with-eval-after-load 'dired
+ (setq dired-listing-switches "-alh"
+ dired-subdir-switches "-Alh"))
+ #+END_SRC
-* Show eldoc when evaluating expressions
+** PHP
- Thanks to [[http://endlessparentheses.com/sweet-new-features-in-24-4.html][this post]] it was brought to my attention that eldoc mode
- can be enabled when evaluating expressions using {{{key(M-:)}}}.
+ I occasionally write PHP for work. Not usually in my free time, but
+ there are some open source PHP projects that I sometimes tinker
+ with.
- I vaguely remember having had this before, I just don't know how or
- why it stopped working.
+*** Show tabs and spaces in indent
- #+BEGIN_SRC emacs-lisp
- (add-hook 'eval-expression-minibuffer-setup-hook #'eldoc-mode)
- #+END_SRC
+ I'm working with some WordPress plugins nowadays and their style
+ guide insists on using tabs, not spaces... I'd like to know that
+ I'm following this rule.
-* Remove whitespace when closing delimiters
+ #+BEGIN_SRC emacs-lisp
+ (add-hook 'php-mode-hook #'oni:whitespace-only-tabs)
+ #+END_SRC
- In =electric-pair-mode=, skip over and delete white space if it stands
- between the cursor and the closing delimiter.
+** Web
- #+BEGIN_SRC emacs-lisp
- (setq electric-pair-skip-whitespace 'chomp)
- #+END_SRC
+ Web mode is good for files that contain a lot of HTML, CSS and
+ JavaScript together. Most other major modes or multi-major modes
+ don't quite do it.
-* Programming
+*** Turn off the fill column indicator
- Emacs is a real programmer's editor, especially so because it's so
- programmable itself. It also offers modes for a lot of programming
- languages and 3rd-party packages offer even more.
+ ~web-mode~ has some quirks, such as not being able to handle the
+ fact that ~fci-mode~ puts a red line at the 80-column margin. This is
+ annoying to say the least.
-** SCSS
+ #+BEGIN_SRC emacs-lisp
+ (declare-function fci-mode "fci-mode")
+ (add-hook 'web-mode-hook (turn-off fci-mode))
+ #+END_SRC
- - Enable auto-completion
+*** Show tabs in indentation
- #+BEGIN_SRC emacs-lisp
- (declare-function auto-complete-mode "auto-complete")
+ Just like in ~php-mode~ I want to see the tabs.
- (add-hook 'scss-mode-hook #'auto-complete-mode)
- #+END_SRC
+ #+BEGIN_SRC emacs-lisp
+ (add-hook 'web-mode-hook #'oni:whitespace-only-tabs)
+ #+END_SRC
- - Enable imenu
+*** Use tabs for indentation
- #+BEGIN_SRC emacs-lisp
- (declare-function scss-imenu-setup "scss-imenu")
+ Set =indent-tabs-mode= for ~web-mode~ as well.
- (add-hook 'scss-mode-hook #'scss-imenu-setup)
- #+END_SRC
+ #+BEGIN_SRC emacs-lisp
+ (defvar web-mode-code-indent-offset)
+ (defvar web-mode-markup-indent-offset)
-** PHP
+ (add-hook 'web-mode-hook
+ (change-settings indent-tabs-mode t
+ web-mode-code-indent-offset 4
+ web-mode-markup-indent-offset 4))
+ #+END_SRC
-*** Show tabs and spaces in indent
+*** Use it for Embedded Ruby HTML files
- I'm working with some WordPress plugins nowadays and their style
- guide insists on using tabs, not spaces... I'd like to know that
- I'm following this rule.
+ Use it for ~.html.erb~ files.
#+BEGIN_SRC emacs-lisp
- (add-hook 'php-mode-hook #'oni:whitespace-only-tabs)
+ (oni:eval-after-init
+ (add-to-list 'auto-mode-alist '("\\.html\\.erb$" . web-mode)))
#+END_SRC
-*** Use web-mode for HTML-heavy files
+*** Use it for HTML-heavy PHP files
I have to work with a lot of PHP and HTML interspersed. This makes
a difficult case since ~php-mode~ very deliberately doesn't support
@@ -1182,63 +1201,149 @@
(add-to-list 'auto-mode-alist '("\\.html\\.php$" . web-mode)))
#+END_SRC
-** Web
+** PO mode
- ~web-mode~ has some quirks, such as not being able to handle the
- fact that ~fci-mode~ puts a red line at the 80-column margin. This is
- annoying to say the least.
+ Autoload =po-mode=, because it didn't come with an autloads file or
+ cookie.
#+BEGIN_SRC emacs-lisp
- (declare-function fci-mode "fci-mode")
- (add-hook 'web-mode-hook (turn-off fci-mode))
+ (autoload 'po-mode "po-mode" nil t)
#+END_SRC
- Just like in ~php-mode~ I want to see the tabs.
+ Automatically enable =po-mode= for files that end in =.po= or that have
+ a =.po= extension followed by others (such as =.po.erb=).
#+BEGIN_SRC emacs-lisp
- (add-hook 'web-mode-hook #'oni:whitespace-only-tabs)
+ (add-to-list 'auto-mode-alist '("\\.po\\'\\|\\.po\\." . po-mode))
#+END_SRC
- Set =indent-tabs-mode= for ~web-mode~ as well.
+** Magit
- #+BEGIN_SRC emacs-lisp
- (defvar web-mode-code-indent-offset)
- (defvar web-mode-markup-indent-offset)
+ Recently Magit gained the annoying habit of producing a /huge/ warning
+ message whenever you don't tell it that you've already seen it. To
+ tell it you've already seen the message you need to specify the
+ following.
- (add-hook 'web-mode-hook
- (change-settings indent-tabs-mode t
- web-mode-code-indent-offset 4
- web-mode-markup-indent-offset 4))
+ #+BEGIN_SRC emacs-lisp
+ (eval-and-compile
+ (defvar magit-last-seen-setup-instructions "1.4.0"))
#+END_SRC
- Use it for ~.html.erb~ files.
+ I use a =defvar= here in order to keep the byte-compiler from
+ complaining about an undefined variable. It needs to be specified
+ before magit is loaded otherwise magit will keep complaining.
- #+BEGIN_SRC emacs-lisp
- (oni:eval-after-init
- (add-to-list 'auto-mode-alist '("\\.html\\.erb$" . web-mode)))
+*** Project directory
+
+ I keep all my projects in =~/projects/=, so Magit shouldn't have to
+ look anywhere else.
+
+ #+NAME: magit-repo-dirs
+ #+BEGIN_SRC emacs-lisp :tangle no
+ (setq magit-repository-directories '("~/projects/"))
+ #+END_SRC
+
+*** Show fine differences
+
+ I like to see all the little differences in diffs that I can. They
+ really help reading diffs. I also just want to see them on all
+ diffs and not the selected one, which would make an unnecessary
+ amount of navigation required to properly read the diffs.
+
+ #+NAME: magit-diff-refine-hunk
+ #+BEGIN_SRC emacs-lisp :tangle no
+ (setq magit-diff-refine-hunk 'all)
+ #+END_SRC
+
+*** Delay setting
+
+ The settings in the previous sections should only be set after
+ Magit has loaded.
+
+ #+BEGIN_SRC emacs-lisp :noweb yes
+ (stante-after magit
+ <<magit-repo-dirs>>
+ <<magit-diff-refine-hunk>>)
#+END_SRC
-** PO mode
+* Minor mode customization
- Autoload =po-mode=, because it didn't come with an autloads file or
- cookie.
+ Many minor modes also offer a bit of customization possibilities.
- #+BEGIN_SRC emacs-lisp
- (autoload 'po-mode "po-mode" nil t)
+** Robe
+
+ #+BEGIN_SRC emacs-lisp :tangle no
+ (depends-on "robe")
#+END_SRC
- Automatically enable =po-mode= for files that end in =.po= or that have
- a =.po= extension followed by others (such as =.po.erb=).
+ Robe is a Ruby completion and documentation lookup library.
+
+*** Adding completions to autocomplete
+
+ To add Robe completions to autocomplete whenever robe is started,
+ I use the =robe-mode-hook= to enable this so that it doesn't try to
+ get any completions when robe isn't running.
+
+ #+BEGIN_SRC emacs-lisp
+ (add-hook 'robe-mode-hook #'ac-robe-setup)
+ #+END_SRC
+
+** Eldoc
+
+ Seeing the arguments to a function whilst typing its name is
+ excellent.
+
+*** Show eldoc when evaluating expressions
+
+ Thanks to [[http://endlessparentheses.com/sweet-new-features-in-24-4.html][this post]] it was brought to my attention that eldoc mode
+ can be enabled when evaluating expressions using {{{key(M-:)}}}.
+
+ I vaguely remember having had this before, I just don't know how or
+ why it stopped working.
+
+ #+BEGIN_SRC emacs-lisp
+ (add-hook 'eval-expression-minibuffer-setup-hook #'eldoc-mode)
+ #+END_SRC
+
+** Electric pair
+
+ Electric pairing of delimiters is one of those features that is
+ just so essential to my feeling comfortable with an editor. Most of
+ the time I don't even use it, really. It's just that I'm so used to
+ having it and when I /do/ expect it to be there it is so frustrating
+ when it's not, or when it doesn't work properly.
+
+ This functionality, much like [[Electric indent]] isn't something I
+ want enabled in all modes, though for different reasons, and for a
+ time there was only the global =electric-pair-mode=. Again I'm very
+ happy that a local version was added.
+
+ The reason that I don't want it enabled for all modes is that some
+ modes (mostly Lisp-like language modes) have better alternatives.
+ But most non-Lisp-like language modes I really do need to have it.
#+BEGIN_SRC emacs-lisp
- (add-to-list 'auto-mode-alist '("\\.po\\'\\|\\.po\\." . po-mode))
+ (add-hook 'c-mode-hook #'electric-pair-local-mode)
+ (add-hook 'coffee-mode-hook #'electric-pair-local-mode)
+ (add-hook 'css-mode-hook #'electric-pair-local-mode)
+ (add-hook 'haml-mode-hook #'electric-pair-local-mode)
+ (add-hook 'java-mode-hook #'electric-pair-local-mode)
+ (add-hook 'js2-mode-hook #'electric-pair-local-mode)
+ (add-hook 'lua-mode-hook #'electric-pair-local-mode)
+ (add-hook 'python-mode-hook #'electric-pair-local-mode)
+ (add-hook 'ruby-mode-hook #'electric-pair-local-mode)
+ (add-hook 'scss-mode-hook #'electric-pair-local-mode)
+ (add-hook 'sh-mode-hook #'electric-pair-local-mode)
#+END_SRC
-* Minor modes
+*** Remove whitespace when closing delimiters
+
+ In =electric-pair-mode=, skip over and delete white space if it stands
+ between the cursor and the closing delimiter.
- Emacs offers a lot of minor modes and even more can be found in the
- ELPA, MELPA and Marmalade repositories. These offer a lot of
- customization possibilities and added features.
+ #+BEGIN_SRC emacs-lisp
+ (setq electric-pair-skip-whitespace 'chomp)
+ #+END_SRC
** Electric indent
@@ -1307,37 +1412,6 @@
(add-hook 'electric-indent-local-mode-hook #'oni:switch-newline-keys)
#+END_SRC
-** Electric pairing
-
- Electric pairing of delimiters is one of those features that is
- just so essential to my feeling comfortable with an editor. Most of
- the time I don't even use it, really. It's just that I'm so used to
- having it and when I /do/ expect it to be there it is so frustrating
- when it's not, or when it doesn't work properly.
-
- This functionality, much like [[Electric indent]] isn't something I
- want enabled in all modes, though for different reasons, and for a
- time there was only the global =electric-pair-mode=. Again I'm very
- happy that a local version was added.
-
- The reason that I don't want it enabled for all modes is that some
- modes (mostly Lisp-like language modes) have better alternatives.
- But most non-Lisp-like language modes I really do need to have it.
-
- #+BEGIN_SRC emacs-lisp
- (add-hook 'c-mode-hook #'electric-pair-local-mode)
- (add-hook 'coffee-mode-hook #'electric-pair-local-mode)
- (add-hook 'css-mode-hook #'electric-pair-local-mode)
- (add-hook 'haml-mode-hook #'electric-pair-local-mode)
- (add-hook 'java-mode-hook #'electric-pair-local-mode)
- (add-hook 'js2-mode-hook #'electric-pair-local-mode)
- (add-hook 'lua-mode-hook #'electric-pair-local-mode)
- (add-hook 'python-mode-hook #'electric-pair-local-mode)
- (add-hook 'ruby-mode-hook #'electric-pair-local-mode)
- (add-hook 'scss-mode-hook #'electric-pair-local-mode)
- (add-hook 'sh-mode-hook #'electric-pair-local-mode)
- #+END_SRC
-
** Auto completion
#+BEGIN_SRC emacs-lisp :tangle no
@@ -1516,55 +1590,6 @@
<<flycheck-display>>)
#+END_SRC
-* Magit
-
- Recently Magit gained the annoying habit of producing a /huge/ warning
- message whenever you don't tell it that you've already seen it. To
- tell it you've already seen the message you need to specify the
- following.
-
- #+BEGIN_SRC emacs-lisp
- (eval-and-compile
- (defvar magit-last-seen-setup-instructions "1.4.0"))
- #+END_SRC
-
- I use a =defvar= here in order to keep the byte-compiler from
- complaining about an undefined variable. It needs to be specified
- before magit is loaded otherwise magit will keep complaining.
-
-** Project directory
-
- I keep all my projects in =~/projects/=, so Magit shouldn't have to
- look anywhere else.
-
- #+NAME: magit-repo-dirs
- #+BEGIN_SRC emacs-lisp :tangle no
- (setq magit-repository-directories '("~/projects/"))
- #+END_SRC
-
-** Show fine differences
-
- I like to see all the little differences in diffs that I can. They
- really help reading diffs. I also just want to see them on all
- diffs and not the selected one, which would make an unnecessary
- amount of navigation required to properly read the diffs.
-
- #+NAME: magit-diff-refine-hunk
- #+BEGIN_SRC emacs-lisp :tangle no
- (setq magit-diff-refine-hunk 'all)
- #+END_SRC
-
-** Delay setting
-
- The settings in the previous sections should only be set after
- Magit has loaded.
-
- #+BEGIN_SRC emacs-lisp :noweb yes
- (stante-after magit
- <<magit-repo-dirs>>
- <<magit-diff-refine-hunk>>)
- #+END_SRC
-
* Final touches
These options and calls need to come last so they don't interfere