diff options
Diffstat (limited to 'ftplugin/changelog.vim')
-rw-r--r-- | ftplugin/changelog.vim | 305 |
1 files changed, 0 insertions, 305 deletions
diff --git a/ftplugin/changelog.vim b/ftplugin/changelog.vim deleted file mode 100644 index dd02344d..00000000 --- a/ftplugin/changelog.vim +++ /dev/null @@ -1,305 +0,0 @@ -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 |