2013-07-02 5 views
5

Мне нравится '. Команда в vim. От :help '.:Предотвращение изменения Vim

'. `. 

[Перейти к] в положение, в котором было сделано последнее изменение. Позиция находится на том или ином месте, где началось изменение.

Ok. Но вот моя проблема: я использую функцию autocmd для добавления в заголовок файла «последней измененной» строки. Итак, после каждой записи '. приносит мне не мое «реальное» последнее изменение, а мой заголовок файла. Мое текущее решение - я стараюсь не забывать отмечать текущую точку редактирования ma, поэтому я могу вернуть 'a. Я иногда забываю, и даже когда я помню, это еще одно нажатие клавиши.

Мое идеальное решение - это какая-то команда, которая говорит vim не запоминать движения. Я могу отправить эту команду до того, как функция autocmd перепрыгнет, записав последнюю измененную строку, а затем отменит ее после завершения функции autocmd. Таким образом, местоположение, связанное с '., не будет изменено. Однако я открыт для любых других вариантов, которые более эффективны.

Если вы хотите его увидеть, вот что делает autocmd на :w.

function! UpdateHeader() 
    let b:winview = winsaveview() 

    " This is where I'd put the command to ignore future movements 

    "The periods concatenate all the arguments into one command. 
    "Silent! suppresses errors, usually 'pattern not found' 
    "The 1,6g means search only lines 1 thru 6 
    "Search for File Name: followed by anything 
    "'s'ubstitute 
    "Substitute in 'File Name: ' and the results of the expand command, on the 
    "current filename 
    execute "silent! 1," . 6 . "g/File Name:.*/s//File Name: " . expand("%") 
    execute "silent! 1," . 6 . "g/Last Modified:.*/s//Last Modified: " . strftime("%d-%m-%Y") 

    " This is where I'd put the command to start remembering movements again 

    call winrestview(b:winview) 
endfunction 

ответ

4

Вы можете использовать :keepjumps {command} в своем autocmd.

См. :help :keepjumps.

+0

Perfect. Благодарю. – ravron

+0

Примечание для тех, кто пытается реализовать это решение: требуется команда 'keepjumps', где происходит * фактическая модификация текста *, а именно в команде': s', выполняемой командой ': g':' execute ' молчать! 1, ". 6. "g/Имя файла:. */keepjumps s // Имя файла:". расширение ("%") '. – ravron

+0

Еще одно примечание: команда, написанная в предыдущем комментарии, не позволяет установить '' .'. Тем не менее, он все еще добавляет к jumplist. Чтобы предотвратить * это *, добавьте 'keepjumps' снова, сразу после' silent! '. – ravron

1

Могут быть более красивые способы сделать это, но как просто сохранить место в другом знаке? Например:

" This is where I'd put the command to ignore future movements 
" go to the mark and label it as z 
`.mz 

" This is where I'd put the command to start remembering movements again 
" return to your mark and create a fake edit there to reset the most recent edit mark 
`zi <Esc>x 
+0

Интересно. Я тоже рассматривал такое решение. Фактически, маркировка даже не понадобилась бы, так как 'winsaveview()' и позже 'winrestview()' сохраняют и восстанавливают позицию курсора. Более заметным моментом является «поддельное» редактирование, чтобы вернуть знак «.» В нужное место. Это должно сработать, но пока я собираюсь провести более «красивое» решение. Если ничего не появляется, вы получаете чек. +1 независимо. – ravron

3

Попробуйте :lockmarks <command> в вашем autocmd. Помощь в этом говорит о том, что '. является одной из вещей, которые не будут изменены командой.

+0

Я выбрал ответ, цитируя ': keepjumps' над': lockmarks', потому что эта команда казалась более ограниченной по охвату при выполнении поставленной цели. Спасибо хоть. – ravron

+0

@Riley Это имеет смысл. Спасибо, что задали вопрос; Я узнал кое-что. –

Смежные вопросы