10

I have a list of files

file1.ext
file2.ext
...

How do I create a file with file2.ext name if my cursor is inside file2.ext. Kind of like gf only for creating new files (this is a hypothetical situation, just thought might be helpful someday).

2 Answers 2

21

The first thing that comes to my mind is to use the touch command with the filename under the cursor as an argument:

:map <silent> <leader>cf :!touch <c-r><c-p><cr><cr>

But there is a pure Vim solution that is portable across platforms. The built-in function writefile writes the contents of a list to a file, line by line. Naturally, when the input list is empty, it creates an empty file. (See :help writefile() for details.) We can take advantage of this side-effect:

:map <silent> <leader>cf :call writefile([], expand("<cfile>"), "t")<cr>

Note that the filename extraction could be adjusted by using a different expand pattern (see :help expand()).

By the way, if one would like not to create a file, but just to open it for editing, one can define a simpler gf-like mapping:

:map <leader>gf :e <cfile><cr>

where the :e command can be replaced with :tabe or a similar command.

1
  • 1
    +1 for teaching <cfile> instead of <C-r><C-f>
    – sehe
    Commented Apr 29, 2011 at 8:39
2

I took the excellent answer by ib above and expanded it as follows. My goal was to use vim to create new markdown files as needed for a wiki (in this case a Gollum wiki)

I first tried:

map <silent> <leader>cf :call writefile([], expand("<cfile>"), "t")<cr>` 

the above does work as stated in the answer. However, at first I thought it was not working because I did not actually see the file opening in vim. Using the second bit of code below will open a new file - this is more what I was looking for. So I combined them and tried:

map <leader>cf :e <cfile><cr>

but that does not work for a wiki because when you try to create a new file in the wiki using syntax like [[the-new-file]] the wiki syntax does not allow for the extension of the file in the brackets. However, Vim needs to know the extension when creating a new file for this to work. In this case I used:

    map <leader>cf :e <cfile>.md<cr>

so I could create new markdown files. There are ways to further customize this (for example by not hardcoding the extension) but the above works fine for my needs. If I ever need another extension (for example to save a .wiki file) I will probably just take the simple route and make another map like:

    map <leader>cwf :e <cfile>.wiki<cr>

As a side benefit you can use the same command to open the already existing markdown file (the standard gf command will not work here because the file extension is missing).

1
  • 1
    gf works if set suffixesadd=.wiki. An improved version of your cf would be one that respects suffixesadd, at least in the case where it contains only one item.
    – hjdivad
    Commented Oct 28, 2013 at 20:25

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .