diff options
Diffstat (limited to 'emacs')
-rw-r--r-- | emacs/.emacs.d/init.org | 761 |
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 |