Я думаю, что единственная проблема с вашим сценарием в том, что сохранение позиции кажется неправильным. По сути, вы можете делать то, что пытаетесь сделать:
:s/\s*\%#\s*/ /e
, что соответствует (правильному) коду в вашем вопросе. Вы можете просто сопоставить это с:
:nmap <space> :s/\s*\%#\s*/ /e<CR>
Если вы хотите сохранить позицию, все становится немного сложнее. Вероятно, лучше всего использовать что-то вроде этого:
function! JustOneSpace()
" Get the current contents of the current line
let current_line = getline(".")
" Get the current cursor position
let cursor_position = getpos(".")
" Generate a match using the column number of the current cursor position
let matchRE = '\(\s*\)\%' . cursor_position[2] . 'c\s*'
" Find the number of spaces that precede the cursor
let isolate_preceding_spacesRE = '^.\{-}' . matchRE . '.*$'
let preceding_spaces = substitute(current_line, isolate_preceding_spacesRE, '\1', "")
" Modify the line by replacing with one space
let modified_line = substitute(current_line, matchRE, " ", "")
" Modify the cursor position to handle the change in string length
let cursor_position[2] -= len(preceding_spaces) - 1
" Set the line in the window
call setline(".", modified_line)
" Reset the cursor position
call setpos(".", cursor_position)
endfunction
В основном это комментарии, но главное, что вы смотрите на длину строки до и после замены и соответственно выбираете новую позицию курсора. Вы можете сделать это с помощью вашего метода, сравнив len(getline("."))
до и после, если хотите.
Редактировать
Если вы хотите, чтобы курсор заканчивался после пробела, измените строку:
let cursor_position[2] -= len(current_line) - len(modified_line)
такой, что выглядит так:
let cursor_position[2] -= (len(current_line) - len(modified_line)) - 1
Редактировать (2)
Я изменил скрипт выше, чтобы учесть ваши комментарии так, чтобы позиция курсора корректировалась только на количество пробелов перед позицией курсора. Это делается путем создания второго регулярного выражения, которое извлекает из строки пробелы, предшествующие курсору (и ничего больше), а затем корректирует положение курсора по количеству пробелов.