diff options
Diffstat (limited to 'autoload/netrw_gitignore.vim')
| -rw-r--r-- | autoload/netrw_gitignore.vim | 82 | 
1 files changed, 82 insertions, 0 deletions
| diff --git a/autoload/netrw_gitignore.vim b/autoload/netrw_gitignore.vim new file mode 100644 index 00000000..ff22dcd0 --- /dev/null +++ b/autoload/netrw_gitignore.vim @@ -0,0 +1,82 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 +   +" netrw_gitignore#Hide: gitignore-based hiding +"  Function returns a string of comma separated patterns convenient for +"  assignment to `g:netrw_list_hide` option. +"  Function can take additional filenames as arguments, example: +"  netrw_gitignore#Hide('custom_gitignore1', 'custom_gitignore2') +" +" Usage examples: +"  let g:netrw_list_hide = netrw_gitignore#Hide() +"  let g:netrw_list_hide = netrw_gitignore#Hide() . 'more,hide,patterns' +" +" Copyright:    Copyright (C) 2013 Bruno Sutic {{{1 +"               Permission is hereby granted to use and distribute this code, +"               with or without modifications, provided that this copyright +"               notice is copied with it. Like anything else that's free, +"               netrw_gitignore.vim is provided *as is* and comes with no +"               warranty of any kind, either expressed or implied. By using +"               this plugin, you agree that in no event will the copyright +"               holder be liable for any damages resulting from the use +"               of this software. +function! netrw_gitignore#Hide(...) +  let additional_files = a:000 + +  let default_files = ['.gitignore', '.git/info/exclude'] + +  " get existing global/system gitignore files +  let global_gitignore = expand(substitute(system("git config --global core.excludesfile"), '\n', '', 'g')) +  if global_gitignore !=# '' +    let default_files = add(default_files, global_gitignore) +  endif +  let system_gitignore = expand(substitute(system("git config --system core.excludesfile"), '\n', '', 'g')) +  if system_gitignore !=# '' +    let default_files = add(default_files, system_gitignore) +  endif + +  " append additional files if given as function arguments +  if additional_files !=# [] +    let files = extend(default_files, additional_files) +  else +    let files = default_files +  endif + +  " keep only existing/readable files +  let gitignore_files = [] +  for file in files +    if filereadable(file) +      let gitignore_files = add(gitignore_files, file) +    endif +  endfor + +  " get contents of gitignore patterns from those files +  let gitignore_lines = [] +  for file in gitignore_files +    for line in readfile(file) +      " filter empty lines and comments +      if line !~# '^#' && line !~# '^$' +        let gitignore_lines = add(gitignore_lines, line) +      endif +    endfor +  endfor + +  " convert gitignore patterns to Netrw/Vim regex patterns +  let escaped_lines = [] +  for line in gitignore_lines +    let escaped = line +    let escaped = substitute(escaped, '\*\*', '*', 'g') +    let escaped = substitute(escaped, '\.', '\\.', 'g') +    let escaped = substitute(escaped, '\$', '\\$', 'g') +    let escaped = substitute(escaped, '*', '.*', 'g') +    " correction: dot, dollar and asterisks chars shouldn't be escaped when +    " within regex matching groups. +    let escaped = substitute(escaped, '\(\[[^]]*\)\zs\\\.', '\.', 'g') +    let escaped = substitute(escaped, '\(\[[^]]*\)\zs\\\$', '\$', 'g') +    let escaped = substitute(escaped, '\(\[[^]]*\)\zs\.\*', '*', 'g') +    let escaped_lines = add(escaped_lines, escaped) +  endfor + +  return join(escaped_lines, ',') +endfunction + +endif | 
