diff options
Diffstat (limited to '')
-rw-r--r-- | runtime/macros/less.vim | 292 |
1 files changed, 292 insertions, 0 deletions
diff --git a/runtime/macros/less.vim b/runtime/macros/less.vim new file mode 100644 index 0000000..17433f4 --- /dev/null +++ b/runtime/macros/less.vim @@ -0,0 +1,292 @@ +" Vim script to work like "less" +" Maintainer: Bram Moolenaar <Bram@vim.org> +" Last Change: 2020 Dec 17 + +" Avoid loading this file twice, allow the user to define his own script. +if exists("loaded_less") + finish +endif +let loaded_less = 1 + +" If not reading from stdin, skip files that can't be read. +" Exit if there is no file at all. +if argc() > 0 + let s:i = 0 + while 1 + if filereadable(argv(s:i)) + if s:i != 0 + sleep 3 + endif + break + endif + if isdirectory(argv(s:i)) + echomsg "Skipping directory " . argv(s:i) + elseif getftime(argv(s:i)) < 0 + echomsg "Skipping non-existing file " . argv(s:i) + else + echomsg "Skipping unreadable file " . argv(s:i) + endif + echo "\n" + let s:i = s:i + 1 + if s:i == argc() + quit + endif + next + endwhile +endif + +" we don't want 'compatible' here +if &cp + set nocp +endif + +" enable syntax highlighting if not done already +if !get(g:, 'syntax_on', 0) + syntax enable +endif + +set so=0 +set hlsearch +set incsearch +nohlsearch +" Don't remember file names and positions +set viminfo= +set nows +" Inhibit screen updates while searching +let s:lz = &lz +set lz + +" Allow the user to define a function, which can set options specifically for +" this script. +if exists('*LessInitFunc') + call LessInitFunc() +endif + +" Used after each command: put cursor at end and display position +if &wrap + noremap <SID>L L0:redraw<CR>:file<CR> + au VimEnter * normal! L0 +else + noremap <SID>L Lg0:redraw<CR>:file<CR> + au VimEnter * normal! Lg0 +endif + +" When reading from stdin don't consider the file modified. +au VimEnter * set nomod + +" Can't modify the text or write the file. +set nomodifiable readonly + +" Give help +noremap h :call <SID>Help()<CR> +map H h +fun! s:Help() + echo "<Space> One page forward b One page backward" + echo "d Half a page forward u Half a page backward" + echo "<Enter> One line forward k One line backward" + echo "G End of file g Start of file" + echo "N% percentage in file" + echo "\n" + echo "/pattern Search for pattern ?pattern Search backward for pattern" + echo "n next pattern match N Previous pattern match" + if &foldmethod != "manual" + echo "\n" + echo "zR open all folds zm increase fold level" + endif + echo "\n" + echo ":n<Enter> Next file :p<Enter> Previous file" + echo "\n" + echo "q Quit v Edit file" + let i = input("Hit Enter to continue") +endfun + +" Scroll one page forward +noremap <script> <Space> :call <SID>NextPage()<CR><SID>L +map <C-V> <Space> +map f <Space> +map <C-F> <Space> +map <PageDown> <Space> +map <kPageDown> <Space> +map <S-Down> <Space> +" If 'foldmethod' was changed keep the "z" commands, e.g. "zR" to open all +" folds. +if &foldmethod == "manual" + map z <Space> +endif +map <Esc><Space> <Space> +fun! s:NextPage() + if line(".") == line("$") + if argidx() + 1 >= argc() + " Don't quit at the end of the last file + return + endif + next + 1 + else + exe "normal! \<C-F>" + endif +endfun + +" Re-read file and page forward "tail -f" +map F :e<CR>G<SID>L:sleep 1<CR>F + +" Scroll half a page forward +noremap <script> d <C-D><SID>L +map <C-D> d + +" Scroll one line forward +noremap <script> <CR> <C-E><SID>L +map <C-N> <CR> +map e <CR> +map <C-E> <CR> +map j <CR> +map <C-J> <CR> +map <Down> <CR> + +" Scroll one page backward +noremap <script> b <C-B><SID>L +map <C-B> b +map <PageUp> b +map <kPageUp> b +map <S-Up> b +map w b +map <Esc>v b + +" Scroll half a page backward +noremap <script> u <C-U><SID>L +noremap <script> <C-U> <C-U><SID>L + +" Scroll one line backward +noremap <script> k <C-Y><SID>L +map y k +map <C-Y> k +map <C-P> k +map <C-K> k +map <Up> k + +" Redraw +noremap <script> r <C-L><SID>L +noremap <script> <C-R> <C-L><SID>L +noremap <script> R <C-L><SID>L + +" Start of file +noremap <script> g gg<SID>L +map < g +map <Esc>< g +map <Home> g +map <kHome> g + +" End of file +noremap <script> G G<SID>L +map > G +map <Esc>> G +map <End> G +map <kEnd> G + +" Go to percentage +noremap <script> % %<SID>L +map p % + +" Search +noremap <script> / H$:call <SID>Forward()<CR>/ +if &wrap + noremap <script> ? H0:call <SID>Backward()<CR>? +else + noremap <script> ? Hg0:call <SID>Backward()<CR>? +endif + +fun! s:Forward() + " Searching forward + noremap <script> n H$nzt<SID>L + if &wrap + noremap <script> N H0Nzt<SID>L + else + noremap <script> N Hg0Nzt<SID>L + endif + cnoremap <silent> <script> <CR> <CR>:cunmap <lt>CR><CR>zt<SID>L +endfun + +fun! s:Backward() + " Searching backward + if &wrap + noremap <script> n H0nzt<SID>L + else + noremap <script> n Hg0nzt<SID>L + endif + noremap <script> N H$Nzt<SID>L + cnoremap <silent> <script> <CR> <CR>:cunmap <lt>CR><CR>zt<SID>L +endfun + +call s:Forward() +cunmap <CR> + +" Quitting +noremap q :q<CR> + +" Switch to editing (switch off less mode) +map v :silent call <SID>End()<CR> +fun! s:End() + set ma + if exists('s:lz') + let &lz = s:lz + endif + unmap h + unmap H + unmap <Space> + unmap <C-V> + unmap f + unmap <C-F> + unmap z + unmap <Esc><Space> + unmap F + unmap d + unmap <C-D> + unmap <CR> + unmap <C-N> + unmap e + unmap <C-E> + unmap j + unmap <C-J> + unmap b + unmap <C-B> + unmap w + unmap <Esc>v + unmap u + unmap <C-U> + unmap k + unmap y + unmap <C-Y> + unmap <C-P> + unmap <C-K> + unmap r + unmap <C-R> + unmap R + unmap g + unmap < + unmap <Esc>< + unmap G + unmap > + unmap <Esc>> + unmap % + unmap p + unmap n + unmap N + unmap q + unmap v + unmap / + unmap ? + unmap <Up> + unmap <Down> + unmap <PageDown> + unmap <kPageDown> + unmap <PageUp> + unmap <kPageUp> + unmap <S-Down> + unmap <S-Up> + unmap <Home> + unmap <kHome> + unmap <End> + unmap <kEnd> +endfun + +" vim: sw=2 |