how to put cursor at the beginning of `tab` - vim

When I open vim help, I press 0 to goto beginning of line;
When I press j to scroll down, the cursor jumps to right 8 spaces when focusing tab
And the cursor jumps back when focusing non-tab
It's not very good for eyes.
Is there an option to let vim focus the beginning of tab to let cursor stay at column 0?

Another option:
http://blog.killtheradio.net/how-tos/vim-cursor-at-beginning-of-tab-in-normal-mode/
set list lcs=tab:\ \
" Note the extra space after the second \

You can achieve this by setting
set virtualedit=all
This lets you position the cursor anywhere in the buffer, even beyond the end of the line and before a tab character. In help virtualedit there is a warning that it might break some scripts or plugins, so use it carefully!

Related

Set cursor anywhere in window in Vim

How to setup Vim so you can f.e mouse click in the middle of new opened empty Vim window and place cursor exactly there ( f.e line 23 char 49), instead of line 1 char 1 because?
Is there better way than filling lines with spaces?
The cursor must be somewhere in a buffer and the screen lines that start with ~ are not part of the buffer so placing the cursor there is impossible, no matter how you set :help 'mouse' or :help 'virtualedit'.
You won't be able to achieve your goal without first populating the new buffer with empty lines.

How to perform Ctrl+Del in Vim while in insert mode?

Does anyone know how to delete the word in front of the cursor while in insert mode in Vim? Most systems use Ctrl+Del to do this.
I know to delete the word behind the cursor in Vim is Ctrl+w while in insert mode, but I don't know how to delete forward.
Add this to your ~/.vimrc (for VIM or GVIM):
imap <C-D> X<Esc>lbce
; 1 2 3 4 5 ; just a comment for the further description
(In GVIM, <C-Del> also works.)
Description
Set the following binding on Ctrl+D in the insert mode.
Add a dummy letter to deal with words that initially contain only one character.
Leave the insert mode. (The cursor is on the added letter now.)
Move to the beginning of the current word.
Remove characters from the current position to the next end-of-word (i.e., from the first character of the current word to its last character). Then enter the insert mode again.
Behavior
If the cursor was on a character of a word or immediately after the last character of a word (but not at the end of the current line), then this word will be removed.
Otherwise, if there's a word to the left (on the same line), then it will be removed (without any blank characters).
Otherwise (when there's no next word) the behavior is undefined. (Feel free to update the answer to cover these cases too.)
If a word is removed, then the cursor will be at the same position as the first character of the word was.
Use a single normal mode command, whilst in insert mode.
To do this, whilst in insert mode, type
Ctrl+o
This tells vim to accept exactly 1 command as if it were normal mode. Then press
dw
to delete a word.
The accepted solution is not exactly correct, right? It does delete backwards but not forward
In nvim this works:
imap <C-Del> X<Esc>ce
You could also add below to your .vimrc
inoremap <C-Del> <C-o>dw

Vim: Select all without scrolling away

is it possible in vim to select all lines in the current file, but leave the position where my cursor is unchanged?
Let's say I am currently at line 500 (of 3000) and want to quickly select everything (not yank), as my selection is simply set up to show whitespace characters. Can this be done without leaving my current line?
To achieve exactly what you like, you can press the following:
ggVG<Esc><Ctrl-O><Ctrl-O>
gg moves to the beginning of the file
V starts visual line mode
G moves to the and of the file (now you have selected the whole
file)
<Esc> leaves visual mode
<Ctrl-O> moves your cursor back to the prevois location (first to the beginning of the file, then the second time to your last position before pressing gg)
And if you like to select only the visible lines in you window (to not scroll away). You can use HVL instead of ggVG (H moves to the top of your window and L to the bottom).
You also could show whitespaces without using visual selection with something like this in your .vimrc:
set list listchars=tab:»·,trail:·,nbsp:·
This helps me to detect trailing whitespaces, and mixed (spaces/tabs) indentation.
usually pressing
ggVG
in normal mode will select all the lines, but it will leave your cursor at the last line of the file.
If you wants to highlights the whitespace characters then you can highlight this by using the below command in command mode (this white color chosen is for dark theme)
: hi ExtraWhitespace ctermbg=White guibg=White
Depending on what you are trying to achieve you can use something like :
%cmd
To apply the command to the whole file.
For example, %y will yank the whole file, %=will format the whole file, without moving your cursor. It does not really work if you do something like %d...
It is not a real selection though but rather a way to apply a command on the whole file.
To go further you can use something like
%norm Atest
To add 'test' at the end of each line. (Actually this is a bad example, because this command will move to the last line...)
It is not possible to have the cursor inside a visual selection. This caused by that, vim defines visual selection through two marks. As soon as you move the cursor one of the marks gets updated. Basically this means one of the marks is always lays where the cursor is(at least when using "v" to select). You cannot have the border in the middle of the region that the border defines :)

