Я пытаюсь написать крошечный макрос для добавления; до конца текущей строки (A;), затем вернитесь в положение курсора, с которого я прыгнул, прежде чем выполнять макрос.

Co и Ci - это не то, что мне нужно, равно как '' и ``, которые работают с точками редактирования. Нет ли способа сделать это без размещения маркера?

4 ответа4

2

Поведение `` и то, что считается "прыжками", четко объяснено в документе.

От :help jump-motions:

"Прыжок" - это одна из следующих команд: «'», «` »," G ",« /»,«?"," n "," N ","% ","(",")"," [[","]] "," {","} ",": s ",": tag ", "L", "M", "H" и команды, которые начинают редактирование нового файла. Если вы сделаете курсор "прыгать" с помощью одной из этих команд, положение курсора перед прыжком запоминается. Вы можете вернуться в эту позицию с помощью команд «» и «», если строка, содержащая эту позицию, не была изменена или удалена.

Очевидно, что A нет в списке, поэтому «тик-тик-бэк», как называет это Гэри Бернхардт, не будет работать "как есть". Это все еще хороший подход, но вы должны явно поставить метку обратного удара, прежде чем делать A;

nnoremap <key> m`A;<Esc>``
1

Если вы используете низкоуровневую setpos() вместо :substitute (которая имеет другие нежелательные побочные эффекты, такие как добавление шаблона в историю поиска), положение курсора будет сохранено автоматически:

:nnoremap <silent> <leader>; :call setline('.', getline('.') . ';')<CR>
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>
1

В итоге я написал крошечную функцию, менее гибкую, но более компактную версию, чем та, которую вы только что опубликовали.

Keybind:

nnoremap <leader>; :call AppendSC()<CR>

Функция:

fun! AppendSC()
  let pos = getpos('.')
  s/.*/&;/
  call setpos('.', pos)
endf

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .