In IntellijIDEA, if my cursor is at the start of a line, instead of backspace deleting one indent or whitespace at a time, it deletes all tabs and whitespace and moves the cursor to the end of the previous line. How can I setup this behaviour in Vim?
This should do the trick:
function! MyDeleteAction() " Get the current position and the position of the first char let cursorPosition=getpos(".") normal ^ let firstChar=getpos(".") " If the cursor is before the first char, go to the upper line if cursorPosition < firstChar normal! y$0Dk$ let cursorPosition=getpos(".") normal! p endif " Go back to the correct position call setpos('.', cursorPosition) endfunction inoremap <silent> <backspace> <backspace><Esc>:call MyDeleteAction()<CR>a
The last line remaps backspace in insert mode so that it will first delete a character as usual and then call
MyDeleteAction() tests if the cursor is on the first character of the line:
- If it is not the cursor stays at the same position
- If it is we yank the end of the current line, delete the current line, paste the yanked end of the line to the upper line and put the cursor before the pasted text.
The main drawback here is that the function will change your unnamed register when it yanks the line so you might want to add a mechanism to save the state of this register and restore it.