diff options
| author | Adam Stankiewicz <sheerun@sher.pl> | 2017-09-27 20:43:42 +0200 | 
|---|---|---|
| committer | Adam Stankiewicz <sheerun@sher.pl> | 2017-09-27 20:43:42 +0200 | 
| commit | 5b77877888162f4e415fe9a7b8c5e9fb5dfb6ee1 (patch) | |
| tree | 965ae5128797f3d42d78d02692e62d24a4596e19 /ftplugin/changelog.vim | |
| parent | 8148255ef1c416f414c3a78405eff08fe149d16e (diff) | |
| download | vim-polyglot-5b77877888162f4e415fe9a7b8c5e9fb5dfb6ee1.tar.gz vim-polyglot-5b77877888162f4e415fe9a7b8c5e9fb5dfb6ee1.zip | |
Add syntax files from upstream vim repository
Diffstat (limited to '')
| -rw-r--r-- | ftplugin/changelog.vim | 305 | 
1 files changed, 305 insertions, 0 deletions
| diff --git a/ftplugin/changelog.vim b/ftplugin/changelog.vim new file mode 100644 index 00000000..dd02344d --- /dev/null +++ b/ftplugin/changelog.vim @@ -0,0 +1,305 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 +   +" Vim filetype plugin file +" Language:             generic Changelog file +" Maintainer:           Martin Florian <marfl@posteo.de> +" Previous Maintainer:  Nikolai Weibull <now@bitwi.se> +" Latest Revision:      2015-10-25 +" Variables: +"   g:changelog_timeformat (deprecated: use g:changelog_dateformat instead) - +"       description: the timeformat used in ChangeLog entries. +"       default: "%Y-%m-%d". +"   g:changelog_dateformat - +"       description: the format sent to strftime() to generate a date string. +"       default: "%Y-%m-%d". +"   g:changelog_username - +"       description: the username to use in ChangeLog entries +"       default: try to deduce it from environment variables and system files. +" Local Mappings: +"   <Leader>o - +"       adds a new changelog entry for the current user for the current date. +" Global Mappings: +"   <Leader>o - +"       switches to the ChangeLog buffer opened for the current directory, or +"       opens it in a new buffer if it exists in the current directory.  Then +"       it does the same as the local <Leader>o described above. +" Notes: +"   run 'runtime ftplugin/changelog.vim' to enable the global mapping for +"   changelog files. +" TODO: +"  should we perhaps open the ChangeLog file even if it doesn't exist already? +"  Problem is that you might end up with ChangeLog files all over the place. + +" If 'filetype' isn't "changelog", we must have been to add ChangeLog opener +if &filetype == 'changelog' +  if exists('b:did_ftplugin') +    finish +  endif +  let b:did_ftplugin = 1 + +  let s:cpo_save = &cpo +  set cpo&vim + +  " Set up the format used for dates. +  if !exists('g:changelog_dateformat') +    if exists('g:changelog_timeformat') +      let g:changelog_dateformat = g:changelog_timeformat +    else +      let g:changelog_dateformat = "%Y-%m-%d" +    endif +  endif + +  function! s:username() +    if exists('g:changelog_username') +      return g:changelog_username +    elseif $EMAIL != "" +      return $EMAIL +    elseif $EMAIL_ADDRESS != "" +      return $EMAIL_ADDRESS +    endif +     +    let login = s:login() +    return printf('%s <%s@%s>', s:name(login), login, s:hostname()) +  endfunction + +  function! s:login() +    return s:trimmed_system_with_default('whoami', 'unknown') +  endfunction + +  function! s:trimmed_system_with_default(command, default) +    return s:first_line(s:system_with_default(a:command, a:default)) +  endfunction + +  function! s:system_with_default(command, default) +    let output = system(a:command) +    if v:shell_error +      return default +    endif +    return output +  endfunction + +  function! s:first_line(string) +    return substitute(a:string, '\n.*$', "", "") +  endfunction + +  function! s:name(login) +    for name in [s:gecos_name(a:login), $NAME, s:capitalize(a:login)] +      if name != "" +        return name +      endif +    endfor +  endfunction + +  function! s:gecos_name(login) +    for line in s:try_reading_file('/etc/passwd') +      if line =~ '^' . a:login . ':' +        return substitute(s:passwd_field(line, 5), '&', s:capitalize(a:login), "") +      endif +    endfor +    return "" +  endfunction + +  function! s:try_reading_file(path) +    try +      return readfile(a:path) +    catch +      return [] +    endtry +  endfunction + +  function! s:passwd_field(line, field) +    let fields = split(a:line, ':', 1) +    if len(fields) < a:field +      return "" +    endif +    return fields[a:field - 1] +  endfunction + +  function! s:capitalize(word) +    return toupper(a:word[0]) . strpart(a:word, 1) +  endfunction + +  function! s:hostname() +    return s:trimmed_system_with_default('hostname', 'localhost') +  endfunction + +  " Format used for new date entries. +  if !exists('g:changelog_new_date_format') +    let g:changelog_new_date_format = "%d  %u\n\n\t* %p%c\n\n" +  endif + +  " Format used for new entries to current date entry. +  if !exists('g:changelog_new_entry_format') +    let g:changelog_new_entry_format = "\t* %p%c" +  endif + +  " Regular expression used to find a given date entry. +  if !exists('g:changelog_date_entry_search') +    let g:changelog_date_entry_search = '^\s*%d\_s*%u' +  endif + +  " Regular expression used to find the end of a date entry +  if !exists('g:changelog_date_end_entry_search') +    let g:changelog_date_end_entry_search = '^\s*$' +  endif + + +  " Substitutes specific items in new date-entry formats and search strings. +  " Can be done with substitute of course, but unclean, and need \@! then. +  function! s:substitute_items(str, date, user, prefix) +    let str = a:str +    let middles = {'%': '%', 'd': a:date, 'u': a:user, 'p': a:prefix, 'c': '{cursor}'} +    let i = stridx(str, '%') +    while i != -1 +      let inc = 0 +      if has_key(middles, str[i + 1]) +        let mid = middles[str[i + 1]] +        let str = strpart(str, 0, i) . mid . strpart(str, i + 2) +        let inc = strlen(mid) - 1 +      endif +      let i = stridx(str, '%', i + 1 + inc) +    endwhile +    return str +  endfunction + +  " Position the cursor once we've done all the funky substitution. +  function! s:position_cursor() +    if search('{cursor}') > 0 +      let lnum = line('.') +      let line = getline(lnum) +      let cursor = stridx(line, '{cursor}') +      call setline(lnum, substitute(line, '{cursor}', '', '')) +    endif +    startinsert +  endfunction + +  " Internal function to create a new entry in the ChangeLog. +  function! s:new_changelog_entry(prefix) +    " Deal with 'paste' option. +    let save_paste = &paste +    let &paste = 1 +    call cursor(1, 1) +    " Look for an entry for today by our user. +    let date = strftime(g:changelog_dateformat) +    let search = s:substitute_items(g:changelog_date_entry_search, date, +                                  \ s:username(), a:prefix) +    if search(search) > 0 +      " Ok, now we look for the end of the date entry, and add an entry. +      call cursor(nextnonblank(line('.') + 1), 1) +      if search(g:changelog_date_end_entry_search, 'W') > 0 +	let p = (line('.') == line('$')) ? line('.') : line('.') - 1 +      else +        let p = line('.') +      endif +      let ls = split(s:substitute_items(g:changelog_new_entry_format, '', '', a:prefix), +                   \ '\n') +      call append(p, ls) +      call cursor(p + 1, 1) +    else +      " Flag for removing empty lines at end of new ChangeLogs. +      let remove_empty = line('$') == 1 + +      " No entry today, so create a date-user header and insert an entry. +      let todays_entry = s:substitute_items(g:changelog_new_date_format, +                                          \ date, s:username(), a:prefix) +      " Make sure we have a cursor positioning. +      if stridx(todays_entry, '{cursor}') == -1 +        let todays_entry = todays_entry . '{cursor}' +      endif + +      " Now do the work. +      call append(0, split(todays_entry, '\n')) + +      " Remove empty lines at end of file. +      if remove_empty +        $-/^\s*$/-1,$delete +      endif + +      " Reposition cursor once we're done. +      call cursor(1, 1) +    endif + +    call s:position_cursor() + +    " And reset 'paste' option +    let &paste = save_paste +  endfunction + +  if exists(":NewChangelogEntry") != 2 +    nnoremap <buffer> <silent> <Leader>o :<C-u>call <SID>new_changelog_entry('')<CR> +    xnoremap <buffer> <silent> <Leader>o :<C-u>call <SID>new_changelog_entry('')<CR> +    command! -nargs=0 NewChangelogEntry call s:new_changelog_entry('') +  endif + +  let b:undo_ftplugin = "setl com< fo< et< ai<" + +  setlocal comments= +  setlocal formatoptions+=t +  setlocal noexpandtab +  setlocal autoindent + +  if &textwidth == 0 +    setlocal textwidth=78 +    let b:undo_ftplugin .= " tw<" +  endif + +  let &cpo = s:cpo_save +  unlet s:cpo_save +else +  let s:cpo_save = &cpo +  set cpo&vim + +  " Add the Changelog opening mapping +  nnoremap <silent> <Leader>o :call <SID>open_changelog()<CR> + +  function! s:open_changelog() +    let path = expand('%:p:h') +    if exists('b:changelog_path') +      let changelog = b:changelog_path +    else +      if exists('b:changelog_name') +        let name = b:changelog_name +      else +        let name = 'ChangeLog' +      endif +      while isdirectory(path) +        let changelog = path . '/' . name +        if filereadable(changelog) +          break +        endif +        let parent = substitute(path, '/\+[^/]*$', "", "") +        if path == parent +          break +        endif +        let path = parent +      endwhile +    endif +    if !filereadable(changelog) +      return +    endif + +    if exists('b:changelog_entry_prefix') +      let prefix = call(b:changelog_entry_prefix, []) +    else +      let prefix = substitute(strpart(expand('%:p'), strlen(path)), '^/\+', "", "") +    endif + +    let buf = bufnr(changelog) +    if buf != -1 +      if bufwinnr(buf) != -1 +        execute bufwinnr(buf) . 'wincmd w' +      else +        execute 'sbuffer' buf +      endif +    else +      execute 'split' fnameescape(changelog) +    endif + +    call s:new_changelog_entry(prefix) +  endfunction + +  let &cpo = s:cpo_save +  unlet s:cpo_save +endif + +endif | 
