Mercurial > hg > mercurial-crew-with-dirclash
comparison contrib/vim/hgcommand.vim @ 2733:0b7206a65325
hgcommand.vim: cleanup of doc self-install code
author | Christian Ebert <blacktrash@gmx.net> |
---|---|
date | Sat, 29 Jul 2006 01:58:12 +0200 |
parents | 8dadff054acf |
children | 19436facb073 |
comparison
equal
deleted
inserted
replaced
2732:42a02b5773d4 | 2733:0b7206a65325 |
---|---|
351 else | 351 else |
352 " The file is tracked, we can try to get is revision number | 352 " The file is tracked, we can try to get is revision number |
353 let hgCommand = s:HGGetOption("HGCommandHGExec", "hg") . " parents -b " | 353 let hgCommand = s:HGGetOption("HGCommandHGExec", "hg") . " parents -b " |
354 let statustext=system(hgCommand) | 354 let statustext=system(hgCommand) |
355 if(v:shell_error) | 355 if(v:shell_error) |
356 return "" | 356 return "" |
357 endif | 357 endif |
358 let revision=substitute(statustext, '^changeset:\s*\(\d\+\):.*\_$\_.*$', '\1', "") | 358 let revision=substitute(statustext, '^changeset:\s*\(\d\+\):.*\_$\_.*$', '\1', "") |
359 | 359 |
360 if a:branchVar != "" && match(statustext, '^\_.*\_^branch:') >= 0 | 360 if a:branchVar != "" && match(statustext, '^\_.*\_^branch:') >= 0 |
361 let branch=substitute(statustext, '^\_.*\_^branch:\s*\(\S\+\)\n\_.*$', '\1', "") | 361 let branch=substitute(statustext, '^\_.*\_^branch:\s*\(\S\+\)\n\_.*$', '\1', "") |
362 let returnExpression=returnExpression . " | let " . a:branchVar . "='" . branch . "'" | 362 let returnExpression=returnExpression . " | let " . a:branchVar . "='" . branch . "'" |
363 endif | 363 endif |
364 endif | 364 endif |
365 if (exists('revision')) | 365 if (exists('revision')) |
366 let returnExpression = "let " . a:revisionVar . "='" . revision . "' " . returnExpression | 366 let returnExpression = "let " . a:revisionVar . "='" . revision . "' " . returnExpression |
367 endif | 367 endif |
476 " will be replaced with this string with 'v' prefix. | 476 " will be replaced with this string with 'v' prefix. |
477 " Return: | 477 " Return: |
478 " 1 if new document installed, 0 otherwise. | 478 " 1 if new document installed, 0 otherwise. |
479 " Note: Cleaned and generalized by guo-peng Wen | 479 " Note: Cleaned and generalized by guo-peng Wen |
480 "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' | 480 "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' |
481 " Helper function to make mkdir as portable as possible | |
482 function! s:HGFlexiMkdir(dir) | |
483 if exists("*mkdir") " we can use Vim's own mkdir() | |
484 call mkdir(a:dir) | |
485 elseif !exists("+shellslash") | |
486 call system('mkdir -p "'.a:dir.'"') | |
487 else " M$ | |
488 let l:ssl = &shellslash | |
489 try | |
490 set shellslash | |
491 call system('mkdir "'.a:dir.'"') | |
492 finally | |
493 let &shellslash = l:ssl | |
494 endtry | |
495 endif | |
496 endfunction | |
481 | 497 |
482 function! s:HGInstallDocumentation(full_name, revision) | 498 function! s:HGInstallDocumentation(full_name, revision) |
483 " Name of the document path based on the system we use: | 499 " Figure out document path based on full name of this script: |
484 if (has("unix")) | 500 let l:vim_plugin_path = fnamemodify(a:full_name, ':h') |
485 " On UNIX like system, using forward slash: | 501 let l:vim_doc_path = fnamemodify(a:full_name, ':h:h') . "/doc" |
486 let l:slash_char = '/' | 502 if filewritable(l:vim_doc_path) != 2 |
487 let l:mkdir_cmd = ':silent !mkdir -p ' | 503 echomsg "hgcommand: Trying to update docs at: " . l:vim_doc_path |
488 else | 504 silent! call <SID>HGFlexiMkdir(l:vim_doc_path) |
489 " On M$ system, use backslash. Also mkdir syntax is different. | 505 if filewritable(l:vim_doc_path) != 2 |
490 " This should only work on W2K and up. | 506 " Try first item in 'runtimepath': |
491 let l:slash_char = '\' | 507 let l:vimfiles = matchstr(&runtimepath, '[^,]\+\ze,') |
492 let l:mkdir_cmd = ':silent !mkdir ' | 508 let l:vim_doc_path = l:vimfiles . "/doc" |
493 endif | 509 if filewritable(l:vim_doc_path) != 2 |
494 | 510 echomsg "hgcommand: Trying to update docs at: " . l:vim_doc_path |
495 let l:doc_path = l:slash_char . 'doc' | 511 silent! call <SID>HGFlexiMkdir(l:vim_doc_path) |
496 let l:doc_home = l:slash_char . '.vim' . l:slash_char . 'doc' | 512 if filewritable(l:vim_doc_path) != 2 |
497 | 513 " Put a warning: |
498 " Figure out document path based on full name of this script: | 514 echomsg "Unable to open documentation directory" |
499 let l:vim_plugin_path = fnamemodify(a:full_name, ':h') | 515 echomsg " type `:help add-local-help' for more information." |
500 let l:vim_doc_path = fnamemodify(a:full_name, ':h:h') . l:doc_path | 516 return 0 |
501 if (!(filewritable(l:vim_doc_path) == 2)) | |
502 echomsg "Doc path: " . l:vim_doc_path | |
503 execute l:mkdir_cmd . '"' . l:vim_doc_path . '"' | |
504 if (!(filewritable(l:vim_doc_path) == 2)) | |
505 " Try a default configuration in user home: | |
506 let l:vim_doc_path = expand("~") . l:doc_home | |
507 if (!(filewritable(l:vim_doc_path) == 2)) | |
508 execute l:mkdir_cmd . '"' . l:vim_doc_path . '"' | |
509 if (!(filewritable(l:vim_doc_path) == 2)) | |
510 " Put a warning: | |
511 echomsg "Unable to open documentation directory" | |
512 echomsg " type :help add-local-help for more informations." | |
513 return 0 | |
514 endif | |
515 endif | |
516 endif | 517 endif |
517 endif | 518 endif |
518 | 519 endif |
519 " Exit if we have problem to access the document directory: | 520 endif |
520 if (!isdirectory(l:vim_plugin_path) | 521 |
521 \ || !isdirectory(l:vim_doc_path) | 522 " Full name of script and documentation file: |
522 \ || filewritable(l:vim_doc_path) != 2) | 523 let l:script_name = fnamemodify(a:full_name, ':t') |
523 return 0 | 524 let l:doc_name = fnamemodify(a:full_name, ':t:r') . '.txt' |
524 endif | 525 let l:doc_file = l:vim_doc_path . "/" . l:doc_name |
525 | 526 |
526 " Full name of script and documentation file: | 527 " Bail out if document file is still up to date: |
527 let l:script_name = fnamemodify(a:full_name, ':t') | 528 if filereadable(l:doc_file) && getftime(a:full_name) < getftime(l:doc_file) |
528 let l:doc_name = fnamemodify(a:full_name, ':t:r') . '.txt' | 529 return 0 |
529 let l:plugin_file = l:vim_plugin_path . l:slash_char . l:script_name | 530 endif |
530 let l:doc_file = l:vim_doc_path . l:slash_char . l:doc_name | 531 |
531 | 532 " Create a new buffer & read in the plugin file (me): |
532 " Bail out if document file is still up to date: | 533 setl nomodeline |
533 if (filereadable(l:doc_file) && | 534 1 new! |
534 \ getftime(l:plugin_file) < getftime(l:doc_file)) | 535 setl noswapfile modifiable |
535 return 0 | 536 sil exe 'read ' . a:full_name |
536 endif | 537 |
537 | 538 setl modeline |
538 " Prepare window position restoring command: | 539 let l:buf = bufnr("%") |
539 if (strlen(@%)) | 540 |
540 let l:go_back = 'b ' . bufnr("%") | 541 norm zR |
541 else | 542 norm gg |
542 let l:go_back = 'enew!' | 543 |
543 endif | 544 " Delete from first line to a line starts with |
544 | 545 " === START_DOC |
545 " Create a new buffer & read in the plugin file (me): | 546 sil 1,/^=\{3,}\s\+START_DOC\C/ d |
546 setl nomodeline | 547 |
547 exe 'enew!' | 548 " Delete from a line starts with |
548 exe 'r ' . l:plugin_file | 549 " === END_DOC |
549 | 550 " to the end of the documents: |
550 setl modeline | 551 sil /^=\{3,}\s\+END_DOC\C/,$ d |
551 let l:buf = bufnr("%") | 552 |
552 setl noswapfile modifiable | 553 " Remove fold marks: |
553 | 554 sil %s/{\{3}[1-9]/ /e |
554 norm zR | 555 |
555 norm gg | 556 " Add modeline for help doc: the modeline string is mangled intentionally |
556 | 557 " to avoid it be recognized by VIM: |
557 " Delete from first line to a line starts with | 558 call append(line('$'), '') |
558 " === START_DOC | 559 call append(line('$'), ' v' . 'im:tw=78:ts=8:ft=help:norl:') |
559 1,/^=\{3,}\s\+START_DOC\C/ d | 560 |
560 | 561 " Replace revision: |
561 " Delete from a line starts with | 562 sil exe "normal :1s/#version#/ v" . a:revision . "/\<CR>" |
562 " === END_DOC | 563 |
563 " to the end of the documents: | 564 " Save the help document and wipe out buffer: |
564 /^=\{3,}\s\+END_DOC\C/,$ d | 565 sil exe 'wq! ' . l:doc_file . ' | bw ' . l:buf |
565 | 566 |
566 " Remove fold marks: | 567 " Build help tags: |
567 %s/{\{3}[1-9]/ / | 568 sil exe 'helptags ' . l:vim_doc_path |
568 | 569 |
569 " Add modeline for help doc: the modeline string is mangled intentionally | 570 return 1 |
570 " to avoid it be recognized by VIM: | |
571 call append(line('$'), '') | |
572 call append(line('$'), ' v' . 'im:tw=78:ts=8:ft=help:norl:') | |
573 | |
574 " Replace revision: | |
575 exe "normal :1s/#version#/ v" . a:revision . "/\<CR>" | |
576 | |
577 " Save the help document: | |
578 exe 'w! ' . l:doc_file | |
579 exe l:go_back | |
580 exe 'bw ' . l:buf | |
581 | |
582 " Build help tags: | |
583 exe 'helptags ' . l:vim_doc_path | |
584 | |
585 return 1 | |
586 endfunction | 571 endfunction |
587 | 572 |
588 " Section: Public functions {{{1 | 573 " Section: Public functions {{{1 |
589 | 574 |
590 " Function: HGGetRevision() {{{2 | 575 " Function: HGGetRevision() {{{2 |
1183 endif | 1168 endif |
1184 | 1169 |
1185 " Section: Doc installation {{{1 | 1170 " Section: Doc installation {{{1 |
1186 " | 1171 " |
1187 let s:revision="0.1" | 1172 let s:revision="0.1" |
1188 silent! let s:install_status = | 1173 if s:HGInstallDocumentation(escape(expand('<sfile>:p'), ' '), s:revision) |
1189 \ s:HGInstallDocumentation(expand('<sfile>:p'), s:revision) | 1174 echom expand('<sfile>:t:r') . ' v' . s:revision . |
1190 if (s:install_status == 1) | 1175 \ ': Help-documentation installed.' |
1191 echom expand("<sfile>:t:r") . ' v' . s:revision . | 1176 endif |
1192 \ ': Help-documentation installed.' | 1177 |
1193 endif | 1178 " delete one-time vars and functions |
1179 delfunction <SID>HGInstallDocumentation | |
1180 delfunction <SID>HGFlexiMkdir | |
1181 unlet s:revision | |
1194 | 1182 |
1195 | 1183 |
1196 " Section: Plugin completion {{{1 | 1184 " Section: Plugin completion {{{1 |
1197 | 1185 |
1198 let loaded_hgcommand=2 | 1186 let loaded_hgcommand=2 |
1636 that it attempts to set two buffer variables ('HGRevision' and 'HGBranch') | 1624 that it attempts to set two buffer variables ('HGRevision' and 'HGBranch') |
1637 upon entry into a buffer. This is rather slow because it means that 'hg | 1625 upon entry into a buffer. This is rather slow because it means that 'hg |
1638 status' will be invoked at each entry into a buffer (during the |BufEnter| | 1626 status' will be invoked at each entry into a buffer (during the |BufEnter| |
1639 autocommand). | 1627 autocommand). |
1640 | 1628 |
1641 This mode is enablmed by default. In order to disable it, set the | 1629 This mode is enabled by default. In order to disable it, set the |
1642 |HGCommandEnableBufferSetup| variable to a false (zero) value. Enabling | 1630 |HGCommandEnableBufferSetup| variable to a false (zero) value. Enabling |
1643 this mode simply provides the buffer variables mentioned above. The user | 1631 this mode simply provides the buffer variables mentioned above. The user |
1644 must explicitly include those in the |'statusline'| option if they are to | 1632 must explicitly include those in the |'statusline'| option if they are to |
1645 appear in the status line (but see |hgcommand-statusline| for a simple way | 1633 appear in the status line (but see |hgcommand-statusline| for a simple way |
1646 to do that). | 1634 to do that). |