How to get VIM to map dd to c-bs

I've tried about 100 combinations of :inoremap and :imap, etc, but I am unable to find one that will allow me to remap to delete the current line and leave the cursor on the line that moves up, i.e. visually, the cursor does not move.
I'd prefer to have this work in input, replace and normal modes. Best if it covered all/most of the modes.
Can someone tell me how to do this?
you need to set ve=all to make sure the cursor staying on the same line, same col after deleting. Because the line below the deleted one could be shorter than the line you want to delete, E.g
foooooooo[I]oooo
bar
[I] is cursor, here if you press dd, the cursor won't go to the same column, because the bar line is shorter than fooo.. line. If you set ve=all, your cursor could be placed to any area in the buffer.
then you can just save the col before dd and restore it after dd. like:
:let c=col('.') |exec 'norm! dd'.c.'|'
without set ve=all, if your cursor column didn't exceed the length of the line below, the above command works as well. but if it exceeded, the cursor would be at the end of "below" line.
I hope I understood you right.
See the accepted answer in this question for an explanation of why I can't remap Ctrl-BackSpace.

Cursor positioning when entering insert mode

When I switch to command mode in Vim, the cursor seems to move one character back when it's at the end of or on a word, and when I go to the end-of-line with $, it does not go to the actual end of line but one character before the end of the last word, and l ("el") does not move it forward and I have to use the arrow key to get there.
I haven't been able to find documentation of this behavior, but this seems strange to me. What's the reasoning behind this (for my own curiosity), and how can I get around it (or deal with it)?
it is a little more clear if you use gvim, where the cursor changes.
insert mode in gvim has the cursor as an I-beam, since the next letter you type will be inserted after the |. normal mode has the block cursor, because the next thing you type may just effect the letter that is currently highlighted (like if you use x, s, etc). So insert mode is actually adding text, but normal mode is modifying text in some way.
So in normal mode, jumping to the end of the line really just means the last character, since that is the last thing that is possible to be modified. in insert mode, the cursor goes passed the last character, since it is possible to add things afterwards.
One thing to keep in mind is that you can control which side of the block you end up on going from normal mode to insert mode
([] means that the block cursor is over that h)
Let's say you have t[h]is text
if you pressed i at this point, the cursor would look like this (in gvim)
(| being the insert mode cursor)
Let's say you have t|his text
if you pressed a instead of i, it would look like this
Let's say you have th|is text
Another thing to keep in mind (as pavanlimo mentioned), from normal mode you can go to insert mode with your cursor just before the first character of the line, or just after the last character, with shift-I or shift-A.
I'm not quite sure of the reasoning behind it, but you can work around it by pressing:
Shift + a
You might be interested in the option virtualedit and the following value:
set virtualedit=onemore
With this option you can move the cursor one character over the end of the line and then press i to insert mode after the last character.
This solves the issue in a way but personally I find this behavior a bit odd. Only in a few cases you encounter the problem so it might be worth ignoring it ;-)
That's because all commands you use affect the letter the cursor is over. If wouldn't make sense to press x (delete 1 letter) behind the actual letter.
There's actually no need to move the cursor in command mode behind the last letter, if you want to e.g. append you can press a which puts the cursor behind the letter in insertion mode.
It is implementation-dependent on whether the cursor can move past the end of the line (at least it is an option in my editor's VIM emulation mode). You can press a to enter insert mode and start editing after the current character in this situation (rather than i).
pressing i will enter the insert mode before the cursor
a after the cursor
I before the first non empty character in the line
A at the end of the line.
So, use A to quickly start typing at the end of the line.
I suggest
:set virtualedit=onemore
:inoremap <Esc> <Esc>`^

Resources