If you prefer a keyboard driven workflow learning to use a terminal and terminal based editor will give you a very portable solution.
Vi's commands are somewhat like a language for manipulating text. This is a different philosophy to many non-modal editors. In vi you can say change the next 3 paragraphs to foo or replace the text inside the this tag with bar. When you learn the language it's almost painful to watch someone trying to select text with a mouse. (I realise GUI tools often have vi plugins. I think that only proves that modal editing is useful and ergonomic once you've learnt how to use it).
CLI based tools are also very scriptable where that is often not the case for GUI based tools. Vi/Vim/NVim are part of a wider ecosystem of tools. If you learn the Ex commands for things like substitute/replace in Vim you're taking a step along the road of learning sed also.
You mention a lot of scripting, and also the terminal.
Would you also recommend vim for working on large projects with 100+ files? I believe in this case, a full on IDE is suited better.
Also I'm not so sure about the portability. Sure, some of the knowledge is reusable, but when all the vim installations are not "batteries included", every installation will be configured differently.
Another point: I think with strongly and statically typed languages one shouldn't think about writing code as writing text, but about building a syntax tree that happens to be text.
You would be surprised by what Vim can do out of the box simply by turning features on. It's also very easy to move configs about. I use github for that job but I can use Vi/Vim without a config if needed.
However what I really mean by portability is that once set up I have exactly the same shortcuts on both my own mac, client's linux laptop and servers. Currently I use tmux for window management but I could use NeoVim for that now. If I want to open a split terminal window or move an existing one about it's exactly the same short cut on each machine.
> Another point: I think with strongly and statically typed languages one shouldn't think about writing code as writing text, but about building a syntax tree that happens to be text.
That's in no way tied to a GUI and there's nothing to stop you adding IDE like features to an editor like Vim. The terminal is just another way of representing tooling to the user.
However if you prefer a GUI interface then nothing stops you from using that in preference to the terminal either. I only point this out as the grand parent asked why we would bother in 2019.
I do that now.
IMO, it depends on the language. For C#, nothing beats Visual Studio. For all of its warts, the autocomplete, go-to-def, and debugging just work too well. I do use a Vim plugin in it. It's missing some features that full Vim has, but the other advantages make up for it.
For Ruby, Python, etc, I think pure Vim wins, including with large projects. I know it's possible to get autocomplete support in Vim, but never found it to be worth the trouble for those languages. No issue in handling a bunch of files with Nerdtree and CtrlP. I think the terminal is better for actually running the program and related tasks than any IDE environment I've tried. Especially with Tmux to spin up new windows easily and switch between them, all without ever leaving the keyboard.
It is true that vim installs tend to be highly configured. IME, the bone-stock Vim on servers is easy enough to live with for the purpose of editing a couple of config files. Wouldn't be thrilled to use it on a large project though.
Chances are the Emacs-users are working on files on that server remotely via TRAMP, from their nicely and 100% personally customized Emacs-installation.
Why bother replicating all that setup on a server when you don't have to?
Hopefully other projects such SpaceVim or individual plugins can provide an easier path for those that want it. I think it's on NeoVim's own road map to add LSP support out of the box.
Of course it's also worth pointing out that whilst it's nice that NeoVim is learning new tricks nothing about having better CLI based tools available means that you can't still use GUI based IDEs if that suits your use case better.
I'm saying that as an emacs user. I prefer emacs, but if I had to work with a language (e.g. Java) where language support is much more sophisticated in a tool like, for example, IntelliJ, then I'd use that instead, because it would make me much more productive.
First of all, I don't know about vim/neovim, but I think a lot of the issues apply there as well.
When I develop software, I don't need an editor, I need a development environment. I spend 90% of my time reading code, so reading and navigating the codebase should be very straightforward. Most importantly I want to have a tree view of the files in the project, I want to be able to jump to function/class definitions and I want to show usages of functions.
Another big thing is debugging. IntelliJ has really good debugging capabilities.
Also auto-completion.
I think some of these you can get in vim/emacs, but it doesn't come out of the box. I sometimes miss some of my emacs shortcuts/features, but not enough to drop all the amazing things that IntelliJ is offering.
For navigating the project I use helm on emacs, fzf on vim. I can just fuzzy-match anything I'm looking for instantly. I find filesystem treeviews useless, they use a lot of screen real estate and they're annoying to navigate, I don't see the point.
For navigation ripgrep does most of the job complex language engines do and it works across languages without any configuration. For C I sometimes use cscope and ctags but even there I often just call ripgrep because why not?
For auto-completion I also find that a very naive algorithm completing words from existing buffers works reliably and efficiently, with zero configuration and tweaking. Sure you don't get context-aware completion but that never bothered me too much to be honest.
For debugging I can't really disagree with you, both Vim and Emacs are very limited in that regard (Vim especially so).
That being said, maybe if I gave those big IDEs a chance I'd never go back, who knows. Besides I could spend an hour listing things I think Vim and Emacs do wrong so it's not like I think they're perfect editors.
Debugging, while perfectly doable depending on language, is I'd say the one thing still rather awkward.
Language support tools are not dependant on running GUI based IDEs any more.
That is a great point, and this is precisely the goal of the Language Server Protocol[0] (LSP). I agree that dedicated tools have more sophisticated support but LSP is quickly bridging that gap. With how extensible editors like vim and emacs are coupled with there powerful text manipulation capabilities the development experience offered by them in combination with a good Language Server and Client is not to be underestimated. Although editor ergonomics are very subjective so I know this topic can get very controversial.
Non-inclusive-we 'need' it because we want it and will make it ourselves. Inclusive-we do not because your individual needs were never and should never be the concern of a project that you have no investment in.
There are lots of other stupid things about it too.
I love it dearly, but English is not elegant or concise.
With a fuzzy finder, Neovim start up in milliseconds and can scale to projects with several thousand files, complete with documentation, symbols, reference jumping, and refactoring. An IDE just turns my laptop into a space heater with minimal configurability and fewer features. In other words, I am investing more battery life for a weaker program. If I need to use someone else's computer (or a container), I can run Vim with my config file right in the terminal and never notice the difference.
The features I need:
1. FOSS
2. A reasonable amount of battery, CPU, and memory usage. The editor should not bring a browser/JVM with it. Browsers eat RAM and need to be restarted within a couple days of uptime, and the JVM kills the battery.
3. Cross-platform; should work on Linux and BSD.
4. Should scale to large projects with thousands of files.
5. Should support advanced features with something like the Language Server Protocol.
6. Minimal UI and keyboard-driven; screen space is often limited, and I hate the mouse with a passion.
Vim and Emacs are the only editors I have ever used that have all of the above features. Nothing else comes close.
Learning neo/vim has been interesting in many regards. I now have a more "portable" setup (up to plug-ins)