xref: /vim-8.2.3635/runtime/macros/less.vim (revision 4072ba57)
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