Vim Tips Wiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Tip 1218 Printable Monobook Previous Next

created 2006 · complexity intermediate · author Suresh Govindachar · version 6.0


In an operating system's command-line terminal, one can get a quick peek at a file using commands such as more, cat, head etc. In Vim, one way to peek at a file would be to open it in a new buffer -- but there is a way to peek at a file from Vim without having to open it in a buffer, browse it and close the buffer -- one can just view it in Vim's command line! This mode of viewing is facilitated by Vim version 7's support for scrolling (see :help new-scroll-back).

So to peek at a file, we just echo its contents (:help :echo).

Simple implementation:

One way to implement the idea would be:

:new|r <file_name>|1d|exec 'normal "ayG'|q!|echo @a

One could also do :echo system('cat foo.bat'), but we are trying to avoid explicit system calls. In version 7, Vim supports readfile(). But the result of readfile() is an array of lines -- and these lines would need to be joined to enable viewing; so we have:

:echo join(readfile('foo.bat'), "\n")

Applications:

Here are two applications that build on the idea presented here.

Yasuhiro Matsumoto's calendar utility script#52 is written to display the calendar in a buffer. For a quick peek at the calendar, one can modify the plugin to support echoing the calendar in Vim's command line, and make a simple map (such as of a RightMouse click) to trigger the display on the command line.

I have the following in my vimfiles\after\ftplugin\index.vim to speed up previewing emails using my mail user agent utility script#1052.

if(v:version < 700)
  nnoremap <buffer> <Space> :exec "let @a='r '.expand('%:p:h').'/'.substitute(
        \getline('.'),
  '\\(^.*\|\\s*\\)\\\|\\(\\s\\s*$\\)',
  '',
  'g')
        \\\|new\\|@a\\|1d\\|
        \silent exec 'normal\ d}\"ayG'\\|q!\\|echo\ @a"<CR>
else
  nnoremap <buffer> <Space> :exec "let alist=readfile(expand('%:p:h').'/'.
        \substitute(getline('.'),
  '\\(^.*\|\\s*\\)\\\|\\(\\s\\s*$\\)',
  '',
  'g')
        \)\\|
        \while(remove(alist, 0) != '')
        \\\|endwhile
        \\\|echo\
        \substitute(getline('.'),
  '\\(^.*\|\\s*\\)\\\|\\(\\s\\s*$\\)',
  '',
  'g').\"\n\n\"
        \\\|echo join(alist,\"\n\")"<CR>
endif

Comments

Most normal mode commands have a command line counterpart. For example,

exec 'normal "ayG'

could be replaced by

%yank a