Xah Emacs Blog Archive 2011-10
Emacs Bug: “isearch-forward” Doesn't Respect New Value of “case-fold-search” When Repeating Last Seearch
added to Emacs Misc Bugs.
Several updates:
Updated and added a example of “read-from-minibuffer” at ELisp: How to Write a Command.
Major rewrite: ELisp: Syntax Color Source Code in HTML.
Space-cadet Keyboard and Lisp Machine Keyboards
Updated. ELisp: google-earth Command.
Emacs Lisp: Loop Thru a List
Learned 2 elisp functions: {dolist
, number-sequence
}.
dolist
lets you loop over a list with a variable. Here's sample usage:
(dolist (x '(1 2 3)) (insert (number-to-string x))) ; inserts "123"
number-sequence
just generates a list of numbers:
(number-sequence 3 8) ; ⇒ (3 4 5 6 7 8)
Both are parts of emacs 23, but they are implemented as lisp macros. (Call describe-function
to see their doc and source code.)
Normally, you can loop with a while
, but the dolist
syntax is leaner.
I learned them from Jon Snader (jcs) blog. See:
- Multiplication Table In Emacs Lisp By Jon Snader. At http://irreal.org/blog/?p=310#comment-984
Jon is a expert in Common Lisp, Scheme Lisp, and C. He often give useful tips about emacs. Very well written.
Thanks to Jon Snader (aka jcs)'s solution on last week's problem and some discussion, now updated: ELisp: Replace Digits by Subscript.
Emacs Lisp, Perl, Python: Building a Multiplication Table
So, i was reading Jon Snader (aka jcs)'s blog At irreal.org, which lead me to watch a video of so-called VimGolf, but using emacs:
- VimGolf in Emacs e003: Multiplication Table By Tim Visher. At http://vimeo.com/26269615
The task is to generate a multiplication table like this:
1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100
I thought this is interesting.
For this particular problem, i thought the most simple and practical way is just to use a programing language to spit it out. So i quickly wrote this:
(let (x i ) (setq x 1 ) (while (< x 10) (setq i 1 ) (while (< i 10) (insert (format "%2d " (* x i))) (setq i (1+ i) ) ) (insert "\n") (setq x (1+ x) ) ) )
then Emacs: Evaluate Elisp Code
the output is this:
1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81
Lisp is a bit verbose for this kinda thing due to the nested syntax. But you can write it in Python, Ruby, or any dynamic languages quickly, and press a button to have emacs call it and insert the result.
here's a Python version:
for x in range(1,10): for i in range(1,10): print "%(n)2d" % {"n":x*i}, print "\n",
You can save this in a file, for example temp.py
. Then
type Ctrl+u Alt+| python temp.py
, then it'll insert the output in your cursor position.
(The Alt+| is the hotkey for “shell-command-on-region”.
The Ctrl+u is “universal-argument”. When the command “shell-command-on-region” gets a empty argument, it'll insert output in buffer. Normally, it places output in the
Messages Buffer
.)
Here's a Perl version:
for $x (1..9) { for $i (1..9) { printf "%3d", $x*$i, " "; } print "\n"; }
Emacs Lisp Exercise of the Day: extract-url
Here's a fun exercise: write a command “extract-url” that will extract all URL in a text selection and put them in a buffer.
For example, suppose you have this text:
<div>1, <a href="../cats.html">cats</a>, <a href="http://en.wikipedia.org/wiki/Idiom">Idiom</a>, <a class="big" href="house.html">house</a></div>
After calling the command, you'll get in a separate buffer this text, one URL per line:
../cats http://en.wikipedia.org/wiki/Idiom house.html
I'll post a solution tomorrow.
Solution at: Emacs: HTML, Extract URL 🚀.
ELisp: replace-digits-by-subscript Command
Famous Emacser, Steve Yegge, wrote a rant on Google that's circulating wildly now. Steve Yegge's Google Platforms Rant.
Richard Stallman on Steve Jobs's Death
GNU Emacs dev, Richard Stallman, Personality Cult
got a email from GNU emacs bug people about a bug being fixed.
the bug was filed 2 years ago, and was fixed 1 year ago. See: bug#4408.
i've filed perhaps 40 in the past. Perhaps 10 are taken and fixed.
in general, got no thanks, no appreciation. This isn't just me. I've been involved with GNU Emacs dev (casually) for 5 years now. I've seen and read enough to know. Many developers who contributed far more to emacs, with code and packages, are treated like that. Under communism, of the FSF branch, you are just a node for the good of all. The people who got thanked, perhaps the only person, is Richard Stallman. Nobody else. His communism ideology made it that way. He's now a Cult of personality.
am pretty tired Richard Stallman and his leadership.
am not likely to send any bug reports or anything anymore.
- A Record of Frustration in IT Industry; Disappearing FSF URLs, 2006
- “Free” Software Morality, Richard Stallman, Paperwork Bureaucracy
- GNU Emacs Development Inefficiency (2010)
- Emacs Dev Inefficiency and Emacs Web 2.0? (2010)
- Emacs Does Not Support Viewing Images Files In Windows
- Richard Stallman's Abuse of the Word “Freedom”
Anonymous wrote to ask how to write a emacs command to show the decimal value of a hexadecimal string under cursor in source code. Here's answer:
ELisp: a Function That Works on String or Region.
Emacs Lisp's “if” function grammar.
Emacs Lisp's “if” function has a annoying grammar.
One would expect it to take 3 arguments, no more and no less, like this:
(if ‹test› ‹expression for true› ‹expression for false› )
But it's actually takes many more args. From the 3rd args onward are all expressions for false. Like this:
(if ‹test› ‹expression for true› ‹expression for false› ‹expression for false 2› ‹expression for false 3› … )
Here's a test code you can check:
(if nil (message "false") (message "true") (message "so true") (message "yes really") )
then Emacs: Evaluate Elisp Code
Is Common Lisp and Scheme Lisp the same way?
I think i'd prefer the simpler, logical, form: (if test true false)
.
Common Lisp is the same way. Scheme Lisp uses the logical form. Source www.r6rs.org. (thanks to [Andrew Hyatt https://plus.google.com/101505495157778834572/about].)