
Я пытаюсь написать небольшой макрос, который добавит ; в конец текущей строки (A;), а затем вернет курсор в позицию, из которой я перешел перед выполнением макроса.
Co и Ci — это не то, что мне нужно, как и '' и ``, которые работают с точками редактирования. Неужели нет способа сделать это без размещения маркера?
решение1
Если вас устраивает создание небольшой функции вместо небольшого макроса, я бы предложил следующее:
function! AppendString(string)
if getline('.') !~ a:string.'$'
let original_cursor_position = getpos('.')
exec("s/$/".a:string."/")
call setpos('.', original_cursor_position)
endif
endfunction
Позиция курсора получается с помощью getpos()
и позже восстанавливается с помощью setpos()
.
Эта функция может добавлять любую строку, которую вы хотите. Также она проверяет, есть ли уже нужная строка в конце, в этом случае она ничего не делает.
Вы можете определить раскладки клавиатуры, использующие эту функцию, которые будут полезны для разных языков:
" in ftplugin/cpp.vim
nnoremap <silent> <LocalLeader>; :call AppendString(";")<CR>
или
" in ftplugin/python.vim
nnoremap <silent> <LocalLeader>: :call AppendString(":")<CR>
решение2
setpos()
Если вместо этого использовать низкоуровневый :substitute
(что имеет другие нежелательные побочные эффекты, такие как добавление шаблона в историю поиска), позиция курсора будет сохранена автоматически:
:nnoremap <silent> <leader>; :call setline('.', getline('.') . ';')<CR>
решение3
Поведение `` и то, что считается «прыжками», четко объяснено в документе.
От :help jump-motions
:
«Прыжок» — это одна из следующих команд: «'», «`», «G», «/», «?», «n», «N», «%», «(», «)», «[[», «]]», «{», «}», «:s», «:tag», «L», «M», «H» и команды, которые начинают редактирование нового файла. Если вы сделаете «прыжок» курсора с помощью одной из этих команд, позиция курсора до прыжка будет запомнена. Вы можете вернуться в эту позицию с помощью команд «''» и «``», если только строка, содержащая эту позицию, не была изменена или удалена.
A
очевидно, что в списке нет, поэтому "тик-тик-бэк", как называет это Гари Бернхардт, не будет работать "как есть". Это все еще хороший подход, однако, вы должны явно поставить знак обратного кавычкидовы делаетеA;
nnoremap <key> m`A;<Esc>``
решение4
В итоге я написал маленькую функцию, менее гибкую, но более компактную версию, чем та, что вы только что опубликовали.
Сочетание клавиш:
nnoremap <leader>; :call AppendSC()<CR>
Функция:
fun! AppendSC()
let pos = getpos('.')
s/.*/&;/
call setpos('.', pos)
endf