As you've already known the Evil implementation of Ex commands is not complete. There are a lot of things that it doesn't support. To work around this limitation I created an Elisp command that sends an Ex command to Vim and gets the output back in Emacs.
[https://gist.github.com/ir210/18ec921312575cc2f35153c607abf5fd](https://gist.github.com/ir210/18ec921312575cc2f35153c607abf5fd)
It's not a package since most likely you have to adjust it to fit your system and I don't have the capability to make it works for everyone. Also, it has a major drawback that I will mention at the end.
When you call this command it asks for an input command exactly like Evil. The only difference is that the evaluation of the command is done by vim. This has both advantages and disadvantages.
Advantages:
* It understands more ex commands than evil.
* It has pretty much the same experience as `evil-ex`.
* Editing the last search pattern from `q/` will make the pattern available in vim too.
* The z register set by vim is available to evil.
* The address `.`, \``'<`, `'>`, `\/` and `\?` work.
* The last search pattern is available to vim.
* The message or error from vim is shown in the minibuffer.
* Vim knows the current emacs cursor position.
* The `"z` register is available to emacs after executing this ex command.
Disadvantages:
* The preview might sometimes be wrong. This is because the preview only understands the `evil-ex` commands.
* Any interactive command will obviously not work.
* Vim's regex is not exactly the same as Emacs's.
* No sharing of all registers but `"/`, `"<` and `">`.
* Evil's extension such as `\,()` obviously doesn't work.
* Executing the command from the command list buffer `q:` will not call this method. But C-f in the minibuffer works.
* The tab character size is according to vim's settings.
* Slow for large files since it uses `(replace-buffer-contents)`.
That last disadvantage is the main reason why I posted it here. It is very slow for big files. It is currently using `(replace-buffer-contents)`. Is there a better method to copy a large chunk of text into the current buffer while still preserving a lot of things that don't change?