You can use the zero-width `\%#` to match the cursor position, so something like substitute/\%#\s\+$//e on the current line, and your other pattern on the other lines: global/\%#/substitute/\%#\s\+$//e vglobal/\%#/substitute/\s\+$//e Unfortunately, by the time either `:substitute` is happening, the cursor position has moved. So let's save it and make the matches more exact with `\%123l` and `\%123c` for matching exact lines and columns: ``` let [_, line, col, _, _] = getcurpos() execute printf('global/\%%%dl/substitute/\%%%dc\s\+$//e', line, col) execute printf('vglobal/\%%%dl/substitute/\s\+$//e', line) ``` But now that we already have the line number, we don't need the first `:global`: ``` let [_, line, col, _, _] = getcurpos() execute printf('%d substitute/\%%%dc\s\+$//e', line, col) execute printf('vglobal/\%%%dl/substitute/\s\+$//e', line) ``` Then you can surround it with `winsaveview()` and `winrestview()` to handle the cursor position. PS technically the first substitute does not need the line number, but being explicit does not hurt.