Add blog posts
This commit is contained in:
parent
6cbdc4209f
commit
38adb8d0ac
9 changed files with 358 additions and 11 deletions
56
articles/c-d_to_close_eshell.org
Normal file
56
articles/c-d_to_close_eshell.org
Normal file
|
@ -0,0 +1,56 @@
|
|||
#+TITLE: C-d to close eshell
|
||||
|
||||
One of the "tricks" that I have learned to use when working with
|
||||
terminals is using ~C-d~ to close them, or when working on a TTY
|
||||
logout. It somehow grew to the extent that if I can't use it, I get
|
||||
annoyed, like with ~eshell~.
|
||||
|
||||
I have customized ~ansi-term~ to immediately close its buffer after the
|
||||
shell quits. This makes it very easy to start an ~ansi-term~, which I've
|
||||
bound to ~C-c t~, run a quick command (perhaps ~make~, or similar), ~C-d~,
|
||||
and I'm out. I want that for my ~eshell~ too.
|
||||
|
||||
There are a few conditions that I want met before the buffer is
|
||||
killed, though.
|
||||
|
||||
1. Since ~eshell~ is an Emacs mode like any other, ~C-d~ is usually used
|
||||
to forward-kill characters, I don't want to lose this.
|
||||
2. I only want it to quit when the line of input is empty.
|
||||
|
||||
The following piece of code make sure these conditions are met.
|
||||
|
||||
1. It interactively calls =delete-char=, which keeps keybindings like
|
||||
~C-4 C-d~ to delete 4 characters working.
|
||||
2. It catches the error condition which is signaled whenever
|
||||
=delete-char= can't do it's job (like when there's nothing left to
|
||||
delete in the buffer).
|
||||
3. It checks to make sure that the signaled error is the =end-of-buffer=
|
||||
error. I don't want to kill the buffer if I try to delete more
|
||||
characters than are in the buffer because I feel that could cause
|
||||
irritating surprises.
|
||||
4. It checks of the cursor is at the ~eshell~ prompt. This, combined
|
||||
with only responding to the =end-of-buffer= error, makes sure we're
|
||||
on an empty line and not just at the end of the input. Sometimes
|
||||
keys are pressed at the wrong time and I don't want to have to
|
||||
re-type a command just because I was being an idiot.
|
||||
5. If the right conditions aren't met, signal the error again so I can
|
||||
see what's going on.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(defun eshell-C-d ()
|
||||
"Either call `delete-char' interactively or quit."
|
||||
(interactive)
|
||||
(condition-case err
|
||||
(call-interactively #'delete-char)
|
||||
(error (if (and (eq (car err) 'end-of-buffer)
|
||||
(looking-back eshell-prompt-regexp))
|
||||
(kill-buffer)
|
||||
(signal (car err) (cdr err))))))
|
||||
#+END_SRC
|
||||
|
||||
I then bind this to =C-d= in eshell.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(add-hook 'eshell-mode-hook
|
||||
(lambda () (local-set-key (kbd "C-d") #'eshell-C-d)))
|
||||
#+END_SRC
|
44
articles/mounting_music_dir_before_mpd.org
Normal file
44
articles/mounting_music_dir_before_mpd.org
Normal file
|
@ -0,0 +1,44 @@
|
|||
#+TITLE:
|
||||
#+OPTIONS: toc:nil c:t
|
||||
#+HTML_LINK_UP: ../blog.html
|
||||
|
||||
* Mounting music dir before MPD :systemd:mpd:conf:
|
||||
|
||||
Systemd allows you to specify a program to run before running the main
|
||||
daemon (or program) with =ExecStartPre=. This can, for instance, be used
|
||||
to run a mount command before starting ~mpd~. By adding under the
|
||||
=[Service]= heading:
|
||||
|
||||
#+BEGIN_SRC conf-unix
|
||||
ExecStartPre=/usr/bin/mount /mnt/music
|
||||
#+END_SRC
|
||||
|
||||
Now I have already setup my ~fstab~ to know what to mount on ~/mnt/music~,
|
||||
but of course that shouldn't be necessary. According to the
|
||||
~systemd.service(5)~ man page it uses the same syntax as =ExecStart=,
|
||||
which tells us that one must use absolute file names since no shell is
|
||||
used to start them.
|
||||
|
||||
This also has the effect of stopping the =ExecStart= part from the
|
||||
~.service~ from being executed if the =ExecStartPre= doesn't finish
|
||||
successfully. Which works out great in my case as I don't want to
|
||||
start ~mpd~ if my music directory didn't mount. If you want to ignore
|
||||
the exit status of (one of) the =ExecStartPre= commands you can prefix
|
||||
it with a ~-~, for example:
|
||||
|
||||
#+BEGIN_SRC conf-unix
|
||||
ExecStartPre=-/usr/bin/mount /mnt/music
|
||||
#+END_SRC
|
||||
|
||||
Which would continue running the =ExecStart= even if mounting failed.
|
||||
|
||||
Also know that there can be multiple =ExecStartPre= options and they
|
||||
will be executed serially, so for example:
|
||||
|
||||
#+BEGIN_SRC conf-unix
|
||||
ExecStartPre=/usr/bin/mount /mnt/music
|
||||
ExecStartPre=-/usr/bin/mount /mnt/music2
|
||||
#+END_SRC
|
||||
|
||||
This would fail if ~/mnt/music~ doesn't mount, but would continue just
|
||||
fine if ~/mnt/music~ did and ~/mnt/music2~ didn't.
|
72
articles/python-mixins.org
Normal file
72
articles/python-mixins.org
Normal file
|
@ -0,0 +1,72 @@
|
|||
#+TITLE: Python mixins
|
||||
#+TAGS: python,coding
|
||||
|
||||
I learned something fun the other day. And it has made me consider
|
||||
writing more mixins and using Python's multiple inheritance more. This
|
||||
is not completely new to me, but I finally tested it a few days ago
|
||||
and what I thought I knew seems to have been confirmed.
|
||||
|
||||
Given some classes:
|
||||
|
||||
#+NAME: setup
|
||||
#+BEGIN_SRC python :exports code :results output :session
|
||||
class Foo(object):
|
||||
def frob(self):
|
||||
print('foo')
|
||||
|
||||
|
||||
class Bar(Foo):
|
||||
def frob(self):
|
||||
super(Bar, self).frob()
|
||||
print('bar')
|
||||
|
||||
|
||||
class BazMixin(object):
|
||||
def frob(self):
|
||||
super(BazMixin, self).frob()
|
||||
print('baz')
|
||||
|
||||
|
||||
class Unmixed(Bar, BazMixin):
|
||||
def frob(self):
|
||||
super(Unmixed, self).frob()
|
||||
print('unmixed')
|
||||
|
||||
|
||||
class Mixed(BazMixin, Bar):
|
||||
def frob(self):
|
||||
super(Mixed, self).frob()
|
||||
print('mixed')
|
||||
#+END_SRC
|
||||
|
||||
#+RESULTS: setup
|
||||
|
||||
We can see the progression of inheritance. You will see here that
|
||||
=BazMixin= is skipped:
|
||||
|
||||
#+NAME: unmixed
|
||||
#+BEGIN_SRC python :exports both :results output :session
|
||||
unmixed = Unmixed()
|
||||
unmixed.frob()
|
||||
#+END_SRC
|
||||
|
||||
#+RESULTS: unmixed
|
||||
:
|
||||
: foo
|
||||
: bar
|
||||
: unmixed
|
||||
|
||||
And here that it is not:
|
||||
|
||||
#+NAME: mixed
|
||||
#+BEGIN_SRC python :exports both :results output :session
|
||||
mixed = Mixed()
|
||||
mixed.frob()
|
||||
#+END_SRC
|
||||
|
||||
#+RESULTS: mixed
|
||||
:
|
||||
: foo
|
||||
: bar
|
||||
: baz
|
||||
: mixed
|
18
articles/rlwrapping_sbcl.org
Normal file
18
articles/rlwrapping_sbcl.org
Normal file
|
@ -0,0 +1,18 @@
|
|||
#+TITLE: rlwrapping sbcl
|
||||
|
||||
[[http://sbcl.org][SBCL]] is an excellent lisp implementation. The only thing that's not so
|
||||
nice about it is overly simple command-line interface. The absence of
|
||||
~<UP>~, ~C-a~, ~M-b~, etc. can be annoying, even though I only occasionally
|
||||
use SBCL directly.
|
||||
|
||||
I have 3 solutions to this problem now:
|
||||
|
||||
- Use [[http://common-lisp.net/project/slime/][SLIME]], which is what I do most of the time, but sometimes this
|
||||
isn't practical.
|
||||
|
||||
- Use [[http://common-lisp.net/project/linedit/][Linedit]]. I tried this, and it was cool. But somehow I broke it
|
||||
and now I can't get it to work.
|
||||
|
||||
- Use [[http://utopia.knoware.nl/~hlub/uck/rlwrap/#rlwrap][rlwrap]]. This requires you to either always invoke SBCL as
|
||||
=rlwrap sbcl= or create an alias for it. This works very well too,
|
||||
is very simple and doesn't noticeably increase start-up time.
|
56
articles/some_quick_git_diff_tips.org
Normal file
56
articles/some_quick_git_diff_tips.org
Normal file
|
@ -0,0 +1,56 @@
|
|||
#+TITLE: Some quick git diff tips
|
||||
|
||||
A couple of quick tips. As you possibly know you can specify some
|
||||
options to be used for diffs (and other things) per file type. The
|
||||
one I'm interested in is the function name.
|
||||
|
||||
* For org-mode
|
||||
|
||||
The primary way of identifying which part of an org-mode document
|
||||
a change occurs in seems to me to be the heading. So, in your
|
||||
~$HOME/.gitconfig~ put:
|
||||
|
||||
#+BEGIN_SRC conf
|
||||
[diff "org"]
|
||||
xfuncname = "^\\*+.*"
|
||||
#+END_SRC
|
||||
|
||||
Which should show any lines starting with one or more ~*~
|
||||
characters. And then in ~$XDG_CONFIG_HOME/git/attributes~ or
|
||||
~$HOME/.config/git/attributes~ put:
|
||||
|
||||
#+BEGIN_EXAMPLE
|
||||
,*.org diff=org
|
||||
#+END_EXAMPLE
|
||||
|
||||
* For lisp and lisp-like langauges
|
||||
|
||||
For anything that resembles lisp (so Common Lisp, Emacs Lisp, Hy,
|
||||
scheme, etc.) I would think that the easiest thing to do is just
|
||||
see the closes top-level form. So, in your ~$HOME/.gitconfig~ put:
|
||||
|
||||
#+BEGIN_SRC conf
|
||||
[diff "lisp"]
|
||||
xfuncname = "^\\([^ ]+ [^ ]+"
|
||||
#+END_SRC
|
||||
|
||||
Which should show the opening parenthesis and the first two words.
|
||||
For example:
|
||||
|
||||
#+BEGIN_EXAMPLE
|
||||
(defun some-function-name
|
||||
(defclass my-awesome-class
|
||||
(define-route this-strange-route
|
||||
#+END_EXAMPLE
|
||||
|
||||
And then put in your ~$XDG_CONFIG_HOME/git/attributes~ or
|
||||
~$HOME/.config/git/attributes~:
|
||||
|
||||
#+BEGIN_EXAMPLE
|
||||
,*.lisp diff=lisp
|
||||
,*.el diff=lisp
|
||||
,*.hy diff=lisp
|
||||
,*.scm diff=lisp
|
||||
#+END_EXAMPLE
|
||||
|
||||
And possibly any other lisp-like language files you can think of.
|
45
blog.org
Normal file
45
blog.org
Normal file
|
@ -0,0 +1,45 @@
|
|||
#+TITLE:
|
||||
#+OPTIONS: toc:nil
|
||||
#+STARTUP: showall
|
||||
#+HTML_LINK_UP: ./
|
||||
#+RSS_EXTENSION: rss
|
||||
|
||||
# * Python mixins :python:coding:
|
||||
# :PROPERTIES:
|
||||
# :PUBDATE: <2013-11-10 Sun 15:35>
|
||||
# :RSS_PERMALINK: articles/python-mixins.html
|
||||
# :END:
|
||||
# A little explanation of one of the things that I think make Mixins
|
||||
# in Python an interesting idea.
|
||||
|
||||
# [[file:articles/python-mixins.org][Read]]
|
||||
|
||||
* Mounting music dir before MPD :systemd:mpd:config:
|
||||
:PROPERTIES:
|
||||
:RSS_PERMALINK: articles/mounting_music_dir_before_mpd.html
|
||||
:PUBDATE: <2013-11-24 Sun 14:03>
|
||||
:END:
|
||||
I use an NFS drive to store my music files, which I don't mount by
|
||||
default (to keep startup fast). It was a pain to have to mount the
|
||||
drive manually each time before starting MPD. [[file:articles/mounting_music_dir_before_mpd.org][Read]]
|
||||
|
||||
* rlwrapping sbcl :sbcl:lisp:utility:
|
||||
:PROPERTIES:
|
||||
:RSS_PERMALINK: articles/rlwrapping_sbcl.html
|
||||
:PUBDATE: <2013-10-06 13:02>
|
||||
:END:
|
||||
A useful addition to SBCL. [[file:articles/rlwrapping_sbcl.org][Read]]
|
||||
|
||||
* C-d to close eshell :eshell:emacs:elisp:config:
|
||||
:PROPERTIES:
|
||||
:PUBDATE: <2013-08-17 2:25>
|
||||
:RSS_PERMALINK: articles/c-d_to_close_eshell.html
|
||||
:END:
|
||||
A little trick to improve your eshell experience. [[file:articles/c-d_to_close_eshell.org][Read]]
|
||||
|
||||
* Some quick git diff tips :org:lisp:hy:elisp:scheme:config:
|
||||
:PROPERTIES:
|
||||
:RSS_PERMALINK: articles/some_quick_git_diff_tips.html
|
||||
:PUBDATE: <2013-08-11 0:54>
|
||||
:END:
|
||||
Making git see more diff. [[file:articles/some_quick_git_diff_tips.org][Read]]
|
30
index.org
30
index.org
|
@ -3,18 +3,29 @@
|
|||
#+STARTUP: showall
|
||||
#+OPTIONS: toc:nil H:1
|
||||
|
||||
* My coding projects
|
||||
* Blog
|
||||
|
||||
Some thoughts I may have had, and was foolish enough to write down.
|
||||
|
||||
#+BEGIN_SRC emacs-lisp :exports results :results value raw
|
||||
(apply
|
||||
#'concat
|
||||
(with-current-buffer (find-file-noselect "blog.org")
|
||||
(org-map-entries
|
||||
(lambda ()
|
||||
(format "* [[file:%s][%s]] %s\n"
|
||||
(org-entry-get (point) "RSS_PERMALINK")
|
||||
(nth 4 (org-heading-components))
|
||||
(org-entry-get (point) "PUBDATE"))))))
|
||||
#+END_SRC
|
||||
|
||||
* Projects
|
||||
|
||||
These are the projects I keep myself busy with in my free time. Some
|
||||
may be old, all might be badly written and one or two might be
|
||||
useful. They are not sorted in order of importance, popularity or
|
||||
size.
|
||||
|
||||
** [[file:projects/baps1.org][baps1]] :C:
|
||||
|
||||
A simple PS1 formatting utility. Doesn't do a lot yet, but does it a
|
||||
hell of a lot faster than the PHP script it replaced. (I hope)
|
||||
|
||||
** [[file:projects/cdispass.org][cdispass]] :Conkeror:JavaScript:
|
||||
|
||||
A [[http://conkeror.org][Conkeror]] interface for [[http://dispass.babab.nl][DisPass]]. Input your passphrases directly
|
||||
|
@ -56,6 +67,11 @@
|
|||
one, he doesn't actually look anything like this theme, for example:
|
||||
He doesn't have so much text all over him.
|
||||
|
||||
** [[file:projects/baps1.org][baps1]] :C:
|
||||
|
||||
A simple PS1 formatting utility. Doesn't do a lot yet, but does it a
|
||||
hell of a lot faster than the PHP script it replaced. (I hope)
|
||||
|
||||
** more
|
||||
|
||||
I have [[http://code.ryuslash.org][other projects]] around here too. Not sure if you would be
|
||||
|
@ -92,5 +108,3 @@
|
|||
* Other forms of communication
|
||||
|
||||
- Read a little [[file:about.org][about]] me.
|
||||
|
||||
- Read my [[http://blog.ryuslash.org/][blog]], it has boring things..
|
||||
|
|
33
org.css
33
org.css
|
@ -8,14 +8,41 @@ a:hover {
|
|||
|
||||
body {
|
||||
border: 0;
|
||||
font-family: sans-serif;
|
||||
font-family: "PT Sans", sans-serif;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
line-height: 160%;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 25px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 23px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 21px;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 19px;
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 17px;
|
||||
}
|
||||
|
||||
h6 {
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
pre {
|
||||
line-height: 100%;
|
||||
font-family: "PT Mono", monospace;
|
||||
margin: 1.2em -8pt;
|
||||
}
|
||||
|
||||
.tag {
|
||||
|
@ -29,6 +56,10 @@ pre {
|
|||
padding: 2px 4px;
|
||||
}
|
||||
|
||||
.timestamp {
|
||||
float: right;
|
||||
}
|
||||
|
||||
#content,
|
||||
#org-div-home-and-up,
|
||||
#postamble {
|
||||
|
|
15
project.el
15
project.el
|
@ -1,4 +1,5 @@
|
|||
(require 'org-publish)
|
||||
(require 'ox-rss)
|
||||
;; (require 'ox-html)
|
||||
|
||||
;; (defun org-html-template (contents info)
|
||||
|
@ -132,6 +133,9 @@
|
|||
(setq org-html-head-include-scripts nil
|
||||
org-html-validation-link nil
|
||||
org-publish-use-timestamps-flag nil
|
||||
org-html-htmlize-output-type 'css
|
||||
org-rss-extension "rss"
|
||||
org-confirm-babel-evaluate nil
|
||||
org-publish-project-alist
|
||||
'(("oni-files"
|
||||
:base-directory "./"
|
||||
|
@ -148,5 +152,12 @@
|
|||
:section-numbers nil
|
||||
:table-of-contents 1
|
||||
:html-doctype "<!DOCTYPE html>"
|
||||
:html-head "<link href=\"//ryuslash.org/org.css\" type=\"text/css\" rel=\"stylesheet\" />"
|
||||
:html-link-home "http://ryuslash.org")))
|
||||
:html-head "<link href=\"https://ryuslash.org/org.css\" type=\"text/css\" rel=\"stylesheet\" />"
|
||||
:html-link-home "https://ryuslash.org")
|
||||
("rss"
|
||||
:base-directory "./"
|
||||
:publishing-directory "_publish/"
|
||||
:base-extension ""
|
||||
:publishing-function org-rss-publish-to-rss
|
||||
:include ("blog.org")
|
||||
:html-link-home "https://ryuslash.org")))
|
||||
|
|
Loading…
Reference in a new issue