1071d4279SBram Moolenaar" Vim script to work like "less" 2071d4279SBram Moolenaar" Maintainer: Bram Moolenaar <[email protected]> 3*4072ba57SBram Moolenaar" Last Change: 2020 Dec 17 4071d4279SBram Moolenaar 5071d4279SBram Moolenaar" Avoid loading this file twice, allow the user to define his own script. 6071d4279SBram Moolenaarif exists("loaded_less") 7071d4279SBram Moolenaar finish 8071d4279SBram Moolenaarendif 9071d4279SBram Moolenaarlet loaded_less = 1 10071d4279SBram Moolenaar 11071d4279SBram Moolenaar" If not reading from stdin, skip files that can't be read. 12071d4279SBram Moolenaar" Exit if there is no file at all. 13071d4279SBram Moolenaarif argc() > 0 14071d4279SBram Moolenaar let s:i = 0 15071d4279SBram Moolenaar while 1 16071d4279SBram Moolenaar if filereadable(argv(s:i)) 17071d4279SBram Moolenaar if s:i != 0 18071d4279SBram Moolenaar sleep 3 19071d4279SBram Moolenaar endif 20071d4279SBram Moolenaar break 21071d4279SBram Moolenaar endif 22071d4279SBram Moolenaar if isdirectory(argv(s:i)) 23071d4279SBram Moolenaar echomsg "Skipping directory " . argv(s:i) 24071d4279SBram Moolenaar elseif getftime(argv(s:i)) < 0 25071d4279SBram Moolenaar echomsg "Skipping non-existing file " . argv(s:i) 26071d4279SBram Moolenaar else 27071d4279SBram Moolenaar echomsg "Skipping unreadable file " . argv(s:i) 28071d4279SBram Moolenaar endif 29071d4279SBram Moolenaar echo "\n" 30071d4279SBram Moolenaar let s:i = s:i + 1 31071d4279SBram Moolenaar if s:i == argc() 32071d4279SBram Moolenaar quit 33071d4279SBram Moolenaar endif 34071d4279SBram Moolenaar next 35071d4279SBram Moolenaar endwhile 36071d4279SBram Moolenaarendif 37071d4279SBram Moolenaar 38*4072ba57SBram Moolenaar" we don't want 'compatible' here 39*4072ba57SBram Moolenaarif &cp 40071d4279SBram Moolenaar set nocp 41*4072ba57SBram Moolenaarendif 42*4072ba57SBram Moolenaar 43*4072ba57SBram Moolenaar" enable syntax highlighting if not done already 44*4072ba57SBram Moolenaarif !get(g:, 'syntax_on', 0) 45*4072ba57SBram Moolenaar syntax enable 46*4072ba57SBram Moolenaarendif 47*4072ba57SBram Moolenaar 48071d4279SBram Moolenaarset so=0 49071d4279SBram Moolenaarset hlsearch 50071d4279SBram Moolenaarset incsearch 51071d4279SBram Moolenaarnohlsearch 52071d4279SBram Moolenaar" Don't remember file names and positions 53071d4279SBram Moolenaarset viminfo= 54071d4279SBram Moolenaarset nows 55071d4279SBram Moolenaar" Inhibit screen updates while searching 56071d4279SBram Moolenaarlet s:lz = &lz 57071d4279SBram Moolenaarset lz 58071d4279SBram Moolenaar 59e392eb41SBram Moolenaar" Allow the user to define a function, which can set options specifically for 60e392eb41SBram Moolenaar" this script. 61e392eb41SBram Moolenaarif exists('*LessInitFunc') 62e392eb41SBram Moolenaar call LessInitFunc() 63e392eb41SBram Moolenaarendif 64e392eb41SBram Moolenaar 65071d4279SBram Moolenaar" Used after each command: put cursor at end and display position 66071d4279SBram Moolenaarif &wrap 67071d4279SBram Moolenaar noremap <SID>L L0:redraw<CR>:file<CR> 68071d4279SBram Moolenaar au VimEnter * normal! L0 69071d4279SBram Moolenaarelse 70071d4279SBram Moolenaar noremap <SID>L Lg0:redraw<CR>:file<CR> 71071d4279SBram Moolenaar au VimEnter * normal! Lg0 72071d4279SBram Moolenaarendif 73071d4279SBram Moolenaar 74071d4279SBram Moolenaar" When reading from stdin don't consider the file modified. 75071d4279SBram Moolenaarau VimEnter * set nomod 76071d4279SBram Moolenaar 77388a5d4fSBram Moolenaar" Can't modify the text or write the file. 78388a5d4fSBram Moolenaarset nomodifiable readonly 79071d4279SBram Moolenaar 80071d4279SBram Moolenaar" Give help 81071d4279SBram Moolenaarnoremap h :call <SID>Help()<CR> 82071d4279SBram Moolenaarmap H h 83071d4279SBram Moolenaarfun! s:Help() 84071d4279SBram Moolenaar echo "<Space> One page forward b One page backward" 85071d4279SBram Moolenaar echo "d Half a page forward u Half a page backward" 86071d4279SBram Moolenaar echo "<Enter> One line forward k One line backward" 87071d4279SBram Moolenaar echo "G End of file g Start of file" 88071d4279SBram Moolenaar echo "N% percentage in file" 89071d4279SBram Moolenaar echo "\n" 90071d4279SBram Moolenaar echo "/pattern Search for pattern ?pattern Search backward for pattern" 91071d4279SBram Moolenaar echo "n next pattern match N Previous pattern match" 92cd5c8f82SBram Moolenaar if &foldmethod != "manual" 93cd5c8f82SBram Moolenaar echo "\n" 94cd5c8f82SBram Moolenaar echo "zR open all folds zm increase fold level" 95cd5c8f82SBram Moolenaar endif 96071d4279SBram Moolenaar echo "\n" 97071d4279SBram Moolenaar echo ":n<Enter> Next file :p<Enter> Previous file" 98071d4279SBram Moolenaar echo "\n" 99071d4279SBram Moolenaar echo "q Quit v Edit file" 100071d4279SBram Moolenaar let i = input("Hit Enter to continue") 101071d4279SBram Moolenaarendfun 102071d4279SBram Moolenaar 103071d4279SBram Moolenaar" Scroll one page forward 104071d4279SBram Moolenaarnoremap <script> <Space> :call <SID>NextPage()<CR><SID>L 105071d4279SBram Moolenaarmap <C-V> <Space> 106071d4279SBram Moolenaarmap f <Space> 107071d4279SBram Moolenaarmap <C-F> <Space> 108e968e36aSBram Moolenaarmap <PageDown> <Space> 109e968e36aSBram Moolenaarmap <kPageDown> <Space> 110e968e36aSBram Moolenaarmap <S-Down> <Space> 111cd5c8f82SBram Moolenaar" If 'foldmethod' was changed keep the "z" commands, e.g. "zR" to open all 112cd5c8f82SBram Moolenaar" folds. 113cd5c8f82SBram Moolenaarif &foldmethod == "manual" 114071d4279SBram Moolenaar map z <Space> 115cd5c8f82SBram Moolenaarendif 116071d4279SBram Moolenaarmap <Esc><Space> <Space> 117071d4279SBram Moolenaarfun! s:NextPage() 118071d4279SBram Moolenaar if line(".") == line("$") 119071d4279SBram Moolenaar if argidx() + 1 >= argc() 1201aeaf8c0SBram Moolenaar " Don't quit at the end of the last file 1211aeaf8c0SBram Moolenaar return 122071d4279SBram Moolenaar endif 123071d4279SBram Moolenaar next 124071d4279SBram Moolenaar 1 125071d4279SBram Moolenaar else 126071d4279SBram Moolenaar exe "normal! \<C-F>" 127071d4279SBram Moolenaar endif 128071d4279SBram Moolenaarendfun 129071d4279SBram Moolenaar 130071d4279SBram Moolenaar" Re-read file and page forward "tail -f" 131071d4279SBram Moolenaarmap F :e<CR>G<SID>L:sleep 1<CR>F 132071d4279SBram Moolenaar 133071d4279SBram Moolenaar" Scroll half a page forward 134071d4279SBram Moolenaarnoremap <script> d <C-D><SID>L 135071d4279SBram Moolenaarmap <C-D> d 136071d4279SBram Moolenaar 137071d4279SBram Moolenaar" Scroll one line forward 138071d4279SBram Moolenaarnoremap <script> <CR> <C-E><SID>L 139071d4279SBram Moolenaarmap <C-N> <CR> 140071d4279SBram Moolenaarmap e <CR> 141071d4279SBram Moolenaarmap <C-E> <CR> 142071d4279SBram Moolenaarmap j <CR> 143071d4279SBram Moolenaarmap <C-J> <CR> 144e968e36aSBram Moolenaarmap <Down> <CR> 145071d4279SBram Moolenaar 146071d4279SBram Moolenaar" Scroll one page backward 147071d4279SBram Moolenaarnoremap <script> b <C-B><SID>L 148071d4279SBram Moolenaarmap <C-B> b 149e968e36aSBram Moolenaarmap <PageUp> b 150e968e36aSBram Moolenaarmap <kPageUp> b 151e968e36aSBram Moolenaarmap <S-Up> b 152071d4279SBram Moolenaarmap w b 153071d4279SBram Moolenaarmap <Esc>v b 154071d4279SBram Moolenaar 155071d4279SBram Moolenaar" Scroll half a page backward 156071d4279SBram Moolenaarnoremap <script> u <C-U><SID>L 157071d4279SBram Moolenaarnoremap <script> <C-U> <C-U><SID>L 158071d4279SBram Moolenaar 159071d4279SBram Moolenaar" Scroll one line backward 160071d4279SBram Moolenaarnoremap <script> k <C-Y><SID>L 161071d4279SBram Moolenaarmap y k 162071d4279SBram Moolenaarmap <C-Y> k 163071d4279SBram Moolenaarmap <C-P> k 164071d4279SBram Moolenaarmap <C-K> k 165e968e36aSBram Moolenaarmap <Up> k 166071d4279SBram Moolenaar 167071d4279SBram Moolenaar" Redraw 168071d4279SBram Moolenaarnoremap <script> r <C-L><SID>L 169071d4279SBram Moolenaarnoremap <script> <C-R> <C-L><SID>L 170071d4279SBram Moolenaarnoremap <script> R <C-L><SID>L 171071d4279SBram Moolenaar 172071d4279SBram Moolenaar" Start of file 173071d4279SBram Moolenaarnoremap <script> g gg<SID>L 174071d4279SBram Moolenaarmap < g 175071d4279SBram Moolenaarmap <Esc>< g 176e968e36aSBram Moolenaarmap <Home> g 177e968e36aSBram Moolenaarmap <kHome> g 178071d4279SBram Moolenaar 179071d4279SBram Moolenaar" End of file 180071d4279SBram Moolenaarnoremap <script> G G<SID>L 181071d4279SBram Moolenaarmap > G 182071d4279SBram Moolenaarmap <Esc>> G 183e968e36aSBram Moolenaarmap <End> G 184e968e36aSBram Moolenaarmap <kEnd> G 185071d4279SBram Moolenaar 186071d4279SBram Moolenaar" Go to percentage 187071d4279SBram Moolenaarnoremap <script> % %<SID>L 188071d4279SBram Moolenaarmap p % 189071d4279SBram Moolenaar 190071d4279SBram Moolenaar" Search 191071d4279SBram Moolenaarnoremap <script> / H$:call <SID>Forward()<CR>/ 192071d4279SBram Moolenaarif &wrap 193071d4279SBram Moolenaar noremap <script> ? H0:call <SID>Backward()<CR>? 194071d4279SBram Moolenaarelse 195071d4279SBram Moolenaar noremap <script> ? Hg0:call <SID>Backward()<CR>? 196071d4279SBram Moolenaarendif 197071d4279SBram Moolenaar 198071d4279SBram Moolenaarfun! s:Forward() 199071d4279SBram Moolenaar " Searching forward 200071d4279SBram Moolenaar noremap <script> n H$nzt<SID>L 201071d4279SBram Moolenaar if &wrap 202071d4279SBram Moolenaar noremap <script> N H0Nzt<SID>L 203071d4279SBram Moolenaar else 204071d4279SBram Moolenaar noremap <script> N Hg0Nzt<SID>L 205071d4279SBram Moolenaar endif 206c81e5e79SBram Moolenaar cnoremap <silent> <script> <CR> <CR>:cunmap <lt>CR><CR>zt<SID>L 207071d4279SBram Moolenaarendfun 208071d4279SBram Moolenaar 209071d4279SBram Moolenaarfun! s:Backward() 210071d4279SBram Moolenaar " Searching backward 211071d4279SBram Moolenaar if &wrap 212071d4279SBram Moolenaar noremap <script> n H0nzt<SID>L 213071d4279SBram Moolenaar else 214071d4279SBram Moolenaar noremap <script> n Hg0nzt<SID>L 215071d4279SBram Moolenaar endif 216071d4279SBram Moolenaar noremap <script> N H$Nzt<SID>L 217c81e5e79SBram Moolenaar cnoremap <silent> <script> <CR> <CR>:cunmap <lt>CR><CR>zt<SID>L 218071d4279SBram Moolenaarendfun 219071d4279SBram Moolenaar 220071d4279SBram Moolenaarcall s:Forward() 221e968e36aSBram Moolenaarcunmap <CR> 222071d4279SBram Moolenaar 223071d4279SBram Moolenaar" Quitting 224071d4279SBram Moolenaarnoremap q :q<CR> 225071d4279SBram Moolenaar 226071d4279SBram Moolenaar" Switch to editing (switch off less mode) 227071d4279SBram Moolenaarmap v :silent call <SID>End()<CR> 228071d4279SBram Moolenaarfun! s:End() 229071d4279SBram Moolenaar set ma 2301423b9d3SBram Moolenaar if exists('s:lz') 231071d4279SBram Moolenaar let &lz = s:lz 232071d4279SBram Moolenaar endif 233071d4279SBram Moolenaar unmap h 234071d4279SBram Moolenaar unmap H 235071d4279SBram Moolenaar unmap <Space> 236071d4279SBram Moolenaar unmap <C-V> 237071d4279SBram Moolenaar unmap f 238071d4279SBram Moolenaar unmap <C-F> 239071d4279SBram Moolenaar unmap z 240071d4279SBram Moolenaar unmap <Esc><Space> 241071d4279SBram Moolenaar unmap F 242071d4279SBram Moolenaar unmap d 243071d4279SBram Moolenaar unmap <C-D> 244071d4279SBram Moolenaar unmap <CR> 245071d4279SBram Moolenaar unmap <C-N> 246071d4279SBram Moolenaar unmap e 247071d4279SBram Moolenaar unmap <C-E> 248071d4279SBram Moolenaar unmap j 249071d4279SBram Moolenaar unmap <C-J> 250071d4279SBram Moolenaar unmap b 251071d4279SBram Moolenaar unmap <C-B> 252071d4279SBram Moolenaar unmap w 253071d4279SBram Moolenaar unmap <Esc>v 254071d4279SBram Moolenaar unmap u 255071d4279SBram Moolenaar unmap <C-U> 256071d4279SBram Moolenaar unmap k 257071d4279SBram Moolenaar unmap y 258071d4279SBram Moolenaar unmap <C-Y> 259071d4279SBram Moolenaar unmap <C-P> 260071d4279SBram Moolenaar unmap <C-K> 261071d4279SBram Moolenaar unmap r 262071d4279SBram Moolenaar unmap <C-R> 263071d4279SBram Moolenaar unmap R 264071d4279SBram Moolenaar unmap g 265071d4279SBram Moolenaar unmap < 266071d4279SBram Moolenaar unmap <Esc>< 267071d4279SBram Moolenaar unmap G 268071d4279SBram Moolenaar unmap > 269071d4279SBram Moolenaar unmap <Esc>> 270071d4279SBram Moolenaar unmap % 271071d4279SBram Moolenaar unmap p 272071d4279SBram Moolenaar unmap n 273071d4279SBram Moolenaar unmap N 274071d4279SBram Moolenaar unmap q 275071d4279SBram Moolenaar unmap v 276071d4279SBram Moolenaar unmap / 277071d4279SBram Moolenaar unmap ? 278e968e36aSBram Moolenaar unmap <Up> 279e968e36aSBram Moolenaar unmap <Down> 280e968e36aSBram Moolenaar unmap <PageDown> 281e968e36aSBram Moolenaar unmap <kPageDown> 282e968e36aSBram Moolenaar unmap <PageUp> 283e968e36aSBram Moolenaar unmap <kPageUp> 284e968e36aSBram Moolenaar unmap <S-Down> 285e968e36aSBram Moolenaar unmap <S-Up> 286e968e36aSBram Moolenaar unmap <Home> 287e968e36aSBram Moolenaar unmap <kHome> 288e968e36aSBram Moolenaar unmap <End> 289e968e36aSBram Moolenaar unmap <kEnd> 290071d4279SBram Moolenaarendfun 291071d4279SBram Moolenaar 292071d4279SBram Moolenaar" vim: sw=2 293