4 ms·
I think I understand the advantage of composability. What I was saying is that it is not unique to Vim. Vim uses "command; motion-or-textobject" in normal mode
by omaranto 10y ago
I think I understand the advantage of composability. What I was saying is that it is not unique to Vim. Vim uses "command; motion-or-textobject" in normal mode where most editors use "select-what-you-want; command" (which is what Vim does in visual mode). If your editor has a good stock of selection commands (some have select word, line, paragraph, parenthesized expression, etc. -- I don't use atom but Emacs and Textadept have all those and more, like select LaTeX environment) and a good stock of commands that operate on the selection (like delete, cut, wrap in parenthesis, uppercase, etc.), I'd say you have composable editing.
I don't think the link you have addresses my point at all.
- alwillis 10y agoIt seems pretty clear to me that it does indeed address your point. That you can build up sophisticated actions just by knowing the primitives and text objects is the point, right? And not having to memorize different commands and different selections. From the article: But now let’s look at delete commands. Let’s say you want to delete a word, delete to the end of the line, delete to the end of the file, or delete to the end of a paragraph. Emacs only has two of these functions: kill-word and kill-line. Atom has the same two, more or less: deleteToEndOfWord() and deleteLine(). Vim, though, is different. Vim only has one command: d, which is “delete.” What does it delete? You name it, literally. The d command gets combined together with those commands for movement: dw deletes to the next word, d$ to the end of the line, dG to the end of the file, and d} to the end of the paragraph. This is where Vim’s composability leads to its power. Emacs and Atom don’t have commands for deleting to the end of a file or a paragraph — even when they have commands to move to those places. But in Vim, if you can move to a location, you can delete to that location. And composability is about more than just power, it’s also about learnability and consistency. The command for copying text in Vim is y. Do you know how to copy to the end of the line/file/paragraph? Of course you do: It’s y$, yG, and y} respectively. The command for increasing the indent is >, so you instantly know >$, >G, and >}. Convert to lowercase is gu, so… sure enough: gu$, guG, gu}.
- omaranto 10y agoWell, maybe the author of that post just hasn't noticed the similarity between: Vim normal mode grammar: command motion-or-textobject Other editor's grammar: select-a-region command (Also, Vim visual mode grammar: select-a-region command) Emacs has lots of command that can select a region. They tend to be called mark-something. There are commands for selecting words, sentences, paragraphs, function definitions, S-expressions (the name comes from Lisp but they're defined to be something useful in every language, usually something like "any delimited construct in the language --strings, blocks, array literals, etc."). Once you select something you can apply many actions to it: you can delete it, uppercase it, rot13 it, sort the lines in it, wrap it in parenthesis, etc. Maybe what tripped the author up is that additionally Emacs has other commands like kill-word, kill-line that are shortcuts for common combinations of a motion and a command. The author is correct in saying that these convenience commands are not composable, but they're nice shortcuts to have (and by the way, contrary to what the author says Emacs does have a kill-paragraph command). So you to delete a word you can do: Vim: dw Emacs composable style: M-@ C-D (that is, mark-word delete- region[^1]) Emacs shortcut: M-D (kill-word) Atom composable style: Option-Shift-f backspace Atom shortcut: Option-d (I got the Atom ones by Googling, I don't if they are right, but if they're not, I'm pretty sure correct ones exist: Atom has both a composable way and a shortcut.) Vim propaganda should stop saying other editors lack composable commands. Even notepad.exe lets me use any of its paltry motion commands[^2] available to select something and then use a generic delete command to delete whatever I selected. "Composability" is the default mode of operation of most text editors. Vim propaganda should focus instead on the very real advantages than Vim's command model has. For example: - dot repeats the whole command/motion pair. This is fabulous! - Vim has counts so you can delete 9 words just as easily as 3 words. (Emacs also has them, but lots of editors don't, and they're superhandy.) - Vim has lots of little variations of the motions and textobjects so you can pick exactly what you need, other editors tend to have fewer. For example, for words, Vim has w, e, aw, iw (and probably others I'm forgetting) which are related but a little bit different. (Also, personally I think Vim bloggers should recognize that those non-composable commands like kill-word are nice optional shortcuts, that are actually a tiny advantage other editors have over Vim. Try playing VimGolf in Emacs --using the nice vimgolf Emacs package, because of course Emacs has a package for that-- and you'll see what I mean.) ---- [^1] OK, techinically C-D is delete-forward-char in the default keybindings, but when a region is active it acts as delete-region. [^2] It's limited to character, word and line, I think. But people forget even the lowly notepad.exe has word motions (all text widgets on Windows do).