Emacs-like scrolling in Vim - vim

For those unaware, AFAIK by default in Emacs scrolling works the following way.
It doesn't scroll until the user has reached the end of the visible buffer, when you reach the end of the visible buffer and you go one over the visible buffer it doesn't load one line, instead it loads an entire new page, basically. I imagine this is to reduce lag when re-rendering the screen.
What would be a way to achieve this in Vim? Is there a way to do this? If there isn't, what are some pointers to implement something like this? My idea was to maybe get the best of both worlds and scroll half a page or one page when scrolloff is reached.
Any help is appreciated. :)

I think this would do what you want:
set sj=-50
check :h 'sj' for details:
'scrolljump' 'sj' number (default 1)
global
{not in Vi}
Minimal number of lines to scroll when the cursor gets off the
screen (e.g., with "j"). Not used for scroll commands (e.g., CTRL-E,
CTRL-D). Useful if your terminal scrolls very slowly.
When set to a negative number from -1 to -100 this is used as the
percentage of the window height. Thus -50 scrolls half the window
height.
NOTE: This option is set to 1 when 'compatible' is set.

Related

vim x/y scrollbar hiding my commands and being really anoying

i'm a new vim user since 2 weeks and i've currently have my biggest trouble for the moment on vim.
i always have a x and y scrollbar on my vim and the x one is very anoying because it cover my commands.
here is a screenshot of the scrollbars that appears when i use terminal inside of vim using `:term` / `:!dir` or even when i save my vimrc or source it (`:so ~/.vimrc`)
if there is any solutions to it i will be really grateful, thanks for reading
This is an issue with your layout settings in Powershell and Ubuntu. Right click on the top bar of either program, go to Properties and then go to the Layout tab. You can check the Wrap text output on resize box and that should get rid of your horizontal scrollbar, thereby allowing you to use Vim as normal. Alternatively, in the same menu, you can decrease the width of the screen buffer size so that it is smaller than the width of the window size.

Why "set lines=999 " can't maximize Gvim winodw when opening?

set lines=999 in vimrc can't maximize Gvim winodw when opening, why? Please check the screenshot, there's some space in the right and bottom side.
As Joanis stated in his comment, Vim works with lines of character that have a fixed height. The window can only be resized in steps of line-height and character-width.
If you change your font size (Edit -> Select font...) you will see, that the gap between the Vim window and the monitor border changes.
If you are lucky, you'll find a font/font-size that exactly matches the maximum resolution of your monitor. Whether that is still useful or readable ... most likely not.

How to make horizontal scrolling one character at a time

Not sure if I'm wording the question right.
That's why I had a hard time finding the answer on google, like I usually do.
I have my vim set to never wrap lines. Keeps code cleaner.
But I don't like that if I'm moving the cursor across a line and get to the edge of the screen, the view jumps so that where I was at is now in the middle of the screen.
Is there a way to make it not do that? Like, so it just goes one character at a time
(or if I'm traveling by word, one word at a time, etc. Just so if I go the edge of the screen, the cursor stays at the edge of the screen, and the page moves inward under it)?
You could check out the 'sidescroll' setting:
'sidescroll' 'ss' number (default 0)
The minimal number of columns to scroll horizontally. Used only when
the 'wrap' option is off and the cursor is moved off of the screen.
When it is zero the cursor will be put in the middle of the screen.
When using a slow terminal set it to a large number or 0. When using
a fast terminal use a small number or 1. Not used for "zh" and "zl"
commands.

Resize gvim window when the font changes

I have a laptop attached to a 1440p screen. Depending on which screen I'm using, I find myself adjusting gvim's font size often. When I do, the number of lines in the window remains the same. I'm also using a tiling window manager, so gvim is always running in a window of a fixed size. The result of this is that increasing the font pushes the status line out of the visible window and decreasing the font leaves me with dead space.
The workaround I've found so far is to open and close a terminal. Resizing gvim forces it to recalculate how much space window it has to draw in. Is there a way to trigger that effect without spawning another window?
Ok, I have a stupid hack that works around the problem. I'm not going to accept my own answer here because this is a question about gvim, but in case anyone else bumps into this thread before it gets a legit answer, here's my hack.
silent !xterm -e sleep .1;exit
I just dumped that in my font resizing command, which is bound to + and -.
I figure out a few workarounds:
set guioptions+=k: not exactly what we need, but this tells Vim that the window size is not going to change when the
font size changes (which is what happens here anyway so no problem).
set lines=999 columns=9999: according to Vim documentation, this will set it to the maximum value possible (although it doesn't really work for me, the number of lines/columns is computed based on the whole screen size instead of just the window part)
set go+=m go-=m: this seems to force vim to recompute 'lines'. Unfortunately the analog set go+=r go-=r doesn't make it recompute 'columns'...
although set go+=r go-=r does make vim recompute 'columns' when go-k is set. So a full workaround, if you don't want set guioptions+=k, is set go+=k go+=mr go-=mr go-=k (or something similar).

I need to draw a line moving with the cursor, but I want to avoid redrawing the whole window every 100ms

I have a program which displays a ruler on the screen, and with Xlib it polls for the cursor position every 100ms and updates the display. The display consists of numbers/lines etc, in particular a line indicating the position of the cursor (which is why it updates).
The problem is that the old line needs to be erased and the content underneath restored, so I have to redraw the whole window to reflect a change in position. Doing this 10 times a second results in a very flickery program.
I could only redraw the ruler after I have confirmed that the cursor is in a position to change the indicator line (i.e. within the bounds of the ruler), but it would still flicker pretty bad when it was updating.
Sort of a noob to GTK and Xlib and all, any advice would be appreciated.
Code is at https://github.com/zjmichen/zRuler
Well you have arrived at one of the earliest problems faced when cursors were being implemented!! Cursor changes are so frequent that redrawing full window every time just doesn't make any sense! Coming to your problem, look at what is needed & what exactly you are doing. Do you need to update the full window when cursor moves? No. You need to update only a section of the window so don't update the whole window. Off the top, I can think of 2 ways of reducing flicker:
1. Simple way is to make use of GdkCursor. Create a new cursor from the pixmap (Sample provided on the developer page) with the shape of your need, a line in your case. Associate cursor with the GdkWindow of your application's main window. This way you don't have to track cursor & draw the line. The cursor itself will appear as the line (so you don't to bother about clearing & redrawing it). Now in the timer callback where you redraw the complete window, redraw only the component which has to be updated on cursor position change. This should hopefully reduce the flicker as you are not drawing all the components.
2. In case you don't want to use GdkCursor, you could create a separate transparent window on top of application window dedicated to cursor. In this approach you can update only the cursor window & the component in the application window which is to updated on change in cursor position. This way other components in the application window are not redrawn each time & this hopefully should also be able to reduce flicker.
Hope this helps!

Resources