Emacs is Dead (2010)
tkf.github.io
tkf.github.io
I think the philosophy of Emacs, if it has one, is "maximum extensibility". Whether that be with elisp or external processes matters not.
EDIT: forgot the word "conventional" :)
that's not wisdom; that's a sarcastic quip by the vim side of the emacs-vim/vim-emacs religious war.
http://en.wikipedia.org/wiki/Emacs#Emacs_pinky
As a novice Vim user who has at times wanted to try out Emacs, this has always been an irritation. I think it's telling that one of the suggested work-arounds according that article is:
> Emacs' built-in "Viper-mode" that allows use of the vi key layout for basic text editing and the Emacs scheme for more advanced features.
Emacs, especially with paredit, is fairly well optimised for editing s-expressions and the like. Vim is very well optimised for line-based editing, but I don't get on with its buffer management at all.
> underline an arbitrary line of text with '=' characters. In vim that's 11 keypresses across 3 operations
Sounds like a vimgolf challenge to me. Here's my entry:YpVr=
For those that are interested, I would recommend "Practical Vim", and it includes many examples (including the above one) which really accelerate the learning process:
http://pragprog.com/book/dnvim/practical-vim
There are definitely cheaper alternatives (including free ones), but this book really laid the concepts out very clearly for me.
I use Emacs to edit text, and I have limbs I'd rather lose than have to perform that task with Vim's airbag in my face.
Vim and Emacs both use key combinations... Vim's just require fewer fingers at once. You type Vim key combinations as you would type words in a language with a latin alphabet.
The key however is understanding that if you are insertion mode, then key sequences start with the escape key, or, insertion commands are completed with the escape key. There is no "context switching". No more-so then having to press ctrl along with the rest of your key sequence in Emacs is "context switching".
So the next question is: does the philosophy the author speaks of matches with the one of GPL, or rather, the one FSF and Stallman have in mind? Actually, I think these philosophies are different. If I remember correctly, in Emacs mailing list sometime ago, Stallman rejected idea of adding function to gcc to dump parse tree (or something similar) to use gcc from other software (I can't find the link right now). This was because non-free software could use gcc via CLI and "steal" the data from free software. Now, although it is the other way around, Emacs can use non-free external program. It matches with the philosophy by Matsuyama but I doubt that Stallman says it is the philosophy of Emacs.
I would say this philosophy is for author of Emacs Lisp program (though this was not what Matsuyama was talking about). You have many options. You could choose "maximum extensibility" but actually it is not doable due to GPL. You can follow FSF's philosophy (I am not sure what is it, but I believe there is). Somewhere in between, there is philosophy proposed by Matsuyama and it reflects current situation of Emacs very well, and I like it.
If that's the conventional wisdom, it is not particularly wise.
Emacs is much more like a Unix shell than any operating system I have ever heard of. Specifically, both Emacs and the shell fork and exec other programs a lot; a significant fraction of those programs communicate with Emacs or the shell via a PTY or a Unix pipe. In contrast, Eclipse does very little of those two things, according to the OP.
[1] https://lists.gnu.org/archive/html/guile-user/2013-05/msg000...
[2] https://www.google-melange.com/gsoc/proposal/review/google/g...
Python in Vim has slowly become the go-to choice to talk to an external program from Vim, because VimScript is simply that bad.
I know little, however, about how hard ELisp makes it to interface with an external program. The examples he gives (a JS interpreter in ELisp, and Semantic) lead me to believe that the authors wrote all that in ELisp because it was easier than to play with an external program. Am I wrong?
Will Guile ease the task of interfacing with an external program?
I suspect people who write packages entirely in elisp simply like elisp. And why not? The language itself is mostly OK to use, even if it doesn't always conform to modern standards.
Writing elisp is not hard. What's hard is integrating all the modes, keymaps and quirky behavior of coupling all these smalls bits of code together. This is what makes emacs hard. Emacs, the "core editor" itself, is incredibly small. Way smaller than vim (build it by hand if you don't believe it). Emacs as the editor that you use every day is almost pure extensions.
There's a /whole lot/ of global state in an editor. This is not going to change with Python, Guile or any other language. Users that complain about ELisp, most of the time actually never tried to write ELisp at all (they just glue some elisp around in .emacsrc). That's fine, but they don't realize what's going on under the hood. The C/C++ mode in emacs is completely different to the "stupid" syntax highlighting in Vim or most other editors.
I normally recommend switching to another editor if after several years you still don't appreciate the difference. IMHO emacs, as it is, is a great editor. ELisp is part of the success (though guile would be a step forward).
The claim is that the weak lisp interpreter encourages work to be done in other processes (reference to the awesome Tramp), thus making the feature available to other editors (Vim, TextMate), and the shell. The author compares this philosophy to Eclipse's where everything is a Java plugin written just for Eclipse.
The claim that Emacs is dead rises from the shift in the latest versions to large included language processing plugins (JS2-Mode and Semantic) which provide rich language processing capabilities but are implemented in pure Emacs Lisp.
The author closes off by stating,
"The reason why Emacs platform is good is that it cooperates with OS, not because it is good by itself".
In other words, the Unix philosophy.It does fill a need or 3, I must admit, and I hate to be negative, but if that is the best example you can come up with of the positive effects of putting Emacs functionality in external programs, that makes me lean towards the conclusion that it is a bad idea to put Emacs functionality in external programs!
mu4e: http://www.djcbsoftware.nl/code/mu/mu4e.html
not much: http://notmuchmail.org/
EDBI: https://github.com/kiwanami/emacs-edbi
ropemacs: http://rope.sourceforge.net/ropemacs.html
RSense: http://cx4a.org/software/rsense/index.html
GCCSense: http://cx4a.org/software/gccsense/index.html
emacs-ipython-notebook: http://tkf.github.io/emacs-ipython-notebook
emacs-jedi: http://tkf.github.io/emacs-jedi
request.el: http://tkf.github.io/emacs-request/
Well, the last three is my projects so you could exclude that :)
Also, we could add version conrolling interfaces such as magit and VC (relying on git/svn/hg/...) and advanced interpreter such as SLIME/nrepl.el/geiser.
Ah, and don't forget dired!
well, emacs claims to be cross-platform, what happens when you are on a non-unix like system ?
Why not, e.g. Racket? If you're going to go the trouble, _get it right_.
Besides, I know that among users of fringe languages like us (you too are, I presume) this is a bit of a taboo question... but who uses Racket so much as for it to make a difference here?
Back in 2002, the better choice was Common Lisp. One of CLISP's authors even made it work with Emacs over the course of a week-end [1].
There's never going to be the perfect fit for an embedded extension language. Hey, wasn't that what Lua wanted to be, and Tcl before it? Guile certainly isn't the easiest fit, but it's the only one that will get accepted.
At least, if they slowly change the actual extension language away from ELisp, all extensions that rely on external programs will survive better.
[1]: http://lists.gnu.org/archive/html/emacs-devel/2002-08/msg000...
http://stackoverflow.com/questions/1663627/guile-and-emacs
I still use emacs a lot but these days I use IntelliJ for Java and Sublime Text for a lot of my other editing.
I only started using emacs in emacs 22, so I haven't had to keep things working for 5-10 major releases like I'm sure some people have, but my init.el and .emacs.d have been pretty static the whole time.
(I also edit python in emacs regularly, not sure what's changed in the last N years)
I am not sure what you mean by "every tweak" but fwiw:
$ ls ~/.vim/bundle | wc -l
45
$ wc -l ~/.vimrc
401 /home/rahul/.vimrc
$ vim --startuptime vim.log
$ ruby -ne 'print if 2..7 or $. == 151' vim.log
times in msec
clock self+sourced self: sourced script
clock elapsed: other lines
000.810 000.810: --- VIM STARTING ---
217.536 000.003: --- VIM STARTED ---
> you get somethin much slower than eclipse in a week.In a week? 6 years and counting.
What are you doing with emacs.d that requires a burdensome level of effort to keep it "up to date"? What does that even mean? I've been using Emacs almost 10 years, and I very infrequently modify my emacs.d, and I don't know many people who do. Sure, I could spend a lot of time tweaking it and messing around with it, but it'd be an entirely self inflicted thing, and not the fault of Emacs. I could spend all day fiddling with .vimrc, or the Visual Studio settings, too.
I also don't understand the what you mean by "the level of effort required for each project" in the context of Emacs. What "project"s are you talking about?
> I'm a firm believer in open source software and open source technologies. I can guarantee you that Light Table will be built on top of the technologies that are freely available to us today. As such, I believe it only fair that the core of Light Table be open sourced once it is launched. At some level, this is an experiment in how open source and business can mix - it will be educational for us all.
Source: http://www.kickstarter.com/projects/ibdknox/light-table
As a vim user, emacs lisp is bad. A proper lisp would be more worthwhile.
To be perfectly honest, I think so many vim users (including myself) don't know vimscript [in depth] because they can easily find everything they need already.
But please correct me if I'm wrong -- this is just my impression from reading HN etc.
If this is what a dead project looks like, the living really ought to envy the dead.
Now, that doesn't outweight the good, and I still use it, and probably will until I die. But I think if you want to be honest about things you need to think seriously about what emacs would look like if you "started from scratch" with the same philosophy but with modern goals. Probably not like Eclipse for sure, nor even Sublime. But it probably wouldn't look much like GNU Emacs either...
Isn't the point of the article that emacs shouldn't do it but call upon something which does? I use gocode for go completion in vim. gocode has support for a number of editors and there are instructions to make it work with editors which aren't supported out of the box. That is what the article advocates(and I agree) - use emacs/vimscript for glue code, not for implementing interpreters or completers.
Again, to be clear: I use emacs every hour of every day. I used it to type this post. I'm not giving it up any time soon. But it's important not to delude ourselves about its shortcomings.
I won't go through the post line by line; I think this paragraph sufficiently establishes that the author is ignorant.
> The virtue of Unix convention of making a big thing by combining small things is inherited in Emacs. This virtue itself is the reason why I am using Emacs. However, this may be becoming history. What is the meaning of the world without the virtue or philosophy, but with only benefit? I’d be disappointed if Emacs become so.
The precursors of Emacs were written at the AI lab at MIT, which at the time ran the ITS operating system. ITS had values that were pretty much orthogonal to Unix, which makes the statement especially ignorant. GNU Emacs's first public release in the 80s had to be ported to Unix to make it work.
Emacs is famous for being very extensible and can be used as a web browser, newsreader, spreadsheet, etc. You can do almost anything and never leave the Emacs environment. This is the opposite of combining many small programs to create something big.
Emacs also has a clear and logical design, and allows you redefine almost anything you don't like. Unix is famous for having a horrendous, incoherent design that is so poor that many of its commands are digestive noises (nroff, fsck, awk, grep). Its other commands are cryptically named and for years and years the documentation was nonexistent or terrible.
That said, Emacs has a very rich Elisp ecosystem that's not going away anytime soon. By focusing on extensibility from the very beginning, Emacs has done many things right (it's just an Elisp interpreter with some editor functions bundled in); in comparison, Vim is a dumb-text editor focusing on keybindings, with extensibility as an afterthought. I don't think it is possible to replace Emacs today, primarily because writing a truly extensible text editor is a huge project with many boring parts, and there is no money to be made as a result. Elisp does have its drawbacks, and the Emacs community is suffering because of "philosophical" decisions like bzr (a dead project), instead of focusing on technical merit. So, the project will die a slow painful death, but I don't think that's happening anytime soon.
The takeaway is that Elisp needs to learn to interface with other languages better. There is a dead Elisp <-> Ruby bridge [5], but clearly not enough has been done about it.
[1]: https://github.com/auto-complete/auto-complete
[2]: https://github.com/Valloric/YouCompleteMe/blob/master/autolo...
[3]: https://github.com/Valloric/YouCompleteMe/blob/master/cpp/yc...
[4]: https://github.com/brianjcj/auto-complete-clang/blob/master/...
[1]: https://github.com/Golevka/emacs-clang-complete-async/blob/m...
[1]: http://lists.gnu.org/archive/html/emacs-devel/2012-06/msg005...
[3]: http://vimdoc.sourceforge.net/htmldoc/eval.html#libcall%28%2...
There are problems with Emacs. First, Elisp is kind of an outdated and dirty Lisp dialect. It's kind of neat for extending Emacs, but it's also a poor Lisp dialect by modern standards. I would love an alternative to Emacs built on top of Scheme, with its awesome continuations support, or on top of Clojure.
The other problem I'm seeing is that Emacs, as awesome as it may be, is also outdated in what it can do. Smalltalk set a high bar long ago in what IDEs can do and Smalltalk IDEs still haven't been surpassed in terms of experimental development that people tend to do in REPLs nowadays. Having something like a Smalltalk IDE, that uses realtime feedback and visuals to aid in learning, discovery or debugging, with the same philosophy of Emacs (e.g. open-source, totally customizable, turtles all the way down, transcending languages or operating-systems, etc...) would be priceless.
This is why I have high hopes for Light Table [1], hopefully it will bear fruits as planned by its author.
This is exactly why @kiwanami developed EPC (a general RPC protocol/libraries for Emacs) and why I wrote Python binding: https://github.com/kiwanami/emacs-epc
He was also inspired by the article.
It's an elegant and very powerful extension of the built-in completion that works particularly well on reallyStupidlyLongMethodNames in programming languages - especially handy in conjunction with tags and cscope if you're jumping around a large codebase. Dunno if it plays well with Evil mode though.
My emacs at times can't keep up with my typing. But I love what it does for me. The lack of threading is a huge headache for elisp developers - they have to resort to manual cooperative-task-slicing hacks.
Try to set debugger on (M-x toggle-debug-on-quit) and when emacs stops responding press C-g to get to know what was emacs doing.
It's called emacsclient; I'm currently using it to send links to org-mode from Firefox.
I defer to the author's experience when he says that emacs is a poor runtime for simultaneous editing + compute,
I can back this up. I love emacs to death, but the singlethreadedness is such a pain. Especially if you are on a platform that's a little slow (say, Cygwin), and waiting for freaking file I/O or just a blocking external process (when you're trying to run two or three or more).
I am having trouble imagining how you end up in a situation where Emacs is waiting on a blocking external process while trying to run other external processes.
There two kinds of external processes inferior to Emacs: those that communicate with Emacs synchronously and those that communicate asynchronously.
The inferior shell process in a shell-mode buffer is probably the most familiar example of the latter. (Any mode derived from comint mode is an example.) Your Emacs is never waiting for an asynchronously-communicating external process, is it?
The prototypical example of a process that communicates with Emacs synchronously is when Dired forks and execs the ls command to get a directory listing. I never find myself waiting for this ls command. The only external process I notice myself ever waiting for is the movemail program distributed with Emacs -- and that never took more than around 10 seconds (and usually a lot less) even on early-1990-vintage computers like a 386. So I am having trouble imagining what your "when you're trying to run two or three or more [external processes]" refers to.
Parenthetically, I could eliminate the delays caused by movemail by rewriting vm-get-new-mail to use async io when it is finished like M-x man uses. Adding threads to Emacs would not be necessary.
But then I have very little experience of or knowledge Windows. Is this waiting you refer to a Windows-only thing?
The OP maintains that it is probably a good thing that Emacs is not multi-threaded, and after 20 years of using Emacs and hacking on Emacs I tend to agree -- but my experience is almost all on Unix-like systems.
I have to say though, external module(s) may be the way to go about it.
For the curious :
I think the translator didn't get it right when he/she called Steve Yegge "Eccentric." Google translate makes no mention of this, while Bing describes js2-mode as "unusual, which makes more sense:
"js2-mode new JavaScript for measure mode made by Developer Steve Yegge is somewhat unusual, as implemented in Emacs Lisp"
Ah, I just notice "unique" fits the context very well. Perhaps I will change that later.
[1] http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom...
Take a look where sublime, or IntelliJ is heading to. IntelliJ, for example, has a toolkit for quickly defining support for languages: https://github.com/JetBrains/Grammar-Kit
Go have fun.
bitwize makes another good point: this is less the "philosophy of Emacs", and more the philosophy of Unix (or perhaps, more specifically, Acme). It's ironic that some of the best parts of Emacs are the ones that look less like a Lisp Machine and more like a Unix pipeline, but there it is.