dotfiles/nvim/.vim/plugged/vim-devicons/plugin/webdevicons.vim
2024-06-19 00:06:56 +02:00

703 lines
23 KiB
VimL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

" Version: 0.11.0
" Webpage: https://github.com/ryanoasis/vim-devicons
" Maintainer: Ryan McIntyre <ryanoasis@gmail.com>
" License: see LICENSE
let s:version = '0.11.0'
let s:plugin_home = expand('<sfile>:p:h:h')
" set scriptencoding after 'encoding' and when using multibyte chars
scriptencoding utf-8
" standard fix/safety: line continuation (avoiding side effects) {{{1
"========================================================================
let s:save_cpo = &cpo
set cpo&vim
" standard loading / not loading {{{1
"========================================================================
if exists('g:loaded_webdevicons')
finish
endif
let g:loaded_webdevicons = 1
" config enable / disable settings {{{1
"========================================================================
""
" Set the variable to the default value, only if variable is not defined.
"
" @param {string} var Variable name with its scope.
" @param {*} default Default value for variable.
""
function! s:set(var, default) abort
if !exists(a:var)
if type(a:default)
execute 'let' a:var '=' string(a:default)
else
execute 'let' a:var '=' a:default
endif
endif
endfunction
call s:set('g:webdevicons_enable', 1)
call s:set('g:webdevicons_enable_nerdtree', 1)
call s:set('g:webdevicons_enable_unite ', 1)
call s:set('g:webdevicons_enable_denite', 1)
call s:set('g:webdevicons_enable_vimfiler', 1)
call s:set('g:webdevicons_enable_ctrlp', 1)
call s:set('g:webdevicons_enable_airline_tabline', 1)
call s:set('g:webdevicons_enable_airline_statusline', 1)
call s:set('g:webdevicons_enable_airline_statusline_fileformat_symbols', 1)
call s:set('g:webdevicons_enable_flagship_statusline', 1)
call s:set('g:webdevicons_enable_flagship_statusline_fileformat_symbols', 1)
call s:set('g:webdevicons_enable_startify', 1)
call s:set('g:webdevicons_conceal_nerdtree_brackets', 1)
call s:set('g:DevIconsAppendArtifactFix', has('gui_running') ? 1 : 0)
call s:set('g:DevIconsArtifactFixChar', ' ')
" config options {{{1
"========================================================================
call s:set('g:WebDevIconsUnicodeDecorateFileNodes', 1)
call s:set('g:WebDevIconsUnicodeDecorateFolderNodes', 1)
call s:set('g:DevIconsEnableFoldersOpenClose', 0)
call s:set('g:DevIconsEnableFolderPatternMatching', 1)
call s:set('g:DevIconsEnableFolderExtensionPatternMatching', 0)
call s:set('g:DevIconsEnableDistro', 1)
call s:set('g:WebDevIconsUnicodeDecorateFolderNodesExactMatches', 1)
call s:set('g:WebDevIconsUnicodeGlyphDoubleWidth', 1)
call s:set('g:WebDevIconsNerdTreeBeforeGlyphPadding', ' ')
call s:set('g:WebDevIconsNerdTreeAfterGlyphPadding', ' ')
call s:set('g:WebDevIconsNerdTreeGitPluginForceVAlign', 1)
call s:set('g:NERDTreeUpdateOnCursorHold', 1) " Obsolete: For backward compatibility
call s:set('g:NERDTreeGitStatusUpdateOnCursorHold', 1)
call s:set('g:WebDevIconsTabAirLineBeforeGlyphPadding', ' ')
call s:set('g:WebDevIconsTabAirLineAfterGlyphPadding', '')
" config defaults {{{1
"========================================================================
call s:set('g:WebDevIconsUnicodeDecorateFileNodesDefaultSymbol', '')
call s:set('g:WebDevIconsUnicodeByteOrderMarkerDefaultSymbol', '')
call s:set('g:WebDevIconsUnicodeDecorateFolderNodesDefaultSymbol', g:DevIconsEnableFoldersOpenClose ? '' : '')
call s:set('g:WebDevIconsUnicodeDecorateFolderNodesSymlinkSymbol', '')
call s:set('g:DevIconsDefaultFolderOpenSymbol', '')
" functions {{{1
"========================================================================
" local functions {{{2
"========================================================================
" scope: local
function s:getDistro()
if exists('s:distro')
return s:distro
endif
if has('bsd')
let s:distro = ''
return s:distro
endif
if g:DevIconsEnableDistro && executable('lsb_release')
let s:lsb = system('lsb_release -i')
if s:lsb =~# 'Arch'
let s:distro = ''
elseif s:lsb =~# 'Gentoo'
let s:distro = ''
elseif s:lsb =~# 'Ubuntu'
let s:distro = ''
elseif s:lsb =~# 'Cent'
let s:distro = ''
elseif s:lsb =~# 'Debian'
let s:distro = ''
elseif s:lsb =~# 'Dock'
let s:distro = ''
else
let s:distro = ''
endif
return s:distro
endif
let s:distro = ''
return s:distro
endfunction
" scope: local
function s:isDarwin()
if exists('s:is_darwin')
return s:is_darwin
endif
if exists('g:WebDevIconsOS')
let s:is_darwin = g:WebDevIconsOS ==? 'Darwin'
return s:is_darwin
endif
if has('macunix')
let s:is_darwin = 1
return s:is_darwin
endif
if ! has('unix')
let s:is_darwin = 0
return s:is_darwin
endif
if system('uname -s') ==# "Darwin\n"
let s:is_darwin = 1
else
let s:is_darwin = 0
endif
return s:is_darwin
endfunction
" scope: local
function! s:strip(input)
return substitute(a:input, '^\s*\(.\{-}\)\s*$', '\1', '')
endfunction
" scope: local
function! s:setDictionaries()
let s:file_node_extensions = {
\ 'styl' : '',
\ 'sass' : '',
\ 'scss' : '',
\ 'htm' : '',
\ 'html' : '',
\ 'slim' : '',
\ 'haml' : '',
\ 'ejs' : '',
\ 'css' : '',
\ 'less' : '',
\ 'md' : '',
\ 'mdx' : '',
\ 'markdown' : '',
\ 'rmd' : '',
\ 'json' : '',
\ 'webmanifest' : '',
\ 'js' : '',
\ 'mjs' : '',
\ 'jsx' : '',
\ 'rb' : '',
\ 'gemspec' : '',
\ 'rake' : '',
\ 'php' : '',
\ 'py' : '',
\ 'pyc' : '',
\ 'pyo' : '',
\ 'pyd' : '',
\ 'coffee' : '',
\ 'mustache' : '',
\ 'hbs' : '',
\ 'conf' : '',
\ 'ini' : '',
\ 'yml' : '',
\ 'yaml' : '',
\ 'toml' : '',
\ 'bat' : '',
\ 'mk' : '',
\ 'jpg' : '',
\ 'jpeg' : '',
\ 'bmp' : '',
\ 'png' : '',
\ 'webp' : '',
\ 'gif' : '',
\ 'ico' : '',
\ 'twig' : '',
\ 'cpp' : '',
\ 'c++' : '',
\ 'cxx' : '',
\ 'cc' : '',
\ 'cp' : '',
\ 'c' : '',
\ 'cs' : '',
\ 'h' : '',
\ 'hh' : '',
\ 'hpp' : '',
\ 'hxx' : '',
\ 'hs' : '',
\ 'lhs' : '',
\ 'nix' : '',
\ 'lua' : '',
\ 'java' : '',
\ 'sh' : '',
\ 'fish' : '',
\ 'bash' : '',
\ 'zsh' : '',
\ 'ksh' : '',
\ 'csh' : '',
\ 'awk' : '',
\ 'ps1' : '',
\ 'ml' : 'λ',
\ 'mli' : 'λ',
\ 'diff' : '',
\ 'db' : '',
\ 'sql' : '',
\ 'dump' : '',
\ 'clj' : '',
\ 'cljc' : '',
\ 'cljs' : '',
\ 'edn' : '',
\ 'scala' : '',
\ 'go' : '',
\ 'dart' : '',
\ 'xul' : '',
\ 'sln' : '',
\ 'suo' : '',
\ 'pl' : '',
\ 'pm' : '',
\ 't' : '',
\ 'rss' : '',
\ 'f#' : '',
\ 'fsscript' : '',
\ 'fsx' : '',
\ 'fs' : '',
\ 'fsi' : '',
\ 'rs' : '',
\ 'rlib' : '',
\ 'd' : '',
\ 'erl' : '',
\ 'hrl' : '',
\ 'ex' : '',
\ 'exs' : '',
\ 'eex' : '',
\ 'leex' : '',
\ 'heex' : '',
\ 'vim' : '',
\ 'ai' : '',
\ 'psd' : '',
\ 'psb' : '',
\ 'ts' : '',
\ 'tsx' : '',
\ 'jl' : '',
\ 'pp' : '',
\ 'vue' : '﵂',
\ 'elm' : '',
\ 'swift' : '',
\ 'xcplayground' : '',
\ 'tex' : 'ﭨ',
\ 'r' : 'ﳒ',
\ 'rproj' : '鉶',
\ 'sol' : 'ﲹ',
\ 'pem' : ''
\}
let s:file_node_exact_matches = {
\ 'exact-match-case-sensitive-1.txt' : '1',
\ 'exact-match-case-sensitive-2' : '2',
\ 'gruntfile.coffee' : '',
\ 'gruntfile.js' : '',
\ 'gruntfile.ls' : '',
\ 'gulpfile.coffee' : '',
\ 'gulpfile.js' : '',
\ 'gulpfile.ls' : '',
\ 'mix.lock' : '',
\ 'dropbox' : '',
\ '.ds_store' : '',
\ '.gitconfig' : '',
\ '.gitignore' : '',
\ '.gitattributes' : '',
\ '.gitlab-ci.yml' : '',
\ '.bashrc' : '',
\ '.zshrc' : '',
\ '.zshenv' : '',
\ '.zprofile' : '',
\ '.vimrc' : '',
\ '.gvimrc' : '',
\ '_vimrc' : '',
\ '_gvimrc' : '',
\ '.bashprofile' : '',
\ 'favicon.ico' : '',
\ 'license' : '',
\ 'node_modules' : '',
\ 'react.jsx' : '',
\ 'procfile' : '',
\ 'dockerfile' : '',
\ 'docker-compose.yml' : '',
\ 'rakefile' : '',
\ 'config.ru' : '',
\ 'gemfile' : '',
\ 'makefile' : '',
\ 'cmakelists.txt' : '',
\ 'robots.txt' : ''
\}
let s:file_node_pattern_matches = {
\ '.*jquery.*\.js$' : '',
\ '.*angular.*\.js$' : '',
\ '.*backbone.*\.js$' : '',
\ '.*require.*\.js$' : '',
\ '.*materialize.*\.js$' : '',
\ '.*materialize.*\.css$' : '',
\ '.*mootools.*\.js$' : '',
\ '.*vimrc.*' : '',
\ 'Vagrantfile$' : ''
\}
if !exists('g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols')
let g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols = {}
endif
if !exists('g:WebDevIconsUnicodeDecorateFileNodesExactSymbols')
" do not remove: exact-match-case-sensitive-*
let g:WebDevIconsUnicodeDecorateFileNodesExactSymbols = {}
endif
if !exists('g:WebDevIconsUnicodeDecorateFileNodesPatternSymbols')
let g:WebDevIconsUnicodeDecorateFileNodesPatternSymbols = {}
endif
" iterate to fix allow user overriding of specific individual keys in vimrc (only gvimrc was working previously)
for [key, val] in items(s:file_node_extensions)
if !has_key(g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols, key)
let g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols[key] = val
endif
endfor
" iterate to fix allow user overriding of specific individual keys in vimrc (only gvimrc was working previously)
for [key, val] in items(s:file_node_exact_matches)
if !has_key(g:WebDevIconsUnicodeDecorateFileNodesExactSymbols, key)
let g:WebDevIconsUnicodeDecorateFileNodesExactSymbols[key] = val
endif
endfor
" iterate to fix allow user overriding of specific individual keys in vimrc (only gvimrc was working previously)
for [key, val] in items(s:file_node_pattern_matches)
if !has_key(g:WebDevIconsUnicodeDecorateFileNodesPatternSymbols, key)
let g:WebDevIconsUnicodeDecorateFileNodesPatternSymbols[key] = val
endif
endfor
endfunction
" scope: local
function! s:setSyntax()
if g:webdevicons_enable_nerdtree == 1 && g:webdevicons_conceal_nerdtree_brackets == 1
augroup webdevicons_conceal_nerdtree_brackets
au!
autocmd FileType nerdtree syntax match hideBracketsInNerdTree "\]" contained conceal containedin=NERDTreeFlags
autocmd FileType nerdtree syntax match hideBracketsInNerdTree "\[" contained conceal containedin=NERDTreeFlags
autocmd FileType nerdtree syntax match hideBracketsInNerdTree "\]" contained conceal containedin=NERDTreeLinkFile
autocmd FileType nerdtree syntax match hideBracketsInNerdTree "\]" contained conceal containedin=NERDTreeLinkDir
autocmd FileType nerdtree syntax match hideBracketsInNerdTree "\[" contained conceal containedin=NERDTreeLinkFile
autocmd FileType nerdtree syntax match hideBracketsInNerdTree "\[" contained conceal containedin=NERDTreeLinkDir
autocmd FileType nerdtree setlocal conceallevel=3
autocmd FileType nerdtree setlocal concealcursor=nvic
augroup END
endif
endfunction
" scope: local
" stole solution/idea from nerdtree-git-plugin :)
function! s:setCursorHold()
if g:webdevicons_enable_nerdtree
augroup webdevicons_cursor_hold
autocmd CursorHold * silent! call s:CursorHoldUpdate()
augroup END
endif
endfunction
" scope: local
" stole solution/idea from nerdtree-git-plugin :)
function! s:CursorHoldUpdate()
if g:NERDTreeUpdateOnCursorHold != 1 || g:NERDTreeGitStatusUpdateOnCursorHold != 1
return
endif
if !exists('g:NERDTree') || !g:NERDTree.IsOpen()
return
endif
" Do not update when a special buffer is selected
if !empty(&l:buftype)
return
endif
" winnr need to make focus go to opened file
" CursorToTreeWin needed to avoid error on opening file
let l:winnr = winnr()
let l:altwinnr = winnr('#')
call g:NERDTree.CursorToTreeWin()
call b:NERDTree.root.refreshFlags()
call NERDTreeRender()
exec l:altwinnr . 'wincmd w'
exec l:winnr . 'wincmd w'
endfunction
" scope: local
function! s:hardRefreshNerdTree()
if g:webdevicons_enable_nerdtree == 1 && g:webdevicons_conceal_nerdtree_brackets == 1 && g:NERDTree.IsOpen()
NERDTreeClose
NERDTree
endif
endfunction
" scope: local
function! s:softRefreshNerdTree()
if g:webdevicons_enable_nerdtree == 1 && exists('g:NERDTree') && g:NERDTree.IsOpen()
NERDTreeToggle
NERDTreeToggle
endif
endfunction
" local initialization {{{2
"========================================================================
" scope: local
function! s:initialize()
call s:setDictionaries()
call s:setSyntax()
call s:setCursorHold()
if exists('g:loaded_flagship') | call devicons#plugins#flagship#init() | endif
if exists('g:loaded_unite') && g:webdevicons_enable_unite | call devicons#plugins#unite#init() | endif
if exists('g:loaded_denite') && g:webdevicons_enable_denite | call devicons#plugins#denite#init() | endif
if exists('g:loaded_vimfiler') && g:webdevicons_enable_vimfiler | call devicons#plugins#vimfiler#init() | endif
if exists('g:loaded_ctrlp') && g:webdevicons_enable_ctrlp | call devicons#plugins#ctrlp#init() | endif
if exists('g:loaded_startify') && g:webdevicons_enable_startify | call devicons#plugins#startify#init() | endif
endfunction
" public functions {{{2
"========================================================================
" scope: public
function! webdevicons#version()
return s:version
endfunction
" scope: public
function! webdevicons#pluginHome()
return s:plugin_home
endfunction
" scope: public
" allow the first version of refresh to now call softRefresh
function! webdevicons#refresh()
call webdevicons#softRefresh()
endfunction
" scope: public
function! webdevicons#hardRefresh()
call s:setSyntax()
call s:hardRefreshNerdTree()
endfunction
" scope: public
function! webdevicons#softRefresh()
call s:setSyntax()
call s:softRefreshNerdTree()
endfunction
" a:1 (bufferName), a:2 (isDirectory)
" scope: public
function! WebDevIconsGetFileTypeSymbol(...) abort
if a:0 == 0
let fileNodeExtension = !empty(expand('%:e')) ? expand('%:e') : &filetype
let fileNode = expand('%:t')
let isDirectory = 0
else
let fileNodeExtension = fnamemodify(a:1, ':e')
let fileNode = fnamemodify(a:1, ':t')
if a:0 > 1
let isDirectory = a:2
else
let isDirectory = 0
endif
endif
if isDirectory == 0 || g:DevIconsEnableFolderPatternMatching
let symbol = g:WebDevIconsUnicodeDecorateFileNodesDefaultSymbol
let fileNodeExtension = tolower(fileNodeExtension)
let fileNode = tolower(fileNode)
for [pattern, glyph] in items(g:WebDevIconsUnicodeDecorateFileNodesPatternSymbols)
if match(fileNode, pattern) != -1
let symbol = glyph
break
endif
endfor
if symbol == g:WebDevIconsUnicodeDecorateFileNodesDefaultSymbol
if has_key(g:WebDevIconsUnicodeDecorateFileNodesExactSymbols, fileNode)
let symbol = g:WebDevIconsUnicodeDecorateFileNodesExactSymbols[fileNode]
elseif ((isDirectory == 1 && g:DevIconsEnableFolderExtensionPatternMatching) || isDirectory == 0) && has_key(g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols, fileNodeExtension)
let symbol = g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols[fileNodeExtension]
elseif isDirectory == 1
let symbol = g:WebDevIconsUnicodeDecorateFolderNodesDefaultSymbol
endif
endif
else
let symbol = g:WebDevIconsUnicodeDecorateFolderNodesDefaultSymbol
endif
let artifactFix = s:DevIconsGetArtifactFix()
return symbol . artifactFix
endfunction
" scope: local
" Temporary (hopefully) fix for glyph issues in gvim (proper fix is with the
" actual font patcher)
function! s:DevIconsGetArtifactFix()
if g:DevIconsAppendArtifactFix == 1
let artifactFix = g:DevIconsArtifactFixChar
else
let artifactFix = ''
endif
return artifactFix
endfunction
" scope: public
function! WebDevIconsGetFileFormatSymbol(...)
let fileformat = ''
let bomb = ''
if (&bomb && g:WebDevIconsUnicodeByteOrderMarkerDefaultSymbol !=? '')
let bomb = g:WebDevIconsUnicodeByteOrderMarkerDefaultSymbol . ' '
endif
if &fileformat ==? 'dos'
let fileformat = ''
elseif &fileformat ==? 'unix'
let fileformat = s:isDarwin() ? '' : s:getDistro()
elseif &fileformat ==? 'mac'
let fileformat = ''
endif
let artifactFix = s:DevIconsGetArtifactFix()
return bomb . fileformat . artifactFix
endfunction
" for airline plugin {{{3
"========================================================================
" scope: public
function! AirlineWebDevIcons(...)
let w:airline_section_x = get(w:, 'airline_section_x',
\ get(g:, 'airline_section_x', ''))
let w:airline_section_x .= ' %{WebDevIconsGetFileTypeSymbol()} '
let hasFileFormatEncodingPart = airline#parts#ffenc() !=? ''
if g:webdevicons_enable_airline_statusline_fileformat_symbols && hasFileFormatEncodingPart
let w:airline_section_y = ' %{&fenc . " " . WebDevIconsGetFileFormatSymbol()} '
endif
endfunction
if g:webdevicons_enable == 1 && exists('g:loaded_airline') && g:loaded_airline == 1 && g:webdevicons_enable_airline_statusline
call airline#add_statusline_func('AirlineWebDevIcons')
endif
if g:webdevicons_enable == 1 && g:webdevicons_enable_airline_tabline
" Store original formatter.
let g:_webdevicons_airline_orig_formatter = get(g:, 'airline#extensions#tabline#formatter', 'default')
let g:airline#extensions#tabline#formatter = 'webdevicons'
endif
" for nerdtree plugin {{{3
"========================================================================
" scope: public
function! NERDTreeWebDevIconsRefreshListener(event)
let path = a:event.subject
let postPadding = g:WebDevIconsNerdTreeAfterGlyphPadding
let prePadding = g:WebDevIconsNerdTreeBeforeGlyphPadding
let hasGitFlags = (len(path.flagSet._flagsForScope('git')) > 0)
let hasGitNerdTreePlugin = (exists('g:loaded_nerdtree_git_status') == 1)
let artifactFix = s:DevIconsGetArtifactFix()
" align vertically at the same level: non git-flag nodes with git-flag nodes
if g:WebDevIconsNerdTreeGitPluginForceVAlign && !hasGitFlags && hasGitNerdTreePlugin
let prePadding .= ' '
endif
if !path.isDirectory
" Hey we got a regular file, lets get it's proper icon
let flag = prePadding . WebDevIconsGetFileTypeSymbol(path.str()) . postPadding
elseif path.isDirectory && g:WebDevIconsUnicodeDecorateFolderNodes == 1
" Ok we got a directory, some more tests and checks
let directoryOpened = 0
if g:DevIconsEnableFoldersOpenClose && len(path.flagSet._flagsForScope('webdevicons')) > 0
" did the user set different icons for open and close?
" isOpen is not available on the path listener directly
" but we added one via overriding particular keymappings for NERDTree
if has_key(path, 'isOpen') && path.isOpen == 1
let directoryOpened = 1
endif
endif
if g:WebDevIconsUnicodeDecorateFolderNodesExactMatches == 1
" Did the user enable exact matching of folder type/names
" think node_modules
if g:DevIconsEnableFoldersOpenClose && directoryOpened
" the folder is open
let flag = prePadding . g:DevIconsDefaultFolderOpenSymbol . artifactFix . postPadding
else
" the folder is not open
if path.isSymLink
" We have a symlink
let flag = prePadding . g:WebDevIconsUnicodeDecorateFolderNodesSymlinkSymbol . artifactFix . postPadding
else
" We have a regular folder
let flag = prePadding . WebDevIconsGetFileTypeSymbol(path.str(), path.isDirectory) . postPadding
endif
endif
else
" the user did not enable exact matching
if g:DevIconsEnableFoldersOpenClose && directoryOpened
" the folder is open
let flag = prePadding . g:DevIconsDefaultFolderOpenSymbol . artifactFix . postPadding
else
" the folder is not open
if path.isSymLink
" We have a symlink
let flag = prePadding . g:WebDevIconsUnicodeDecorateFolderNodesSymlinkSymbol . artifactFix . postPadding
else
" We have a regular folder
let flag = prePadding . g:WebDevIconsUnicodeDecorateFolderNodesDefaultSymbol . artifactFix . postPadding
endif
endif
endif
else
let flag = prePadding . ' ' . artifactFix . postPadding
endif
call path.flagSet.clearFlags('webdevicons')
if flag !=? ''
call path.flagSet.addFlag('webdevicons', flag)
endif
endfunction
" call setup after processing all the functions (to avoid errors) {{{1
"========================================================================
" had some issues with VimEnter, for now using:
call s:initialize()
" standard fix/safety: line continuation (avoiding side effects) {{{1
"========================================================================
let &cpo = s:save_cpo
unlet s:save_cpo
" modeline syntax:
" vim: fdm=marker tabstop=2 softtabstop=2 shiftwidth=2 expandtab: