Closed oddlama closed 5 months ago
@oddlama Hi :) I appreciate your valuable feedback. I would like to make this project more attractive and I will use your feedback to help me improve it in the future.
About the proposal you gave me:
The markdown preview could be enhanced. Maybe you could have a look at markdown-preview.nvim to provide support for line correlation (double click markdown to jump to source line) and themeing, which are two very handy features. Also scrolling the markdown window is broken when touchpad scrolling isn't inverted like it is on apple (i.e. when scrolling up = mousewheel up, the window will get confused and try to do both).
The features you suggested are attractive. I would like to improve the markdown preview feature. I would also like to implement a fix for a known bug (real-time preview sometimes stops). However, I am not familiar with Javascript and it is a bit challenging. As for the scrolling issue, my MacBook touchpad doesn't behave strangely and I haven't noticed any problems. I will look into it a bit.
I have seen that you did implement the markdown preview with a specially tagged buffer, and I am wondering if this approach could be used for more that a markdown preview.
(It comes to mind: Imagine a type of first-class neovim support for custom rendering of certain buffer types. E.g. NERDTree would just expose machine readable data and neovim's default frontend would render text. Then you could implement a custom renderer for NERDTree and have it properly integrated into goneovim like your filebrowser with all the extra features. I'm sure here is a lot of unused potential for both neovim and its gui implementations)
Yes, I see the same potential. One idea would be to use lua, which has been active in Neovim recently, to allow users to extend the GUI frontend by defining custom GUI components.
A minor thing: I'd like to be able to adjust the margins in the popup menu, because for me it takes too much space away. I would like to have more dense popups. Maybe you could provide a way to do custom themes for goneovim's external windows.
Currently, the margin of external UI components can be changed by defining the linespace in setting.toml. But yes, more generally it is attractive for users to be able to apply custom themes.
About Your Deal Breaker:
It's insanely hard to reproduce your builds without knowledge of go. I'm using gentoo and would've liked to create a package build for it, but unfortunately I don't have any experience in writing go and wasn't able to find enough information on how to properly do reproducible builds from source.
Currently, I have the following documentation for the build. If you have any questions, please feel free to contact me via chat. https://github.com/akiyosi/goneovim/blob/master/Development.md
For gentoo builds it is preferable to build from a source archive without needing internet access while building, but I was unable to find the necessary information. In general I've seen no packages for goneovim in any official distro package manager, so when you think your project is mature enough for the greater public, please consider maintaining a package or build guide to make it easier to adopt.
Yes, I am considering releasing binaries to the major package managers in the future.
Disabling ligatures: I'm really not comfortable using ligatures and would like to disable them, but couldn't find a way to do it. I don't know how much work it is to implement, but judging by other projects that provide ligatures, it seems like a controversial thing to have, so a setting might really be appreciated.
Umm, There have been similar requests in the past(#108), but I am not sure. Is it cumbersome for users to use a font with disabled ligatures if they want to disable ligatures?
Rendering Latency.
Thanks for the detailed measurements and video!
I will look into this, but one thing I notice is that in your video, the external popup menu of goneovim is enabled. goneovim can use the external popup menu with ExtPopupmenu
, but I think it will affect the performance a bit. This is due to the composition of rich UI elements such as icons. I'm curious about the performance of goneovim with all external UI features disabled in your environment.
e.g. setting.toml
[Editor]
# ...
ExtCmdline = false
ExtPopupmenu = false
ExtTabline = false
ExtMessages = false
IndentGuide = false
# ...
The features you suggested are attractive. I would like to improve the markdown preview feature. I would also like to implement a fix for a known bug (real-time preview sometimes stops). However, I am not familiar with Javascript and it is a bit challenging. As for the scrolling issue, my MacBook touchpad doesn't behave strangely and I haven't noticed any problems. I will look into it a bit.
Just from what I experience, it feels like there are two opposing things scrolling the same window. Almost as if mouse-wheel events would scroll down, but some touch gesture event scrolls up at the same time. The hard intervals of the mousewheel-like scrolling make it jump between scrolling up and down.
[...] Yes, I see the same potential. One idea would be to use lua, which has been active in Neovim recently, to allow users to extend the GUI frontend by defining custom GUI components.
Unfortunately, I'm not familiar with any of the neovim internals. If there is a chance that this can be implemented properly (in a way where it benefits the whole ecosystem), I guess it might be worth investigating at some point.
[...] Currently, the margin of external UI components can be changed by defining the linespace in setting.toml. But yes, more generally it is attractive for users to be able to apply custom themes.
I must have missed that option, thanks for pointing it out!
About Your Deal Breaker:
[...]
Currently, I have the following documentation for the build. If you have any questions, please feel free to contact me via chat. https://github.com/akiyosi/goneovim/blob/master/Development.md
It boils down to the problem that I cannot use git or any other tool requiring internet access at build time. Everything needed to build the project should be contained in the released source package, or other officially available packets. (e.g. the qt bindings are probably some go package, but which one? Is there a package manager for go packages?)
Disabling ligatures: I'm really not comfortable using ligatures and would like to disable them, but couldn't find a way to do it. I don't know how much work it is to implement, but judging by other projects that provide ligatures, it seems like a controversial thing to have, so a setting might really be appreciated.
Umm, There have been similar requests in the past(#108), but I am not sure. Is it cumbersome for users to use a font with disabled ligatures if they want to disable ligatures?
Yes. It would require maintaining two sets of the same font for each font I use. I would describe ligatures are a feature of a font, just like bold or italic variants. An application may choose to use them, but isn't forced to. Is purely optional, a font with ligature support can be used without ligatures without drawbacks.
Also I want a font with ligature support, because I like ligatures in statically dispayed content, because it can improve readability, but I dislike them when I edit files.
Some of the patched nerdfonts, which are a commonly used set of fonts for programming, have built-in ligatures (e.g. FiraMono). I cannot choose to download a font without ligature support from there, so I would have to patch them myself.
Is it much work to include a simple switch in the config?
Rendering Latency.
Thanks for the detailed measurements and video! I will look into this, but one thing I notice is that in your video, the external popup menu of goneovim is enabled. goneovim can use the external popup menu with
ExtPopupmenu
, but I think it will affect the performance a bit. This is due to the composition of rich UI elements such as icons. I'm curious about the performance of goneovim with all external UI features disabled in your environment.e.g. setting.toml
[Editor] # ... ExtCmdline = false ExtPopupmenu = false ExtTabline = false ExtMessages = false IndentGuide = false # ...
Yes you are right, it does affect performance quite a bit. Disabling them removes the long hangups. What hasn't changed is the inconsistency in the frame times, which the second video highlights, or the stuttering that occurs in the first video, in the parts where no popup window is visible.
Just from what I experience, it feels like there are two opposing things scrolling the same window. Almost as if mouse-wheel events would scroll down, but some touch gesture event scrolls up at the same time. The hard intervals of the mousewheel-like scrolling make it jump between scrolling up and down.
I'll look into it from that perspective. Thank you.
It boils down to the problem that I cannot use git or any other tool requiring internet access at build time. Everything needed to build the project should be contained in the released source package, or other officially available packets. (e.g. the qt bindings are probably some go package, but which one? Is there a package manager for go packages?)
Hmm, I see. Currently, goneovim relies on the go package management system, and internally uses git to get the source from the internet, including the Qt bindings. You will also need to download the Qt installer from the Internet. Do you expect to be able to get the complete source code you need from an internet browser without using the go or git commands?
Yes. It would require maintaining two sets of the same font for each font I use. I would describe ligatures are a feature of a font, just like bold or italic variants. An application may choose to use them, but isn't forced to. Is purely optional, a font with ligature support can be used without ligatures without drawbacks.
Also I want a font with ligature support, because I like ligatures in statically dispayed content, because it can improve readability, but I dislike them when I edit files.
Some of the patched nerdfonts, which are a commonly used set of fonts for programming, have built-in ligatures (e.g. FiraMono). I cannot choose to download a font without ligature support from there, so I would have to patch them myself.
Is it much work to include a simple switch in the config?
On the internal architecture side, it's not something that can be switched with a simple flag. Of course, it could be possible by redesigning the drawing architecture, but I am concerned about the complexity of the code. I will consider how to implement this.
Yes you are right, it does affect performance quite a bit. Disabling them removes the long hangups. What hasn't changed is the inconsistency in the frame times, which the second video highlights, or the stuttering that occurs in the first video, in the parts where no popup window is visible.
Thanks for the confirmation. I will look into frame time inconsistencies.
Hmm, I see. Currently, goneovim relies on the go package management system, and internally uses git to get the source from the internet, including the Qt bindings. You will also need to download the Qt installer from the Internet. Do you expect to be able to get the complete source code you need from an internet browser without using the go or git commands?
Not exactly, I just need to be able to properly separate downloading and building steps. Let me point you to the ebuild (a bash like build script for gentoo packages) of fzf or github-cli, which are both written in go. You can see that there is a list of dependencies at the beginning, which will be acquired via github.com or golang.com.
I would basically have to create a similar build for goneovim, and I'm not sure how to approach it for this project.
On the internal architecture side, it's not something that can be switched with a simple flag. Of course, it could be possible by redesigning the drawing architecture, but I am concerned about the complexity of the code. I will consider how to implement this.
Thanks a lot, I'm sure you will figure out how to do it properly.
Yes you are right, it does affect performance quite a bit. Disabling them removes the long hangups. What hasn't changed is the inconsistency in the frame times, which the second video highlights, or the stuttering that occurs in the first video, in the parts where no popup window is visible.
Thanks for the confirmation. I will look into frame time inconsistencies.
That's great! Thanks a lot for investigating, I'm looking forward to it!
@oddlama
I have added an option DisableLigatures
to disable ligatures in v0.4.10 :)
Also building with Gentoo's Portage.
For a start, using Go 1.19.5, there is no $GOPATH
, but can use $(go env GOPATH)
instead.
I'd try the following, but I have not tested yet:
export GO111MODULE=off; go get -v github.com/therecipe/qt/cmd/...
$(go env GOPATH)/bin/qtsetup -test=false
go get -d -v github.com/akiyosi/goneovim/...
cd $(go env GOPATH)/src/github.com/akiyosi/goneovim
$(go env GOPATH)/bin/qtmoc
cd $(go env GOPATH)/src/github.com/akiyosi/goneovim/cmd/goneovim
$(go env GOPATH)/bin/qtdeploy build desktop
@msdobrescu The goneovim build in Go Module mode is a work in progress, but the CI scripts are almost complete. (There is still some work to do on the documentation)
The actual CI scripts may be helpful.
Hey there!
I had previously tested goneovim (in the beginning of 2019), but back then I didn't really get to try it properly because I had a lot of interoperability issues. Two years later it seems like there has been a lot of progress, and I finally got to try it out properly without any problems.
Kudos for your effort! I can see a lot of potential for this project and therefore want to provide some feedback to you. Obviously my feedback is highly opinionated, but I hope my feedback is still of value.
What I really liked
Firstly, let me tell you what I really liked about the project:
Setup By using the provided binary builds, I had no issues using goneovim and it worked out of the box without additional configuration. (Also thank you for using the correct configuration directory under
$XDG_CONFIG_HOME/goneovim/
)The minimap is awesome, and worked out of the box, without any problems.
The markdown preview window is an awesome idea, and while there is room for some usability improvements, it is visually the best markdown preview solution inside of vim that I have seen to this date.
The indent guide is pleasing and feels better than the vim-builtin one.
In general, I think goneovim's visual appearance is wholly satisfying.
I use vim over ssh a lot and with some ssh trickery you can make vim on a remote session open a fully fledged gui window on the client, without X11 on the server. This is beyond awesome.
Suggestions
Here are some suggestions which I think would give goneovim a very polished feeling:
The markdown preview could be enhanced. Maybe you could have a look at markdown-preview.nvim to provide support for line correlation (double click markdown to jump to source line) and themeing, which are two very handy features. Also scrolling the markdown window is broken when touchpad scrolling isn't inverted like it is on apple (i.e. when scrolling up = mousewheel up, the window will get confused and try to do both).
I have seen that you did implement the markdown preview with a specially tagged buffer, and I am wondering if this approach could be used for more that a markdown preview.
(It comes to mind: Imagine a type of first-class neovim support for custom rendering of certain buffer types. E.g. NERDTree would just expose machine readable data and neovim's default frontend would render text. Then you could implement a custom renderer for NERDTree and have it properly integrated into goneovim like your filebrowser with all the extra features. I'm sure here is a lot of unused potential for both neovim and its gui implementations)
A minor thing: I'd like to be able to adjust the margins in the popup menu, because for me it takes too much space away. I would like to have more dense popups. Maybe you could provide a way to do custom themes for goneovim's external windows.
Current deal breakers
Even though goneovim has a lot of really awesome features, there are some things that prevent me personally from adopting it as my daily gui for neovim:
It's insanely hard to reproduce your builds without knowledge of go. I'm using gentoo and would've liked to create a package build for it, but unfortunately I don't have any experience in writing go and wasn't able to find enough information on how to properly do reproducible builds from source.
For gentoo builds it is preferable to build from a source archive without needing internet access while building, but I was unable to find the necessary information. In general I've seen no packages for goneovim in any official distro package manager, so when you think your project is mature enough for the greater public, please consider maintaining a package or build guide to make it easier to adopt.
Disabling ligatures: I'm really not comfortable using ligatures and would like to disable them, but couldn't find a way to do it. I don't know how much work it is to implement, but judging by other projects that provide ligatures, it seems like a controversial thing to have, so a setting might really be appreciated.
Rendering Latency. You advertise goneovim as being faster than neovim-qt. I regularly keep up with neovim guis and I have yet to encounter any gui that is actually rendering faster than neovim-qt, which is the reason that I have used it for the past years. While most other guis have insanely high latencies and rendering times, neovim-qt is even snappier than most terminal editors. While overall goneovim's performance is fine, there are some situations where it gets really slow, or inconsistent, which makes it hard to move around quickly without overshooting.
To be clear, I'm not sure if the problem is actually rendering latency, rendering speed or input delay, but to me it feels like a combination of rendering delay and inconsistent fps (try measuring 95'th percentile fps). This is by far the biggest hold-off for me currently, as I'm using a pretty high key repeat (
xset r rate 235 60
), where small inconsistencies in rendering are immediately noticeable.I think it is important that an editor works well even on lower-end hardware. For reference, I'm usually using an Aero 15X v8 (i7-8750H, 4k display, GTX 1070M) laptop, which could be considered high-end, but I'm only using the internal graphics for battery usage reasons (I need more than 2 hours runtime).
I have recorded a short clip for each editor and showed them side-by-side so you can see exactly what is going on. Make sure to watch in 60fps. You can clearly see an issue while completions are active where I'm getting longer (>200ms) frameskips. Also when moving the cursor, it sometimes skips a line, my guess would be that frame rendering times are inconsistent.
https://user-images.githubusercontent.com/31919558/103487156-9bc24280-4e03-11eb-939f-8a82cc9f5960.mp4
https://user-images.githubusercontent.com/31919558/103487160-a1b82380-4e03-11eb-8a52-ddfb6b181e6e.mp4
References
Thank you for developing goneovim, I really look forward to trying it out the next time I get around. I hope you can use parts of my feedback to improve your software!