Neovim's Next Feature Poll
neovim.org
neovim.org
It's important to remember that everyone involved is trying to improve Vim as they see it. I think this is a prime example of how the benevolent dictatorship model can fail.
1. https://groups.google.com/forum/#!topic/vim_dev/65jjGqS1_VQ
2. https://groups.google.com/forum/#!topic/vim_dev/-4pqDJfHCsM%...
Deleted comment
Deleted comment
I call him a "talented developer" because he has successfully developed and maintained (for two decades) a stable piece of software that is the base infrastructure on millions (billions?) of computer systems around the world. Millions of other developers rely on his work for their own work. I'll grant that maybe he has done this despite his engineering skills. But his software is a success by any reasonable measure, and I think it takes talent to achieve that.
I love code. I get an enormous pleasure of well engineered code. I appreciate code for its own sake. But code also serves a purpose, and I refuse to believe that someone whose code is so enormously successful somehow did so by accident, without talent.
I wrote to Thiago about this already, but we don't even need multi-cursor support - just a few additional hooks so we can implement a multi-cursor plugin.
Although to be honest, making it part of core is vastly preferable, since it is a hard feature to get right (e.g., how do you deal with copy-pasting into multiple-cursors)?
Macros and global replace already do what you want.
I've heard the "macros is the same" sentiment many times, and usually it's from people who have never had much experience with multiple cursors, at least not in the situations where it's useful, and therefore don't realize how much more convenient they are in many every-day situations.
In fact, many of the people arguing against multi-cursors have been convinced after trying them that they are better.
Please, read my linked comment for an all-too-common situation.
The basic problem with macros and global replace is that they don't happen immediately and don't give you feedback. I don't know any vim user who hasn't had the distinct pleasure of needing 3 tries to record a macro before they got it right.
What's more, if I record a macro and run it, then realize after it that I want to do a small addition, I have to go through all the "setup" steps again - go back to the start, re-record, add the logical of finding the next block, and so on. I can't just visually see the situation and say "oh yeah, why don't I add this little tweak".
Seriously, take a very common example: having 3 if's one after the other, where you want to add a line at the start of each if block. Doing this with multiple cursors is a breeze - 3 buttons and you get 3 cursors, then write your code. And if, after writing it, you realize you actually want to add another line, you just keep typing. It's literally the same as typing.
Anyway, I've rambled enough on this topic many times. Please, just give them a try - I care a lot about text editors, I love this field, and I honestly think multiple cursors is the best innovation to happen in text editing in many years. And yet it's so often overlooked.
Fact by who?
>The basic problem with macros and global replace is that they don't happen immediately and don't give you feedback. I don't know any vim user who hasn't had the distinct pleasure of needing 3 tries to record a macro before they got it right.
True about macros, which are a very powerful tool that's way more than just multiple cursors. For global replace, however, this is false. Vim has an option to enable visual feedback for select/replace commands. I use it every day and it's awesome.
>What's more, if I record a macro and run it, then realize after it that I want to do a small addition, I have to go through all the "setup" steps again - go back to the start, re-record, add the logical of finding the next block, and so on. I can't just visually see the situation and say "oh yeah, why don't I add this little tweak".
What about recording the rest of the macro and running both of them one after the other?
>Seriously, take a very common example: having 3 if's one after the other, where you want to add a line at the start of each if block. Doing this with multiple cursors is a breeze - 3 buttons and you get 3 cursors, then write your code. And if, after writing it, you realize you actually want to add another line, you just keep typing. It's literally the same as typing.
v<linenum>j:s/if/<whatever>if/g oh wait, I wanted to add another line? uv<linenum>j:<up><change regex>
Also as somebody already pointed out, vim already has plugin(s) for multiple cursor support and they work exactly as they should. I'm not arguing against multiple cursors, I'm just saying that they don't really bring anything new.
By me. I've talked to people and they've changed their minds. Sorry, should've made that explicit.
>What about recording the rest of the macro and running both of them one after the other?
Because sometimes you only think of it later.
>Also as somebody already pointed out, vim already has plugin(s) for multiple cursor support and they work exactly as they should. I'm not arguing against multiple cursors, I'm just saying that they don't really bring anything new.
As I mentioned to them, I used that plugin, and while it's awesome and I totally love the author for making it, it just isn't as good. See my other comment for details.
And again, I really disagree that they don't bring anything new. That's like saying that WYSIWYG text editors don't bring everything new over systems like Latex. Can you do everything in both systems? Yes. Is it sometimes easier to just select text and hit "ctrl+b"? Yes. Is it always better? No. But it's good to have both options, as sometimes one crushes the other.
Again, I love vim, and I definitely use some of the very methods you've mentioned. But I'm not here to sell you anything, I don't earn anything by convincing you to at least give multiple cursors a shot, except knowing that if you're dismissing them without having tried them then you're missing out and that makes me sad.
This may only show that you grok VimScript way of thinking, not Vim way of thinking.
You need not re-record a macro, a macro is stored in a register. Just edit the register, and you're good to go with you new, (supposedly) improved macro.
In Vim, you edit in Normal mode, and insert in insert mode. Multiple cursors is a means of moving editing into insert mode, and thus in spite of the Vim way. I am an Emacs user * and there is a multiple-cursors mode for Emacs, which quite useful as Emacs is modeless.
* If we're doing SLOC porn here, I've a ~400 SLOC vimrc with nice gems in it, and is nicely and extensively commented. I've switched to Emacs for my love of Lisp and newfangled dislike of some parts of Unix.
True enough that it doesn't prove anything.
"You need not re-record a macro, a macro is stored in a register. Just edit the register, and you're good to go with you new, (supposedly) improved macro."
I know. And if you think this process is easier, faster, or saves keystrokes over using multiple cursors, then I think you're wrong.
"In Vim, you edit in Normal mode, and insert in insert mode. Multiple cursors is a means of moving editing into insert mode, and thus in spite of the Vim way."
No no no! That's the beauty of using multiple cursors in vim. You can have (potentially) multiple cursors in Normal Mode, and use all the normal vim commands. That's what makes it so sad that it doesn't have multiple cursors, because if you can merge the power of multiple cursors with the power of vim, you get something amazing.
Imagine having the following:
<pre>
<div>some text</div> <div>Some other text</div> <div>Third</div>
</pre>
Then imagine you want to, for some reason, copy-paste the contents of the different divs into (say) another buffer.
With multiple cursors, you can select the three lines, use the vim commands to yank the text object that's in between the divs (yit), and then paste it elsewhere. This is not possible in Sublime Text, since it has no way of saying "select text between divs". Or even, doesn't have vim's "f" command so one could jump to the "<" character opening the second div.
Vim poses a way to edit text; Sublime, Emacs and other modeless editors pose another. One enables neat tricks via a very nuanced and powerful editing language, that is Vim verbs, text objects et cetera, and the rest do not provide such mechanism, in favour of simplicity and ease of use (it is easier to start typing in Emacs than Vim, whereas it is easier to do editing in Vim than Emacs, but only for the knowledgeable user).
Do not get me wrong, I am not thinking multiple-cursor-editing is useless; in fact, I use it quite a lot in Emacs[1], and I like how it indeed helps me do my multi-line editing with instant feedback. My argument is that such editing has little to offer to a user that has spent a month-or-so to master Vim.
this is very doable, lets say you record a macro to 'a'
1. q:
2. let @a='
3. ^r^ra to put in the current contents of the macro
4. edit as you see fit
--- you should now have something like ---
let @a='contents of macro'
5. ???
6. profit<pre> .some-css-rule { padding-left:50px; padding-right:50px; } </pre>
Say I want to edit those two numbers. With multi-cursors, it's as simple as select one number, hitting a button that causes the other number to be selected, then writing the new value.
Now, after I wrote it, I realize I forgot to put a space after the colon, and want to change the formatting. No problem - I just make the change to the first line, and the next line follows.
Same as macros? Kind of. But let's say I make a mistake in the macro, e.g., I move the cursor left to the beggining of the line letter-by-letter instead of hitting "home", which is a killer for a macro since each line is a different length. (this is a contrived example a real vim'er will never do, but there are plenty of real examples of 'oops forgot about that' things when recording macros).
Anyway, when I run my macro, suddenly things won't work, and then undoing and starting the re-record process takes time. But if I'm doing this with mulitple-cursors, I see right away, visually that something's wrong, and it's easy to fix - I just hit "home" after moving the cursor left.
And note - this is a drop-dead-simple use case that happens 10's of times a day for any css programmer. Similarly, most programmers will run into cases where they have two similar if blocks one after another, or two similar "except" blocks, and so on.
And that's not even going into lots of other, very powerful cases, like taking a function that gets a list of paramaters, and being able to easily manipulate these paramaters, e.g. given "foo(a, b, c, d, e)", I can easily multi-cursor all the commas, then copy all the params, then paste them after the func definition, hit enter, and I've got a list of all the params after the function definition. And this isn't hard, at all! I visually see everything I'm doing as I do it, and if something goes wrong, I fix it on the spot.
I could ramble more about this, but I think I've either convinced you I'm crazy, or at least to try multi-cursors out :)
:s/50/60/g
:s/:/: /g
No need to touch the mouse or use macros. Many use-cases for multiple cursors are satisfied by the core functionality of vim, however they may not be immediately obvious.
Take an example like the following:
def foo(): // do stuff
def bar(): // do stuff
Now I want to change my comment to say:
// The function foo does stuff
With multiple cursors, I select both def's, copy the following word, then go down and change the comment.
Again, I'm not saying this can't be done in vim. But it's just plain easier to do with multiple cursors. And if you don't believe me, well, that's your right of course. But having used both, extensively, I'm telling you - please, at least give it a try. For many daily use cases, it's just so much easier. And I don't get anything out of selling you on multiple cursors except for the warm fuzzy feeling of maybe helping a fellow developer learn something that will help them.
.some-css-rule { padding-left:50px; padding-right:50px; margin:50px; }
Pretend you want to avoid changing the margin.or even just /50<CR>r6n.
if there's any new feature I'd like to see in neovim it would be one key that will repeat an ex command like period does for normal/visual mode
:s/50/60/<CR> @:
And that still won't handle .some-css-rule { margin:50px; padding-left:50px; padding-right:50px; }
The second example will work, for this, but not for the situation where you change your mind halfway through and decide you want 70px instead.:s/t:50/t:60/g
More serious response: I think after many years of training ones brain to use the features available to it some of those features become second nature and subconscious. This is great for editing and it's the reason I immediately saw that you left me a really easy way to do it, but it can make seeing the value of new features more difficult.
.some-css-rule { padding-left:50px; padding-right:50px; margin-left:50px; margin-right:50px; }
I run into examples like this a lot and have yet to find an elegant way to deal with it. Honestly, I'd like to see if there's a simple solution.I find that I spend a lot of time in my editor crafting regular expressions to do clever replacements and I've yet to get so good at it that it doesn't distract me from my editing.
Of course, you're still going to run into hundreds of situations where you have semi-duplicate code. That's just how real-world programming works.
Just playing devil's advocate, I've never come across a situation where I wanted multiple cursors that sed or macros couldn't do for me.
(and vim doesn't have multiple cursor support in the sense that I mean it).
One easy limitation comes to mind - you can't copy-paste different cursors, then paste them as unique items. E.g., given a list "a, b, c", I want to be able to multi-cursor the letters, copy them, then paste them into 3 multi-cursors somewhere else. Hard, very hard to implement.
That doesn't sound hard to implement iff you plan for those features from the beginning. I have my own editor hobby project and during my reading I got convinced multiple cursors are great for the reasons you described in your other comment.
I hadn't thought about multi cursor copy/paste so I'm wondering what else I've missed.
Instead of a shitty language for plugins and configuration: vimL (with some support for plugins in alternative languages but not well integrated and not present in all vim installations) and replace it with a good interface to a single language. Like emacs. Much of emacs is written in elisp instead of c, I wonder if this will enable quicker/higher level development with lua for parts of neovim.
The plans for a compatibility interpreter for vimL on top lua sound a lot like the elisp on top of guile plan for guile emacs, and isn't one of guile emacs goals to add support for concurrency?
People are more and more used to contributing to projects with an occasional pull request. However to benefit from this, the projects have to become more accessible to these people. This makes all those changes that are introduced to neovim necessary. If tests are already beneficial for a developer who has written the codebase, the occassional contributor really depends on them.
Vim and emacs are projects that are of special strategical importance to the world. They must not vanish.
I honestly thing if he can successfully pull off this "msgpack UI" and get a solid set of tests written (which the community seems eager to start work on) this project will be a huge success.
Here is his quote from the mailing list:
"This may not be so obvious, but vim's biggest problem has nothing to do with the lack of the above features. It's something much more basic: poor testing infrastructure.
While vim has some automated tests(about 200 counting with the ~100 tests embedded in test 49) those only catch the 'biggest' bugs, with many small ones being introduced by patches and only detected at a later time. It's a true maintenance hell, and here's a post on reddit that illustrates the problem(even though the author himself disagrees with neovim): http://www.reddit.com/r/programming/comments/1yjzez/neovim_a...
The problem is that in it's current state, vim cannot grow because there's no easy way to write automated tests for it. The current test suite is very hard to understand and those that submit patches probably won't write tests because it's too complicated. But patches need to be tested, especially bug fixes which must acompany a regression to ensure they won't be reintroduced. So it's easy to see why Bram is skeptical about merging patches, especially new features: He has no way of knowing if those patches will break existing code. In the example given by the reddit comment, Bram 'solved' the problem by simply picking the lesser of two evils.
This is one of the firsts issues neovim aims to fix: By writing a msgpack 'UI', we'll be able to write well-documented functional tests in a high-level language. Contributors reporting bugs will be able to reproduce them with a test cases and new features will be properly tested. As the test suite covers more code, neovim will be more 'protected' since there will be a bigger chance of catching bugs the minute a PR is sent(with travis). People need to understand that before posting issues regarding new features or new ideas, as neovim must be properly 'secured' against bugs first."
I backed Neovim and I really hope that it succeeds. I think the Vim codebase is criticized a little too harshly in general. It is a child of its time.
Whether Lua is the optimal choice as an extension language remains to be seen, yet it is a very pragmatic choice and over time we will see that the C core of vim will shrink dramatically.
I seriously hope that Bram Molenaar is not offended by the fork (and I think he is not). For the vim community having neovim as an independent development line will have its merrits until it is clear whether the fork can replace the proven editor.
The reason I ask is because one of the primary reasons I made the switch to Vim from TextMate is ubiquity and longevity. In the age of GitHub, fads, forks and abandoned projects have become all too common. Meanwhile Bram has proven himself to be a pillar-like benevolent dictator for decades, and to me that means a hell of a lot.
As for "getting behind it if it succeeds" lets hope not! I was a financial supporter of Neovim. I also have run the #vim channel on FreeNode for over a decade. They serve different goals.
Neovim is where "big changes" can happen, gut legacy support, move fast, break shit. It is on Github, it has multiple people doing major contributions, it is being re-factored to make it easier for MORE people to get involved. Neovim wants to be a huge community project, which is awesome.
Vim is -- the default on many systems, shipped with fully working vi compatible mode, has literally millions and millions of users. It can not -- by its nature -- move fast and break shit. Vim has a much, older, slower development process -- from the days well before Github and friends... it might slowly open up -- but not much, because again, millions depend on it. This is also, awesome.
I hope the very best ideas, once they are tested, debugged, and tested again will make their way up from Neovim to Vim, but it will be a very slow process. Neovim gives no thought to Vim -- because it can't -- it has to be its own thing to move forward. Vim gives no thought to Neovim yet -- it is an established, dependable, amazing tool... and Neovim has not yet risen to the point to even be worthy of a response.
What I'd rather see is vim with deprecations and upgrades on a reasonably timed roadmap. It's obviously a lot more work to maintain a 7.x branch, 8.x branch etc, but this is much more sustainable and meets everyone's needs better than saying "fuck it I just want Sublime with better vim bindings". An editor is not something where I want to chase the flavor of the month and deal with constant plugin breakages, but neither is it something where I want to be stuck in the 90s forever. There has to be a middle ground.
For the time being Bram's approach has earned my trust, and Neovim has to demonstrate many years of good project management and momentum before I will really be willing to trust it.
But, that misses the point of Neovim a bit -- Neovim is about letting the community in (with all the good, and bad that comes with that). I suspect most people won't shift over to Neovim until either (1) They want to actually contribute something and find Vim proper far too daunting, or (2) because of the entirely new plugin model, some amazing plugin is only available on Neovim and it drags them over from Vim.
The Neovim plan seems to be "in months to gain momentum, in years to gain trust" -- which is really the only way you can do it.
The first thing done to Neovim was to re-format all the code and then do some refactoring that breaks things. You can't make an omelette without breaking eggs but this practically burned the bridges behind and any hope of merging stuff upstream/downstream from neovim to vim or vice versa is gone. At least without significant manual labor.
If you ask me, this was a premature move and the neovim guys should have tried to make non-breaking changes first with an opportunity for upstream-downstream merges.
The code had to be re-factored to let the community in -- the Vim code is a horrific legacy cruft-fest that terrifies even the most brave developers. But it is a historical working one, which is hard to argue with -- look at those styling commits, they are wonderfully sane.
It's going to be an awful lot of work, with the result that not all
systems will be supported, new bugs introduced and what's the gain
for the end user exactly?
Total refactoring is not a solution. It's much better to improve what
we have. Perhaps with some small refactorings specifically aimed at
making Vim work better for users.
[1] https://groups.google.com/d/msg/vim_dev/x0BF9Y0Uby8/94tmiaBv...A very good way of thinking.
For selfish reasons I'm behind neovim but I can see that it puts Bram in a bad position, which is unfortunate. He's done so much work for all of us (vim users), and ultimately this project just adds to the work he has to do (and makes it even more thankless). He'll be dealing with incompatibility issues between plugins trying to support both systems.
Ultimately, I guess he'll have to make a choice as to which codebase to support, by choosing neovim he's deserting everyone on esoteric systems. I think that may be the best outcome; Neovim becomes the new standard, Bram switches over and leaves vim to die. But then what control does he have?
It's one of those situations, it seems like a good idea, and could be a massive net win. Then again, it could also really destroy the project.
[0] https://groups.google.com/forum/m/#!topic/vim_dev/x0BF9Y0Uby...
I'd prefer if they could be renamed to "Fetaure X which enables e.g. sublime minimap" and dito for autocomplete.
Not quite. Neovim has working job control ("async"):
It works like the javascript event loop, so even though Neovim is still single-threaded, you can dispatch to external processes and handle the results in a callback(s).
Can anyone else speak to the health of the project?
The code base is now about half of the original size (removed support for legacy OSes, swap all native IO abstractions for libuv, removed dead code, etc). They also split the 25Kloc files called things like misc2.c into multiple files and neovim uses cmake instead of a slew of hand written make files with two decades of commented out hacks. Work on a vimscript -> lua compiler (https://github.com/neovim/neovim/pull/243) is underway as well as the new RPC plugin stuff (https://github.com/neovim/neovim/pull/582).
I think they didn't quite realise how many people were going to want to be part of it, during the fund raising, and so a lot of effort has gone into coping with the large amount of work from multiple people, merging in patches from the 'main' VIM trunk, etc.
There's been a huge amount of pruning - which is still on-going - of old deprecated stuff. For instance, the X11 interface stuff is being simplified (for now) into just the GTK interface.
The original author of the neovim concept (Thiago) just posted: https://groups.google.com/forum/#!topic/neovim/R_jXItMXN4E saying that now he actually has someone to take over a lot of the community stuff, which should free him up to work hard on some of the original actual coding fundraising goals - which is excellent.
In some ways, thinking about it, it's probably good that he delayed it, as it means that there's been a lot of extra eyes going over the code of the whole project cleaning things up so that the new features aren't going to conflict too much with other bits being removed.
There's one of the guys who's a vimscript genius working on the lua/vimscript side of things, which will get merged in at some point once it's ready. It's essentially a completely separate project until it's ready though.
I suspect the first of the big project 'features' to be done will be the libuv stuff - which again, will have little to actually see as a user. Once that's done, and then the lua scripting stuff is done, after that then new features are possible.
Even now, though, the difference in the code is dramatic, and it's constantly getting minor cleanups and improvements along the way.
To summarize:
* Uncrustify was literally one of the first things that was done before Neovim was even announced. It's only listed in the "progress" page for completeness and reference.
* The refactoring is ongoing and is moving along smoothly.
* Job control ("async") is committed, and it works. You can use it today.
[1] http://www.reddit.com/r/vim/comments/23xgxv/tim_pope_is_flir...
https://github.com/KevinGoodsell/vim-csexact
There is also csapprox.
https://groups.google.com/forum/#!topic/neovim/hTPKGGzwWKA
neovim is sticking with the standard fixed terminal as the 'main interface', but is building a better/easier way to communicate with external processes. That way a non-terminal Vim plugin can open up extra windows for minimaps, etc.
Ideally, this would mean you could have a vim "server" (for lack of a better term) on your dev VM, or where-ever, and local "client" windows on your actual workstation which displays beautiful helptexts, minimaps, code trees, etc.
*i am going to run now.
But when i search google for this guilemacs there are no definitive information for this project (as in where i download the program?).
So based on my little browsing, vim and emacs have some kind of different problems? (or are they even problems?)
Vim has the benevolent dictator who prefer supporting backwards compatibility to developing features. And Neovim try to address that.
Emacs is using a "hacky emacs lisp" and "guile emacs" tries to incorporate a scheme based improvement on the backend.