Vim: перейти к предыдущей позиции курсора, а НЕ к точке редактирования

Vim: перейти к предыдущей позиции курсора, а НЕ к точке редактирования

Я пытаюсь написать небольшой макрос, который добавит ; в конец текущей строки (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

Связанный контент