7

I'm trying to write a simple mapping that will pre-populate the vim ex command line but leave the user there to execute the command on their own.

The use-case is for the user to type <leader>/foo which would then open the command line with :e **/foo and the user could either further refine, press ctrl-d to see possible matches, etc

1
  • For those who come to this question searching for how to preserve a trailing whitespace in the mapping, the answer is here.
    – Enlico
    Commented Aug 21, 2020 at 12:28

2 Answers 2

9

That kind of mapping is very, very common:

nnoremap <leader>/ :edit **/*

:edit

Might I suggest the following slightly smarter alternative?

set path=.,**
nnoremap <leader>/ :find *

The 'path' option tells Vim to look for files matching the argument given to :find in the directory of the file associated with the current buffer and any subdirectory of the working directory.

Reference:

:help :find
:help 'path'
5
  • Thanks, that worked. Why would :find be superior to :edit in this case? Is it because you can pre-filter out matches with "path" while :edit will just search for everything? Commented May 31, 2015 at 14:26
  • 1
    Yes. With :edit **/foo, your are somewhat restricted to files located below the working directory. With :find, you are restricted to the directories specified in 'path', which may or may not be under the working directory.
    – romainl
    Commented May 31, 2015 at 14:30
  • A quick question about this, why is a * necessary at the end of the find command? I tried using that, and when I hit tab after typing a few characters in, it shows the results, then removes the star. Commented May 31, 2015 at 16:39
  • 1
    @EvergreenTree, :find bar only finds files whose name starts with bar but :find *bar also finds files containing bar anywhere in their name. Note that this rule also applies to :edit and all related commands.
    – romainl
    Commented May 31, 2015 at 16:55
  • Ah, that makes sense. Commented May 31, 2015 at 21:05
2

You may also want to check :h :map-<expr>. While admittedly in this case it would be overkill, it enables mappings of the following type:

function! PopulateFooMap(c)
  let dict = { "r":"bar", "z":"baz" }
  return ":e **/" . get(dict, a:c, a:c)
endfunction

" very powerful
nnoremap <expr> <leader>/ PopulateFooMap(nr2char(getchar()))

" but this would still take precedence
nnoremap <leader>/f :e **/foo

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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