less.vim 7.8 KB

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