Mercurial > vim
annotate runtime/ftplugin/man.vim @ 21417:53ff4dfe6e11 v8.2.1259
patch 8.2.1259: empty group in 'tabline' may cause using an invalid pointer
Commit: https://github.com/vim/vim/commit/f56c95fdad5af521887f8cd7bc15729b5355231d
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Jul 21 19:25:18 2020 +0200
patch 8.2.1259: empty group in 'tabline' may cause using an invalid pointer
Problem: Empty group in 'tabline' may cause using an invalid pointer.
Solution: Set the group start position. (closes https://github.com/vim/vim/issues/6505)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Tue, 21 Jul 2020 19:30:04 +0200 |
parents | 661eb972cb22 |
children | 5b7ea82bc18f |
rev | line source |
---|---|
7 | 1 " Vim filetype plugin file |
2 " Language: man | |
20241 | 3 " Maintainer: Jason Franklin <vim@justemail.net> |
20317 | 4 " Maintainer: SungHyun Nam <goweol@gmail.com> |
20753 | 5 " Last Change: 2020 Jun 01 |
7 | 6 |
7 " To make the ":Man" command available before editing a manual page, source | |
8 " this script from your startup vimrc file. | |
9 | |
10 " If 'filetype' isn't "man", we must have been called to only define ":Man". | |
11 if &filetype == "man" | |
12 | |
13 " Only do this when not done yet for this buffer | |
14 if exists("b:did_ftplugin") | |
15 finish | |
16 endif | |
17 let b:did_ftplugin = 1 | |
14421 | 18 endif |
7 | 19 |
14421 | 20 let s:cpo_save = &cpo |
21 set cpo-=C | |
22 | |
23 if &filetype == "man" | |
7 | 24 " allow dot and dash in manual page name. |
25 setlocal iskeyword+=\.,- | |
14421 | 26 let b:undo_ftplugin = "setlocal iskeyword<" |
7 | 27 |
28 " Add mappings, unless the user didn't want this. | |
29 if !exists("no_plugin_maps") && !exists("no_man_maps") | |
30 if !hasmapto('<Plug>ManBS') | |
31 nmap <buffer> <LocalLeader>h <Plug>ManBS | |
14421 | 32 let b:undo_ftplugin = b:undo_ftplugin |
33 \ . '|silent! nunmap <buffer> <LocalLeader>h' | |
7 | 34 endif |
816 | 35 nnoremap <buffer> <Plug>ManBS :%s/.\b//g<CR>:setl nomod<CR>'' |
7 | 36 |
20753 | 37 nnoremap <buffer> <silent> <c-]> :call <SID>PreGetPage(v:count)<CR> |
38 nnoremap <buffer> <silent> <c-t> :call <SID>PopPage()<CR> | |
7272
17333ebd2bbd
commit https://github.com/vim/vim/commit/d042dc825c9b97dacd84d4728f88300da4d5b6b9
Christian Brabandt <cb@256bit.org>
parents:
6476
diff
changeset
|
39 nnoremap <buffer> <silent> q :q<CR> |
14421 | 40 |
41 " Add undo commands for the maps | |
42 let b:undo_ftplugin = b:undo_ftplugin | |
43 \ . '|silent! nunmap <buffer> <Plug>ManBS' | |
44 \ . '|silent! nunmap <buffer> <c-]>' | |
45 \ . '|silent! nunmap <buffer> <c-t>' | |
46 \ . '|silent! nunmap <buffer> q' | |
7272
17333ebd2bbd
commit https://github.com/vim/vim/commit/d042dc825c9b97dacd84d4728f88300da4d5b6b9
Christian Brabandt <cb@256bit.org>
parents:
6476
diff
changeset
|
47 endif |
17333ebd2bbd
commit https://github.com/vim/vim/commit/d042dc825c9b97dacd84d4728f88300da4d5b6b9
Christian Brabandt <cb@256bit.org>
parents:
6476
diff
changeset
|
48 |
17333ebd2bbd
commit https://github.com/vim/vim/commit/d042dc825c9b97dacd84d4728f88300da4d5b6b9
Christian Brabandt <cb@256bit.org>
parents:
6476
diff
changeset
|
49 if exists('g:ft_man_folding_enable') && (g:ft_man_folding_enable == 1) |
17333ebd2bbd
commit https://github.com/vim/vim/commit/d042dc825c9b97dacd84d4728f88300da4d5b6b9
Christian Brabandt <cb@256bit.org>
parents:
6476
diff
changeset
|
50 setlocal foldmethod=indent foldnestmax=1 foldenable |
14421 | 51 let b:undo_ftplugin = b:undo_ftplugin |
52 \ . '|silent! setl fdm< fdn< fen<' | |
7 | 53 endif |
54 | |
55 endif | |
56 | |
57 if exists(":Man") != 2 | |
14421 | 58 com -nargs=+ -complete=shellcmd Man call s:GetPage(<q-mods>, <f-args>) |
7 | 59 nmap <Leader>K :call <SID>PreGetPage(0)<CR> |
10548 | 60 nmap <Plug>ManPreGetPage :call <SID>PreGetPage(0)<CR> |
7 | 61 endif |
62 | |
63 " Define functions only once. | |
64 if !exists("s:man_tag_depth") | |
65 | |
66 let s:man_tag_depth = 0 | |
67 | |
1623 | 68 let s:man_sect_arg = "" |
69 let s:man_find_arg = "-w" | |
70 try | |
71 if !has("win32") && $OSTYPE !~ 'cygwin\|linux' && system('uname -s') =~ "SunOS" && system('uname -r') =~ "^5" | |
72 let s:man_sect_arg = "-s" | |
73 let s:man_find_arg = "-l" | |
74 endif | |
75 catch /E145:/ | |
76 " Ignore the error in restricted mode | |
77 endtry | |
7 | 78 |
79 func <SID>PreGetPage(cnt) | |
80 if a:cnt == 0 | |
81 let old_isk = &iskeyword | |
6369 | 82 if &ft == 'man' |
83 setl iskeyword+=(,) | |
84 endif | |
7 | 85 let str = expand("<cword>") |
86 let &l:iskeyword = old_isk | |
87 let page = substitute(str, '(*\(\k\+\).*', '\1', '') | |
88 let sect = substitute(str, '\(\k\+\)(\([^()]*\)).*', '\2', '') | |
89 if match(sect, '^[0-9 ]\+$') == -1 | |
90 let sect = "" | |
91 endif | |
92 if sect == page | |
93 let sect = "" | |
94 endif | |
95 else | |
96 let sect = a:cnt | |
97 let page = expand("<cword>") | |
98 endif | |
19813 | 99 call s:GetPage('', sect, page) |
7 | 100 endfunc |
101 | |
102 func <SID>GetCmdArg(sect, page) | |
103 if a:sect == '' | |
104 return a:page | |
105 endif | |
106 return s:man_sect_arg.' '.a:sect.' '.a:page | |
107 endfunc | |
108 | |
109 func <SID>FindPage(sect, page) | |
10734 | 110 let where = system("man ".s:man_find_arg.' '.s:GetCmdArg(a:sect, a:page)) |
7 | 111 if where !~ "^/" |
112 if matchstr(where, " [^ ]*$") !~ "^ /" | |
113 return 0 | |
114 endif | |
115 endif | |
116 return 1 | |
117 endfunc | |
118 | |
14421 | 119 func <SID>GetPage(cmdmods, ...) |
7 | 120 if a:0 >= 2 |
121 let sect = a:1 | |
122 let page = a:2 | |
123 elseif a:0 >= 1 | |
124 let sect = "" | |
125 let page = a:1 | |
126 else | |
127 return | |
128 endif | |
129 | |
130 " To support: nmap K :Man <cword> | |
131 if page == '<cword>' | |
132 let page = expand('<cword>') | |
133 endif | |
134 | |
18186 | 135 if !exists('g:ft_man_no_sect_fallback') || (g:ft_man_no_sect_fallback == 0) |
136 if sect != "" && s:FindPage(sect, page) == 0 | |
137 let sect = "" | |
138 endif | |
7 | 139 endif |
140 if s:FindPage(sect, page) == 0 | |
20753 | 141 let msg = 'man.vim: no manual entry for "' . page . '"' |
142 if !empty(sect) | |
143 let msg .= ' in section ' . sect | |
18186 | 144 endif |
20753 | 145 echomsg msg |
7 | 146 return |
147 endif | |
148 exec "let s:man_tag_buf_".s:man_tag_depth." = ".bufnr("%") | |
149 exec "let s:man_tag_lin_".s:man_tag_depth." = ".line(".") | |
150 exec "let s:man_tag_col_".s:man_tag_depth." = ".col(".") | |
151 let s:man_tag_depth = s:man_tag_depth + 1 | |
152 | |
17470
d2a834aa7cc0
patch 8.1.1733: the man ftplugin leaves an empty buffer behind
Bram Moolenaar <Bram@vim.org>
parents:
15640
diff
changeset
|
153 let open_cmd = 'edit' |
d2a834aa7cc0
patch 8.1.1733: the man ftplugin leaves an empty buffer behind
Bram Moolenaar <Bram@vim.org>
parents:
15640
diff
changeset
|
154 |
7 | 155 " Use an existing "man" window if it exists, otherwise open a new one. |
156 if &filetype != "man" | |
157 let thiswin = winnr() | |
158 exe "norm! \<C-W>b" | |
1125 | 159 if winnr() > 1 |
7 | 160 exe "norm! " . thiswin . "\<C-W>w" |
161 while 1 | |
162 if &filetype == "man" | |
163 break | |
164 endif | |
165 exe "norm! \<C-W>w" | |
166 if thiswin == winnr() | |
167 break | |
168 endif | |
169 endwhile | |
170 endif | |
1125 | 171 if &filetype != "man" |
9326
cd9c4bbe1d03
commit https://github.com/vim/vim/commit/ddf8d1c746ee081d15c9d7e0515f6ac43adbf363
Christian Brabandt <cb@256bit.org>
parents:
7992
diff
changeset
|
172 if exists("g:ft_man_open_mode") |
17470
d2a834aa7cc0
patch 8.1.1733: the man ftplugin leaves an empty buffer behind
Bram Moolenaar <Bram@vim.org>
parents:
15640
diff
changeset
|
173 if g:ft_man_open_mode == 'vert' |
d2a834aa7cc0
patch 8.1.1733: the man ftplugin leaves an empty buffer behind
Bram Moolenaar <Bram@vim.org>
parents:
15640
diff
changeset
|
174 let open_cmd = 'vsplit' |
d2a834aa7cc0
patch 8.1.1733: the man ftplugin leaves an empty buffer behind
Bram Moolenaar <Bram@vim.org>
parents:
15640
diff
changeset
|
175 elseif g:ft_man_open_mode == 'tab' |
d2a834aa7cc0
patch 8.1.1733: the man ftplugin leaves an empty buffer behind
Bram Moolenaar <Bram@vim.org>
parents:
15640
diff
changeset
|
176 let open_cmd = 'tabedit' |
9326
cd9c4bbe1d03
commit https://github.com/vim/vim/commit/ddf8d1c746ee081d15c9d7e0515f6ac43adbf363
Christian Brabandt <cb@256bit.org>
parents:
7992
diff
changeset
|
177 else |
17470
d2a834aa7cc0
patch 8.1.1733: the man ftplugin leaves an empty buffer behind
Bram Moolenaar <Bram@vim.org>
parents:
15640
diff
changeset
|
178 let open_cmd = 'split' |
9326
cd9c4bbe1d03
commit https://github.com/vim/vim/commit/ddf8d1c746ee081d15c9d7e0515f6ac43adbf363
Christian Brabandt <cb@256bit.org>
parents:
7992
diff
changeset
|
179 endif |
cd9c4bbe1d03
commit https://github.com/vim/vim/commit/ddf8d1c746ee081d15c9d7e0515f6ac43adbf363
Christian Brabandt <cb@256bit.org>
parents:
7992
diff
changeset
|
180 else |
17470
d2a834aa7cc0
patch 8.1.1733: the man ftplugin leaves an empty buffer behind
Bram Moolenaar <Bram@vim.org>
parents:
15640
diff
changeset
|
181 let open_cmd = a:cmdmods . ' split' |
9326
cd9c4bbe1d03
commit https://github.com/vim/vim/commit/ddf8d1c746ee081d15c9d7e0515f6ac43adbf363
Christian Brabandt <cb@256bit.org>
parents:
7992
diff
changeset
|
182 endif |
1125 | 183 endif |
7 | 184 endif |
17470
d2a834aa7cc0
patch 8.1.1733: the man ftplugin leaves an empty buffer behind
Bram Moolenaar <Bram@vim.org>
parents:
15640
diff
changeset
|
185 |
d2a834aa7cc0
patch 8.1.1733: the man ftplugin leaves an empty buffer behind
Bram Moolenaar <Bram@vim.org>
parents:
15640
diff
changeset
|
186 silent execute open_cmd . " $HOME/" . page . '.' . sect . '~' |
d2a834aa7cc0
patch 8.1.1733: the man ftplugin leaves an empty buffer behind
Bram Moolenaar <Bram@vim.org>
parents:
15640
diff
changeset
|
187 |
7 | 188 " Avoid warning for editing the dummy file twice |
816 | 189 setl buftype=nofile noswapfile |
7 | 190 |
17541
d9aa921b7198
patch 8.1.1768: man plugin changes setting in current window
Bram Moolenaar <Bram@vim.org>
parents:
17470
diff
changeset
|
191 setl fdc=0 ma nofen nonu nornu |
20025
18043e7ab449
patch 8.2.0568: the man filetype plugin overwrites the unnamed register
Bram Moolenaar <Bram@vim.org>
parents:
19968
diff
changeset
|
192 %delete _ |
9326
cd9c4bbe1d03
commit https://github.com/vim/vim/commit/ddf8d1c746ee081d15c9d7e0515f6ac43adbf363
Christian Brabandt <cb@256bit.org>
parents:
7992
diff
changeset
|
193 let unsetwidth = 0 |
7992
78106b0f2c56
commit https://github.com/vim/vim/commit/cbebd4879cc78e670d79b2c57dc33d7b911c962a
Christian Brabandt <cb@256bit.org>
parents:
7272
diff
changeset
|
194 if empty($MANWIDTH) |
78106b0f2c56
commit https://github.com/vim/vim/commit/cbebd4879cc78e670d79b2c57dc33d7b911c962a
Christian Brabandt <cb@256bit.org>
parents:
7272
diff
changeset
|
195 let $MANWIDTH = winwidth(0) |
9326
cd9c4bbe1d03
commit https://github.com/vim/vim/commit/ddf8d1c746ee081d15c9d7e0515f6ac43adbf363
Christian Brabandt <cb@256bit.org>
parents:
7992
diff
changeset
|
196 let unsetwidth = 1 |
7992
78106b0f2c56
commit https://github.com/vim/vim/commit/cbebd4879cc78e670d79b2c57dc33d7b911c962a
Christian Brabandt <cb@256bit.org>
parents:
7272
diff
changeset
|
197 endif |
12826 | 198 |
199 " Ensure Vim is not recursively invoked (man-db does this) when doing ctrl-[ | |
200 " on a man page reference by unsetting MANPAGER. | |
13125 | 201 " Some versions of env(1) do not support the '-u' option, and in such case |
202 " we set MANPAGER=cat. | |
203 if !exists('s:env_has_u') | |
204 call system('env -u x true') | |
205 let s:env_has_u = (v:shell_error == 0) | |
206 endif | |
207 let env_cmd = s:env_has_u ? 'env -u MANPAGER' : 'env MANPAGER=cat' | |
19968 | 208 let env_cmd .= ' GROFF_NO_SGR=1' |
20317 | 209 let man_cmd = env_cmd . ' man ' . s:GetCmdArg(sect, page) . ' | col -b' |
13125 | 210 silent exec "r !" . man_cmd |
12826 | 211 |
9326
cd9c4bbe1d03
commit https://github.com/vim/vim/commit/ddf8d1c746ee081d15c9d7e0515f6ac43adbf363
Christian Brabandt <cb@256bit.org>
parents:
7992
diff
changeset
|
212 if unsetwidth |
cd9c4bbe1d03
commit https://github.com/vim/vim/commit/ddf8d1c746ee081d15c9d7e0515f6ac43adbf363
Christian Brabandt <cb@256bit.org>
parents:
7992
diff
changeset
|
213 let $MANWIDTH = '' |
cd9c4bbe1d03
commit https://github.com/vim/vim/commit/ddf8d1c746ee081d15c9d7e0515f6ac43adbf363
Christian Brabandt <cb@256bit.org>
parents:
7992
diff
changeset
|
214 endif |
7 | 215 " Remove blank lines from top and bottom. |
15640 | 216 while line('$') > 1 && getline(1) =~ '^\s*$' |
20025
18043e7ab449
patch 8.2.0568: the man filetype plugin overwrites the unnamed register
Bram Moolenaar <Bram@vim.org>
parents:
19968
diff
changeset
|
217 1delete _ |
7 | 218 endwhile |
15640 | 219 while line('$') > 1 && getline('$') =~ '^\s*$' |
20025
18043e7ab449
patch 8.2.0568: the man filetype plugin overwrites the unnamed register
Bram Moolenaar <Bram@vim.org>
parents:
19968
diff
changeset
|
220 $delete _ |
7 | 221 endwhile |
222 1 | |
223 setl ft=man nomod | |
224 setl bufhidden=hide | |
225 setl nobuflisted | |
9326
cd9c4bbe1d03
commit https://github.com/vim/vim/commit/ddf8d1c746ee081d15c9d7e0515f6ac43adbf363
Christian Brabandt <cb@256bit.org>
parents:
7992
diff
changeset
|
226 setl noma |
7 | 227 endfunc |
228 | |
229 func <SID>PopPage() | |
230 if s:man_tag_depth > 0 | |
231 let s:man_tag_depth = s:man_tag_depth - 1 | |
232 exec "let s:man_tag_buf=s:man_tag_buf_".s:man_tag_depth | |
233 exec "let s:man_tag_lin=s:man_tag_lin_".s:man_tag_depth | |
234 exec "let s:man_tag_col=s:man_tag_col_".s:man_tag_depth | |
235 exec s:man_tag_buf."b" | |
236 exec s:man_tag_lin | |
13857 | 237 exec "norm! ".s:man_tag_col."|" |
7 | 238 exec "unlet s:man_tag_buf_".s:man_tag_depth |
239 exec "unlet s:man_tag_lin_".s:man_tag_depth | |
240 exec "unlet s:man_tag_col_".s:man_tag_depth | |
241 unlet s:man_tag_buf s:man_tag_lin s:man_tag_col | |
242 endif | |
243 endfunc | |
244 | |
245 endif | |
246 | |
14421 | 247 let &cpo = s:cpo_save |
248 unlet s:cpo_save | |
249 | |
9326
cd9c4bbe1d03
commit https://github.com/vim/vim/commit/ddf8d1c746ee081d15c9d7e0515f6ac43adbf363
Christian Brabandt <cb@256bit.org>
parents:
7992
diff
changeset
|
250 " vim: set sw=2 ts=8 noet: |