Finish re-organizing init.org
This commit is contained in:
parent
cb49188ed7
commit
2488743abd
1 changed files with 467 additions and 442 deletions
|
@ -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,6 +939,333 @@
|
|||
(setq elnode-do-init nil)
|
||||
#+END_SRC
|
||||
|
||||
** js2
|
||||
|
||||
=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 js2 :tangle no
|
||||
/*global $ Routes jQuery */
|
||||
#+END_SRC
|
||||
|
||||
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.
|
||||
|
||||
*** 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
|
||||
|
||||
** Eww
|
||||
|
||||
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.
|
||||
|
||||
This application uses =shr= just like Gnus, so there is some overlap
|
||||
here with reading Emails.
|
||||
|
||||
*** 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
|
||||
|
||||
*** Setup eww-lnum
|
||||
|
||||
#+BEGIN_SRC emacs-lisp :tangle no
|
||||
(depends-on "eww-lnum")
|
||||
#+END_SRC
|
||||
|
||||
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
|
||||
|
||||
** Scheme
|
||||
|
||||
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.
|
||||
|
||||
*** 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
|
||||
(stante-after geiser-impl
|
||||
(setq geiser-default-implementation 'guile))
|
||||
#+END_SRC
|
||||
|
||||
** SCSS
|
||||
|
||||
SCSS is a CSS preprocessor that makes writing CSS files much more
|
||||
fun. Add autocompletion and some custom imenu function.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(add-hook 'scss-mode-hook 'auto-complete-mode)
|
||||
(add-hook 'scss-mode-hook 'scss-imenu-setup)
|
||||
#+END_SRC
|
||||
|
||||
** Dired
|
||||
|
||||
Dired is an excellent file manager.
|
||||
|
||||
*** Change listings in dired
|
||||
|
||||
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.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(defvar dired-subdir-switches)
|
||||
|
||||
(with-eval-after-load 'dired
|
||||
(setq dired-listing-switches "-alh"
|
||||
dired-subdir-switches "-Alh"))
|
||||
#+END_SRC
|
||||
|
||||
** PHP
|
||||
|
||||
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.
|
||||
|
||||
*** Show tabs and spaces in indent
|
||||
|
||||
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.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(add-hook 'php-mode-hook #'oni:whitespace-only-tabs)
|
||||
#+END_SRC
|
||||
|
||||
** Web
|
||||
|
||||
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.
|
||||
|
||||
*** Turn off the fill column indicator
|
||||
|
||||
~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.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(declare-function fci-mode "fci-mode")
|
||||
(add-hook 'web-mode-hook (turn-off fci-mode))
|
||||
#+END_SRC
|
||||
|
||||
*** Show tabs in indentation
|
||||
|
||||
Just like in ~php-mode~ I want to see the tabs.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(add-hook 'web-mode-hook #'oni:whitespace-only-tabs)
|
||||
#+END_SRC
|
||||
|
||||
*** Use tabs for indentation
|
||||
|
||||
Set =indent-tabs-mode= for ~web-mode~ as well.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(defvar web-mode-code-indent-offset)
|
||||
(defvar web-mode-markup-indent-offset)
|
||||
|
||||
(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
|
||||
|
||||
*** Use it for Embedded Ruby HTML files
|
||||
|
||||
Use it for ~.html.erb~ files.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(oni:eval-after-init
|
||||
(add-to-list 'auto-mode-alist '("\\.html\\.erb$" . web-mode)))
|
||||
#+END_SRC
|
||||
|
||||
*** 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
|
||||
that very well. On the other hand I really don't like ~web-mode~ for
|
||||
PHP /without/ any HTML in it. So I decided to name the files that
|
||||
contain mostly HTML with some PHP ~.html.php~ and have them load
|
||||
~web-mode~ instead of ~php-mode~, whilst keeping the association for
|
||||
plain ~.php~ files as it is.
|
||||
|
||||
Something tricky about doing this is that if this setting gets
|
||||
evaluated /before/ ~php-mode~ is loaded it'll be further down the list
|
||||
from ~php-mode~'s definition. This would cause the ~php-mode~ auto
|
||||
mode definition from being accepted first (since ~.html.php~ also
|
||||
matches ~.php~) and consequently render this definition useless.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(oni:eval-after-init
|
||||
(add-to-list 'auto-mode-alist '("\\.html\\.php$" . web-mode)))
|
||||
#+END_SRC
|
||||
|
||||
** PO mode
|
||||
|
||||
Autoload =po-mode=, because it didn't come with an autloads file or
|
||||
cookie.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(autoload 'po-mode "po-mode" nil t)
|
||||
#+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=).
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(add-to-list 'auto-mode-alist '("\\.po\\'\\|\\.po\\." . po-mode))
|
||||
#+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
|
||||
|
||||
* Minor mode customization
|
||||
|
||||
Many minor modes also offer a bit of customization possibilities.
|
||||
|
@ -864,382 +1288,63 @@
|
|||
(add-hook 'robe-mode-hook #'ac-robe-setup)
|
||||
#+END_SRC
|
||||
|
||||
* Some general-purpose functions and macros
|
||||
** Eldoc
|
||||
|
||||
A configuration as big as mine is bound to have some functions and
|
||||
macros that are used in many places.
|
||||
Seeing the arguments to a function whilst typing its name is
|
||||
excellent.
|
||||
|
||||
** Turn off
|
||||
*** Show eldoc when evaluating expressions
|
||||
|
||||
This macro creates a function that will turn off a minor mode that
|
||||
passed to it.
|
||||
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-:)}}}.
|
||||
|
||||
#+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 setting
|
||||
|
||||
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
|
||||
|
||||
** 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
|
||||
|
||||
** 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
|
||||
|
||||
* 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
|
||||
|
||||
* 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
|
||||
|
||||
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.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(defvar dired-subdir-switches)
|
||||
|
||||
(with-eval-after-load 'dired
|
||||
(setq dired-listing-switches "-alh"
|
||||
dired-subdir-switches "-Alh"))
|
||||
#+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
|
||||
|
||||
* 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
|
||||
|
||||
* 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.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(setq electric-pair-skip-whitespace 'chomp)
|
||||
#+END_SRC
|
||||
|
||||
* Programming
|
||||
|
||||
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.
|
||||
|
||||
** SCSS
|
||||
|
||||
- Enable auto-completion
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(declare-function auto-complete-mode "auto-complete")
|
||||
|
||||
(add-hook 'scss-mode-hook #'auto-complete-mode)
|
||||
#+END_SRC
|
||||
|
||||
- Enable imenu
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(declare-function scss-imenu-setup "scss-imenu")
|
||||
|
||||
(add-hook 'scss-mode-hook #'scss-imenu-setup)
|
||||
#+END_SRC
|
||||
|
||||
** PHP
|
||||
|
||||
*** Show tabs and spaces in indent
|
||||
|
||||
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.
|
||||
I vaguely remember having had this before, I just don't know how or
|
||||
why it stopped working.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(add-hook 'php-mode-hook #'oni:whitespace-only-tabs)
|
||||
(add-hook 'eval-expression-minibuffer-setup-hook #'eldoc-mode)
|
||||
#+END_SRC
|
||||
|
||||
*** Use web-mode for HTML-heavy files
|
||||
** Electric pair
|
||||
|
||||
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
|
||||
that very well. On the other hand I really don't like ~web-mode~ for
|
||||
PHP /without/ any HTML in it. So I decided to name the files that
|
||||
contain mostly HTML with some PHP ~.html.php~ and have them load
|
||||
~web-mode~ instead of ~php-mode~, whilst keeping the association for
|
||||
plain ~.php~ files as it is.
|
||||
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.
|
||||
|
||||
Something tricky about doing this is that if this setting gets
|
||||
evaluated /before/ ~php-mode~ is loaded it'll be further down the list
|
||||
from ~php-mode~'s definition. This would cause the ~php-mode~ auto
|
||||
mode definition from being accepted first (since ~.html.php~ also
|
||||
matches ~.php~) and consequently render this definition useless.
|
||||
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
|
||||
|
||||
*** 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.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(oni:eval-after-init
|
||||
(add-to-list 'auto-mode-alist '("\\.html\\.php$" . web-mode)))
|
||||
(setq electric-pair-skip-whitespace 'chomp)
|
||||
#+END_SRC
|
||||
|
||||
** Web
|
||||
|
||||
~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.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(declare-function fci-mode "fci-mode")
|
||||
(add-hook 'web-mode-hook (turn-off fci-mode))
|
||||
#+END_SRC
|
||||
|
||||
Just like in ~php-mode~ I want to see the tabs.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(add-hook 'web-mode-hook #'oni:whitespace-only-tabs)
|
||||
#+END_SRC
|
||||
|
||||
Set =indent-tabs-mode= for ~web-mode~ as well.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(defvar web-mode-code-indent-offset)
|
||||
(defvar web-mode-markup-indent-offset)
|
||||
|
||||
(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
|
||||
|
||||
Use it for ~.html.erb~ files.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(oni:eval-after-init
|
||||
(add-to-list 'auto-mode-alist '("\\.html\\.erb$" . web-mode)))
|
||||
#+END_SRC
|
||||
|
||||
** PO mode
|
||||
|
||||
Autoload =po-mode=, because it didn't come with an autloads file or
|
||||
cookie.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(autoload 'po-mode "po-mode" nil t)
|
||||
#+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=).
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(add-to-list 'auto-mode-alist '("\\.po\\'\\|\\.po\\." . po-mode))
|
||||
#+END_SRC
|
||||
|
||||
* Minor modes
|
||||
|
||||
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.
|
||||
|
||||
** Electric indent
|
||||
|
||||
Automatically indenting code upon typing certain characters can be
|
||||
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue