Hacker News new | past | comments | ask | show | jobs | submit login
Towards a Vim-like Emacs (nathantypanski.com)
84 points by pmoriarty on Nov 10, 2014 | hide | past | favorite | 64 comments

From the article:

"Any time you are pressing two keys at once, with the same hand, hundreds of times per day, you are setting yourself up for repetitive stress injury"

People: learn to type. One hand for the modifier key, and the other hand for the other key. This is why there are two sets of modifier keys. This is typing 101

If you're on OS X, and you want to force yourself to learn to do this, there's a program called Karabiner[1] which lets you remap keys in advanced ways using an XML config. I have a config snippet[2] that I got from somewhere (sadly, I don't remember where) that remaps incorrect combinations of Shift and letters to be dead.

You can do something similar with AutoHotKey on Windows, though I don't have a config for it.

[1] https://pqrs.org/osx/karabiner/

[2] http://pastie.org/9708667

> I have a config snippet[2] that I got from somewhere (sadly, I don't remember where) that remaps incorrect combinations of Shift and letters to be dead.

Very likely from Steve Losh (I did this too, and it helped a lot): http://stevelosh.com/blog/2012/10/a-modern-space-cadet/#shif....

I use Karabiner and Seil which are great, but unless you are using an Apple keyboard with a numeric keyboard, you don't get a right-control key, which will matter for many of the most used commands for emacs.

For me, when recently trying to remap the left-shift key I found out that it was not a problem for the supposed best practice of using it for C-g/x/c etc, but that instead I had been using a worse practice for typing ":" or """ when the wrong characters turned up al over the place.

Anyway, I suppose the left option key would be pretty good to map to control for emacs, since it's rarely more needed than the right option key.

True, the laptop and compact apple keyboard lack a right control. I've found that I use the right option key infrequently and use Karabiner to remap the option to control. It definitely helps with the RSI, and makes switching to someone else's machine frustrating :)

Why would you remap the left option key to ctrl when you already have two left ctrl keys (caps and original ctrl) ? I do set the right option key to ctrl but only in iterm and emacs.

Because I'm bad at writing! (I meant right-option)

You have no idea what I am doing with the esc, capslock, and control keys on the left side of my keyboard, but none of them are default.

On the right however I'm just trying to make sure I get a forward delete somewhere. In fact using Karabiner or Seil, the right shift is now shift if pressed as a modifier, but forward delete if pressed alone.

Just use Karabiner to configure Return to do double duty as Right Control.

How prevalent is repetitive stress injury among musicians, especially pianists, harpsichordists, etc..? They regularly press two or more keys at once all day long.

Actually, extremely prevalent. Musicians have a very long and famous history with carpal tunnel and other forms of RSI. Among the most problematic instruments are piano, clarinet, flute, violin, and guitar. Piano is particularly infamous: you might look up Leon Fleisher.

Yes. Keyboards with thumb clusters, e.g. one made by Maltron or Kinesis, make key chords as natural as pressing a single key on a regular keyboard.

There's also the King's Assembly.[1]

[1] - https://www.kickstarter.com/projects/70308014/kings-assembly...


Looking forward to reading some reviews once they are available. They look very promising.

Using Sharpkeys (http://www.randyrants.com/2011/12/sharpkeys_35.html) I remap Alt to be Ctrl, the Windows key to be Alt, and Ctrl to be the Windows key. Especially on laptop keyboards, the normal Alt keys are easily accessible to thumbs, and this eliminates the awkward hand curling caused by pressing the normal Ctrl with your pinky without needing a special keyboard. I also swap backspace and caps lock.

People: don't learn to type.

Seriously, I know this won't appeal to everyone, but there is a solution to worrying about key combos causing RSI. Just don't touch type. Do embarrassing hunt-and-peck typing. I'm a professional programmer and long-time emacs user and I can't touch type for shit and it doesn't affect my career and my hands and wrists have been completely free of any trouble whatsoever (to current age of 36). If hunt-and-peck leaves you typing slower than you can design software solutions in your head then find a more challenging job.

Except that even if I have to type 10 characters for code, I want it to complete in 2 seconds, not 20 seconds, to continue my train of thoughts.

Ugh. I met your type. Single-letter variable names. No documentation. Because typing more would consume too much time. No thank you.

Edit: Not you, particularly. But I have met bad typists, and that is how many of them behaved. Don't be that guy.

What bullshit.

I can't touch type but my code reads:

  def snmp_command(session, oid, media_servers):
    result = list()
    for host_name in media_servers:
        snmp = SNMP_CMD.format(host=host_name, oid=oid)
        snmp_reply = [x for x in session.cmditer(snmp)]

        if len(snmp_reply) == 0:
            log.warning("No data for EMS Media Server SNMP cmd {0} for host {1}".format(snmp, host_name))

        # add the Media Server host from which we got this reply to the list of snmp reply

    return result

As I said, not you, particularly. But bad typists exist, and they tend to want to type less, which leads to code that is worse than it could be.

That said, where's your docstring? Why are your lines longer than 80 chars? Why is your indent 2 chars instead of 4? What does `oid` mean? http://legacy.python.org/dev/peps/pep-0008/

Touch-typing is more about freeing your mind from the keyboard than been fast. I see my students (who do not touch type at all) struggling with their problem _and_ using a lot of their concentration / "cognitive power" to search for the right letter on the keyboard.

In addition, the life of a programmer is much more than programming. You have to type documentation, you have to type e-mails, etc. I agree that typing speed is not a key for programming "interesting stuffs", but for everything else, touch-typing is an important skill.

Sorry but this is terrible advice. Freeing your eyes and mind from the keyboard is a great advantage, copying a snippet from a piece of paper is a nightmare if you can't properly type (tiring, error-prone, annoying, etc).

I also find touch typists introduce less typos, because they're looking all the time at the screen and mistakes are noticed immediately.

Also as a Unix/terminal/VIM user, touch typing is a must. VIM is not worth it if one isn't able to touch-type, period.

I heard that before and can't agree either. Continuing your thought is also important. That requires you to think about the content of what you write and not how to write. That requires you to let your fingers worry where the keys are.

What if it has an effect on your career and you don't realise it? Sounds way more likely to me.

Fair enough. I was kind of trolling and deserve any downvotes I get. But I was partly serious: I would like, in principle, to learn to touch type; I take my text editor very seriously and have learned the language that it is customized in fairly deeply. But when I start to learn to touch type, I immediately start to get pains in my fingers that I've never felt before, and my instinct is strongly to let sleeping dogs lie here: it is my profession and if I don't currently suffer any hand problems I think I should carry on as-is.

I think this is referring to two keys that require an, albeit small, stretch to reach. If the two keys are right next to each other, that's not going to bother you much more than a single key. What I'm getting at, is that since I've started using key-chord.el [0] in my .emacs my emacs-pinky has basically disappeared. E.g., I press 'h' and 'u' at the same time to save the current buffer. I press 'ji' to move cursor up one line, 'nj' down one line, 'jk' to go left, 'kl' to move right. 'sd' backspace, 'df' delete. I'm keeping my fingers on the home row for most of these. It's been a boon, and I'm still unlocking its potential.

[0] - http://www.emacswiki.org/emacs/key-chord.el

I do it too but the op is right. You can achieve these by mixing use of modifiers on either side of the spacebar, but I never see anyone do it.

My problem is that I did learn to touch type -- back when keyboards didn't have a ctrl or alt keys. Of course, I'm referring to the IBM Selectric keyboards. So my fingers only know to hit the left/right shift keys when needed. Once keyboards grew the ctrl/alt keys, they only came on the left side. So my natural hand movement for something like Ctrl-C is left pinky on the Ctrl key, and an awkward stretch to put the middle finger on C. So annoying that my right pinky or thumb never learned about the right side ctrl/alt keys.

Get eg a Kinesis Advantage, and use your thumbs for the heavy lifting.

I think pinky+index feels more natural for ctrl-c

I think chording is the least of one's worries; the awkward staggering of the IBM-style keyboard and the modifiers designed to be pressed by a curled pinky (especially Shift) are murder on my hands, chords or not. From a strictly ergonomic standpoint, I would choose Emacs on a TEK or Maltron over Vi on a traditional keyboard any day of the week.

I don’t believe I’ve ever used the right Shift key on a keyboard. And I had fairly bad RSI, but completely eliminated my symptoms by improving my posture, remapping my modifier keys, and getting a less stressful job. Yes, what you do with your hands matters, but there are other factors at play that are equally important.

That's why apple keyboards (macbooks, imacs) bother me, they don't have a right ctrl key. (I set the right option key to ctrl in both iterm2 and gui emacs.

Many countries have Alt-Gr keys instead of right Alt.

Did we actually have some decent research confirming this? Computer people talking about RSI often sounds like crossfitters talking about diet...

(Also: sticky modifiers)

I haven't seen any comment discussing it so here is kind of a vital question: Why would I want to do that? I don't need vim to me more configurable. Just a few weeks ago I looked into vim plugins for the third time into my vim history, but again I found it unnecesary. Most plugins don't improve at all what I want to do with vim.

Examples: Prettier status line? Don't need it. Tree view of my project? Don't need it, or I use the shell command called tree. Autocomplete? I started learning the APIs of the tools I use because it makes my writing code better and much, much faster. Therefore I don't need that anymore. Git integration? Why would I want that? ":!git" is fine. The sorround plugin would be an idea, but it's key usage is strange in my eyes.

Not spending this time into individualization and instead using this time to learn more about vim has significantly increased my code generation and allows me more easily to work on other systems with the same efficiency as on my own.

If you have some real arguments for plugins I am really, really curious to learn what they are. But please consider before writing if spending the same time into learning how to solve your problem with vim capabilities would not be the better and faster approach.

As both an Emacs and an IntelliJ IDEA user, I wouldn't mind the lack of autocomplete, but I do mind the lack of features for ... debugging, documentation and quickly jumping at definitions, including those in other people's projects that I import as dependencies. I ended up reading a lot of source-code that way.

Emacs' ability to open REPLs and work with those, with a neat workflow (e.g. you edit text in your file, then press a shortcut to reload the REPL or maybe just send the expression under the cursor, is definitely nice, since it's very interactive).

It's also nice to have good Git integration. I can select any fragment (like a function) and quickly go through its history. I cannot do that easily with ":!git".

Emacs can also do a lot of things related to editing text. For example I use Org Mode for managing my tasks / TODO lists, whereas other people use Trello, or Google Keep, or EverNote or other apps that lock you in and that never do what they are supposed to do. A TODO list is a freaking text file and having the ability to manage that from within my favorite text editor is surely a win and hey, I can also synchronize that in the cloud. Because really - here it isn't Vim vs Emacs anymore, but Emacs versus your browser's TextArea. Get it?

I appreciate your detailed comment. It gives me the chance to see it from an Emacs point of view.

Starting repls is a great thing, I have to admit. I can do that partly by e.g. ':!python -i -c "whatever"' but it's not really integrated.

I also love to do "other" things in text files instead of websites, because text files allow you to do anything with it. Automated tasks, reformatting, compiling to other formats like diagrams, storing in the cloud, or a repo, or simply adding it to an email. I don't see why I need plugins or special modes for it, though. I think that's more an argument for learning text editors in general. No matter if you use vim, emacs, sublime, or maybe atom, in any case you gain a huge advantage over people who can only be efficient inside a huge IDE or their web browsers.

The other things like debugging, documentation generation, etc are in my eyes not tasks for a text editor. I expect to do that in the shell and it works there. Jumping to definitions is possible in Vim btw. Under the hood it integrates with ctags which is a typical tool to index code definitions, I think (or does it only exist for vim?).

The git example, in my eyes, is perfect for what I meant, though. You can't do some things as directly or easily with ":!git" but that also works the other way around. No plugin enables you to do everything you can do with ":!git" and I bet if you write git aliases for what you want to do, you can nearly be as efficient in the things the plugin can do. The added cost is that you need to write them yourself. The added gain is, that you learn to use git better and you can even use the aliases when you are not in vim.

Emacs' Org Mode gets you hooked once you get used to it :-)

For example it can track the time it takes to work on a task and it can easily hide/show descriptions. So it goes beyond simple text editing. Of course, I believe it has been ported to other text editors. At least I know there is a port for Sublime Text, but it's incomplete and much less capable. Vim probably has a port too, but then if you end up customizing Vim, you might want to take a look at Emacs :-)

CTags is a pain, since you have to reindex your files periodically and it doesn't work well for other people's libraries. In IntelliJ IDEA it simply works, you can just click on a class / function definition and if it doesn't have the sources available for that JAR (say it's a library you depend on), it downloads those sources automatically and takes you to the definition. For Emacs it works if you have the right plugin installed - works for Clojure and for Scala / Java for example (though for Scala / Java, we are talking about an Eclipse-based engine running in the background :))

I do get the mentality of Vim users, I've been there and I even use Vim sometimes, but depending on the problems you're working on and the platform you're using, I lean towards the IDE approach nowadays. And Emacs is like a general purpose and non-bloated IDE.

All those ports are incomplete and simple. You cannot use those to publish to HTML, PDF, Latex and TexInfo. You cannot do literate programming in those ports as well. Those are just shallow copies.

You should look at my guides if you want an IDE-like experience: http://tuhdo.github.io/

I find writing code in C/C++ with Emacs much faster than typical IDE: http://tuhdo.github.io/c-ide.html

For writing Lisp code, maybe except the commercial IDEs, none other tool matches.

I'm a Vim user myself and I miss only one thing from Emacs (for now...). They have better infrastructure for running async jobs. Vim is blocking so it can be annoying. One of NeoVim promises is to fix that.

I actually like the emacs key bindings.

I like the emacs key bindings too, but many times I find myself reading the code with one hand used as a stand for my head. Vim's ease of movement across text is what I wish at such times. Of course evil mode come to rescue then, but I understand how so many people come to appreciate Vim's style so much over time. I am finding myself on the same path.

Me too! It's also nice that in OS X the basic set of Emacs bindings are built-in (movement and some manipulation, anyway).

I read the title as "Toward a Vim: like Emacs"; was confused when the article was talking about making Emacs like Vim instead of vice versa :/

If I want a modal editor, Vim is there. I don't want a modal editor.

Breaking Emacs to make it more like Vi is cargo culting.

What if you want an editor with a powerful customization language, sophisticated notetaking (org-mode), directory management (dired), as well as modal editing?

use evil or viper?

And that's what the link is about, isn't it?

In my point of view, Emacs is a great platform with a bad editor interface, Vim is a bad platform with a perfect editing interface. Emacs having amazing extensibility, it makes perfect sense to me to give it a Vim-like interface.

I'm watching NeoVim - they seem to be making solid progress and hope it will give us a scriptable/embeddable vim. Would be great to have 1st-class scripting support for Python or Ruby.

Last I saw they were writing a VimL->Lua transcoder. I think they'll allow scripting in any language, but Lua will be the core language and have the best support.

I donated to NeoVim few months ago and I'll donate again. Really wishing them success.

alt-x viper-mode

You're welcome.

viper-mode is pretty outdated and broken in many ways. You should try evil-mode.[1]

[1] - http://www.emacswiki.org/Evil

I also encourage people to use evil-leader with evil mode and check out other evil plugins, like the * to select all instances of the word under a cursor. Evil is very good, in some ways even better than vim, for example the live updating search and replace is pretty awesome.

It's also programmed in a Lisp dialect by default, which is even more awesome.

Ha! I haven't touched my .emacs since '98 when I left Cal and just keep trucking along w/ viper-mode.

You kids and your fancy new stuff. :)

I'll check it out.

I think that you are missing out on a whole lot more than evil-mode. Of the packages I use and love, most of these were written in the late 2000s or this decade and are still actively being changed. The consensus among those who would know seems to be that emacs development (construed broadly, to include the package ecosystem) is more active than ever.

If you wouldn't mind sharing your dot files, I'd love to take a look and see what's new.

I recently overhauled my Emacs config — it's on github here: https://github.com/stafu/.emacs.d

I'm using a package called use-package, which gets installed via MELPA if it isn't found on first run, then goes and installs and configures a bunch of other packages which will also download if needed. You can see how this works in the init-packages file: https://github.com/stafu/.emacs.d/blob/master/init/init-pack...

Some of my favourite packages are magit (incredible interface to git - http://magit.github.io/), multiple-cursors (nice demo here: http://emacsrocks.com/e13.html), expand-region (another nice demo: http://emacsrocks.com/e09.html), and projectile (https://github.com/bbatsov/projectile).

If you want to see what's new, check my guides: http://tuhdo.github.io/

For example, you should take a look at Projectile and Helm Projectile: http://tuhdo.github.io/helm-projectile.html

Prelude (https://github.com/bbatsov/prelude) has a pretty nice set of basic dotfiles. I find that Emacs with Prelude is much more fun to use than vanilla Emacs.

What I don't get when vim|emacs user wants emacs|vim to act like vim|emacs. Why try to make one act like the other? Square peg, round hole.

I wrote a post about the reasons why I switched (~10 years of vi, now ~5 years of emacs) here: http://evan-tech.livejournal.com/261214.html

I also use evil-mode.

I like editing in vim, but as I'm increasingly doing clojure(script) / racket I'm interested in using emacs for better integration.

I can tell you about emacs users: they like everything about emacs but their wrists hurting (IOW elisp is the perfect extension language created by our god rms and vimscript is garbage)

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact