Hello,
I have summarized my posts today titled "Balloons", "File ->
register" and "Backslash in maps" as a vimtip
(www.vim.org/tips/tip.php?tip_id=1218) titled "Quick peak at
files"; the tip is also attached below.
--Suresh
Quick peak at files
In an operating system's command-line terminal, one can get a
quick peak at a file using commands such as more, cat, head etc.
In vim, one way to peak at a file would be to open it in a new
buffer -- but there is a way to peak 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 in vim version 7 by version 7's support for
scrolling (see :help scroll-back).
So to peak at a file, we just echo its contents (:help echo; info
on other commands mentioned here can be found likewise via :help).
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 results 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.
A) Yasuhiro Matsumoto's calendar utility
(www.vim.org/scripts/script.php?script_id=52) is written to
display the calendar in a buffer. For a quick peak 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!
B) I have the following in my vimfiles\after\ftplugin\index.vim
to speed up previewing emails using my mail user agent utility
(www.vim.org/scripts/script.php?script_id=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
Acknowledgment:
--------------
While the idea presented here is mine, people on the [email protected]
mailing list suggested alternate ways of implementing it and
helped with some implementation details (such as escaping |).
Happy vimming!
--Suresh