9

That is, when you hit the marks operator key ` or ' you get a list of the available marks - i.e. the list vim gives from the ex command :marks. Then, when you press a letter to jump to the mark, you will be taken there - as usual. So if I want to jump to say mark m, with the normal mode command `m you would type:

  • `
  • the :marks window or similar would appear and you can see the available marks
  • m
  • cursor jumps to the m mark

For those people familiar with it, the ranger file manager already performs the exact way I would like vim to regarding the usage of marks. Ranger is terminal file explorer that uses vim key bindings and concepts, a ranger bookmark denotes a file and not a line and column position in a text file, but the concept is the same. Here is a screencast demonstration of ranger's marks feature that I want to make happen in vim.

Is it possible to do this in vim, or is there a plugin that does this?

  • Referring :marks and then pressing a character mark to move there itself is a simple thing. It can't be simplified further. You may use mappings for that. – SibiCoder Jun 25 '16 at 7:28
9

You can define a very simple custom mapping that lists the available marks and pre-populates the command-line with the right command stub, ready for you to type the desired mark name:

nnoremap <key> :<C-u>marks<CR>:normal! `

Note that this simply follows the same pattern as that famous mapping:

nnoremap <key> :ls<CR>:b<Space>

which can be expanded to other similar uses:

nnoremap <key> :undolist<CR>:u<Space>
| improve this answer | |
  • thanks, its working nicely! this is cool because you can also set, as well as call marks, with the marks list in front of you, thanks – the_velour_fog Jun 25 '16 at 9:31
2

This does exactly what my original question was

""""""""""""""""""""""""""""
" Ranger style marks command
"
""""""""""""""""""""""""""""
function! Marks()
    marks
    echo('Mark: ')

    " getchar() - prompts user for a single character and returns the chars
    " ascii representation
    " nr2char() - converts ASCII `NUMBER TO CHAR'

    let s:mark = nr2char(getchar())
    " remove the `press any key prompt'
    redraw

    " build a string which uses the `normal' command plus the var holding the
    " mark - then eval it.
    execute "normal! '" . s:mark
endfunction

nnoremap ' :call Marks()<CR>

This doesn't change the usage of using marks, i.e. setting then jumping to a mark, it simply displays the :marks listing when you hit the ' character for jumping to the mark.
Most of the time you will ignore it because you don't need the visual aid and its slower to look at something visually, but when you want a reference its there and it doesn't cost you anything in terms of learning a new mapping, extra keystrokes etc.

| improve this answer | |
2

A variation on your own response is to install fzf.vim and then bind to :Marks, e.g.:

nnoremap ` :Marks<CR>

This has the benefit that it will show up in fzf's fuzzy search window.

(Caveat: It does require pressing <Enter> after you've found the item.)

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.