I would like to use the normal commands g, and g; more often to navigate through the change list.  The problem is I usually don't know how far I am in the change list from the edit I'm interested in and I have to repeat the commands many times to reach it.Usually, what I do is :use the Ex command :changeshit G to go to the bottom of the change list and see the latest editslook for the edit where I want to go and prepend the normal commands g, or g; with a countTo automate this process a little bit, I've come up with the following mapping:nnoremap <leader>g, :changes<cr>GBut the G part of the mapping doesn't seem to work, the beginning of the change list is displayed (with the oldest entries), while I want to see the newest entries from the bottom.How can I move inside vim's internal pager from a mapping ?
How to move inside vim's internal pager from a mapping?
key bindings;cursor movement
There is no way of accomplishing this by default.  However, you can capture the output of the :changes command with the :redir command and paste it into a new split buffer.  Here is my implementation:command! ChangeList call <SID>ChangeList()function! s:ChangeList() abort     Save z register    let l:oldz = @z     Redirect any output on the command line to register z    redir @z     Make the output of changes silent, though redir still captures it    silent! changes    redir END     Open scratch buffer in new split    new     Insert the contents of z into current buffer silently    silent! put z     Restore register z to previous value    let @z = l:oldz     Remove blank lines and superfluous greater-than symbol (silently)    silent! %g/^[\s>]*$/d     Go to end of file    $     Make the buffer not related to any sort of file, and will never be written    set buftype=nofile     Define the function MoveCursor() which will move the cursor     when we hit Enter on a line in the scratch buffer    function! s:MoveCursor() abort         Get line number of the entry in the change list        let l:lnum = split(getline('.'))[1]         Get column number of the entry in the change list        let l:col = split(getline('.'))[2]         Store new cursor position inside variable l:pos        let l:pos = [0, l:lnum, l:col, 0]         Close scratch buffer        wincmd q         Set cursor position        silent! call setpos('.', l:pos)    endfunction     Define local mapping to call the function MoveCursor() when we hit Enter    nnoremap <buffer> <silent> <return> :call <SID>MoveCursor()<cr>    endfunction Define mapping <leader>g, to call the ChangeList() functionnnoremap <silent> <leader>g, :call <SID>ChangeList()<cr>To move your cursor to a position stored in the change list:  hit <leader>g, to open a new window displaying the change listmove your cursor on the line showing the edit you are interested inhit EnterThe window should close and your cursor should move to the line and column which were stored in the change list.NOTE:You can put whatever options you want after set buftype=nofile, such as set nobuflisted.