Skip to main content
Small wording tweak
Source Link
dsimic
  • 252
  • 2
  • 7

This improved version mainly brings some vimscript-specific programming style improvements, such as using a script-local function and <SID> to avoid "polluting" the global space, and using <Cmd> for so-called "command mapping", which neatly executes commands without changing the current mode.

This improved version brings some vimscript-specific programming style improvements, such as using a script-local function and <SID> to avoid "polluting" the global space, and using <Cmd> for so-called "command mapping", which neatly executes commands without changing the current mode.

This improved version mainly brings some vimscript-specific programming style improvements, such as using a script-local function and <SID> to avoid "polluting" the global space, and using <Cmd> for so-called "command mapping", which neatly executes commands without changing the current mode.

Simplified a bit
Source Link
dsimic
  • 252
  • 2
  • 7

Here's the improved version of the vimscript code:

Here's the improved version of the vimscript code:

Here's the improved vimscript code:

Small wording improvement
Source Link
dsimic
  • 252
  • 2
  • 7

Below is an excerpt from my ~/.vimrc that contains the vimscript code I implemented by building upon the very good "remap nothing""no new mappings" idea from the already existing answer provided by @the_velour_fog.

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 brings some vimscript-specific programming style improvements, such as using a script-local function and <SID> to avoid "polluting" the global space, and using <Cmd> 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 version of the 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.

Below is an excerpt from my ~/.vimrc that contains the vimscript code I implemented by building upon the very good "remap nothing" idea from the already existing answer provided by @the_velour_fog.

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 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 provided by @the_velour_fog.

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 brings some vimscript-specific programming style improvements, such as using a script-local function and <SID> to avoid "polluting" the global space, and using <Cmd> 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 version of the 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.

Punctuation
Source Link
dsimic
  • 252
  • 2
  • 7
Loading
Clarified a bit further
Source Link
dsimic
  • 252
  • 2
  • 7
Loading
More readable
Source Link
dsimic
  • 252
  • 2
  • 7
Loading
Clarified further
Source Link
dsimic
  • 252
  • 2
  • 7
Loading
More wording
Source Link
dsimic
  • 252
  • 2
  • 7
Loading
Wording
Source Link
dsimic
  • 252
  • 2
  • 7
Loading
Wording
Source Link
dsimic
  • 252
  • 2
  • 7
Loading
Clarified further
Source Link
dsimic
  • 252
  • 2
  • 7
Loading
Wording improvements
Source Link
dsimic
  • 252
  • 2
  • 7
Loading
Formatting
Source Link
dsimic
  • 252
  • 2
  • 7
Loading
Small cleanups
Source Link
dsimic
  • 252
  • 2
  • 7
Loading
Cleaned up a bit
Source Link
dsimic
  • 252
  • 2
  • 7
Loading
Source Link
dsimic
  • 252
  • 2
  • 7
Loading