Below is an excerpt from my `~/.vimrc` that contains the vimscript code I implemented by building upon the very good "no new mappings" idea from the already [existing answer][1] provided by @the_velour_fog. I improved the idea and the implementation further to be almost something like "change nothing". Just hit <kbd>'</kbd> or <kbd>`</kbd> as usual, and you'll get the list to select a mark from, but nothing else changes, not even the error messages displayed when trying to jump to unset or unknown marks. Actually, if you press <kbd>'</kbd> + <kbd>a</kbd> quickly, for example, or even <kbd>'</kbd> + <kbd>Esc</kbd> depending on the configured [`ttimeoutlen`][2] value, you may even not notice the list of marks being displayed for a fraction of a second, but still have the desired jump operation performed or canceled, or the original error message displayed. That's how much the original behavior remains unchanged. Here's the vimscript code: ``` " Display a list of marks and allow their easy selection, without " remapping any keys or changing the original vim behavior, down " to the error messages produced for unknown marks " function ListSelect(command, jump) execute a:command echohl Question echo "Enter mark (ESC to cancel): " echohl NONE let mark = nr2char(getchar()) redraw if mark !=# "\e" try execute "normal! g" .. a:jump .. mark catch echohl ErrorMsg echo substitute(v:exception, "^Vim(.*):", "", "") echohl NONE endtry endif endfunction nnoremap <silent> ' :call ListSelect("marks", "'")<CR> nnoremap <silent> ` :call ListSelect("marks", "`")<CR> ``` As visible in the vimscript code and as already described above, this version retains the ability to use <kbd>Esc</kbd> to cancel the whole operation, and it still produces the same `E20: Mark not set` and `E78: Unknown mark` error messages, without throwing any "executing function failed" errors at the user. This version also produces a prompt message that looks just like all such messages produced by `vim` itself, furthering the "change nothing" approach. --- Below is an improved version of the above-provided vimscript code, which still follows the same "change nothing" approach. This improved version mainly brings some vimscript-specific programming style improvements, such as using a [script-local function][3] and [`<SID>`][4] to avoid "polluting" the global space, and using [`<Cmd>`][5] for so-called "command mapping", which neatly executes commands without changing the current mode. This version also extends its support to visual mode, which unfortunately requires a small workaround that's described further in the comments below. Here's the improved vimscript code: ``` " Display a list of the currently known marks and allow a mark to be " selected from the list easily, without mapping any additional keys " or changing the original vim behavior, down to still producing the " original error messages for non-existent marks " " NOTE: A workaround is required in visual mode to produce the right " error message, because the message isn't displayed if jumping " to the non-existent mark is actually executed in visual mode, " which all works as expected in normal mode " function s:SelectMark(command) execute "marks" echohl Question echo "Enter mark (ESC to cancel): " echohl NONE let mark = nr2char(getchar()) redraw if mark !=# "\e" try if mode("v:true") ==? "v" && line("'" .. mark) ==# 0 throw "E20: Mark not set" endif execute "normal! " .. a:command .. mark catch echohl ErrorMsg echo substitute(v:exception, "^Vim(.*):", "", "") echohl NONE endtry endif endfunction nnoremap ' <Cmd>call <SID>SelectMark("'")<CR> nnoremap ` <Cmd>call <SID>SelectMark("`")<CR> xnoremap ' <Cmd>call <SID>SelectMark("'")<CR> xnoremap ` <Cmd>call <SID>SelectMark("`")<CR> ``` I'll investigate further why the above-described workaround is needed, and possibly submit a patch for `vim` upstream. [1]: https://vi.stackexchange.com/a/9746/48490 [2]: https://vi.stackexchange.com/questions/24925/usage-of-timeoutlen-and-ttimeoutlen [3]: https://vimhelp.org/userfunc.txt.html#local-function [4]: https://vimhelp.org/map.txt.html#%3CSID%3E [5]: https://vimhelp.org/map.txt.html#%3CCmd%3E