Mercurial > vim
comparison runtime/ftplugin/man.vim @ 29236:0eef32b4ebbc
Update runtime files
Commit: https://github.com/vim/vim/commit/d799daa660b8821943cbe1682f00da9e812dd48c
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon Jun 20 11:17:32 2022 +0100
Update runtime files
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 20 Jun 2022 12:30:06 +0200 |
parents | 9c221ad9634a |
children | f68f43043842 |
comparison
equal
deleted
inserted
replaced
29235:fbcbc953c2ec | 29236:0eef32b4ebbc |
---|---|
1 " Vim filetype plugin file | 1 " Vim filetype plugin file |
2 " Language: man | 2 " Language: man |
3 " Maintainer: Jason Franklin <vim@justemail.net> | 3 " Maintainer: Jason Franklin <vim@justemail.net> |
4 " Maintainer: SungHyun Nam <goweol@gmail.com> | 4 " Maintainer: SungHyun Nam <goweol@gmail.com> |
5 " Last Change: 2021 Sep 26 | 5 " Autoload Split: Bram Moolenaar |
6 " Last Change: 2022 Jun 18 | |
6 | 7 |
7 " To make the ":Man" command available before editing a manual page, source | 8 " To make the ":Man" command available before editing a manual page, source |
8 " this script from your startup vimrc file. | 9 " this script from your startup vimrc file. |
9 | 10 |
10 " If 'filetype' isn't "man", we must have been called to only define ":Man". | 11 " If 'filetype' isn't "man", we must have been called to define ":Man" and not |
12 " to do the filetype plugin stuff. | |
11 if &filetype == "man" | 13 if &filetype == "man" |
12 | 14 |
13 " Only do this when not done yet for this buffer | 15 " Only do this when not done yet for this buffer |
14 if exists("b:did_ftplugin") | 16 if exists("b:did_ftplugin") |
15 finish | 17 finish |
32 let b:undo_ftplugin = b:undo_ftplugin | 34 let b:undo_ftplugin = b:undo_ftplugin |
33 \ . '|silent! nunmap <buffer> <LocalLeader>h' | 35 \ . '|silent! nunmap <buffer> <LocalLeader>h' |
34 endif | 36 endif |
35 nnoremap <buffer> <Plug>ManBS :%s/.\b//g<CR>:setl nomod<CR>'' | 37 nnoremap <buffer> <Plug>ManBS :%s/.\b//g<CR>:setl nomod<CR>'' |
36 | 38 |
37 nnoremap <buffer> <silent> <c-]> :call <SID>PreGetPage(v:count)<CR> | 39 nnoremap <buffer> <silent> <c-]> :call dist#man#PreGetPage(v:count)<CR> |
38 nnoremap <buffer> <silent> <c-t> :call <SID>PopPage()<CR> | 40 nnoremap <buffer> <silent> <c-t> :call dist#man#PopPage()<CR> |
39 nnoremap <buffer> <silent> q :q<CR> | 41 nnoremap <buffer> <silent> q :q<CR> |
40 | 42 |
41 " Add undo commands for the maps | 43 " Add undo commands for the maps |
42 let b:undo_ftplugin = b:undo_ftplugin | 44 let b:undo_ftplugin = b:undo_ftplugin |
43 \ . '|silent! nunmap <buffer> <Plug>ManBS' | 45 \ . '|silent! nunmap <buffer> <Plug>ManBS' |
53 endif | 55 endif |
54 | 56 |
55 endif | 57 endif |
56 | 58 |
57 if exists(":Man") != 2 | 59 if exists(":Man") != 2 |
58 com -nargs=+ -complete=shellcmd Man call s:GetPage(<q-mods>, <f-args>) | 60 com -nargs=+ -complete=shellcmd Man call dist#man#GetPage(<q-mods>, <f-args>) |
59 nmap <Leader>K :call <SID>PreGetPage(0)<CR> | 61 nmap <Leader>K :call dist#man#PreGetPage(0)<CR> |
60 nmap <Plug>ManPreGetPage :call <SID>PreGetPage(0)<CR> | 62 nmap <Plug>ManPreGetPage :call dist#man#PreGetPage(0)<CR> |
61 endif | |
62 | |
63 " Define functions only once. | |
64 if !exists("s:man_tag_depth") | |
65 | |
66 let s:man_tag_depth = 0 | |
67 | |
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 | |
78 | |
79 func s:PreGetPage(cnt) | |
80 if a:cnt == 0 | |
81 let old_isk = &iskeyword | |
82 if &ft == 'man' | |
83 setl iskeyword+=(,) | |
84 endif | |
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 | |
99 call s:GetPage('', sect, page) | |
100 endfunc | |
101 | |
102 func s:GetCmdArg(sect, page) | |
103 | |
104 if empty(a:sect) | |
105 return shellescape(a:page) | |
106 endif | |
107 | |
108 return s:man_sect_arg . ' ' . shellescape(a:sect) . ' ' . shellescape(a:page) | |
109 endfunc | |
110 | |
111 func s:FindPage(sect, page) | |
112 let l:cmd = printf('man %s %s', s:man_find_arg, s:GetCmdArg(a:sect, a:page)) | |
113 call system(l:cmd) | |
114 | |
115 if v:shell_error | |
116 return 0 | |
117 endif | |
118 | |
119 return 1 | |
120 endfunc | |
121 | |
122 func s:GetPage(cmdmods, ...) | |
123 if a:0 >= 2 | |
124 let sect = a:1 | |
125 let page = a:2 | |
126 elseif a:0 >= 1 | |
127 let sect = "" | |
128 let page = a:1 | |
129 else | |
130 return | |
131 endif | |
132 | |
133 " To support: nmap K :Man <cword> | |
134 if page == '<cword>' | |
135 let page = expand('<cword>') | |
136 endif | |
137 | |
138 if !exists('g:ft_man_no_sect_fallback') || (g:ft_man_no_sect_fallback == 0) | |
139 if sect != "" && s:FindPage(sect, page) == 0 | |
140 let sect = "" | |
141 endif | |
142 endif | |
143 if s:FindPage(sect, page) == 0 | |
144 let msg = 'man.vim: no manual entry for "' . page . '"' | |
145 if !empty(sect) | |
146 let msg .= ' in section ' . sect | |
147 endif | |
148 echomsg msg | |
149 return | |
150 endif | |
151 exec "let s:man_tag_buf_".s:man_tag_depth." = ".bufnr("%") | |
152 exec "let s:man_tag_lin_".s:man_tag_depth." = ".line(".") | |
153 exec "let s:man_tag_col_".s:man_tag_depth." = ".col(".") | |
154 let s:man_tag_depth = s:man_tag_depth + 1 | |
155 | |
156 let open_cmd = 'edit' | |
157 | |
158 " Use an existing "man" window if it exists, otherwise open a new one. | |
159 if &filetype != "man" | |
160 let thiswin = winnr() | |
161 exe "norm! \<C-W>b" | |
162 if winnr() > 1 | |
163 exe "norm! " . thiswin . "\<C-W>w" | |
164 while 1 | |
165 if &filetype == "man" | |
166 break | |
167 endif | |
168 exe "norm! \<C-W>w" | |
169 if thiswin == winnr() | |
170 break | |
171 endif | |
172 endwhile | |
173 endif | |
174 if &filetype != "man" | |
175 if exists("g:ft_man_open_mode") | |
176 if g:ft_man_open_mode == 'vert' | |
177 let open_cmd = 'vsplit' | |
178 elseif g:ft_man_open_mode == 'tab' | |
179 let open_cmd = 'tabedit' | |
180 else | |
181 let open_cmd = 'split' | |
182 endif | |
183 else | |
184 let open_cmd = a:cmdmods . ' split' | |
185 endif | |
186 endif | |
187 endif | |
188 | |
189 silent execute open_cmd . " $HOME/" . page . '.' . sect . '~' | |
190 | |
191 " Avoid warning for editing the dummy file twice | |
192 setl buftype=nofile noswapfile | |
193 | |
194 setl fdc=0 ma nofen nonu nornu | |
195 %delete _ | |
196 let unsetwidth = 0 | |
197 if empty($MANWIDTH) | |
198 let $MANWIDTH = winwidth(0) | |
199 let unsetwidth = 1 | |
200 endif | |
201 | |
202 " Ensure Vim is not recursively invoked (man-db does this) when doing ctrl-[ | |
203 " on a man page reference by unsetting MANPAGER. | |
204 " Some versions of env(1) do not support the '-u' option, and in such case | |
205 " we set MANPAGER=cat. | |
206 if !exists('s:env_has_u') | |
207 call system('env -u x true') | |
208 let s:env_has_u = (v:shell_error == 0) | |
209 endif | |
210 let env_cmd = s:env_has_u ? 'env -u MANPAGER' : 'env MANPAGER=cat' | |
211 let env_cmd .= ' GROFF_NO_SGR=1' | |
212 let man_cmd = env_cmd . ' man ' . s:GetCmdArg(sect, page) . ' | col -b' | |
213 silent exec "r !" . man_cmd | |
214 | |
215 if unsetwidth | |
216 let $MANWIDTH = '' | |
217 endif | |
218 " Remove blank lines from top and bottom. | |
219 while line('$') > 1 && getline(1) =~ '^\s*$' | |
220 1delete _ | |
221 endwhile | |
222 while line('$') > 1 && getline('$') =~ '^\s*$' | |
223 $delete _ | |
224 endwhile | |
225 1 | |
226 setl ft=man nomod | |
227 setl bufhidden=hide | |
228 setl nobuflisted | |
229 setl noma | |
230 endfunc | |
231 | |
232 func s:PopPage() | |
233 if s:man_tag_depth > 0 | |
234 let s:man_tag_depth = s:man_tag_depth - 1 | |
235 exec "let s:man_tag_buf=s:man_tag_buf_".s:man_tag_depth | |
236 exec "let s:man_tag_lin=s:man_tag_lin_".s:man_tag_depth | |
237 exec "let s:man_tag_col=s:man_tag_col_".s:man_tag_depth | |
238 exec s:man_tag_buf."b" | |
239 exec s:man_tag_lin | |
240 exec "norm! ".s:man_tag_col."|" | |
241 exec "unlet s:man_tag_buf_".s:man_tag_depth | |
242 exec "unlet s:man_tag_lin_".s:man_tag_depth | |
243 exec "unlet s:man_tag_col_".s:man_tag_depth | |
244 unlet s:man_tag_buf s:man_tag_lin s:man_tag_col | |
245 endif | |
246 endfunc | |
247 | |
248 endif | 63 endif |
249 | 64 |
250 let &cpo = s:cpo_save | 65 let &cpo = s:cpo_save |
251 unlet s:cpo_save | 66 unlet s:cpo_save |
252 | 67 |