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.