# HG changeset patch # User Christian Ebert # Date 1154131092 -7200 # Node ID 0b7206a6532503decb001de51c5f751ae2a1fbc0 # Parent 42a02b5773d4cf63a45d75414d487a78f648d196 hgcommand.vim: cleanup of doc self-install code diff -r 42a02b5773d4 -r 0b7206a65325 contrib/vim/hgcommand.vim --- a/contrib/vim/hgcommand.vim Sun Jul 30 21:24:06 2006 -0700 +++ b/contrib/vim/hgcommand.vim Sat Jul 29 01:58:12 2006 +0200 @@ -353,13 +353,13 @@ let hgCommand = s:HGGetOption("HGCommandHGExec", "hg") . " parents -b " let statustext=system(hgCommand) if(v:shell_error) - return "" + return "" endif let revision=substitute(statustext, '^changeset:\s*\(\d\+\):.*\_$\_.*$', '\1', "") if a:branchVar != "" && match(statustext, '^\_.*\_^branch:') >= 0 - let branch=substitute(statustext, '^\_.*\_^branch:\s*\(\S\+\)\n\_.*$', '\1', "") - let returnExpression=returnExpression . " | let " . a:branchVar . "='" . branch . "'" + let branch=substitute(statustext, '^\_.*\_^branch:\s*\(\S\+\)\n\_.*$', '\1', "") + let returnExpression=returnExpression . " | let " . a:branchVar . "='" . branch . "'" endif endif if (exists('revision')) @@ -478,111 +478,96 @@ " 1 if new document installed, 0 otherwise. " Note: Cleaned and generalized by guo-peng Wen "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +" Helper function to make mkdir as portable as possible +function! s:HGFlexiMkdir(dir) + if exists("*mkdir") " we can use Vim's own mkdir() + call mkdir(a:dir) + elseif !exists("+shellslash") + call system('mkdir -p "'.a:dir.'"') + else " M$ + let l:ssl = &shellslash + try + set shellslash + call system('mkdir "'.a:dir.'"') + finally + let &shellslash = l:ssl + endtry + endif +endfunction function! s:HGInstallDocumentation(full_name, revision) - " Name of the document path based on the system we use: - if (has("unix")) - " On UNIX like system, using forward slash: - let l:slash_char = '/' - let l:mkdir_cmd = ':silent !mkdir -p ' - else - " On M$ system, use backslash. Also mkdir syntax is different. - " This should only work on W2K and up. - let l:slash_char = '\' - let l:mkdir_cmd = ':silent !mkdir ' + " Figure out document path based on full name of this script: + let l:vim_plugin_path = fnamemodify(a:full_name, ':h') + let l:vim_doc_path = fnamemodify(a:full_name, ':h:h') . "/doc" + if filewritable(l:vim_doc_path) != 2 + echomsg "hgcommand: Trying to update docs at: " . l:vim_doc_path + silent! call HGFlexiMkdir(l:vim_doc_path) + if filewritable(l:vim_doc_path) != 2 + " Try first item in 'runtimepath': + let l:vimfiles = matchstr(&runtimepath, '[^,]\+\ze,') + let l:vim_doc_path = l:vimfiles . "/doc" + if filewritable(l:vim_doc_path) != 2 + echomsg "hgcommand: Trying to update docs at: " . l:vim_doc_path + silent! call HGFlexiMkdir(l:vim_doc_path) + if filewritable(l:vim_doc_path) != 2 + " Put a warning: + echomsg "Unable to open documentation directory" + echomsg " type `:help add-local-help' for more information." + return 0 + endif + endif endif - - let l:doc_path = l:slash_char . 'doc' - let l:doc_home = l:slash_char . '.vim' . l:slash_char . 'doc' + endif - " Figure out document path based on full name of this script: - let l:vim_plugin_path = fnamemodify(a:full_name, ':h') - let l:vim_doc_path = fnamemodify(a:full_name, ':h:h') . l:doc_path - if (!(filewritable(l:vim_doc_path) == 2)) - echomsg "Doc path: " . l:vim_doc_path - execute l:mkdir_cmd . '"' . l:vim_doc_path . '"' - if (!(filewritable(l:vim_doc_path) == 2)) - " Try a default configuration in user home: - let l:vim_doc_path = expand("~") . l:doc_home - if (!(filewritable(l:vim_doc_path) == 2)) - execute l:mkdir_cmd . '"' . l:vim_doc_path . '"' - if (!(filewritable(l:vim_doc_path) == 2)) - " Put a warning: - echomsg "Unable to open documentation directory" - echomsg " type :help add-local-help for more informations." - return 0 - endif - endif - endif - endif + " Full name of script and documentation file: + let l:script_name = fnamemodify(a:full_name, ':t') + let l:doc_name = fnamemodify(a:full_name, ':t:r') . '.txt' + let l:doc_file = l:vim_doc_path . "/" . l:doc_name - " Exit if we have problem to access the document directory: - if (!isdirectory(l:vim_plugin_path) - \ || !isdirectory(l:vim_doc_path) - \ || filewritable(l:vim_doc_path) != 2) - return 0 - endif - - " Full name of script and documentation file: - let l:script_name = fnamemodify(a:full_name, ':t') - let l:doc_name = fnamemodify(a:full_name, ':t:r') . '.txt' - let l:plugin_file = l:vim_plugin_path . l:slash_char . l:script_name - let l:doc_file = l:vim_doc_path . l:slash_char . l:doc_name + " Bail out if document file is still up to date: + if filereadable(l:doc_file) && getftime(a:full_name) < getftime(l:doc_file) + return 0 + endif - " Bail out if document file is still up to date: - if (filereadable(l:doc_file) && - \ getftime(l:plugin_file) < getftime(l:doc_file)) - return 0 - endif + " Create a new buffer & read in the plugin file (me): + setl nomodeline + 1 new! + setl noswapfile modifiable + sil exe 'read ' . a:full_name - " Prepare window position restoring command: - if (strlen(@%)) - let l:go_back = 'b ' . bufnr("%") - else - let l:go_back = 'enew!' - endif + setl modeline + let l:buf = bufnr("%") - " Create a new buffer & read in the plugin file (me): - setl nomodeline - exe 'enew!' - exe 'r ' . l:plugin_file + norm zR + norm gg - setl modeline - let l:buf = bufnr("%") - setl noswapfile modifiable - - norm zR - norm gg + " Delete from first line to a line starts with + " === START_DOC + sil 1,/^=\{3,}\s\+START_DOC\C/ d - " Delete from first line to a line starts with - " === START_DOC - 1,/^=\{3,}\s\+START_DOC\C/ d + " Delete from a line starts with + " === END_DOC + " to the end of the documents: + sil /^=\{3,}\s\+END_DOC\C/,$ d - " Delete from a line starts with - " === END_DOC - " to the end of the documents: - /^=\{3,}\s\+END_DOC\C/,$ d - - " Remove fold marks: - %s/{\{3}[1-9]/ / + " Remove fold marks: + sil %s/{\{3}[1-9]/ /e - " Add modeline for help doc: the modeline string is mangled intentionally - " to avoid it be recognized by VIM: - call append(line('$'), '') - call append(line('$'), ' v' . 'im:tw=78:ts=8:ft=help:norl:') + " Add modeline for help doc: the modeline string is mangled intentionally + " to avoid it be recognized by VIM: + call append(line('$'), '') + call append(line('$'), ' v' . 'im:tw=78:ts=8:ft=help:norl:') - " Replace revision: - exe "normal :1s/#version#/ v" . a:revision . "/\" + " Replace revision: + sil exe "normal :1s/#version#/ v" . a:revision . "/\" - " Save the help document: - exe 'w! ' . l:doc_file - exe l:go_back - exe 'bw ' . l:buf + " Save the help document and wipe out buffer: + sil exe 'wq! ' . l:doc_file . ' | bw ' . l:buf - " Build help tags: - exe 'helptags ' . l:vim_doc_path + " Build help tags: + sil exe 'helptags ' . l:vim_doc_path - return 1 + return 1 endfunction " Section: Public functions {{{1 @@ -1185,13 +1170,16 @@ " Section: Doc installation {{{1 " let s:revision="0.1" - silent! let s:install_status = - \ s:HGInstallDocumentation(expand(':p'), s:revision) - if (s:install_status == 1) - echom expand(":t:r") . ' v' . s:revision . - \ ': Help-documentation installed.' + if s:HGInstallDocumentation(escape(expand(':p'), ' '), s:revision) + echom expand(':t:r') . ' v' . s:revision . + \ ': Help-documentation installed.' endif + " delete one-time vars and functions + delfunction HGInstallDocumentation + delfunction HGFlexiMkdir + unlet s:revision + " Section: Plugin completion {{{1 @@ -1638,7 +1626,7 @@ status' will be invoked at each entry into a buffer (during the |BufEnter| autocommand). - This mode is enablmed by default. In order to disable it, set the + This mode is enabled by default. In order to disable it, set the |HGCommandEnableBufferSetup| variable to a false (zero) value. Enabling this mode simply provides the buffer variables mentioned above. The user must explicitly include those in the |'statusline'| option if they are to