less.vim (7978B)
1 " Vim script to work like "less" 2 " Maintainer: The Vim Project <https://github.com/vim/vim> 3 " Last Change: 2024 Feb 15 4 " Former Maintainer: Bram Moolenaar <Bram@vim.org> 5 6 " Avoid loading this file twice, allow the user to define his own script. 7 if exists("loaded_less") 8 finish 9 endif 10 let loaded_less = 1 11 12 " If not reading from stdin, skip files that can't be read. 13 " Exit if there is no file at all. 14 if argc() > 0 15 let s:i = 0 16 while 1 17 if filereadable(argv(s:i)) 18 if s:i != 0 19 sleep 3 20 endif 21 break 22 endif 23 if isdirectory(argv(s:i)) 24 echomsg "Skipping directory " . argv(s:i) 25 elseif getftime(argv(s:i)) < 0 26 echomsg "Skipping non-existing file " . argv(s:i) 27 else 28 echomsg "Skipping unreadable file " . argv(s:i) 29 endif 30 echo "\n" 31 let s:i = s:i + 1 32 if s:i == argc() 33 quit 34 endif 35 next 36 endwhile 37 endif 38 39 " we don't want 'compatible' here 40 if &cp 41 set nocp 42 endif 43 44 " enable syntax highlighting if not done already 45 if !get(g:, 'syntax_on', 0) 46 syntax enable 47 endif 48 49 set so=0 50 set hlsearch 51 set incsearch 52 nohlsearch 53 " Don't remember file names and positions 54 set shada= 55 set nows 56 " Inhibit screen updates while searching 57 let s:lz = &lz 58 set lz 59 60 " Allow the user to define a function, which can set options specifically for 61 " this script. 62 if exists('*LessInitFunc') 63 call LessInitFunc() 64 endif 65 66 " Used after each command: put cursor at end and display position 67 if &wrap 68 noremap <SID>L L0:redraw<CR>:file<CR> 69 au VimEnter * normal! L0 70 else 71 noremap <SID>L Lg0:redraw<CR>:file<CR> 72 au VimEnter * normal! Lg0 73 endif 74 75 " When reading from stdin don't consider the file modified. 76 au VimEnter * set nomod 77 78 " Can't modify the text or write the file. 79 set nomodifiable readonly 80 81 " Give help 82 noremap h :call <SID>Help()<CR> 83 map H h 84 fun! s:Help() 85 echo "<Space> One page forward b One page backward" 86 echo "d Half a page forward u Half a page backward" 87 echo "<Enter> One line forward k One line backward" 88 echo "G End of file g Start of file" 89 echo "N% percentage in file" 90 echo "\n" 91 echo "/pattern Search for pattern ?pattern Search backward for pattern" 92 echo "n next pattern match N Previous pattern match" 93 if &foldmethod != "manual" 94 echo "\n" 95 echo "zR open all folds zm increase fold level" 96 endif 97 echo "\n" 98 echo ":n<Enter> Next file :p<Enter> Previous file" 99 echo "\n" 100 echo "q Quit v Edit file" 101 let i = input("Hit Enter to continue") 102 endfun 103 104 " Scroll one page forward 105 noremap <script> <Space> :call <SID>NextPage()<CR><SID>L 106 map <C-V> <Space> 107 map f <Space> 108 map <C-F> <Space> 109 map <PageDown> <Space> 110 map <kPageDown> <Space> 111 map <S-Down> <Space> 112 " If 'foldmethod' was changed keep the "z" commands, e.g. "zR" to open all 113 " folds. 114 if &foldmethod == "manual" 115 map z <Space> 116 endif 117 map <Esc><Space> <Space> 118 fun! s:NextPage() 119 if line(".") == line("$") 120 if argidx() + 1 >= argc() 121 " Don't quit at the end of the last file 122 return 123 endif 124 next 125 1 126 else 127 exe "normal! \<C-F>" 128 endif 129 endfun 130 131 " Re-read file and page forward "tail -f" 132 map F :e<CR>G<SID>L:sleep 1<CR>F 133 134 " Scroll half a page forward 135 noremap <script> d <C-D><SID>L 136 map <C-D> d 137 138 " Scroll one line forward 139 noremap <script> <CR> <C-E><SID>L 140 map <C-N> <CR> 141 map e <CR> 142 map <C-E> <CR> 143 map j <CR> 144 map <C-J> <CR> 145 map <Down> <CR> 146 147 " Scroll one page backward 148 noremap <script> b <C-B><SID>L 149 map <C-B> b 150 map <PageUp> b 151 map <kPageUp> b 152 map <S-Up> b 153 map w b 154 map <Esc>v b 155 156 " Scroll half a page backward 157 noremap <script> u <C-U><SID>L 158 noremap <script> <C-U> <C-U><SID>L 159 160 " Scroll one line backward 161 noremap <script> k <C-Y><SID>L 162 map y k 163 map <C-Y> k 164 map <C-P> k 165 map <C-K> k 166 map <Up> k 167 168 " Redraw 169 noremap <script> r <C-L><SID>L 170 noremap <script> <C-R> <C-L><SID>L 171 noremap <script> R <C-L><SID>L 172 173 " Start of file 174 noremap <script> g gg<SID>L 175 map < g 176 map <Esc>< g 177 map <Home> g 178 map <kHome> g 179 180 " End of file 181 noremap <script> G G<SID>L 182 map > G 183 map <Esc>> G 184 map <End> G 185 map <kEnd> G 186 187 " Go to percentage 188 noremap <script> % %<SID>L 189 map p % 190 191 " Search 192 noremap <script> / H$:call <SID>Forward()<CR>/ 193 if &wrap 194 noremap <script> ? H0:call <SID>Backward()<CR>? 195 else 196 noremap <script> ? Hg0:call <SID>Backward()<CR>? 197 endif 198 199 fun! s:Forward() 200 " Searching forward 201 noremap <script> n H$nzt<SID>L 202 if &wrap 203 noremap <script> N H0Nzt<SID>L 204 else 205 noremap <script> N Hg0Nzt<SID>L 206 endif 207 cnoremap <silent> <script> <CR> <CR>:cunmap <lt>CR><CR>zt<SID>L 208 endfun 209 210 fun! s:Backward() 211 " Searching backward 212 if &wrap 213 noremap <script> n H0nzt<SID>L 214 else 215 noremap <script> n Hg0nzt<SID>L 216 endif 217 noremap <script> N H$Nzt<SID>L 218 cnoremap <silent> <script> <CR> <CR>:cunmap <lt>CR><CR>zt<SID>L 219 endfun 220 221 call s:Forward() 222 cunmap <CR> 223 224 " Quitting 225 noremap q :q<CR> 226 227 " Switch to editing (switch off less mode) 228 map v :silent call <SID>End()<CR> 229 fun! s:End() 230 set modifiable noreadonly 231 if exists('s:lz') 232 let &lz = s:lz 233 endif 234 if !empty(maparg('h')) 235 unmap h 236 endif 237 if !empty(maparg('H')) 238 unmap H 239 endif 240 if !empty(maparg('<Space>')) 241 unmap <Space> 242 endif 243 if !empty(maparg('<C-V>')) 244 unmap <C-V> 245 endif 246 if !empty(maparg('f')) 247 unmap f 248 endif 249 if !empty(maparg('<C-F>')) 250 unmap <C-F> 251 endif 252 if !empty(maparg('z')) 253 unmap z 254 endif 255 if !empty(maparg('<Esc><Space>')) 256 unmap <Esc><Space> 257 endif 258 if !empty(maparg('F')) 259 unmap F 260 endif 261 if !empty(maparg('d')) 262 unmap d 263 endif 264 if !empty(maparg('<C-D>')) 265 unmap <C-D> 266 endif 267 if !empty(maparg('<CR>')) 268 unmap <CR> 269 endif 270 if !empty(maparg('<C-N>')) 271 unmap <C-N> 272 endif 273 if !empty(maparg('e')) 274 unmap e 275 endif 276 if !empty(maparg('<C-E>')) 277 unmap <C-E> 278 endif 279 if !empty(maparg('j')) 280 unmap j 281 endif 282 if !empty(maparg('<C-J>')) 283 unmap <C-J> 284 endif 285 if !empty(maparg('b')) 286 unmap b 287 endif 288 if !empty(maparg('<C-B>')) 289 unmap <C-B> 290 endif 291 if !empty(maparg('w')) 292 unmap w 293 endif 294 if !empty(maparg('<Esc>v')) 295 unmap <Esc>v 296 endif 297 if !empty(maparg('u')) 298 unmap u 299 endif 300 if !empty(maparg('<C-U>')) 301 unmap <C-U> 302 endif 303 if !empty(maparg('k')) 304 unmap k 305 endif 306 if !empty(maparg('y')) 307 unmap y 308 endif 309 if !empty(maparg('<C-Y>')) 310 unmap <C-Y> 311 endif 312 if !empty(maparg('<C-P>')) 313 unmap <C-P> 314 endif 315 if !empty(maparg('<C-K>')) 316 unmap <C-K> 317 endif 318 if !empty(maparg('r')) 319 unmap r 320 endif 321 if !empty(maparg('<C-R>')) 322 unmap <C-R> 323 endif 324 if !empty(maparg('R')) 325 unmap R 326 endif 327 if !empty(maparg('g')) 328 unmap g 329 endif 330 if !empty(maparg('<')) 331 unmap < 332 endif 333 if !empty(maparg('<Esc><')) 334 unmap <Esc>< 335 endif 336 if !empty(maparg('G')) 337 unmap G 338 endif 339 if !empty(maparg('>')) 340 unmap > 341 endif 342 if !empty(maparg('<Esc>>')) 343 unmap <Esc>> 344 endif 345 if !empty(maparg('%')) 346 unmap % 347 endif 348 if !empty(maparg('p')) 349 unmap p 350 endif 351 if !empty(maparg('n')) 352 unmap n 353 endif 354 if !empty(maparg('N')) 355 unmap N 356 endif 357 if !empty(maparg('q')) 358 unmap q 359 endif 360 if !empty(maparg('v')) 361 unmap v 362 endif 363 if !empty(maparg('/')) 364 unmap / 365 endif 366 if !empty(maparg('?')) 367 unmap ? 368 endif 369 if !empty(maparg('<Up>')) 370 unmap <Up> 371 endif 372 if !empty(maparg('<Down>')) 373 unmap <Down> 374 endif 375 if !empty(maparg('<PageDown>')) 376 unmap <PageDown> 377 endif 378 if !empty(maparg('<kPageDown>')) 379 unmap <kPageDown> 380 endif 381 if !empty(maparg('<PageUp>')) 382 unmap <PageUp> 383 endif 384 if !empty(maparg('<kPageUp>')) 385 unmap <kPageUp> 386 endif 387 if !empty(maparg('<S-Down>')) 388 unmap <S-Down> 389 endif 390 if !empty(maparg('<S-Up>')) 391 unmap <S-Up> 392 endif 393 if !empty(maparg('<Home>')) 394 unmap <Home> 395 endif 396 if !empty(maparg('<kHome>')) 397 unmap <kHome> 398 endif 399 if !empty(maparg('<End>')) 400 unmap <End> 401 endif 402 if !empty(maparg('<kEnd>')) 403 unmap <kEnd> 404 endif 405 endfun 406 407 " vim: sw=2