From bea112fef8b723fbe4f88ceb8a2aafb393b6edb2 Mon Sep 17 00:00:00 2001 From: Chris Hu Date: Wed, 17 Aug 2016 11:00:18 +0800 Subject: [PATCH 01/22] add my_configs.vim --- .gitignore | 3 --- my_configs.vim | 12 ++++++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 my_configs.vim diff --git a/.gitignore b/.gitignore index 55273366..0448f793 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,4 @@ temp_dirs/yankring_history_v2.txt sources_forked/yankring/doc/tags sources_non_forked/tlib/doc/tags sources_non_forked/ctrlp.vim/doc/tags* -my_plugins/ -my_configs.vim tags -.DS_Store diff --git a/my_configs.vim b/my_configs.vim new file mode 100644 index 00000000..75c11648 --- /dev/null +++ b/my_configs.vim @@ -0,0 +1,12 @@ +if has("mac") || has("macunix") + set gfn=Hack:h24,Source\ Code\ Pro:h24,Menlo:h24 +elseif has("win16") || has("win32") + set gfn=Hack:h18,Source\ Code\ Pro:h16,Bitstream\ Vera\ Sans\ Mono:h15 +elseif has("gui_gtk2") + set gfn=Hack\ 18,Source\ Code\ Pro\ 16,Bitstream\ Vera\ Sans\ Mono\ 15 +elseif has("linux") + set gfn=Hack\ 18,Source\ Code\ Pro\ 16,Bitstream\ Vera\ Sans\ Mono\ 15 +elseif has("unix") + set gfn=Monospace\ 20 +endif + From 35f23c01289ff3942c9c9bcf8f6d4cf125251982 Mon Sep 17 00:00:00 2001 From: Chris Hu Date: Wed, 17 Aug 2016 21:35:55 +0800 Subject: [PATCH 02/22] update configs --- my_configs.vim | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/my_configs.vim b/my_configs.vim index 75c11648..1c9aaba0 100644 --- a/my_configs.vim +++ b/my_configs.vim @@ -10,3 +10,29 @@ elseif has("unix") set gfn=Monospace\ 20 endif +" move around tabs. conflict with the original screen top/bottom +" comment them out if you want the original H/L +" go to prev tab +map gT +" go to next tab +map gt +" mv current tab left +map :execute 'tabmove ' . (tabpagenr()-2) +" mv current tab right +map :execute 'tabmove ' . tabpagenr() + +" new tab +map :tabnew +" close tab +map :tabclose + +" toggle NerdTree +map :NERDTreeToggle + +set expandtab +set shiftwidth=2 +set tabstop=2 +set softtabstop=2 + +set cmdheight=1 + From db2bf731a3ac6867deedf9501b5a3f2b1cfcc532 Mon Sep 17 00:00:00 2001 From: Chris Hu Date: Thu, 18 Aug 2016 08:41:38 +0800 Subject: [PATCH 03/22] add vim-jsx, vim-javascript --- .../vim-javascript/CONTRIBUTING.md | 18 + sources_non_forked/vim-javascript/README.md | 119 ++++++ .../after/ftplugin/javascript.vim | 8 + .../vim-javascript/extras/ctags | 8 + .../vim-javascript/extras/flow.vim | 87 +++++ .../vim-javascript/extras/jsdoc.vim | 39 ++ .../vim-javascript/extras/ngdoc.vim | 3 + .../vim-javascript/ftdetect/javascript.vim | 10 + .../vim-javascript/indent/javascript.vim | 198 ++++++++++ .../vim-javascript/syntax/javascript.vim | 354 ++++++++++++++++++ sources_non_forked/vim-jsx/README.md | 138 +++++++ .../vim-jsx/after/ftplugin/jsx.vim | 16 + .../vim-jsx/after/indent/jsx.vim | 114 ++++++ .../vim-jsx/after/syntax/jsx.vim | 61 +++ .../vim-jsx/ftdetect/javascript.vim | 36 ++ 15 files changed, 1209 insertions(+) create mode 100644 sources_non_forked/vim-javascript/CONTRIBUTING.md create mode 100644 sources_non_forked/vim-javascript/README.md create mode 100644 sources_non_forked/vim-javascript/after/ftplugin/javascript.vim create mode 100644 sources_non_forked/vim-javascript/extras/ctags create mode 100644 sources_non_forked/vim-javascript/extras/flow.vim create mode 100644 sources_non_forked/vim-javascript/extras/jsdoc.vim create mode 100644 sources_non_forked/vim-javascript/extras/ngdoc.vim create mode 100644 sources_non_forked/vim-javascript/ftdetect/javascript.vim create mode 100644 sources_non_forked/vim-javascript/indent/javascript.vim create mode 100644 sources_non_forked/vim-javascript/syntax/javascript.vim create mode 100644 sources_non_forked/vim-jsx/README.md create mode 100644 sources_non_forked/vim-jsx/after/ftplugin/jsx.vim create mode 100644 sources_non_forked/vim-jsx/after/indent/jsx.vim create mode 100644 sources_non_forked/vim-jsx/after/syntax/jsx.vim create mode 100644 sources_non_forked/vim-jsx/ftdetect/javascript.vim diff --git a/sources_non_forked/vim-javascript/CONTRIBUTING.md b/sources_non_forked/vim-javascript/CONTRIBUTING.md new file mode 100644 index 00000000..c47cbc86 --- /dev/null +++ b/sources_non_forked/vim-javascript/CONTRIBUTING.md @@ -0,0 +1,18 @@ +## Contributing + +This project uses the [git +flow](http://nvie.com/posts/a-successful-git-branching-model/) model for +development. There's [a handy git module for git +flow](//github.com/nvie/gitflow). If you'd like to be added as a contributor, +the price of admission is 1 pull request. Please follow the general code style +guides (read the code) and in your pull request explain the reason for the +proposed change and how it is valuable. + +## Pull Requests + +Please make your pull requests against the `develop` branch; we stage changes +for testing there to avoid unexpected breakages for our users. :) + +## Bug report + +Report a bug on [GitHub Issues](https://github.com/pangloss/vim-javascript/issues). diff --git a/sources_non_forked/vim-javascript/README.md b/sources_non_forked/vim-javascript/README.md new file mode 100644 index 00000000..bcefe6c6 --- /dev/null +++ b/sources_non_forked/vim-javascript/README.md @@ -0,0 +1,119 @@ +# vim-javascript + +JavaScript bundle for vim, this bundle provides syntax highlighting and +improved indentation. + + +## Installation + +### Install with [Vundle](https://github.com/gmarik/vundle) + +Add to vimrc: + + Plugin 'pangloss/vim-javascript' + +And install it: + + :so ~/.vimrc + :PluginInstall + +### Install with [vim-plug](https://github.com/junegunn/vim-plug) + +Add to vimrc: + + Plug 'pangloss/vim-javascript' + +And install it: + + :so ~/.vimrc + :PlugInstall + +### Install with [pathogen](https://github.com/tpope/vim-pathogen) + + git clone https://github.com/pangloss/vim-javascript.git ~/.vim/bundle/vim-javascript + + +## Configuration Variables + +The following variables control certain syntax highlighting plugins. You can +add them to your `.vimrc` to enable their features. + +----------------- + +``` +let g:javascript_plugin_jsdoc = 1 +``` + +Enables syntax highlighting for [JSDocs](http://usejsdoc.org/). + +Default Value: 0 + +----------------- + +``` +let g:javascript_plugin_ngdoc = 1 +``` + +Enables some additional syntax highlighting for NGDocs. Requires JSDoc plugin +to be enabled as well. + +Default Value: 0 + +----------------- + +``` +let g:javascript_plugin_flow = 1 +``` + +Enables syntax highlighting for [Flow](https://flowtype.org/). + +Default Value: 0 + +----------------- + +``` +set foldmethod=syntax +``` + +Enables code folding based on our syntax file. + +Please note this can have a dramatic effect on performance and because it is a +global vim option, we do not set it ourselves. + + +## Concealing Characters + +You can customize concealing characters by defining one or more of the following +variables: + + let g:javascript_conceal_function = "ƒ" + let g:javascript_conceal_null = "ø" + let g:javascript_conceal_this = "@" + let g:javascript_conceal_return = "⇚" + let g:javascript_conceal_undefined = "¿" + let g:javascript_conceal_NaN = "ℕ" + let g:javascript_conceal_prototype = "¶" + let g:javascript_conceal_static = "•" + let g:javascript_conceal_super = "Ω" + let g:javascript_conceal_arrow_function = "⇒" + + +## Contributing + +This project uses the [git +flow](http://nvie.com/posts/a-successful-git-branching-model/) model for +development. There's [a handy git module for git +flow](//github.com/nvie/gitflow). If you'd like to be added as a contributor, +the price of admission is 1 pull request. Please follow the general code style +guides (read the code) and in your pull request explain the reason for the +proposed change and how it is valuable. + + +## Bug Reports + +Report a bug on [GitHub Issues](https://github.com/pangloss/vim-javascript/issues). + + +## License + +Distributed under the same terms as Vim itself. See `:help license`. diff --git a/sources_non_forked/vim-javascript/after/ftplugin/javascript.vim b/sources_non_forked/vim-javascript/after/ftplugin/javascript.vim new file mode 100644 index 00000000..e2d471dd --- /dev/null +++ b/sources_non_forked/vim-javascript/after/ftplugin/javascript.vim @@ -0,0 +1,8 @@ +" Vim filetype plugin file +" Language: JavaScript +" Maintainer: vim-javascript community +" URL: https://github.com/pangloss/vim-javascript + +setlocal iskeyword+=$ suffixesadd+=.js + +let b:undo_ftplugin .= ' | setlocal iskeyword< suffixesadd<' diff --git a/sources_non_forked/vim-javascript/extras/ctags b/sources_non_forked/vim-javascript/extras/ctags new file mode 100644 index 00000000..cdc4edc0 --- /dev/null +++ b/sources_non_forked/vim-javascript/extras/ctags @@ -0,0 +1,8 @@ +--langdef=js +--langmap=js:.js +--regex-js=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\{/\1/,object/ +--regex-js=/([A-Za-z0-9._$()]+)[ \t]*[:=][ \t]*function[ \t]*\(/\1/,function/ +--regex-js=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*([^)])/\1/,function/ +--regex-js=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\[/\1/,array/ +--regex-js=/([^= ]+)[ \t]*=[ \t]*[^"]'[^']*/\1/,string/ +--regex-js=/([^= ]+)[ \t]*=[ \t]*[^']"[^"]*/\1/,string/ diff --git a/sources_non_forked/vim-javascript/extras/flow.vim b/sources_non_forked/vim-javascript/extras/flow.vim new file mode 100644 index 00000000..a1848830 --- /dev/null +++ b/sources_non_forked/vim-javascript/extras/flow.vim @@ -0,0 +1,87 @@ +syntax region jsFlowDefinition contained start=/:/ end=/\%(\s*[,=;)\n]\)\@=/ contains=@jsFlowCluster containedin=jsParen +syntax region jsFlowArgumentDef contained start=/:/ end=/\%(\s*[,)]\|=>\@!\)\@=/ contains=@jsFlowCluster +syntax region jsFlowArray contained matchgroup=jsFlowNoise start=/\[/ end=/\]/ contains=@jsFlowCluster +syntax region jsFlowObject contained matchgroup=jsFlowNoise start=/{/ end=/}/ contains=@jsFlowCluster +syntax region jsFlowParens contained matchgroup=jsFlowNoise start=/(/ end=/)/ contains=@jsFlowCluster +syntax match jsFlowNoise contained /[:;,<>]/ +syntax keyword jsFlowType contained boolean number string null void any mixed JSON array function object array bool class +syntax keyword jsFlowTypeof contained typeof skipempty skipempty nextgroup=jsFlowTypeCustom,jsFlowType +syntax match jsFlowTypeCustom contained /\k*/ skipwhite skipempty nextgroup=jsFlowGroup +syntax region jsFlowGroup contained matchgroup=jsFlowNoise start=// contains=@jsFlowCluster +syntax region jsFlowArrowArguments contained matchgroup=jsFlowNoise start=/(/ end=/)\%(\s*=>\)\@=/ oneline skipwhite skipempty nextgroup=jsFlowArrow contains=@jsFlowCluster +syntax match jsFlowArrow contained /=>/ skipwhite skipempty nextgroup=jsFlowType,jsFlowTypeCustom,jsFlowParens +syntax match jsFlowMaybe contained /?/ skipwhite skipempty nextgroup=jsFlowType,jsFlowTypeCustom,jsFlowParens,jsFlowArrowArguments +syntax match jsFlowObjectKey contained /[0-9a-zA-Z_$?]*\(\s*:\)\@=/ contains=jsFunctionKey,jsFlowMaybe skipwhite skipempty nextgroup=jsObjectValue containedin=jsObject +syntax match jsFlowOrOperator contained /|/ skipwhite skipempty nextgroup=@jsFlowCluster + +syntax match jsFlowReturn contained /:\s*/ contains=jsFlowNoise skipwhite skipempty nextgroup=@jsFlowReturnCluster +syntax region jsFlowReturnObject contained matchgroup=jsFlowNoise start=/{/ end=/}/ contains=@jsFlowCluster skipwhite skipempty nextgroup=jsFuncBlock,jsFlowReturnOrOp +syntax region jsFlowReturnArray contained matchgroup=jsFlowNoise start=/\[/ end=/\]/ contains=@jsFlowCluster skipwhite skipempty nextgroup=jsFuncBlock,jsFlowReturnOrOp +syntax region jsFlowReturnParens contained matchgroup=jsFlowNoise start=/(/ end=/)/ contains=@jsFlowCluster skipwhite skipempty nextgroup=jsFuncBlock,jsFlowReturnOrOp +syntax match jsFlowReturnKeyword contained /\k\+/ contains=jsFlowType,jsFlowTypeCustom skipwhite skipempty nextgroup=jsFlowReturnGroup,jsFuncBlock,jsFlowReturnOrOp +syntax match jsFlowReturnMaybe contained /?/ skipwhite skipempty nextgroup=jsFlowReturnKeyword +syntax region jsFlowReturnGroup contained matchgroup=jsFlowNoise start=// contains=@jsFlowCluster skipwhite skipempty nextgroup=jsFuncBlock,jsFlowReturnOrOp +syntax match jsFlowReturnOrOp contained /\s*|\s*/ skipwhite skipempty nextgroup=@jsFlowReturnCluster + +syntax region jsFlowFunctionGroup contained matchgroup=jsFlowNoise start=// contains=@jsFlowCluster skipwhite skipempty nextgroup=jsFuncArgs +syntax region jsFlowClassGroup contained matchgroup=jsFlowNoise start=// contains=@jsFlowCluster skipwhite skipempty nextgroup=jsClassBlock + +syntax region jsFlowTypeStatement start=/type/ end=/=\@=/ contains=jsFlowTypeOperator oneline skipwhite skipempty nextgroup=jsFlowTypeValue keepend +syntax region jsFlowTypeValue contained start=/=/ end=/[;\n]/ contains=@jsExpression,jsFlowGroup,jsFlowMaybe +syntax match jsFlowTypeOperator contained /=/ +syntax keyword jsFlowTypeKeyword contained type + +syntax keyword jsFlowDeclare declare skipwhite skipempty nextgroup=jsFlowTypeStatement,jsClassDefinition,jsStorageClass,jsFlowModule,jsFlowInterface +syntax match jsFlowClassProperty contained /\<[0-9a-zA-Z_$]*\>:\@=/ skipwhite skipempty nextgroup=jsFlowClassDef containedin=jsClassBlock +syntax region jsFlowClassDef contained start=/:/ end=/\%(\s*[,=;)\n]\)\@=/ contains=@jsFlowCluster skipwhite skipempty nextgroup=jsClassValue + +syntax region jsFlowModule contained start=/module/ end=/{\@=/ skipempty skipempty nextgroup=jsFlowDeclareBlock contains=jsString +syntax region jsFlowInterface contained start=/interface/ end=/{\@=/ skipempty skipempty nextgroup=jsFlowInterfaceBlock contains=@jsFlowCluster +syntax region jsFlowDeclareBlock contained matchgroup=jsFlowNoise start=/{/ end=/}/ contains=jsFlowDeclare,jsFlowNoise + +syntax region jsFlowInterfaceBlock contained matchgroup=jsFlowNoise start=/{/ end=/}/ contains=jsObjectKey,jsObjectKeyString,jsObjectKeyComputed,jsObjectSeparator,jsObjectFuncName,jsObjectMethodType,jsGenerator,jsComment,jsObjectStringKey,jsSpreadExpression,jsFlowNoise keepend + +syntax cluster jsFlowReturnCluster contains=jsFlowNoise,jsFlowReturnObject,jsFlowReturnArray,jsFlowReturnKeyword,jsFlowReturnGroup,jsFlowReturnMaybe,jsFlowReturnOrOp +syntax cluster jsFlowCluster contains=jsFlowArray,jsFlowObject,jsFlowNoise,jsFlowTypeof,jsFlowType,jsFlowGroup,jsFlowArrowArguments,jsFlowMaybe,jsFlowParens,jsFlowOrOperator + +if version >= 508 || !exists("did_javascript_syn_inits") + if version < 508 + let did_javascript_syn_inits = 1 + command -nargs=+ HiLink hi link + else + command -nargs=+ HiLink hi def link + endif + HiLink jsFlowDefinition PreProc + HiLink jsFlowClassDef jsFlowDefinition + HiLink jsFlowArgumentDef jsFlowDefinition + HiLink jsFlowType Type + HiLink jsFlowTypeCustom PreProc + HiLink jsFlowTypeof PreProc + HiLink jsFlowArray PreProc + HiLink jsFlowObject PreProc + HiLink jsFlowParens PreProc + HiLink jsFlowGroup PreProc + HiLink jsFlowReturn PreProc + HiLink jsFlowReturnObject jsFlowReturn + HiLink jsFlowReturnArray jsFlowArray + HiLink jsFlowReturnParens jsFlowParens + HiLink jsFlowReturnGroup jsFlowGroup + HiLink jsFlowFunctionGroup PreProc + HiLink jsFlowClassGroup PreProc + HiLink jsFlowArrowArguments PreProc + HiLink jsFlowArrow PreProc + HiLink jsFlowTypeStatement PreProc + HiLink jsFlowTypeKeyword PreProc + HiLink jsFlowTypeOperator PreProc + HiLink jsFlowMaybe PreProc + HiLink jsFlowReturnMaybe PreProc + HiLink jsFlowClassProperty jsClassProperty + HiLink jsFlowDeclare PreProc + HiLink jsFlowModule PreProc + HiLink jsFlowInterface PreProc + HiLink jsFlowNoise Noise + HiLink jsFlowObjectKey jsObjectKey + HiLink jsFlowOrOperator PreProc + HiLink jsFlowReturnOrOp jsFlowOrOperator + delcommand HiLink +endif diff --git a/sources_non_forked/vim-javascript/extras/jsdoc.vim b/sources_non_forked/vim-javascript/extras/jsdoc.vim new file mode 100644 index 00000000..fff64f89 --- /dev/null +++ b/sources_non_forked/vim-javascript/extras/jsdoc.vim @@ -0,0 +1,39 @@ +"" syntax coloring for javadoc comments (HTML) +syntax region jsComment matchgroup=jsComment start="/\*\s*" end="\*/" contains=jsDocTags,jsCommentTodo,jsCvsTag,@jsHtml,@Spell fold + +" tags containing a param +syntax match jsDocTags contained "@\(alias\|api\|augments\|borrows\|class\|constructs\|default\|defaultvalue\|emits\|exception\|exports\|extends\|fires\|kind\|link\|listens\|member\|member[oO]f\|mixes\|module\|name\|namespace\|requires\|template\|throws\|var\|variation\|version\)\>" skipwhite nextgroup=jsDocParam +" tags containing type and param +syntax match jsDocTags contained "@\(arg\|argument\|cfg\|param\|property\|prop\)\>" skipwhite nextgroup=jsDocType +" tags containing type but no param +syntax match jsDocTags contained "@\(callback\|define\|enum\|external\|implements\|this\|type\|typedef\|return\|returns\)\>" skipwhite nextgroup=jsDocTypeNoParam +" tags containing references +syntax match jsDocTags contained "@\(lends\|see\|tutorial\)\>" skipwhite nextgroup=jsDocSeeTag +" other tags (no extra syntax) +syntax match jsDocTags contained "@\(abstract\|access\|accessor\|author\|classdesc\|constant\|const\|constructor\|copyright\|deprecated\|desc\|description\|dict\|event\|example\|file\|file[oO]verview\|final\|function\|global\|ignore\|inheritDoc\|inner\|instance\|interface\|license\|localdoc\|method\|mixin\|nosideeffects\|override\|overview\|preserve\|private\|protected\|public\|readonly\|since\|static\|struct\|todo\|summary\|undocumented\|virtual\)\>" + +syntax region jsDocType contained matchgroup=jsDocTypeBrackets start="{" end="}" contains=jsDocTypeRecord oneline skipwhite nextgroup=jsDocParam +syntax match jsDocType contained "\%(#\|\"\|\w\|\.\|:\|\/\)\+" skipwhite nextgroup=jsDocParam +syntax region jsDocTypeRecord contained start=/{/ end=/}/ contains=jsDocTypeRecord extend +syntax region jsDocTypeRecord contained start=/\[/ end=/\]/ contains=jsDocTypeRecord extend +syntax region jsDocTypeNoParam contained start="{" end="}" oneline +syntax match jsDocTypeNoParam contained "\%(#\|\"\|\w\|\.\|:\|\/\)\+" +syntax match jsDocParam contained "\%(#\|\$\|-\|'\|\"\|{.\{-}}\|\w\|\.\|:\|\/\|\[.{-}]\|=\)\+" +syntax region jsDocSeeTag contained matchgroup=jsDocSeeTag start="{" end="}" contains=jsDocTags + +if version >= 508 || !exists("did_javascript_syn_inits") + if version < 508 + let did_javascript_syn_inits = 1 + command -nargs=+ HiLink hi link + else + command -nargs=+ HiLink hi def link + endif + HiLink jsDocTags Special + HiLink jsDocSeeTag Function + HiLink jsDocType Type + HiLink jsDocTypeBrackets jsDocType + HiLink jsDocTypeRecord jsDocType + HiLink jsDocTypeNoParam Type + HiLink jsDocParam Label + delcommand HiLink +endif diff --git a/sources_non_forked/vim-javascript/extras/ngdoc.vim b/sources_non_forked/vim-javascript/extras/ngdoc.vim new file mode 100644 index 00000000..c513d875 --- /dev/null +++ b/sources_non_forked/vim-javascript/extras/ngdoc.vim @@ -0,0 +1,3 @@ +syntax match jsDocTags contained /@\(link\|method[oO]f\|ngdoc\|ng[iI]nject\|restrict\)/ nextgroup=jsDocParam skipwhite +syntax match jsDocType contained "\%(#\|\$\|\w\|\"\|-\|\.\|:\|\/\)\+" nextgroup=jsDocParam skipwhite +syntax match jsDocParam contained "\%(#\|\$\|\w\|\"\|-\|\.\|:\|{\|}\|\/\|\[\|]\|=\)\+" diff --git a/sources_non_forked/vim-javascript/ftdetect/javascript.vim b/sources_non_forked/vim-javascript/ftdetect/javascript.vim new file mode 100644 index 00000000..d6aa6d01 --- /dev/null +++ b/sources_non_forked/vim-javascript/ftdetect/javascript.vim @@ -0,0 +1,10 @@ +au BufNewFile,BufRead *.js setf javascript +au BufNewFile,BufRead *.jsm setf javascript +au BufNewFile,BufRead Jakefile setf javascript + +fun! s:SelectJavascript() + if getline(1) =~# '^#!.*/bin/\%(env\s\+\)\?node\>' + set ft=javascript + endif +endfun +au BufNewFile,BufRead * call s:SelectJavascript() diff --git a/sources_non_forked/vim-javascript/indent/javascript.vim b/sources_non_forked/vim-javascript/indent/javascript.vim new file mode 100644 index 00000000..6844dc2f --- /dev/null +++ b/sources_non_forked/vim-javascript/indent/javascript.vim @@ -0,0 +1,198 @@ +" Vim indent file +" Language: Javascript +" Maintainer: vim-javascript community +" URL: https://github.com/pangloss/vim-javascript +" Acknowledgement: Based off of vim-ruby maintained by Nikolai Weibull http://vim-ruby.rubyforge.org + +" Only load this indent file when no other was loaded. +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +" Now, set up our indentation expression and keys that trigger it. +setlocal indentexpr=GetJavascriptIndent() +setlocal nolisp +setlocal indentkeys=0{,0},0),0],:,!^F,o,O,e +setlocal cinoptions+=j1,J1 + +let b:undo_indent = 'setlocal indentexpr< indentkeys< cinoptions<' + +" Only define the function once. +if exists("*GetJavascriptIndent") + finish +endif + +let s:cpo_save = &cpo +set cpo&vim + +" Get shiftwidth value +if exists('*shiftwidth') + func s:sw() + return shiftwidth() + endfunc +else + func s:sw() + return &sw + endfunc +endif + +let s:line_pre = '^\s*\%(\/\*.*\*\/\s*\)*' +let s:expr_case = s:line_pre . '\%(\%(case\>.*\)\|default\)\s*:\C' +" Regex of syntax group names that are or delimit string or are comments. +let s:syng_strcom = '\%(string\|regex\|special\|doc\|comment\|template\)\c' + +" Regex of syntax group names that are strings or documentation. +let s:syng_comment = '\%(comment\|doc\)\c' + +" Expression used to check whether we should skip a match with searchpair(). +let s:skip_expr = "line('.') < (prevnonblank(v:lnum) - 2000) ? dummy : s:IsSyn(line('.'),col('.'),'')" + +func s:lookForParens(start,end,flags,time) + try + return searchpair(a:start,'',a:end,a:flags,s:skip_expr,0,a:time) + catch /E118/ + return searchpair(a:start,'',a:end,a:flags,0,0) + endtry +endfunc + +let s:line_term = '\s*\%(\%(:\@\@!\||\|&\|in\%(stanceof\)\=\>\)\C' +endif +let g:javascript_opfirst = s:line_pre . g:javascript_opfirst + +if !exists('g:javascript_continuation') + let g:javascript_continuation = '\%([*,.?:^%]\|+\@' . (a:add ? '\|\ -1 && + \ s:lookForParens('(', ')', 'cbW', 100) > 0 && + \ search((a:add ? '\%(function\*\|[A-Za-z_$][0-9A-Za-z_$]*\)\C' : + \ '\<\%(for\%(\s+each\)\=\|if\|let\|switch\|while\|with\)\C') . '\_s*\%#','bW')) && + \ (a:add || (expand("") == 'while' ? !s:lookForParens('\\C', '\\C','bW',100) : 1)) +endfunction + +" Auxiliary Functions {{{2 + +" Check if the character at lnum:col is inside a string, comment, or is ascii. +function s:IsSyn(lnum, col, reg) + return synIDattr(synID(a:lnum, a:col, 1), 'name') =~? (a:reg != '' ? a:reg : s:syng_strcom) +endfunction + +" Find line above 'lnum' that isn't empty, in a comment, or in a string. +function s:PrevCodeLine(lnum) + let lnum = prevnonblank(a:lnum) + while lnum > 0 + if !s:IsSyn(lnum, matchend(getline(lnum), '^\s*[^''"]'),'') + break + endif + let lnum = prevnonblank(lnum - 1) + endwhile + return lnum +endfunction + +" Check if line 'lnum' has more opening brackets than closing ones. +function s:LineHasOpeningBrackets(lnum) + let open_0 = 0 + let open_2 = 0 + let open_4 = 0 + let line = getline(a:lnum) + let pos = match(line, '[][(){}]', 0) + let last = 0 + while pos != -1 + if !s:IsSyn(a:lnum, pos + 1, '') + let idx = stridx('(){}[]', line[pos]) + if idx % 2 == 0 + let open_{idx} = open_{idx} + 1 + let last = pos + else + let open_{idx - 1} = open_{idx - 1} - 1 + endif + endif + let pos = match(line, '[][(){}]', pos + 1) + endwhile + return [(open_0 > 0 ? 1 : (open_0 == 0 ? 0 : 2)) . (open_2 > 0 ? 1 : (open_2 == 0 ? 0 : 2)) . + \ (open_4 > 0 ? 1 : (open_4 == 0 ? 0 : 2)), last] +endfunction +" }}} + +function GetJavascriptIndent() + if !exists('b:js_cache') + let b:js_cache = [0,0,0] + end + " Get the current line. + let line = getline(v:lnum) + " previous nonblank line number + let prevline = prevnonblank(v:lnum - 1) + " previous line of code + let lnum = s:PrevCodeLine(v:lnum - 1) + if lnum == 0 + return 0 + endif + + " start with strings,comments,etc.{{{2 + if (line !~ '^[''"`]' && s:IsSyn(v:lnum,1,'string\|template')) || + \ (line !~ '^\s*[/*]' && s:IsSyn(v:lnum,1,s:syng_comment)) + return -1 + endif + if line !~ '^\%(\/\*\|\s*\/\/\)' && s:IsSyn(v:lnum,1,s:syng_comment) + return cindent(v:lnum) + endif + + if (line =~ s:expr_case) + let cpo_switch = &cpo + set cpo+=% + let ind = cindent(v:lnum) + let &cpo = cpo_switch + return ind + endif + "}}} + + " the containing paren, bracket, curly + let pcounts = [0] + if b:js_cache[0] >= lnum && b:js_cache[0] <= v:lnum && b:js_cache[0] && + \ (b:js_cache[0] > lnum || map(pcounts,'s:LineHasOpeningBrackets(lnum)')[0][0] !~ '2') + let num = pcounts[0][0] =~ '1' ? lnum : b:js_cache[1] + if pcounts[0][0] =~'1' + call cursor(lnum,pcounts[0][1]) + end + else + call cursor(v:lnum,1) + let syns = synIDattr(synID(v:lnum, 1, 1), 'name') + if line[0] =~ '\s' && syns != '' + let pattern = syns =~? 'funcblock' ? ['{','}'] : syns =~? 'jsparen' ? ['(',')'] : syns =~? 'jsbracket'? ['\[','\]'] : + \ ['(\|{\|\[',')\|}\|\]'] + let num = s:lookForParens(pattern[0],pattern[1],'bW',2000) + else + let num = s:lookForParens('(\|{\|\[',')\|}\|\]','bW',2000) + end + end + let b:js_cache = [v:lnum,num,line('.') == v:lnum ? b:js_cache[2] : col('.')] + + " most significant part + if line =~ s:line_pre . '[])}]' + return indent(num) + end + let inb = num == 0 ? 1 : s:Onescope(num, strpart(getline(num),0,b:js_cache[2] - 1),1) + let switch_offset = (!inb || num == 0) || expand("") != 'switch' ? 0 : &cino !~ ':' || !has('float') ? s:sw() : + \ float2nr(str2float(matchstr(&cino,'.*:\zs[-0-9.]*')) * (match(&cino,'.*:\zs[^,]*s') ? s:sw() : 1)) + if ((line =~ g:javascript_opfirst || + \ (getline(lnum) =~ g:javascript_continuation && getline(lnum) !~ s:expr_case)) && + \ inb) || (s:Onescope(lnum,getline(lnum),0) && line !~ s:line_pre . '{') + return (num > 0 ? indent(num) : -s:sw()) + (s:sw() * 2) + switch_offset + elseif num > 0 + return indent(num) + s:sw() + switch_offset + end + +endfunction + + +let &cpo = s:cpo_save +unlet s:cpo_save diff --git a/sources_non_forked/vim-javascript/syntax/javascript.vim b/sources_non_forked/vim-javascript/syntax/javascript.vim new file mode 100644 index 00000000..8cf3e627 --- /dev/null +++ b/sources_non_forked/vim-javascript/syntax/javascript.vim @@ -0,0 +1,354 @@ +" Vim syntax file +" Language: JavaScript +" Maintainer: vim-javascript community +" URL: https://github.com/pangloss/vim-javascript + +if !exists("main_syntax") + if version < 600 + syntax clear + elseif exists("b:current_syntax") + finish + endif + let main_syntax = 'javascript' +endif + +" Dollar sign is permitted anywhere in an identifier +if v:version > 704 || v:version == 704 && has('patch1142') + syntax iskeyword @,48-57,_,192-255,$ +else + setlocal iskeyword+=$ +endif + +syntax sync fromstart +" TODO: Figure out what type of casing I need +" syntax case ignore +syntax case match + +syntax match jsNoise /[:,\;\.]\{1}/ +syntax match jsFuncCall /\k\+\%(\s*(\)\@=/ +syntax match jsParensError /[)}\]]/ + +" Program Keywords +syntax keyword jsStorageClass const var let skipwhite skipempty nextgroup=jsDestructuringBlock,jsDestructuringArray,jsVariableDef +syntax match jsVariableDef contained /\k\+/ nextgroup=jsFlowDefinition +syntax keyword jsOperator delete instanceof typeof void new in of +syntax match jsOperator /[\!\|\&\+\-\<\>\=\%\/\*\~\^]\{1}/ +syntax keyword jsBooleanTrue true +syntax keyword jsBooleanFalse false + +" Modules +syntax keyword jsModuleKeywords contained import +syntax keyword jsModuleKeywords contained export skipwhite skipempty nextgroup=jsExportBlock,jsModuleDefault +syntax keyword jsModuleOperators contained from +syntax keyword jsModuleOperators contained as +syntax region jsModuleGroup contained matchgroup=jsBraces start=/{/ end=/}/ contains=jsModuleOperators,jsNoise,jsComment +syntax match jsModuleAsterisk contained /*/ +syntax keyword jsModuleDefault contained default skipwhite skipempty nextgroup=@jsExpression +syntax region jsImportContainer start=/\ / end="\%(;\|$\)" contains=jsModuleKeywords,jsModuleOperators,jsComment,jsString,jsTemplateString,jsNoise,jsModuleGroup,jsModuleAsterisk +syntax region jsExportContainer start=/\ / end="\%(;\|$\)" contains=jsModuleKeywords,jsModuleOperators,jsStorageClass,jsModuleDefault,@jsExpression +syntax region jsExportBlock contained matchgroup=jsBraces start=/{/ end=/}/ contains=jsModuleOperators,jsNoise,jsComment + +" Strings, Templates, Numbers +syntax region jsString start=+"+ skip=+\\\("\|$\)+ end=+"\|$+ contains=jsSpecial,@Spell extend +syntax region jsString start=+'+ skip=+\\\('\|$\)+ end=+'\|$+ contains=jsSpecial,@Spell extend +syntax region jsTemplateString start=+`+ skip=+\\\(`\|$\)+ end=+`+ contains=jsTemplateVar,jsSpecial extend +syntax match jsTaggedTemplate /\k\+\%(`\)\@=/ nextgroup=jsTemplateString +syntax match jsNumber /\<\d\+\%([eE][+-]\=\d\+\)\=\>\|\<0[bB][01]\+\>\|\<0[oO]\o\+\>\|\<0[xX]\x\+\>/ +syntax keyword jsNumber Infinity +syntax match jsFloat /\<\%(\d\+\.\d\+\|\d\+\.\|\.\d\+\)\%([eE][+-]\=\d\+\)\=\>/ + +" Regular Expressions +syntax match jsSpecial contained "\v\\%(0|\\x\x\{2\}\|\\u\x\{4\}\|\c[A-Z]|.)" +syntax region jsTemplateVar contained matchgroup=jsTemplateBraces start=+${+ end=+}+ contains=@jsExpression +syntax region jsRegexpCharClass contained start=+\[+ skip=+\\.+ end=+\]+ +syntax match jsRegexpBoundary contained "\v%(\<@![\^$]|\\[bB])" +syntax match jsRegexpBackRef contained "\v\\[1-9][0-9]*" +syntax match jsRegexpQuantifier contained "\v\\@]" +syntax region jsRegexpGroup contained start="\\\@ 703 || v:version == 603 && has("patch1088") + syntax region jsRegexpString start=+\%(\%(\%(return\|case\)\s\+\)\@50<=\|\%(\%([)\]"']\|\d\|\w\)\s*\)\@50\(\s*:\)\@=/ contains=jsFunctionKey skipwhite skipempty nextgroup=jsObjectValue +syntax region jsObjectKeyString contained start=+"+ skip=+\\\("\|$\)+ end=+"\|$+ contains=jsSpecial,@Spell skipwhite skipempty nextgroup=jsObjectValue +syntax region jsObjectKeyString contained start=+'+ skip=+\\\('\|$\)+ end=+'\|$+ contains=jsSpecial,@Spell skipwhite skipempty nextgroup=jsObjectValue +syntax region jsObjectKeyComputed contained matchgroup=jsBrackets start=/\[/ end=/]/ contains=@jsExpression skipwhite skipempty nextgroup=jsObjectValue,jsFuncArgs extend +syntax match jsObjectSeparator contained /,/ +syntax region jsObjectValue contained start=/:/ end=/\%(,\|}\)\@=/ contains=@jsExpression extend +syntax match jsObjectFuncName contained /\<[a-zA-Z_$][0-9a-zA-Z_$]*\>[\r\n\t ]*(\@=/ skipwhite skipempty nextgroup=jsFuncArgs +syntax match jsFunctionKey contained /\<[a-zA-Z_$][0-9a-zA-Z_$]*\>\(\s*:\s*function\s*\)\@=/ +syntax match jsObjectMethodType contained /\%(get\|set\|static\|async\)\%( \k\+\)\@=/ skipwhite skipempty nextgroup=jsObjectFuncName +syntax region jsObjectStringKey contained start=+"+ skip=+\\\("\|$\)+ end=+"\|$+ contains=jsSpecial,@Spell extend skipwhite skipempty nextgroup=jsFuncArgs,jsObjectValue +syntax region jsObjectStringKey contained start=+'+ skip=+\\\('\|$\)+ end=+'\|$+ contains=jsSpecial,@Spell extend skipwhite skipempty nextgroup=jsFuncArgs,jsObjectValue + +exe 'syntax keyword jsNull null '.(exists('g:javascript_conceal_null') ? 'conceal cchar='.g:javascript_conceal_null : '') +exe 'syntax keyword jsReturn return contained '.(exists('g:javascript_conceal_return') ? 'conceal cchar='.g:javascript_conceal_return : '') +exe 'syntax keyword jsUndefined undefined '.(exists('g:javascript_conceal_undefined') ? 'conceal cchar='.g:javascript_conceal_undefined : '') +exe 'syntax keyword jsNan NaN '.(exists('g:javascript_conceal_NaN') ? 'conceal cchar='.g:javascript_conceal_NaN : '') +exe 'syntax keyword jsPrototype prototype '.(exists('g:javascript_conceal_prototype') ? 'conceal cchar='.g:javascript_conceal_prototype : '') +exe 'syntax keyword jsThis this contained '.(exists('g:javascript_conceal_this') ? 'conceal cchar='.g:javascript_conceal_this : '') +exe 'syntax keyword jsSuper super contained '.(exists('g:javascript_conceal_super') ? 'conceal cchar='.g:javascript_conceal_super : '') + +" Statement Keywords +syntax keyword jsStatement contained break continue with yield debugger +syntax keyword jsConditional if skipwhite skipempty nextgroup=jsParenIfElse +syntax keyword jsConditional else skipwhite skipempty nextgroup=jsCommentMisc,jsBlock +syntax keyword jsConditional switch skipwhite skipempty nextgroup=jsParenSwitch +syntax keyword jsRepeat while for skipwhite skipempty nextgroup=jsParenRepeat +syntax keyword jsDo do skipwhite skipempty nextgroup=jsBlock +syntax keyword jsLabel contained case default +syntax keyword jsTry try skipwhite skipempty nextgroup=jsTryCatchBlock +syntax keyword jsFinally contained finally skipwhite skipempty nextgroup=jsBlock +syntax keyword jsCatch contained catch skipwhite skipempty nextgroup=jsParenCatch +syntax keyword jsException throw +syntax keyword jsAsyncKeyword async await +syntax match jsSwitchColon contained /:/ skipwhite skipempty nextgroup=jsBlock + +" Keywords +syntax keyword jsGlobalObjects Array Boolean Date Function Iterator Number Object Symbol Map WeakMap Set RegExp String Proxy Promise Buffer ParallelArray ArrayBuffer DataView Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray JSON Math console document window Intl Collator DateTimeFormat NumberFormat +syntax keyword jsGlobalNodeObjects module exports global process +syntax match jsGlobalNodeObjects /require/ contains=jsFuncCall +syntax keyword jsExceptions Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError +syntax keyword jsBuiltins decodeURI decodeURIComponent encodeURI encodeURIComponent eval isFinite isNaN parseFloat parseInt uneval +" DISCUSS: How imporant is this, really? Perhaps it should be linked to an error because I assume the keywords are reserved? +syntax keyword jsFutureKeys abstract enum int short boolean interface byte long char final native synchronized float package throws goto private transient implements protected volatile double public + +" DISCUSS: Should we really be matching stuff like this? +" DOM2 Objects +syntax keyword jsGlobalObjects DOMImplementation DocumentFragment Document Node NodeList NamedNodeMap CharacterData Attr Element Text Comment CDATASection DocumentType Notation Entity EntityReference ProcessingInstruction +syntax keyword jsExceptions DOMException + +" DISCUSS: Should we really be matching stuff like this? +" DOM2 CONSTANT +syntax keyword jsDomErrNo INDEX_SIZE_ERR DOMSTRING_SIZE_ERR HIERARCHY_REQUEST_ERR WRONG_DOCUMENT_ERR INVALID_CHARACTER_ERR NO_DATA_ALLOWED_ERR NO_MODIFICATION_ALLOWED_ERR NOT_FOUND_ERR NOT_SUPPORTED_ERR INUSE_ATTRIBUTE_ERR INVALID_STATE_ERR SYNTAX_ERR INVALID_MODIFICATION_ERR NAMESPACE_ERR INVALID_ACCESS_ERR +syntax keyword jsDomNodeConsts ELEMENT_NODE ATTRIBUTE_NODE TEXT_NODE CDATA_SECTION_NODE ENTITY_REFERENCE_NODE ENTITY_NODE PROCESSING_INSTRUCTION_NODE COMMENT_NODE DOCUMENT_NODE DOCUMENT_TYPE_NODE DOCUMENT_FRAGMENT_NODE NOTATION_NODE + +" DISCUSS: Should we really be special matching on these props? +" HTML events and internal variables +syntax keyword jsHtmlEvents onblur onclick oncontextmenu ondblclick onfocus onkeydown onkeypress onkeyup onmousedown onmousemove onmouseout onmouseover onmouseup onresize + +"" Code blocks +syntax region jsBracket matchgroup=jsBrackets start=/\[/ end=/\]/ contains=@jsExpression extend fold +syntax region jsParen matchgroup=jsParens start=/(/ end=/)/ contains=@jsAll extend fold +syntax region jsParenIfElse contained matchgroup=jsParens start=/(/ end=/)/ contains=@jsAll skipwhite skipempty nextgroup=jsCommentMisc,jsBlock extend fold +syntax region jsParenRepeat contained matchgroup=jsParens start=/(/ end=/)/ contains=@jsAll skipwhite skipempty nextgroup=jsCommentMisc,jsBlock extend fold +syntax region jsParenSwitch contained matchgroup=jsParens start=/(/ end=/)/ contains=@jsAll skipwhite skipempty nextgroup=jsSwitchBlock extend fold +syntax region jsParenCatch contained matchgroup=jsParens start=/(/ end=/)/ skipwhite skipempty nextgroup=jsTryCatchBlock extend fold +syntax region jsFuncArgs contained matchgroup=jsFuncParens start=/(/ end=/)/ contains=jsFuncArgCommas,jsComment,jsFuncArgExpression,jsDestructuringBlock,jsRestExpression,jsFlowArgumentDef skipwhite skipempty nextgroup=jsCommentFunction,jsFuncBlock,jsFlowReturn extend fold +syntax region jsClassBlock contained matchgroup=jsClassBraces start=/{/ end=/}/ contains=jsClassFuncName,jsClassMethodType,jsArrowFunction,jsArrowFuncArgs,jsComment,jsGenerator,jsDecorator,jsClassProperty,jsClassPropertyComputed,jsClassStringKey,jsNoise extend fold +syntax region jsFuncBlock contained matchgroup=jsFuncBraces start=/{/ end=/}/ contains=@jsAll extend fold +syntax region jsBlock contained matchgroup=jsBraces start=/{/ end=/}/ contains=@jsAll extend fold +syntax region jsTryCatchBlock contained matchgroup=jsBraces start=/{/ end=/}/ contains=@jsAll skipwhite skipempty nextgroup=jsCatch,jsFinally extend fold +syntax region jsSwitchBlock contained matchgroup=jsBraces start=/{/ end=/}/ contains=@jsAll,jsLabel,jsSwitchColon extend fold +syntax region jsDestructuringBlock contained matchgroup=jsDestructuringBraces start=/{/ end=/}/ contains=jsDestructuringProperty,jsDestructuringAssignment,jsDestructuringNoise,jsDestructuringPropertyComputed,jsSpreadExpression extend fold +syntax region jsDestructuringArray contained matchgroup=jsDestructuringBraces start=/\[/ end=/\]/ contains=jsDestructuringPropertyValue,jsNoise,jsDestructuringProperty,jsSpreadExpression extend fold +syntax region jsObject matchgroup=jsObjectBraces start=/{/ end=/}/ contains=jsObjectKey,jsObjectKeyString,jsObjectKeyComputed,jsObjectSeparator,jsObjectFuncName,jsObjectMethodType,jsGenerator,jsComment,jsObjectStringKey,jsSpreadExpression extend fold +syntax region jsTernaryIf matchgroup=jsTernaryIfOperator start=/?/ end=/\%(:\|[\}]\@=\)/ contains=@jsExpression +syntax region jsSpreadExpression contained matchgroup=jsSpreadOperator start=/\.\.\./ end=/[,}\]]\@=/ contains=@jsExpression +syntax region jsRestExpression contained matchgroup=jsRestOperator start=/\.\.\./ end=/[,)]\@=/ +syntax region jsTernaryIf matchgroup=jsTernaryIfOperator start=/?/ end=/\%(:\|[\}]\@=\)/ contains=@jsExpression + +syntax match jsGenerator contained /\*/ skipwhite skipempty nextgroup=jsFuncName,jsFuncArgs +syntax match jsFuncName contained /\<[a-zA-Z_$][0-9a-zA-Z_$]*\>/ skipwhite skipempty nextgroup=jsFuncArgs,jsFlowFunctionGroup +syntax region jsFuncArgExpression contained matchgroup=jsFuncArgOperator start=/=/ end=/[,)]\@=/ contains=@jsExpression extend +syntax match jsFuncArgCommas contained ',' +syntax keyword jsArguments contained arguments + +" Matches a single keyword argument with no parens +syntax match jsArrowFuncArgs /\k\+\s*\%(=>\)\@=/ skipwhite contains=jsFuncArgs skipwhite skipempty nextgroup=jsArrowFunction extend +" Matches a series of arguments surrounded in parens +syntax match jsArrowFuncArgs /([^()]*)\s*\(=>\)\@=/ contains=jsFuncArgs skipempty skipwhite nextgroup=jsArrowFunction extend + +exe 'syntax match jsFunction /\/ skipwhite skipempty nextgroup=jsGenerator,jsFuncName,jsFuncArgs skipwhite '.(exists('g:javascript_conceal_function') ? 'conceal cchar='.g:javascript_conceal_function : '') +exe 'syntax match jsArrowFunction /=>/ skipwhite skipempty nextgroup=jsFuncBlock contains=jsFuncBraces '.(exists('g:javascript_conceal_arrow_function') ? 'conceal cchar='.g:javascript_conceal_arrow_function : '') + +syntax keyword jsClassKeywords contained extends class +syntax match jsClassNoise contained /\./ +syntax match jsClassMethodType contained /\%(get\|set\|static\|async\)\%( \k\+\)\@=/ skipwhite skipempty nextgroup=jsFuncName,jsClassProperty +syntax match jsClassDefinition /\\%( [a-zA-Z_$][0-9a-zA-Z_$ \n.]*\)*/ contains=jsClassKeywords,jsClassNoise skipwhite skipempty nextgroup=jsCommentClass,jsClassBlock,jsFlowClassGroup +syntax match jsDecorator contained "@" nextgroup=jsDecoratorFunction +syntax match jsDecoratorFunction contained "[a-zA-Z_][a-zA-Z0-9_.]*" +syntax match jsClassProperty contained /\<[0-9a-zA-Z_$]*\>\(\s*=\)\@=/ skipwhite skipempty nextgroup=jsClassValue +syntax region jsClassValue contained start=/=/ end=/\%(;\|}\|\n\)\@=/ contains=@jsExpression +syntax region jsClassPropertyComputed contained matchgroup=jsBrackets start=/\[/ end=/]/ contains=@jsExpression skipwhite skipempty nextgroup=jsFuncArgs,jsClassValue extend +syntax match jsClassFuncName contained /\<[a-zA-Z_$][0-9a-zA-Z_$]*\>\%(\s*(\)\@=/ skipwhite skipempty nextgroup=jsFuncArgs +syntax region jsClassStringKey contained start=+"+ skip=+\\\("\|$\)+ end=+"\|$+ contains=jsSpecial,@Spell extend skipwhite skipempty nextgroup=jsFuncArgs +syntax region jsClassStringKey contained start=+'+ skip=+\\\('\|$\)+ end=+'\|$+ contains=jsSpecial,@Spell extend skipwhite skipempty nextgroup=jsFuncArgs + +" Destructuring +syntax match jsDestructuringPropertyValue contained /\<[0-9a-zA-Z_$]*\>/ +syntax match jsDestructuringProperty contained /\<[0-9a-zA-Z_$]*\>\(\s*=\)\@=/ skipwhite skipempty nextgroup=jsDestructuringValue +syntax match jsDestructuringAssignment contained /\<[0-9a-zA-Z_$]*\>\(\s*:\)\@=/ skipwhite skipempty nextgroup=jsDestructuringValueAssignment +syntax region jsDestructuringValue contained start=/=/ end=/[,}\]]\@=/ contains=@jsExpression extend +syntax region jsDestructuringValueAssignment contained start=/:/ end=/[,}=]\@=/ contains=jsDestructuringPropertyValue,jsDestructuringBlock,jsNoise,jsDestructuringNoise skipwhite skipempty nextgroup=jsDestructuringValue extend +syntax match jsDestructuringNoise contained /[,\[\]]/ +syntax region jsDestructuringPropertyComputed contained matchgroup=jsBrackets start=/\[/ end=/]/ contains=@jsExpression skipwhite skipempty nextgroup=jsDestructuringValue,jsDestructuringNoise extend fold + +" Comments +syntax keyword jsCommentTodo contained TODO FIXME XXX TBD +syntax region jsComment start=/\/\// end=/$/ contains=jsCommentTodo,@Spell extend keepend +syntax region jsComment start=/\/\*/ end=/\*\// contains=jsCommentTodo,@Spell fold extend keepend +syntax region jsEnvComment start=/\%^#!/ end=/$/ display + +" Specialized Comments - These are special comment regexes that are used in +" odd places that maintain the proper nextgroup functionality. It sucks we +" can't make jsComment a skippable type of group for nextgroup +syntax region jsCommentFunction contained start=/\/\// end=/$/ contains=jsCommentTodo,@Spell skipwhite skipempty nextgroup=jsFuncBlock,jsFlowReturn extend keepend +syntax region jsCommentFunction contained start=/\/\*/ end=/\*\// contains=jsCommentTodo,@Spell skipwhite skipempty nextgroup=jsFuncBlock,jsFlowReturn fold extend keepend +syntax region jsCommentClass contained start=/\/\// end=/$/ contains=jsCommentTodo,@Spell skipwhite skipempty nextgroup=jsClassBlock,jsFlowClassGroup extend keepend +syntax region jsCommentClass contained start=/\/\*/ end=/\*\// contains=jsCommentTodo,@Spell skipwhite skipempty nextgroup=jsClassBlock,jsFlowClassGroup fold extend keepend +syntax region jsCommentMisc contained start=/\/\// end=/$/ contains=jsCommentTodo,@Spell skipwhite skipempty nextgroup=jsBlock extend keepend +syntax region jsCommentMisc contained start=/\/\*/ end=/\*\// contains=jsCommentTodo,@Spell skipwhite skipempty nextgroup=jsBlock fold extend keepend + +if exists("javascript_plugin_jsdoc") + runtime extras/jsdoc.vim + " NGDoc requires JSDoc + if exists("javascript_plugin_ngdoc") + runtime extras/ngdoc.vim + endif +endif + +if exists("javascript_plugin_flow") + runtime extras/flow.vim +endif + +syntax cluster jsExpression contains=jsBracket,jsParen,jsObject,jsBlock,jsTernaryIf,jsTaggedTemplate,jsTemplateString,jsString,jsRegexpString,jsNumber,jsFloat,jsOperator,jsBooleanTrue,jsBooleanFalse,jsNull,jsFunction,jsArrowFunction,jsGlobalObjects,jsExceptions,jsFutureKeys,jsDomErrNo,jsDomNodeConsts,jsHtmlEvents,jsFuncCall,jsUndefined,jsNan,jsPrototype,jsBuiltins,jsNoise,jsClassDefinition,jsArrowFunction,jsArrowFuncArgs,jsParensError,jsComment,jsArguments,jsThis,jsSuper,jsDo +syntax cluster jsAll contains=@jsExpression,jsExportContainer,jsImportContainer,jsStorageClass,jsConditional,jsRepeat,jsReturn,jsStatement,jsException,jsTry,jsAsyncKeyword + +" Define the default highlighting. +" For version 5.7 and earlier: only when not done already +" For version 5.8 and later: only when an item doesn't have highlighting yet +if version >= 508 || !exists("did_javascript_syn_inits") + if version < 508 + let did_javascript_syn_inits = 1 + command -nargs=+ HiLink hi link + else + command -nargs=+ HiLink hi def link + endif + HiLink jsComment Comment + HiLink jsEnvComment PreProc + HiLink jsCommentTodo Todo + HiLink jsString String + HiLink jsObjectKeyString String + HiLink jsTemplateString String + HiLink jsObjectStringKey String + HiLink jsClassStringKey String + HiLink jsTaggedTemplate StorageClass + HiLink jsTernaryIfOperator Operator + HiLink jsRegexpString String + HiLink jsRegexpBoundary SpecialChar + HiLink jsRegexpQuantifier SpecialChar + HiLink jsRegexpOr Conditional + HiLink jsRegexpMod SpecialChar + HiLink jsRegexpBackRef SpecialChar + HiLink jsRegexpGroup jsRegexpString + HiLink jsRegexpCharClass Character + HiLink jsCharacter Character + HiLink jsPrototype Special + HiLink jsConditional Conditional + HiLink jsBranch Conditional + HiLink jsLabel Label + HiLink jsReturn Statement + HiLink jsRepeat Repeat + HiLink jsDo Repeat + HiLink jsStatement Statement + HiLink jsException Exception + HiLink jsTry Exception + HiLink jsFinally Exception + HiLink jsCatch Exception + HiLink jsAsyncKeyword Keyword + HiLink jsArrowFunction Type + HiLink jsFunction Type + HiLink jsGenerator jsFunction + HiLink jsArrowFuncArgs jsFuncArgs + HiLink jsFuncName Function + HiLink jsClassFuncName jsFuncName + HiLink jsObjectFuncName Function + HiLink jsArguments Special + HiLink jsError Error + HiLink jsParensError Error + HiLink jsOperator Operator + HiLink jsOf Operator + HiLink jsStorageClass StorageClass + HiLink jsClassKeywords Structure + HiLink jsThis Special + HiLink jsSuper Constant + HiLink jsNan Number + HiLink jsNull Type + HiLink jsUndefined Type + HiLink jsNumber Number + HiLink jsFloat Float + HiLink jsBooleanTrue Boolean + HiLink jsBooleanFalse Boolean + HiLink jsNoise Noise + HiLink jsBrackets Noise + HiLink jsParens Noise + HiLink jsBraces Noise + HiLink jsFuncBraces Noise + HiLink jsFuncParens Noise + HiLink jsClassBraces Noise + HiLink jsClassNoise Noise + HiLink jsObjectBraces Noise + HiLink jsObjectSeparator Noise + HiLink jsSpecial Special + HiLink jsTemplateVar Special + HiLink jsTemplateBraces jsBraces + HiLink jsGlobalObjects Constant + HiLink jsGlobalNodeObjects Constant + HiLink jsExceptions Constant + HiLink jsBuiltins Constant + HiLink jsModuleKeywords Include + HiLink jsModuleOperators Include + HiLink jsModuleDefault Include + HiLink jsDecorator Special + HiLink jsDecoratorFunction Special + HiLink jsFuncArgOperator jsFuncArgs + HiLink jsModuleAsterisk Noise + HiLink jsClassProperty jsObjectKey + HiLink jsSpreadOperator Operator + HiLink jsRestOperator Operator + HiLink jsRestExpression jsFuncArgs + HiLink jsSwitchColon Noise + HiLink jsClassMethodType Type + HiLink jsObjectMethodType Type + HiLink jsClassDefinition jsFuncName + + HiLink jsDestructuringBraces Noise + HiLink jsDestructuringProperty jsFuncArgs + HiLink jsDestructuringAssignment jsObjectKey + HiLink jsDestructuringNoise Noise + + HiLink jsCommentFunction jsComment + HiLink jsCommentClass jsComment + HiLink jsCommentMisc jsComment + + HiLink jsDomErrNo Constant + HiLink jsDomNodeConsts Constant + HiLink jsDomElemAttrs Label + HiLink jsDomElemFuncs PreProc + + HiLink jsHtmlEvents Special + HiLink jsHtmlElemAttrs Label + HiLink jsHtmlElemFuncs PreProc + + HiLink jsCssStyles Label + + delcommand HiLink +endif + +" Define the htmlJavaScript for HTML syntax html.vim +syntax cluster htmlJavaScript contains=@jsAll +syntax cluster javaScriptExpression contains=@jsAll + +" Vim's default html.vim highlights all javascript as 'Special' +hi! def link javaScript NONE + +let b:current_syntax = "javascript" +if main_syntax == 'javascript' + unlet main_syntax +endif diff --git a/sources_non_forked/vim-jsx/README.md b/sources_non_forked/vim-jsx/README.md new file mode 100644 index 00000000..aceedefb --- /dev/null +++ b/sources_non_forked/vim-jsx/README.md @@ -0,0 +1,138 @@ +vim-jsx +======= + +Syntax highlighting and indenting for JSX. JSX is a JavaScript syntax +transformer which translates inline XML document fragments into JavaScript +objects. It was developed by Facebook alongside [React][1]. + +vim-jsx is _not_ a JavaScript syntax package, so in order to use it, you will +also need to choose a base JS highlighter. [pangloss/vim-javascript][2] is the +recommended package---it is vim-jsx's "official" dependency, and the only +package against which it is regularly tested. However, vim-jsx makes a best +effort to support other JavaScript syntax packages, including: +- pangloss/vim-javascript +- jelera/vim-javascript-syntax +- othree/yajs + +Notably, the system vim JavaScript syntax is _not_ supported, due to its +over-simplicity. However, the system XML syntax package is an implicit +dependency. + +Vim support for inline XML in JS is remarkably similar to the same for PHP, +which you can find [here][3]. + +Troubleshooting +--------------- + +If you're experiencing incorrect highlighting or indenting in your JSX code, +please file a GitHub issue which includes the following: + +- A brief affirmation that you've read the README and have installed one of the + supported dependencies (and the name of the one you're using). + +- A minimal ~/.vimrc which repros the issue you're having, as well as both a + paste and a screenshot of the issue (a paste alone is insufficient, since it + doesn't illustrate the specific highlighting or indenting problem). To + obtain a minimal ~/.vimrc, simply bisect your ~/.vimrc by adding `finish` at + various points in the file. (You can likewise bisect your included plugins + by selectively including only half of them, then a quarter, etc.). + +Most of the issues filed result from failures to install vim-javascript or +conflicts with existing JS syntax or indent files---so failing to indicate that +you've ruled those issues out may result in your issue being closed with +minimal comment. + +(Please feel free to disregard all this for feature requests.) + +Usage +----- + +By default, JSX syntax highlighting and indenting will be enabled only for +files with the `.jsx` extension. If you would like JSX in `.js` files, add + +```viml +let g:jsx_ext_required = 0 +``` + +to your .vimrc or somewhere in your include path. If you wish to restrict JSX +to files with the pre-v0.12 `@jsx React.DOM` pragma, add + +```viml +let g:jsx_pragma_required = 1 +``` + +to your .vimrc or somewhere in your include path. + +Frequently Asked Questions +-------------------------- + +- _How come syntax highlighting doesn't work at all?_ + +This is the only question I'll answer with another question---Which do you +think is more likely: (a) this package fails completely and utterly in serving +its most fundamental purpose, or (b) user error? + +- _Why are my end tags colored differently than my start tags?_ + +vim-jsx is basically the glue that holds JavaScript and XML syntax packages +together in blissful harmony. This means that any XML syntax defaults carry +over to the XML portions of vim, and it's common for many colorschemes to +highlight start and end tags differently due to the system XML syntax defaults. + +- _Syntax highlighting seems to work, but breaks highlighting and indenting + further down in the file. What's wrong?_ + +This often results from trying to enable XML folding in one's `~/.vimrc` (i.e., +via `let g:xml_syntax_folding = 1`). vim-jsx does not support syntax folding, +and is not tested with either JavaScript or XML folding enabled. + +Installation +------------ + +### Pathogen + +The recommended installation method is via [Pathogen][4]. Then simply execute + + cd ~/.vim/bundle + git clone https://github.com/mxw/vim-jsx.git + +(You can install [vim-javascript][2] in an analogous manner.) + +### Vundle + +You can also add vim-jsx using [Vundle][5]---just add the following lines to +your `~/.vimrc`: + + Plugin 'pangloss/vim-javascript' + Plugin 'mxw/vim-jsx' + +To install from within vim, use the commands below. + + :so ~/.vimrc + :PluginInstall + +Alternatively, use the command below to install the plugins from the command +line. + + vim +PluginInstall +qall + +### Manual Installation + +If you have no `~/.vim/after` directory, you can download the tarball or zip +and copy the contents to `~/.vim`. + +If you have existing `~/.vim/after` files, copy the syntax and indent files +directly into their respective destinations. If you have existing after syntax +or indent files for Javascript, you'll probably want to do something like + + mkdir -p ~/.vim/after/syntax/javascript + cp path/to/vim-jsx/after/syntax/jsx.vim ~/.vim/after/syntax/javascript/jsx.vim + mkdir -p ~/.vim/after/indent/javascript + cp path/to/vim-jsx/after/indent/jsx.vim ~/.vim/after/indent/javascript/jsx.vim + + +[1]: http://facebook.github.io/react/ "React" +[2]: https://github.com/pangloss/vim-javascript "pangloss: vim-javascript" +[3]: https://github.com/mxw/vim-xhp "mxw: vim-xhp" +[4]: https://github.com/tpope/vim-pathogen "tpope: vim-pathogen" +[5]: https://github.com/VundleVim/Vundle "VundleVim: Vundle" diff --git a/sources_non_forked/vim-jsx/after/ftplugin/jsx.vim b/sources_non_forked/vim-jsx/after/ftplugin/jsx.vim new file mode 100644 index 00000000..26574dec --- /dev/null +++ b/sources_non_forked/vim-jsx/after/ftplugin/jsx.vim @@ -0,0 +1,16 @@ +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" Vim ftplugin file +" +" Language: JSX (JavaScript) +" Maintainer: Max Wang +" +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +" modified from html.vim +if exists("loaded_matchit") + let b:match_ignorecase = 0 + let b:match_words = '(:),\[:\],{:},<:>,' . + \ '<\@<=\([^/][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>' +endif + +setlocal suffixesadd+=.jsx diff --git a/sources_non_forked/vim-jsx/after/indent/jsx.vim b/sources_non_forked/vim-jsx/after/indent/jsx.vim new file mode 100644 index 00000000..9c1a1ac6 --- /dev/null +++ b/sources_non_forked/vim-jsx/after/indent/jsx.vim @@ -0,0 +1,114 @@ +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" Vim indent file +" +" Language: JSX (JavaScript) +" Maintainer: Max Wang +" +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +" Save the current JavaScript indentexpr. +let b:jsx_js_indentexpr = &indentexpr + +" Prologue; load in XML indentation. +if exists('b:did_indent') + let s:did_indent=b:did_indent + unlet b:did_indent +endif +exe 'runtime! indent/xml.vim' +if exists('s:did_indent') + let b:did_indent=s:did_indent +endif + +setlocal indentexpr=GetJsxIndent() + +" JS indentkeys +setlocal indentkeys=0{,0},0),0],0\,,!^F,o,O,e +" XML indentkeys +setlocal indentkeys+=*,<>>,<<>,/ + +" Multiline end tag regex (line beginning with '>' or '/>') +let s:endtag = '^\s*\/\?>\s*;\=' + +" Get all syntax types at the beginning of a given line. +fu! SynSOL(lnum) + return map(synstack(a:lnum, 1), 'synIDattr(v:val, "name")') +endfu + +" Get all syntax types at the end of a given line. +fu! SynEOL(lnum) + let lnum = prevnonblank(a:lnum) + let col = strlen(getline(lnum)) + return map(synstack(lnum, col), 'synIDattr(v:val, "name")') +endfu + +" Check if a syntax attribute is XMLish. +fu! SynAttrXMLish(synattr) + return a:synattr =~ "^xml" || a:synattr =~ "^jsx" +endfu + +" Check if a synstack is XMLish (i.e., has an XMLish last attribute). +fu! SynXMLish(syns) + return SynAttrXMLish(get(a:syns, -1)) +endfu + +" Check if a synstack denotes the end of a JSX block. +fu! SynJSXBlockEnd(syns) + return get(a:syns, -1) =~ '\%(js\|javascript\)Braces' && + \ SynAttrXMLish(get(a:syns, -2)) +endfu + +" Determine how many jsxRegions deep a synstack is. +fu! SynJSXDepth(syns) + return len(filter(copy(a:syns), 'v:val ==# "jsxRegion"')) +endfu + +" Check whether `cursyn' continues the same jsxRegion as `prevsyn'. +fu! SynJSXContinues(cursyn, prevsyn) + let curdepth = SynJSXDepth(a:cursyn) + let prevdepth = SynJSXDepth(a:prevsyn) + + " In most places, we expect the nesting depths to be the same between any + " two consecutive positions within a jsxRegion (e.g., between a parent and + " child node, between two JSX attributes, etc.). The exception is between + " sibling nodes, where after a completed element (with depth N), we return + " to the parent's nesting (depth N - 1). This case is easily detected, + " since it is the only time when the top syntax element in the synstack is + " jsxRegion---specifically, the jsxRegion corresponding to the parent. + return prevdepth == curdepth || + \ (prevdepth == curdepth + 1 && get(a:cursyn, -1) ==# 'jsxRegion') +endfu + +" Cleverly mix JS and XML indentation. +fu! GetJsxIndent() + let cursyn = SynSOL(v:lnum) + let prevsyn = SynEOL(v:lnum - 1) + + " Use XML indenting iff: + " - the syntax at the end of the previous line was either JSX or was the + " closing brace of a jsBlock whose parent syntax was JSX; and + " - the current line continues the same jsxRegion as the previous line. + if (SynXMLish(prevsyn) || SynJSXBlockEnd(prevsyn)) && + \ SynJSXContinues(cursyn, prevsyn) + let ind = XmlIndentGet(v:lnum, 0) + + " Align '/>' and '>' with '<' for multiline tags. + if getline(v:lnum) =~? s:endtag + let ind = ind - &sw + endif + + " Then correct the indentation of any JSX following '/>' or '>'. + if getline(v:lnum - 1) =~? s:endtag + let ind = ind + &sw + endif + else + if len(b:jsx_js_indentexpr) + " Invoke the base JS package's custom indenter. (For vim-javascript, + " e.g., this will be GetJavascriptIndent().) + let ind = eval(b:jsx_js_indentexpr) + else + let ind = cindent(v:lnum) + endif + endif + + return ind +endfu diff --git a/sources_non_forked/vim-jsx/after/syntax/jsx.vim b/sources_non_forked/vim-jsx/after/syntax/jsx.vim new file mode 100644 index 00000000..5813a678 --- /dev/null +++ b/sources_non_forked/vim-jsx/after/syntax/jsx.vim @@ -0,0 +1,61 @@ +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" Vim syntax file +" +" Language: JSX (JavaScript) +" Maintainer: Max Wang +" Depends: pangloss/vim-javascript +" +" CREDITS: Inspired by Facebook. +" +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +" Prologue; load in XML syntax. +if exists('b:current_syntax') + let s:current_syntax=b:current_syntax + unlet b:current_syntax +endif +syn include @XMLSyntax syntax/xml.vim +if exists('s:current_syntax') + let b:current_syntax=s:current_syntax +endif + +" Officially, vim-jsx depends on the pangloss/vim-javascript syntax package +" (and is tested against it exclusively). However, in practice, we make some +" effort towards compatibility with other packages. +" +" These are the plugin-to-syntax-element correspondences: +" +" - pangloss/vim-javascript: jsBlock, jsExpression +" - jelera/vim-javascript-syntax: javascriptBlock +" - othree/yajs.vim: javascriptNoReserved + + +" JSX attributes should color as JS. Note the trivial end pattern; we let +" jsBlock take care of ending the region. +syn region xmlString contained start=+{+ end=++ contains=jsBlock,javascriptBlock + +" JSX child blocks behave just like JSX attributes, except that (a) they are +" syntactically distinct, and (b) they need the syn-extend argument, or else +" nested XML end-tag patterns may end the outer jsxRegion. +syn region jsxChild contained start=+{+ end=++ contains=jsBlock,javascriptBlock + \ extend + +" Highlight JSX regions as XML; recursively match. +" +" Note that we prohibit JSX tags from having a < or word character immediately +" preceding it, to avoid conflicts with, respectively, the left shift operator +" and generic Flow type annotations (http://flowtype.org/). +syn region jsxRegion + \ contains=@Spell,@XMLSyntax,jsxRegion,jsxChild,jsBlock,javascriptBlock + \ start=+\%(<\|\w\)\@+ + \ end=++ + \ end=+/>+ + \ keepend + \ extend + +" Add jsxRegion to the lowest-level JS syntax cluster. +syn cluster jsExpression add=jsxRegion + +" Allow jsxRegion to contain reserved words. +syn cluster javascriptNoReserved add=jsxRegion diff --git a/sources_non_forked/vim-jsx/ftdetect/javascript.vim b/sources_non_forked/vim-jsx/ftdetect/javascript.vim new file mode 100644 index 00000000..84fb5d62 --- /dev/null +++ b/sources_non_forked/vim-jsx/ftdetect/javascript.vim @@ -0,0 +1,36 @@ +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" Vim ftdetect file +" +" Language: JSX (JavaScript) +" Maintainer: Max Wang +" +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +" Whether the .jsx extension is required. +if !exists('g:jsx_ext_required') + let g:jsx_ext_required = 1 +endif + +" Whether the @jsx pragma is required. +if !exists('g:jsx_pragma_required') + let g:jsx_pragma_required = 0 +endif + +if g:jsx_pragma_required + " Look for the @jsx pragma. It must be included in a docblock comment before + " anything else in the file (except whitespace). + let s:jsx_pragma_pattern = '\%^\_s*\/\*\*\%(\_.\%(\*\/\)\@!\)*@jsx\_.\{-}\*\/' + let b:jsx_pragma_found = search(s:jsx_pragma_pattern, 'npw') +endif + +" Whether to set the JSX filetype on *.js files. +fu! EnableJSX() + if g:jsx_pragma_required && !b:jsx_pragma_found | return 0 | endif + if g:jsx_ext_required && !exists('b:jsx_ext_found') | return 0 | endif + return 1 +endfu + +autocmd BufNewFile,BufRead *.jsx let b:jsx_ext_found = 1 +autocmd BufNewFile,BufRead *.jsx set filetype=javascript.jsx +autocmd BufNewFile,BufRead *.js + \ if EnableJSX() | set filetype=javascript.jsx | endif From a3013bef3519d109cc3a00c5279ca91aee12b52b Mon Sep 17 00:00:00 2001 From: Chris Hu Date: Fri, 19 Aug 2016 10:21:59 +0800 Subject: [PATCH 04/22] add Mark --- my_configs.vim | 6 + sources_non_forked/Mark/README | 63 +++ sources_non_forked/Mark/plugin/mark.vim | 506 ++++++++++++++++++++++++ 3 files changed, 575 insertions(+) create mode 100644 sources_non_forked/Mark/README create mode 100644 sources_non_forked/Mark/plugin/mark.vim diff --git a/my_configs.vim b/my_configs.vim index 1c9aaba0..2b15bda2 100644 --- a/my_configs.vim +++ b/my_configs.vim @@ -35,4 +35,10 @@ set tabstop=2 set softtabstop=2 set cmdheight=1 +set number + +" Mark, highlight multiple words +source ~/.vim_runtime/sources_non_forked/Mark/plugin/mark.vim +let g:mwDefaultHighlightingPalette = 'maximum' +let g:mwDefaultHighlightingNum = 10 diff --git a/sources_non_forked/Mark/README b/sources_non_forked/Mark/README new file mode 100644 index 00000000..194fd3ce --- /dev/null +++ b/sources_non_forked/Mark/README @@ -0,0 +1,63 @@ +This is a mirror of http://www.vim.org/scripts/script.php?script_id=1238 + +This script is written to highlight several words in different colors simultaneously. For example, when you are browsing a big program file, you could highlight some key variables. This will make it easier to trace the source code. + +I think this script is functional similar with MultipleSearch vimscript #479. + +Usage: + +Highlighting: + Normal mode: + \m mark or unmark the word under (or before) the cursor + Place the cursor under the word to be highlighted, press \m, then the word will be colored. + \r manually input a regular expression + To highlight an arbitrary regular expression, press \r and input the regexp. + \n clear this mark (i.e. the mark under the cursor), or clear all highlighted marks + Visual mode: + \m mark or unmark a visual selection + Select some text in Visual mode, press \m, then the selection will be colored. + \r manually input a regular expression (base on the selection text) + Command line: + :Mark regexp to mark a regular expression + :Mark regexp with exactly the same regexp to unmark it + :Mark to clear all marks +Searching: + Normal mode: + * # \* \# \/ \? use these six keys to jump to the other marks + and you could also use VIM's / and ? to search, since the mark patterns have + been added to the search history. + +Here is a sumerization of * # \* \# \/ \?: + +" First of all, \#, \? and # behave just like \*, \/ and *, respectively, +" except that \#, \? and # search backward. +" +" \*, \/ and *'s behaviors differ base on whether the cursor is currently +" placed over an active mark: +" +" Cursor over mark Cursor not over mark +" --------------------------------------------------------------------------- +" \* jump to the next occurrence of jump to the next occurrence of +" current mark, and remember it "last mark". +" as "last mark". +" +" \/ jump to the next occurrence of same as left +" ANY mark. +" +" * if \* is the most recently used, do VIM's original * +" do a \*; otherwise (\/ is the +" most recently used), do a \/. + +Screenshot: +http://elephant.net.cn/files/vim_screenshot.png (It is also the screenshot of my colorscheme vimscript #1253.) + +Bugs and Notes: +Some words which have been already colored by syntax scripts could not be highlighted. + +mark.vim should be re-sourced after any changing to colors. For example, if you +:set background=dark OR +:colorscheme default +you should +:source PATH_OF_PLUGINS/mark.vim +after that. Otherwise, you won't see the colors. +Unfortunately, it seems that .gvimrc runs after plugin scripts. So if you set any color settings in .gvimrc, you have to add one line to the end of .gvimrc to source mark.vim. diff --git a/sources_non_forked/Mark/plugin/mark.vim b/sources_non_forked/Mark/plugin/mark.vim new file mode 100644 index 00000000..dfdd0307 --- /dev/null +++ b/sources_non_forked/Mark/plugin/mark.vim @@ -0,0 +1,506 @@ +" Script Name: mark.vim +" Version: 1.1.8 (global version) +" Last Change: April 25, 2008 +" Author: Yuheng Xie +" Contributor: Luc Hermitte +" +" Description: a little script to highlight several words in different colors +" simultaneously +" +" Usage: :Mark regexp to mark a regular expression +" :Mark regexp with exactly the same regexp to unmark it +" :Mark to clear all marks +" +" You may map keys for the call in your vimrc file for +" convenience. The default keys is: +" Highlighting: +" Normal \m mark or unmark the word under or before the cursor +" \r manually input a regular expression +" \n clear current mark (i.e. the mark under the cursor), +" or clear all marks +" Visual \m mark or unmark a visual selection +" \r manually input a regular expression +" Searching: +" Normal \* jump to the next occurrence of current mark +" \# jump to the previous occurrence of current mark +" \/ jump to the next occurrence of ANY mark +" \? jump to the previous occurrence of ANY mark +" * behaviors vary, please refer to the table on +" # line 123 +" combined with VIM's / and ? etc. +" +" The default colors/groups setting is for marking six +" different words in different colors. You may define your own +" colors in your vimrc file. That is to define highlight group +" names as "MarkWordN", where N is a number. An example could be +" found below. +" +" Bugs: some colored words could not be highlighted +" +" Changes: +" +" 10th Mar 2006, Yuheng Xie: jump to ANY mark +" (*) added \* \# \/ \? for the ability of jumping to ANY mark, even when the +" cursor is not currently over any mark +" +" 20th Sep 2005, Yuheng Xie: minor modifications +" (*) merged MarkRegexVisual into MarkRegex +" (*) added GetVisualSelectionEscaped for multi-lines visual selection and +" visual selection contains ^, $, etc. +" (*) changed the name ThisMark to CurrentMark +" (*) added SearchCurrentMark and re-used raw map (instead of VIM function) to +" implement * and # +" +" 14th Sep 2005, Luc Hermitte: modifications done on v1.1.4 +" (*) anti-reinclusion guards. They do not guard colors definitions in case +" this script must be reloaded after .gvimrc +" (*) Protection against disabled |line-continuation|s. +" (*) Script-local functions +" (*) Default keybindings +" (*) \r for visual mode +" (*) uses instead of "\" +" (*) do not mess with global variable g:w +" (*) regex simplified -> double quotes changed into simple quotes. +" (*) strpart(str, idx, 1) -> str[idx] +" (*) command :Mark +" -> e.g. :Mark Mark.\{-}\ze( + +" default colors/groups +" you may define your own colors in you vimrc file, in the form as below: +hi MarkWord1 ctermbg=Cyan ctermfg=Black guibg=#8CCBEA guifg=Black +hi MarkWord2 ctermbg=Green ctermfg=Black guibg=#A4E57E guifg=Black +hi MarkWord3 ctermbg=Yellow ctermfg=Black guibg=#FFDB72 guifg=Black +hi MarkWord4 ctermbg=Red ctermfg=Black guibg=#FF7272 guifg=Black +hi MarkWord5 ctermbg=Magenta ctermfg=Black guibg=#FFB3FF guifg=Black +hi MarkWord6 ctermbg=Blue ctermfg=Black guibg=#9999FF guifg=Black + +" Anti reinclusion guards +if exists('g:loaded_mark') && !exists('g:force_reload_mark') + finish +endif + +" Support for |line-continuation| +let s:save_cpo = &cpo +set cpo&vim + +" Default bindings + +if !hasmapto('MarkSet', 'n') + if (mapcheck('m', 'n') != "") + nunmap m + endif + nmap m MarkSet +endif +if !hasmapto('MarkSet', 'v') + if (mapcheck('m', 'v') != "") + vunmap m + endif + vmap m MarkSet +endif +if !hasmapto('MarkRegex', 'n') + if (mapcheck('r', 'n') != "") + nunmap r + endif + nmap r MarkRegex +endif +if !hasmapto('MarkRegex', 'v') + if (mapcheck('r', 'v') != "") + vunmap r + endif + vmap r MarkRegex +endif +if !hasmapto('MarkClear', 'n') + if (mapcheck('n', 'n') != "") + nunmap n + endif + nmap n MarkClear +endif + +nnoremap MarkSet :call + \ MarkCurrentWord() +vnoremap MarkSet :call + \ DoMark(GetVisualSelectionEscaped("enV")) +nnoremap MarkRegex :call + \ MarkRegex() +vnoremap MarkRegex :call + \ MarkRegex(GetVisualSelectionEscaped("N")) +nnoremap MarkClear :call + \ DoMark(CurrentMark()) + +" Here is a sumerization of the following keys' behaviors: +" +" First of all, \#, \? and # behave just like \*, \/ and *, respectively, +" except that \#, \? and # search backward. +" +" \*, \/ and *'s behaviors differ base on whether the cursor is currently +" placed over an active mark: +" +" Cursor over mark Cursor not over mark +" --------------------------------------------------------------------------- +" \* jump to the next occurrence of jump to the next occurrence of +" current mark, and remember it "last mark". +" as "last mark". +" +" \/ jump to the next occurrence of same as left +" ANY mark. +" +" * if \* is the most recently used, do VIM's original * +" do a \*; otherwise (\/ is the +" most recently used), do a \/. + +nnoremap * :call SearchCurrentMark() +nnoremap # :call SearchCurrentMark("b") +nnoremap / :call SearchAnyMark() +nnoremap ? :call SearchAnyMark("b") +nnoremap * :if !SearchNext()execute "norm! *"endif +nnoremap # :if !SearchNext("b")execute "norm! #"endif + +command! -nargs=? Mark call s:DoMark() + +autocmd! BufWinEnter * call s:UpdateMark() + +" Functions + +function! s:MarkCurrentWord() + let w = s:PrevWord() + if w != "" + call s:DoMark('\<' . w . '\>') + endif +endfunction + +function! s:GetVisualSelection() + let save_a = @a + silent normal! gv"ay + let res = @a + let @a = save_a + return res +endfunction + +function! s:GetVisualSelectionEscaped(flags) + " flags: + " "e" \ -> \\ + " "n" \n -> \\n for multi-lines visual selection + " "N" \n removed + " "V" \V added for marking plain ^, $, etc. + let result = s:GetVisualSelection() + let i = 0 + while i < strlen(a:flags) + if a:flags[i] ==# "e" + let result = escape(result, '\') + elseif a:flags[i] ==# "n" + let result = substitute(result, '\n', '\\n', 'g') + elseif a:flags[i] ==# "N" + let result = substitute(result, '\n', '', 'g') + elseif a:flags[i] ==# "V" + let result = '\V' . result + endif + let i = i + 1 + endwhile + return result +endfunction + +" manually input a regular expression +function! s:MarkRegex(...) " MarkRegex(regexp) + let regexp = "" + if a:0 > 0 + let regexp = a:1 + endif + call inputsave() + let r = input("@", regexp) + call inputrestore() + if r != "" + call s:DoMark(r) + endif +endfunction + +" define variables if they don't exist +function! s:InitMarkVariables() + if !exists("g:mwHistAdd") + let g:mwHistAdd = "/@" + endif + if !exists("g:mwCycleMax") + let i = 1 + while hlexists("MarkWord" . i) + let i = i + 1 + endwhile + let g:mwCycleMax = i - 1 + endif + if !exists("g:mwCycle") + let g:mwCycle = 1 + endif + let i = 1 + while i <= g:mwCycleMax + if !exists("g:mwWord" . i) + let g:mwWord{i} = "" + endif + let i = i + 1 + endwhile + if !exists("g:mwLastSearched") + let g:mwLastSearched = "" + endif +endfunction + +" return the word under or before the cursor +function! s:PrevWord() + let line = getline(".") + if line[col(".") - 1] =~ '\w' + return expand("") + else + return substitute(strpart(line, 0, col(".") - 1), '^.\{-}\(\w\+\)\W*$', '\1', '') + endif +endfunction + +" mark or unmark a regular expression +function! s:DoMark(...) " DoMark(regexp) + " define variables if they don't exist + call s:InitMarkVariables() + + " clear all marks if regexp is null + let regexp = "" + if a:0 > 0 + let regexp = a:1 + endif + if regexp == "" + let i = 1 + while i <= g:mwCycleMax + if g:mwWord{i} != "" + let g:mwWord{i} = "" + let lastwinnr = winnr() + exe "windo syntax clear MarkWord" . i + exe lastwinnr . "wincmd w" + endif + let i = i + 1 + endwhile + let g:mwLastSearched = "" + return 0 + endif + + " clear the mark if it has been marked + let i = 1 + while i <= g:mwCycleMax + if regexp == g:mwWord{i} + if g:mwLastSearched == g:mwWord{i} + let g:mwLastSearched = "" + endif + let g:mwWord{i} = "" + let lastwinnr = winnr() + exe "windo syntax clear MarkWord" . i + exe lastwinnr . "wincmd w" + return 0 + endif + let i = i + 1 + endwhile + + " add to history + if stridx(g:mwHistAdd, "/") >= 0 + call histadd("/", regexp) + endif + if stridx(g:mwHistAdd, "@") >= 0 + call histadd("@", regexp) + endif + + " quote regexp with / etc. e.g. pattern => /pattern/ + let quote = "/?~!@#$%^&*+-=,.:" + let i = 0 + while i < strlen(quote) + if stridx(regexp, quote[i]) < 0 + let quoted_regexp = quote[i] . regexp . quote[i] + break + endif + let i = i + 1 + endwhile + if i >= strlen(quote) + return -1 + endif + + " choose an unused mark group + let i = 1 + while i <= g:mwCycleMax + if g:mwWord{i} == "" + let g:mwWord{i} = regexp + if i < g:mwCycleMax + let g:mwCycle = i + 1 + else + let g:mwCycle = 1 + endif + let lastwinnr = winnr() + exe "windo syntax clear MarkWord" . i + " suggested by Marc Weber + " exe "windo syntax match MarkWord" . i . " " . quoted_regexp . " containedin=ALL" + exe "windo syntax match MarkWord" . i . " " . quoted_regexp . " containedin=.*" + exe lastwinnr . "wincmd w" + return i + endif + let i = i + 1 + endwhile + + " choose a mark group by cycle + let i = 1 + while i <= g:mwCycleMax + if g:mwCycle == i + if g:mwLastSearched == g:mwWord{i} + let g:mwLastSearched = "" + endif + let g:mwWord{i} = regexp + if i < g:mwCycleMax + let g:mwCycle = i + 1 + else + let g:mwCycle = 1 + endif + let lastwinnr = winnr() + exe "windo syntax clear MarkWord" . i + " suggested by Marc Weber + " exe "windo syntax match MarkWord" . i . " " . quoted_regexp . " containedin=ALL" + exe "windo syntax match MarkWord" . i . " " . quoted_regexp . " containedin=.*" + exe lastwinnr . "wincmd w" + return i + endif + let i = i + 1 + endwhile +endfunction + +" update mark colors +function! s:UpdateMark() + " define variables if they don't exist + call s:InitMarkVariables() + + let i = 1 + while i <= g:mwCycleMax + exe "syntax clear MarkWord" . i + if g:mwWord{i} != "" + " quote regexp with / etc. e.g. pattern => /pattern/ + let quote = "/?~!@#$%^&*+-=,.:" + let j = 0 + while j < strlen(quote) + if stridx(g:mwWord{i}, quote[j]) < 0 + let quoted_regexp = quote[j] . g:mwWord{i} . quote[j] + break + endif + let j = j + 1 + endwhile + if j >= strlen(quote) + continue + endif + + " suggested by Marc Weber + " exe "syntax match MarkWord" . i . " " . quoted_regexp . " containedin=ALL" + exe "syntax match MarkWord" . i . " " . quoted_regexp . " containedin=.*" + endif + let i = i + 1 + endwhile +endfunction + +" return the mark string under the cursor. multi-lines marks not supported +function! s:CurrentMark() + " define variables if they don't exist + call s:InitMarkVariables() + + let line = getline(".") + let i = 1 + while i <= g:mwCycleMax + if g:mwWord{i} != "" + let start = 0 + while start >= 0 && start < strlen(line) && start < col(".") + let b = match(line, g:mwWord{i}, start) + let e = matchend(line, g:mwWord{i}, start) + if b < col(".") && col(".") <= e + let s:current_mark_position = line(".") . "_" . b + return g:mwWord{i} + endif + let start = e + endwhile + endif + let i = i + 1 + endwhile + return "" +endfunction + +" search current mark +function! s:SearchCurrentMark(...) " SearchCurrentMark(flags) + let flags = "" + if a:0 > 0 + let flags = a:1 + endif + let w = s:CurrentMark() + if w != "" + let p = s:current_mark_position + call search(w, flags) + call s:CurrentMark() + if p == s:current_mark_position + call search(w, flags) + endif + let g:mwLastSearched = w + else + if g:mwLastSearched != "" + call search(g:mwLastSearched, flags) + else + call s:SearchAnyMark(flags) + let g:mwLastSearched = s:CurrentMark() + endif + endif +endfunction + +" combine all marks into one regexp +function! s:AnyMark() + " define variables if they don't exist + call s:InitMarkVariables() + + let w = "" + let i = 1 + while i <= g:mwCycleMax + if g:mwWord{i} != "" + if w != "" + let w = w . '\|' . g:mwWord{i} + else + let w = g:mwWord{i} + endif + endif + let i = i + 1 + endwhile + return w +endfunction + +" search any mark +function! s:SearchAnyMark(...) " SearchAnyMark(flags) + let flags = "" + if a:0 > 0 + let flags = a:1 + endif + let w = s:CurrentMark() + if w != "" + let p = s:current_mark_position + else + let p = "" + endif + let w = s:AnyMark() + call search(w, flags) + call s:CurrentMark() + if p == s:current_mark_position + call search(w, flags) + endif + let g:mwLastSearched = "" +endfunction + +" search last searched mark +function! s:SearchNext(...) " SearchNext(flags) + let flags = "" + if a:0 > 0 + let flags = a:1 + endif + let w = s:CurrentMark() + if w != "" + if g:mwLastSearched != "" + call s:SearchCurrentMark(flags) + else + call s:SearchAnyMark(flags) + endif + return 1 + else + return 0 + endif +endfunction + +" Restore previous 'cpo' value +let &cpo = s:save_cpo + +" vim: ts=2 sw=2 From 5fdb80a98517c7f9a43098d8a88c3c616da8e5a2 Mon Sep 17 00:00:00 2001 From: Chris Hu Date: Mon, 22 Aug 2016 21:00:27 +0800 Subject: [PATCH 05/22] update vimrc, add colors support --- my_configs.vim | 3 + .../vim-css-color/.gitattributes | 5 + sources_non_forked/vim-css-color/LICENSE | 21 + sources_non_forked/vim-css-color/README.md | 8 + .../vim-css-color/after/syntax/css.vim | 4 + .../vim-css-color/after/syntax/go.vim | 4 + .../vim-css-color/after/syntax/html.vim | 5 + .../vim-css-color/after/syntax/javascript.vim | 15 + .../vim-css-color/after/syntax/json.vim | 4 + .../vim-css-color/after/syntax/jsx.vim | 5 + .../vim-css-color/after/syntax/less.vim | 11 + .../vim-css-color/after/syntax/moon.vim | 4 + .../vim-css-color/after/syntax/perl.vim | 4 + .../vim-css-color/after/syntax/php.vim | 4 + .../vim-css-color/after/syntax/python.vim | 5 + .../vim-css-color/after/syntax/r.vim | 4 + .../vim-css-color/after/syntax/ruby.vim | 4 + .../vim-css-color/after/syntax/sass.vim | 4 + .../vim-css-color/after/syntax/scss.vim | 4 + .../vim-css-color/after/syntax/stylus.vim | 4 + .../vim-css-color/after/syntax/vim.vim | 4 + .../vim-css-color/after/syntax/xdefaults.vim | 4 + .../vim-css-color/after/syntax/xml.vim | 4 + .../vim-css-color/after/syntax/yaml.vim | 4 + .../vim-css-color/autoload/css_color.vim | 632 ++++++++++++++++++ sources_non_forked/vim-css-color/tests/bench | 6 + .../vim-css-color/tests/example.css | 24 + .../vim-css-color/tests/example.jsx | 11 + .../vim-css-color/tests/example.less | 24 + .../vim-css-color/tests/example.sass | 25 + .../vim-css-color/tests/example.scss | 24 + .../vim-css-color/tests/example.stylus | 28 + .../vim-css-color/tests/torture.css | 256 +++++++ 33 files changed, 1168 insertions(+) create mode 100644 sources_non_forked/vim-css-color/.gitattributes create mode 100644 sources_non_forked/vim-css-color/LICENSE create mode 100644 sources_non_forked/vim-css-color/README.md create mode 100644 sources_non_forked/vim-css-color/after/syntax/css.vim create mode 100644 sources_non_forked/vim-css-color/after/syntax/go.vim create mode 100644 sources_non_forked/vim-css-color/after/syntax/html.vim create mode 100644 sources_non_forked/vim-css-color/after/syntax/javascript.vim create mode 100644 sources_non_forked/vim-css-color/after/syntax/json.vim create mode 100644 sources_non_forked/vim-css-color/after/syntax/jsx.vim create mode 100644 sources_non_forked/vim-css-color/after/syntax/less.vim create mode 100644 sources_non_forked/vim-css-color/after/syntax/moon.vim create mode 100644 sources_non_forked/vim-css-color/after/syntax/perl.vim create mode 100644 sources_non_forked/vim-css-color/after/syntax/php.vim create mode 100644 sources_non_forked/vim-css-color/after/syntax/python.vim create mode 100644 sources_non_forked/vim-css-color/after/syntax/r.vim create mode 100644 sources_non_forked/vim-css-color/after/syntax/ruby.vim create mode 100644 sources_non_forked/vim-css-color/after/syntax/sass.vim create mode 100644 sources_non_forked/vim-css-color/after/syntax/scss.vim create mode 100644 sources_non_forked/vim-css-color/after/syntax/stylus.vim create mode 100644 sources_non_forked/vim-css-color/after/syntax/vim.vim create mode 100644 sources_non_forked/vim-css-color/after/syntax/xdefaults.vim create mode 100644 sources_non_forked/vim-css-color/after/syntax/xml.vim create mode 100644 sources_non_forked/vim-css-color/after/syntax/yaml.vim create mode 100644 sources_non_forked/vim-css-color/autoload/css_color.vim create mode 100755 sources_non_forked/vim-css-color/tests/bench create mode 100644 sources_non_forked/vim-css-color/tests/example.css create mode 100644 sources_non_forked/vim-css-color/tests/example.jsx create mode 100644 sources_non_forked/vim-css-color/tests/example.less create mode 100644 sources_non_forked/vim-css-color/tests/example.sass create mode 100644 sources_non_forked/vim-css-color/tests/example.scss create mode 100644 sources_non_forked/vim-css-color/tests/example.stylus create mode 100644 sources_non_forked/vim-css-color/tests/torture.css diff --git a/my_configs.vim b/my_configs.vim index 2b15bda2..57005278 100644 --- a/my_configs.vim +++ b/my_configs.vim @@ -42,3 +42,6 @@ source ~/.vim_runtime/sources_non_forked/Mark/plugin/mark.vim let g:mwDefaultHighlightingPalette = 'maximum' let g:mwDefaultHighlightingNum = 10 +" Vim-jsx +let g:jsx_ext_required = 0 + diff --git a/sources_non_forked/vim-css-color/.gitattributes b/sources_non_forked/vim-css-color/.gitattributes new file mode 100644 index 00000000..5632fd94 --- /dev/null +++ b/sources_non_forked/vim-css-color/.gitattributes @@ -0,0 +1,5 @@ +/autoload/css_color.vim export-subst +/.gitattributes export-ignore +/README.md export-ignore +/LICENSE export-ignore +/tests export-ignore diff --git a/sources_non_forked/vim-css-color/LICENSE b/sources_non_forked/vim-css-color/LICENSE new file mode 100644 index 00000000..592d025c --- /dev/null +++ b/sources_non_forked/vim-css-color/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Aristotle Pagaltzis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/sources_non_forked/vim-css-color/README.md b/sources_non_forked/vim-css-color/README.md new file mode 100644 index 00000000..4fdc5908 --- /dev/null +++ b/sources_non_forked/vim-css-color/README.md @@ -0,0 +1,8 @@ + + +A very fast color keyword highlighter for Vim with context-sensitive support +for many language syntaxes. + +Originally based on code +by [Niklas Hofer](http://www.vim.org/scripts/script.php?script_id=2150) +and [Max Vasiliev](https://github.com/skammer/vim-css-color). diff --git a/sources_non_forked/vim-css-color/after/syntax/css.vim b/sources_non_forked/vim-css-color/after/syntax/css.vim new file mode 100644 index 00000000..9545d665 --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/css.vim @@ -0,0 +1,4 @@ +" Language: Colorful CSS Color Preview +" Author: Aristotle Pagaltzis + +call css_color#init('css', 'extended', 'cssMediaBlock,cssFunction,cssDefinition,cssAttrRegion,cssComment') diff --git a/sources_non_forked/vim-css-color/after/syntax/go.vim b/sources_non_forked/vim-css-color/after/syntax/go.vim new file mode 100644 index 00000000..62259da4 --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/go.vim @@ -0,0 +1,4 @@ +" Language: Colorful CSS Color Preview +" Author: Aristotle Pagaltzis + +call css_color#init('hex', 'none', 'goComment,goString,goRawString') diff --git a/sources_non_forked/vim-css-color/after/syntax/html.vim b/sources_non_forked/vim-css-color/after/syntax/html.vim new file mode 100644 index 00000000..e2c6a9a2 --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/html.vim @@ -0,0 +1,5 @@ +" Language: Colorful CSS Color Preview +" Author: Aristotle Pagaltzis + +" default html syntax should already be including the css syntax +call css_color#init('none', 'none', 'htmlString,htmlCommentPart') diff --git a/sources_non_forked/vim-css-color/after/syntax/javascript.vim b/sources_non_forked/vim-css-color/after/syntax/javascript.vim new file mode 100644 index 00000000..62c0e616 --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/javascript.vim @@ -0,0 +1,15 @@ +" Language: Colorful CSS Color Preview +" Author: Aristotle Pagaltzis +" Author: Greg Werbin + +" ft=coffee includes javascript, but mostly sets up own syntax groups +" so until it has specific support there's no point in loading anyway +" and for some reason the W3C syntax color keywords break its highlighting +" (this refers to the https://github.com/kchmck/vim-coffee-script plugin) +if -1 < index( split( &filetype, '[.]' ), 'coffee' ) | finish | endif + +" javaScriptX = default Vim syntax, jsX = https://github.com/pangloss/vim-javascript +call css_color#init('hex', 'extended' + \, 'javaScriptComment,javaScriptLineComment,javaScriptStringS,javaScriptStringD' + \. 'jsComment,jsString,jsTemplateString,jsObjectKeyString,jsObjectStringKey,jsClassStringKey' + \) diff --git a/sources_non_forked/vim-css-color/after/syntax/json.vim b/sources_non_forked/vim-css-color/after/syntax/json.vim new file mode 100644 index 00000000..89510ab6 --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/json.vim @@ -0,0 +1,4 @@ +" Language: Colorful CSS Color Preview +" Author: Aristotle Pagaltzis + +call css_color#init('css', 'none', 'jsonString') diff --git a/sources_non_forked/vim-css-color/after/syntax/jsx.vim b/sources_non_forked/vim-css-color/after/syntax/jsx.vim new file mode 100644 index 00000000..35311b13 --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/jsx.vim @@ -0,0 +1,5 @@ +" Language: Colorful CSS Color Preview +" Author: Aristotle Pagaltzis + +" should already be including the javascript and xml syntaxes +call css_color#init('css', 'none', '') diff --git a/sources_non_forked/vim-css-color/after/syntax/less.vim b/sources_non_forked/vim-css-color/after/syntax/less.vim new file mode 100644 index 00000000..298812d1 --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/less.vim @@ -0,0 +1,11 @@ +" Language: Colorful CSS Color Preview +" Author: Aristotle Pagaltzis + +" variable | property | multiline | end-of-line | plugin +" -----------------------+----------------+----------------+-------------+--------- +" lessCssAttribute | lessCssComment | lessComment | https://github.com/genoma/vim-less +" lessAttribute | lessCssComment | lessComment | https://github.com/KohPoll/vim-less +" lessVariableValue | lessDefinition | cssComment | lessComment | https://github.com/groenewege/vim-less +" lessVariableDefinition | cssDefinition | cssComment | lessComment | https://github.com/lunaru/vim-less + +call css_color#init('css', 'extended', 'lessVariableValue,lessVariableDefinition,lessDefinition,lessCssAttribute,lessAttribute,cssDefinition,cssComment,lessCssComment,lessComment') diff --git a/sources_non_forked/vim-css-color/after/syntax/moon.vim b/sources_non_forked/vim-css-color/after/syntax/moon.vim new file mode 100644 index 00000000..0254d7e7 --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/moon.vim @@ -0,0 +1,4 @@ +" Language: Colorful CSS Color Preview +" Author: Aristotle Pagaltzis + +call css_color#init('hex', 'extended', 'moonComment,moonString') diff --git a/sources_non_forked/vim-css-color/after/syntax/perl.vim b/sources_non_forked/vim-css-color/after/syntax/perl.vim new file mode 100644 index 00000000..94702772 --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/perl.vim @@ -0,0 +1,4 @@ +" Language: Colorful CSS Color Preview +" Author: Aristotle Pagaltzis + +call css_color#init('hex', 'none', 'perlComment,perlDATA,perlString,perlStringUnexpanded,perlQQ,perlHereDoc') diff --git a/sources_non_forked/vim-css-color/after/syntax/php.vim b/sources_non_forked/vim-css-color/after/syntax/php.vim new file mode 100644 index 00000000..0632b81f --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/php.vim @@ -0,0 +1,4 @@ +" Language: Colorful CSS Color Preview +" Author: Aristotle Pagaltzis + +call css_color#init('css', 'basic', 'phpComment,phpStringSingle,phpStringDouble') diff --git a/sources_non_forked/vim-css-color/after/syntax/python.vim b/sources_non_forked/vim-css-color/after/syntax/python.vim new file mode 100644 index 00000000..6c057657 --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/python.vim @@ -0,0 +1,5 @@ +" Language: Colorful CSS Color Preview +" Author: DanCardin +" Author: Aristotle Pagaltzis + +call css_color#init('hex', 'none', 'pythonComment,pythonString') diff --git a/sources_non_forked/vim-css-color/after/syntax/r.vim b/sources_non_forked/vim-css-color/after/syntax/r.vim new file mode 100644 index 00000000..1fe7831c --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/r.vim @@ -0,0 +1,4 @@ +" Language: Colorful CSS Color Preview +" Author: Greg Werbin + +call css_color#init('hex', 'extended', 'rComment,rString') diff --git a/sources_non_forked/vim-css-color/after/syntax/ruby.vim b/sources_non_forked/vim-css-color/after/syntax/ruby.vim new file mode 100644 index 00000000..cc8de447 --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/ruby.vim @@ -0,0 +1,4 @@ +" Language: Colorful CSS Color Preview +" Author: Aristotle Pagaltzis + +call css_color#init('hex', 'none', 'rubyComment,rubyData,rubyString') diff --git a/sources_non_forked/vim-css-color/after/syntax/sass.vim b/sources_non_forked/vim-css-color/after/syntax/sass.vim new file mode 100644 index 00000000..02b8d481 --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/sass.vim @@ -0,0 +1,4 @@ +" Language: Colorful CSS Color Preview +" Author: Aristotle Pagaltzis + +call css_color#init('css', 'extended', 'sassCssAttribute,sassComment,sassCssComment') diff --git a/sources_non_forked/vim-css-color/after/syntax/scss.vim b/sources_non_forked/vim-css-color/after/syntax/scss.vim new file mode 100644 index 00000000..472b5fd8 --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/scss.vim @@ -0,0 +1,4 @@ +" Language: Colorful CSS Color Preview +" Author: Aristotle Pagaltzis + +call css_color#init('css', 'extended', 'scssAttribute,scssComment,scssVariableValue,scssMap,scssMapValue,sassCssAttribute,cssComment') diff --git a/sources_non_forked/vim-css-color/after/syntax/stylus.vim b/sources_non_forked/vim-css-color/after/syntax/stylus.vim new file mode 100644 index 00000000..58a55308 --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/stylus.vim @@ -0,0 +1,4 @@ +" Language: Colorful CSS Color Preview +" Author: Aristotle Pagaltzis + +call css_color#init('css', 'extended', 'stylusCssAttribute,stylusComment,cssComment') diff --git a/sources_non_forked/vim-css-color/after/syntax/vim.vim b/sources_non_forked/vim-css-color/after/syntax/vim.vim new file mode 100644 index 00000000..3c9ed2d7 --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/vim.vim @@ -0,0 +1,4 @@ +" Language: Colorful CSS Color Preview +" Author: Aristotle Pagaltzis + +call css_color#init('hex', 'none', 'vimHiGuiRgb,vimComment,vimLineComment') diff --git a/sources_non_forked/vim-css-color/after/syntax/xdefaults.vim b/sources_non_forked/vim-css-color/after/syntax/xdefaults.vim new file mode 100644 index 00000000..a17e6833 --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/xdefaults.vim @@ -0,0 +1,4 @@ +" Language: Colorful CSS Color Preview +" Author: Robert Perce + +call css_color#init('hex', 'extended', 'xdefaultsValue') diff --git a/sources_non_forked/vim-css-color/after/syntax/xml.vim b/sources_non_forked/vim-css-color/after/syntax/xml.vim new file mode 100644 index 00000000..099a4a14 --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/xml.vim @@ -0,0 +1,4 @@ +" Language: Colorful CSS Color Preview +" Author: Aristotle Pagaltzis + +call css_color#init('hex', 'none', 'xmlComment,xmlCommentPart,xmlString') diff --git a/sources_non_forked/vim-css-color/after/syntax/yaml.vim b/sources_non_forked/vim-css-color/after/syntax/yaml.vim new file mode 100644 index 00000000..b8902f12 --- /dev/null +++ b/sources_non_forked/vim-css-color/after/syntax/yaml.vim @@ -0,0 +1,4 @@ +" Language: Colorful CSS Color Preview +" Author: Aristotle Pagaltzis + +call css_color#init('hex', 'extended', 'yamlComment,yamlFlowString,yamlPlainScalar') diff --git a/sources_non_forked/vim-css-color/autoload/css_color.vim b/sources_non_forked/vim-css-color/autoload/css_color.vim new file mode 100644 index 00000000..9501a61d --- /dev/null +++ b/sources_non_forked/vim-css-color/autoload/css_color.vim @@ -0,0 +1,632 @@ +" Language: Colorful CSS Color Preview +" Author: Aristotle Pagaltzis +" Commit: $Format:%H$ +" Licence: The MIT License (MIT) + +if v:version < 700 || !( has('syntax') || has('gui_running') || has('nvim') || &t_Co==256 ) + function! css_color#init(type, keywords, groups) + endfunction + function! css_color#extend(groups) + endfunction + finish +endif + +function! s:rgb2color(r,g,b) + " Convert 80% -> 204, 100% -> 255, etc. + let rgb = map( [a:r,a:g,a:b], 'v:val =~ "%$" ? ( 255 * v:val ) / 100 : v:val' ) + return printf( '%02x%02x%02x', rgb[0], rgb[1], rgb[2] ) +endfunction + +function! s:hsl2color(h,s,l) + " Convert 80% -> 0.8, 100% -> 1.0, etc. + let [s,l] = map( [a:s, a:l], 'v:val =~ "%$" ? v:val / 100.0 : v:val + 0.0' ) + " algorithm transcoded to vim from http://www.w3.org/TR/css3-color/#hsl-color + let hh = ( a:h % 360 ) / 360.0 + let m2 = l <= 0.5 ? l * ( s + 1 ) : l + s - l * s + let m1 = l * 2 - m2 + let rgb = [] + for h in [ hh + (1/3.0), hh, hh - (1/3.0) ] + let h = h < 0 ? h + 1 : h > 1 ? h - 1 : h + let v = + \ h * 6 < 1 ? m1 + ( m2 - m1 ) * h * 6 : + \ h * 2 < 1 ? m2 : + \ h * 3 < 2 ? m1 + ( m2 - m1 ) * ( 2/3.0 - h ) * 6 : + \ m1 + if v > 1.0 | return '' | endif + let rgb += [ float2nr( 255 * v ) ] + endfor + return printf( '%02x%02x%02x', rgb[0], rgb[1], rgb[2] ) +endfunction + +let s:hex={} +for i in range(0, 255) + let s:hex[ printf( '%02x', i ) ] = i +endfor + +if has('gui_running') + function! s:create_highlight(color, is_bright) + exe 'hi BG'.a:color 'guibg=#'.a:color 'guifg=#'.( a:is_bright ? '000000' : 'ffffff' ) + endfunction +else + " preset 16 vt100 colors + let s:xtermcolor = [ + \ [ 0x00, 0x00, 0x00, 0 ], + \ [ 0xCD, 0x00, 0x00, 1 ], + \ [ 0x00, 0xCD, 0x00, 2 ], + \ [ 0xCD, 0xCD, 0x00, 3 ], + \ [ 0x00, 0x00, 0xEE, 4 ], + \ [ 0xCD, 0x00, 0xCD, 5 ], + \ [ 0x00, 0xCD, 0xCD, 6 ], + \ [ 0xE5, 0xE5, 0xE5, 7 ], + \ [ 0x7F, 0x7F, 0x7F, 8 ], + \ [ 0xFF, 0x00, 0x00, 9 ], + \ [ 0x00, 0xFF, 0x00, 10 ], + \ [ 0xFF, 0xFF, 0x00, 11 ], + \ [ 0x5C, 0x5C, 0xFF, 12 ], + \ [ 0xFF, 0x00, 0xFF, 13 ], + \ [ 0x00, 0xFF, 0xFF, 14 ], + \ [ 0xFF, 0xFF, 0xFF, 15 ]] + " grayscale ramp + " (value is 8+10*lum for lum in 0..23) + let s:xtermcolor += [ + \ [ 0x08, 0x08, 0x08, 232 ], + \ [ 0x12, 0x12, 0x12, 233 ], + \ [ 0x1C, 0x1C, 0x1C, 234 ], + \ [ 0x26, 0x26, 0x26, 235 ], + \ [ 0x30, 0x30, 0x30, 236 ], + \ [ 0x3A, 0x3A, 0x3A, 237 ], + \ [ 0x44, 0x44, 0x44, 238 ], + \ [ 0x4E, 0x4E, 0x4E, 239 ], + \ [ 0x58, 0x58, 0x58, 240 ], + \ [ 0x62, 0x62, 0x62, 241 ], + \ [ 0x6C, 0x6C, 0x6C, 242 ], + \ [ 0x76, 0x76, 0x76, 243 ], + \ [ 0x80, 0x80, 0x80, 244 ], + \ [ 0x8A, 0x8A, 0x8A, 245 ], + \ [ 0x94, 0x94, 0x94, 246 ], + \ [ 0x9E, 0x9E, 0x9E, 247 ], + \ [ 0xA8, 0xA8, 0xA8, 248 ], + \ [ 0xB2, 0xB2, 0xB2, 249 ], + \ [ 0xBC, 0xBC, 0xBC, 250 ], + \ [ 0xC6, 0xC6, 0xC6, 251 ], + \ [ 0xD0, 0xD0, 0xD0, 252 ], + \ [ 0xDA, 0xDA, 0xDA, 253 ], + \ [ 0xE4, 0xE4, 0xE4, 254 ], + \ [ 0xEE, 0xEE, 0xEE, 255 ]] + + " the 6 values used in the xterm color cube + " 0 95 135 175 215 255 + let s:cubergb = [ 0x00, 0x5F, 0x87, 0xAF, 0xD7, 0xFF ] + + " 0..255 mapped to 0..5 based on the color cube values + let s:xvquant = repeat([0],48) + \ + repeat([1],68) + \ + repeat([2],40) + \ + repeat([3],40) + \ + repeat([4],40) + \ + repeat([5],20) + " tweak the mapping for the exact matches (0 and 1 already correct) + let s:xvquant[s:cubergb[2]] = 2 + let s:xvquant[s:cubergb[3]] = 3 + let s:xvquant[s:cubergb[4]] = 4 + let s:xvquant[s:cubergb[5]] = 5 + + " selects the nearest xterm color for a rgb value like #FF0000 + function! s:rgb2xterm(color) + let best_match=0 + let smallest_distance = 10000000000 + let color = tolower(a:color) + let r = s:hex[color[0:1]] + let g = s:hex[color[2:3]] + let b = s:hex[color[4:5]] + + let vr = s:xvquant[r] + let vg = s:xvquant[g] + let vb = s:xvquant[b] + let cidx = vr * 36 + vg * 6 + vb + 16 + let ccol = [ s:cubergb[vr], s:cubergb[vg], s:cubergb[vb], cidx ] + + for [tr,tg,tb,idx] in [ ccol ] + s:xtermcolor + let dr = tr - r + let dg = tg - g + let db = tb - b + let distance = dr*dr + dg*dg + db*db + if distance == 0 | return idx | endif + if distance > smallest_distance | continue | endif + let smallest_distance = distance + let best_match = idx + endfor + return best_match + endfunction + + let s:color_idx = {} + function! s:create_highlight(color, is_bright) + let color_idx = get( s:color_idx, a:color, -1 ) + if color_idx == -1 + let color_idx = s:rgb2xterm(a:color) + let s:color_idx[a:color] = color_idx + endif + exe 'hi BG'.a:color 'ctermbg='.color_idx 'ctermfg='.( a:is_bright ? 0 : 15 ) + \ 'guibg=#'.a:color 'guifg=#'.( a:is_bright ? '000000' : 'ffffff' ) + endfunction +endif + +let s:pattern_color = {} +let s:color_bright = {} +function! s:create_syn_match() + + let pattern = submatch(0) + + if has_key( b:css_color_syn, pattern ) | return | endif + let b:css_color_syn[pattern] = 1 + + let rgb_color = get( s:pattern_color, pattern, '' ) + + if ! strlen( rgb_color ) + let hexcolor = submatch(1) + let funcname = submatch(2) + + if funcname == 'rgb' + let rgb_color = s:rgb2color(submatch(3),submatch(4),submatch(5)) + elseif funcname == 'hsl' + let rgb_color = s:hsl2color(submatch(3),submatch(4),submatch(5)) + elseif strlen(hexcolor) == 6 + let rgb_color = tolower(hexcolor) + elseif strlen(hexcolor) == 3 + let rgb_color = substitute(tolower(hexcolor), '\(.\)', '\1\1', 'g') + else + throw 'css_color: create_syn_match invoked on bad match data' + endif + + let s:pattern_color[pattern] = rgb_color + endif + + if ! has_key( b:css_color_hi, rgb_color ) + let is_bright = get( s:color_bright, rgb_color, -1 ) + if is_bright == -1 + let r = s:hex[rgb_color[0:1]] + let g = s:hex[rgb_color[2:3]] + let b = s:hex[rgb_color[4:5]] + let is_bright = r*30 + g*59 + b*11 > 12000 + let s:color_bright[rgb_color] = is_bright + endif + + call s:create_highlight( rgb_color, is_bright ) + let b:css_color_hi[rgb_color] = is_bright + endif + + " iff pattern ends on word character, require word break to match + if pattern =~ '\>$' | let pattern .= '\>' | endif + exe 'syn match BG'.rgb_color.' /'.escape(pattern, '/').'/ contained containedin=@colorableGroup' + + return '' +endfunction + +function! s:clear_matches() + if exists('w:color_match_id') + call filter(w:color_match_id, 'matchdelete(v:val)') + unlet w:color_match_id + endif +endfunction + +function! s:create_matches() + if ! &l:cursorline | return | endif + " adds matches based that duplicate the highlighted colors on the current line + let lnr = line('.') + let group = '' + let groupstart = 0 + let endcol = col('$') + let w:color_match_id = [] + for col in range( 1, endcol ) + let nextgroup = col < endcol ? synIDattr( synID( lnr, col, 1 ), 'name' ) : '' + if group == nextgroup | continue | endif + if group =~ '^BG\x\{6}$' + let regex = '\%'.lnr.'l\%'.groupstart.'c'.repeat( '.', col - groupstart ) + let match = matchadd( group, regex, -1 ) + let w:color_match_id += [ match ] + endif + let group = nextgroup + let groupstart = col + endfor +endfunction + +let s:_hexcolor = '#\(\x\{3}\|\x\{6}\)\>' " submatch 1 +let s:_funcname = '\(rgb\|hsl\)a\?' " submatch 2 +let s:_ws_ = '\s*' +let s:_numval = s:_ws_ . '\(\d\{1,3}%\?\)' " submatch 3,4,5 +let s:_listsep = s:_ws_ . ',' +let s:_otherargs_ = '\%(,[^)]*\)\?' +let s:_funcexpr = s:_funcname . '[(]' . s:_numval . s:_listsep . s:_numval . s:_listsep . s:_numval . s:_ws_ . s:_otherargs_ . '[)]' +let s:_csscolor = s:_hexcolor . '\|' . s:_funcexpr +" N.B. sloppy heuristic constants for performance reasons: +" a) start somewhere left of screen in case of partially visible colorref +" b) take some multiple of &columns to handle multibyte chars etc +" N.B. these substitute() calls are here just for the side effect +" of invoking s:create_syn_match during substitution -- because +" match() and friends do not allow finding all matches in a single +" scan without examining the start of the string over and over +function! s:parse_screen() + call s:clear_matches() + let leftcol = winsaveview().leftcol + let left = max([ leftcol - 15, 0 ]) + let width = &columns * 4 + call filter( range( line('w0'), line('w$') ), 'substitute( strpart( getline(v:val), col([v:val, left]), width ), b:css_color_pat, ''\=s:create_syn_match()'', ''g'' )' ) + call s:create_matches() +endfunction + +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +function! css_color#reinit() + call filter( keys( b:css_color_hi ), 's:create_highlight( v:val, s:color_bright[v:val] )' ) +endfunction + +function! css_color#enable() + if len( b:css_color_grp ) | exe 'syn cluster colorableGroup add=' . join( b:css_color_grp, ',' ) | endif + autocmd CSSColor CursorMoved,CursorMovedI call s:parse_screen() + let b:css_color_off = 0 + call s:parse_screen() +endfunction + +function! css_color#disable() + if len( b:css_color_grp ) | exe 'syn cluster colorableGroup remove=' . join( b:css_color_grp, ',' ) | endif + autocmd! CSSColor CursorMoved,CursorMovedI + let b:css_color_off = 1 +endfunction + +function! css_color#toggle() + if ! exists('b:css_color_off') | return | endif + if b:css_color_off | call css_color#enable() + else | call css_color#disable() + endif +endfunction + +let s:type = [ 'none', 'hex', 'css', 'none' ] " with wraparound for index() == -1 +let s:pat_for_type = [ '^$', s:_hexcolor, s:_csscolor, '^$' ] + +function! css_color#init(type, keywords, groups) + let new_type = index( s:type, a:type ) + let old_type = index( s:pat_for_type, get( b:, 'css_color_pat', '$^' ) ) + + let b:css_color_pat = s:pat_for_type[ max( [ old_type, new_type ] ) ] + let b:css_color_grp = extend( get( b:, 'css_color_grp', [] ), split( a:groups, ',' ), 0 ) + let b:css_color_hi = {} + let b:css_color_syn = {} + + augroup CSSColor + autocmd! * + autocmd ColorScheme call css_color#reinit() + autocmd BufWinEnter call s:create_matches() + autocmd BufWinLeave call s:clear_matches() + augroup END + + call css_color#enable() + + if a:keywords == 'none' | return | endif + + syn case ignore + + " W3C basic colors + + hi BG000000 guibg=#000000 guifg=#FFFFFF ctermbg=16 ctermfg=231 + hi BGc0c0c0 guibg=#C0C0C0 guifg=#000000 ctermbg=250 ctermfg=16 + hi BG808080 guibg=#808080 guifg=#000000 ctermbg=244 ctermfg=16 + hi BGffffff guibg=#FFFFFF guifg=#000000 ctermbg=231 ctermfg=16 + hi BG800000 guibg=#800000 guifg=#FFFFFF ctermbg=88 ctermfg=231 + hi BGff0000 guibg=#FF0000 guifg=#FFFFFF ctermbg=196 ctermfg=231 + hi BG800080 guibg=#800080 guifg=#FFFFFF ctermbg=90 ctermfg=231 + hi BGff00ff guibg=#FF00FF guifg=#FFFFFF ctermbg=201 ctermfg=231 + hi BG008000 guibg=#008000 guifg=#FFFFFF ctermbg=28 ctermfg=231 + hi BG00ff00 guibg=#00FF00 guifg=#000000 ctermbg=46 ctermfg=16 + hi BG808000 guibg=#808000 guifg=#FFFFFF ctermbg=100 ctermfg=231 + hi BGffff00 guibg=#FFFF00 guifg=#000000 ctermbg=226 ctermfg=16 + hi BG000080 guibg=#000080 guifg=#FFFFFF ctermbg=18 ctermfg=231 + hi BG0000ff guibg=#0000FF guifg=#FFFFFF ctermbg=21 ctermfg=231 + hi BG008080 guibg=#008080 guifg=#FFFFFF ctermbg=30 ctermfg=231 + hi BG00ffff guibg=#00FFFF guifg=#000000 ctermbg=51 ctermfg=16 + + call extend( b:css_color_hi, + \{'000000':0,'c0c0c0':1,'808080':1,'ffffff':1,'800000':0,'ff0000':0 + \,'800080':0,'ff00ff':0,'008000':0,'00ff00':1,'808000':0,'ffff00':1 + \,'000080':0,'0000ff':0,'008080':0,'00ffff':1} ) + + syn keyword BG000000 black contained containedin=@colorableGroup + syn keyword BGc0c0c0 silver contained containedin=@colorableGroup + syn keyword BG808080 gray contained containedin=@colorableGroup + syn match BGffffff "\c\" contained containedin=@colorableGroup + syn keyword BG800000 maroon contained containedin=@colorableGroup + syn keyword BGff0000 red contained containedin=@colorableGroup + syn keyword BG800080 purple contained containedin=@colorableGroup + syn keyword BGff00ff fuchsia contained containedin=@colorableGroup + syn keyword BG008000 green contained containedin=@colorableGroup + syn keyword BG00ff00 lime contained containedin=@colorableGroup + syn keyword BG808000 olive contained containedin=@colorableGroup + syn keyword BGffff00 yellow contained containedin=@colorableGroup + syn keyword BG000080 navy contained containedin=@colorableGroup + syn keyword BG0000ff blue contained containedin=@colorableGroup + syn keyword BG008080 teal contained containedin=@colorableGroup + syn keyword BG00ffff aqua contained containedin=@colorableGroup + + if a:keywords == 'basic' | call extend( s:color_bright, b:css_color_hi ) | return | endif + + " W3C extended colors + + hi BG00008b guibg=#00008B guifg=#FFFFFF ctermbg=18 ctermfg=231 + hi BG0000cd guibg=#0000CD guifg=#FFFFFF ctermbg=20 ctermfg=231 + hi BG006400 guibg=#006400 guifg=#FFFFFF ctermbg=22 ctermfg=231 + hi BG008b8b guibg=#008B8B guifg=#FFFFFF ctermbg=30 ctermfg=231 + hi BG00bfff guibg=#00BFFF guifg=#000000 ctermbg=39 ctermfg=16 + hi BG00ced1 guibg=#00CED1 guifg=#000000 ctermbg=6 ctermfg=16 + hi BG00fa9a guibg=#00FA9A guifg=#000000 ctermbg=48 ctermfg=16 + hi BG00ff7f guibg=#00FF7F guifg=#000000 ctermbg=48 ctermfg=16 + hi BG191970 guibg=#191970 guifg=#FFFFFF ctermbg=17 ctermfg=231 + hi BG1e90ff guibg=#1E90FF guifg=#000000 ctermbg=33 ctermfg=16 + hi BG20b2aa guibg=#20B2AA guifg=#000000 ctermbg=37 ctermfg=16 + hi BG228b22 guibg=#228B22 guifg=#FFFFFF ctermbg=28 ctermfg=231 + hi BG2e8b57 guibg=#2E8B57 guifg=#FFFFFF ctermbg=29 ctermfg=231 + hi BG2f4f4f guibg=#2F4F4F guifg=#FFFFFF ctermbg=238 ctermfg=231 + hi BG32cd32 guibg=#32CD32 guifg=#000000 ctermbg=77 ctermfg=16 + hi BG3cb371 guibg=#3CB371 guifg=#000000 ctermbg=71 ctermfg=16 + hi BG40e0d0 guibg=#40E0D0 guifg=#000000 ctermbg=80 ctermfg=16 + hi BG4169e1 guibg=#4169E1 guifg=#FFFFFF ctermbg=62 ctermfg=231 + hi BG4682b4 guibg=#4682B4 guifg=#FFFFFF ctermbg=67 ctermfg=231 + hi BG483d8b guibg=#483D8B guifg=#FFFFFF ctermbg=60 ctermfg=231 + hi BG48d1cc guibg=#48D1CC guifg=#000000 ctermbg=80 ctermfg=16 + hi BG4b0082 guibg=#4B0082 guifg=#FFFFFF ctermbg=54 ctermfg=231 + hi BG556b2f guibg=#556B2F guifg=#FFFFFF ctermbg=239 ctermfg=231 + hi BG5f9ea0 guibg=#5F9EA0 guifg=#000000 ctermbg=73 ctermfg=16 + hi BG6495ed guibg=#6495ED guifg=#000000 ctermbg=69 ctermfg=16 + hi BG66cdaa guibg=#66CDAA guifg=#000000 ctermbg=79 ctermfg=16 + hi BG696969 guibg=#696969 guifg=#FFFFFF ctermbg=242 ctermfg=231 + hi BG6a5acd guibg=#6A5ACD guifg=#FFFFFF ctermbg=62 ctermfg=231 + hi BG6b8e23 guibg=#6B8E23 guifg=#FFFFFF ctermbg=64 ctermfg=231 + hi BG708090 guibg=#708090 guifg=#000000 ctermbg=66 ctermfg=16 + hi BG778899 guibg=#778899 guifg=#000000 ctermbg=102 ctermfg=16 + hi BG7b68ee guibg=#7B68EE guifg=#000000 ctermbg=99 ctermfg=16 + hi BG7cfc00 guibg=#7CFC00 guifg=#000000 ctermbg=118 ctermfg=16 + hi BG7fff00 guibg=#7FFF00 guifg=#000000 ctermbg=118 ctermfg=16 + hi BG7fffd4 guibg=#7FFFD4 guifg=#000000 ctermbg=122 ctermfg=16 + hi BG87ceeb guibg=#87CEEB guifg=#000000 ctermbg=116 ctermfg=16 + hi BG87cefa guibg=#87CEFA guifg=#000000 ctermbg=117 ctermfg=16 + hi BG8a2be2 guibg=#8A2BE2 guifg=#FFFFFF ctermbg=92 ctermfg=231 + hi BG8b0000 guibg=#8B0000 guifg=#FFFFFF ctermbg=88 ctermfg=231 + hi BG8b008b guibg=#8B008B guifg=#FFFFFF ctermbg=90 ctermfg=231 + hi BG8b4513 guibg=#8B4513 guifg=#FFFFFF ctermbg=94 ctermfg=231 + hi BG8fbc8f guibg=#8FBC8F guifg=#000000 ctermbg=108 ctermfg=16 + hi BG90ee90 guibg=#90EE90 guifg=#000000 ctermbg=120 ctermfg=16 + hi BG9370d8 guibg=#9370D8 guifg=#000000 ctermbg=98 ctermfg=16 + hi BG9400d3 guibg=#9400D3 guifg=#FFFFFF ctermbg=92 ctermfg=231 + hi BG98fb98 guibg=#98FB98 guifg=#000000 ctermbg=120 ctermfg=16 + hi BG9932cc guibg=#9932CC guifg=#FFFFFF ctermbg=98 ctermfg=231 + hi BG9acd32 guibg=#9ACD32 guifg=#000000 ctermbg=113 ctermfg=16 + hi BGa0522d guibg=#A0522D guifg=#FFFFFF ctermbg=130 ctermfg=231 + hi BGa52a2a guibg=#A52A2A guifg=#FFFFFF ctermbg=124 ctermfg=231 + hi BGa9a9a9 guibg=#A9A9A9 guifg=#000000 ctermbg=248 ctermfg=16 + hi BGadd8e6 guibg=#ADD8E6 guifg=#000000 ctermbg=152 ctermfg=16 + hi BGadff2f guibg=#ADFF2F guifg=#000000 ctermbg=154 ctermfg=16 + hi BGafeeee guibg=#AFEEEE guifg=#000000 ctermbg=159 ctermfg=16 + hi BGb0c4de guibg=#B0C4DE guifg=#000000 ctermbg=152 ctermfg=16 + hi BGb0e0e6 guibg=#B0E0E6 guifg=#000000 ctermbg=152 ctermfg=16 + hi BGb22222 guibg=#B22222 guifg=#FFFFFF ctermbg=124 ctermfg=231 + hi BGb8860b guibg=#B8860B guifg=#000000 ctermbg=136 ctermfg=16 + hi BGba55d3 guibg=#BA55D3 guifg=#000000 ctermbg=134 ctermfg=16 + hi BGbc8f8f guibg=#BC8F8F guifg=#000000 ctermbg=138 ctermfg=16 + hi BGbdb76b guibg=#BDB76B guifg=#000000 ctermbg=143 ctermfg=16 + hi BGc71585 guibg=#C71585 guifg=#FFFFFF ctermbg=162 ctermfg=231 + hi BGcd5c5c guibg=#CD5C5C guifg=#000000 ctermbg=167 ctermfg=16 + hi BGcd853f guibg=#CD853F guifg=#000000 ctermbg=173 ctermfg=16 + hi BGd2691e guibg=#D2691E guifg=#000000 ctermbg=166 ctermfg=16 + hi BGd2b48c guibg=#D2B48C guifg=#000000 ctermbg=180 ctermfg=16 + hi BGd3d3d3 guibg=#D3D3D3 guifg=#000000 ctermbg=252 ctermfg=16 + hi BGd87093 guibg=#D87093 guifg=#000000 ctermbg=168 ctermfg=16 + hi BGd8bfd8 guibg=#D8BFD8 guifg=#000000 ctermbg=182 ctermfg=16 + hi BGda70d6 guibg=#DA70D6 guifg=#000000 ctermbg=170 ctermfg=16 + hi BGdaa520 guibg=#DAA520 guifg=#000000 ctermbg=178 ctermfg=16 + hi BGdc143c guibg=#DC143C guifg=#FFFFFF ctermbg=161 ctermfg=231 + hi BGdcdcdc guibg=#DCDCDC guifg=#000000 ctermbg=253 ctermfg=16 + hi BGdda0dd guibg=#DDA0DD guifg=#000000 ctermbg=182 ctermfg=16 + hi BGdeb887 guibg=#DEB887 guifg=#000000 ctermbg=180 ctermfg=16 + hi BGe0ffff guibg=#E0FFFF guifg=#000000 ctermbg=195 ctermfg=16 + hi BGe6e6fa guibg=#E6E6FA guifg=#000000 ctermbg=255 ctermfg=16 + hi BGe9967a guibg=#E9967A guifg=#000000 ctermbg=174 ctermfg=16 + hi BGee82ee guibg=#EE82EE guifg=#000000 ctermbg=213 ctermfg=16 + hi BGeee8aa guibg=#EEE8AA guifg=#000000 ctermbg=223 ctermfg=16 + hi BGf08080 guibg=#F08080 guifg=#000000 ctermbg=210 ctermfg=16 + hi BGf0e68c guibg=#F0E68C guifg=#000000 ctermbg=222 ctermfg=16 + hi BGf0f8ff guibg=#F0F8FF guifg=#000000 ctermbg=15 ctermfg=16 + hi BGf0fff0 guibg=#F0FFF0 guifg=#000000 ctermbg=255 ctermfg=16 + hi BGf0ffff guibg=#F0FFFF guifg=#000000 ctermbg=15 ctermfg=16 + hi BGf4a460 guibg=#F4A460 guifg=#000000 ctermbg=215 ctermfg=16 + hi BGf5deb3 guibg=#F5DEB3 guifg=#000000 ctermbg=223 ctermfg=16 + hi BGf5f5dc guibg=#F5F5DC guifg=#000000 ctermbg=230 ctermfg=16 + hi BGf5f5f5 guibg=#F5F5F5 guifg=#000000 ctermbg=255 ctermfg=16 + hi BGf5fffa guibg=#F5FFFA guifg=#000000 ctermbg=15 ctermfg=16 + hi BGf8f8ff guibg=#F8F8FF guifg=#000000 ctermbg=15 ctermfg=16 + hi BGfa8072 guibg=#FA8072 guifg=#000000 ctermbg=209 ctermfg=16 + hi BGfaebd7 guibg=#FAEBD7 guifg=#000000 ctermbg=224 ctermfg=16 + hi BGfaf0e6 guibg=#FAF0E6 guifg=#000000 ctermbg=255 ctermfg=16 + hi BGfafad2 guibg=#FAFAD2 guifg=#000000 ctermbg=230 ctermfg=16 + hi BGfdf5e6 guibg=#FDF5E6 guifg=#000000 ctermbg=230 ctermfg=16 + hi BGff1493 guibg=#FF1493 guifg=#FFFFFF ctermbg=198 ctermfg=231 + hi BGff4500 guibg=#FF4500 guifg=#FFFFFF ctermbg=202 ctermfg=231 + hi BGff6347 guibg=#FF6347 guifg=#000000 ctermbg=203 ctermfg=16 + hi BGff69b4 guibg=#FF69B4 guifg=#000000 ctermbg=205 ctermfg=16 + hi BGff7f50 guibg=#FF7F50 guifg=#000000 ctermbg=209 ctermfg=16 + hi BGff8c00 guibg=#FF8C00 guifg=#000000 ctermbg=208 ctermfg=16 + hi BGffa07a guibg=#FFA07A guifg=#000000 ctermbg=216 ctermfg=16 + hi BGffa500 guibg=#FFA500 guifg=#000000 ctermbg=214 ctermfg=16 + hi BGffb6c1 guibg=#FFB6C1 guifg=#000000 ctermbg=217 ctermfg=16 + hi BGffc0cb guibg=#FFC0CB guifg=#000000 ctermbg=218 ctermfg=16 + hi BGffd700 guibg=#FFD700 guifg=#000000 ctermbg=220 ctermfg=16 + hi BGffdab9 guibg=#FFDAB9 guifg=#000000 ctermbg=223 ctermfg=16 + hi BGffdead guibg=#FFDEAD guifg=#000000 ctermbg=223 ctermfg=16 + hi BGffe4b5 guibg=#FFE4B5 guifg=#000000 ctermbg=223 ctermfg=16 + hi BGffe4c4 guibg=#FFE4C4 guifg=#000000 ctermbg=224 ctermfg=16 + hi BGffe4e1 guibg=#FFE4E1 guifg=#000000 ctermbg=224 ctermfg=16 + hi BGffebcd guibg=#FFEBCD guifg=#000000 ctermbg=224 ctermfg=16 + hi BGffefd5 guibg=#FFEFD5 guifg=#000000 ctermbg=230 ctermfg=16 + hi BGfff0f5 guibg=#FFF0F5 guifg=#000000 ctermbg=15 ctermfg=16 + hi BGfff5ee guibg=#FFF5EE guifg=#000000 ctermbg=255 ctermfg=16 + hi BGfff8dc guibg=#FFF8DC guifg=#000000 ctermbg=230 ctermfg=16 + hi BGfffacd guibg=#FFFACD guifg=#000000 ctermbg=230 ctermfg=16 + hi BGfffaf0 guibg=#FFFAF0 guifg=#000000 ctermbg=15 ctermfg=16 + hi BGfffafa guibg=#FFFAFA guifg=#000000 ctermbg=15 ctermfg=16 + hi BGffffe0 guibg=#FFFFE0 guifg=#000000 ctermbg=230 ctermfg=16 + hi BGfffff0 guibg=#FFFFF0 guifg=#000000 ctermbg=15 ctermfg=16 + + call extend( b:css_color_hi, + \{'00008b':0,'0000cd':0,'006400':0,'008b8b':0,'00bfff':1,'00ced1':1 + \,'00fa9a':1,'00ff7f':1,'191970':0,'1e90ff':1,'20b2aa':1,'228b22':0 + \,'2e8b57':0,'2f4f4f':0,'32cd32':1,'3cb371':1,'40e0d0':1,'4169e1':0 + \,'4682b4':0,'483d8b':0,'48d1cc':1,'4b0082':0,'556b2f':0,'5f9ea0':1 + \,'6495ed':1,'66cdaa':1,'696969':0,'6a5acd':0,'6b8e23':0,'708090':1 + \,'778899':1,'7b68ee':1,'7cfc00':1,'7fff00':1,'7fffd4':1,'87ceeb':1 + \,'87cefa':1,'8a2be2':0,'8b0000':0,'8b008b':0,'8b4513':0,'8fbc8f':1 + \,'90ee90':1,'9370d8':1,'9400d3':0,'98fb98':1,'9932cc':0,'9acd32':1 + \,'a0522d':0,'a52a2a':0,'a9a9a9':1,'add8e6':1,'adff2f':1,'afeeee':1 + \,'b0c4de':1,'b0e0e6':1,'b22222':0,'b8860b':1,'ba55d3':1,'bc8f8f':1 + \,'bdb76b':1,'c71585':0,'cd5c5c':1,'cd853f':1,'d2691e':1,'d2b48c':1 + \,'d3d3d3':1,'d87093':1,'d8bfd8':1,'da70d6':1,'daa520':1,'dc143c':0 + \,'dcdcdc':1,'dda0dd':1,'deb887':1,'e0ffff':1,'e6e6fa':1,'e9967a':1 + \,'ee82ee':1,'eee8aa':1,'f08080':1,'f0e68c':1,'f0f8ff':1,'f0fff0':1 + \,'f0ffff':1,'f4a460':1,'f5deb3':1,'f5f5dc':1,'f5f5f5':1,'f5fffa':1 + \,'f8f8ff':1,'fa8072':1,'faebd7':1,'faf0e6':1,'fafad2':1,'fdf5e6':1 + \,'ff1493':0,'ff4500':0,'ff6347':1,'ff69b4':1,'ff7f50':1,'ff8c00':1 + \,'ffa07a':1,'ffa500':1,'ffb6c1':1,'ffc0cb':1,'ffd700':1,'ffdab9':1 + \,'ffdead':1,'ffe4b5':1,'ffe4c4':1,'ffe4e1':1,'ffebcd':1,'ffefd5':1 + \,'fff0f5':1,'fff5ee':1,'fff8dc':1,'fffacd':1,'fffaf0':1,'fffafa':1 + \,'ffffe0':1,'fffff0':1} ) + + syn keyword BGf0f8ff AliceBlue contained containedin=@colorableGroup + syn keyword BGfaebd7 AntiqueWhite contained containedin=@colorableGroup + syn keyword BG7fffd4 Aquamarine contained containedin=@colorableGroup + syn keyword BGf0ffff Azure contained containedin=@colorableGroup + syn keyword BGf5f5dc Beige contained containedin=@colorableGroup + syn keyword BGffe4c4 Bisque contained containedin=@colorableGroup + syn keyword BGffebcd BlanchedAlmond contained containedin=@colorableGroup + syn keyword BG8a2be2 BlueViolet contained containedin=@colorableGroup + syn keyword BGa52a2a Brown contained containedin=@colorableGroup + syn keyword BGdeb887 BurlyWood contained containedin=@colorableGroup + syn keyword BG5f9ea0 CadetBlue contained containedin=@colorableGroup + syn keyword BG7fff00 Chartreuse contained containedin=@colorableGroup + syn keyword BGd2691e Chocolate contained containedin=@colorableGroup + syn keyword BGff7f50 Coral contained containedin=@colorableGroup + syn keyword BG6495ed CornflowerBlue contained containedin=@colorableGroup + syn keyword BGfff8dc Cornsilk contained containedin=@colorableGroup + syn keyword BGdc143c Crimson contained containedin=@colorableGroup + syn keyword BG00ffff Cyan contained containedin=@colorableGroup + syn keyword BG00008b DarkBlue contained containedin=@colorableGroup + syn keyword BG008b8b DarkCyan contained containedin=@colorableGroup + syn keyword BGb8860b DarkGoldenRod contained containedin=@colorableGroup + syn keyword BGa9a9a9 DarkGray contained containedin=@colorableGroup + syn keyword BG006400 DarkGreen contained containedin=@colorableGroup + syn keyword BGa9a9a9 DarkGrey contained containedin=@colorableGroup + syn keyword BGbdb76b DarkKhaki contained containedin=@colorableGroup + syn keyword BG8b008b DarkMagenta contained containedin=@colorableGroup + syn keyword BG556b2f DarkOliveGreen contained containedin=@colorableGroup + syn keyword BG9932cc DarkOrchid contained containedin=@colorableGroup + syn keyword BG8b0000 DarkRed contained containedin=@colorableGroup + syn keyword BGe9967a DarkSalmon contained containedin=@colorableGroup + syn keyword BG8fbc8f DarkSeaGreen contained containedin=@colorableGroup + syn keyword BG483d8b DarkSlateBlue contained containedin=@colorableGroup + syn keyword BG2f4f4f DarkSlateGray contained containedin=@colorableGroup + syn keyword BG2f4f4f DarkSlateGrey contained containedin=@colorableGroup + syn keyword BG00ced1 DarkTurquoise contained containedin=@colorableGroup + syn keyword BG9400d3 DarkViolet contained containedin=@colorableGroup + syn keyword BGff8c00 Darkorange contained containedin=@colorableGroup + syn keyword BGff1493 DeepPink contained containedin=@colorableGroup + syn keyword BG00bfff DeepSkyBlue contained containedin=@colorableGroup + syn keyword BG696969 DimGray contained containedin=@colorableGroup + syn keyword BG696969 DimGrey contained containedin=@colorableGroup + syn keyword BG1e90ff DodgerBlue contained containedin=@colorableGroup + syn keyword BGb22222 FireBrick contained containedin=@colorableGroup + syn keyword BGfffaf0 FloralWhite contained containedin=@colorableGroup + syn keyword BG228b22 ForestGreen contained containedin=@colorableGroup + syn keyword BGdcdcdc Gainsboro contained containedin=@colorableGroup + syn keyword BGf8f8ff GhostWhite contained containedin=@colorableGroup + syn keyword BGffd700 Gold contained containedin=@colorableGroup + syn keyword BGdaa520 GoldenRod contained containedin=@colorableGroup + syn keyword BGadff2f GreenYellow contained containedin=@colorableGroup + syn keyword BG808080 Grey contained containedin=@colorableGroup + syn keyword BGf0fff0 HoneyDew contained containedin=@colorableGroup + syn keyword BGff69b4 HotPink contained containedin=@colorableGroup + syn keyword BGcd5c5c IndianRed contained containedin=@colorableGroup + syn keyword BG4b0082 Indigo contained containedin=@colorableGroup + syn keyword BGfffff0 Ivory contained containedin=@colorableGroup + syn keyword BGf0e68c Khaki contained containedin=@colorableGroup + syn keyword BGe6e6fa Lavender contained containedin=@colorableGroup + syn keyword BGfff0f5 LavenderBlush contained containedin=@colorableGroup + syn keyword BG7cfc00 LawnGreen contained containedin=@colorableGroup + syn keyword BGfffacd LemonChiffon contained containedin=@colorableGroup + syn keyword BGadd8e6 LightBlue contained containedin=@colorableGroup + syn keyword BGf08080 LightCoral contained containedin=@colorableGroup + syn keyword BGe0ffff LightCyan contained containedin=@colorableGroup + syn keyword BGfafad2 LightGoldenRodYellow contained containedin=@colorableGroup + syn keyword BGd3d3d3 LightGray contained containedin=@colorableGroup + syn keyword BG90ee90 LightGreen contained containedin=@colorableGroup + syn keyword BGd3d3d3 LightGrey contained containedin=@colorableGroup + syn keyword BGffb6c1 LightPink contained containedin=@colorableGroup + syn keyword BGffa07a LightSalmon contained containedin=@colorableGroup + syn keyword BG20b2aa LightSeaGreen contained containedin=@colorableGroup + syn keyword BG87cefa LightSkyBlue contained containedin=@colorableGroup + syn keyword BG778899 LightSlateGray contained containedin=@colorableGroup + syn keyword BG778899 LightSlateGrey contained containedin=@colorableGroup + syn keyword BGb0c4de LightSteelBlue contained containedin=@colorableGroup + syn keyword BGffffe0 LightYellow contained containedin=@colorableGroup + syn keyword BG32cd32 LimeGreen contained containedin=@colorableGroup + syn keyword BGfaf0e6 Linen contained containedin=@colorableGroup + syn keyword BGff00ff Magenta contained containedin=@colorableGroup + syn keyword BG66cdaa MediumAquaMarine contained containedin=@colorableGroup + syn keyword BG0000cd MediumBlue contained containedin=@colorableGroup + syn keyword BGba55d3 MediumOrchid contained containedin=@colorableGroup + syn keyword BG9370d8 MediumPurple contained containedin=@colorableGroup + syn keyword BG3cb371 MediumSeaGreen contained containedin=@colorableGroup + syn keyword BG7b68ee MediumSlateBlue contained containedin=@colorableGroup + syn keyword BG00fa9a MediumSpringGreen contained containedin=@colorableGroup + syn keyword BG48d1cc MediumTurquoise contained containedin=@colorableGroup + syn keyword BGc71585 MediumVioletRed contained containedin=@colorableGroup + syn keyword BG191970 MidnightBlue contained containedin=@colorableGroup + syn keyword BGf5fffa MintCream contained containedin=@colorableGroup + syn keyword BGffe4e1 MistyRose contained containedin=@colorableGroup + syn keyword BGffe4b5 Moccasin contained containedin=@colorableGroup + syn keyword BGffdead NavajoWhite contained containedin=@colorableGroup + syn keyword BGfdf5e6 OldLace contained containedin=@colorableGroup + syn keyword BG6b8e23 OliveDrab contained containedin=@colorableGroup + syn keyword BGffa500 Orange contained containedin=@colorableGroup + syn keyword BGff4500 OrangeRed contained containedin=@colorableGroup + syn keyword BGda70d6 Orchid contained containedin=@colorableGroup + syn keyword BGeee8aa PaleGoldenRod contained containedin=@colorableGroup + syn keyword BG98fb98 PaleGreen contained containedin=@colorableGroup + syn keyword BGafeeee PaleTurquoise contained containedin=@colorableGroup + syn keyword BGd87093 PaleVioletRed contained containedin=@colorableGroup + syn keyword BGffefd5 PapayaWhip contained containedin=@colorableGroup + syn keyword BGffdab9 PeachPuff contained containedin=@colorableGroup + syn keyword BGcd853f Peru contained containedin=@colorableGroup + syn keyword BGffc0cb Pink contained containedin=@colorableGroup + syn keyword BGdda0dd Plum contained containedin=@colorableGroup + syn keyword BGb0e0e6 PowderBlue contained containedin=@colorableGroup + syn keyword BGbc8f8f RosyBrown contained containedin=@colorableGroup + syn keyword BG4169e1 RoyalBlue contained containedin=@colorableGroup + syn keyword BG8b4513 SaddleBrown contained containedin=@colorableGroup + syn keyword BGfa8072 Salmon contained containedin=@colorableGroup + syn keyword BGf4a460 SandyBrown contained containedin=@colorableGroup + syn keyword BG2e8b57 SeaGreen contained containedin=@colorableGroup + syn keyword BGfff5ee SeaShell contained containedin=@colorableGroup + syn keyword BGa0522d Sienna contained containedin=@colorableGroup + syn keyword BG87ceeb SkyBlue contained containedin=@colorableGroup + syn keyword BG6a5acd SlateBlue contained containedin=@colorableGroup + syn keyword BG708090 SlateGray contained containedin=@colorableGroup + syn keyword BG708090 SlateGrey contained containedin=@colorableGroup + syn keyword BGfffafa Snow contained containedin=@colorableGroup + syn keyword BG00ff7f SpringGreen contained containedin=@colorableGroup + syn keyword BG4682b4 SteelBlue contained containedin=@colorableGroup + syn keyword BGd2b48c Tan contained containedin=@colorableGroup + syn keyword BGd8bfd8 Thistle contained containedin=@colorableGroup + syn keyword BGff6347 Tomato contained containedin=@colorableGroup + syn keyword BG40e0d0 Turquoise contained containedin=@colorableGroup + syn keyword BGee82ee Violet contained containedin=@colorableGroup + syn keyword BGf5deb3 Wheat contained containedin=@colorableGroup + syn keyword BGf5f5f5 WhiteSmoke contained containedin=@colorableGroup + syn keyword BG9acd32 YellowGreen contained containedin=@colorableGroup + + call extend( s:color_bright, b:css_color_hi ) +endfunction diff --git a/sources_non_forked/vim-css-color/tests/bench b/sources_non_forked/vim-css-color/tests/bench new file mode 100755 index 00000000..21e6eea5 --- /dev/null +++ b/sources_non_forked/vim-css-color/tests/bench @@ -0,0 +1,6 @@ +#!/bin/sh +set -e +s=startuptime.txt +vim --startuptime $s -o -c qa "$@" +perl -lane'$sum += $F[1] if m!/\.vim/after/syntax/css\.vim$!; END {print $sum}' $s +rm $s diff --git a/sources_non_forked/vim-css-color/tests/example.css b/sources_non_forked/vim-css-color/tests/example.css new file mode 100644 index 00000000..d420cbd5 --- /dev/null +++ b/sources_non_forked/vim-css-color/tests/example.css @@ -0,0 +1,24 @@ +i { background: #359 } +b { background: #335599 } +u { background: rgba(144, 0, 0, .5) } +s { background: hsl(0, 100%, 50%) } + +*::color1 { -x-: #359 } +*::color2 { -x-: #335599 } +*::color3 { -x-: rgba(144, 0, 0, .5) } +*::color4 { -x-: hsl(0, 100%, 50%) } + +/* + * #123, #456 + */ + +/* #123456 */ + +ul { + color: white; +} + +ul li { + color: yellow; + background: black; +} diff --git a/sources_non_forked/vim-css-color/tests/example.jsx b/sources_non_forked/vim-css-color/tests/example.jsx new file mode 100644 index 00000000..06084666 --- /dev/null +++ b/sources_non_forked/vim-css-color/tests/example.jsx @@ -0,0 +1,11 @@ +var Example = React.createClass({ + render: function() { + var style = { + color: '#ffde00', + backgroundColor: 'green', + border: '3px dotted rgba(255,0,0)' + fontSize: 200 + }; + return
Hi!
; + } +}); diff --git a/sources_non_forked/vim-css-color/tests/example.less b/sources_non_forked/vim-css-color/tests/example.less new file mode 100644 index 00000000..ffadbad9 --- /dev/null +++ b/sources_non_forked/vim-css-color/tests/example.less @@ -0,0 +1,24 @@ +i { background: #359 } +b { background: #335599 } +u { background: rgba(144, 0, 0, .5) } +s { background: hsl(0, 100%, 50%) } + +@color1: #359; +@color1: #335599; +@color3: rgba(144, 0, 0, .5); +@color4: hsl(0, 100%, 50%); + +/* + * #123, #456 + */ + +// #123456 + +ul { + color: white; + + li { + color: yellow; + background: black; + } +} diff --git a/sources_non_forked/vim-css-color/tests/example.sass b/sources_non_forked/vim-css-color/tests/example.sass new file mode 100644 index 00000000..e1c8cd04 --- /dev/null +++ b/sources_non_forked/vim-css-color/tests/example.sass @@ -0,0 +1,25 @@ +i + background: #359 +b + background: #335599 +u + background: rgba(144, 0, 0, .5) +s + background: hsl(0, 100%, 50%) + +!color1 = #359 +!color2 = #335599 +!color3 = rgba(144, 0, 0, .5) +!color4 = hsl(0, 100%, 50%) + +/* + * #123, #456 + */ + +// #123456 + +ul + color = white + li + color = yellow + background = black diff --git a/sources_non_forked/vim-css-color/tests/example.scss b/sources_non_forked/vim-css-color/tests/example.scss new file mode 100644 index 00000000..a93f4daa --- /dev/null +++ b/sources_non_forked/vim-css-color/tests/example.scss @@ -0,0 +1,24 @@ +i { background: #359 } +b { background: #335599 } +u { background: rgba(144, 0, 0, .5) } +s { background: hsl(0, 100%, 50%) } + +$color1: #359; +$color2: #335599; +$color3: rgba(144, 0, 0, .5); +$color4: hsl(0, 100%, 50%); + +/* + * #123, #456 + */ + +// #123456 + +ul { + color: white; + + li { + color: yellow; + background: black; + } +} diff --git a/sources_non_forked/vim-css-color/tests/example.stylus b/sources_non_forked/vim-css-color/tests/example.stylus new file mode 100644 index 00000000..97895070 --- /dev/null +++ b/sources_non_forked/vim-css-color/tests/example.stylus @@ -0,0 +1,28 @@ +i + background #359 +b + background #335599 +u + background rgba(144, 0, 0, .5) +s + background hsl(0, 100%, 50%) + +color1 = #359 +color2 = #335599 +color3 = rgba(144, 0, 0, .5) +color4 = hsl(0, 100%, 50%) + +/* + * #123, #456 + */ + +// #123456 + +ul { + color: white; + + li { + color: yellow; + background: black; + } +} diff --git a/sources_non_forked/vim-css-color/tests/torture.css b/sources_non_forked/vim-css-color/tests/torture.css new file mode 100644 index 00000000..5705f848 --- /dev/null +++ b/sources_non_forked/vim-css-color/tests/torture.css @@ -0,0 +1,256 @@ +p { color: #300000; color: #300001; color: #300002; color: #300003; color: #300004; color: #300005; color: #300006; color: #300007; color: #300008; color: #300009; color: #30000a; color: #30000b; color: #30000c; color: #30000d; color: #30000e; color: #30000f; +color: #300100; color: #300101; color: #300102; color: #300103; color: #300104; color: #300105; color: #300106; color: #300107; color: #300108; color: #300109; color: #30010a; color: #30010b; color: #30010c; color: #30010d; color: #30010e; color: #30010f; +color: #300200; color: #300201; color: #300202; color: #300203; color: #300204; color: #300205; color: #300206; color: #300207; color: #300208; color: #300209; color: #30020a; color: #30020b; color: #30020c; color: #30020d; color: #30020e; color: #30020f; +color: #300300; color: #300301; color: #300302; color: #300303; color: #300304; color: #300305; color: #300306; color: #300307; color: #300308; color: #300309; color: #30030a; color: #30030b; color: #30030c; color: #30030d; color: #30030e; color: #30030f; +color: #300400; color: #300401; color: #300402; color: #300403; color: #300404; color: #300405; color: #300406; color: #300407; color: #300408; color: #300409; color: #30040a; color: #30040b; color: #30040c; color: #30040d; color: #30040e; color: #30040f; +color: #300500; color: #300501; color: #300502; color: #300503; color: #300504; color: #300505; color: #300506; color: #300507; color: #300508; color: #300509; color: #30050a; color: #30050b; color: #30050c; color: #30050d; color: #30050e; color: #30050f; +color: #300600; color: #300601; color: #300602; color: #300603; color: #300604; color: #300605; color: #300606; color: #300607; color: #300608; color: #300609; color: #30060a; color: #30060b; color: #30060c; color: #30060d; color: #30060e; color: #30060f; +color: #300700; color: #300701; color: #300702; color: #300703; color: #300704; color: #300705; color: #300706; color: #300707; color: #300708; color: #300709; color: #30070a; color: #30070b; color: #30070c; color: #30070d; color: #30070e; color: #30070f; +color: #300800; color: #300801; color: #300802; color: #300803; color: #300804; color: #300805; color: #300806; color: #300807; color: #300808; color: #300809; color: #30080a; color: #30080b; color: #30080c; color: #30080d; color: #30080e; color: #30080f; +color: #300900; color: #300901; color: #300902; color: #300903; color: #300904; color: #300905; color: #300906; color: #300907; color: #300908; color: #300909; color: #30090a; color: #30090b; color: #30090c; color: #30090d; color: #30090e; color: #30090f; +color: #300a00; color: #300a01; color: #300a02; color: #300a03; color: #300a04; color: #300a05; color: #300a06; color: #300a07; color: #300a08; color: #300a09; color: #300a0a; color: #300a0b; color: #300a0c; color: #300a0d; color: #300a0e; color: #300a0f; +color: #300b00; color: #300b01; color: #300b02; color: #300b03; color: #300b04; color: #300b05; color: #300b06; color: #300b07; color: #300b08; color: #300b09; color: #300b0a; color: #300b0b; color: #300b0c; color: #300b0d; color: #300b0e; color: #300b0f; +color: #300c00; color: #300c01; color: #300c02; color: #300c03; color: #300c04; color: #300c05; color: #300c06; color: #300c07; color: #300c08; color: #300c09; color: #300c0a; color: #300c0b; color: #300c0c; color: #300c0d; color: #300c0e; color: #300c0f; +color: #300d00; color: #300d01; color: #300d02; color: #300d03; color: #300d04; color: #300d05; color: #300d06; color: #300d07; color: #300d08; color: #300d09; color: #300d0a; color: #300d0b; color: #300d0c; color: #300d0d; color: #300d0e; color: #300d0f; +color: #300e00; color: #300e01; color: #300e02; color: #300e03; color: #300e04; color: #300e05; color: #300e06; color: #300e07; color: #300e08; color: #300e09; color: #300e0a; color: #300e0b; color: #300e0c; color: #300e0d; color: #300e0e; color: #300e0f; +color: #300f00; color: #300f01; color: #300f02; color: #300f03; color: #300f04; color: #300f05; color: #300f06; color: #300f07; color: #300f08; color: #300f09; color: #300f0a; color: #300f0b; color: #300f0c; color: #300f0d; color: #300f0e; color: #300f0f; +color: #301000; color: #301001; color: #301002; color: #301003; color: #301004; color: #301005; color: #301006; color: #301007; color: #301008; color: #301009; color: #30100a; color: #30100b; color: #30100c; color: #30100d; color: #30100e; color: #30100f; +color: #301100; color: #301101; color: #301102; color: #301103; color: #301104; color: #301105; color: #301106; color: #301107; color: #301108; color: #301109; color: #30110a; color: #30110b; color: #30110c; color: #30110d; color: #30110e; color: #30110f; +color: #301200; color: #301201; color: #301202; color: #301203; color: #301204; color: #301205; color: #301206; color: #301207; color: #301208; color: #301209; color: #30120a; color: #30120b; color: #30120c; color: #30120d; color: #30120e; color: #30120f; +color: #301300; color: #301301; color: #301302; color: #301303; color: #301304; color: #301305; color: #301306; color: #301307; color: #301308; color: #301309; color: #30130a; color: #30130b; color: #30130c; color: #30130d; color: #30130e; color: #30130f; +color: #301400; color: #301401; color: #301402; color: #301403; color: #301404; color: #301405; color: #301406; color: #301407; color: #301408; color: #301409; color: #30140a; color: #30140b; color: #30140c; color: #30140d; color: #30140e; color: #30140f; +color: #301500; color: #301501; color: #301502; color: #301503; color: #301504; color: #301505; color: #301506; color: #301507; color: #301508; color: #301509; color: #30150a; color: #30150b; color: #30150c; color: #30150d; color: #30150e; color: #30150f; +color: #301600; color: #301601; color: #301602; color: #301603; color: #301604; color: #301605; color: #301606; color: #301607; color: #301608; color: #301609; color: #30160a; color: #30160b; color: #30160c; color: #30160d; color: #30160e; color: #30160f; +color: #301700; color: #301701; color: #301702; color: #301703; color: #301704; color: #301705; color: #301706; color: #301707; color: #301708; color: #301709; color: #30170a; color: #30170b; color: #30170c; color: #30170d; color: #30170e; color: #30170f; +color: #301800; color: #301801; color: #301802; color: #301803; color: #301804; color: #301805; color: #301806; color: #301807; color: #301808; color: #301809; color: #30180a; color: #30180b; color: #30180c; color: #30180d; color: #30180e; color: #30180f; +color: #301900; color: #301901; color: #301902; color: #301903; color: #301904; color: #301905; color: #301906; color: #301907; color: #301908; color: #301909; color: #30190a; color: #30190b; color: #30190c; color: #30190d; color: #30190e; color: #30190f; +color: #301a00; color: #301a01; color: #301a02; color: #301a03; color: #301a04; color: #301a05; color: #301a06; color: #301a07; color: #301a08; color: #301a09; color: #301a0a; color: #301a0b; color: #301a0c; color: #301a0d; color: #301a0e; color: #301a0f; +color: #301b00; color: #301b01; color: #301b02; color: #301b03; color: #301b04; color: #301b05; color: #301b06; color: #301b07; color: #301b08; color: #301b09; color: #301b0a; color: #301b0b; color: #301b0c; color: #301b0d; color: #301b0e; color: #301b0f; +color: #301c00; color: #301c01; color: #301c02; color: #301c03; color: #301c04; color: #301c05; color: #301c06; color: #301c07; color: #301c08; color: #301c09; color: #301c0a; color: #301c0b; color: #301c0c; color: #301c0d; color: #301c0e; color: #301c0f; +color: #301d00; color: #301d01; color: #301d02; color: #301d03; color: #301d04; color: #301d05; color: #301d06; color: #301d07; color: #301d08; color: #301d09; color: #301d0a; color: #301d0b; color: #301d0c; color: #301d0d; color: #301d0e; color: #301d0f; +color: #301e00; color: #301e01; color: #301e02; color: #301e03; color: #301e04; color: #301e05; color: #301e06; color: #301e07; color: #301e08; color: #301e09; color: #301e0a; color: #301e0b; color: #301e0c; color: #301e0d; color: #301e0e; color: #301e0f; +color: #301f00; color: #301f01; color: #301f02; color: #301f03; color: #301f04; color: #301f05; color: #301f06; color: #301f07; color: #301f08; color: #301f09; color: #301f0a; color: #301f0b; color: #301f0c; color: #301f0d; color: #301f0e; color: #301f0f; +color: #302000; color: #302001; color: #302002; color: #302003; color: #302004; color: #302005; color: #302006; color: #302007; color: #302008; color: #302009; color: #30200a; color: #30200b; color: #30200c; color: #30200d; color: #30200e; color: #30200f; +color: #302100; color: #302101; color: #302102; color: #302103; color: #302104; color: #302105; color: #302106; color: #302107; color: #302108; color: #302109; color: #30210a; color: #30210b; color: #30210c; color: #30210d; color: #30210e; color: #30210f; +color: #302200; color: #302201; color: #302202; color: #302203; color: #302204; color: #302205; color: #302206; color: #302207; color: #302208; color: #302209; color: #30220a; color: #30220b; color: #30220c; color: #30220d; color: #30220e; color: #30220f; +color: #302300; color: #302301; color: #302302; color: #302303; color: #302304; color: #302305; color: #302306; color: #302307; color: #302308; color: #302309; color: #30230a; color: #30230b; color: #30230c; color: #30230d; color: #30230e; color: #30230f; +color: #302400; color: #302401; color: #302402; color: #302403; color: #302404; color: #302405; color: #302406; color: #302407; color: #302408; color: #302409; color: #30240a; color: #30240b; color: #30240c; color: #30240d; color: #30240e; color: #30240f; +color: #302500; color: #302501; color: #302502; color: #302503; color: #302504; color: #302505; color: #302506; color: #302507; color: #302508; color: #302509; color: #30250a; color: #30250b; color: #30250c; color: #30250d; color: #30250e; color: #30250f; +color: #302600; color: #302601; color: #302602; color: #302603; color: #302604; color: #302605; color: #302606; color: #302607; color: #302608; color: #302609; color: #30260a; color: #30260b; color: #30260c; color: #30260d; color: #30260e; color: #30260f; +color: #302700; color: #302701; color: #302702; color: #302703; color: #302704; color: #302705; color: #302706; color: #302707; color: #302708; color: #302709; color: #30270a; color: #30270b; color: #30270c; color: #30270d; color: #30270e; color: #30270f; +color: #302800; color: #302801; color: #302802; color: #302803; color: #302804; color: #302805; color: #302806; color: #302807; color: #302808; color: #302809; color: #30280a; color: #30280b; color: #30280c; color: #30280d; color: #30280e; color: #30280f; +color: #302900; color: #302901; color: #302902; color: #302903; color: #302904; color: #302905; color: #302906; color: #302907; color: #302908; color: #302909; color: #30290a; color: #30290b; color: #30290c; color: #30290d; color: #30290e; color: #30290f; +color: #302a00; color: #302a01; color: #302a02; color: #302a03; color: #302a04; color: #302a05; color: #302a06; color: #302a07; color: #302a08; color: #302a09; color: #302a0a; color: #302a0b; color: #302a0c; color: #302a0d; color: #302a0e; color: #302a0f; +color: #302b00; color: #302b01; color: #302b02; color: #302b03; color: #302b04; color: #302b05; color: #302b06; color: #302b07; color: #302b08; color: #302b09; color: #302b0a; color: #302b0b; color: #302b0c; color: #302b0d; color: #302b0e; color: #302b0f; +color: #302c00; color: #302c01; color: #302c02; color: #302c03; color: #302c04; color: #302c05; color: #302c06; color: #302c07; color: #302c08; color: #302c09; color: #302c0a; color: #302c0b; color: #302c0c; color: #302c0d; color: #302c0e; color: #302c0f; +color: #302d00; color: #302d01; color: #302d02; color: #302d03; color: #302d04; color: #302d05; color: #302d06; color: #302d07; color: #302d08; color: #302d09; color: #302d0a; color: #302d0b; color: #302d0c; color: #302d0d; color: #302d0e; color: #302d0f; +color: #302e00; color: #302e01; color: #302e02; color: #302e03; color: #302e04; color: #302e05; color: #302e06; color: #302e07; color: #302e08; color: #302e09; color: #302e0a; color: #302e0b; color: #302e0c; color: #302e0d; color: #302e0e; color: #302e0f; +color: #302f00; color: #302f01; color: #302f02; color: #302f03; color: #302f04; color: #302f05; color: #302f06; color: #302f07; color: #302f08; color: #302f09; color: #302f0a; color: #302f0b; color: #302f0c; color: #302f0d; color: #302f0e; color: #302f0f; +color: #303000; color: #303001; color: #303002; color: #303003; color: #303004; color: #303005; color: #303006; color: #303007; color: #303008; color: #303009; color: #30300a; color: #30300b; color: #30300c; color: #30300d; color: #30300e; color: #30300f; +color: #303100; color: #303101; color: #303102; color: #303103; color: #303104; color: #303105; color: #303106; color: #303107; color: #303108; color: #303109; color: #30310a; color: #30310b; color: #30310c; color: #30310d; color: #30310e; color: #30310f; +color: #303200; color: #303201; color: #303202; color: #303203; color: #303204; color: #303205; color: #303206; color: #303207; color: #303208; color: #303209; color: #30320a; color: #30320b; color: #30320c; color: #30320d; color: #30320e; color: #30320f; +color: #303300; color: #303301; color: #303302; color: #303303; color: #303304; color: #303305; color: #303306; color: #303307; color: #303308; color: #303309; color: #30330a; color: #30330b; color: #30330c; color: #30330d; color: #30330e; color: #30330f; +color: #303400; color: #303401; color: #303402; color: #303403; color: #303404; color: #303405; color: #303406; color: #303407; color: #303408; color: #303409; color: #30340a; color: #30340b; color: #30340c; color: #30340d; color: #30340e; color: #30340f; +color: #303500; color: #303501; color: #303502; color: #303503; color: #303504; color: #303505; color: #303506; color: #303507; color: #303508; color: #303509; color: #30350a; color: #30350b; color: #30350c; color: #30350d; color: #30350e; color: #30350f; +color: #303600; color: #303601; color: #303602; color: #303603; color: #303604; color: #303605; color: #303606; color: #303607; color: #303608; color: #303609; color: #30360a; color: #30360b; color: #30360c; color: #30360d; color: #30360e; color: #30360f; +color: #303700; color: #303701; color: #303702; color: #303703; color: #303704; color: #303705; color: #303706; color: #303707; color: #303708; color: #303709; color: #30370a; color: #30370b; color: #30370c; color: #30370d; color: #30370e; color: #30370f; +color: #303800; color: #303801; color: #303802; color: #303803; color: #303804; color: #303805; color: #303806; color: #303807; color: #303808; color: #303809; color: #30380a; color: #30380b; color: #30380c; color: #30380d; color: #30380e; color: #30380f; +color: #303900; color: #303901; color: #303902; color: #303903; color: #303904; color: #303905; color: #303906; color: #303907; color: #303908; color: #303909; color: #30390a; color: #30390b; color: #30390c; color: #30390d; color: #30390e; color: #30390f; +color: #303a00; color: #303a01; color: #303a02; color: #303a03; color: #303a04; color: #303a05; color: #303a06; color: #303a07; color: #303a08; color: #303a09; color: #303a0a; color: #303a0b; color: #303a0c; color: #303a0d; color: #303a0e; color: #303a0f; +color: #303b00; color: #303b01; color: #303b02; color: #303b03; color: #303b04; color: #303b05; color: #303b06; color: #303b07; color: #303b08; color: #303b09; color: #303b0a; color: #303b0b; color: #303b0c; color: #303b0d; color: #303b0e; color: #303b0f; +color: #303c00; color: #303c01; color: #303c02; color: #303c03; color: #303c04; color: #303c05; color: #303c06; color: #303c07; color: #303c08; color: #303c09; color: #303c0a; color: #303c0b; color: #303c0c; color: #303c0d; color: #303c0e; color: #303c0f; +color: #303d00; color: #303d01; color: #303d02; color: #303d03; color: #303d04; color: #303d05; color: #303d06; color: #303d07; color: #303d08; color: #303d09; color: #303d0a; color: #303d0b; color: #303d0c; color: #303d0d; color: #303d0e; color: #303d0f; +color: #303e00; color: #303e01; color: #303e02; color: #303e03; color: #303e04; color: #303e05; color: #303e06; color: #303e07; color: #303e08; color: #303e09; color: #303e0a; color: #303e0b; color: #303e0c; color: #303e0d; color: #303e0e; color: #303e0f; +color: #303f00; color: #303f01; color: #303f02; color: #303f03; color: #303f04; color: #303f05; color: #303f06; color: #303f07; color: #303f08; color: #303f09; color: #303f0a; color: #303f0b; color: #303f0c; color: #303f0d; color: #303f0e; color: #303f0f; +color: #304000; color: #304001; color: #304002; color: #304003; color: #304004; color: #304005; color: #304006; color: #304007; color: #304008; color: #304009; color: #30400a; color: #30400b; color: #30400c; color: #30400d; color: #30400e; color: #30400f; +color: #304100; color: #304101; color: #304102; color: #304103; color: #304104; color: #304105; color: #304106; color: #304107; color: #304108; color: #304109; color: #30410a; color: #30410b; color: #30410c; color: #30410d; color: #30410e; color: #30410f; +color: #304200; color: #304201; color: #304202; color: #304203; color: #304204; color: #304205; color: #304206; color: #304207; color: #304208; color: #304209; color: #30420a; color: #30420b; color: #30420c; color: #30420d; color: #30420e; color: #30420f; +color: #304300; color: #304301; color: #304302; color: #304303; color: #304304; color: #304305; color: #304306; color: #304307; color: #304308; color: #304309; color: #30430a; color: #30430b; color: #30430c; color: #30430d; color: #30430e; color: #30430f; +color: #304400; color: #304401; color: #304402; color: #304403; color: #304404; color: #304405; color: #304406; color: #304407; color: #304408; color: #304409; color: #30440a; color: #30440b; color: #30440c; color: #30440d; color: #30440e; color: #30440f; +color: #304500; color: #304501; color: #304502; color: #304503; color: #304504; color: #304505; color: #304506; color: #304507; color: #304508; color: #304509; color: #30450a; color: #30450b; color: #30450c; color: #30450d; color: #30450e; color: #30450f; +color: #304600; color: #304601; color: #304602; color: #304603; color: #304604; color: #304605; color: #304606; color: #304607; color: #304608; color: #304609; color: #30460a; color: #30460b; color: #30460c; color: #30460d; color: #30460e; color: #30460f; +color: #304700; color: #304701; color: #304702; color: #304703; color: #304704; color: #304705; color: #304706; color: #304707; color: #304708; color: #304709; color: #30470a; color: #30470b; color: #30470c; color: #30470d; color: #30470e; color: #30470f; +color: #304800; color: #304801; color: #304802; color: #304803; color: #304804; color: #304805; color: #304806; color: #304807; color: #304808; color: #304809; color: #30480a; color: #30480b; color: #30480c; color: #30480d; color: #30480e; color: #30480f; +color: #304900; color: #304901; color: #304902; color: #304903; color: #304904; color: #304905; color: #304906; color: #304907; color: #304908; color: #304909; color: #30490a; color: #30490b; color: #30490c; color: #30490d; color: #30490e; color: #30490f; +color: #304a00; color: #304a01; color: #304a02; color: #304a03; color: #304a04; color: #304a05; color: #304a06; color: #304a07; color: #304a08; color: #304a09; color: #304a0a; color: #304a0b; color: #304a0c; color: #304a0d; color: #304a0e; color: #304a0f; +color: #304b00; color: #304b01; color: #304b02; color: #304b03; color: #304b04; color: #304b05; color: #304b06; color: #304b07; color: #304b08; color: #304b09; color: #304b0a; color: #304b0b; color: #304b0c; color: #304b0d; color: #304b0e; color: #304b0f; +color: #304c00; color: #304c01; color: #304c02; color: #304c03; color: #304c04; color: #304c05; color: #304c06; color: #304c07; color: #304c08; color: #304c09; color: #304c0a; color: #304c0b; color: #304c0c; color: #304c0d; color: #304c0e; color: #304c0f; +color: #304d00; color: #304d01; color: #304d02; color: #304d03; color: #304d04; color: #304d05; color: #304d06; color: #304d07; color: #304d08; color: #304d09; color: #304d0a; color: #304d0b; color: #304d0c; color: #304d0d; color: #304d0e; color: #304d0f; +color: #304e00; color: #304e01; color: #304e02; color: #304e03; color: #304e04; color: #304e05; color: #304e06; color: #304e07; color: #304e08; color: #304e09; color: #304e0a; color: #304e0b; color: #304e0c; color: #304e0d; color: #304e0e; color: #304e0f; +color: #304f00; color: #304f01; color: #304f02; color: #304f03; color: #304f04; color: #304f05; color: #304f06; color: #304f07; color: #304f08; color: #304f09; color: #304f0a; color: #304f0b; color: #304f0c; color: #304f0d; color: #304f0e; color: #304f0f; +color: #305000; color: #305001; color: #305002; color: #305003; color: #305004; color: #305005; color: #305006; color: #305007; color: #305008; color: #305009; color: #30500a; color: #30500b; color: #30500c; color: #30500d; color: #30500e; color: #30500f; +color: #305100; color: #305101; color: #305102; color: #305103; color: #305104; color: #305105; color: #305106; color: #305107; color: #305108; color: #305109; color: #30510a; color: #30510b; color: #30510c; color: #30510d; color: #30510e; color: #30510f; +color: #305200; color: #305201; color: #305202; color: #305203; color: #305204; color: #305205; color: #305206; color: #305207; color: #305208; color: #305209; color: #30520a; color: #30520b; color: #30520c; color: #30520d; color: #30520e; color: #30520f; +color: #305300; color: #305301; color: #305302; color: #305303; color: #305304; color: #305305; color: #305306; color: #305307; color: #305308; color: #305309; color: #30530a; color: #30530b; color: #30530c; color: #30530d; color: #30530e; color: #30530f; +color: #305400; color: #305401; color: #305402; color: #305403; color: #305404; color: #305405; color: #305406; color: #305407; color: #305408; color: #305409; color: #30540a; color: #30540b; color: #30540c; color: #30540d; color: #30540e; color: #30540f; +color: #305500; color: #305501; color: #305502; color: #305503; color: #305504; color: #305505; color: #305506; color: #305507; color: #305508; color: #305509; color: #30550a; color: #30550b; color: #30550c; color: #30550d; color: #30550e; color: #30550f; +color: #305600; color: #305601; color: #305602; color: #305603; color: #305604; color: #305605; color: #305606; color: #305607; color: #305608; color: #305609; color: #30560a; color: #30560b; color: #30560c; color: #30560d; color: #30560e; color: #30560f; +color: #305700; color: #305701; color: #305702; color: #305703; color: #305704; color: #305705; color: #305706; color: #305707; color: #305708; color: #305709; color: #30570a; color: #30570b; color: #30570c; color: #30570d; color: #30570e; color: #30570f; +color: #305800; color: #305801; color: #305802; color: #305803; color: #305804; color: #305805; color: #305806; color: #305807; color: #305808; color: #305809; color: #30580a; color: #30580b; color: #30580c; color: #30580d; color: #30580e; color: #30580f; +color: #305900; color: #305901; color: #305902; color: #305903; color: #305904; color: #305905; color: #305906; color: #305907; color: #305908; color: #305909; color: #30590a; color: #30590b; color: #30590c; color: #30590d; color: #30590e; color: #30590f; +color: #305a00; color: #305a01; color: #305a02; color: #305a03; color: #305a04; color: #305a05; color: #305a06; color: #305a07; color: #305a08; color: #305a09; color: #305a0a; color: #305a0b; color: #305a0c; color: #305a0d; color: #305a0e; color: #305a0f; +color: #305b00; color: #305b01; color: #305b02; color: #305b03; color: #305b04; color: #305b05; color: #305b06; color: #305b07; color: #305b08; color: #305b09; color: #305b0a; color: #305b0b; color: #305b0c; color: #305b0d; color: #305b0e; color: #305b0f; +color: #305c00; color: #305c01; color: #305c02; color: #305c03; color: #305c04; color: #305c05; color: #305c06; color: #305c07; color: #305c08; color: #305c09; color: #305c0a; color: #305c0b; color: #305c0c; color: #305c0d; color: #305c0e; color: #305c0f; +color: #305d00; color: #305d01; color: #305d02; color: #305d03; color: #305d04; color: #305d05; color: #305d06; color: #305d07; color: #305d08; color: #305d09; color: #305d0a; color: #305d0b; color: #305d0c; color: #305d0d; color: #305d0e; color: #305d0f; +color: #305e00; color: #305e01; color: #305e02; color: #305e03; color: #305e04; color: #305e05; color: #305e06; color: #305e07; color: #305e08; color: #305e09; color: #305e0a; color: #305e0b; color: #305e0c; color: #305e0d; color: #305e0e; color: #305e0f; +color: #305f00; color: #305f01; color: #305f02; color: #305f03; color: #305f04; color: #305f05; color: #305f06; color: #305f07; color: #305f08; color: #305f09; color: #305f0a; color: #305f0b; color: #305f0c; color: #305f0d; color: #305f0e; color: #305f0f; +color: #306000; color: #306001; color: #306002; color: #306003; color: #306004; color: #306005; color: #306006; color: #306007; color: #306008; color: #306009; color: #30600a; color: #30600b; color: #30600c; color: #30600d; color: #30600e; color: #30600f; +color: #306100; color: #306101; color: #306102; color: #306103; color: #306104; color: #306105; color: #306106; color: #306107; color: #306108; color: #306109; color: #30610a; color: #30610b; color: #30610c; color: #30610d; color: #30610e; color: #30610f; +color: #306200; color: #306201; color: #306202; color: #306203; color: #306204; color: #306205; color: #306206; color: #306207; color: #306208; color: #306209; color: #30620a; color: #30620b; color: #30620c; color: #30620d; color: #30620e; color: #30620f; +color: #306300; color: #306301; color: #306302; color: #306303; color: #306304; color: #306305; color: #306306; color: #306307; color: #306308; color: #306309; color: #30630a; color: #30630b; color: #30630c; color: #30630d; color: #30630e; color: #30630f; +color: #306400; color: #306401; color: #306402; color: #306403; color: #306404; color: #306405; color: #306406; color: #306407; color: #306408; color: #306409; color: #30640a; color: #30640b; color: #30640c; color: #30640d; color: #30640e; color: #30640f; +color: #306500; color: #306501; color: #306502; color: #306503; color: #306504; color: #306505; color: #306506; color: #306507; color: #306508; color: #306509; color: #30650a; color: #30650b; color: #30650c; color: #30650d; color: #30650e; color: #30650f; +color: #306600; color: #306601; color: #306602; color: #306603; color: #306604; color: #306605; color: #306606; color: #306607; color: #306608; color: #306609; color: #30660a; color: #30660b; color: #30660c; color: #30660d; color: #30660e; color: #30660f; +color: #306700; color: #306701; color: #306702; color: #306703; color: #306704; color: #306705; color: #306706; color: #306707; color: #306708; color: #306709; color: #30670a; color: #30670b; color: #30670c; color: #30670d; color: #30670e; color: #30670f; +color: #306800; color: #306801; color: #306802; color: #306803; color: #306804; color: #306805; color: #306806; color: #306807; color: #306808; color: #306809; color: #30680a; color: #30680b; color: #30680c; color: #30680d; color: #30680e; color: #30680f; +color: #306900; color: #306901; color: #306902; color: #306903; color: #306904; color: #306905; color: #306906; color: #306907; color: #306908; color: #306909; color: #30690a; color: #30690b; color: #30690c; color: #30690d; color: #30690e; color: #30690f; +color: #306a00; color: #306a01; color: #306a02; color: #306a03; color: #306a04; color: #306a05; color: #306a06; color: #306a07; color: #306a08; color: #306a09; color: #306a0a; color: #306a0b; color: #306a0c; color: #306a0d; color: #306a0e; color: #306a0f; +color: #306b00; color: #306b01; color: #306b02; color: #306b03; color: #306b04; color: #306b05; color: #306b06; color: #306b07; color: #306b08; color: #306b09; color: #306b0a; color: #306b0b; color: #306b0c; color: #306b0d; color: #306b0e; color: #306b0f; +color: #306c00; color: #306c01; color: #306c02; color: #306c03; color: #306c04; color: #306c05; color: #306c06; color: #306c07; color: #306c08; color: #306c09; color: #306c0a; color: #306c0b; color: #306c0c; color: #306c0d; color: #306c0e; color: #306c0f; +color: #306d00; color: #306d01; color: #306d02; color: #306d03; color: #306d04; color: #306d05; color: #306d06; color: #306d07; color: #306d08; color: #306d09; color: #306d0a; color: #306d0b; color: #306d0c; color: #306d0d; color: #306d0e; color: #306d0f; +color: #306e00; color: #306e01; color: #306e02; color: #306e03; color: #306e04; color: #306e05; color: #306e06; color: #306e07; color: #306e08; color: #306e09; color: #306e0a; color: #306e0b; color: #306e0c; color: #306e0d; color: #306e0e; color: #306e0f; +color: #306f00; color: #306f01; color: #306f02; color: #306f03; color: #306f04; color: #306f05; color: #306f06; color: #306f07; color: #306f08; color: #306f09; color: #306f0a; color: #306f0b; color: #306f0c; color: #306f0d; color: #306f0e; color: #306f0f; +color: #307000; color: #307001; color: #307002; color: #307003; color: #307004; color: #307005; color: #307006; color: #307007; color: #307008; color: #307009; color: #30700a; color: #30700b; color: #30700c; color: #30700d; color: #30700e; color: #30700f; +color: #307100; color: #307101; color: #307102; color: #307103; color: #307104; color: #307105; color: #307106; color: #307107; color: #307108; color: #307109; color: #30710a; color: #30710b; color: #30710c; color: #30710d; color: #30710e; color: #30710f; +color: #307200; color: #307201; color: #307202; color: #307203; color: #307204; color: #307205; color: #307206; color: #307207; color: #307208; color: #307209; color: #30720a; color: #30720b; color: #30720c; color: #30720d; color: #30720e; color: #30720f; +color: #307300; color: #307301; color: #307302; color: #307303; color: #307304; color: #307305; color: #307306; color: #307307; color: #307308; color: #307309; color: #30730a; color: #30730b; color: #30730c; color: #30730d; color: #30730e; color: #30730f; +color: #307400; color: #307401; color: #307402; color: #307403; color: #307404; color: #307405; color: #307406; color: #307407; color: #307408; color: #307409; color: #30740a; color: #30740b; color: #30740c; color: #30740d; color: #30740e; color: #30740f; +color: #307500; color: #307501; color: #307502; color: #307503; color: #307504; color: #307505; color: #307506; color: #307507; color: #307508; color: #307509; color: #30750a; color: #30750b; color: #30750c; color: #30750d; color: #30750e; color: #30750f; +color: #307600; color: #307601; color: #307602; color: #307603; color: #307604; color: #307605; color: #307606; color: #307607; color: #307608; color: #307609; color: #30760a; color: #30760b; color: #30760c; color: #30760d; color: #30760e; color: #30760f; +color: #307700; color: #307701; color: #307702; color: #307703; color: #307704; color: #307705; color: #307706; color: #307707; color: #307708; color: #307709; color: #30770a; color: #30770b; color: #30770c; color: #30770d; color: #30770e; color: #30770f; +color: #307800; color: #307801; color: #307802; color: #307803; color: #307804; color: #307805; color: #307806; color: #307807; color: #307808; color: #307809; color: #30780a; color: #30780b; color: #30780c; color: #30780d; color: #30780e; color: #30780f; +color: #307900; color: #307901; color: #307902; color: #307903; color: #307904; color: #307905; color: #307906; color: #307907; color: #307908; color: #307909; color: #30790a; color: #30790b; color: #30790c; color: #30790d; color: #30790e; color: #30790f; +color: #307a00; color: #307a01; color: #307a02; color: #307a03; color: #307a04; color: #307a05; color: #307a06; color: #307a07; color: #307a08; color: #307a09; color: #307a0a; color: #307a0b; color: #307a0c; color: #307a0d; color: #307a0e; color: #307a0f; +color: #307b00; color: #307b01; color: #307b02; color: #307b03; color: #307b04; color: #307b05; color: #307b06; color: #307b07; color: #307b08; color: #307b09; color: #307b0a; color: #307b0b; color: #307b0c; color: #307b0d; color: #307b0e; color: #307b0f; +color: #307c00; color: #307c01; color: #307c02; color: #307c03; color: #307c04; color: #307c05; color: #307c06; color: #307c07; color: #307c08; color: #307c09; color: #307c0a; color: #307c0b; color: #307c0c; color: #307c0d; color: #307c0e; color: #307c0f; +color: #307d00; color: #307d01; color: #307d02; color: #307d03; color: #307d04; color: #307d05; color: #307d06; color: #307d07; color: #307d08; color: #307d09; color: #307d0a; color: #307d0b; color: #307d0c; color: #307d0d; color: #307d0e; color: #307d0f; +color: #307e00; color: #307e01; color: #307e02; color: #307e03; color: #307e04; color: #307e05; color: #307e06; color: #307e07; color: #307e08; color: #307e09; color: #307e0a; color: #307e0b; color: #307e0c; color: #307e0d; color: #307e0e; color: #307e0f; +color: #307f00; color: #307f01; color: #307f02; color: #307f03; color: #307f04; color: #307f05; color: #307f06; color: #307f07; color: #307f08; color: #307f09; color: #307f0a; color: #307f0b; color: #307f0c; color: #307f0d; color: #307f0e; color: #307f0f; +color: #308000; color: #308001; color: #308002; color: #308003; color: #308004; color: #308005; color: #308006; color: #308007; color: #308008; color: #308009; color: #30800a; color: #30800b; color: #30800c; color: #30800d; color: #30800e; color: #30800f; +color: #308100; color: #308101; color: #308102; color: #308103; color: #308104; color: #308105; color: #308106; color: #308107; color: #308108; color: #308109; color: #30810a; color: #30810b; color: #30810c; color: #30810d; color: #30810e; color: #30810f; +color: #308200; color: #308201; color: #308202; color: #308203; color: #308204; color: #308205; color: #308206; color: #308207; color: #308208; color: #308209; color: #30820a; color: #30820b; color: #30820c; color: #30820d; color: #30820e; color: #30820f; +color: #308300; color: #308301; color: #308302; color: #308303; color: #308304; color: #308305; color: #308306; color: #308307; color: #308308; color: #308309; color: #30830a; color: #30830b; color: #30830c; color: #30830d; color: #30830e; color: #30830f; +color: #308400; color: #308401; color: #308402; color: #308403; color: #308404; color: #308405; color: #308406; color: #308407; color: #308408; color: #308409; color: #30840a; color: #30840b; color: #30840c; color: #30840d; color: #30840e; color: #30840f; +color: #308500; color: #308501; color: #308502; color: #308503; color: #308504; color: #308505; color: #308506; color: #308507; color: #308508; color: #308509; color: #30850a; color: #30850b; color: #30850c; color: #30850d; color: #30850e; color: #30850f; +color: #308600; color: #308601; color: #308602; color: #308603; color: #308604; color: #308605; color: #308606; color: #308607; color: #308608; color: #308609; color: #30860a; color: #30860b; color: #30860c; color: #30860d; color: #30860e; color: #30860f; +color: #308700; color: #308701; color: #308702; color: #308703; color: #308704; color: #308705; color: #308706; color: #308707; color: #308708; color: #308709; color: #30870a; color: #30870b; color: #30870c; color: #30870d; color: #30870e; color: #30870f; +color: #308800; color: #308801; color: #308802; color: #308803; color: #308804; color: #308805; color: #308806; color: #308807; color: #308808; color: #308809; color: #30880a; color: #30880b; color: #30880c; color: #30880d; color: #30880e; color: #30880f; +color: #308900; color: #308901; color: #308902; color: #308903; color: #308904; color: #308905; color: #308906; color: #308907; color: #308908; color: #308909; color: #30890a; color: #30890b; color: #30890c; color: #30890d; color: #30890e; color: #30890f; +color: #308a00; color: #308a01; color: #308a02; color: #308a03; color: #308a04; color: #308a05; color: #308a06; color: #308a07; color: #308a08; color: #308a09; color: #308a0a; color: #308a0b; color: #308a0c; color: #308a0d; color: #308a0e; color: #308a0f; +color: #308b00; color: #308b01; color: #308b02; color: #308b03; color: #308b04; color: #308b05; color: #308b06; color: #308b07; color: #308b08; color: #308b09; color: #308b0a; color: #308b0b; color: #308b0c; color: #308b0d; color: #308b0e; color: #308b0f; +color: #308c00; color: #308c01; color: #308c02; color: #308c03; color: #308c04; color: #308c05; color: #308c06; color: #308c07; color: #308c08; color: #308c09; color: #308c0a; color: #308c0b; color: #308c0c; color: #308c0d; color: #308c0e; color: #308c0f; +color: #308d00; color: #308d01; color: #308d02; color: #308d03; color: #308d04; color: #308d05; color: #308d06; color: #308d07; color: #308d08; color: #308d09; color: #308d0a; color: #308d0b; color: #308d0c; color: #308d0d; color: #308d0e; color: #308d0f; +color: #308e00; color: #308e01; color: #308e02; color: #308e03; color: #308e04; color: #308e05; color: #308e06; color: #308e07; color: #308e08; color: #308e09; color: #308e0a; color: #308e0b; color: #308e0c; color: #308e0d; color: #308e0e; color: #308e0f; +color: #308f00; color: #308f01; color: #308f02; color: #308f03; color: #308f04; color: #308f05; color: #308f06; color: #308f07; color: #308f08; color: #308f09; color: #308f0a; color: #308f0b; color: #308f0c; color: #308f0d; color: #308f0e; color: #308f0f; +color: #309000; color: #309001; color: #309002; color: #309003; color: #309004; color: #309005; color: #309006; color: #309007; color: #309008; color: #309009; color: #30900a; color: #30900b; color: #30900c; color: #30900d; color: #30900e; color: #30900f; +color: #309100; color: #309101; color: #309102; color: #309103; color: #309104; color: #309105; color: #309106; color: #309107; color: #309108; color: #309109; color: #30910a; color: #30910b; color: #30910c; color: #30910d; color: #30910e; color: #30910f; +color: #309200; color: #309201; color: #309202; color: #309203; color: #309204; color: #309205; color: #309206; color: #309207; color: #309208; color: #309209; color: #30920a; color: #30920b; color: #30920c; color: #30920d; color: #30920e; color: #30920f; +color: #309300; color: #309301; color: #309302; color: #309303; color: #309304; color: #309305; color: #309306; color: #309307; color: #309308; color: #309309; color: #30930a; color: #30930b; color: #30930c; color: #30930d; color: #30930e; color: #30930f; +color: #309400; color: #309401; color: #309402; color: #309403; color: #309404; color: #309405; color: #309406; color: #309407; color: #309408; color: #309409; color: #30940a; color: #30940b; color: #30940c; color: #30940d; color: #30940e; color: #30940f; +color: #309500; color: #309501; color: #309502; color: #309503; color: #309504; color: #309505; color: #309506; color: #309507; color: #309508; color: #309509; color: #30950a; color: #30950b; color: #30950c; color: #30950d; color: #30950e; color: #30950f; +color: #309600; color: #309601; color: #309602; color: #309603; color: #309604; color: #309605; color: #309606; color: #309607; color: #309608; color: #309609; color: #30960a; color: #30960b; color: #30960c; color: #30960d; color: #30960e; color: #30960f; +color: #309700; color: #309701; color: #309702; color: #309703; color: #309704; color: #309705; color: #309706; color: #309707; color: #309708; color: #309709; color: #30970a; color: #30970b; color: #30970c; color: #30970d; color: #30970e; color: #30970f; +color: #309800; color: #309801; color: #309802; color: #309803; color: #309804; color: #309805; color: #309806; color: #309807; color: #309808; color: #309809; color: #30980a; color: #30980b; color: #30980c; color: #30980d; color: #30980e; color: #30980f; +color: #309900; color: #309901; color: #309902; color: #309903; color: #309904; color: #309905; color: #309906; color: #309907; color: #309908; color: #309909; color: #30990a; color: #30990b; color: #30990c; color: #30990d; color: #30990e; color: #30990f; +color: #309a00; color: #309a01; color: #309a02; color: #309a03; color: #309a04; color: #309a05; color: #309a06; color: #309a07; color: #309a08; color: #309a09; color: #309a0a; color: #309a0b; color: #309a0c; color: #309a0d; color: #309a0e; color: #309a0f; +color: #309b00; color: #309b01; color: #309b02; color: #309b03; color: #309b04; color: #309b05; color: #309b06; color: #309b07; color: #309b08; color: #309b09; color: #309b0a; color: #309b0b; color: #309b0c; color: #309b0d; color: #309b0e; color: #309b0f; +color: #309c00; color: #309c01; color: #309c02; color: #309c03; color: #309c04; color: #309c05; color: #309c06; color: #309c07; color: #309c08; color: #309c09; color: #309c0a; color: #309c0b; color: #309c0c; color: #309c0d; color: #309c0e; color: #309c0f; +color: #309d00; color: #309d01; color: #309d02; color: #309d03; color: #309d04; color: #309d05; color: #309d06; color: #309d07; color: #309d08; color: #309d09; color: #309d0a; color: #309d0b; color: #309d0c; color: #309d0d; color: #309d0e; color: #309d0f; +color: #309e00; color: #309e01; color: #309e02; color: #309e03; color: #309e04; color: #309e05; color: #309e06; color: #309e07; color: #309e08; color: #309e09; color: #309e0a; color: #309e0b; color: #309e0c; color: #309e0d; color: #309e0e; color: #309e0f; +color: #309f00; color: #309f01; color: #309f02; color: #309f03; color: #309f04; color: #309f05; color: #309f06; color: #309f07; color: #309f08; color: #309f09; color: #309f0a; color: #309f0b; color: #309f0c; color: #309f0d; color: #309f0e; color: #309f0f; +color: #30a000; color: #30a001; color: #30a002; color: #30a003; color: #30a004; color: #30a005; color: #30a006; color: #30a007; color: #30a008; color: #30a009; color: #30a00a; color: #30a00b; color: #30a00c; color: #30a00d; color: #30a00e; color: #30a00f; +color: #30a100; color: #30a101; color: #30a102; color: #30a103; color: #30a104; color: #30a105; color: #30a106; color: #30a107; color: #30a108; color: #30a109; color: #30a10a; color: #30a10b; color: #30a10c; color: #30a10d; color: #30a10e; color: #30a10f; +color: #30a200; color: #30a201; color: #30a202; color: #30a203; color: #30a204; color: #30a205; color: #30a206; color: #30a207; color: #30a208; color: #30a209; color: #30a20a; color: #30a20b; color: #30a20c; color: #30a20d; color: #30a20e; color: #30a20f; +color: #30a300; color: #30a301; color: #30a302; color: #30a303; color: #30a304; color: #30a305; color: #30a306; color: #30a307; color: #30a308; color: #30a309; color: #30a30a; color: #30a30b; color: #30a30c; color: #30a30d; color: #30a30e; color: #30a30f; +color: #30a400; color: #30a401; color: #30a402; color: #30a403; color: #30a404; color: #30a405; color: #30a406; color: #30a407; color: #30a408; color: #30a409; color: #30a40a; color: #30a40b; color: #30a40c; color: #30a40d; color: #30a40e; color: #30a40f; +color: #30a500; color: #30a501; color: #30a502; color: #30a503; color: #30a504; color: #30a505; color: #30a506; color: #30a507; color: #30a508; color: #30a509; color: #30a50a; color: #30a50b; color: #30a50c; color: #30a50d; color: #30a50e; color: #30a50f; +color: #30a600; color: #30a601; color: #30a602; color: #30a603; color: #30a604; color: #30a605; color: #30a606; color: #30a607; color: #30a608; color: #30a609; color: #30a60a; color: #30a60b; color: #30a60c; color: #30a60d; color: #30a60e; color: #30a60f; +color: #30a700; color: #30a701; color: #30a702; color: #30a703; color: #30a704; color: #30a705; color: #30a706; color: #30a707; color: #30a708; color: #30a709; color: #30a70a; color: #30a70b; color: #30a70c; color: #30a70d; color: #30a70e; color: #30a70f; +color: #30a800; color: #30a801; color: #30a802; color: #30a803; color: #30a804; color: #30a805; color: #30a806; color: #30a807; color: #30a808; color: #30a809; color: #30a80a; color: #30a80b; color: #30a80c; color: #30a80d; color: #30a80e; color: #30a80f; +color: #30a900; color: #30a901; color: #30a902; color: #30a903; color: #30a904; color: #30a905; color: #30a906; color: #30a907; color: #30a908; color: #30a909; color: #30a90a; color: #30a90b; color: #30a90c; color: #30a90d; color: #30a90e; color: #30a90f; +color: #30aa00; color: #30aa01; color: #30aa02; color: #30aa03; color: #30aa04; color: #30aa05; color: #30aa06; color: #30aa07; color: #30aa08; color: #30aa09; color: #30aa0a; color: #30aa0b; color: #30aa0c; color: #30aa0d; color: #30aa0e; color: #30aa0f; +color: #30ab00; color: #30ab01; color: #30ab02; color: #30ab03; color: #30ab04; color: #30ab05; color: #30ab06; color: #30ab07; color: #30ab08; color: #30ab09; color: #30ab0a; color: #30ab0b; color: #30ab0c; color: #30ab0d; color: #30ab0e; color: #30ab0f; +color: #30ac00; color: #30ac01; color: #30ac02; color: #30ac03; color: #30ac04; color: #30ac05; color: #30ac06; color: #30ac07; color: #30ac08; color: #30ac09; color: #30ac0a; color: #30ac0b; color: #30ac0c; color: #30ac0d; color: #30ac0e; color: #30ac0f; +color: #30ad00; color: #30ad01; color: #30ad02; color: #30ad03; color: #30ad04; color: #30ad05; color: #30ad06; color: #30ad07; color: #30ad08; color: #30ad09; color: #30ad0a; color: #30ad0b; color: #30ad0c; color: #30ad0d; color: #30ad0e; color: #30ad0f; +color: #30ae00; color: #30ae01; color: #30ae02; color: #30ae03; color: #30ae04; color: #30ae05; color: #30ae06; color: #30ae07; color: #30ae08; color: #30ae09; color: #30ae0a; color: #30ae0b; color: #30ae0c; color: #30ae0d; color: #30ae0e; color: #30ae0f; +color: #30af00; color: #30af01; color: #30af02; color: #30af03; color: #30af04; color: #30af05; color: #30af06; color: #30af07; color: #30af08; color: #30af09; color: #30af0a; color: #30af0b; color: #30af0c; color: #30af0d; color: #30af0e; color: #30af0f; +color: #30b000; color: #30b001; color: #30b002; color: #30b003; color: #30b004; color: #30b005; color: #30b006; color: #30b007; color: #30b008; color: #30b009; color: #30b00a; color: #30b00b; color: #30b00c; color: #30b00d; color: #30b00e; color: #30b00f; +color: #30b100; color: #30b101; color: #30b102; color: #30b103; color: #30b104; color: #30b105; color: #30b106; color: #30b107; color: #30b108; color: #30b109; color: #30b10a; color: #30b10b; color: #30b10c; color: #30b10d; color: #30b10e; color: #30b10f; +color: #30b200; color: #30b201; color: #30b202; color: #30b203; color: #30b204; color: #30b205; color: #30b206; color: #30b207; color: #30b208; color: #30b209; color: #30b20a; color: #30b20b; color: #30b20c; color: #30b20d; color: #30b20e; color: #30b20f; +color: #30b300; color: #30b301; color: #30b302; color: #30b303; color: #30b304; color: #30b305; color: #30b306; color: #30b307; color: #30b308; color: #30b309; color: #30b30a; color: #30b30b; color: #30b30c; color: #30b30d; color: #30b30e; color: #30b30f; +color: #30b400; color: #30b401; color: #30b402; color: #30b403; color: #30b404; color: #30b405; color: #30b406; color: #30b407; color: #30b408; color: #30b409; color: #30b40a; color: #30b40b; color: #30b40c; color: #30b40d; color: #30b40e; color: #30b40f; +color: #30b500; color: #30b501; color: #30b502; color: #30b503; color: #30b504; color: #30b505; color: #30b506; color: #30b507; color: #30b508; color: #30b509; color: #30b50a; color: #30b50b; color: #30b50c; color: #30b50d; color: #30b50e; color: #30b50f; +color: #30b600; color: #30b601; color: #30b602; color: #30b603; color: #30b604; color: #30b605; color: #30b606; color: #30b607; color: #30b608; color: #30b609; color: #30b60a; color: #30b60b; color: #30b60c; color: #30b60d; color: #30b60e; color: #30b60f; +color: #30b700; color: #30b701; color: #30b702; color: #30b703; color: #30b704; color: #30b705; color: #30b706; color: #30b707; color: #30b708; color: #30b709; color: #30b70a; color: #30b70b; color: #30b70c; color: #30b70d; color: #30b70e; color: #30b70f; +color: #30b800; color: #30b801; color: #30b802; color: #30b803; color: #30b804; color: #30b805; color: #30b806; color: #30b807; color: #30b808; color: #30b809; color: #30b80a; color: #30b80b; color: #30b80c; color: #30b80d; color: #30b80e; color: #30b80f; +color: #30b900; color: #30b901; color: #30b902; color: #30b903; color: #30b904; color: #30b905; color: #30b906; color: #30b907; color: #30b908; color: #30b909; color: #30b90a; color: #30b90b; color: #30b90c; color: #30b90d; color: #30b90e; color: #30b90f; +color: #30ba00; color: #30ba01; color: #30ba02; color: #30ba03; color: #30ba04; color: #30ba05; color: #30ba06; color: #30ba07; color: #30ba08; color: #30ba09; color: #30ba0a; color: #30ba0b; color: #30ba0c; color: #30ba0d; color: #30ba0e; color: #30ba0f; +color: #30bb00; color: #30bb01; color: #30bb02; color: #30bb03; color: #30bb04; color: #30bb05; color: #30bb06; color: #30bb07; color: #30bb08; color: #30bb09; color: #30bb0a; color: #30bb0b; color: #30bb0c; color: #30bb0d; color: #30bb0e; color: #30bb0f; +color: #30bc00; color: #30bc01; color: #30bc02; color: #30bc03; color: #30bc04; color: #30bc05; color: #30bc06; color: #30bc07; color: #30bc08; color: #30bc09; color: #30bc0a; color: #30bc0b; color: #30bc0c; color: #30bc0d; color: #30bc0e; color: #30bc0f; +color: #30bd00; color: #30bd01; color: #30bd02; color: #30bd03; color: #30bd04; color: #30bd05; color: #30bd06; color: #30bd07; color: #30bd08; color: #30bd09; color: #30bd0a; color: #30bd0b; color: #30bd0c; color: #30bd0d; color: #30bd0e; color: #30bd0f; +color: #30be00; color: #30be01; color: #30be02; color: #30be03; color: #30be04; color: #30be05; color: #30be06; color: #30be07; color: #30be08; color: #30be09; color: #30be0a; color: #30be0b; color: #30be0c; color: #30be0d; color: #30be0e; color: #30be0f; +color: #30bf00; color: #30bf01; color: #30bf02; color: #30bf03; color: #30bf04; color: #30bf05; color: #30bf06; color: #30bf07; color: #30bf08; color: #30bf09; color: #30bf0a; color: #30bf0b; color: #30bf0c; color: #30bf0d; color: #30bf0e; color: #30bf0f; +color: #30c000; color: #30c001; color: #30c002; color: #30c003; color: #30c004; color: #30c005; color: #30c006; color: #30c007; color: #30c008; color: #30c009; color: #30c00a; color: #30c00b; color: #30c00c; color: #30c00d; color: #30c00e; color: #30c00f; +color: #30c100; color: #30c101; color: #30c102; color: #30c103; color: #30c104; color: #30c105; color: #30c106; color: #30c107; color: #30c108; color: #30c109; color: #30c10a; color: #30c10b; color: #30c10c; color: #30c10d; color: #30c10e; color: #30c10f; +color: #30c200; color: #30c201; color: #30c202; color: #30c203; color: #30c204; color: #30c205; color: #30c206; color: #30c207; color: #30c208; color: #30c209; color: #30c20a; color: #30c20b; color: #30c20c; color: #30c20d; color: #30c20e; color: #30c20f; +color: #30c300; color: #30c301; color: #30c302; color: #30c303; color: #30c304; color: #30c305; color: #30c306; color: #30c307; color: #30c308; color: #30c309; color: #30c30a; color: #30c30b; color: #30c30c; color: #30c30d; color: #30c30e; color: #30c30f; +color: #30c400; color: #30c401; color: #30c402; color: #30c403; color: #30c404; color: #30c405; color: #30c406; color: #30c407; color: #30c408; color: #30c409; color: #30c40a; color: #30c40b; color: #30c40c; color: #30c40d; color: #30c40e; color: #30c40f; +color: #30c500; color: #30c501; color: #30c502; color: #30c503; color: #30c504; color: #30c505; color: #30c506; color: #30c507; color: #30c508; color: #30c509; color: #30c50a; color: #30c50b; color: #30c50c; color: #30c50d; color: #30c50e; color: #30c50f; +color: #30c600; color: #30c601; color: #30c602; color: #30c603; color: #30c604; color: #30c605; color: #30c606; color: #30c607; color: #30c608; color: #30c609; color: #30c60a; color: #30c60b; color: #30c60c; color: #30c60d; color: #30c60e; color: #30c60f; +color: #30c700; color: #30c701; color: #30c702; color: #30c703; color: #30c704; color: #30c705; color: #30c706; color: #30c707; color: #30c708; color: #30c709; color: #30c70a; color: #30c70b; color: #30c70c; color: #30c70d; color: #30c70e; color: #30c70f; +color: #30c800; color: #30c801; color: #30c802; color: #30c803; color: #30c804; color: #30c805; color: #30c806; color: #30c807; color: #30c808; color: #30c809; color: #30c80a; color: #30c80b; color: #30c80c; color: #30c80d; color: #30c80e; color: #30c80f; +color: #30c900; color: #30c901; color: #30c902; color: #30c903; color: #30c904; color: #30c905; color: #30c906; color: #30c907; color: #30c908; color: #30c909; color: #30c90a; color: #30c90b; color: #30c90c; color: #30c90d; color: #30c90e; color: #30c90f; +color: #30ca00; color: #30ca01; color: #30ca02; color: #30ca03; color: #30ca04; color: #30ca05; color: #30ca06; color: #30ca07; color: #30ca08; color: #30ca09; color: #30ca0a; color: #30ca0b; color: #30ca0c; color: #30ca0d; color: #30ca0e; color: #30ca0f; +color: #30cb00; color: #30cb01; color: #30cb02; color: #30cb03; color: #30cb04; color: #30cb05; color: #30cb06; color: #30cb07; color: #30cb08; color: #30cb09; color: #30cb0a; color: #30cb0b; color: #30cb0c; color: #30cb0d; color: #30cb0e; color: #30cb0f; +color: #30cc00; color: #30cc01; color: #30cc02; color: #30cc03; color: #30cc04; color: #30cc05; color: #30cc06; color: #30cc07; color: #30cc08; color: #30cc09; color: #30cc0a; color: #30cc0b; color: #30cc0c; color: #30cc0d; color: #30cc0e; color: #30cc0f; +color: #30cd00; color: #30cd01; color: #30cd02; color: #30cd03; color: #30cd04; color: #30cd05; color: #30cd06; color: #30cd07; color: #30cd08; color: #30cd09; color: #30cd0a; color: #30cd0b; color: #30cd0c; color: #30cd0d; color: #30cd0e; color: #30cd0f; +color: #30ce00; color: #30ce01; color: #30ce02; color: #30ce03; color: #30ce04; color: #30ce05; color: #30ce06; color: #30ce07; color: #30ce08; color: #30ce09; color: #30ce0a; color: #30ce0b; color: #30ce0c; color: #30ce0d; color: #30ce0e; color: #30ce0f; +color: #30cf00; color: #30cf01; color: #30cf02; color: #30cf03; color: #30cf04; color: #30cf05; color: #30cf06; color: #30cf07; color: #30cf08; color: #30cf09; color: #30cf0a; color: #30cf0b; color: #30cf0c; color: #30cf0d; color: #30cf0e; color: #30cf0f; +color: #30d000; color: #30d001; color: #30d002; color: #30d003; color: #30d004; color: #30d005; color: #30d006; color: #30d007; color: #30d008; color: #30d009; color: #30d00a; color: #30d00b; color: #30d00c; color: #30d00d; color: #30d00e; color: #30d00f; +color: #30d100; color: #30d101; color: #30d102; color: #30d103; color: #30d104; color: #30d105; color: #30d106; color: #30d107; color: #30d108; color: #30d109; color: #30d10a; color: #30d10b; color: #30d10c; color: #30d10d; color: #30d10e; color: #30d10f; +color: #30d200; color: #30d201; color: #30d202; color: #30d203; color: #30d204; color: #30d205; color: #30d206; color: #30d207; color: #30d208; color: #30d209; color: #30d20a; color: #30d20b; color: #30d20c; color: #30d20d; color: #30d20e; color: #30d20f; +color: #30d300; color: #30d301; color: #30d302; color: #30d303; color: #30d304; color: #30d305; color: #30d306; color: #30d307; color: #30d308; color: #30d309; color: #30d30a; color: #30d30b; color: #30d30c; color: #30d30d; color: #30d30e; color: #30d30f; +color: #30d400; color: #30d401; color: #30d402; color: #30d403; color: #30d404; color: #30d405; color: #30d406; color: #30d407; color: #30d408; color: #30d409; color: #30d40a; color: #30d40b; color: #30d40c; color: #30d40d; color: #30d40e; color: #30d40f; +color: #30d500; color: #30d501; color: #30d502; color: #30d503; color: #30d504; color: #30d505; color: #30d506; color: #30d507; color: #30d508; color: #30d509; color: #30d50a; color: #30d50b; color: #30d50c; color: #30d50d; color: #30d50e; color: #30d50f; +color: #30d600; color: #30d601; color: #30d602; color: #30d603; color: #30d604; color: #30d605; color: #30d606; color: #30d607; color: #30d608; color: #30d609; color: #30d60a; color: #30d60b; color: #30d60c; color: #30d60d; color: #30d60e; color: #30d60f; +color: #30d700; color: #30d701; color: #30d702; color: #30d703; color: #30d704; color: #30d705; color: #30d706; color: #30d707; color: #30d708; color: #30d709; color: #30d70a; color: #30d70b; color: #30d70c; color: #30d70d; color: #30d70e; color: #30d70f; +color: #30d800; color: #30d801; color: #30d802; color: #30d803; color: #30d804; color: #30d805; color: #30d806; color: #30d807; color: #30d808; color: #30d809; color: #30d80a; color: #30d80b; color: #30d80c; color: #30d80d; color: #30d80e; color: #30d80f; +color: #30d900; color: #30d901; color: #30d902; color: #30d903; color: #30d904; color: #30d905; color: #30d906; color: #30d907; color: #30d908; color: #30d909; color: #30d90a; color: #30d90b; color: #30d90c; color: #30d90d; color: #30d90e; color: #30d90f; +color: #30da00; color: #30da01; color: #30da02; color: #30da03; color: #30da04; color: #30da05; color: #30da06; color: #30da07; color: #30da08; color: #30da09; color: #30da0a; color: #30da0b; color: #30da0c; color: #30da0d; color: #30da0e; color: #30da0f; +color: #30db00; color: #30db01; color: #30db02; color: #30db03; color: #30db04; color: #30db05; color: #30db06; color: #30db07; color: #30db08; color: #30db09; color: #30db0a; color: #30db0b; color: #30db0c; color: #30db0d; color: #30db0e; color: #30db0f; +color: #30dc00; color: #30dc01; color: #30dc02; color: #30dc03; color: #30dc04; color: #30dc05; color: #30dc06; color: #30dc07; color: #30dc08; color: #30dc09; color: #30dc0a; color: #30dc0b; color: #30dc0c; color: #30dc0d; color: #30dc0e; color: #30dc0f; +color: #30dd00; color: #30dd01; color: #30dd02; color: #30dd03; color: #30dd04; color: #30dd05; color: #30dd06; color: #30dd07; color: #30dd08; color: #30dd09; color: #30dd0a; color: #30dd0b; color: #30dd0c; color: #30dd0d; color: #30dd0e; color: #30dd0f; +color: #30de00; color: #30de01; color: #30de02; color: #30de03; color: #30de04; color: #30de05; color: #30de06; color: #30de07; color: #30de08; color: #30de09; color: #30de0a; color: #30de0b; color: #30de0c; color: #30de0d; color: #30de0e; color: #30de0f; +color: #30df00; color: #30df01; color: #30df02; color: #30df03; color: #30df04; color: #30df05; color: #30df06; color: #30df07; color: #30df08; color: #30df09; color: #30df0a; color: #30df0b; color: #30df0c; color: #30df0d; color: #30df0e; color: #30df0f; +color: #30e000; color: #30e001; color: #30e002; color: #30e003; color: #30e004; color: #30e005; color: #30e006; color: #30e007; color: #30e008; color: #30e009; color: #30e00a; color: #30e00b; color: #30e00c; color: #30e00d; color: #30e00e; color: #30e00f; +color: #30e100; color: #30e101; color: #30e102; color: #30e103; color: #30e104; color: #30e105; color: #30e106; color: #30e107; color: #30e108; color: #30e109; color: #30e10a; color: #30e10b; color: #30e10c; color: #30e10d; color: #30e10e; color: #30e10f; +color: #30e200; color: #30e201; color: #30e202; color: #30e203; color: #30e204; color: #30e205; color: #30e206; color: #30e207; color: #30e208; color: #30e209; color: #30e20a; color: #30e20b; color: #30e20c; color: #30e20d; color: #30e20e; color: #30e20f; +color: #30e300; color: #30e301; color: #30e302; color: #30e303; color: #30e304; color: #30e305; color: #30e306; color: #30e307; color: #30e308; color: #30e309; color: #30e30a; color: #30e30b; color: #30e30c; color: #30e30d; color: #30e30e; color: #30e30f; +color: #30e400; color: #30e401; color: #30e402; color: #30e403; color: #30e404; color: #30e405; color: #30e406; color: #30e407; color: #30e408; color: #30e409; color: #30e40a; color: #30e40b; color: #30e40c; color: #30e40d; color: #30e40e; color: #30e40f; +color: #30e500; color: #30e501; color: #30e502; color: #30e503; color: #30e504; color: #30e505; color: #30e506; color: #30e507; color: #30e508; color: #30e509; color: #30e50a; color: #30e50b; color: #30e50c; color: #30e50d; color: #30e50e; color: #30e50f; +color: #30e600; color: #30e601; color: #30e602; color: #30e603; color: #30e604; color: #30e605; color: #30e606; color: #30e607; color: #30e608; color: #30e609; color: #30e60a; color: #30e60b; color: #30e60c; color: #30e60d; color: #30e60e; color: #30e60f; +color: #30e700; color: #30e701; color: #30e702; color: #30e703; color: #30e704; color: #30e705; color: #30e706; color: #30e707; color: #30e708; color: #30e709; color: #30e70a; color: #30e70b; color: #30e70c; color: #30e70d; color: #30e70e; color: #30e70f; +color: #30e800; color: #30e801; color: #30e802; color: #30e803; color: #30e804; color: #30e805; color: #30e806; color: #30e807; color: #30e808; color: #30e809; color: #30e80a; color: #30e80b; color: #30e80c; color: #30e80d; color: #30e80e; color: #30e80f; +color: #30e900; color: #30e901; color: #30e902; color: #30e903; color: #30e904; color: #30e905; color: #30e906; color: #30e907; color: #30e908; color: #30e909; color: #30e90a; color: #30e90b; color: #30e90c; color: #30e90d; color: #30e90e; color: #30e90f; +color: #30ea00; color: #30ea01; color: #30ea02; color: #30ea03; color: #30ea04; color: #30ea05; color: #30ea06; color: #30ea07; color: #30ea08; color: #30ea09; color: #30ea0a; color: #30ea0b; color: #30ea0c; color: #30ea0d; color: #30ea0e; color: #30ea0f; +color: #30eb00; color: #30eb01; color: #30eb02; color: #30eb03; color: #30eb04; color: #30eb05; color: #30eb06; color: #30eb07; color: #30eb08; color: #30eb09; color: #30eb0a; color: #30eb0b; color: #30eb0c; color: #30eb0d; color: #30eb0e; color: #30eb0f; +color: #30ec00; color: #30ec01; color: #30ec02; color: #30ec03; color: #30ec04; color: #30ec05; color: #30ec06; color: #30ec07; color: #30ec08; color: #30ec09; color: #30ec0a; color: #30ec0b; color: #30ec0c; color: #30ec0d; color: #30ec0e; color: #30ec0f; +color: #30ed00; color: #30ed01; color: #30ed02; color: #30ed03; color: #30ed04; color: #30ed05; color: #30ed06; color: #30ed07; color: #30ed08; color: #30ed09; color: #30ed0a; color: #30ed0b; color: #30ed0c; color: #30ed0d; color: #30ed0e; color: #30ed0f; +color: #30ee00; color: #30ee01; color: #30ee02; color: #30ee03; color: #30ee04; color: #30ee05; color: #30ee06; color: #30ee07; color: #30ee08; color: #30ee09; color: #30ee0a; color: #30ee0b; color: #30ee0c; color: #30ee0d; color: #30ee0e; color: #30ee0f; +color: #30ef00; color: #30ef01; color: #30ef02; color: #30ef03; color: #30ef04; color: #30ef05; color: #30ef06; color: #30ef07; color: #30ef08; color: #30ef09; color: #30ef0a; color: #30ef0b; color: #30ef0c; color: #30ef0d; color: #30ef0e; color: #30ef0f; +color: #30f000; color: #30f001; color: #30f002; color: #30f003; color: #30f004; color: #30f005; color: #30f006; color: #30f007; color: #30f008; color: #30f009; color: #30f00a; color: #30f00b; color: #30f00c; color: #30f00d; color: #30f00e; color: #30f00f; +color: #30f100; color: #30f101; color: #30f102; color: #30f103; color: #30f104; color: #30f105; color: #30f106; color: #30f107; color: #30f108; color: #30f109; color: #30f10a; color: #30f10b; color: #30f10c; color: #30f10d; color: #30f10e; color: #30f10f; +color: #30f200; color: #30f201; color: #30f202; color: #30f203; color: #30f204; color: #30f205; color: #30f206; color: #30f207; color: #30f208; color: #30f209; color: #30f20a; color: #30f20b; color: #30f20c; color: #30f20d; color: #30f20e; color: #30f20f; +color: #30f300; color: #30f301; color: #30f302; color: #30f303; color: #30f304; color: #30f305; color: #30f306; color: #30f307; color: #30f308; color: #30f309; color: #30f30a; color: #30f30b; color: #30f30c; color: #30f30d; color: #30f30e; color: #30f30f; +color: #30f400; color: #30f401; color: #30f402; color: #30f403; color: #30f404; color: #30f405; color: #30f406; color: #30f407; color: #30f408; color: #30f409; color: #30f40a; color: #30f40b; color: #30f40c; color: #30f40d; color: #30f40e; color: #30f40f; +color: #30f500; color: #30f501; color: #30f502; color: #30f503; color: #30f504; color: #30f505; color: #30f506; color: #30f507; color: #30f508; color: #30f509; color: #30f50a; color: #30f50b; color: #30f50c; color: #30f50d; color: #30f50e; color: #30f50f; +color: #30f600; color: #30f601; color: #30f602; color: #30f603; color: #30f604; color: #30f605; color: #30f606; color: #30f607; color: #30f608; color: #30f609; color: #30f60a; color: #30f60b; color: #30f60c; color: #30f60d; color: #30f60e; color: #30f60f; +color: #30f700; color: #30f701; color: #30f702; color: #30f703; color: #30f704; color: #30f705; color: #30f706; color: #30f707; color: #30f708; color: #30f709; color: #30f70a; color: #30f70b; color: #30f70c; color: #30f70d; color: #30f70e; color: #30f70f; +color: #30f800; color: #30f801; color: #30f802; color: #30f803; color: #30f804; color: #30f805; color: #30f806; color: #30f807; color: #30f808; color: #30f809; color: #30f80a; color: #30f80b; color: #30f80c; color: #30f80d; color: #30f80e; color: #30f80f; +color: #30f900; color: #30f901; color: #30f902; color: #30f903; color: #30f904; color: #30f905; color: #30f906; color: #30f907; color: #30f908; color: #30f909; color: #30f90a; color: #30f90b; color: #30f90c; color: #30f90d; color: #30f90e; color: #30f90f; +color: #30fa00; color: #30fa01; color: #30fa02; color: #30fa03; color: #30fa04; color: #30fa05; color: #30fa06; color: #30fa07; color: #30fa08; color: #30fa09; color: #30fa0a; color: #30fa0b; color: #30fa0c; color: #30fa0d; color: #30fa0e; color: #30fa0f; +color: #30fb00; color: #30fb01; color: #30fb02; color: #30fb03; color: #30fb04; color: #30fb05; color: #30fb06; color: #30fb07; color: #30fb08; color: #30fb09; color: #30fb0a; color: #30fb0b; color: #30fb0c; color: #30fb0d; color: #30fb0e; color: #30fb0f; +color: #30fc00; color: #30fc01; color: #30fc02; color: #30fc03; color: #30fc04; color: #30fc05; color: #30fc06; color: #30fc07; color: #30fc08; color: #30fc09; color: #30fc0a; color: #30fc0b; color: #30fc0c; color: #30fc0d; color: #30fc0e; color: #30fc0f; +color: #30fd00; color: #30fd01; color: #30fd02; color: #30fd03; color: #30fd04; color: #30fd05; color: #30fd06; color: #30fd07; color: #30fd08; color: #30fd09; color: #30fd0a; color: #30fd0b; color: #30fd0c; color: #30fd0d; color: #30fd0e; color: #30fd0f; +color: #30fe00; color: #30fe01; color: #30fe02; color: #30fe03; color: #30fe04; color: #30fe05; color: #30fe06; color: #30fe07; color: #30fe08; color: #30fe09; color: #30fe0a; color: #30fe0b; color: #30fe0c; color: #30fe0d; color: #30fe0e; color: #30fe0f; +color: #30ff00; color: #30ff01; color: #30ff02; color: #30ff03; color: #30ff04; color: #30ff05; color: #30ff06; color: #30ff07; color: #30ff08; color: #30ff09; color: #30ff0a; color: #30ff0b; color: #30ff0c; color: #30ff0d; color: #30ff0e; color: #30ff0f; } From 75e20d653948e21b0536dc6b572ee888e5e1e632 Mon Sep 17 00:00:00 2001 From: Chris Hu Date: Mon, 22 Aug 2016 21:11:36 +0800 Subject: [PATCH 06/22] add eslint support --- my_configs.vim | 3 +++ 1 file changed, 3 insertions(+) diff --git a/my_configs.vim b/my_configs.vim index 57005278..adb6bd7c 100644 --- a/my_configs.vim +++ b/my_configs.vim @@ -45,3 +45,6 @@ let g:mwDefaultHighlightingNum = 10 " Vim-jsx let g:jsx_ext_required = 0 +" Eslint +let g:syntastic_javascript_checkers = ['eslint'] + From 7762fafeb7f68feabb30fcf3ab30101ba28d63d5 Mon Sep 17 00:00:00 2001 From: Chris Hu Date: Wed, 24 Aug 2016 08:56:12 +0800 Subject: [PATCH 07/22] add vim-json --- sources_non_forked/vim-json/.gitignore | 11 ++ sources_non_forked/vim-json/ftdetect/json.vim | 3 + sources_non_forked/vim-json/ftplugin/json.vim | 38 ++++ sources_non_forked/vim-json/indent/json.vim | 177 ++++++++++++++++++ sources_non_forked/vim-json/json-test.json | 107 +++++++++++ sources_non_forked/vim-json/jsonp-test.jsonp | 8 + sources_non_forked/vim-json/license.md | 11 ++ sources_non_forked/vim-json/readme.md | 61 ++++++ sources_non_forked/vim-json/syntax/json.vim | 137 ++++++++++++++ 9 files changed, 553 insertions(+) create mode 100644 sources_non_forked/vim-json/.gitignore create mode 100644 sources_non_forked/vim-json/ftdetect/json.vim create mode 100644 sources_non_forked/vim-json/ftplugin/json.vim create mode 100644 sources_non_forked/vim-json/indent/json.vim create mode 100644 sources_non_forked/vim-json/json-test.json create mode 100644 sources_non_forked/vim-json/jsonp-test.jsonp create mode 100644 sources_non_forked/vim-json/license.md create mode 100644 sources_non_forked/vim-json/readme.md create mode 100644 sources_non_forked/vim-json/syntax/json.vim diff --git a/sources_non_forked/vim-json/.gitignore b/sources_non_forked/vim-json/.gitignore new file mode 100644 index 00000000..2bb5c496 --- /dev/null +++ b/sources_non_forked/vim-json/.gitignore @@ -0,0 +1,11 @@ +/index.php + +# Ignore vim files +*~ +*.swp +*.swo +*.fuse_hidden* +*.pxm +*.DS_Store +/video/* +/screenshots/* diff --git a/sources_non_forked/vim-json/ftdetect/json.vim b/sources_non_forked/vim-json/ftdetect/json.vim new file mode 100644 index 00000000..b4a5cd76 --- /dev/null +++ b/sources_non_forked/vim-json/ftdetect/json.vim @@ -0,0 +1,3 @@ +autocmd BufNewFile,BufRead *.json setlocal filetype=json +autocmd BufNewFile,BufRead *.jsonp setlocal filetype=json +autocmd BufNewFile,BufRead *.geojson setlocal filetype=json diff --git a/sources_non_forked/vim-json/ftplugin/json.vim b/sources_non_forked/vim-json/ftplugin/json.vim new file mode 100644 index 00000000..98601275 --- /dev/null +++ b/sources_non_forked/vim-json/ftplugin/json.vim @@ -0,0 +1,38 @@ +" Vim syntax file +" Language: JSON +" Maintainer: Eli Parra https://github.com/elzr/vim-json +" Last Change: 2014-05-20 added warning toggle + +"uncomment to enable folding of `{...}` and `[...]` blocks +"setlocal foldmethod=syntax + +"conceal by default +if !exists("g:vim_json_syntax_conceal") + let g:vim_json_syntax_conceal = 1 +end + +"have warnings by default +if !exists("g:vim_json_warnings") + let g:vim_json_warnings = 1 +end + +"set concealcursor blank by default +"this should turn off the concealing in the current line (where the cursor is at), +"on all modes (normal, visual, insert) +if !exists("g:vim_json_syntax_concealcursor") + let g:vim_json_syntax_concealcursor = "" +end + +if has('conceal') + if (g:vim_json_syntax_conceal == 1) + "level 2 means concealed text gets completely hidden unless a + "replacement is defined (none is defined by us) + setlocal conceallevel=2 + let &l:concealcursor = g:vim_json_syntax_concealcursor + else + "level 0 means text is shown normally = no concealing + setlocal conceallevel=0 + endif + "maybe g:vim_json_syntax_conceal could be settable to 0,1,2 to map + "directly to vim's conceallevels? unsure if anyone cares +endif diff --git a/sources_non_forked/vim-json/indent/json.vim b/sources_non_forked/vim-json/indent/json.vim new file mode 100644 index 00000000..7873d65a --- /dev/null +++ b/sources_non_forked/vim-json/indent/json.vim @@ -0,0 +1,177 @@ +" Vim indent file +" Language: JSON +" Mantainer: Eli Parra https://github.com/elzr/vim-json +" Last Change: 2014-05-13: merged Fix for square bracket matching by Jakar +" https://github.com/jakar/vim-json/commit/20b650e22aa750c4ab6a66aa646bdd95d7cd548a#diff-e81fc111b2052e306d126bd9989f7b7c +" Original Author: Rogerz Zhang http://github.com/rogerz/vim-json +" Acknowledgement: Based off of vim-javascript maintained by Darrick Wiebe +" http://www.vim.org/scripts/script.php?script_id=2765 + +" 0. Initialization {{{1 +" ================= + +" Only load this indent file when no other was loaded. +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +setlocal nosmartindent + +" Now, set up our indentation expression and keys that trigger it. +setlocal indentexpr=GetJSONIndent() +setlocal indentkeys=0{,0},0),0[,0],!^F,o,O,e + +" Only define the function once. +if exists("*GetJSONIndent") + finish +endif + +let s:cpo_save = &cpo +set cpo&vim + +" 1. Variables {{{1 +" ============ + +let s:line_term = '\s*\%(\%(\/\/\).*\)\=$' +" Regex that defines blocks. +let s:block_regex = '\%({\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)\=' . s:line_term + +" 2. Auxiliary Functions {{{1 +" ====================== + +" Check if the character at lnum:col is inside a string. +function s:IsInString(lnum, col) + return synIDattr(synID(a:lnum, a:col, 1), 'name') == "jsonString" +endfunction + +" Find line above 'lnum' that isn't empty, or in a string. +function s:PrevNonBlankNonString(lnum) + let lnum = prevnonblank(a:lnum) + while lnum > 0 + " If the line isn't empty or in a string, end search. + let line = getline(lnum) + if !(s:IsInString(lnum, 1) && s:IsInString(lnum, strlen(line))) + break + endif + let lnum = prevnonblank(lnum - 1) + endwhile + return lnum +endfunction + +" Check if line 'lnum' has more opening brackets than closing ones. +function s:LineHasOpeningBrackets(lnum) + let open_0 = 0 + let open_2 = 0 + let open_4 = 0 + let line = getline(a:lnum) + let pos = match(line, '[][(){}]', 0) + while pos != -1 + let idx = stridx('(){}[]', line[pos]) + if idx % 2 == 0 + let open_{idx} = open_{idx} + 1 + else + let open_{idx - 1} = open_{idx - 1} - 1 + endif + let pos = match(line, '[][(){}]', pos + 1) + endwhile + return (open_0 > 0) . (open_2 > 0) . (open_4 > 0) +endfunction + +function s:Match(lnum, regex) + let col = match(getline(a:lnum), a:regex) + 1 + return col > 0 && !s:IsInString(a:lnum, col) ? col : 0 +endfunction + +" 3. GetJSONIndent Function {{{1 +" ========================= + +function GetJSONIndent() + " 3.1. Setup {{{2 + " ---------- + + " Set up variables for restoring position in file. Could use v:lnum here. + let vcol = col('.') + + " 3.2. Work on the current line {{{2 + " ----------------------------- + + " Get the current line. + let line = getline(v:lnum) + let ind = -1 + + " If we got a closing bracket on an empty line, find its match and indent + " according to it. + let col = matchend(line, '^\s*[]}]') + + if col > 0 && !s:IsInString(v:lnum, col) + call cursor(v:lnum, col) + let bs = strpart('{}[]', stridx('}]', line[col - 1]) * 2, 2) + + let pairstart = escape(bs[0], '[') + let pairend = escape(bs[1], ']') + let pairline = searchpair(pairstart, '', pairend, 'bW') + + if pairline > 0 + let ind = indent(pairline) + else + let ind = virtcol('.') - 1 + endif + + return ind + endif + + " If we are in a multi-line string, don't do anything to it. + if s:IsInString(v:lnum, matchend(line, '^\s*') + 1) + return indent('.') + endif + + " 3.3. Work on the previous line. {{{2 + " ------------------------------- + + let lnum = prevnonblank(v:lnum - 1) + + if lnum == 0 + return 0 + endif + + " Set up variables for current line. + let line = getline(lnum) + let ind = indent(lnum) + + " If the previous line ended with a block opening, add a level of indent. + " if s:Match(lnum, s:block_regex) + " if exists('*shiftwidth') + " return indent(lnum) + shiftwidth() + " else + " return indent(lnum) + &sw + " endif + " endif + + " If the previous line contained an opening bracket, and we are still in it, + " add indent depending on the bracket type. + if line =~ '[[({]' + let counts = s:LineHasOpeningBrackets(lnum) + if counts[0] == '1' || counts[1] == '1' || counts[2] == '1' + if exists('*shiftwidth') + return ind + shiftwidth() + else + return ind + &sw + endif + else + call cursor(v:lnum, vcol) + end + endif + + " }}}2 + + return ind +endfunction + +" }}}1 + +let &cpo = s:cpo_save +unlet s:cpo_save + +" vim:set sw=2 sts=2 ts=8 noet: + diff --git a/sources_non_forked/vim-json/json-test.json b/sources_non_forked/vim-json/json-test.json new file mode 100644 index 00000000..fe6957a9 --- /dev/null +++ b/sources_non_forked/vim-json/json-test.json @@ -0,0 +1,107 @@ +// this comment should be highlighted as an error + +{ + unquotedKeyword:'singleQuotedString', + 'singleQuotedKeyword':true, + "decimalCantStartWithPeriod":.1, + "semicolonAtEndOfThisObject":"trailingComma", +}; + + +//even with concealment, strings and numbers & booleans are distinct +{ + "string": "this is a string, with a escaped \" inside", + "string": "500", + "NOT a string": 500, + "string": "true", + "NOT a string": true +} + + +// normative JSON examples from http://json.org/example.html +{"menu": { + "id": "file", + "value": "File", + "popup": { + "menuitem": [ + {"value": "New", "onclick": "CreateNewDoc()"}, + {"value": "Open", "onclick": "OpenDoc()"}, + {"value": "Close", "onclick": "CloseDoc()"} + ] + } +}} + +{ + "glossary": { + "title": "example glossary", + "GlossDiv": { + "title": "S", + "GlossList": { + "GlossEntry": { + "ID": "SGML", + "SortAs": "SGML", + "GlossTerm": "Standard Generalized Markup Language", + "Acronym": "SGML", + "Abbrev": "ISO 8879:1986", + "GlossDef": { + "para": "A meta-markup language, used to create markup languages such as DocBook.", + "GlossSeeAlso": ["GML", "XML"] + }, + "GlossSee": "markup" + } + } + } + } +} + + +{"widget": { + "debug": "on", + "window": { + "title": "Sample Konfabulator Widget", + "name": "main_window", + "width": 500, + "height": 500 + }, + "image": { + "src": "Images/Sun.png", + "name": "sun1", + "hOffset": 250, + "vOffset": 250, + "alignment": "center" + }, + "text": { + "data": "Click Here", + "size": 36, + "style": "bold", + "name": "text1", + "hOffset": 250, + "vOffset": 100, + "alignment": "center", + "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;" + } +}} + +//missing comma errors +{ + "object1": "missingComma" + "object2": "value" +} +[ + { "object1": 1 } + { "object2": 2 } +] +{ + "object1": [] + "object2": [] +} +{ + "object1": {} + "object2": [] +} +{ + "object1": true + "object2": 2 +} + +//this file is deliberately mis-indented, try gg=G to indent it properly diff --git a/sources_non_forked/vim-json/jsonp-test.jsonp b/sources_non_forked/vim-json/jsonp-test.jsonp new file mode 100644 index 00000000..00eb3070 --- /dev/null +++ b/sources_non_forked/vim-json/jsonp-test.jsonp @@ -0,0 +1,8 @@ + +whañteverJavascriptName ( { + "success":true, + "url":"http://google.com", + "shortUrl":"http://b1t.co/54" +}); + + diff --git a/sources_non_forked/vim-json/license.md b/sources_non_forked/vim-json/license.md new file mode 100644 index 00000000..a1836c5b --- /dev/null +++ b/sources_non_forked/vim-json/license.md @@ -0,0 +1,11 @@ +MIT License +=========== + +Copyright (c) 2013, Jeroen Ruigrok van der Werven, Eli Parra + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +"THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +See https://twitter.com/elzr/status/294964017926119424 and https://twitter.com/ashemedai/status/295062705193246720 for public acknowledgement of the MIT license as prompted by this issue https://github.com/elzr/vim-json/issues/6 diff --git a/sources_non_forked/vim-json/readme.md b/sources_non_forked/vim-json/readme.md new file mode 100644 index 00000000..df48a439 --- /dev/null +++ b/sources_non_forked/vim-json/readme.md @@ -0,0 +1,61 @@ + + +Better JSON for VIM +=================== + +*Distinct highlighting of keywords vs values, JSON-specific (non-JS) warnings, quote concealing.* +![JSON syntax coloring](https://cloud.githubusercontent.com/assets/183877/7018898/98e428e0-dccf-11e4-9ab8-c554b3556155.jpg) +Customization of Jeroen Ruigrok van der Werven's [vim-json highlighting script](http://www.vim.org/scripts/script.php?script_id=1945) with Rogerz Zhang's [indent script](https://github.com/vim-scripts/vim-json-bundle). +[Pathogen-friendly.](https://github.com/tpope/vim-pathogen) [Vundle-friendly too.](https://github.com/elzr/vim-json/issues/25) ([Or install it manually.](https://github.com/elzr/vim-json/issues/52)) + +Specific customizations +----------------------- + +* Added distinct **highlighting** for keywords vs values! (This is what made me start this plugin.) +* Added **concealing** of double quotes, for a minimalist [CoffeeScript](http://coffeescript.org/)-inspired look ([CSON](https://github.com/bevry/cson)!). + * ![image](https://cloud.githubusercontent.com/assets/183877/6786803/18143984-d154-11e4-841c-134241f951ae.png)
[Strings are colored differently than numbers & booleans.](https://github.com/elzr/vim-json/issues/37) The disambiguating purpose of double quotes is thus achieved with colors for a cleaner look. + * *This requires Vim 7.3+.* To disable it add `let g:vim_json_syntax_conceal = 0` to your `.vimrc`. +* Added **folding** of `{...}` and `[...]` blocks. To enable it `:setlocal foldmethod=syntax` (do it permanently on the `ftplugin/json.vim` file). +* **JSON-specific warnings** (red highlights): + * Warn about *no-quotes* in keywords and *single-quotes* in keywords and values. + * Warn about *decimals* smaller than 1 that don't start with a 0 (`.1` gives a warning, it should be `0.1`). + * Warn about *comments* `//` and *trailing semicolons* `;`. + * Warn about *[missing commas](https://github.com/elzr/vim-json/issues/18)* between elements of an object [and elsewhere](https://github.com/elzr/vim-json/issues/34). + * Warn about *trailing commas* after the last element in arrays or objects. + * (All warnings can be turned off with a `let g:vim_json_warnings=0` in your `vimrc`.) +* Recognize `.jsonp` file type. In [JSONP](http://stackoverflow.com/questions/2067472/what-is-jsonp-all-about), the wrapping function call at the beginning and the closing semicolon are recognized. + +Screenshots +----------- + +**No syntax coloring**: wall of text.
![No syntax coloring](https://cloud.githubusercontent.com/assets/183877/7018892/8c9965a0-dccf-11e4-9790-0e815605e3a9.jpg) + +**Javascript (or for that matter, the standard json.vim) syntax coloring**: Barely an improvement from no syntax coloring.
![Javascript syntax coloring](https://cloud.githubusercontent.com/assets/183877/7018893/906e67c0-dccf-11e4-89b1-11c3cfe9e2ef.jpg) + +**Better JSON syntax coloring**: a more meaningful, distinct and elegant presentation.
![JSON syntax coloring](https://cloud.githubusercontent.com/assets/183877/7018894/95fd2c1c-dccf-11e4-8cbc-0f6588f9d060.jpg) + +Why use separate JSON highlighting instead of just Javascript? +-------------------------------------------------------------- + +Here's 2 compelling reasons: + +1. **All JSON is Javascript but NOT all Javascript is JSON.** So `{property:1}` is invalid because `property` does not have double quotes around it. `{'property':1}` is also invalid, because it's single quoted while the only thing that can placate the JSON specification is double quoting. JSON is even fussy enough that `{"property":.1}` is invalid too, because you should have of course written `{"property":0.1}`. Also, don't even think about [having comments](http://stackoverflow.com/questions/244777/can-i-comment-a-json-file) or semicolons, you guessed it: they're invalid. The point being that your syntax highlighter should warn you about these errors, in realtime, which is something that the Javascript highlighter doesn't (because in Javacript they're not errors!). + +2. **Distinct highlighting for keywords.** JSON is an extremely lightweight data format but at its core lies an inescapable conceptual distinction: there are keywords and there are values. There's nothing much to the format besides that, so we might as well display keywords and values differently. This is something that gets lost with Javascript-inspired syntax highlighters, which see keywords as just another string since JSON requires them double quoted. So JSON files remain an impenetrable, indistinct wall of text. + +Common problems +--------------- + +This is the expected behavior of the plugin: +![showcase](http://i.imgur.com/cmL1GNc.gif) + +Most trouble, little as it is, has to do with Vim's newfangled concealing, which most people aren't yet familiar with, as it was introduced as recently as Vim 7.3+. If you just don't care for concealing you can easily disable it adding `let g:vim_json_syntax_conceal = 0` to your `.vimrc`. + +Concealing is nice for viewing but when you want to edit it should get out of your way seamlessly so you can see the actual code. Thus the **default behavior** *should* be text shown normally on the line your cursor is at, on all modes (normal, visual, insert). If this isn't the case and the concealing doesn't go away (not even in insert mode), you most likely have **an interfering plugin**. You need to look at your `concealcursor` setting (which can be set through this plugin with `g:vim_json_syntax_concealcursor`). The specially overeager [**indentLine**](https://github.com/Yggdroot/indentLine), plugin would require _yet_ an additional `let g:indentLine_noConcealCursor=""` in your `.vimrc` as detailed [here](https://github.com/elzr/vim-json/issues/23#issuecomment-40293049). + +It's a good idea to test drive with the files `json-test.json` and `jsonp-test.jsonp` first thing. + +Other recommended software +-------------------------- +* [JSON Formatter](https://chrome.google.com/webstore/detail/json-formatter/bcjindcccaagfpapjjmafapmmgkkhgoa): Chrome extension for printing JSON and JSONP nicely when you visit it 'directly' in a browser tab. +* [Convert JSON to YAML](http://www.json2yaml.com/): side by side, real-time conversion of the "fat and rigid" JSON to the "skinny and flexible" YAML. diff --git a/sources_non_forked/vim-json/syntax/json.vim b/sources_non_forked/vim-json/syntax/json.vim new file mode 100644 index 00000000..3423ebae --- /dev/null +++ b/sources_non_forked/vim-json/syntax/json.vim @@ -0,0 +1,137 @@ +" Vim syntax file +" Language: JSON +" Maintainer: Eli Parra https://github.com/elzr/vim-json +" Last Change: 2014-12-20 Load ftplugin/json.vim + +" Reload the definition of g:vim_json_syntax_conceal +" see https://github.com/elzr/vim-json/issues/42 +runtime! ftplugin/json.vim + +if !exists("main_syntax") + if version < 600 + syntax clear + elseif exists("b:current_syntax") + finish + endif + let main_syntax = 'json' +endif + +syntax match jsonNoise /\%(:\|,\)/ + +" NOTE that for the concealing to work your conceallevel should be set to 2 + +" Syntax: Strings +" Separated into a match and region because a region by itself is always greedy +syn match jsonStringMatch /"\([^"]\|\\\"\)\+"\ze[[:blank:]\r\n]*[,}\]]/ contains=jsonString +if has('conceal') && g:vim_json_syntax_conceal == 1 + syn region jsonString oneline matchgroup=jsonQuote start=/"/ skip=/\\\\\|\\"/ end=/"/ concealends contains=jsonEscape contained +else + syn region jsonString oneline matchgroup=jsonQuote start=/"/ skip=/\\\\\|\\"/ end=/"/ contains=jsonEscape contained +endif + +" Syntax: JSON does not allow strings with single quotes, unlike JavaScript. +syn region jsonStringSQError oneline start=+'+ skip=+\\\\\|\\"+ end=+'+ + +" Syntax: JSON Keywords +" Separated into a match and region because a region by itself is always greedy +syn match jsonKeywordMatch /"\([^"]\|\\\"\)\+"[[:blank:]\r\n]*\:/ contains=jsonKeyword +if has('conceal') && g:vim_json_syntax_conceal == 1 + syn region jsonKeyword matchgroup=jsonQuote start=/"/ end=/"\ze[[:blank:]\r\n]*\:/ concealends contains=jsonEscape contained +else + syn region jsonKeyword matchgroup=jsonQuote start=/"/ end=/"\ze[[:blank:]\r\n]*\:/ contains=jsonEscape contained +endif + +" Syntax: Escape sequences +syn match jsonEscape "\\["\\/bfnrt]" contained +syn match jsonEscape "\\u\x\{4}" contained + +" Syntax: Numbers +syn match jsonNumber "-\=\<\%(0\|[1-9]\d*\)\%(\.\d\+\)\=\%([eE][-+]\=\d\+\)\=\>\ze[[:blank:]\r\n]*[,}\]]" + +" ERROR WARNINGS ********************************************** +if (!exists("g:vim_json_warnings") || g:vim_json_warnings==1) + " Syntax: Strings should always be enclosed with quotes. + syn match jsonNoQuotesError "\<[[:alpha:]][[:alnum:]]*\>" + syn match jsonTripleQuotesError /"""/ + + " Syntax: An integer part of 0 followed by other digits is not allowed. + syn match jsonNumError "-\=\<0\d\.\d*\>" + + " Syntax: Decimals smaller than one should begin with 0 (so .1 should be 0.1). + syn match jsonNumError "\:\@<=[[:blank:]\r\n]*\zs\.\d\+" + + " Syntax: No comments in JSON, see http://stackoverflow.com/questions/244777/can-i-comment-a-json-file + syn match jsonCommentError "//.*" + syn match jsonCommentError "\(/\*\)\|\(\*/\)" + + " Syntax: No semicolons in JSON + syn match jsonSemicolonError ";" + + " Syntax: No trailing comma after the last element of arrays or objects + syn match jsonTrailingCommaError ",\_s*[}\]]" + + " Syntax: Watch out for missing commas between elements + syn match jsonMissingCommaError /\("\|\]\|\d\)\zs\_s\+\ze"/ + syn match jsonMissingCommaError /\(\]\|\}\)\_s\+\ze"/ "arrays/objects as values + syn match jsonMissingCommaError /}\_s\+\ze{/ "objects as elements in an array + syn match jsonMissingCommaError /\(true\|false\)\_s\+\ze"/ "true/false as value +endif + +" ********************************************** END OF ERROR WARNINGS +" Allowances for JSONP: function call at the beginning of the file, +" parenthesis and semicolon at the end. +" Function name validation based on +" http://stackoverflow.com/questions/2008279/validate-a-javascript-function-name/2008444#2008444 +syn match jsonPadding "\%^[[:blank:]\r\n]*[_$[:alpha:]][_$[:alnum:]]*[[:blank:]\r\n]*(" +syn match jsonPadding ");[[:blank:]\r\n]*\%$" + +" Syntax: Boolean +syn match jsonBoolean /\(true\|false\)\(\_s\+\ze"\)\@!/ + +" Syntax: Null +syn keyword jsonNull null + +" Syntax: Braces +syn region jsonFold matchgroup=jsonBraces start="{" end=/}\(\_s\+\ze\("\|{\)\)\@!/ transparent fold +syn region jsonFold matchgroup=jsonBraces start="\[" end=/]\(\_s\+\ze"\)\@!/ transparent fold + +" Define the default highlighting. +if version >= 508 || !exists("did_json_syn_inits") + hi def link jsonPadding Operator + hi def link jsonString String + hi def link jsonTest Label + hi def link jsonEscape Special + hi def link jsonNumber Delimiter + hi def link jsonBraces Delimiter + hi def link jsonNull Function + hi def link jsonBoolean Delimiter + hi def link jsonKeyword Label + + if (!exists("g:vim_json_warnings") || g:vim_json_warnings==1) + hi def link jsonNumError Error + hi def link jsonCommentError Error + hi def link jsonSemicolonError Error + hi def link jsonTrailingCommaError Error + hi def link jsonMissingCommaError Error + hi def link jsonStringSQError Error + hi def link jsonNoQuotesError Error + hi def link jsonTripleQuotesError Error + endif + hi def link jsonQuote Quote + hi def link jsonNoise Noise +endif + +let b:current_syntax = "json" +if main_syntax == 'json' + unlet main_syntax +endif + +" Vim settings +" vim: ts=8 fdm=marker + +" MIT License +" Copyright (c) 2013, Jeroen Ruigrok van der Werven, Eli Parra +"Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +"The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +"THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +"See https://twitter.com/elzr/status/294964017926119424 From 54f1c0f3d03f558d2fb500220d3781cce00978f2 Mon Sep 17 00:00:00 2001 From: huhuaishun Date: Wed, 5 Oct 2016 20:17:49 +0800 Subject: [PATCH 08/22] add vim-minimap --- my_configs.vim | 5 +- sources_non_forked/vim-minimap/.gitignore | 1 + sources_non_forked/vim-minimap/LICENSE | 21 + sources_non_forked/vim-minimap/README.md | 83 ++++ .../vim-minimap/autoload/drawille/README.md | 131 ++++++ .../drawille/docs/images/drawille_01.png | Bin 0 -> 5993 bytes .../drawille/docs/images/rotating_cube.gif | Bin 0 -> 52051 bytes .../drawille/docs/images/sine_tracking.gif | Bin 0 -> 47007 bytes .../autoload/drawille/docs/images/turtle.png | Bin 0 -> 9086 bytes .../autoload/drawille/docs/images/usage.png | Bin 0 -> 1094 bytes .../autoload/drawille/docs/images/xkcd.png | Bin 0 -> 4130 bytes .../vim-minimap/autoload/drawille/drawille.py | 417 ++++++++++++++++++ .../autoload/drawille/examples/basic.py | 39 ++ .../drawille/examples/flappy_birds.py | 207 +++++++++ .../autoload/drawille/examples/image2term.py | 121 +++++ .../drawille/examples/rotating_cube.py | 108 +++++ .../drawille/examples/sine_tracking.py | 28 ++ .../autoload/drawille/examples/speed_test.py | 24 + .../autoload/drawille/examples/turtle.py | 11 + .../autoload/drawille/examples/xkcd.py | 79 ++++ .../vim-minimap/autoload/drawille/setup.py | 34 ++ .../vim-minimap/autoload/drawille/tests.py | 130 ++++++ .../vim-minimap/autoload/minimap.py | 214 +++++++++ .../vim-minimap/autoload/minimap.vim | 62 +++ sources_non_forked/vim-minimap/minimap.png | Bin 0 -> 105954 bytes .../vim-minimap/plugin/minimap.vim | 28 ++ 26 files changed, 1742 insertions(+), 1 deletion(-) create mode 100644 sources_non_forked/vim-minimap/.gitignore create mode 100644 sources_non_forked/vim-minimap/LICENSE create mode 100644 sources_non_forked/vim-minimap/README.md create mode 100644 sources_non_forked/vim-minimap/autoload/drawille/README.md create mode 100644 sources_non_forked/vim-minimap/autoload/drawille/docs/images/drawille_01.png create mode 100644 sources_non_forked/vim-minimap/autoload/drawille/docs/images/rotating_cube.gif create mode 100644 sources_non_forked/vim-minimap/autoload/drawille/docs/images/sine_tracking.gif create mode 100644 sources_non_forked/vim-minimap/autoload/drawille/docs/images/turtle.png create mode 100644 sources_non_forked/vim-minimap/autoload/drawille/docs/images/usage.png create mode 100644 sources_non_forked/vim-minimap/autoload/drawille/docs/images/xkcd.png create mode 100644 sources_non_forked/vim-minimap/autoload/drawille/drawille.py create mode 100644 sources_non_forked/vim-minimap/autoload/drawille/examples/basic.py create mode 100644 sources_non_forked/vim-minimap/autoload/drawille/examples/flappy_birds.py create mode 100644 sources_non_forked/vim-minimap/autoload/drawille/examples/image2term.py create mode 100644 sources_non_forked/vim-minimap/autoload/drawille/examples/rotating_cube.py create mode 100644 sources_non_forked/vim-minimap/autoload/drawille/examples/sine_tracking.py create mode 100644 sources_non_forked/vim-minimap/autoload/drawille/examples/speed_test.py create mode 100644 sources_non_forked/vim-minimap/autoload/drawille/examples/turtle.py create mode 100644 sources_non_forked/vim-minimap/autoload/drawille/examples/xkcd.py create mode 100644 sources_non_forked/vim-minimap/autoload/drawille/setup.py create mode 100644 sources_non_forked/vim-minimap/autoload/drawille/tests.py create mode 100644 sources_non_forked/vim-minimap/autoload/minimap.py create mode 100644 sources_non_forked/vim-minimap/autoload/minimap.vim create mode 100644 sources_non_forked/vim-minimap/minimap.png create mode 100644 sources_non_forked/vim-minimap/plugin/minimap.vim diff --git a/my_configs.vim b/my_configs.vim index adb6bd7c..421011e5 100644 --- a/my_configs.vim +++ b/my_configs.vim @@ -1,5 +1,5 @@ if has("mac") || has("macunix") - set gfn=Hack:h24,Source\ Code\ Pro:h24,Menlo:h24 + set gfn=Hack:h16,Source\ Code\ Pro:h16,Menlo:h16 elseif has("win16") || has("win32") set gfn=Hack:h18,Source\ Code\ Pro:h16,Bitstream\ Vera\ Sans\ Mono:h15 elseif has("gui_gtk2") @@ -37,6 +37,9 @@ set softtabstop=2 set cmdheight=1 set number +" yank to the system register (*) by default +set clipboard=unnamed + " Mark, highlight multiple words source ~/.vim_runtime/sources_non_forked/Mark/plugin/mark.vim let g:mwDefaultHighlightingPalette = 'maximum' diff --git a/sources_non_forked/vim-minimap/.gitignore b/sources_non_forked/vim-minimap/.gitignore new file mode 100644 index 00000000..0d20b648 --- /dev/null +++ b/sources_non_forked/vim-minimap/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/sources_non_forked/vim-minimap/LICENSE b/sources_non_forked/vim-minimap/LICENSE new file mode 100644 index 00000000..304f74da --- /dev/null +++ b/sources_non_forked/vim-minimap/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2016 Séverin Lemaignan and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sources_non_forked/vim-minimap/README.md b/sources_non_forked/vim-minimap/README.md new file mode 100644 index 00000000..81ec255c --- /dev/null +++ b/sources_non_forked/vim-minimap/README.md @@ -0,0 +1,83 @@ +A code minimap for Vim +====================== + +The Sublime text-editor can display an useful overview of the code as a +*minimap* sidebar. + +We can implement the same thing in Vim, relying on the [Drawille +library](https://github.com/asciimoo/drawille) to 'draw' in text mode. + +![minimap in action](http://picdrop.t3lab.com/qqpdtsbTow.gif) + +This code is made available under a MIT license. See [LICENSE](LICENSE) for +details. + +Features +-------- + +- displays the minimap of the currently active buffer (and updates when + switching to a different buffer) +- synchronized scrolling +- live update while typing + +Installation +------------ + +Note that this extension requires Vim with Python support. + +### Vundle + +With [vundle](https://github.com/gmarik/Vundle.vim), simply add: `Plugin +'severin-lemaignan/vim-minimap'` to your `.vimrc` and run `:PluginInstall` from +vim. + +### Janus + +With Janus just clone inside ```.janus```. + +``` +cd ~/.janus +git clone https://github.com/severin-lemaignan/vim-minimap.git vim-minimap +``` + +Usage +----- + +`:Minimap` to show the minimap, `:MinimapClose` to hide it. + +Default mappings: `mm` to display the minimap, `mc` to close it. + +To overwrite the default keybindings, using following settings in ``.vimrc'': + +``` +let g:minimap_show='ms' +let g:minimap_update='mu' +let g:minimap_close='gc' +let g:minimap_toggle='gt' +``` + +Settings +-------- + +You can customize the color of the highlighting by setting `g:minimap_highlight` in your vimrc: + +`let g:minimap_highlight='Visual'` + +Note: To find out which highlights are available on your vim installation use :hi to get the list. + +Troubleshooting +--------------- + +- Weird display + +Certain fonts do not display plain dots and empty spaces, but +plain dots and circles for braille characters. As a result, you may want to use +any other font that display braille characters in a way that suit the minimap +plugin, like `Ubuntu Mono`, or `Droid Sans Mono`. + +For example, with `Inconsolata`: +![image](https://cloud.githubusercontent.com/assets/7250745/8083430/c48e5c44-0f84-11e5-9cba-20d7e2eac0c5.png) + +With `Ubuntu Mono` +![image](https://cloud.githubusercontent.com/assets/7250745/8083436/d4aaf9d4-0f84-11e5-9383-cb02bba384bc.png) + diff --git a/sources_non_forked/vim-minimap/autoload/drawille/README.md b/sources_non_forked/vim-minimap/autoload/drawille/README.md new file mode 100644 index 00000000..ac4253e2 --- /dev/null +++ b/sources_non_forked/vim-minimap/autoload/drawille/README.md @@ -0,0 +1,131 @@ +DRAWILLE +======== + + +Drawing in terminal with Unicode [Braille][] characters + +[Braille]: http://en.wikipedia.org/wiki/Braille + +[![Flattr this git repo](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=asciimoo&url=https://github.com/asciimoo/drawille&title=drawille&language=&tags=github&category=software) + +![Drawille](docs/images/drawille_01.png) + +![Drawille](docs/images/xkcd.png) + +![Drawille](docs/images/sine_tracking.gif) + +![Drawille](docs/images/rotating_cube.gif) + + +### USAGE + +```python +from __future__ import print_function +from drawille import Canvas +from math import sin, radians + +c = Canvas() + +for x in range(0, 1800, 10): + c.set(x / 10, 10 + sin(radians(x)) * 10) + +print(c.frame()) +``` + +![Usage](docs/images/usage.png) + +```python +from drawille import Turtle + +t = Turtle() + +for _ in range(36): + t.right(10) + for _ in range(36): + t.right(10) + t.forward(8) + +print(t.frame()) +``` + +![Turtle](docs/images/turtle.png) + + +### Installation + +To install drawille, simply: + +```bash +$ pip install drawille +``` + +or + +```bash +$ easy_install drawille +``` + + +### Bugs + +Bugs or suggestions? Visit the [issue tracker](https://github.com/asciimoo/drawille/issues). + + +Tested fonts + +| Font | Works | +| ----- | ----- | +| Fixed | Yes | + + +Tested terminals + +| Terminal | Works | +| ------------ | ----- | +| rxvt-unicode | Yes | + + + +### LICENSE + +``` +drawille is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +drawille is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with drawille. If not, see < http://www.gnu.org/licenses/ >. + +(C) 2014- by Adam Tauber, +``` + + +### Other implementations / similar projects + + * [https://github.com/madbence/node-drawille](https://github.com/madbence/node-drawille) (nodejs) + * [https://github.com/exrook/drawille-go](https://github.com/exrook/drawille-go) (go) + * [https://github.com/maerch/ruby-drawille](https://github.com/maerch/ruby-drawille) (ruby) + * [https://github.com/sunetos/TextPlots.jl](https://github.com/sunetos/TextPlots.jl) (julia) + * [https://github.com/mkremins/drawille-clj](https://github.com/mkremins/drawille-clj) (clojure) + * [https://github.com/mydzor/bash-drawille](https://github.com/mydzor/bash-drawille) (bash) + * [https://github.com/hoelzro/term-drawille](https://github.com/hoelzro/term-drawille) (perl 5) + * [https://github.com/whatthejeff/php-drawille](https://github.com/whatthejeff/php-drawille) (PHP) + * [https://github.com/yamadapc/haskell-drawille](https://github.com/yamadapc/haskell-drawille) (haskell) + * [https://github.com/P1start/drawille-rs](https://github.com/P1start/drawille-rs) (rust) + * [https://github.com/liam-middlebrook/drawille-sharp](https://github.com/liam-middlebrook/drawille-sharp) (C#) + * [https://github.com/asciimoo/lua-drawille](https://github.com/asciimoo/lua-drawille) (Lua) + + +### Further reading + + * [HackerNews](https://news.ycombinator.com/item?id=7776112) + * [Reddit](http://www.reddit.com/r/programming/comments/263opn/drawille_pixel_graphics_in_a_terminal_using/) + * [ohloh](http://www.ohloh.net/p/drawille) + * [xkcd comics in Braille using drawille](http://blog.yjl.im/2014/04/xkcd-comics-in-braille-using-drawille.html) + * [Braille unicode pixelation](http://blog.jverkamp.com/2014/05/30/braille-unicode-pixelation/) diff --git a/sources_non_forked/vim-minimap/autoload/drawille/docs/images/drawille_01.png b/sources_non_forked/vim-minimap/autoload/drawille/docs/images/drawille_01.png new file mode 100644 index 0000000000000000000000000000000000000000..849bc4d02413fa3ff9a6b2698c7104cb0a47b552 GIT binary patch literal 5993 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 Z*?V(y;2Ib-KybGt5CIaB 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

}c>OYi*G5FTVx~j5^4KA@y=Yge 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⪻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

L)$ygomTu#g7n9z`+)c0CK@`yg;it*?! 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 Ttvi(P=vF< zBeIx*fm;}a85w5HkpK#^mw5WRvfpEoV3T7B&gryfU|_!N>EaktaqI0}$E;Ub5)FyI z^@}FFIN=!nAj@S_pVN26r5WDVC(6982Sn|jB63z%<6a!!^;?%Cl0VrjZti_~yt}~T z;qSL4QOc(`*_@xOBFWcYIWIkOTlLcBHmR%?3)}7+%|3f-lT5GM^y$-6BhRI6zN`Hx z11K()^}{w$q*cJ|KcAvY;Fq7GCRYNSdF$(*cP~?$?V}bR9)AA(`M-7lpFLA+*$|_5 z{q@&p%U^%prE_|dj`?~Xw&t^@k3Uv?Uf18xFK^9j3ex-k`@_8RN97p69Me1MeUD9i zt>^k}zwLY3r0=n<`1^G?_i}@j9^RjEV~c&gs^_K%oktdRm6e)ZNuQGfMOI(U`Y&yM zeNEWvv%A@v57yY-w^7;l_VaR(V^=)9mSLiG`qQ^>-`c-hK2Z#G2AlNk_os*N1lny> zKwg!~;s6FQ1A{}f?0bzZ-()r|gX;WfW`BEg@G2OuZ*ul|$5L?U*zf;bnSbRypWW{o zi>R&tY*OC-{kzw5zCFZ8+v|$YZ(eD=6s%M#@9(pD>A~e*5dX0NEowM6%WrvqfB*8R z1D0>|uLHxt^vZ^$<*^4ckNxV01V7L<)^jeq{VlNAvwuIo;-0;GuO`k@@syL3tJ-_- z_3PCTReR&!&-ur^<~Cn?=>7j|Anwd;5m=;Q)ZdnN4QMVS(6$HLuhz?7YEd&;$mv_5 zCp_<<-4agU3@71PA7a$r94VZ$EOYMsr9L2m3oXx$6hR@uz!3lYyTi#{vMa;3Kfc7b z5MpxJ-9F~kw+k~N-m2?=eA2{ZGteOs8&9Sbm6w;V>OFh;Ul}9_w4X`$Lp;3ZOs2Wn z?2Y=6U<4a)a^~o~`Mhk+KWpTiBJ`#opQr3O>1dMR@sE~kzsWd2VrcFCnC&ZXubK!8 z4u-cAQzPd+KYrtt&Aqu$lUF{@Ej3Gt4}s`7>>4QIWU<~l8xf@;FCImQhi?u3HGB8U z(#23;gjz3s{_E-th%drc+mTm;@X&+@4T*oz|{1zq^h>|@0TxE-hba; zQ*c|h&rGi0{JmCJQt^C0?Mz5skl(F3*IDjPS^MIx8C%`K4sixXaN14TRx=sC&o<{b zt#NH%3{spCvDW_osu%hY4@v!7dft6uD=?~xEM|d(5^qcWV-ESQy-Hl?-vm$$c)I$z JtaD0e0stm<_}2gc literal 0 HcmV?d00001 diff --git a/sources_non_forked/vim-minimap/autoload/drawille/docs/images/xkcd.png b/sources_non_forked/vim-minimap/autoload/drawille/docs/images/xkcd.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d9cd9d62f62b696062a25094a3fcf09ef91e98 GIT binary patch literal 4130 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 l(u1faBM*_)p~D5T&V(nyA1jV9!KXXK;S literal 0 HcmV?d00001 diff --git a/sources_non_forked/vim-minimap/autoload/drawille/drawille.py b/sources_non_forked/vim-minimap/autoload/drawille/drawille.py new file mode 100644 index 00000000..9f0576fa --- /dev/null +++ b/sources_non_forked/vim-minimap/autoload/drawille/drawille.py @@ -0,0 +1,417 @@ +# -*- coding: utf-8 -*- + +# drawille is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# drawille is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with drawille. If not, see < http://www.gnu.org/licenses/ >. +# +# (C) 2014- by Adam Tauber, + +import math +import os +from sys import version_info +from collections import defaultdict +from time import sleep +import curses + +IS_PY3 = version_info[0] == 3 + +if IS_PY3: + unichr = chr + +""" + +http://www.alanwood.net/unicode/braille_patterns.html + +dots: + ,___, + |1 4| + |2 5| + |3 6| + |7 8| + ````` +""" + +pixel_map = ((0x01, 0x08), + (0x02, 0x10), + (0x04, 0x20), + (0x40, 0x80)) + +# braille unicode characters starts at 0x2800 +braille_char_offset = 0x2800 + + +# http://stackoverflow.com/questions/566746/how-to-get-console-window-width-in-python +def getTerminalSize(): + """Returns terminal width, height + """ + env = os.environ + + def ioctl_GWINSZ(fd): + try: + import fcntl, termios, struct + cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) + except: + return + return cr + + cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) + + if not cr: + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + cr = ioctl_GWINSZ(fd) + os.close(fd) + except: + pass + + if not cr: + cr = (env.get('LINES', 25), env.get('COLUMNS', 80)) + + return int(cr[1]), int(cr[0]) + + +def normalize(coord): + coord_type = type(coord) + + if coord_type == int: + return coord + elif coord_type == float: + return int(round(coord)) + else: + raise TypeError("Unsupported coordinate type <{0}>".format(type(coord))) + + +def intdefaultdict(): + return defaultdict(int) + + +def get_pos(x, y): + """Convert x, y to cols, rows""" + return normalize(x) // 2, normalize(y) // 4 + + +class Canvas(object): + """This class implements the pixel surface.""" + + def __init__(self, line_ending=os.linesep): + super(Canvas, self).__init__() + self.clear() + self.line_ending = line_ending + + + def clear(self): + """Remove all pixels from the :class:`Canvas` object.""" + self.chars = defaultdict(intdefaultdict) + + + def set(self, x, y): + """Set a pixel of the :class:`Canvas` object. + + :param x: x coordinate of the pixel + :param y: y coordinate of the pixel + """ + x = normalize(x) + y = normalize(y) + col, row = get_pos(x, y) + + if type(self.chars[row][col]) != int: + return + + self.chars[row][col] |= pixel_map[y % 4][x % 2] + + + def unset(self, x, y): + """Unset a pixel of the :class:`Canvas` object. + + :param x: x coordinate of the pixel + :param y: y coordinate of the pixel + """ + x = normalize(x) + y = normalize(y) + col, row = get_pos(x, y) + + if type(self.chars[row][col]) == int: + self.chars[row][col] &= ~pixel_map[y % 4][x % 2] + + if type(self.chars[row][col]) != int or self.chars[row][col] == 0: + del(self.chars[row][col]) + + if not self.chars.get(row): + del(self.chars[row]) + + + def toggle(self, x, y): + """Toggle a pixel of the :class:`Canvas` object. + + :param x: x coordinate of the pixel + :param y: y coordinate of the pixel + """ + x = normalize(x) + y = normalize(y) + col, row = get_pos(x, y) + + if type(self.chars[row][col]) != int or self.chars[row][col] & pixel_map[y % 4][x % 2]: + self.unset(x, y) + else: + self.set(x, y) + + + def set_text(self, x, y, text): + """Set text to the given coords. + + :param x: x coordinate of the text start position + :param y: y coordinate of the text start position + """ + col, row = get_pos(x, y) + + for i,c in enumerate(text): + self.chars[row][col+i] = c + + + def get(self, x, y): + """Get the state of a pixel. Returns bool. + + :param x: x coordinate of the pixel + :param y: y coordinate of the pixel + """ + x = normalize(x) + y = normalize(y) + dot_index = pixel_map[y % 4][x % 2] + col, row = get_pos(x, y) + char = self.chars.get(row, {}).get(col) + + if not char: + return False + + if type(char) != int: + return True + + return bool(char & dot_index) + + + def rows(self, min_x=None, min_y=None, max_x=None, max_y=None): + """Returns a list of the current :class:`Canvas` object lines. + + :param min_x: (optional) minimum x coordinate of the canvas + :param min_y: (optional) minimum y coordinate of the canvas + :param max_x: (optional) maximum x coordinate of the canvas + :param max_y: (optional) maximum y coordinate of the canvas + """ + + if not self.chars.keys(): + return [] + + minrow = min_y // 4 if min_y != None else min(self.chars.keys()) + maxrow = (max_y - 1) // 4 if max_y != None else max(self.chars.keys()) + mincol = min_x // 2 if min_x != None else min(min(x.keys()) for x in self.chars.values()) + maxcol = (max_x - 1) // 2 if max_x != None else max(max(x.keys()) for x in self.chars.values()) + ret = [] + + for rownum in range(minrow, maxrow+1): + if not rownum in self.chars: + ret.append('') + continue + + maxcol = (max_x - 1) // 2 if max_x != None else max(self.chars[rownum].keys()) + row = [] + + for x in range(mincol, maxcol+1): + char = self.chars[rownum].get(x) + + if not char: + row.append(' ') + elif type(char) != int: + row.append(char) + else: + row.append(unichr(braille_char_offset+char)) + + ret.append(''.join(row)) + + return ret + + + def frame(self, min_x=None, min_y=None, max_x=None, max_y=None): + """String representation of the current :class:`Canvas` object pixels. + + :param min_x: (optional) minimum x coordinate of the canvas + :param min_y: (optional) minimum y coordinate of the canvas + :param max_x: (optional) maximum x coordinate of the canvas + :param max_y: (optional) maximum y coordinate of the canvas + """ + ret = self.line_ending.join(self.rows(min_x, min_y, max_x, max_y)) + + if IS_PY3: + return ret + + return ret.encode('utf-8') + + +def line(x1, y1, x2, y2): + """Returns the coords of the line between (x1, y1), (x2, y2) + + :param x1: x coordinate of the startpoint + :param y1: y coordinate of the startpoint + :param x2: x coordinate of the endpoint + :param y2: y coordinate of the endpoint + """ + + x1 = normalize(x1) + y1 = normalize(y1) + x2 = normalize(x2) + y2 = normalize(y2) + + xdiff = max(x1, x2) - min(x1, x2) + ydiff = max(y1, y2) - min(y1, y2) + xdir = 1 if x1 <= x2 else -1 + ydir = 1 if y1 <= y2 else -1 + + r = max(xdiff, ydiff) + + for i in range(r+1): + x = x1 + y = y1 + + if ydiff: + y += (float(i) * ydiff) / r * ydir + if xdiff: + x += (float(i) * xdiff) / r * xdir + + yield (x, y) + + +def polygon(center_x=0, center_y=0, sides=4, radius=4): + degree = float(360) / sides + + for n in range(sides): + a = n * degree + b = (n + 1) * degree + x1 = (center_x + math.cos(math.radians(a))) * (radius + 1) / 2 + y1 = (center_y + math.sin(math.radians(a))) * (radius + 1) / 2 + x2 = (center_x + math.cos(math.radians(b))) * (radius + 1) / 2 + y2 = (center_y + math.sin(math.radians(b))) * (radius + 1) / 2 + + for x, y in line(x1, y1, x2, y2): + yield x, y + + +class Turtle(Canvas): + """Turtle graphics interface + http://en.wikipedia.org/wiki/Turtle_graphics + """ + + def __init__(self, pos_x=0, pos_y=0): + self.pos_x = pos_x + self.pos_y = pos_y + self.rotation = 0 + self.brush_on = True + super(Turtle, self).__init__() + + + def up(self): + """Pull the brush up.""" + self.brush_on = False + + + def down(self): + """Push the brush down.""" + self.brush_on = True + + + def forward(self, step): + """Move the turtle forward. + + :param step: Integer. Distance to move forward. + """ + x = self.pos_x + math.cos(math.radians(self.rotation)) * step + y = self.pos_y + math.sin(math.radians(self.rotation)) * step + prev_brush_state = self.brush_on + self.brush_on = True + self.move(x, y) + self.brush_on = prev_brush_state + + + def move(self, x, y): + """Move the turtle to a coordinate. + + :param x: x coordinate + :param y: y coordinate + """ + if self.brush_on: + for lx, ly in line(self.pos_x, self.pos_y, x, y): + self.set(lx, ly) + + self.pos_x = x + self.pos_y = y + + + def right(self, angle): + """Rotate the turtle (positive direction). + + :param angle: Integer. Rotation angle in degrees. + """ + self.rotation += angle + + + def left(self, angle): + """Rotate the turtle (negative direction). + + :param angle: Integer. Rotation angle in degrees. + """ + self.rotation -= angle + + + def back(self, step): + """Move the turtle backwards. + + :param step: Integer. Distance to move backwards. + """ + self.forward(-step) + + + # aliases + pu = up + pd = down + fd = forward + mv = move + rt = right + lt = left + bk = back + + +def animate(canvas, fn, delay=1./24, *args, **kwargs): + """Animation automatition function + + :param canvas: :class:`Canvas` object + :param fn: Callable. Frame coord generator + :param delay: Float. Delay between frames. + :param *args, **kwargs: optional fn parameters + """ + + # python2 unicode curses fix + if not IS_PY3: + import locale + locale.setlocale(locale.LC_ALL, "") + + def animation(stdscr): + + for frame in fn(*args, **kwargs): + for x,y in frame: + canvas.set(x,y) + + f = canvas.frame() + stdscr.addstr(0, 0, '{0}\n'.format(f)) + stdscr.refresh() + if delay: + sleep(delay) + canvas.clear() + + curses.wrapper(animation) diff --git a/sources_non_forked/vim-minimap/autoload/drawille/examples/basic.py b/sources_non_forked/vim-minimap/autoload/drawille/examples/basic.py new file mode 100644 index 00000000..53c3137a --- /dev/null +++ b/sources_non_forked/vim-minimap/autoload/drawille/examples/basic.py @@ -0,0 +1,39 @@ +from __future__ import print_function +from drawille import Canvas +import math + + +s = Canvas() + +for x in range(1800): + s.set(x/10, math.sin(math.radians(x)) * 10) + +print(s.frame()) + +s.clear() + +for x in range(0, 1800, 10): + s.set(x/10, 10 + math.sin(math.radians(x)) * 10) + s.set(x/10, 10 + math.cos(math.radians(x)) * 10) + +print(s.frame()) + +s.clear() + +for x in range(0, 3600, 20): + s.set(x/20, 4 + math.sin(math.radians(x)) * 4) + +print(s.frame()) + +s.clear() + +for x in range(0, 360, 4): + s.set(x/4, 30 + math.sin(math.radians(x)) * 30) + +for x in range(30): + for y in range(30): + s.set(x,y) + s.toggle(x+30, y+30) + s.toggle(x+60, y) + +print(s.frame()) diff --git a/sources_non_forked/vim-minimap/autoload/drawille/examples/flappy_birds.py b/sources_non_forked/vim-minimap/autoload/drawille/examples/flappy_birds.py new file mode 100644 index 00000000..3cf6add2 --- /dev/null +++ b/sources_non_forked/vim-minimap/autoload/drawille/examples/flappy_birds.py @@ -0,0 +1,207 @@ +# -*- coding: utf-8 -*- +import curses +from drawille import Canvas, line +from time import sleep +from thread import start_new_thread +from Queue import Queue +import locale +from random import randint + +locale.setlocale(locale.LC_ALL,"") + +stdscr = curses.initscr() +stdscr.refresh() + +keys = Queue() + +speed = 0.0 +fps = 20 +frame_no = 0 +score = 0 +delta = frame_no / fps + +height = 100 +width = 100 +position = height / 2 + +bird_map = [ +#1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +[0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0], #1 +[0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0], #2 +[0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0], #3 +[0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0], #4 +[0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0], #5 +[0,1,1,1,1,1,1,1,1,0,1,0,0,0,0,1,0,0,1,0,0], #6 +[1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,0], #7 +[1,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,1,0], #8 +[1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1], #9 +[1,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,0], #0 +[0,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0], #1 +[0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,0,0], #2 +[0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0], #3 +] +bird = [] +for y, row in enumerate(bird_map): + for x,col in enumerate(row): + if col: + bird.append((x, y)) + +def read_keys(stdscr): + while 1: + c = stdscr.getch() + keys.put(c) + + +class Bar(): + + + def __init__(self, bar_width, cap_height=4, space=3*13): + self.height = randint(cap_height+space+1, height-1-cap_height) + self.width = bar_width + self.cap_height = cap_height + self.x = width - bar_width - 1 + self.space = space + + + def draw(self): + for x,y in line(self.x, + self.height, + self.x+self.width, + self.height): + yield x, y + for x,y in line(self.x, + self.height, + self.x, + self.height+self.cap_height): + yield x, y + for x,y in line(self.x+self.width, + self.height, + x+self.width, + self.height+self.cap_height): + yield x, y + for x,y in line(self.x, + self.height+self.cap_height, + self.x+2, + self.height+self.cap_height): + yield x, y + for x,y in line(self.x+self.width-2, + self.height+self.cap_height, + self.x+self.width, + self.height+self.cap_height): + yield x, y + for x,y in line(self.x+2, + self.height+self.cap_height, + self.x+2, + height): + yield x, y + for x,y in line(self.x+self.width-2, + self.height+self.cap_height, + self.x+self.width-2, + height): + yield x, y + + for x,y in line(self.x, + self.height-self.space, + self.x+self.width, + self.height-self.space): + yield x, y + for x,y in line(self.x, + self.height-self.space, + self.x, + self.height-self.cap_height-self.space): + yield x, y + for x,y in line(self.x+self.width, + self.height-self.space, + x+self.width, + self.height-self.cap_height-self.space): + yield x, y + for x,y in line(self.x, + self.height-self.cap_height-self.space, + self.x+2, + self.height-self.cap_height-self.space): + yield x, y + for x,y in line(self.x+self.width-2, + self.height-self.cap_height-self.space, + self.x+self.width, + self.height-self.cap_height-self.space): + yield x, y + for x,y in line(self.x+2, + self.height-self.cap_height-self.space, + self.x+2, + 0): + yield x, y + for x,y in line(self.x+self.width-2, + self.height-self.cap_height-self.space, + self.x+self.width-2, + 0): + yield x, y + +def check_collision(bird_pos, bar): + # TODO more efficient collision detection + if bar.x > 21: + return False + if bar.height <= bird_pos-13 and bar.height+bar.space > bird_pos: + return False + for bar_x, bar_y in bar.draw(): + for bird_x, bird_y in bird: + if int(bird_x) == int(bar_x) and int(bird_y+bird_pos) == int(bar_y): + return True + return False + +def main(stdscr): + global frame_no, speed, position, score + c = Canvas() + bar_width = 16 + bars = [Bar(bar_width)] + stdscr.refresh() + + while True: + frame_no += 1 + for bar in bars: + if check_collision(position, bar): + return + while not keys.empty(): + if keys.get() == 113: + return + speed = 32.0 + + c.set(0,0) + c.set(width, height) + if frame_no % 50 == 0: + bars.append(Bar(bar_width)) + for x,y in bird: + c.set(x,y+position) + for bar_index, bar in enumerate(bars): + if bar.x < 1: + bars.pop(bar_index) + score += 1 + else: + bars[bar_index].x -= 1 + for x,y in bar.draw(): + c.set(x,y) + f = c.frame()+'\n' + stdscr.addstr(0, 0, f) + stdscr.addstr(height/4+1, 0, 'score: {0}'.format(score)) + stdscr.refresh() + c.clear() + + speed -= 2 + + position -= speed/10 + + if position < 0: + position = 0 + speed = 0.0 + elif position > height-13: + position = height-13 + speed = 0.0 + + + sleep(1.0/fps) + + +if __name__ == '__main__': + start_new_thread(read_keys, (stdscr,)) + curses.wrapper(main) + print('Final score: {0}'.format(score)) + diff --git a/sources_non_forked/vim-minimap/autoload/drawille/examples/image2term.py b/sources_non_forked/vim-minimap/autoload/drawille/examples/image2term.py new file mode 100644 index 00000000..898397e3 --- /dev/null +++ b/sources_non_forked/vim-minimap/autoload/drawille/examples/image2term.py @@ -0,0 +1,121 @@ +# example: +# $ PYTHONPATH=`pwd` python examples/image2term.py http://fc00.deviantart.net/fs71/f/2011/310/5/a/giant_nyan_cat_by_daieny-d4fc8u1.png -t 100 -r 0.01 + +try: + from PIL import Image +except: + from sys import stderr + stderr.write('[E] PIL not installed\n') + exit(1) +from drawille import Canvas +from StringIO import StringIO +import urllib2 + + +def getTerminalSize(): + import os + env = os.environ + + def ioctl_GWINSZ(fd): + import fcntl + import termios + import struct + cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) + return cr + cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) + if not cr: + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + cr = ioctl_GWINSZ(fd) + os.close(fd) + except: + pass + if not cr: + cr = (env.get('LINES', 25), env.get('COLUMNS', 80)) + return int(cr[1]), int(cr[0]) + + +def image2term(image, threshold=128, ratio=None, invert=False): + if image.startswith('http://') or image.startswith('https://'): + i = Image.open(StringIO(urllib2.urlopen(image).read())).convert('L') + else: + i = Image.open(open(image)).convert('L') + w, h = i.size + if ratio: + w = int(w * ratio) + h = int(h * ratio) + i = i.resize((w, h), Image.ANTIALIAS) + else: + tw = getTerminalSize()[0] + tw *= 2 + if tw < w: + ratio = tw / float(w) + w = tw + h = int(h * ratio) + i = i.resize((w, h), Image.ANTIALIAS) + can = Canvas() + x = y = 0 + + try: + i_converted = i.tobytes() + except AttributeError: + i_converted = i.tostring() + + for pix in i_converted: + if invert: + if ord(pix) > threshold: + can.set(x, y) + else: + if ord(pix) < threshold: + can.set(x, y) + x += 1 + if x >= w: + y += 1 + x = 0 + return can.frame(0, 0) + + +def argparser(): + import argparse + from sys import stdout + argp = argparse.ArgumentParser(description='drawille - image to terminal example script') + argp.add_argument('-o', '--output' + ,help = 'Output file - default is STDOUT' + ,metavar = 'FILE' + ,default = stdout + ,type = argparse.FileType('w') + ) + argp.add_argument('-r', '--ratio' + ,help = 'Image resize ratio' + ,default = None + ,action = 'store' + ,type = float + ,metavar = 'N' + ) + argp.add_argument('-t', '--threshold' + ,help = 'Color threshold' + ,default = 128 + ,action = 'store' + ,type = int + ,metavar = 'N' + ) + argp.add_argument('-i', '--invert' + ,help = 'Invert colors' + ,default = False + ,action = 'store_true' + ) + argp.add_argument('image' + ,metavar = 'FILE' + ,help = 'Image file path/url' + ) + return vars(argp.parse_args()) + + +def __main__(): + args = argparser() + args['output'].write(image2term(args['image'], args['threshold'], args['ratio'], args['invert'])) + args['output'].write('\n') + + +if __name__ == '__main__': + __main__() diff --git a/sources_non_forked/vim-minimap/autoload/drawille/examples/rotating_cube.py b/sources_non_forked/vim-minimap/autoload/drawille/examples/rotating_cube.py new file mode 100644 index 00000000..07f6b103 --- /dev/null +++ b/sources_non_forked/vim-minimap/autoload/drawille/examples/rotating_cube.py @@ -0,0 +1,108 @@ +from drawille import Canvas, line +import curses +import math +from time import sleep +import locale + +locale.setlocale(locale.LC_ALL,"") + +stdscr = curses.initscr() +stdscr.refresh() + +class Point3D: + def __init__(self, x = 0, y = 0, z = 0): + self.x, self.y, self.z = float(x), float(y), float(z) + + def rotateX(self, angle): + """ Rotates the point around the X axis by the given angle in degrees. """ + rad = angle * math.pi / 180 + cosa = math.cos(rad) + sina = math.sin(rad) + y = self.y * cosa - self.z * sina + z = self.y * sina + self.z * cosa + return Point3D(self.x, y, z) + + def rotateY(self, angle): + """ Rotates the point around the Y axis by the given angle in degrees. """ + rad = angle * math.pi / 180 + cosa = math.cos(rad) + sina = math.sin(rad) + z = self.z * cosa - self.x * sina + x = self.z * sina + self.x * cosa + return Point3D(x, self.y, z) + + def rotateZ(self, angle): + """ Rotates the point around the Z axis by the given angle in degrees. """ + rad = angle * math.pi / 180 + cosa = math.cos(rad) + sina = math.sin(rad) + x = self.x * cosa - self.y * sina + y = self.x * sina + self.y * cosa + return Point3D(x, y, self.z) + + def project(self, win_width, win_height, fov, viewer_distance): + """ Transforms this 3D point to 2D using a perspective projection. """ + factor = fov / (viewer_distance + self.z) + x = self.x * factor + win_width / 2 + y = -self.y * factor + win_height / 2 + return Point3D(x, y, 1) + + +vertices = [ + Point3D(-20,20,-20), + Point3D(20,20,-20), + Point3D(20,-20,-20), + Point3D(-20,-20,-20), + Point3D(-20,20,20), + Point3D(20,20,20), + Point3D(20,-20,20), + Point3D(-20,-20,20) +] + +# Define the vertices that compose each of the 6 faces. These numbers are +# indices to the vertices list defined above. +faces = [(0,1,2,3),(1,5,6,2),(5,4,7,6),(4,0,3,7),(0,4,5,1),(3,2,6,7)] + + +def __main__(stdscr, projection=False): + angleX, angleY, angleZ = 0, 0, 0 + c = Canvas() + while 1: + # Will hold transformed vertices. + t = [] + + for v in vertices: + # Rotate the point around X axis, then around Y axis, and finally around Z axis. + p = v.rotateX(angleX).rotateY(angleY).rotateZ(angleZ) + if projection: + # Transform the point from 3D to 2D + p = p.project(50, 50, 50, 50) + #Put the point in the list of transformed vertices + t.append(p) + + for f in faces: + for x,y in line(t[f[0]].x, t[f[0]].y, t[f[1]].x, t[f[1]].y): + c.set(x,y) + for x,y in line(t[f[1]].x, t[f[1]].y, t[f[2]].x, t[f[2]].y): + c.set(x,y) + for x,y in line(t[f[2]].x, t[f[2]].y, t[f[3]].x, t[f[3]].y): + c.set(x,y) + for x,y in line(t[f[3]].x, t[f[3]].y, t[f[0]].x, t[f[0]].y): + c.set(x,y) + + f = c.frame(-40, -40, 80, 80) + stdscr.addstr(0, 0, '{0}\n'.format(f)) + stdscr.refresh() + + angleX += 2 + angleY += 3 + angleZ += 5 + sleep(1.0/20) + c.clear() + +if __name__ == '__main__': + from sys import argv + projection = False + if '-p' in argv: + projection = True + curses.wrapper(__main__, projection) diff --git a/sources_non_forked/vim-minimap/autoload/drawille/examples/sine_tracking.py b/sources_non_forked/vim-minimap/autoload/drawille/examples/sine_tracking.py new file mode 100644 index 00000000..cad7e90e --- /dev/null +++ b/sources_non_forked/vim-minimap/autoload/drawille/examples/sine_tracking.py @@ -0,0 +1,28 @@ +from __future__ import print_function +from drawille import Canvas, line, animate +import math + +def __main__(): + i = 0 + height = 40 + + while True: + frame = [] + + frame.extend([coords for coords in + line(0, + height, + 180, + math.sin(math.radians(i)) * height + height)]) + + frame.extend([(x/2, height + math.sin(math.radians(x+i)) * height) + for x in range(0, 360, 2)]) + + yield frame + + i += 2 + + + +if __name__ == '__main__': + animate(Canvas(), __main__, 1./60) diff --git a/sources_non_forked/vim-minimap/autoload/drawille/examples/speed_test.py b/sources_non_forked/vim-minimap/autoload/drawille/examples/speed_test.py new file mode 100644 index 00000000..d4496d1f --- /dev/null +++ b/sources_non_forked/vim-minimap/autoload/drawille/examples/speed_test.py @@ -0,0 +1,24 @@ +from drawille import Canvas +from timeit import timeit + +c = Canvas() + +frames = 1000 * 10 + +sizes = ((0, 0), + (10, 10), + (20, 20), + (20, 40), + (40, 20), + (40, 40), + (100, 100)) + +for x, y in sizes: + c.set(0, 0) + + for i in range(y): + c.set(x, i) + + r = timeit(c.frame, number=frames) + print('{0}x{1}\t{2}'.format(x, y, r)) + c.clear() diff --git a/sources_non_forked/vim-minimap/autoload/drawille/examples/turtle.py b/sources_non_forked/vim-minimap/autoload/drawille/examples/turtle.py new file mode 100644 index 00000000..4da2bb44 --- /dev/null +++ b/sources_non_forked/vim-minimap/autoload/drawille/examples/turtle.py @@ -0,0 +1,11 @@ +from drawille import Turtle + +t = Turtle() + +for _ in range(36): + t.right(10) + for _ in range(36): + t.right(10) + t.forward(8) + +print(t.frame()) diff --git a/sources_non_forked/vim-minimap/autoload/drawille/examples/xkcd.py b/sources_non_forked/vim-minimap/autoload/drawille/examples/xkcd.py new file mode 100644 index 00000000..7f27beca --- /dev/null +++ b/sources_non_forked/vim-minimap/autoload/drawille/examples/xkcd.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- + +from sys import argv +try: + from PIL import Image +except: + from sys import stderr + stderr.write('[E] PIL not installed') + exit(1) +from StringIO import StringIO +import urllib2 +import re +from drawille import Canvas + + +def getTerminalSize(): + import os + env = os.environ + + def ioctl_GWINSZ(fd): + import fcntl + import termios + import struct + cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) + return cr + cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) + if not cr: + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + cr = ioctl_GWINSZ(fd) + os.close(fd) + except: + pass + if not cr: + cr = (env.get('LINES', 25), env.get('COLUMNS', 80)) + return int(cr[1]), int(cr[0]) + + +def usage(): + print('Usage: %s ') + exit() + +if __name__ == '__main__': + if len(argv) < 2: + url = 'http://xkcd.com/' + elif argv[1] in ['-h', '--help']: + usage() + elif argv[1].startswith('http'): + url = argv[1] + else: + url = 'http://xkcd.com/%s/' % argv[1] + c = urllib2.urlopen(url).read() + img_url = re.findall('http:\/\/imgs.xkcd.com\/comics\/[^"\']+', c)[0] + i = Image.open(StringIO(urllib2.urlopen(img_url).read())).convert('L') + w, h = i.size + tw, th = getTerminalSize() + tw *= 2 + th *= 2 + if tw < w: + ratio = tw / float(w) + w = tw + h = int(h * ratio) + i = i.resize((w, h), Image.ANTIALIAS) + can = Canvas() + x = y = 0 + + try: + i_converted = i.tobytes() + except AttributeError: + i_converted = i.tostring() + + for pix in i_converted: + if ord(pix) < 128: + can.set(x, y) + x += 1 + if x >= w: + y += 1 + x = 0 + print(can.frame()) diff --git a/sources_non_forked/vim-minimap/autoload/drawille/setup.py b/sources_non_forked/vim-minimap/autoload/drawille/setup.py new file mode 100644 index 00000000..987cf2eb --- /dev/null +++ b/sources_non_forked/vim-minimap/autoload/drawille/setup.py @@ -0,0 +1,34 @@ +from setuptools import setup, find_packages + +setup( + name = 'drawille', + version = '0.0.4', + author = 'Adam Tauber', + author_email = 'asciimoo@gmail.com', + description = ('Drawing in terminal with unicode braille characters'), + license = 'AGPLv3+', + keywords = "terminal braille drawing canvas console", + url = 'https://github.com/asciimoo/drawille', + scripts = [], + py_modules = ['drawille'], + packages = find_packages(), + install_requires = [], + download_url = 'https://github.com/asciimoo/drawille/tarball/master', + # TODO + #entry_points={ + # "console_scripts": ["drawille=drawille:__main__"] + #}, + classifiers = [ + "Development Status :: 4 - Beta", + "Topic :: Utilities", + 'Environment :: Console', + 'License :: OSI Approved :: GNU Affero General Public License v3', + 'Intended Audience :: Developers', + 'Natural Language :: English', + 'Programming Language :: Python', + 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.3', + ], +) diff --git a/sources_non_forked/vim-minimap/autoload/drawille/tests.py b/sources_non_forked/vim-minimap/autoload/drawille/tests.py new file mode 100644 index 00000000..0ce142c3 --- /dev/null +++ b/sources_non_forked/vim-minimap/autoload/drawille/tests.py @@ -0,0 +1,130 @@ +# -*- coding: utf-8 -*- +from drawille import Canvas, line, Turtle +from unittest import TestCase, main + + +class CanvasTestCase(TestCase): + + + def test_set(self): + c = Canvas() + c.set(0, 0) + self.assertTrue(0 in c.chars and 0 in c.chars[0]) + + + def test_unset_empty(self): + c = Canvas() + c.set(1, 1) + c.unset(1, 1) + self.assertEqual(len(c.chars), 0) + + + def test_unset_nonempty(self): + c = Canvas() + c.set(0, 0) + c.set(0, 1) + c.unset(0, 1) + self.assertEqual(c.chars[0][0], 1) + + + def test_clear(self): + c = Canvas() + c.set(1, 1) + c.clear() + self.assertEqual(c.chars, dict()) + + + def test_toggle(self): + c = Canvas() + c.toggle(0, 0) + self.assertEqual(c.chars, {0: {0: 1}}) + c.toggle(0, 0) + self.assertEqual(c.chars, dict()) + + + def test_set_text(self): + c = Canvas() + c.set_text(0, 0, "asdf") + self.assertEqual(c.frame(), "asdf") + + + def test_frame(self): + c = Canvas() + self.assertEqual(c.frame(), '') + c.set(0, 0) + self.assertEqual(c.frame(), '⠁') + + + def test_max_min_limits(self): + c = Canvas() + c.set(0, 0) + self.assertEqual(c.frame(min_x=2), '') + self.assertEqual(c.frame(max_x=0), '') + + + def test_get(self): + c = Canvas() + self.assertEqual(c.get(0, 0), False) + c.set(0, 0) + self.assertEqual(c.get(0, 0), True) + self.assertEqual(c.get(0, 1), False) + self.assertEqual(c.get(1, 0), False) + self.assertEqual(c.get(1, 1), False) + + +class LineTestCase(TestCase): + + + def test_single_pixel(self): + self.assertEqual(list(line(0, 0, 0, 0)), [(0, 0)]) + + + def test_row(self): + self.assertEqual(list(line(0, 0, 1, 0)), [(0, 0), (1, 0)]) + + + def test_column(self): + self.assertEqual(list(line(0, 0, 0, 1)), [(0, 0), (0, 1)]) + + + def test_diagonal(self): + self.assertEqual(list(line(0, 0, 1, 1)), [(0, 0), (1, 1)]) + + +class TurtleTestCase(TestCase): + + + def test_position(self): + t = Turtle() + self.assertEqual(t.pos_x, 0) + self.assertEqual(t.pos_y, 0) + t.move(1, 1) + self.assertEqual(t.pos_x, 1) + self.assertEqual(t.pos_y, 1) + + + def test_rotation(self): + t = Turtle() + self.assertEqual(t.rotation, 0) + t.right(30) + self.assertEqual(t.rotation, 30) + t.left(30) + self.assertEqual(t.rotation, 0) + + + def test_brush(self): + t = Turtle() + self.assertFalse(t.get(t.pos_x, t.pos_y)) + t.forward(1) + self.assertTrue(t.get(0, 0)) + self.assertTrue(t.get(t.pos_x, t.pos_y)) + t.up() + t.move(2, 0) + self.assertFalse(t.get(t.pos_x, t.pos_y)) + t.down() + t.move(3, 0) + self.assertTrue(t.get(t.pos_x, t.pos_y)) + + +if __name__ == '__main__': + main() diff --git a/sources_non_forked/vim-minimap/autoload/minimap.py b/sources_non_forked/vim-minimap/autoload/minimap.py new file mode 100644 index 00000000..b368cc89 --- /dev/null +++ b/sources_non_forked/vim-minimap/autoload/minimap.py @@ -0,0 +1,214 @@ +# -* coding: utf-8 -*- +# vim-minimap is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# vim-minimap is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with vim-minimap. If not, see < http://www.gnu.org/licenses/ >. +# +# (C) 2014- by Séverin Lemaignan for the VIM integration, +# (C) 2014- by Adam Tauber for the Drawille part, + +import os +import sys +PY3 = sys.version_info[0] == 3 + +import vim + +# Add the library to the Python path. +for p in vim.eval("&runtimepath").split(','): + plugin_dir = os.path.join(p, "autoload", "drawille") + if os.path.exists(plugin_dir): + if plugin_dir not in sys.path: + sys.path.append(plugin_dir) + break + +from drawille import * + +WIDTH = 20 +MINIMAP = "vim-minimap" + +def getmmwindow(): + for b in vim.buffers: + if b.name.endswith(MINIMAP): + for w in vim.windows: + if w.buffer == b: + return w + return None + +def getmainwindow(): + for b in vim.buffers: + if not b.name.endswith(MINIMAP) and not "NERD_tree" in b.name: + for w in vim.windows: + if w.buffer == b: + return w + return None + +def setmmautocmd(clear = False): + vim.command(":augroup minimap_group") + vim.command(":autocmd!") + if not clear: + # Properly close the minimap when quitting VIM (ie, when minimap is the last remaining window + vim.command(":autocmd WinEnter if winnr('$') == 1|q|endif") + vim.command(':autocmd CursorMoved,CursorMovedI,TextChanged,TextChangedI,BufWinEnter * MinimapUpdate') + vim.command(":augroup END") + +def toggleminimap(): + minimap = getmmwindow() + if minimap: + closeminimap() + else: + showminimap() + +def showminimap(): + + minimap = getmmwindow() + + # If the minimap window does not yet exist, create it + if not minimap: + # Save the currently active window to restore it later + src = vim.current.window + + vim.command(":botright vnew %s" % MINIMAP) + # make the new buffer 'temporary' + vim.command(":setlocal buftype=nofile bufhidden=wipe noswapfile nobuflisted") + # make ensure our buffer is uncluttered + vim.command(":setlocal nonumber norelativenumber nolist") + + # set all autocmds in a group + setmmautocmd() + + minimap = vim.current.window + + minimap.width = WIDTH + + # fixed size + vim.command(":set wfw") + + # Restore the active window + vim.current.window = src + + vim.command(":call minimap#UpdateMinimap()") + +def updateminimap(): + minimap = getmmwindow() + src = vim.current.window + + HORIZ_SCALE = 0.2 + + + if not hasattr(src, 'buffer'): + return + + # Ignore NERD_tree Buffers + # TODO make configurable + if "NERD_tree" in src.buffer.name: + return + + if minimap and src.buffer == minimap.buffer: + + mainwindow = getmainwindow() + if mainwindow is None: + return + + if src.buffer != mainwindow.buffer: + position_in_minimap = src.cursor[0] + + ratio = float(len(minimap.buffer)) / float(len(mainwindow.buffer)) + + new_position = int(float(position_in_minimap) / ratio) + if new_position > len(mainwindow.buffer): + new_position = len(mainwindow.buffer) + + mainwindow.cursor = (new_position, 0) # move to top left + vim.current.window = mainwindow + updateminimap() + + if minimap and src.buffer != minimap.buffer: + + mode = vim.eval("mode()") + cursor = src.cursor + + vim.command("normal! H") + topline = src.cursor[0] + vim.command("normal! L") + bottomline = src.cursor[0] + + def draw(lengths,indents, startline=0): + + c = Canvas() + + for y, l in enumerate(lengths): + indent = int(indents[y] * HORIZ_SCALE) + for x in range(2 * min(int(l * HORIZ_SCALE), WIDTH)): + if(x>=indent): + c.set(x, y) + + # pad with spaces to ensure uniform block highlighting + if PY3: + return [line.ljust(WIDTH, u'\u00A0') for line in c.rows()] + else: + return [unicode(line).ljust(WIDTH, u'\u00A0') for line in c.rows()] + + if minimap: + + vim.current.window = minimap + highlight_group = vim.eval("g:minimap_highlight") + lengths = [] + indents = [] + + for line in range(len(src.buffer)): + linestring = src.buffer[line] + indents.append(len(linestring) - len(linestring.lstrip())) + lengths.append(len(linestring)) + + vim.command(":setlocal modifiable") + + minimap.buffer[:] = draw(lengths,indents) + # Highlight the current visible zone + top = int(topline / 4) + bottom = int(bottomline / 4 + 1) + vim.command("match {0} /\\%>0v\\%<{1}v\\%>{2}l\\%<{3}l./".format( + highlight_group, WIDTH + 1, top, bottom)) + + # center the highlighted zone + height = int(vim.eval("winheight(0)")) + # first, put the cursor at the top of the buffer + vim.command("normal! gg") + # then, jump so that the active zone is centered + if (top + (bottom - top) / 2) > height / 2: + jump = min(top + (bottom - top) / 2 + height / 2, len(minimap.buffer)) + vim.command("normal! %dgg" % jump) + + # prevent any further modification + vim.command(":setlocal nomodifiable") + + vim.current.window = src + + # restore the current selection if we were in visual mode. + if mode in ('v', 'V', '\026'): + vim.command("normal! gv") + + src.cursor = cursor + +def closeminimap(): + minimap = getmmwindow() + src = vim.current.window + if minimap: + vim.current.window = minimap + # clear the minimap autocmds + setmmautocmd(True) + vim.command(":quit!") + # try the last window, but sometimes this one was already closed + # (ex. tagbar toggle) which will lead to an exception + try: + vim.current.window = src + except: + vim.current.window = vim.windows[0] + diff --git a/sources_non_forked/vim-minimap/autoload/minimap.vim b/sources_non_forked/vim-minimap/autoload/minimap.vim new file mode 100644 index 00000000..f6548cc7 --- /dev/null +++ b/sources_non_forked/vim-minimap/autoload/minimap.vim @@ -0,0 +1,62 @@ +" vim-minimap is free software: you can redistribute it and/or modify +" it under the terms of the GNU Affero General Public License as published by +" the Free Software Foundation, either version 3 of the License, or +" (at your option) any later version. +" +" vim-minimap is distributed in the hope that it will be useful, +" but WITHOUT ANY WARRANTY; without even the implied warranty of +" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +" GNU Affero General Public License for more details. +" +" You should have received a copy of the GNU Affero General Public License +" along with vim-minimap. If not, see < http://www.gnu.org/licenses/ >. +" +" (C) 2014- by Séverin Lemaignan for the VIM integration, +" (C) 2014- by Adam Tauber for the Drawille part, + +if has('python') || has('python3') + " By default Highlight the current screen as a visual selection. + if !exists('g:minimap_highlight') + let g:minimap_highlight = 'Visual' + endif + + let python_module = fnameescape(globpath(&runtimepath, 'autoload/minimap.py')) + if has('python') + exe 'pyfile ' . python_module + elseif has('python3') + exe 'py3file ' . python_module + endif +end + +function! minimap#ShowMinimap() + if has('python') + python showminimap() + elseif has('python3') + python3 showminimap() + endif +endfunction + +function! minimap#UpdateMinimap() + if has('python') + python updateminimap() + elseif has('python3') + python3 updateminimap() + endif +endfunction + +function! minimap#CloseMinimap() + if has('python') + python closeminimap() + elseif has('python3') + python3 closeminimap() + endif +endfunction + +function! minimap#ToggleMinimap() + if has('python') + python toggleminimap() + elseif has('python3') + python3 toggleminimap() + endif +endfunction + diff --git a/sources_non_forked/vim-minimap/minimap.png b/sources_non_forked/vim-minimap/minimap.png new file mode 100644 index 0000000000000000000000000000000000000000..56cd32855e9e35808724e303c31eea21578d1924 GIT binary patch literal 105954 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

5D!H4B2 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 literal 0 HcmV?d00001 diff --git a/sources_non_forked/cocoa.vim/lib/cocoa_indexes/notifications.txt b/sources_non_forked/cocoa.vim/lib/cocoa_indexes/notifications.txt new file mode 100644 index 00000000..412c09f1 --- /dev/null +++ b/sources_non_forked/cocoa.vim/lib/cocoa_indexes/notifications.txt @@ -0,0 +1,298 @@ +NSAccessibilityAnnouncementRequestedNotification +NSAccessibilityApplicationActivatedNotification +NSAccessibilityApplicationDeactivatedNotification +NSAccessibilityApplicationHiddenNotification +NSAccessibilityApplicationShownNotification +NSAccessibilityCreatedNotification +NSAccessibilityDrawerCreatedNotification +NSAccessibilityFocusedUIElementChangedNotification +NSAccessibilityFocusedWindowChangedNotification +NSAccessibilityHelpTagCreatedNotification +NSAccessibilityLayoutChangedNotification +NSAccessibilityMainWindowChangedNotification +NSAccessibilityMovedNotification +NSAccessibilityResizedNotification +NSAccessibilityRowCollapsedNotification +NSAccessibilityRowCountChangedNotification +NSAccessibilityRowExpandedNotification +NSAccessibilitySelectedCellsChangedNotification +NSAccessibilitySelectedChildrenChangedNotification +NSAccessibilitySelectedChildrenMovedNotification +NSAccessibilitySelectedColumnsChangedNotification +NSAccessibilitySelectedRowsChangedNotification +NSAccessibilitySelectedTextChangedNotification +NSAccessibilitySheetCreatedNotification +NSAccessibilityTitleChangedNotification +NSAccessibilityUIElementDestroyedNotification +NSAccessibilityUnitsChangedNotification +NSAccessibilityValueChangedNotification +NSAccessibilityWindowCreatedNotification +NSAccessibilityWindowDeminiaturizedNotification +NSAccessibilityWindowMiniaturizedNotification +NSAccessibilityWindowMovedNotification +NSAccessibilityWindowResizedNotification +NSAnimationProgressMarkNotification +NSAntialiasThresholdChangedNotification +NSAppleEventManagerWillProcessFirstEventNotification +NSApplicationDidBecomeActiveNotification +NSApplicationDidChangeOcclusionStateNotification +NSApplicationDidChangeScreenParametersNotification +NSApplicationDidFinishLaunchingNotification +NSApplicationDidFinishRestoringWindowsNotification +NSApplicationDidHideNotification +NSApplicationDidResignActiveNotification +NSApplicationDidUnhideNotification +NSApplicationDidUpdateNotification +NSApplicationLaunchRemoteNotification +NSApplicationLaunchUserNotification +NSApplicationWillBecomeActiveNotification +NSApplicationWillFinishLaunchingNotification +NSApplicationWillHideNotification +NSApplicationWillResignActiveNotification +NSApplicationWillTerminateNotification +NSApplicationWillUnhideNotification +NSApplicationWillUpdateNotification +NSBrowserColumnConfigurationDidChangeNotification +NSBundleDidLoadNotification +NSCalendarDayChangedNotification +NSClassDescriptionNeededForClassNotification +NSColorListDidChangeNotification +NSColorPanelColorDidChangeNotification +NSComboBoxSelectionDidChangeNotification +NSComboBoxSelectionIsChangingNotification +NSComboBoxWillDismissNotification +NSComboBoxWillPopUpNotification +NSConnectionDidDieNotification +NSConnectionDidInitializeNotification +NSContextHelpModeDidActivateNotification +NSContextHelpModeDidDeactivateNotification +NSControlTextDidBeginEditingNotification +NSControlTextDidChangeNotification +NSControlTextDidEndEditingNotification +NSControlTintDidChangeNotification +NSCurrentLocaleDidChangeNotification +NSDidBecomeSingleThreadedNotification +NSDistributedNotification +NSDrawerDidCloseNotification +NSDrawerDidOpenNotification +NSDrawerWillCloseNotification +NSDrawerWillOpenNotification +NSFileHandleConnectionAcceptedNotification +NSFileHandleDataAvailableNotification +NSFileHandleNotification +NSFileHandleReadCompletionNotification +NSFileHandleReadToEndOfFileCompletionNotification +NSFontCollectionDidChangeNotification +NSFontSetChangedNotification +NSHTTPCookieManagerAcceptPolicyChangedNotification +NSHTTPCookieManagerCookiesChangedNotification +NSImageRepRegistryDidChangeNotification +NSKeyValueChangeNotification +NSLocalNotification +NSManagedObjectContextDidSaveNotification +NSManagedObjectContextObjectsDidChangeNotification +NSManagedObjectContextWillSaveNotification +NSMenuDidAddItemNotification +NSMenuDidBeginTrackingNotification +NSMenuDidChangeItemNotification +NSMenuDidEndTrackingNotification +NSMenuDidRemoveItemNotification +NSMenuDidSendActionNotification +NSMenuWillSendActionNotification +NSMetadataQueryDidFinishGatheringNotification +NSMetadataQueryDidStartGatheringNotification +NSMetadataQueryDidUpdateNotification +NSMetadataQueryGatheringProgressNotification +NSNotification +NSOutlineViewColumnDidMoveNotification +NSOutlineViewColumnDidResizeNotification +NSOutlineViewItemDidCollapseNotification +NSOutlineViewItemDidExpandNotification +NSOutlineViewItemWillCollapseNotification +NSOutlineViewItemWillExpandNotification +NSOutlineViewSelectionDidChangeNotification +NSOutlineViewSelectionIsChangingNotification +NSPersistentStoreCoordinatorStoresDidChangeNotification +NSPersistentStoreCoordinatorStoresWillChangeNotification +NSPersistentStoreCoordinatorWillRemoveStoreNotification +NSPersistentStoreDidImportUbiquitousContentChangesNotification +NSPopUpButtonCellWillPopUpNotification +NSPopUpButtonWillPopUpNotification +NSPopoverDidCloseNotification +NSPopoverDidShowNotification +NSPopoverWillCloseNotification +NSPopoverWillShowNotification +NSPortDidBecomeInvalidNotification +NSPreferencePaneCancelUnselectNotification +NSPreferencePaneDoUnselectNotification +NSPreferredScrollerStyleDidChangeNotification +NSRuleEditorRowsDidChangeNotification +NSScreenColorSpaceDidChangeNotification +NSScrollViewDidEndLiveMagnifyNotification +NSScrollViewDidEndLiveScrollNotification +NSScrollViewDidLiveScrollNotification +NSScrollViewWillStartLiveMagnifyNotification +NSScrollViewWillStartLiveScrollNotification +NSSpellCheckerDidChangeAutomaticDashSubstitutionNotification +NSSpellCheckerDidChangeAutomaticQuoteSubstitutionNotification +NSSpellCheckerDidChangeAutomaticSpellingCorrectionNotification +NSSpellCheckerDidChangeAutomaticTextReplacementNotification +NSSplitViewDidResizeSubviewsNotification +NSSplitViewWillResizeSubviewsNotification +NSSystemClockDidChangeNotification +NSSystemColorsDidChangeNotification +NSSystemTimeZoneDidChangeNotification +NSTableViewColumnDidMoveNotification +NSTableViewColumnDidResizeNotification +NSTableViewSelectionDidChangeNotification +NSTableViewSelectionIsChangingNotification +NSTaskDidTerminateNotification +NSTextAlternativesSelectedAlternativeStringNotification +NSTextDidBeginEditingNotification +NSTextDidChangeNotification +NSTextDidEndEditingNotification +NSTextInputContextKeyboardSelectionDidChangeNotification +NSTextStorageDidProcessEditingNotification +NSTextStorageWillProcessEditingNotification +NSTextViewDidChangeSelectionNotification +NSTextViewDidChangeTypingAttributesNotification +NSTextViewWillChangeNotifyingTextViewNotification +NSThreadWillExitNotification +NSToolbarDidRemoveItemNotification +NSToolbarWillAddItemNotification +NSURLCredentialStorageChangedNotification +NSUbiquitousKeyValueStoreDidChangeExternallyNotification +NSUbiquityIdentityDidChangeNotification +NSUndoManagerCheckpointNotification +NSUndoManagerDidCloseUndoGroupNotification +NSUndoManagerDidOpenUndoGroupNotification +NSUndoManagerDidRedoChangeNotification +NSUndoManagerDidUndoChangeNotification +NSUndoManagerWillCloseUndoGroupNotification +NSUndoManagerWillRedoChangeNotification +NSUndoManagerWillUndoChangeNotification +NSUserDefaultsDidChangeNotification +NSUserNotification +NSViewBoundsDidChangeNotification +NSViewDidUpdateTrackingAreasNotification +NSViewFocusDidChangeNotification +NSViewFrameDidChangeNotification +NSViewGlobalFrameDidChangeNotification +NSWillBecomeMultiThreadedNotification +NSWindowDidBecomeKeyNotification +NSWindowDidBecomeMainNotification +NSWindowDidChangeBackingPropertiesNotification +NSWindowDidChangeOcclusionStateNotification +NSWindowDidChangeScreenNotification +NSWindowDidChangeScreenProfileNotification +NSWindowDidDeminiaturizeNotification +NSWindowDidEndLiveResizeNotification +NSWindowDidEndSheetNotification +NSWindowDidEnterFullScreenNotification +NSWindowDidEnterVersionBrowserNotification +NSWindowDidExitFullScreenNotification +NSWindowDidExitVersionBrowserNotification +NSWindowDidExposeNotification +NSWindowDidMiniaturizeNotification +NSWindowDidMoveNotification +NSWindowDidResignKeyNotification +NSWindowDidResignMainNotification +NSWindowDidResizeNotification +NSWindowDidUpdateNotification +NSWindowWillBeginSheetNotification +NSWindowWillCloseNotification +NSWindowWillEnterFullScreenNotification +NSWindowWillEnterVersionBrowserNotification +NSWindowWillExitFullScreenNotification +NSWindowWillExitVersionBrowserNotification +NSWindowWillMiniaturizeNotification +NSWindowWillMoveNotification +NSWindowWillStartLiveResizeNotification +NSWorkspaceActiveSpaceDidChangeNotification +NSWorkspaceDidActivateApplicationNotification +NSWorkspaceDidChangeFileLabelsNotification +NSWorkspaceDidDeactivateApplicationNotification +NSWorkspaceDidHideApplicationNotification +NSWorkspaceDidLaunchApplicationNotification +NSWorkspaceDidMountNotification +NSWorkspaceDidPerformFileOperationNotification +NSWorkspaceDidRenameVolumeNotification +NSWorkspaceDidTerminateApplicationNotification +NSWorkspaceDidUnhideApplicationNotification +NSWorkspaceDidUnmountNotification +NSWorkspaceDidWakeNotification +NSWorkspaceScreensDidSleepNotification +NSWorkspaceScreensDidWakeNotification +NSWorkspaceSessionDidBecomeActiveNotification +NSWorkspaceSessionDidResignActiveNotification +NSWorkspaceWillLaunchApplicationNotification +NSWorkspaceWillPowerOffNotification +NSWorkspaceWillSleepNotification +NSWorkspaceWillUnmountNotification +UIAccessibilityAnnouncementDidFinishNotification +UIAccessibilityBoldTextStatusDidChangeNotification +UIAccessibilityClosedCaptioningStatusDidChangeNotification +UIAccessibilityDarkerSystemColorsStatusDidChangeNotification +UIAccessibilityGrayscaleStatusDidChangeNotification +UIAccessibilityGuidedAccessStatusDidChangeNotification +UIAccessibilityInvertColorsStatusDidChangeNotification +UIAccessibilityMonoAudioStatusDidChangeNotification +UIAccessibilityNotification +UIAccessibilityReduceMotionStatusDidChangeNotification +UIAccessibilityReduceTransparencyStatusDidChangeNotification +UIAccessibilitySpeakScreenStatusDidChangeNotification +UIAccessibilitySpeakSelectionStatusDidChangeNotification +UIAccessibilitySwitchControlStatusDidChangeNotification +UIApplicationBackgroundRefreshStatusDidChangeNotification +UIApplicationDidBecomeActiveNotification +UIApplicationDidChangeStatusBarFrameNotification +UIApplicationDidChangeStatusBarOrientationNotification +UIApplicationDidEnterBackgroundNotification +UIApplicationDidFinishLaunchingNotification +UIApplicationDidReceiveMemoryWarningNotification +UIApplicationLaunchOptionsLocalNotification +UIApplicationLaunchOptionsRemoteNotification +UIApplicationSignificantTimeChangeNotification +UIApplicationUserDidTakeScreenshotNotification +UIApplicationWillChangeStatusBarFrameNotification +UIApplicationWillChangeStatusBarOrientationNotification +UIApplicationWillEnterForegroundNotification +UIApplicationWillResignActiveNotification +UIApplicationWillTerminateNotification +UIContentSizeCategoryDidChangeNotification +UIDeviceBatteryLevelDidChangeNotification +UIDeviceBatteryStateDidChangeNotification +UIDeviceOrientationDidChangeNotification +UIDeviceProximityStateDidChangeNotification +UIDocumentStateChangedNotification +UIKeyboardDidChangeFrameNotification +UIKeyboardDidHideNotification +UIKeyboardDidShowNotification +UIKeyboardWillChangeFrameNotification +UIKeyboardWillHideNotification +UIKeyboardWillShowNotification +UILocalNotification +UIMenuControllerDidHideMenuNotification +UIMenuControllerDidShowMenuNotification +UIMenuControllerMenuFrameDidChangeNotification +UIMenuControllerWillHideMenuNotification +UIMenuControllerWillShowMenuNotification +UIPasteboardChangedNotification +UIPasteboardRemovedNotification +UIScreenBrightnessDidChangeNotification +UIScreenDidConnectNotification +UIScreenDidDisconnectNotification +UIScreenModeDidChangeNotification +UITableViewSelectionDidChangeNotification +UITextFieldTextDidBeginEditingNotification +UITextFieldTextDidChangeNotification +UITextFieldTextDidEndEditingNotification +UITextInputCurrentInputModeDidChangeNotification +UITextViewTextDidBeginEditingNotification +UITextViewTextDidChangeNotification +UITextViewTextDidEndEditingNotification +UIViewControllerShowDetailTargetDidChangeNotification +UIWindowDidBecomeHiddenNotification +UIWindowDidBecomeKeyNotification +UIWindowDidBecomeVisibleNotification +UIWindowDidResignKeyNotification \ No newline at end of file diff --git a/sources_non_forked/cocoa.vim/lib/cocoa_indexes/types.txt b/sources_non_forked/cocoa.vim/lib/cocoa_indexes/types.txt new file mode 100644 index 00000000..4ad3a6f9 --- /dev/null +++ b/sources_non_forked/cocoa.vim/lib/cocoa_indexes/types.txt @@ -0,0 +1,457 @@ +NSAccessibilityPriorityLevel +NSActivityOptions +NSAlertStyle +NSAlignmentOptions +NSAnimationBlockingMode +NSAnimationCurve +NSAnimationEffect +NSAnimationProgress +NSAppleEventManagerSuspensionID +NSApplicationActivationOptions +NSApplicationActivationPolicy +NSApplicationDelegateReply +NSApplicationOcclusionState +NSApplicationPresentationOptions +NSApplicationPrintReply +NSApplicationTerminateReply +NSAttributeType +NSAttributedStringEnumerationOptions +NSBackgroundStyle +NSBackingStoreType +NSBezelStyle +NSBezierPathElement +NSBinarySearchingOptions +NSBitmapFormat +NSBitmapImageFileType +NSBorderType +NSBoxType +NSBrowserColumnResizingType +NSBrowserDropOperation +NSButtonType +NSByteCountFormatterCountStyle +NSByteCountFormatterUnits +NSCalculationError +NSCalendarOptions +NSCalendarUnit +NSCellAttribute +NSCellImagePosition +NSCellStateValue +NSCellType +NSCharacterCollection +NSCollectionViewDropOperation +NSColorPanelMode +NSColorRenderingIntent +NSColorSpaceModel +NSComparisonPredicateModifier +NSComparisonPredicateOptions +NSComparisonResult +NSCompositingOperation +NSCompoundPredicateType +NSControlCharacterAction +NSControlSize +NSControlTint +NSCorrectionIndicatorType +NSCorrectionResponse +NSDataReadingOptions +NSDataSearchOptions +NSDataWritingOptions +NSDateFormatterBehavior +NSDateFormatterStyle +NSDatePickerElementFlags +NSDatePickerMode +NSDatePickerStyle +NSDeleteRule +NSDirectoryEnumerationOptions +NSDocumentChangeType +NSDragOperation +NSDraggingContext +NSDraggingFormation +NSDraggingItemEnumerationOptions +NSDrawerState +NSEntityMappingType +NSEnumerationOptions +NSEventGestureAxis +NSEventMask +NSEventPhase +NSEventSwipeTrackingOptions +NSEventType +NSExpressionType +NSFetchRequestResultType +NSFileCoordinatorReadingOptions +NSFileCoordinatorWritingOptions +NSFileManagerItemReplacementOptions +NSFileVersionAddingOptions +NSFileVersionReplacingOptions +NSFileWrapperReadingOptions +NSFileWrapperWritingOptions +NSFindPanelAction +NSFindPanelSubstringMatchType +NSFocusRingPlacement +NSFocusRingType +NSFontAction +NSFontCollectionVisibility +NSFontFamilyClass +NSFontRenderingMode +NSFontSymbolicTraits +NSFontTraitMask +NSGlyph +NSGlyphInscription +NSGlyphLayoutMode +NSGlyphProperty +NSGradientDrawingOptions +NSGradientType +NSHTTPCookieAcceptPolicy +NSHashEnumerator +NSHashTableOptions +NSImageAlignment +NSImageCacheMode +NSImageFrameStyle +NSImageInterpolation +NSImageLoadStatus +NSImageRepLoadStatus +NSImageScaling +NSInsertionPosition +NSInteger +NSJSONReadingOptions +NSJSONWritingOptions +NSKeyValueChange +NSKeyValueObservingOptions +NSKeyValueSetMutationKind +NSLayoutAttribute +NSLayoutConstraintOrientation +NSLayoutDirection +NSLayoutFormatOptions +NSLayoutPriority +NSLayoutRelation +NSLayoutStatus +NSLevelIndicatorStyle +NSLineBreakMode +NSLineCapStyle +NSLineJoinStyle +NSLineMovementDirection +NSLineSweepDirection +NSLinguisticTaggerOptions +NSLocaleLanguageDirection +NSManagedObjectContextConcurrencyType +NSMapEnumerator +NSMapTableOptions +NSMatchingFlags +NSMatchingOptions +NSMatrixMode +NSMediaLibrary +NSMenuProperties +NSMergePolicyType +NSModalSession +NSMultibyteGlyphPacking +NSNetServiceOptions +NSNetServicesError +NSNotificationCoalescing +NSNotificationSuspensionBehavior +NSNumberFormatterBehavior +NSNumberFormatterPadPosition +NSNumberFormatterRoundingMode +NSNumberFormatterStyle +NSOpenGLContextAuxiliary +NSOpenGLPixelFormatAttribute +NSOpenGLPixelFormatAuxiliary +NSOperationQueuePriority +NSPDFPanelOptions +NSPageControllerTransitionStyle +NSPaperOrientation +NSPasteboardReadingOptions +NSPasteboardWritingOptions +NSPathStyle +NSPersistentStoreRequestType +NSPersistentStoreUbiquitousTransitionType +NSPoint +NSPointerFunctionsOptions +NSPointingDeviceType +NSPopUpArrowPosition +NSPopoverAppearance +NSPopoverBehavior +NSPostingStyle +NSPredicateOperatorType +NSPrintPanelOptions +NSPrintRenderingQuality +NSPrinterTableStatus +NSPrintingOrientation +NSPrintingPageOrder +NSPrintingPaginationMode +NSProgressIndicatorStyle +NSProgressIndicatorThickness +NSProgressIndicatorThreadInfo +NSPropertyListFormat +NSPropertyListMutabilityOptions +NSPropertyListReadOptions +NSPropertyListWriteOptions +NSQTMovieLoopMode +NSRange +NSRect +NSRectEdge +NSRegularExpressionOptions +NSRelativePosition +NSRemoteNotificationType +NSRequestUserAttentionType +NSRoundingMode +NSRuleEditorNestingMode +NSRuleEditorRowType +NSRulerOrientation +NSSaveOperationType +NSSaveOptions +NSScreenAuxiliaryOpaque +NSScrollArrowPosition +NSScrollElasticity +NSScrollViewFindBarPosition +NSScrollerArrow +NSScrollerKnobStyle +NSScrollerPart +NSScrollerStyle +NSSearchPathDirectory +NSSearchPathDomainMask +NSSegmentStyle +NSSegmentSwitchTracking +NSSelectionAffinity +NSSelectionDirection +NSSelectionGranularity +NSSharingContentScope +NSSize +NSSliderType +NSSnapshotEventType +NSSocketNativeHandle +NSSortOptions +NSSpeechBoundary +NSSplitViewDividerStyle +NSStackViewGravity +NSStreamEvent +NSStreamStatus +NSStringCompareOptions +NSStringDrawingOptions +NSStringEncoding +NSStringEncodingConversionOptions +NSStringEnumerationOptions +NSSwappedDouble +NSSwappedFloat +NSTIFFCompression +NSTabState +NSTabViewType +NSTableViewAnimationOptions +NSTableViewColumnAutoresizingStyle +NSTableViewDraggingDestinationFeedbackStyle +NSTableViewDropOperation +NSTableViewGridLineStyle +NSTableViewRowSizeStyle +NSTableViewSelectionHighlightStyle +NSTaskTerminationReason +NSTestComparisonOperation +NSTextAlignment +NSTextBlockDimension +NSTextBlockLayer +NSTextBlockValueType +NSTextBlockVerticalAlignment +NSTextCheckingType +NSTextCheckingTypes +NSTextFieldBezelStyle +NSTextFinderAction +NSTextFinderMatchingType +NSTextLayoutOrientation +NSTextStorageEditActions +NSTextTabType +NSTextTableLayoutAlgorithm +NSTextWritingDirection +NSThreadPrivate +NSTickMarkPosition +NSTimeInterval +NSTimeZoneNameStyle +NSTitlePosition +NSTokenStyle +NSToolTipTag +NSToolbarDisplayMode +NSToolbarSizeMode +NSTouchPhase +NSTrackingAreaOptions +NSTrackingRectTag +NSTypesetterBehavior +NSTypesetterControlCharacterAction +NSTypesetterGlyphInfo +NSUInteger +NSURLBookmarkCreationOptions +NSURLBookmarkFileCreationOptions +NSURLBookmarkResolutionOptions +NSURLCacheStoragePolicy +NSURLCredentialPersistence +NSURLHandleStatus +NSURLRequestCachePolicy +NSURLRequestNetworkServiceType +NSURLSessionAuthChallengeDisposition +NSURLSessionResponseDisposition +NSURLSessionTaskState +NSUnderlineStyle +NSUsableScrollerParts +NSUserInterfaceLayoutDirection +NSUserInterfaceLayoutOrientation +NSUserNotificationActivationType +NSViewLayerContentsPlacement +NSViewLayerContentsRedrawPolicy +NSVolumeEnumerationOptions +NSWhoseSubelementIdentifier +NSWindingRule +NSWindowAnimationBehavior +NSWindowBackingLocation +NSWindowButton +NSWindowCollectionBehavior +NSWindowDepth +NSWindowNumberListOptions +NSWindowOcclusionState +NSWindowOrderingMode +NSWindowSharingType +NSWorkspaceIconCreationOptions +NSWorkspaceLaunchOptions +NSWritingDirection +NSXMLDTDNodeKind +NSXMLDocumentContentKind +NSXMLNodeKind +NSXMLParserError +NSXMLParserExternalEntityResolvingPolicy +NSXPCConnectionOptions +NSZone +UIAccelerationValue +UIAccessibilityNavigationStyle +UIAccessibilityNotifications +UIAccessibilityScrollDirection +UIAccessibilityTraits +UIAccessibilityZoomType +UIActionSheetStyle +UIActivityCategory +UIActivityIndicatorViewStyle +UIAlertActionStyle +UIAlertControllerStyle +UIAlertViewStyle +UIApplicationState +UIAttachmentBehaviorType +UIBackgroundFetchResult +UIBackgroundRefreshStatus +UIBackgroundTaskIdentifier +UIBarButtonItemStyle +UIBarButtonSystemItem +UIBarMetrics +UIBarPosition +UIBarStyle +UIBaselineAdjustment +UIBlurEffectStyle +UIButtonType +UICollectionElementCategory +UICollectionUpdateAction +UICollectionViewScrollDirection +UICollectionViewScrollPosition +UICollisionBehaviorMode +UIControlContentHorizontalAlignment +UIControlContentVerticalAlignment +UIControlEvents +UIControlState +UIDataDetectorTypes +UIDatePickerMode +UIDeviceBatteryState +UIDeviceOrientation +UIDocumentChangeKind +UIDocumentMenuOrder +UIDocumentPickerMode +UIDocumentSaveOperation +UIDocumentState +UIEdgeInsets +UIEventSubtype +UIEventType +UIFontDescriptorClass +UIFontDescriptorSymbolicTraits +UIGestureRecognizerState +UIGuidedAccessRestrictionState +UIImageOrientation +UIImagePickerControllerCameraCaptureMode +UIImagePickerControllerCameraDevice +UIImagePickerControllerCameraFlashMode +UIImagePickerControllerQualityType +UIImagePickerControllerSourceType +UIImageRenderingMode +UIImageResizingMode +UIInputViewStyle +UIInterfaceOrientation +UIInterfaceOrientationMask +UIInterpolatingMotionEffectType +UIKeyModifierFlags +UIKeyboardAppearance +UIKeyboardType +UILayoutConstraintAxis +UILayoutPriority +UILineBreakMode +UIMenuControllerArrowDirection +UIModalPresentationStyle +UIModalTransitionStyle +UINavigationControllerOperation +UIOffset +UIPageViewControllerNavigationDirection +UIPageViewControllerNavigationOrientation +UIPageViewControllerSpineLocation +UIPageViewControllerTransitionStyle +UIPopoverArrowDirection +UIPrintInfoDuplex +UIPrintInfoOrientation +UIPrintInfoOutputType +UIPrinterJobTypes +UIProgressViewStyle +UIPushBehaviorMode +UIRectCorner +UIRectEdge +UIRemoteNotificationType +UIReturnKeyType +UIScreenOverscanCompensation +UIScrollViewIndicatorStyle +UIScrollViewKeyboardDismissMode +UISearchBarIcon +UISearchBarStyle +UISegmentedControlSegment +UISegmentedControlStyle +UISplitViewControllerDisplayMode +UIStatusBarAnimation +UIStatusBarStyle +UISwipeGestureRecognizerDirection +UISystemAnimation +UITabBarItemPositioning +UITabBarSystemItem +UITableViewCellAccessoryType +UITableViewCellEditingStyle +UITableViewCellSelectionStyle +UITableViewCellSeparatorStyle +UITableViewCellStateMask +UITableViewCellStyle +UITableViewRowActionStyle +UITableViewRowAnimation +UITableViewScrollPosition +UITableViewStyle +UITextAlignment +UITextAutocapitalizationType +UITextAutocorrectionType +UITextBorderStyle +UITextDirection +UITextFieldViewMode +UITextGranularity +UITextLayoutDirection +UITextSpellCheckingType +UITextStorageDirection +UITextWritingDirection +UITouchPhase +UIUserInterfaceIdiom +UIUserInterfaceLayoutDirection +UIUserInterfaceSizeClass +UIUserNotificationActionContext +UIUserNotificationActivationMode +UIUserNotificationType +UIViewAnimationCurve +UIViewAnimationOptions +UIViewAnimationTransition +UIViewAutoresizing +UIViewContentMode +UIViewKeyframeAnimationOptions +UIViewTintAdjustmentMode +UIWebPaginationBreakingMode +UIWebPaginationMode +UIWebViewNavigationType +UIWindowLevel \ No newline at end of file diff --git a/sources_non_forked/cocoa.vim/lib/extras/README-if-you-like b/sources_non_forked/cocoa.vim/lib/extras/README-if-you-like new file mode 100644 index 00000000..c93dc3ad --- /dev/null +++ b/sources_non_forked/cocoa.vim/lib/extras/README-if-you-like @@ -0,0 +1,2 @@ +These are the files I used to generate cocoa_indexes and cocoa_keywords.vim +You can delete them if you want; I've left them here in case you're curious. diff --git a/sources_non_forked/cocoa.vim/lib/extras/build_syntaxfile.py b/sources_non_forked/cocoa.vim/lib/extras/build_syntaxfile.py new file mode 100755 index 00000000..26b22467 --- /dev/null +++ b/sources_non_forked/cocoa.vim/lib/extras/build_syntaxfile.py @@ -0,0 +1,94 @@ +#!/usr/bin/python +'''Builds Vim syntax file for Cocoa keywords.''' +import sys, datetime +import cocoa_definitions + +def usage(): + print 'usage: build_syntaxfile.py [outputfile]' + return -1 + +def generate_syntax_file(): + '''Returns a list of lines for a Vim syntax file of Cocoa keywords.''' + dir = './cocoa_indexes/' + cocoa_definitions.extract_files_to(dir) + + # Normal classes & protocols need to be differentiated in syntax, so + # we need to generate them again. + headers = ' '.join(cocoa_definitions.default_headers()) + + output = \ + ['" Description: Syntax highlighting for the cocoa.vim plugin.', + '" Adds highlighting for Cocoa keywords (classes, types, etc.).', + '" Last Generated: ' + datetime.date.today().strftime('%B %d, %Y'), + ''] + + output += ['" Cocoa Functions', + 'syn keyword cocoaFunction containedin=objcMessage ' + + join_lines(read_file(dir + 'functions.txt')), + '', + '" Cocoa Classes', + 'syn keyword cocoaClass containedin=objcMessage ' + + join_lines(get_classes(headers)), + '', + '" Cocoa Protocol Classes', + 'syn keyword cocoaProtocol containedin=objcProtocol ' + + join_lines(get_protocol_classes(headers)), + '', + '" Cocoa Types', + 'syn keyword cocoaType containedin=objcMessage CGFloat ' + + join_lines(read_file(dir + 'types.txt')), + '', + '" Cocoa Constants', + 'syn keyword cocoaConstant containedin=objcMessage ' + + join_lines(read_file(dir + 'constants.txt')), + '', + '" Cocoa Notifications', + 'syn keyword cocoaNotification containedin=objcMessage ' + + join_lines(read_file(dir + 'notifications.txt')), + ''] + + output += ['hi link cocoaFunction Keyword', + 'hi link cocoaClass Special', + 'hi link cocoaProtocol cocoaClass', + 'hi link cocoaType Type', + 'hi link cocoaConstant Constant', + 'hi link cocoaNotification Constant'] + return output + +def read_file(fname): + '''Returns the lines as a string for the given filename.''' + f = open(fname, 'r') + lines = f.read() + f.close() + return lines + +def join_lines(lines): + '''Returns string of lines with newlines converted to spaces.''' + if type(lines).__name__ == 'str': + return lines.replace('\n', ' ') + else: + line = ([line[:-1] if line[-1] == '\n' else line for line in lines]) + return ' '.join(line) + +def get_classes(header_files): + '''Returns @interface classes.''' + return cocoa_definitions.match_output("grep -ho '@interface \(NS\|UI\)[A-Za-z]*' " + + header_files, '(NS|UI)\w+', 0) + +def get_protocol_classes(header_files): + '''Returns @protocol classes.''' + return cocoa_definitions.match_output("grep -ho '@protocol \(NS\|UI\)[A-Za-z]*' " + + header_files, '(NS|UI)\w+', 0) + +def output_file(fname=None): + '''Writes syntax entries to file or prints them if no file is given.''' + if fname: + cocoa_definitions.write_file(fname, generate_syntax_file()) + else: + print "\n".join(generate_syntax_file()) + +if __name__ == '__main__': + if '-h' in sys.argv or '--help' in sys.argv: + sys.exit(usage()) + else: + output_file(sys.argv[1] if len(sys.argv) > 1 else None) diff --git a/sources_non_forked/cocoa.vim/lib/extras/cocoa_classes.py b/sources_non_forked/cocoa.vim/lib/extras/cocoa_classes.py new file mode 100755 index 00000000..cd52baba --- /dev/null +++ b/sources_non_forked/cocoa.vim/lib/extras/cocoa_classes.py @@ -0,0 +1,64 @@ +#!/usr/bin/python +''' +Creates text file of Cocoa superclasses in given filename or in +./cocoa_indexes/classes.txt by default. +''' +import os, re +from cocoa_definitions import write_file, find +from commands import getoutput + +# We need find_headers() to return a dictionary instead of a list +def find_headers(root_folder, frameworks): + '''Returns a dictionary of the headers for each given framework.''' + headers_and_frameworks = {} + folder = root_folder + '/System/Library/Frameworks/' + for framework in frameworks: + bundle = folder + framework + '.framework' + if os.path.isdir(bundle): + headers_and_frameworks[framework] = ' '.join(find(bundle, '.h')) + return headers_and_frameworks + +def get_classes(header_files_and_frameworks): + '''Returns list of Cocoa Protocols classes & their framework.''' + classes = {} + for framework, files in header_files_and_frameworks: + for line in getoutput(r"grep -ho '@\(interface\|protocol\) [A-Z]\w\+' " + + files).split("\n"): + cocoa_class = re.search(r'[A-Z]\w+', line) + if cocoa_class and not classes.has_key(cocoa_class.group(0)): + classes[cocoa_class.group(0)] = framework + classes = classes.items() + classes.sort() + return classes + +def get_superclasses(classes_and_frameworks): + ''' + Given a list of Cocoa classes & their frameworks, returns a list of their + superclasses in the form: "class\|superclass\|superclass\|...". + ''' + args = '' + for classname, framework in classes_and_frameworks: + args += classname + ' ' + framework + ' ' + return getoutput('./superclasses ' + args).split("\n") + +def output_file(fname=None): + '''Output text file of Cocoa classes to given filename.''' + if fname is None: + fname = './cocoa_indexes/classes.txt' + if not os.path.isdir(os.path.dirname(fname)): + os.mkdir(os.path.dirname(fname)) + + cocoa_frameworks = ('Foundation', 'AppKit', 'AddressBook', 'CoreData', + 'PreferencePanes', 'QTKit', 'ScreenSaver', + 'SyncServices', 'WebKit') + iphone_frameworks = ('UIKit', 'GameKit') + iphone_sdk_path = '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk' + headers_and_frameworks = find_headers('', cocoa_frameworks).items() + \ + find_headers(iphone_sdk_path, iphone_frameworks).items() + + superclasses = get_superclasses(get_classes(headers_and_frameworks)) + write_file(fname, superclasses) + +if __name__ == '__main__': + from sys import argv + output_file(argv[1] if len(argv) > 1 else None) diff --git a/sources_non_forked/cocoa.vim/lib/extras/cocoa_definitions.py b/sources_non_forked/cocoa.vim/lib/extras/cocoa_definitions.py new file mode 100755 index 00000000..17eca837 --- /dev/null +++ b/sources_non_forked/cocoa.vim/lib/extras/cocoa_definitions.py @@ -0,0 +1,100 @@ +#!/usr/bin/python +'''Creates a folder containing text files of Cocoa keywords.''' +import os, commands, re +from sys import argv + +def find(searchpath, ext): + '''Mimics the "find searchpath -name *.ext" unix command.''' + results = [] + for path, dirs, files in os.walk(searchpath): + for filename in files: + if filename.endswith(ext): + results.append(os.path.join(path, filename)) + return results + +def find_headers(root_folder, frameworks): + '''Returns list of the header files for the given frameworks.''' + headers = [] + folder = root_folder + '/System/Library/Frameworks/' + for framework in frameworks: + headers.extend(find(folder + framework + '.framework', '.h')) + return headers + +def default_headers(): + '''Headers for common Cocoa frameworks.''' + cocoa_frameworks = ('Foundation', 'CoreFoundation', 'AppKit', + 'AddressBook', 'CoreData', 'PreferencePanes', 'QTKit', + 'ScreenSaver', 'SyncServices', 'WebKit') + iphone_frameworks = ('UIKit', 'GameKit') + iphone_sdk_path = '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk' + return find_headers('', cocoa_frameworks) + \ + find_headers(iphone_sdk_path, iphone_frameworks) + +def match_output(command, regex, group_num): + ''' + Returns an ordered list of all matches of the supplied regex for the + output of the given command. + ''' + results = [] + for line in commands.getoutput(command).split("\n"): + match = re.search(regex, line) + if match and not match.group(group_num) in results: + results.append(match.group(group_num)) + results.sort() + return results + +def get_functions(header_files): + '''Returns list of Cocoa Functions.''' + lines = match_output(r"grep -h '^[A-Z][A-Z_]* [^;]* \**\(NS\|UI\)\w\+ *(' " + + header_files, r'((NS|UI)\w+)\s*\(.*?\)', 1) + lines = [format_function_line(line) for line in lines] + lines += match_output(r"grep -h '^#define \(NS\|UI\)\w\+ *(' " + + header_files, r'((NS|UI)\w+)\s*\(.*?\)', 1) + return lines + +def format_function_line(line): + # line = line.replace('NSInteger', 'int') + # line = line.replace('NSUInteger', 'unsigned int') + # line = line.replace('CGFloat', 'float') + return re.sub(r'void(\s*[^*])', r'\1', line) + +def get_types(header_files): + '''Returns a list of Cocoa Types.''' + return match_output(r"grep -h 'typedef .* _*\(NS\|UI\)[A-Za-z]*' " + + header_files, r'((NS|UI)[A-Za-z]+)\)?\s*(;|{)', 1) + +def get_constants(header_files): + '''Returns a list of Cocoa Constants.''' + return match_output(r"awk '/^(typedef )?(enum|NS_(ENUM|OPTIONS)\(.*\)) .*\{/ {pr = 1;} /\}/ {pr = 0;}" + r"{ if(pr) print $0; }' " + header_files, + r'^\s*((NS|UI)[A-Z][A-Za-z0-9_]*)', 1) + +def get_notifications(header_files): + '''Returns a list of Cocoa Notifications.''' + return match_output(r"egrep -h '\*(\s*const\s+)?\s*(NS|UI).*Notification' " + + header_files, r'(NS|UI)\w*Notification', 0) + +def write_file(filename, lines): + '''Attempts to write list to file or exits with error if it can't.''' + try: + f = open(filename, 'w') + except IOError, error: + raise SystemExit(argv[0] + ': %s' % error) + f.write("\n".join(lines)) + f.close() + +def extract_files_to(dirname=None): + '''Extracts .txt files to given directory or ./cocoa_indexes by default.''' + if dirname is None: + dirname = './cocoa_indexes' + if not os.path.isdir(dirname): + os.mkdir(dirname) + headers = ' '.join(default_headers()) + + write_file(dirname + '/functions.txt', get_functions (headers)) + write_file(dirname + '/types.txt', get_types (headers)) + write_file(dirname + '/constants.txt', get_constants (headers)) + write_file(dirname + '/notifications.txt', get_notifications(headers)) + +if __name__ == '__main__': + extract_files_to(argv[1] if len(argv) > 1 else None) diff --git a/sources_non_forked/cocoa.vim/lib/extras/cocoa_definitions.pyc b/sources_non_forked/cocoa.vim/lib/extras/cocoa_definitions.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73818480adc55f0ef4b9c08d7ee439bb63d06bd4 GIT binary patch literal 5478 zcmcgwZFdvL6`qykS8OmQ#V04FY$+7UzzW*5Bq1r`HQ^)}DnZFH!h4q8k-e6*D|SYH zDfX9=KhxjR&;5{({SEyA?epA`WJ8jklXINf-tnE8J2UtF-kI{h=Vzz>weciY!=Ez# ze~!<5hbB>K6|JX|lInVD6@Y_FYPB?i%WAbOa9MRLsyCrlCzO{|)VEkXsgel+rc^R1 zz_d!H1ej6Dv;eaznGxWaN@fL^Q^_#_=2bE$z;Tt#3vhy@B*)dapys5~iz+#xIwe*7 zQ)zThDLtXyfW!sWsi@)~>;is21A!$@cp2C!sb=*gS^OByokB-e8$a^fc{kC8ALp5k z(k#u^eXDn@-%h)j&fET-JkBG(qj$ISA~8YwAN;ITJ?vpCXrf|$D=q<;!Z(TU4nEUG zv#!*BN$rHnDz)jUJw;0HzF1MMvf9UAMeR?holn)?1V%qp`;%&KQf-#ho=3#uvf3-D z&9bbnsLctrS0=(6$Iz?G3V+XDomS6)))acoA93o#w3o)lw;S3&*G{vEZqUuy@@m1OU!m^H!Lxtejj~7;D!Qh z=4n8qu7$PFqS=$vz$bT1XeMsq%pSv)t?$&n0iM; zKSiF_p@vRU!mXh*VHA_RCkWcdonufN6 zA~SwBHI^ntG3%{qcO= zQ0BqG0%|bWsPdmE3{ru@8uRE^MfS%46?tw$XZE7AgXN+tN12iJL#!FB8e<*3ey9@a zCmbGq0)63(dYXlv&UrD06fKGjir{PT1-_!`0leNA9!itYsc41NDR zR(&a=H}HJAeXo~iLnj}zXaW(;{d|xm5zWXR=dpRA4-L_pZuR?LrPflaw~_=_Zf@tf za~xvdjcjDe&ErD1b)mCZKaMi(EdS3>MoXJ

@`bwsc`Bi{@??H+8X<#z5sU&-6>; zQiD$)5TZ|g0V@G)G~hZ2>87#JYUPM{n^w1VJi7P#hWk5{3-TOqCQe)};K-c`@myXelBwd|14MCj_PTTe$_f1JO#7 z%-0N4h`^f&RtQrSx&X2bQcZD|Ez^l45=5}hlneqH8R*ay^X99w3V+XlwK=8UDCGfa zI=SZ{W7fydD7rSbPsV{R>URBJWaAB&N*VXefR+lJLa*x`@j(pBM)|<@2jc+g zV&N!334&qPovqTEBx4LGjb(gV*Vb(yZennVm4sGkaUqwOWNy942mJ=4vt$O77uMxJ z8qjc0K@<|*=3EkHgIeZeMtvFtxzyMeZ~yxgj;G+TR5AGB(% z?baoKxq8tz3?o&HV;G~CYApk_VEJaNmXb?z;jMjtBUxViKd_TnXybQ4w~PS{cM($F zkiw9vb8&$}c1b66g$Sj{Y16n0=;*b|ObkmM(_#V)jBAnwD0ap>>6A*AX{6%xrvN}X zs3W0Q=#&|bu1L+V81A~2r%4qOd%m{(qGnhDw5~Zh)VP+2X7JJl#-D|^2GxF@$MA4f z5zBmw3F?9t_KsyXt5PZb3bP~AipC+t8P}8DzD6~42`FR3vKWI2_`$Lt9x^9dT6E>F zFP33YXMjI4sL?pgs&*4{s@~Xp?d;0Qgx2Dq4+-Hr+9Grqqe7BxKEv*YT(iRYse(F( zWj`h;Bz$8dWc)ztf@r(rU#zcHN3yEjtZGEDy_IHIy|?o8;ohUiPaZs4Y1Zgxty&Gj zY`w1gult4nnSbrZzF%+ckGfZH?7#NYcC}yB{C<&U)<1vshQALnp9Mi{6zR}+DQfX} z=;7*>kKygDLc&6ml!;-RC+eecARW9I=iRn)$Xpu zI-{hXWtUV1_oL3NDn3^p?oS?aF=7xR*ZW8-s3J};p}zQ=r!r4{!~0Z)iHBv0R4|zH zIEwo&iVi#`G$liun>g;4#bu~(amUU5?IN|>#R~Ko!cl|xdIx2(&s(dnivj~_+fS_@ zN7+RifGnl9MXbWtC;kQF3X2tYjU|7mlrt%^A3VCp9ppOTu3`7Ec>^d)lD`npV0|Xt zxSJa-;jF>b()a@>cwk$mg_@%eEv&|c5J_SW(HmxzvUdu1++TX9ozai9CmH4MK%>s4 zRA*WhzhG2GWr>Fp(2GhEFAvNyo-)^EM5+R+1sKpGG=;JX%E1r{1jveemDLgov!M!6 z#tw&ZMMf3%z2ONA&whV+62r$14THj_)O_Y1NWRB=ehl>ncKk{M)w^mDuL?T0d9h0? z2!@XVxLE2P6reA6{b9)+$Q|UJc~O%u6;^#zDc~NsW924Vm#{5e*67%J6laOC$f38~ zhL|f=+JF>`E4XAdXb0{Egzl3XQ0ofF4j{3i#s#8KJq^C)G(KX(=c)#u5hR<7RRW(c zB@KG)(VG)5OY)o&qfX&7SZMRVU`*Ilr8$%+i{65_SX%P x5$LEMk*0Cpr@cHGboHO;NQU*wq<7w1D9y~wOwY{D%;W#$%!GV1bMtfFe*sAj7E}NL literal 0 HcmV?d00001 diff --git a/sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/classes.txt b/sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/classes.txt new file mode 100644 index 00000000..9854451d --- /dev/null +++ b/sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/classes.txt @@ -0,0 +1,990 @@ +ABAddressBook\|NSObject +ABGroup\|ABRecord\|NSObject +ABImageClient +ABMultiValue\|NSObject +ABMutableMultiValue\|ABMultiValue\|NSObject +ABPeoplePickerView\|NSView\|NSResponder\|NSObject +ABPerson\|ABRecord\|NSObject +ABPersonPicker +ABPersonPickerDelegate +ABPersonView\|NSView\|NSResponder\|NSObject +ABRecord\|NSObject +ABSearchElement\|NSObject +CIColor\|NSObject +CIImage\|NSObject +DOMAbstractView\|DOMObject\|WebScriptObject\|NSObject +DOMAttr\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMBlob\|DOMObject\|WebScriptObject\|NSObject +DOMCDATASection\|DOMText\|DOMCharacterData\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMCSSCharsetRule\|DOMCSSRule\|DOMObject\|WebScriptObject\|NSObject +DOMCSSFontFaceRule\|DOMCSSRule\|DOMObject\|WebScriptObject\|NSObject +DOMCSSImportRule\|DOMCSSRule\|DOMObject\|WebScriptObject\|NSObject +DOMCSSMediaRule\|DOMCSSRule\|DOMObject\|WebScriptObject\|NSObject +DOMCSSPageRule\|DOMCSSRule\|DOMObject\|WebScriptObject\|NSObject +DOMCSSPrimitiveValue\|DOMCSSValue\|DOMObject\|WebScriptObject\|NSObject +DOMCSSRule\|DOMObject\|WebScriptObject\|NSObject +DOMCSSRuleList\|DOMObject\|WebScriptObject\|NSObject +DOMCSSStyleDeclaration\|DOMObject\|WebScriptObject\|NSObject +DOMCSSStyleRule\|DOMCSSRule\|DOMObject\|WebScriptObject\|NSObject +DOMCSSStyleSheet\|DOMStyleSheet\|DOMObject\|WebScriptObject\|NSObject +DOMCSSUnknownRule\|DOMCSSRule\|DOMObject\|WebScriptObject\|NSObject +DOMCSSValue\|DOMObject\|WebScriptObject\|NSObject +DOMCSSValueList\|DOMCSSValue\|DOMObject\|WebScriptObject\|NSObject +DOMCharacterData\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMComment\|DOMCharacterData\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMCounter\|DOMObject\|WebScriptObject\|NSObject +DOMDocument\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMDocumentFragment\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMDocumentType\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMEntity\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMEntityReference\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMEvent\|DOMObject\|WebScriptObject\|NSObject +DOMEventListener +DOMEventTarget +DOMFile\|DOMBlob\|DOMObject\|WebScriptObject\|NSObject +DOMFileList\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLAnchorElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLAppletElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLAreaElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLBRElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLBaseElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLBaseFontElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLBodyElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLButtonElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLCollection\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLDListElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLDirectoryElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLDivElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLDocument\|DOMDocument\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLEmbedElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLFieldSetElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLFontElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLFormElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLFrameElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLFrameSetElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLHRElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLHeadElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLHeadingElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLHtmlElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLIFrameElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLImageElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLInputElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLLIElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLLabelElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLLegendElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLLinkElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLMapElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLMarqueeElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLMenuElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLMetaElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLModElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLOListElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLObjectElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLOptGroupElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLOptionElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLOptionsCollection\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLParagraphElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLParamElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLPreElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLQuoteElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLScriptElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLSelectElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLStyleElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLTableCaptionElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLTableCellElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLTableColElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLTableElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLTableRowElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLTableSectionElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLTextAreaElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLTitleElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLUListElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMImplementation\|DOMObject\|WebScriptObject\|NSObject +DOMKeyboardEvent\|DOMUIEvent\|DOMEvent\|DOMObject\|WebScriptObject\|NSObject +DOMMediaList\|DOMObject\|WebScriptObject\|NSObject +DOMMouseEvent\|DOMUIEvent\|DOMEvent\|DOMObject\|WebScriptObject\|NSObject +DOMMutationEvent\|DOMEvent\|DOMObject\|WebScriptObject\|NSObject +DOMNamedNodeMap\|DOMObject\|WebScriptObject\|NSObject +DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMNodeFilter\|DOMObject\|WebScriptObject\|NSObject +DOMNodeIterator\|DOMObject\|WebScriptObject\|NSObject +DOMNodeList\|DOMObject\|WebScriptObject\|NSObject +DOMNotation\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMObject\|WebScriptObject\|NSObject +DOMOverflowEvent\|DOMEvent\|DOMObject\|WebScriptObject\|NSObject +DOMProcessingInstruction\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMProgressEvent\|DOMEvent\|DOMObject\|WebScriptObject\|NSObject +DOMRGBColor\|DOMObject\|WebScriptObject\|NSObject +DOMRange\|DOMObject\|WebScriptObject\|NSObject +DOMRect\|DOMObject\|WebScriptObject\|NSObject +DOMStyleSheet\|DOMObject\|WebScriptObject\|NSObject +DOMStyleSheetList\|DOMObject\|WebScriptObject\|NSObject +DOMText\|DOMCharacterData\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMTreeWalker\|DOMObject\|WebScriptObject\|NSObject +DOMUIEvent\|DOMEvent\|DOMObject\|WebScriptObject\|NSObject +DOMWheelEvent\|DOMMouseEvent\|DOMUIEvent\|DOMEvent\|DOMObject\|WebScriptObject\|NSObject +DOMXPathExpression\|DOMObject\|WebScriptObject\|NSObject +DOMXPathNSResolver +DOMXPathResult\|DOMObject\|WebScriptObject\|NSObject +GKAchievement\|NSObject +GKAchievementChallenge\|GKChallenge\|NSObject +GKAchievementDescription\|NSObject +GKAchievementViewController\|NSViewController\|NSResponder\|NSObject +GKAchievementViewControllerDelegate +GKChallenge\|NSObject +GKChallengeEventHandler\|NSObject +GKChallengeEventHandlerDelegate +GKChallengeListener +GKFriendRequestComposeViewController\|NSViewController\|NSResponder\|NSObject +GKFriendRequestComposeViewControllerDelegate +GKGameCenterControllerDelegate +GKGameCenterViewController\|NSViewController\|NSResponder\|NSObject +GKInvite\|NSObject +GKInviteEventListener +GKLeaderboard\|NSObject +GKLeaderboardSet +GKLeaderboardViewController\|NSViewController\|NSResponder\|NSObject +GKLeaderboardViewControllerDelegate +GKLocalPlayer\|GKPlayer\|NSObject +GKLocalPlayerListener +GKMatch\|NSObject +GKMatchDelegate +GKMatchRequest\|NSObject +GKMatchmaker\|NSObject +GKMatchmakerViewController\|NSViewController\|NSResponder\|NSObject +GKMatchmakerViewControllerDelegate +GKNotificationBanner\|NSObject +GKPeerPickerController +GKPeerPickerControllerDelegate +GKPlayer\|NSObject +GKSavedGame +GKSavedGameListener +GKScore\|NSObject +GKScoreChallenge\|GKChallenge\|NSObject +GKSession\|NSObject +GKSessionDelegate +GKTurnBasedEventHandler\|NSObject +GKTurnBasedEventListener +GKTurnBasedExchangeReply +GKTurnBasedMatch\|NSObject +GKTurnBasedMatchmakerViewController\|NSViewController\|NSResponder\|NSObject +GKTurnBasedMatchmakerViewControllerDelegate +GKTurnBasedParticipant\|NSObject +GKVoiceChat\|NSObject +GKVoiceChatClient +GKVoiceChatService +ISyncChange\|NSObject +ISyncClient\|NSObject +ISyncConflictPropertyType +ISyncFilter\|NSObject +ISyncFiltering +ISyncManager\|NSObject +ISyncRecordReference\|NSObject +ISyncRecordSnapshot\|NSObject +ISyncSession\|NSObject +ISyncSessionDriver\|NSObject +ISyncSessionDriverDataSource +NSATSTypesetter\|NSTypesetter\|NSObject +NSActionCell\|NSCell\|NSObject +NSAffineTransform\|NSObject +NSAlert\|NSObject +NSAlertDelegate +NSAnimatablePropertyContainer +NSAnimation\|NSObject +NSAnimationContext\|NSObject +NSAnimationDelegate +NSAppearance\|NSObject +NSAppearanceCustomization +NSAppleEventDescriptor\|NSObject +NSAppleEventManager\|NSObject +NSAppleScript\|NSObject +NSApplication\|NSResponder\|NSObject +NSApplicationDelegate +NSArchiver\|NSCoder\|NSObject +NSArray\|NSObject +NSArrayController\|NSObjectController\|NSController\|NSObject +NSAssertionHandler\|NSObject +NSAtomicStore\|NSPersistentStore\|NSObject +NSAtomicStoreCacheNode\|NSObject +NSAttributeDescription\|NSPropertyDescription\|NSObject +NSAttributedString\|NSObject +NSAutoreleasePool\|NSObject +NSBezierPath\|NSObject +NSBitmapImageRep\|NSImageRep\|NSObject +NSBlockOperation\|NSOperation\|NSObject +NSBox\|NSView\|NSResponder\|NSObject +NSBrowser\|NSControl\|NSView\|NSResponder\|NSObject +NSBrowserCell\|NSCell\|NSObject +NSBrowserDelegate +NSBundle\|NSObject +NSButton\|NSControl\|NSView\|NSResponder\|NSObject +NSButtonCell\|NSActionCell\|NSCell\|NSObject +NSByteCountFormatter\|NSFormatter\|NSObject +NSCIImageRep\|NSImageRep\|NSObject +NSCache\|NSObject +NSCacheDelegate +NSCachedImageRep\|NSImageRep\|NSObject +NSCachedURLResponse\|NSObject +NSCalendar\|NSObject +NSCalendarDate\|NSDate\|NSObject +NSCell\|NSObject +NSChangeSpelling +NSCharacterSet\|NSObject +NSClassDescription\|NSObject +NSClipView\|NSView\|NSResponder\|NSObject +NSCloneCommand\|NSScriptCommand\|NSObject +NSCloseCommand\|NSScriptCommand\|NSObject +NSCoder\|NSObject +NSCoding +NSCollectionView\|NSView\|NSResponder\|NSObject +NSCollectionViewDelegate +NSCollectionViewItem\|NSViewController\|NSResponder\|NSObject +NSColor\|NSObject +NSColorList\|NSObject +NSColorPanel\|NSPanel\|NSWindow\|NSResponder\|NSObject +NSColorPicker\|NSObject +NSColorPickingCustom +NSColorPickingDefault +NSColorSpace\|NSObject +NSColorWell\|NSControl\|NSView\|NSResponder\|NSObject +NSComboBox\|NSTextField\|NSControl\|NSView\|NSResponder\|NSObject +NSComboBoxCell\|NSTextFieldCell\|NSActionCell\|NSCell\|NSObject +NSComboBoxCellDataSource +NSComboBoxDataSource +NSComboBoxDelegate +NSComparisonPredicate\|NSPredicate\|NSObject +NSCompoundPredicate\|NSPredicate\|NSObject +NSCondition\|NSObject +NSConditionLock\|NSObject +NSConnection\|NSObject +NSConnectionDelegate +NSConstantString\|NSSimpleCString\|NSString\|NSObject +NSControl\|NSView\|NSResponder\|NSObject +NSControlTextEditingDelegate +NSController\|NSObject +NSCopying +NSCountCommand\|NSScriptCommand\|NSObject +NSCountedSet\|NSMutableSet\|NSSet\|NSObject +NSCreateCommand\|NSScriptCommand\|NSObject +NSCursor\|NSObject +NSCustomImageRep\|NSImageRep\|NSObject +NSData\|NSObject +NSDataDetector\|NSRegularExpression\|NSObject +NSDate\|NSObject +NSDateComponents\|NSObject +NSDateFormatter\|NSFormatter\|NSObject +NSDatePicker\|NSControl\|NSView\|NSResponder\|NSObject +NSDatePickerCell\|NSActionCell\|NSCell\|NSObject +NSDatePickerCellDelegate +NSDecimalNumber\|NSNumber\|NSValue\|NSObject +NSDecimalNumberBehaviors +NSDecimalNumberHandler\|NSObject +NSDeleteCommand\|NSScriptCommand\|NSObject +NSDictionary\|NSObject +NSDictionaryController\|NSArrayController\|NSObjectController\|NSController\|NSObject +NSDirectoryEnumerator\|NSEnumerator\|NSObject +NSDiscardableContent +NSDistantObject\|NSProxy +NSDistantObjectRequest\|NSObject +NSDistributedLock\|NSObject +NSDistributedNotificationCenter\|NSNotificationCenter\|NSObject +NSDockTile\|NSObject +NSDockTilePlugIn +NSDocument\|NSObject +NSDocumentController\|NSObject +NSDraggingDestination +NSDraggingImageComponent\|NSObject +NSDraggingInfo +NSDraggingItem\|NSObject +NSDraggingSession\|NSObject +NSDraggingSource +NSDrawer\|NSResponder\|NSObject +NSDrawerDelegate +NSEPSImageRep\|NSImageRep\|NSObject +NSEntityDescription\|NSObject +NSEntityMapping\|NSObject +NSEntityMigrationPolicy\|NSObject +NSEnumerator\|NSObject +NSError\|NSObject +NSEvent\|NSObject +NSException\|NSObject +NSExistsCommand\|NSScriptCommand\|NSObject +NSExpression\|NSObject +NSExpressionDescription\|NSPropertyDescription\|NSObject +NSFastEnumeration +NSFetchRequest\|NSPersistentStoreRequest\|NSObject +NSFetchRequestExpression\|NSExpression\|NSObject +NSFetchedPropertyDescription\|NSPropertyDescription\|NSObject +NSFileCoordinator\|NSObject +NSFileHandle\|NSObject +NSFileManager\|NSObject +NSFileManagerDelegate +NSFilePresenter +NSFileProviderExtension +NSFileSecurity\|NSObject +NSFileVersion\|NSObject +NSFileWrapper\|NSObject +NSFont\|NSObject +NSFontCollection\|NSObject +NSFontDescriptor\|NSObject +NSFontManager\|NSObject +NSFontPanel\|NSPanel\|NSWindow\|NSResponder\|NSObject +NSFormCell\|NSActionCell\|NSCell\|NSObject +NSFormatter\|NSObject +NSGarbageCollector\|NSObject +NSGetCommand\|NSScriptCommand\|NSObject +NSGlyphGenerator\|NSObject +NSGlyphInfo\|NSObject +NSGlyphStorage +NSGradient\|NSObject +NSGraphicsContext\|NSObject +NSHTTPCookie\|NSObject +NSHTTPCookieStorage\|NSObject +NSHTTPURLResponse\|NSURLResponse\|NSObject +NSHashTable\|NSObject +NSHelpManager\|NSObject +NSHost\|NSObject +NSIgnoreMisspelledWords +NSImage\|NSObject +NSImageCell\|NSCell\|NSObject +NSImageDelegate +NSImageRep\|NSObject +NSImageView\|NSControl\|NSView\|NSResponder\|NSObject +NSIncrementalStore\|NSPersistentStore\|NSObject +NSIncrementalStoreNode\|NSObject +NSIndexPath\|NSObject +NSIndexSet\|NSObject +NSIndexSpecifier\|NSScriptObjectSpecifier\|NSObject +NSInputManager\|NSObject +NSInputServer\|NSObject +NSInputServerMouseTracker +NSInputServiceProvider +NSInputStream\|NSStream\|NSObject +NSInvocation\|NSObject +NSInvocationOperation\|NSOperation\|NSObject +NSJSONSerialization\|NSObject +NSKeyedArchiver\|NSCoder\|NSObject +NSKeyedArchiverDelegate +NSKeyedUnarchiver\|NSCoder\|NSObject +NSKeyedUnarchiverDelegate +NSLayoutConstraint\|NSObject +NSLayoutManager\|NSObject +NSLayoutManagerDelegate +NSLevelIndicator\|NSControl\|NSView\|NSResponder\|NSObject +NSLevelIndicatorCell\|NSActionCell\|NSCell\|NSObject +NSLinguisticTagger\|NSObject +NSLocale\|NSObject +NSLock\|NSObject +NSLocking +NSLogicalTest\|NSScriptWhoseTest\|NSObject +NSMachBootstrapServer\|NSPortNameServer\|NSObject +NSMachPort\|NSPort\|NSObject +NSMachPortDelegate +NSManagedObject\|NSObject +NSManagedObjectContext\|NSObject +NSManagedObjectID\|NSObject +NSManagedObjectModel\|NSObject +NSMapTable\|NSObject +NSMappingModel\|NSObject +NSMatrix\|NSControl\|NSView\|NSResponder\|NSObject +NSMatrixDelegate +NSMediaLibraryBrowserController\|NSObject +NSMenu\|NSObject +NSMenuDelegate +NSMenuItem\|NSObject +NSMenuItemCell\|NSButtonCell\|NSActionCell\|NSCell\|NSObject +NSMenuView\|NSView\|NSResponder\|NSObject +NSMergeConflict\|NSObject +NSMergePolicy\|NSObject +NSMessagePort\|NSPort\|NSObject +NSMessagePortNameServer\|NSPortNameServer\|NSObject +NSMetadataItem\|NSObject +NSMetadataQuery\|NSObject +NSMetadataQueryAttributeValueTuple\|NSObject +NSMetadataQueryDelegate +NSMetadataQueryResultGroup\|NSObject +NSMethodSignature\|NSObject +NSMiddleSpecifier\|NSScriptObjectSpecifier\|NSObject +NSMigrationManager\|NSObject +NSMoveCommand\|NSScriptCommand\|NSObject +NSMovie\|NSObject +NSMovieView\|NSView\|NSResponder\|NSObject +NSMutableArray\|NSArray\|NSObject +NSMutableAttributedString\|NSAttributedString\|NSObject +NSMutableCharacterSet\|NSCharacterSet\|NSObject +NSMutableCopying +NSMutableData\|NSData\|NSObject +NSMutableDictionary\|NSDictionary\|NSObject +NSMutableFontCollection\|NSFontCollection\|NSObject +NSMutableIndexSet\|NSIndexSet\|NSObject +NSMutableOrderedSet\|NSOrderedSet\|NSObject +NSMutableParagraphStyle\|NSParagraphStyle\|NSObject +NSMutableSet\|NSSet\|NSObject +NSMutableString\|NSString\|NSObject +NSMutableURLRequest\|NSURLRequest\|NSObject +NSNameSpecifier\|NSScriptObjectSpecifier\|NSObject +NSNetService\|NSObject +NSNetServiceBrowser\|NSObject +NSNetServiceBrowserDelegate +NSNetServiceDelegate +NSNib\|NSObject +NSNibConnector\|NSObject +NSNibControlConnector\|NSNibConnector\|NSObject +NSNibOutletConnector\|NSNibConnector\|NSObject +NSNotification\|NSObject +NSNotificationCenter\|NSObject +NSNotificationQueue\|NSObject +NSNull\|NSObject +NSNumber\|NSValue\|NSObject +NSNumberFormatter\|NSFormatter\|NSObject +NSObject +NSObjectController\|NSController\|NSObject +NSOpenGLContext\|NSObject +NSOpenGLLayer\|CAOpenGLLayer\|CALayer\|NSObject +NSOpenGLPixelBuffer\|NSObject +NSOpenGLPixelFormat\|NSObject +NSOpenGLView\|NSView\|NSResponder\|NSObject +NSOpenPanel\|NSSavePanel\|NSPanel\|NSWindow\|NSResponder\|NSObject +NSOpenSavePanelDelegate +NSOperation\|NSObject +NSOperationQueue\|NSObject +NSOrderedSet\|NSObject +NSOrthography\|NSObject +NSOutlineView\|NSTableView\|NSControl\|NSView\|NSResponder\|NSObject +NSOutlineViewDataSource +NSOutlineViewDelegate +NSOutputStream\|NSStream\|NSObject +NSPDFImageRep\|NSImageRep\|NSObject +NSPDFInfo\|NSObject +NSPDFPanel\|NSObject +NSPICTImageRep\|NSImageRep\|NSObject +NSPageController\|NSViewController\|NSResponder\|NSObject +NSPageControllerDelegate +NSPageLayout\|NSObject +NSPanel\|NSWindow\|NSResponder\|NSObject +NSParagraphStyle\|NSObject +NSPasteboard\|NSObject +NSPasteboardItem\|NSObject +NSPasteboardItemDataProvider +NSPasteboardReading +NSPasteboardWriting +NSPathCell\|NSActionCell\|NSCell\|NSObject +NSPathCellDelegate +NSPathComponentCell\|NSTextFieldCell\|NSActionCell\|NSCell\|NSObject +NSPathControl\|NSControl\|NSView\|NSResponder\|NSObject +NSPathControlDelegate +NSPersistentDocument\|NSDocument\|NSObject +NSPersistentStore\|NSObject +NSPersistentStoreCoordinator\|NSObject +NSPersistentStoreCoordinatorSyncing +NSPersistentStoreRequest\|NSObject +NSPipe\|NSObject +NSPointerArray\|NSObject +NSPointerFunctions\|NSObject +NSPopUpButton\|NSButton\|NSControl\|NSView\|NSResponder\|NSObject +NSPopUpButtonCell\|NSMenuItemCell\|NSButtonCell\|NSActionCell\|NSCell\|NSObject +NSPopover\|NSResponder\|NSObject +NSPopoverDelegate +NSPort\|NSObject +NSPortCoder\|NSCoder\|NSObject +NSPortDelegate +NSPortMessage\|NSObject +NSPortNameServer\|NSObject +NSPositionalSpecifier\|NSObject +NSPredicate\|NSObject +NSPredicateEditor\|NSRuleEditor\|NSControl\|NSView\|NSResponder\|NSObject +NSPredicateEditorRowTemplate\|NSObject +NSPreferencePane\|NSObject +NSPrintInfo\|NSObject +NSPrintOperation\|NSObject +NSPrintPanel\|NSObject +NSPrintPanelAccessorizing +NSPrinter\|NSObject +NSProcessInfo\|NSObject +NSProgress\|NSObject +NSProgressIndicator\|NSView\|NSResponder\|NSObject +NSPropertyDescription\|NSObject +NSPropertyListSerialization\|NSObject +NSPropertyMapping\|NSObject +NSPropertySpecifier\|NSScriptObjectSpecifier\|NSObject +NSProtocolChecker\|NSProxy +NSProxy +NSPurgeableData\|NSMutableData\|NSData\|NSObject +NSQuickDrawView\|NSView\|NSResponder\|NSObject +NSQuitCommand\|NSScriptCommand\|NSObject +NSRandomSpecifier\|NSScriptObjectSpecifier\|NSObject +NSRangeSpecifier\|NSScriptObjectSpecifier\|NSObject +NSRecursiveLock\|NSObject +NSRegularExpression\|NSObject +NSRelationshipDescription\|NSPropertyDescription\|NSObject +NSRelativeSpecifier\|NSScriptObjectSpecifier\|NSObject +NSResponder\|NSObject +NSRuleEditor\|NSControl\|NSView\|NSResponder\|NSObject +NSRuleEditorDelegate +NSRulerMarker\|NSObject +NSRulerView\|NSView\|NSResponder\|NSObject +NSRunLoop\|NSObject +NSRunningApplication\|NSObject +NSSaveChangesRequest\|NSPersistentStoreRequest\|NSObject +NSSavePanel\|NSPanel\|NSWindow\|NSResponder\|NSObject +NSScanner\|NSObject +NSScreen\|NSObject +NSScriptClassDescription\|NSClassDescription\|NSObject +NSScriptCoercionHandler\|NSObject +NSScriptCommand\|NSObject +NSScriptCommandDescription\|NSObject +NSScriptExecutionContext\|NSObject +NSScriptObjectSpecifier\|NSObject +NSScriptSuiteRegistry\|NSObject +NSScriptWhoseTest\|NSObject +NSScrollView\|NSView\|NSResponder\|NSObject +NSScroller\|NSControl\|NSView\|NSResponder\|NSObject +NSSearchField\|NSTextField\|NSControl\|NSView\|NSResponder\|NSObject +NSSearchFieldCell\|NSTextFieldCell\|NSActionCell\|NSCell\|NSObject +NSSecureCoding +NSSecureTextField\|NSTextField\|NSControl\|NSView\|NSResponder\|NSObject +NSSecureTextFieldCell\|NSTextFieldCell\|NSActionCell\|NSCell\|NSObject +NSSegmentedCell\|NSActionCell\|NSCell\|NSObject +NSSegmentedControl\|NSControl\|NSView\|NSResponder\|NSObject +NSServicesMenuRequestor +NSSet\|NSObject +NSSetCommand\|NSScriptCommand\|NSObject +NSShadow\|NSObject +NSSharingService\|NSObject +NSSharingServiceDelegate +NSSharingServicePicker\|NSObject +NSSharingServicePickerDelegate +NSSimpleCString\|NSString\|NSObject +NSSimpleHorizontalTypesetter\|NSTypesetter\|NSObject +NSSlider\|NSControl\|NSView\|NSResponder\|NSObject +NSSliderCell\|NSActionCell\|NSCell\|NSObject +NSSocketPort\|NSPort\|NSObject +NSSocketPortNameServer\|NSPortNameServer\|NSObject +NSSortDescriptor\|NSObject +NSSound\|NSObject +NSSoundDelegate +NSSpecifierTest\|NSScriptWhoseTest\|NSObject +NSSpeechRecognizer\|NSObject +NSSpeechRecognizerDelegate +NSSpeechSynthesizer\|NSObject +NSSpeechSynthesizerDelegate +NSSpellChecker\|NSObject +NSSpellServer\|NSObject +NSSpellServerDelegate +NSSplitView\|NSView\|NSResponder\|NSObject +NSSplitViewDelegate +NSStackView\|NSView\|NSResponder\|NSObject +NSStackViewDelegate +NSStatusBar\|NSObject +NSStatusItem\|NSObject +NSStepper\|NSControl\|NSView\|NSResponder\|NSObject +NSStepperCell\|NSActionCell\|NSCell\|NSObject +NSStream\|NSObject +NSStreamDelegate +NSString\|NSObject +NSStringDrawingContext\|NSObject +NSTabView\|NSView\|NSResponder\|NSObject +NSTabViewDelegate +NSTabViewItem\|NSObject +NSTableCellView\|NSView\|NSResponder\|NSObject +NSTableColumn\|NSObject +NSTableHeaderCell\|NSTextFieldCell\|NSActionCell\|NSCell\|NSObject +NSTableHeaderView\|NSView\|NSResponder\|NSObject +NSTableRowView\|NSView\|NSResponder\|NSObject +NSTableView\|NSControl\|NSView\|NSResponder\|NSObject +NSTableViewDataSource +NSTableViewDelegate +NSTask\|NSObject +NSText\|NSView\|NSResponder\|NSObject +NSTextAlternatives\|NSObject +NSTextAttachment\|NSObject +NSTextAttachmentCell\|NSCell\|NSObject +NSTextAttachmentContainer +NSTextBlock\|NSObject +NSTextCheckingResult\|NSObject +NSTextContainer\|NSObject +NSTextDelegate +NSTextField\|NSControl\|NSView\|NSResponder\|NSObject +NSTextFieldCell\|NSActionCell\|NSCell\|NSObject +NSTextFieldDelegate +NSTextFinder\|NSObject +NSTextFinderBarContainer +NSTextFinderClient +NSTextInput +NSTextInputClient +NSTextInputContext\|NSObject +NSTextLayoutOrientationProvider +NSTextList\|NSObject +NSTextStorage\|NSMutableAttributedString\|NSAttributedString\|NSObject +NSTextStorageDelegate +NSTextTab\|NSObject +NSTextTable\|NSTextBlock\|NSObject +NSTextTableBlock\|NSTextBlock\|NSObject +NSTextView\|NSText\|NSView\|NSResponder\|NSObject +NSTextViewDelegate +NSThread\|NSObject +NSTimeZone\|NSObject +NSTimer\|NSObject +NSTokenField\|NSTextField\|NSControl\|NSView\|NSResponder\|NSObject +NSTokenFieldCell\|NSTextFieldCell\|NSActionCell\|NSCell\|NSObject +NSTokenFieldCellDelegate +NSTokenFieldDelegate +NSToolbar\|NSObject +NSToolbarDelegate +NSToolbarItem\|NSObject +NSToolbarItemGroup\|NSToolbarItem\|NSObject +NSToolbarItemValidations +NSTouch\|NSObject +NSTrackingArea\|NSObject +NSTreeController\|NSObjectController\|NSController\|NSObject +NSTreeNode\|NSObject +NSTypesetter\|NSObject +NSURL\|NSObject +NSURLAuthenticationChallenge\|NSObject +NSURLAuthenticationChallengeSender +NSURLCache\|NSObject +NSURLComponents\|NSObject +NSURLConnection\|NSObject +NSURLConnectionDataDelegate +NSURLConnectionDelegate +NSURLConnectionDownloadDelegate +NSURLCredential\|NSObject +NSURLCredentialStorage\|NSObject +NSURLDownload\|NSObject +NSURLDownloadDelegate +NSURLHandle\|NSObject +NSURLHandleClient +NSURLProtectionSpace\|NSObject +NSURLProtocol\|NSObject +NSURLProtocolClient +NSURLRequest\|NSObject +NSURLResponse\|NSObject +NSURLSession +NSURLSessionConfiguration +NSURLSessionDataDelegate +NSURLSessionDataTask +NSURLSessionDelegate +NSURLSessionDownloadDelegate +NSURLSessionDownloadTask +NSURLSessionTask +NSURLSessionTaskDelegate +NSURLSessionUploadTask +NSUUID\|NSObject +NSUbiquitousKeyValueStore\|NSObject +NSUnarchiver\|NSCoder\|NSObject +NSUndoManager\|NSObject +NSUniqueIDSpecifier\|NSScriptObjectSpecifier\|NSObject +NSUserAppleScriptTask\|NSUserScriptTask\|NSObject +NSUserAutomatorTask\|NSUserScriptTask\|NSObject +NSUserDefaults\|NSObject +NSUserDefaultsController\|NSController\|NSObject +NSUserInterfaceItemIdentification +NSUserInterfaceItemSearching +NSUserInterfaceValidations +NSUserNotification\|NSObject +NSUserNotificationCenter\|NSObject +NSUserNotificationCenterDelegate +NSUserScriptTask\|NSObject +NSUserUnixTask\|NSUserScriptTask\|NSObject +NSValidatedToobarItem +NSValidatedUserInterfaceItem +NSValue\|NSObject +NSValueTransformer\|NSObject +NSView\|NSResponder\|NSObject +NSViewAnimation\|NSAnimation\|NSObject +NSViewController\|NSResponder\|NSObject +NSWhoseSpecifier\|NSScriptObjectSpecifier\|NSObject +NSWindow\|NSResponder\|NSObject +NSWindowController\|NSResponder\|NSObject +NSWindowDelegate +NSWindowRestoration +NSWorkspace\|NSObject +NSXMLDTD\|NSXMLNode\|NSObject +NSXMLDTDNode\|NSXMLNode\|NSObject +NSXMLDocument\|NSXMLNode\|NSObject +NSXMLElement\|NSXMLNode\|NSObject +NSXMLNode\|NSObject +NSXMLParser\|NSObject +NSXMLParserDelegate +NSXPCConnection\|NSObject +NSXPCInterface\|NSObject +NSXPCListener\|NSObject +NSXPCListenerDelegate +NSXPCListenerEndpoint\|NSObject +NSXPCProxyCreating +QTCaptureAudioPreviewOutput\|QTCaptureOutput\|NSObject +QTCaptureConnection\|NSObject +QTCaptureDecompressedAudioOutput\|QTCaptureOutput\|NSObject +QTCaptureDecompressedVideoOutput\|QTCaptureOutput\|NSObject +QTCaptureDevice\|NSObject +QTCaptureDeviceInput\|QTCaptureInput\|NSObject +QTCaptureFileOutput\|QTCaptureOutput\|NSObject +QTCaptureInput\|NSObject +QTCaptureLayer\|CALayer\|NSObject +QTCaptureMovieFileOutput\|QTCaptureFileOutput\|QTCaptureOutput\|NSObject +QTCaptureOutput\|NSObject +QTCaptureSession\|NSObject +QTCaptureVideoPreviewOutput\|QTCaptureOutput\|NSObject +QTCaptureView\|NSView\|NSResponder\|NSObject +QTCompressionOptions\|NSObject +QTDataReference\|NSObject +QTExportOptions\|NSObject +QTExportSession\|NSObject +QTExportSessionDelegate +QTFormatDescription\|NSObject +QTMedia\|NSObject +QTMetadataItem\|NSObject +QTMovie\|NSObject +QTMovieLayer\|CALayer\|NSObject +QTMovieModernizer\|NSObject +QTMovieView\|NSView\|NSResponder\|NSObject +QTSampleBuffer\|NSObject +QTTrack\|NSObject +ScreenSaverDefaults\|NSUserDefaults\|NSObject +ScreenSaverView\|NSView\|NSResponder\|NSObject +UIAcceleration +UIAccelerometer +UIAccelerometerDelegate +UIAccessibilityCustomAction +UIAccessibilityElement +UIAccessibilityIdentification +UIAccessibilityReadingContent +UIActionSheet +UIActionSheetDelegate +UIActivity +UIActivityIndicatorView +UIActivityItemProvider +UIActivityItemSource +UIActivityViewController +UIAdaptivePresentationControllerDelegate +UIAlertAction +UIAlertController +UIAlertView +UIAlertViewDelegate +UIAppearance +UIAppearanceContainer +UIApplication +UIApplicationDelegate +UIAttachmentBehavior +UIBarButtonItem +UIBarItem +UIBarPositioning +UIBarPositioningDelegate +UIBezierPath +UIBlurEffect +UIButton +UICollectionReusableView +UICollectionView +UICollectionViewCell +UICollectionViewController +UICollectionViewDataSource +UICollectionViewDelegate +UICollectionViewDelegateFlowLayout +UICollectionViewFlowLayout +UICollectionViewFlowLayoutInvalidationContext +UICollectionViewLayout +UICollectionViewLayoutAttributes +UICollectionViewLayoutInvalidationContext +UICollectionViewTransitionLayout +UICollectionViewUpdateItem +UICollisionBehavior +UICollisionBehaviorDelegate +UIColor +UIContentContainer +UIControl +UICoordinateSpace +UIDataSourceModelAssociation +UIDatePicker +UIDevice +UIDictationPhrase +UIDocument +UIDocumentInteractionController +UIDocumentInteractionControllerDelegate +UIDocumentMenuDelegate +UIDocumentMenuViewController +UIDocumentPickerDelegate +UIDocumentPickerExtensionViewController +UIDocumentPickerViewController +UIDynamicAnimator +UIDynamicAnimatorDelegate +UIDynamicBehavior +UIDynamicItem +UIDynamicItemBehavior +UIEvent +UIFont +UIFontDescriptor +UIGestureRecognizer +UIGestureRecognizerDelegate +UIGravityBehavior +UIGuidedAccessRestrictionDelegate +UIImage +UIImageAsset +UIImagePickerController +UIImagePickerControllerDelegate +UIImageView +UIInputView +UIInputViewAudioFeedback +UIInputViewController +UIInterpolatingMotionEffect +UIKeyCommand +UIKeyInput +UILabel +UILayoutSupport +UILexicon +UILexiconEntry +UILocalNotification +UILocalizedIndexedCollation +UILongPressGestureRecognizer +UIManagedDocument +UIMarkupTextPrintFormatter +UIMenuController +UIMenuItem +UIMotionEffect +UIMotionEffectGroup +UIMutableUserNotificationAction +UIMutableUserNotificationCategory +UINavigationBar +UINavigationBarDelegate +UINavigationController +UINavigationControllerDelegate +UINavigationItem +UINib +UIObjectRestoration +UIPageControl +UIPageViewController +UIPageViewControllerDataSource +UIPageViewControllerDelegate +UIPanGestureRecognizer +UIPasteboard +UIPercentDrivenInteractiveTransition +UIPickerView +UIPickerViewAccessibilityDelegate +UIPickerViewDataSource +UIPickerViewDelegate +UIPinchGestureRecognizer +UIPopoverBackgroundView +UIPopoverBackgroundViewMethods +UIPopoverController +UIPopoverControllerDelegate +UIPopoverPresentationController +UIPopoverPresentationControllerDelegate +UIPresentationController +UIPrintFormatter +UIPrintInfo +UIPrintInteractionController +UIPrintInteractionControllerDelegate +UIPrintPageRenderer +UIPrintPaper +UIPrinter +UIPrinterPickerController +UIPrinterPickerControllerDelegate +UIProgressView +UIPushBehavior +UIReferenceLibraryViewController +UIRefreshControl +UIResponder +UIRotationGestureRecognizer +UIScreen +UIScreenEdgePanGestureRecognizer +UIScreenMode +UIScrollView +UIScrollViewAccessibilityDelegate +UIScrollViewDelegate +UISearchBar +UISearchBarDelegate +UISearchController +UISearchControllerDelegate +UISearchDisplayController +UISearchDisplayDelegate +UISearchResultsUpdating +UISegmentedControl +UISimpleTextPrintFormatter +UISlider +UISnapBehavior +UISplitViewController +UISplitViewControllerDelegate +UIStateRestoring +UIStepper +UIStoryboard +UIStoryboardPopoverSegue +UIStoryboardSegue +UISwipeGestureRecognizer +UISwitch +UITabBar +UITabBarController +UITabBarControllerDelegate +UITabBarDelegate +UITabBarItem +UITableView +UITableViewCell +UITableViewController +UITableViewDataSource +UITableViewDelegate +UITableViewHeaderFooterView +UITableViewRowAction +UITapGestureRecognizer +UITextChecker +UITextDocumentProxy +UITextField +UITextFieldDelegate +UITextInput +UITextInputDelegate +UITextInputMode +UITextInputStringTokenizer +UITextInputTokenizer +UITextInputTraits +UITextPosition +UITextRange +UITextSelecting +UITextSelectionRect +UITextView +UITextViewDelegate +UIToolbar +UIToolbarDelegate +UITouch +UITraitCollection +UITraitEnvironment +UIUserNotificationAction +UIUserNotificationCategory +UIUserNotificationSettings +UIVibrancyEffect +UIVideoEditorController +UIVideoEditorControllerDelegate +UIView +UIViewController +UIViewControllerAnimatedTransitioning +UIViewControllerContextTransitioning +UIViewControllerInteractiveTransitioning +UIViewControllerRestoration +UIViewControllerTransitionCoordinator +UIViewControllerTransitionCoordinatorContext +UIViewControllerTransitioningDelegate +UIViewPrintFormatter +UIVisualEffect +UIVisualEffectView +UIWebView +UIWebViewDelegate +UIWindow +WebArchive\|NSObject +WebBackForwardList\|NSObject +WebDataSource\|NSObject +WebDocumentRepresentation +WebDocumentSearching +WebDocumentText +WebDocumentView +WebDownload\|NSURLDownload\|NSObject +WebDownloadDelegate +WebFrame\|NSObject +WebFrameView\|NSView\|NSResponder\|NSObject +WebHistory\|NSObject +WebHistoryItem\|NSObject +WebOpenPanelResultListener\|NSObject +WebPlugInViewFactory +WebPolicyDecisionListener\|NSObject +WebPreferences\|NSObject +WebResource\|NSObject +WebScriptObject\|NSObject +WebUndefined\|NSObject +WebView\|NSView\|NSResponder\|NSObject \ No newline at end of file diff --git a/sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/constants.txt b/sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/constants.txt new file mode 100644 index 00000000..0c4ac2de --- /dev/null +++ b/sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/constants.txt @@ -0,0 +1,2678 @@ +NSASCIIStringEncoding +NSAWTEventType +NSAboveBottom +NSAboveTop +NSAccessibilityPriorityHigh +NSAccessibilityPriorityLow +NSAccessibilityPriorityMedium +NSActivityAutomaticTerminationDisabled +NSActivityBackground +NSActivityIdleDisplaySleepDisabled +NSActivityIdleSystemSleepDisabled +NSActivityLatencyCritical +NSActivitySuddenTerminationDisabled +NSActivityUserInitiated +NSActivityUserInitiatedAllowingIdleSystemSleep +NSAddEntityMappingType +NSAddTraitFontAction +NSAdminApplicationDirectory +NSAdobeCNS1CharacterCollection +NSAdobeGB1CharacterCollection +NSAdobeJapan1CharacterCollection +NSAdobeJapan2CharacterCollection +NSAdobeKorea1CharacterCollection +NSAggregateExpressionType +NSAlertAlternateReturn +NSAlertDefaultReturn +NSAlertErrorReturn +NSAlertFirstButtonReturn +NSAlertOtherReturn +NSAlertSecondButtonReturn +NSAlertThirdButtonReturn +NSAlignAllEdgesInward +NSAlignAllEdgesNearest +NSAlignAllEdgesOutward +NSAlignHeightInward +NSAlignHeightNearest +NSAlignHeightOutward +NSAlignMaxXInward +NSAlignMaxXNearest +NSAlignMaxXOutward +NSAlignMaxYInward +NSAlignMaxYNearest +NSAlignMaxYOutward +NSAlignMinXInward +NSAlignMinXNearest +NSAlignMinXOutward +NSAlignMinYInward +NSAlignMinYNearest +NSAlignMinYOutward +NSAlignRectFlipped +NSAlignWidthInward +NSAlignWidthNearest +NSAlignWidthOutward +NSAllApplicationsDirectory +NSAllDomainsMask +NSAllLibrariesDirectory +NSAllPredicateModifier +NSAllScrollerParts +NSAlphaFirstBitmapFormat +NSAlphaNonpremultipliedBitmapFormat +NSAlphaShiftKeyMask +NSAlternateKeyMask +NSAnchoredSearch +NSAndPredicateType +NSAnimationBlocking +NSAnimationEaseIn +NSAnimationEaseInOut +NSAnimationEaseOut +NSAnimationEffectDisappearingItemDefault +NSAnimationEffectPoof +NSAnimationLinear +NSAnimationNonblocking +NSAnimationNonblockingThreaded +NSAnyEventMask +NSAnyKeyExpressionType +NSAnyPredicateModifier +NSAnyType +NSAppKitDefined +NSAppKitDefinedMask +NSApplicationActivateAllWindows +NSApplicationActivateIgnoringOtherApps +NSApplicationActivatedEventType +NSApplicationActivationPolicyAccessory +NSApplicationActivationPolicyProhibited +NSApplicationActivationPolicyRegular +NSApplicationDeactivatedEventType +NSApplicationDefined +NSApplicationDefinedMask +NSApplicationDelegateReplyCancel +NSApplicationDelegateReplyFailure +NSApplicationDelegateReplySuccess +NSApplicationDirectory +NSApplicationOcclusionStateVisible +NSApplicationPresentationAutoHideDock +NSApplicationPresentationAutoHideMenuBar +NSApplicationPresentationAutoHideToolbar +NSApplicationPresentationDefault +NSApplicationPresentationDisableAppleMenu +NSApplicationPresentationDisableForceQuit +NSApplicationPresentationDisableHideApplication +NSApplicationPresentationDisableMenuBarTransparency +NSApplicationPresentationDisableProcessSwitching +NSApplicationPresentationDisableSessionTermination +NSApplicationPresentationFullScreen +NSApplicationPresentationHideDock +NSApplicationPresentationHideMenuBar +NSApplicationScriptsDirectory +NSApplicationSupportDirectory +NSArgumentEvaluationScriptError +NSArgumentsWrongScriptError +NSAscendingPageOrder +NSAsciiWithDoubleByteEUCGlyphPacking +NSAtBottom +NSAtTop +NSAtomicWrite +NSAttachmentCharacter +NSAttributedStringEnumerationLongestEffectiveRangeNotRequired +NSAttributedStringEnumerationReverse +NSAutoPagination +NSAutosaveAsOperation +NSAutosaveElsewhereOperation +NSAutosaveInPlaceOperation +NSAutosaveOperation +NSAutosavedInformationDirectory +NSBMPFileType +NSBackTabCharacter +NSBackgroundStyleDark +NSBackgroundStyleLight +NSBackgroundStyleLowered +NSBackgroundStyleRaised +NSBackgroundTab +NSBackingStoreBuffered +NSBackingStoreNonretained +NSBackingStoreRetained +NSBackspaceCharacter +NSBacktabTextMovement +NSBackwardsSearch +NSBeginFunctionKey +NSBeginsWithComparison +NSBeginsWithPredicateOperatorType +NSBelowBottom +NSBelowTop +NSBetweenPredicateOperatorType +NSBevelLineJoinStyle +NSBezelBorder +NSBinarySearchingFirstEqual +NSBinarySearchingInsertionIndex +NSBinarySearchingLastEqual +NSBlockExpressionType +NSBlueControlTint +NSBoldFontMask +NSBorderlessWindowMask +NSBottomTabsBezelBorder +NSBoxCustom +NSBoxOldStyle +NSBoxPrimary +NSBoxSecondary +NSBoxSeparator +NSBreakFunctionKey +NSBrowserAutoColumnResizing +NSBrowserDropAbove +NSBrowserDropOn +NSBrowserNoColumnResizing +NSBrowserUserColumnResizing +NSBundleExecutableArchitectureI386 +NSBundleExecutableArchitecturePPC +NSBundleExecutableArchitecturePPC64 +NSBundleExecutableArchitectureX86_64 +NSButtLineCapStyle +NSByteCountFormatterCountStyleBinary +NSByteCountFormatterCountStyleDecimal +NSByteCountFormatterCountStyleFile +NSByteCountFormatterCountStyleMemory +NSByteCountFormatterUseAll +NSByteCountFormatterUseBytes +NSByteCountFormatterUseDefault +NSByteCountFormatterUseEB +NSByteCountFormatterUseGB +NSByteCountFormatterUseKB +NSByteCountFormatterUseMB +NSByteCountFormatterUsePB +NSByteCountFormatterUseTB +NSByteCountFormatterUseYBOrHigher +NSByteCountFormatterUseZB +NSCMYKColorSpaceModel +NSCMYKModeColorPanel +NSCachesDirectory +NSCalculationDivideByZero +NSCalculationLossOfPrecision +NSCalculationNoError +NSCalculationOverflow +NSCalculationUnderflow +NSCalendarCalendarUnit +NSCalendarMatchFirst +NSCalendarMatchLast +NSCalendarMatchNextTime +NSCalendarMatchNextTimePreservingSmallerUnits +NSCalendarMatchPreviousTimePreservingSmallerUnits +NSCalendarMatchStrictly +NSCalendarSearchBackwards +NSCalendarUnitCalendar +NSCalendarUnitDay +NSCalendarUnitEra +NSCalendarUnitHour +NSCalendarUnitMinute +NSCalendarUnitMonth +NSCalendarUnitNanosecond +NSCalendarUnitQuarter +NSCalendarUnitSecond +NSCalendarUnitTimeZone +NSCalendarUnitWeekOfMonth +NSCalendarUnitWeekOfYear +NSCalendarUnitWeekday +NSCalendarUnitWeekdayOrdinal +NSCalendarUnitYear +NSCalendarUnitYearForWeekOfYear +NSCalendarWrapComponents +NSCancelButton +NSCancelTextMovement +NSCannotCreateScriptCommandError +NSCarriageReturnCharacter +NSCaseInsensitivePredicateOption +NSCaseInsensitiveSearch +NSCellAllowsMixedState +NSCellChangesContents +NSCellDisabled +NSCellEditable +NSCellHasImageHorizontal +NSCellHasImageOnLeftOrBottom +NSCellHasOverlappingImage +NSCellHighlighted +NSCellHitContentArea +NSCellHitEditableTextArea +NSCellHitNone +NSCellHitTrackableArea +NSCellIsBordered +NSCellIsInsetButton +NSCellLightsByBackground +NSCellLightsByContents +NSCellLightsByGray +NSCellState +NSCenterTabStopType +NSCenterTextAlignment +NSChangeAutosaved +NSChangeBackgroundCell +NSChangeBackgroundCellMask +NSChangeCleared +NSChangeDiscardable +NSChangeDone +NSChangeGrayCell +NSChangeGrayCellMask +NSChangeReadOtherContents +NSChangeRedone +NSChangeUndone +NSCircularBezelStyle +NSCircularSlider +NSClearControlTint +NSClearDisplayFunctionKey +NSClearLineFunctionKey +NSClipPagination +NSClockAndCalendarDatePickerStyle +NSClosableWindowMask +NSClosePathBezierPathElement +NSCollectionViewDropBefore +NSCollectionViewDropOn +NSCollectorDisabledOption +NSColorListModeColorPanel +NSColorPanelAllModesMask +NSColorPanelCMYKModeMask +NSColorPanelColorListModeMask +NSColorPanelCrayonModeMask +NSColorPanelCustomPaletteModeMask +NSColorPanelGrayModeMask +NSColorPanelHSBModeMask +NSColorPanelRGBModeMask +NSColorPanelWheelModeMask +NSColorRenderingIntentAbsoluteColorimetric +NSColorRenderingIntentDefault +NSColorRenderingIntentPerceptual +NSColorRenderingIntentRelativeColorimetric +NSColorRenderingIntentSaturation +NSCommandKeyMask +NSCompositeClear +NSCompositeCopy +NSCompositeDestinationAtop +NSCompositeDestinationIn +NSCompositeDestinationOut +NSCompositeDestinationOver +NSCompositeHighlight +NSCompositePlusDarker +NSCompositePlusLighter +NSCompositeSourceAtop +NSCompositeSourceIn +NSCompositeSourceOut +NSCompositeSourceOver +NSCompositeXOR +NSCompressedFontMask +NSCondensedFontMask +NSConfinementConcurrencyType +NSConstantValueExpressionType +NSContainerSpecifierError +NSContainsComparison +NSContainsPredicateOperatorType +NSContentsCellMask +NSContinuousCapacityLevelIndicatorStyle +NSControlCharacterContainerBreakAction +NSControlCharacterHorizontalTabAction +NSControlCharacterLineBreakAction +NSControlCharacterParagraphBreakAction +NSControlCharacterWhitespaceAction +NSControlCharacterZeroAdvancementAction +NSControlGlyph +NSControlKeyMask +NSCopyEntityMappingType +NSCoreDataError +NSCoreServiceDirectory +NSCorrectionIndicatorTypeDefault +NSCorrectionIndicatorTypeGuesses +NSCorrectionIndicatorTypeReversion +NSCorrectionResponseAccepted +NSCorrectionResponseEdited +NSCorrectionResponseIgnored +NSCorrectionResponseNone +NSCorrectionResponseRejected +NSCorrectionResponseReverted +NSCrayonModeColorPanel +NSCriticalAlertStyle +NSCriticalRequest +NSCursorPointingDevice +NSCursorUpdate +NSCursorUpdateMask +NSCurveToBezierPathElement +NSCustomEntityMappingType +NSCustomPaletteModeColorPanel +NSCustomSelectorPredicateOperatorType +NSDataBase64DecodingIgnoreUnknownCharacters +NSDataBase64Encoding64CharacterLineLength +NSDataBase64Encoding76CharacterLineLength +NSDataBase64EncodingEndLineWithCarriageReturn +NSDataBase64EncodingEndLineWithLineFeed +NSDataReadingMapped +NSDataReadingMappedAlways +NSDataReadingMappedIfSafe +NSDataReadingUncached +NSDataSearchAnchored +NSDataSearchBackwards +NSDataWritingAtomic +NSDataWritingFileProtectionComplete +NSDataWritingFileProtectionCompleteUnlessOpen +NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication +NSDataWritingFileProtectionMask +NSDataWritingFileProtectionNone +NSDataWritingWithoutOverwriting +NSDateComponentUndefined +NSDateFormatterBehavior10_0 +NSDateFormatterBehavior10_4 +NSDateFormatterBehaviorDefault +NSDateFormatterFullStyle +NSDateFormatterLongStyle +NSDateFormatterMediumStyle +NSDateFormatterNoStyle +NSDateFormatterShortStyle +NSDayCalendarUnit +NSDecimalTabStopType +NSDefaultControlTint +NSDefaultTokenStyle +NSDeleteCharFunctionKey +NSDeleteCharacter +NSDeleteFunctionKey +NSDeleteLineFunctionKey +NSDemoApplicationDirectory +NSDescendingPageOrder +NSDesktopDirectory +NSDeveloperApplicationDirectory +NSDeveloperDirectory +NSDeviceIndependentModifierFlagsMask +NSDeviceNColorSpaceModel +NSDiacriticInsensitivePredicateOption +NSDiacriticInsensitiveSearch +NSDirectPredicateModifier +NSDirectSelection +NSDirectoryEnumerationSkipsHiddenFiles +NSDirectoryEnumerationSkipsPackageDescendants +NSDirectoryEnumerationSkipsSubdirectoryDescendants +NSDisclosureBezelStyle +NSDiscreteCapacityLevelIndicatorStyle +NSDisplayWindowRunLoopOrdering +NSDocModalWindowMask +NSDocumentDirectory +NSDocumentationDirectory +NSDoubleType +NSDownArrowFunctionKey +NSDownTextMovement +NSDownloadsDirectory +NSDragOperationAll_Obsolete +NSDragOperationCopy +NSDragOperationDelete +NSDragOperationEvery +NSDragOperationGeneric +NSDragOperationLink +NSDragOperationMove +NSDragOperationNone +NSDragOperationPrivate +NSDraggingContextOutsideApplication +NSDraggingContextWithinApplication +NSDraggingFormationDefault +NSDraggingFormationList +NSDraggingFormationNone +NSDraggingFormationPile +NSDraggingFormationStack +NSDraggingItemEnumerationClearNonenumeratedImages +NSDraggingItemEnumerationConcurrent +NSDrawerClosedState +NSDrawerClosingState +NSDrawerOpenState +NSDrawerOpeningState +NSEndFunctionKey +NSEndsWithComparison +NSEndsWithPredicateOperatorType +NSEnterCharacter +NSEntityMigrationPolicyError +NSEnumerationConcurrent +NSEnumerationReverse +NSEqualToComparison +NSEqualToPredicateOperatorType +NSEraCalendarUnit +NSEraDatePickerElementFlag +NSEraserPointingDevice +NSErrorMergePolicyType +NSEvaluatedObjectExpressionType +NSEvenOddWindingRule +NSEventGestureAxisHorizontal +NSEventGestureAxisNone +NSEventGestureAxisVertical +NSEventMaskBeginGesture +NSEventMaskEndGesture +NSEventMaskGesture +NSEventMaskMagnify +NSEventMaskRotate +NSEventMaskSmartMagnify +NSEventMaskSwipe +NSEventPhaseBegan +NSEventPhaseCancelled +NSEventPhaseChanged +NSEventPhaseEnded +NSEventPhaseMayBegin +NSEventPhaseNone +NSEventPhaseStationary +NSEventSwipeTrackingClampGestureAmount +NSEventSwipeTrackingLockDirection +NSEventTypeBeginGesture +NSEventTypeEndGesture +NSEventTypeGesture +NSEventTypeMagnify +NSEventTypeQuickLook +NSEventTypeRotate +NSEventTypeSmartMagnify +NSEventTypeSwipe +NSEverySubelement +NSExclude10_4ElementsIconCreationOption +NSExcludeQuickDrawElementsIconCreationOption +NSExecutableArchitectureMismatchError +NSExecutableErrorMaximum +NSExecutableErrorMinimum +NSExecutableLinkError +NSExecutableLoadError +NSExecutableNotLoadableError +NSExecutableRuntimeMismatchError +NSExecuteFunctionKey +NSExpandedFontMask +NSExternalRecordImportError +NSF10FunctionKey +NSF11FunctionKey +NSF12FunctionKey +NSF13FunctionKey +NSF14FunctionKey +NSF15FunctionKey +NSF16FunctionKey +NSF17FunctionKey +NSF18FunctionKey +NSF19FunctionKey +NSF1FunctionKey +NSF20FunctionKey +NSF21FunctionKey +NSF22FunctionKey +NSF23FunctionKey +NSF24FunctionKey +NSF25FunctionKey +NSF26FunctionKey +NSF27FunctionKey +NSF28FunctionKey +NSF29FunctionKey +NSF2FunctionKey +NSF30FunctionKey +NSF31FunctionKey +NSF32FunctionKey +NSF33FunctionKey +NSF34FunctionKey +NSF35FunctionKey +NSF3FunctionKey +NSF4FunctionKey +NSF5FunctionKey +NSF6FunctionKey +NSF7FunctionKey +NSF8FunctionKey +NSF9FunctionKey +NSFPCurrentField +NSFPPreviewButton +NSFPPreviewField +NSFPRevertButton +NSFPSetButton +NSFPSizeField +NSFPSizeTitle +NSFeatureUnsupportedError +NSFetchRequestExpressionType +NSFetchRequestType +NSFileCoordinatorReadingResolvesSymbolicLink +NSFileCoordinatorReadingWithoutChanges +NSFileCoordinatorWritingForDeleting +NSFileCoordinatorWritingForMerging +NSFileCoordinatorWritingForMoving +NSFileCoordinatorWritingForReplacing +NSFileErrorMaximum +NSFileErrorMinimum +NSFileHandlingPanelCancelButton +NSFileHandlingPanelOKButton +NSFileLockingError +NSFileManagerItemReplacementUsingNewMetadataOnly +NSFileManagerItemReplacementWithoutDeletingBackupItem +NSFileNoSuchFileError +NSFileReadCorruptFileError +NSFileReadInapplicableStringEncodingError +NSFileReadInvalidFileNameError +NSFileReadNoPermissionError +NSFileReadNoSuchFileError +NSFileReadTooLargeError +NSFileReadUnknownError +NSFileReadUnknownStringEncodingError +NSFileReadUnsupportedSchemeError +NSFileVersionAddingByMoving +NSFileVersionReplacingByMoving +NSFileWrapperReadingImmediate +NSFileWrapperReadingWithoutMapping +NSFileWrapperWritingAtomic +NSFileWrapperWritingWithNameUpdating +NSFileWriteFileExistsError +NSFileWriteInapplicableStringEncodingError +NSFileWriteInvalidFileNameError +NSFileWriteNoPermissionError +NSFileWriteOutOfSpaceError +NSFileWriteUnknownError +NSFileWriteUnsupportedSchemeError +NSFileWriteVolumeReadOnlyError +NSFindFunctionKey +NSFindPanelActionNext +NSFindPanelActionPrevious +NSFindPanelActionReplace +NSFindPanelActionReplaceAll +NSFindPanelActionReplaceAllInSelection +NSFindPanelActionReplaceAndFind +NSFindPanelActionSelectAll +NSFindPanelActionSelectAllInSelection +NSFindPanelActionSetFindString +NSFindPanelActionShowFindPanel +NSFindPanelSubstringMatchTypeContains +NSFindPanelSubstringMatchTypeEndsWith +NSFindPanelSubstringMatchTypeFullWord +NSFindPanelSubstringMatchTypeStartsWith +NSFitPagination +NSFixedPitchFontMask +NSFlagsChanged +NSFlagsChangedMask +NSFloatType +NSFloatingPointSamplesBitmapFormat +NSFocusRingAbove +NSFocusRingBelow +NSFocusRingOnly +NSFocusRingTypeDefault +NSFocusRingTypeExterior +NSFocusRingTypeNone +NSFontAntialiasedIntegerAdvancementsRenderingMode +NSFontAntialiasedRenderingMode +NSFontBoldTrait +NSFontClarendonSerifsClass +NSFontCollectionApplicationOnlyMask +NSFontCollectionVisibilityComputer +NSFontCollectionVisibilityProcess +NSFontCollectionVisibilityUser +NSFontCondensedTrait +NSFontDefaultRenderingMode +NSFontExpandedTrait +NSFontFamilyClassMask +NSFontFreeformSerifsClass +NSFontIntegerAdvancementsRenderingMode +NSFontItalicTrait +NSFontModernSerifsClass +NSFontMonoSpaceTrait +NSFontOldStyleSerifsClass +NSFontOrnamentalsClass +NSFontPanelAllEffectsModeMask +NSFontPanelAllModesMask +NSFontPanelCollectionModeMask +NSFontPanelDocumentColorEffectModeMask +NSFontPanelFaceModeMask +NSFontPanelShadowEffectModeMask +NSFontPanelSizeModeMask +NSFontPanelStandardModesMask +NSFontPanelStrikethroughEffectModeMask +NSFontPanelTextColorEffectModeMask +NSFontPanelUnderlineEffectModeMask +NSFontSansSerifClass +NSFontScriptsClass +NSFontSlabSerifsClass +NSFontSymbolicClass +NSFontTransitionalSerifsClass +NSFontUIOptimizedTrait +NSFontUnknownClass +NSFontVerticalTrait +NSForcedOrderingSearch +NSFormFeedCharacter +NSFormattingError +NSFormattingErrorMaximum +NSFormattingErrorMinimum +NSFourByteGlyphPacking +NSFullScreenWindowMask +NSFunctionExpressionType +NSFunctionKeyMask +NSGIFFileType +NSGlyphAbove +NSGlyphAttributeBidiLevel +NSGlyphAttributeElastic +NSGlyphAttributeInscribe +NSGlyphAttributeSoft +NSGlyphBelow +NSGlyphInscribeAbove +NSGlyphInscribeBase +NSGlyphInscribeBelow +NSGlyphInscribeOverBelow +NSGlyphInscribeOverstrike +NSGlyphLayoutAgainstAPoint +NSGlyphLayoutAtAPoint +NSGlyphLayoutWithPrevious +NSGlyphPropertyControlCharacter +NSGlyphPropertyElastic +NSGlyphPropertyNonBaseCharacter +NSGlyphPropertyNull +NSGradientConcaveStrong +NSGradientConcaveWeak +NSGradientConvexStrong +NSGradientConvexWeak +NSGradientDrawsAfterEndingLocation +NSGradientDrawsBeforeStartingLocation +NSGradientNone +NSGraphiteControlTint +NSGrayColorSpaceModel +NSGrayModeColorPanel +NSGreaterThanComparison +NSGreaterThanOrEqualToComparison +NSGreaterThanOrEqualToPredicateOperatorType +NSGreaterThanPredicateOperatorType +NSGrooveBorder +NSHPUXOperatingSystem +NSHSBModeColorPanel +NSHTTPCookieAcceptPolicyAlways +NSHTTPCookieAcceptPolicyNever +NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain +NSHUDWindowMask +NSHashTableCopyIn +NSHashTableObjectPointerPersonality +NSHashTableStrongMemory +NSHashTableWeakMemory +NSHashTableZeroingWeakMemory +NSHeavierFontAction +NSHelpButtonBezelStyle +NSHelpFunctionKey +NSHelpKeyMask +NSHighlightModeMatrix +NSHomeFunctionKey +NSHorizontalRuler +NSHourCalendarUnit +NSHourMinuteDatePickerElementFlag +NSHourMinuteSecondDatePickerElementFlag +NSISO2022JPStringEncoding +NSISOLatin1StringEncoding +NSISOLatin2StringEncoding +NSIdentityMappingCharacterCollection +NSIllegalTextMovement +NSImageAbove +NSImageAlignBottom +NSImageAlignBottomLeft +NSImageAlignBottomRight +NSImageAlignCenter +NSImageAlignLeft +NSImageAlignRight +NSImageAlignTop +NSImageAlignTopLeft +NSImageAlignTopRight +NSImageBelow +NSImageCacheAlways +NSImageCacheBySize +NSImageCacheDefault +NSImageCacheNever +NSImageCellType +NSImageFrameButton +NSImageFrameGrayBezel +NSImageFrameGroove +NSImageFrameNone +NSImageFramePhoto +NSImageInterpolationDefault +NSImageInterpolationHigh +NSImageInterpolationLow +NSImageInterpolationMedium +NSImageInterpolationNone +NSImageLeft +NSImageLoadStatusCancelled +NSImageLoadStatusCompleted +NSImageLoadStatusInvalidData +NSImageLoadStatusReadError +NSImageLoadStatusUnexpectedEOF +NSImageOnly +NSImageOverlaps +NSImageRepLoadStatusCompleted +NSImageRepLoadStatusInvalidData +NSImageRepLoadStatusReadingHeader +NSImageRepLoadStatusUnexpectedEOF +NSImageRepLoadStatusUnknownType +NSImageRepLoadStatusWillNeedAllData +NSImageRepMatchesDevice +NSImageRight +NSImageScaleAxesIndependently +NSImageScaleNone +NSImageScaleProportionallyDown +NSImageScaleProportionallyUpOrDown +NSInPredicateOperatorType +NSIndexSubelement +NSIndexedColorSpaceModel +NSInferredMappingModelError +NSInformationalAlertStyle +NSInformationalRequest +NSInlineBezelStyle +NSInputMethodsDirectory +NSInsertCharFunctionKey +NSInsertFunctionKey +NSInsertLineFunctionKey +NSIntType +NSInternalScriptError +NSInternalSpecifierError +NSIntersectSetExpressionType +NSInvalidIndexSpecifierError +NSItalicFontMask +NSItemReplacementDirectory +NSJPEG2000FileType +NSJPEGFileType +NSJSONReadingAllowFragments +NSJSONReadingMutableContainers +NSJSONReadingMutableLeaves +NSJSONWritingPrettyPrinted +NSJapaneseEUCGlyphPacking +NSJapaneseEUCStringEncoding +NSJustifiedTextAlignment +NSKeyDown +NSKeyDownMask +NSKeyPathExpressionType +NSKeySpecifierEvaluationScriptError +NSKeyUp +NSKeyUpMask +NSKeyValueChangeInsertion +NSKeyValueChangeRemoval +NSKeyValueChangeReplacement +NSKeyValueChangeSetting +NSKeyValueIntersectSetMutation +NSKeyValueMinusSetMutation +NSKeyValueObservingOptionInitial +NSKeyValueObservingOptionNew +NSKeyValueObservingOptionOld +NSKeyValueObservingOptionPrior +NSKeyValueSetSetMutation +NSKeyValueUnionSetMutation +NSKeyValueValidationError +NSLABColorSpaceModel +NSLandscapeOrientation +NSLayoutAttributeBaseline +NSLayoutAttributeBottom +NSLayoutAttributeBottomMargin +NSLayoutAttributeCenterX +NSLayoutAttributeCenterXWithinMargins +NSLayoutAttributeCenterY +NSLayoutAttributeCenterYWithinMargins +NSLayoutAttributeFirstBaseline +NSLayoutAttributeHeight +NSLayoutAttributeLastBaseline +NSLayoutAttributeLeading +NSLayoutAttributeLeadingMargin +NSLayoutAttributeLeft +NSLayoutAttributeLeftMargin +NSLayoutAttributeNotAnAttribute +NSLayoutAttributeRight +NSLayoutAttributeRightMargin +NSLayoutAttributeTop +NSLayoutAttributeTopMargin +NSLayoutAttributeTrailing +NSLayoutAttributeTrailingMargin +NSLayoutAttributeWidth +NSLayoutCantFit +NSLayoutConstraintOrientationHorizontal +NSLayoutConstraintOrientationVertical +NSLayoutDone +NSLayoutFormatAlignAllBaseline +NSLayoutFormatAlignAllBottom +NSLayoutFormatAlignAllCenterX +NSLayoutFormatAlignAllCenterY +NSLayoutFormatAlignAllFirstBaseline +NSLayoutFormatAlignAllLastBaseline +NSLayoutFormatAlignAllLeading +NSLayoutFormatAlignAllLeft +NSLayoutFormatAlignAllRight +NSLayoutFormatAlignAllTop +NSLayoutFormatAlignAllTrailing +NSLayoutFormatAlignmentMask +NSLayoutFormatDirectionLeadingToTrailing +NSLayoutFormatDirectionLeftToRight +NSLayoutFormatDirectionMask +NSLayoutFormatDirectionRightToLeft +NSLayoutLeftToRight +NSLayoutNotDone +NSLayoutOutOfGlyphs +NSLayoutPriorityDefaultHigh +NSLayoutPriorityDefaultLow +NSLayoutPriorityDragThatCanResizeWindow +NSLayoutPriorityDragThatCannotResizeWindow +NSLayoutPriorityFittingSizeCompression +NSLayoutPriorityRequired +NSLayoutPriorityWindowSizeStayPut +NSLayoutRelationEqual +NSLayoutRelationGreaterThanOrEqual +NSLayoutRelationLessThanOrEqual +NSLayoutRightToLeft +NSLeftArrowFunctionKey +NSLeftMouseDown +NSLeftMouseDownMask +NSLeftMouseDragged +NSLeftMouseDraggedMask +NSLeftMouseUp +NSLeftMouseUpMask +NSLeftTabStopType +NSLeftTabsBezelBorder +NSLeftTextAlignment +NSLeftTextMovement +NSLessThanComparison +NSLessThanOrEqualToComparison +NSLessThanOrEqualToPredicateOperatorType +NSLessThanPredicateOperatorType +NSLibraryDirectory +NSLighterFontAction +NSLikePredicateOperatorType +NSLineBorder +NSLineBreakByCharWrapping +NSLineBreakByClipping +NSLineBreakByTruncatingHead +NSLineBreakByTruncatingMiddle +NSLineBreakByTruncatingTail +NSLineBreakByWordWrapping +NSLineDoesntMove +NSLineMovesDown +NSLineMovesLeft +NSLineMovesRight +NSLineMovesUp +NSLineSeparatorCharacter +NSLineSweepDown +NSLineSweepLeft +NSLineSweepRight +NSLineSweepUp +NSLineToBezierPathElement +NSLinearSlider +NSLinguisticTaggerJoinNames +NSLinguisticTaggerOmitOther +NSLinguisticTaggerOmitPunctuation +NSLinguisticTaggerOmitWhitespace +NSLinguisticTaggerOmitWords +NSListModeMatrix +NSLiteralSearch +NSLocalDomainMask +NSLocaleLanguageDirectionBottomToTop +NSLocaleLanguageDirectionLeftToRight +NSLocaleLanguageDirectionRightToLeft +NSLocaleLanguageDirectionTopToBottom +NSLocaleLanguageDirectionUnknown +NSMACHOperatingSystem +NSMacOSRomanStringEncoding +NSMachPortDeallocateNone +NSMachPortDeallocateReceiveRight +NSMachPortDeallocateSendRight +NSMacintoshInterfaceStyle +NSMainQueueConcurrencyType +NSManagedObjectContextLockingError +NSManagedObjectExternalRelationshipError +NSManagedObjectIDResultType +NSManagedObjectMergeError +NSManagedObjectReferentialIntegrityError +NSManagedObjectResultType +NSManagedObjectValidationError +NSMapTableCopyIn +NSMapTableObjectPointerPersonality +NSMapTableStrongMemory +NSMapTableWeakMemory +NSMapTableZeroingWeakMemory +NSMappedRead +NSMatchesPredicateOperatorType +NSMatchingAnchored +NSMatchingCompleted +NSMatchingHitEnd +NSMatchingInternalError +NSMatchingProgress +NSMatchingReportCompletion +NSMatchingReportProgress +NSMatchingRequiredEnd +NSMatchingWithTransparentBounds +NSMatchingWithoutAnchoringBounds +NSMaxXEdge +NSMaxYEdge +NSMediaLibraryAudio +NSMediaLibraryImage +NSMediaLibraryMovie +NSMenuFunctionKey +NSMenuPropertyItemAccessibilityDescription +NSMenuPropertyItemAttributedTitle +NSMenuPropertyItemEnabled +NSMenuPropertyItemImage +NSMenuPropertyItemKeyEquivalent +NSMenuPropertyItemTitle +NSMergeByPropertyObjectTrumpMergePolicyType +NSMergeByPropertyStoreTrumpMergePolicyType +NSMiddleSubelement +NSMigrationCancelledError +NSMigrationError +NSMigrationManagerDestinationStoreError +NSMigrationManagerSourceStoreError +NSMigrationMissingMappingModelError +NSMigrationMissingSourceModelError +NSMinXEdge +NSMinYEdge +NSMiniControlSize +NSMiniaturizableWindowMask +NSMinusSetExpressionType +NSMinuteCalendarUnit +NSMiterLineJoinStyle +NSMixedState +NSModalResponseAbort +NSModalResponseCancel +NSModalResponseContinue +NSModalResponseOK +NSModalResponseStop +NSModeSwitchFunctionKey +NSMomentaryChangeButton +NSMomentaryLight +NSMomentaryLightButton +NSMomentaryPushButton +NSMomentaryPushInButton +NSMonthCalendarUnit +NSMouseEntered +NSMouseEnteredMask +NSMouseEventSubtype +NSMouseExited +NSMouseExitedMask +NSMouseMoved +NSMouseMovedMask +NSMoveToBezierPathElement +NSMoviesDirectory +NSMusicDirectory +NSNEXTSTEPStringEncoding +NSNarrowFontMask +NSNativeShortGlyphPacking +NSNaturalTextAlignment +NSNetServiceListenForConnections +NSNetServiceNoAutoRename +NSNetServicesActivityInProgress +NSNetServicesBadArgumentError +NSNetServicesCancelledError +NSNetServicesCollisionError +NSNetServicesInvalidError +NSNetServicesNotFoundError +NSNetServicesTimeoutError +NSNetServicesUnknownError +NSNetworkDomainMask +NSNewlineCharacter +NSNextFunctionKey +NSNextStepInterfaceStyle +NSNoBorder +NSNoCellMask +NSNoFontChangeAction +NSNoImage +NSNoInterfaceStyle +NSNoModeColorPanel +NSNoScriptError +NSNoScrollerParts +NSNoSpecifierError +NSNoSubelement +NSNoTabsBezelBorder +NSNoTabsLineBorder +NSNoTabsNoBorder +NSNoTitle +NSNoTopLevelContainersSpecifierError +NSNoUnderlineStyle +NSNonLossyASCIIStringEncoding +NSNonStandardCharacterSetFontMask +NSNonZeroWindingRule +NSNonactivatingPanelMask +NSNormalizedPredicateOption +NSNotEqualToPredicateOperatorType +NSNotPredicateType +NSNotificationCoalescingOnName +NSNotificationCoalescingOnSender +NSNotificationDeliverImmediately +NSNotificationNoCoalescing +NSNotificationPostToAllSessions +NSNotificationSuspensionBehaviorCoalesce +NSNotificationSuspensionBehaviorDeliverImmediately +NSNotificationSuspensionBehaviorDrop +NSNotificationSuspensionBehaviorHold +NSNullCellType +NSNullGlyph +NSNumberFormatterBehavior10_0 +NSNumberFormatterBehavior10_4 +NSNumberFormatterBehaviorDefault +NSNumberFormatterCurrencyStyle +NSNumberFormatterDecimalStyle +NSNumberFormatterNoStyle +NSNumberFormatterPadAfterPrefix +NSNumberFormatterPadAfterSuffix +NSNumberFormatterPadBeforePrefix +NSNumberFormatterPadBeforeSuffix +NSNumberFormatterPercentStyle +NSNumberFormatterRoundCeiling +NSNumberFormatterRoundDown +NSNumberFormatterRoundFloor +NSNumberFormatterRoundHalfDown +NSNumberFormatterRoundHalfEven +NSNumberFormatterRoundHalfUp +NSNumberFormatterRoundUp +NSNumberFormatterScientificStyle +NSNumberFormatterSpellOutStyle +NSNumericPadKeyMask +NSNumericSearch +NSOKButton +NSOSF1OperatingSystem +NSObjCArrayType +NSObjCBitfield +NSObjCBoolType +NSObjCCharType +NSObjCDoubleType +NSObjCFloatType +NSObjCLongType +NSObjCLonglongType +NSObjCNoType +NSObjCObjectType +NSObjCPointerType +NSObjCSelectorType +NSObjCShortType +NSObjCStringType +NSObjCStructType +NSObjCUnionType +NSObjCVoidType +NSOffState +NSOnOffButton +NSOnState +NSOneByteGlyphPacking +NSOnlyScrollerArrows +NSOpenGLCPCurrentRendererID +NSOpenGLCPGPUFragmentProcessing +NSOpenGLCPGPUVertexProcessing +NSOpenGLCPHasDrawable +NSOpenGLCPMPSwapsInFlight +NSOpenGLCPReclaimResources +NSOpenGLCPSurfaceBackingSize +NSOpenGLCPSurfaceOpacity +NSOpenGLCPSurfaceOrder +NSOpenGLCPSwapInterval +NSOpenGLGOClearFormatCache +NSOpenGLGOFormatCacheSize +NSOpenGLGOResetLibrary +NSOpenGLGORetainRenderers +NSOpenGLGOUseBuildCache +NSOpenGLPFAAccelerated +NSOpenGLPFAAcceleratedCompute +NSOpenGLPFAAccumSize +NSOpenGLPFAAllRenderers +NSOpenGLPFAAllowOfflineRenderers +NSOpenGLPFAAlphaSize +NSOpenGLPFAAuxBuffers +NSOpenGLPFAAuxDepthStencil +NSOpenGLPFABackingStore +NSOpenGLPFAClosestPolicy +NSOpenGLPFAColorFloat +NSOpenGLPFAColorSize +NSOpenGLPFACompliant +NSOpenGLPFADepthSize +NSOpenGLPFADoubleBuffer +NSOpenGLPFAFullScreen +NSOpenGLPFAMPSafe +NSOpenGLPFAMaximumPolicy +NSOpenGLPFAMinimumPolicy +NSOpenGLPFAMultiScreen +NSOpenGLPFAMultisample +NSOpenGLPFANoRecovery +NSOpenGLPFAOffScreen +NSOpenGLPFAOpenGLProfile +NSOpenGLPFAPixelBuffer +NSOpenGLPFARemotePixelBuffer +NSOpenGLPFARendererID +NSOpenGLPFARobust +NSOpenGLPFASampleAlpha +NSOpenGLPFASampleBuffers +NSOpenGLPFASamples +NSOpenGLPFAScreenMask +NSOpenGLPFASingleRenderer +NSOpenGLPFAStencilSize +NSOpenGLPFAStereo +NSOpenGLPFASupersample +NSOpenGLPFATripleBuffer +NSOpenGLPFAVirtualScreenCount +NSOpenGLPFAWindow +NSOpenGLProfileVersion3_2Core +NSOpenGLProfileVersionLegacy +NSOpenStepUnicodeReservedBase +NSOperationNotSupportedForKeyScriptError +NSOperationNotSupportedForKeySpecifierError +NSOperationQueueDefaultMaxConcurrentOperationCount +NSOperationQueuePriorityHigh +NSOperationQueuePriorityLow +NSOperationQueuePriorityNormal +NSOperationQueuePriorityVeryHigh +NSOperationQueuePriorityVeryLow +NSOrPredicateType +NSOtherMouseDown +NSOtherMouseDownMask +NSOtherMouseDragged +NSOtherMouseDraggedMask +NSOtherMouseUp +NSOtherMouseUpMask +NSOtherTextMovement +NSOverwriteMergePolicyType +NSPDFPanelRequestsParentDirectory +NSPDFPanelShowsOrientation +NSPDFPanelShowsPaperSize +NSPNGFileType +NSPageControllerTransitionStyleHorizontalStrip +NSPageControllerTransitionStyleStackBook +NSPageControllerTransitionStyleStackHistory +NSPageDownFunctionKey +NSPageUpFunctionKey +NSPaperOrientationLandscape +NSPaperOrientationPortrait +NSParagraphSeparatorCharacter +NSPasteboardReadingAsData +NSPasteboardReadingAsKeyedArchive +NSPasteboardReadingAsPropertyList +NSPasteboardReadingAsString +NSPasteboardWritingPromised +NSPathStyleNavigationBar +NSPathStylePopUp +NSPathStyleStandard +NSPatternColorSpaceModel +NSPauseFunctionKey +NSPenLowerSideMask +NSPenPointingDevice +NSPenTipMask +NSPenUpperSideMask +NSPeriodic +NSPeriodicMask +NSPersistentStoreCoordinatorLockingError +NSPersistentStoreIncompatibleSchemaError +NSPersistentStoreIncompatibleVersionHashError +NSPersistentStoreIncompleteSaveError +NSPersistentStoreInvalidTypeError +NSPersistentStoreOpenError +NSPersistentStoreOperationError +NSPersistentStoreSaveConflictsError +NSPersistentStoreSaveError +NSPersistentStoreTimeoutError +NSPersistentStoreTypeMismatchError +NSPersistentStoreUbiquitousTransitionTypeAccountAdded +NSPersistentStoreUbiquitousTransitionTypeAccountRemoved +NSPersistentStoreUbiquitousTransitionTypeContentRemoved +NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted +NSPersistentStoreUnsupportedRequestTypeError +NSPicturesDirectory +NSPlainTextTokenStyle +NSPointerFunctionsCStringPersonality +NSPointerFunctionsCopyIn +NSPointerFunctionsIntegerPersonality +NSPointerFunctionsMachVirtualMemory +NSPointerFunctionsMallocMemory +NSPointerFunctionsObjectPersonality +NSPointerFunctionsObjectPointerPersonality +NSPointerFunctionsOpaqueMemory +NSPointerFunctionsOpaquePersonality +NSPointerFunctionsStrongMemory +NSPointerFunctionsStructPersonality +NSPointerFunctionsWeakMemory +NSPointerFunctionsZeroingWeakMemory +NSPopUpArrowAtBottom +NSPopUpArrowAtCenter +NSPopUpNoArrow +NSPopoverAppearanceHUD +NSPopoverAppearanceMinimal +NSPopoverBehaviorApplicationDefined +NSPopoverBehaviorSemitransient +NSPopoverBehaviorTransient +NSPortraitOrientation +NSPositionAfter +NSPositionBefore +NSPositionBeginning +NSPositionEnd +NSPositionReplace +NSPositiveDoubleType +NSPositiveFloatType +NSPositiveIntType +NSPostASAP +NSPostNow +NSPostWhenIdle +NSPosterFontMask +NSPowerOffEventType +NSPreferencePanesDirectory +NSPressedTab +NSPrevFunctionKey +NSPrintFunctionKey +NSPrintPanelShowsCopies +NSPrintPanelShowsOrientation +NSPrintPanelShowsPageRange +NSPrintPanelShowsPageSetupAccessory +NSPrintPanelShowsPaperSize +NSPrintPanelShowsPreview +NSPrintPanelShowsPrintSelection +NSPrintPanelShowsScaling +NSPrintRenderingQualityBest +NSPrintRenderingQualityResponsive +NSPrintScreenFunctionKey +NSPrinterDescriptionDirectory +NSPrinterTableError +NSPrinterTableNotFound +NSPrinterTableOK +NSPrintingCancelled +NSPrintingFailure +NSPrintingReplyLater +NSPrintingSuccess +NSPrivateQueueConcurrencyType +NSProgressIndicatorBarStyle +NSProgressIndicatorPreferredAquaThickness +NSProgressIndicatorPreferredLargeThickness +NSProgressIndicatorPreferredSmallThickness +NSProgressIndicatorPreferredThickness +NSProgressIndicatorSpinningStyle +NSPropertyListBinaryFormat_v1_0 +NSPropertyListErrorMaximum +NSPropertyListErrorMinimum +NSPropertyListImmutable +NSPropertyListMutableContainers +NSPropertyListMutableContainersAndLeaves +NSPropertyListOpenStepFormat +NSPropertyListReadCorruptError +NSPropertyListReadStreamError +NSPropertyListReadUnknownVersionError +NSPropertyListWriteStreamError +NSPropertyListXMLFormat_v1_0 +NSProprietaryStringEncoding +NSPushInCell +NSPushInCellMask +NSPushOnPushOffButton +NSQTMovieLoopingBackAndForthPlayback +NSQTMovieLoopingPlayback +NSQTMovieNormalPlayback +NSQuarterCalendarUnit +NSRGBColorSpaceModel +NSRGBModeColorPanel +NSRadioButton +NSRadioModeMatrix +NSRandomSubelement +NSRangeDateMode +NSRatingLevelIndicatorStyle +NSReceiverEvaluationScriptError +NSReceiversCantHandleCommandScriptError +NSRecessedBezelStyle +NSRedoFunctionKey +NSRegularControlSize +NSRegularExpressionAllowCommentsAndWhitespace +NSRegularExpressionAnchorsMatchLines +NSRegularExpressionCaseInsensitive +NSRegularExpressionDotMatchesLineSeparators +NSRegularExpressionIgnoreMetacharacters +NSRegularExpressionSearch +NSRegularExpressionUseUnicodeWordBoundaries +NSRegularExpressionUseUnixLineSeparators +NSRegularSquareBezelStyle +NSRelativeAfter +NSRelativeBefore +NSRelevancyLevelIndicatorStyle +NSRemoteNotificationTypeAlert +NSRemoteNotificationTypeBadge +NSRemoteNotificationTypeNone +NSRemoteNotificationTypeSound +NSRemoveEntityMappingType +NSRemoveTraitFontAction +NSRequiredArgumentsMissingScriptError +NSResetCursorRectsRunLoopOrdering +NSResetFunctionKey +NSResizableWindowMask +NSReturnTextMovement +NSRightArrowFunctionKey +NSRightMouseDown +NSRightMouseDownMask +NSRightMouseDragged +NSRightMouseDraggedMask +NSRightMouseUp +NSRightMouseUpMask +NSRightTabStopType +NSRightTabsBezelBorder +NSRightTextAlignment +NSRightTextMovement +NSRollbackMergePolicyType +NSRoundBankers +NSRoundDown +NSRoundLineCapStyle +NSRoundLineJoinStyle +NSRoundPlain +NSRoundRectBezelStyle +NSRoundUp +NSRoundedBezelStyle +NSRoundedDisclosureBezelStyle +NSRoundedTokenStyle +NSRuleEditorNestingModeCompound +NSRuleEditorNestingModeList +NSRuleEditorNestingModeSimple +NSRuleEditorNestingModeSingle +NSRuleEditorRowTypeCompound +NSRuleEditorRowTypeSimple +NSRunAbortedResponse +NSRunContinuesResponse +NSRunStoppedResponse +NSSQLiteError +NSSaveAsOperation +NSSaveOperation +NSSaveOptionsAsk +NSSaveOptionsNo +NSSaveOptionsYes +NSSaveRequestType +NSSaveToOperation +NSScaleNone +NSScaleProportionally +NSScaleToFit +NSScannedOption +NSScreenChangedEventType +NSScrollElasticityAllowed +NSScrollElasticityAutomatic +NSScrollElasticityNone +NSScrollLockFunctionKey +NSScrollViewFindBarPositionAboveContent +NSScrollViewFindBarPositionAboveHorizontalRuler +NSScrollViewFindBarPositionBelowContent +NSScrollWheel +NSScrollWheelMask +NSScrollerArrowsDefaultSetting +NSScrollerArrowsMaxEnd +NSScrollerArrowsMinEnd +NSScrollerArrowsNone +NSScrollerDecrementArrow +NSScrollerDecrementLine +NSScrollerDecrementPage +NSScrollerIncrementArrow +NSScrollerIncrementLine +NSScrollerIncrementPage +NSScrollerKnob +NSScrollerKnobSlot +NSScrollerKnobStyleDark +NSScrollerKnobStyleDefault +NSScrollerKnobStyleLight +NSScrollerNoPart +NSScrollerStyleLegacy +NSScrollerStyleOverlay +NSSecondCalendarUnit +NSSegmentStyleAutomatic +NSSegmentStyleCapsule +NSSegmentStyleRoundRect +NSSegmentStyleRounded +NSSegmentStyleSmallSquare +NSSegmentStyleTexturedRounded +NSSegmentStyleTexturedSquare +NSSegmentSwitchTrackingMomentary +NSSegmentSwitchTrackingSelectAny +NSSegmentSwitchTrackingSelectOne +NSSelectByCharacter +NSSelectByParagraph +NSSelectByWord +NSSelectFunctionKey +NSSelectedTab +NSSelectingNext +NSSelectingPrevious +NSSelectionAffinityDownstream +NSSelectionAffinityUpstream +NSServiceApplicationLaunchFailedError +NSServiceApplicationNotFoundError +NSServiceErrorMaximum +NSServiceErrorMinimum +NSServiceInvalidPasteboardDataError +NSServiceMalformedServiceDictionaryError +NSServiceMiscellaneousError +NSServiceRequestTimedOutError +NSShadowlessSquareBezelStyle +NSSharedPublicDirectory +NSSharingContentScopeFull +NSSharingContentScopeItem +NSSharingContentScopePartial +NSSharingServiceErrorMaximum +NSSharingServiceErrorMinimum +NSSharingServiceNotConfiguredError +NSShiftJISStringEncoding +NSShiftKeyMask +NSShowControlGlyphs +NSShowInvisibleGlyphs +NSSingleDateMode +NSSingleUnderlineStyle +NSSizeDownFontAction +NSSizeUpFontAction +NSSmallCapsFontMask +NSSmallControlSize +NSSmallIconButtonBezelStyle +NSSmallSquareBezelStyle +NSSnapshotEventMergePolicy +NSSnapshotEventRefresh +NSSnapshotEventRollback +NSSnapshotEventUndoDeletion +NSSnapshotEventUndoInsertion +NSSnapshotEventUndoUpdate +NSSolarisOperatingSystem +NSSortConcurrent +NSSortStable +NSSpecialPageOrder +NSSpeechImmediateBoundary +NSSpeechSentenceBoundary +NSSpeechWordBoundary +NSSpellingStateGrammarFlag +NSSpellingStateSpellingFlag +NSSplitViewDividerStylePaneSplitter +NSSplitViewDividerStyleThick +NSSplitViewDividerStyleThin +NSSquareLineCapStyle +NSStackViewGravityBottom +NSStackViewGravityCenter +NSStackViewGravityLeading +NSStackViewGravityTop +NSStackViewGravityTrailing +NSStackViewVisibilityPriorityDetachOnlyIfNecessary +NSStackViewVisibilityPriorityMustHold +NSStackViewVisibilityPriorityNotVisible +NSStopFunctionKey +NSStreamEventEndEncountered +NSStreamEventErrorOccurred +NSStreamEventHasBytesAvailable +NSStreamEventHasSpaceAvailable +NSStreamEventNone +NSStreamEventOpenCompleted +NSStreamStatusAtEnd +NSStreamStatusClosed +NSStreamStatusError +NSStreamStatusNotOpen +NSStreamStatusOpen +NSStreamStatusOpening +NSStreamStatusReading +NSStreamStatusWriting +NSStringDrawingDisableScreenFontSubstitution +NSStringDrawingOneShot +NSStringDrawingTruncatesLastVisibleLine +NSStringDrawingUsesDeviceMetrics +NSStringDrawingUsesFontLeading +NSStringDrawingUsesLineFragmentOrigin +NSStringEncodingConversionAllowLossy +NSStringEncodingConversionExternalRepresentation +NSStringEnumerationByComposedCharacterSequences +NSStringEnumerationByLines +NSStringEnumerationByParagraphs +NSStringEnumerationBySentences +NSStringEnumerationByWords +NSStringEnumerationLocalized +NSStringEnumerationReverse +NSStringEnumerationSubstringNotRequired +NSSubqueryExpressionType +NSSunOSOperatingSystem +NSSwitchButton +NSSymbolStringEncoding +NSSysReqFunctionKey +NSSystemDefined +NSSystemDefinedMask +NSSystemDomainMask +NSSystemFunctionKey +NSTIFFCompressionCCITTFAX3 +NSTIFFCompressionCCITTFAX4 +NSTIFFCompressionJPEG +NSTIFFCompressionLZW +NSTIFFCompressionNEXT +NSTIFFCompressionNone +NSTIFFCompressionOldJPEG +NSTIFFCompressionPackBits +NSTIFFFileType +NSTabCharacter +NSTabTextMovement +NSTableColumnAutoresizingMask +NSTableColumnNoResizing +NSTableColumnUserResizingMask +NSTableViewAnimationEffectFade +NSTableViewAnimationEffectGap +NSTableViewAnimationEffectNone +NSTableViewAnimationSlideDown +NSTableViewAnimationSlideLeft +NSTableViewAnimationSlideRight +NSTableViewAnimationSlideUp +NSTableViewDashedHorizontalGridLineMask +NSTableViewDraggingDestinationFeedbackStyleGap +NSTableViewDraggingDestinationFeedbackStyleNone +NSTableViewDraggingDestinationFeedbackStyleRegular +NSTableViewDraggingDestinationFeedbackStyleSourceList +NSTableViewDropAbove +NSTableViewDropOn +NSTableViewFirstColumnOnlyAutoresizingStyle +NSTableViewGridNone +NSTableViewLastColumnOnlyAutoresizingStyle +NSTableViewNoColumnAutoresizing +NSTableViewReverseSequentialColumnAutoresizingStyle +NSTableViewRowSizeStyleCustom +NSTableViewRowSizeStyleDefault +NSTableViewRowSizeStyleLarge +NSTableViewRowSizeStyleMedium +NSTableViewRowSizeStyleSmall +NSTableViewSelectionHighlightStyleNone +NSTableViewSelectionHighlightStyleRegular +NSTableViewSelectionHighlightStyleSourceList +NSTableViewSequentialColumnAutoresizingStyle +NSTableViewSolidHorizontalGridLineMask +NSTableViewSolidVerticalGridLineMask +NSTableViewUniformColumnAutoresizingStyle +NSTabletPoint +NSTabletPointEventSubtype +NSTabletPointMask +NSTabletProximity +NSTabletProximityEventSubtype +NSTabletProximityMask +NSTaskTerminationReasonExit +NSTaskTerminationReasonUncaughtSignal +NSTerminateCancel +NSTerminateLater +NSTerminateNow +NSTextAlignmentCenter +NSTextAlignmentJustified +NSTextAlignmentLeft +NSTextAlignmentNatural +NSTextAlignmentRight +NSTextBlockAbsoluteValueType +NSTextBlockBaselineAlignment +NSTextBlockBorder +NSTextBlockBottomAlignment +NSTextBlockHeight +NSTextBlockMargin +NSTextBlockMaximumHeight +NSTextBlockMaximumWidth +NSTextBlockMiddleAlignment +NSTextBlockMinimumHeight +NSTextBlockMinimumWidth +NSTextBlockPadding +NSTextBlockPercentageValueType +NSTextBlockTopAlignment +NSTextBlockWidth +NSTextCellType +NSTextCheckingAllCustomTypes +NSTextCheckingAllSystemTypes +NSTextCheckingAllTypes +NSTextCheckingTypeAddress +NSTextCheckingTypeCorrection +NSTextCheckingTypeDash +NSTextCheckingTypeDate +NSTextCheckingTypeGrammar +NSTextCheckingTypeLink +NSTextCheckingTypeOrthography +NSTextCheckingTypePhoneNumber +NSTextCheckingTypeQuote +NSTextCheckingTypeRegularExpression +NSTextCheckingTypeReplacement +NSTextCheckingTypeSpelling +NSTextCheckingTypeTransitInformation +NSTextFieldAndStepperDatePickerStyle +NSTextFieldDatePickerStyle +NSTextFieldRoundedBezel +NSTextFieldSquareBezel +NSTextFinderActionHideFindInterface +NSTextFinderActionHideReplaceInterface +NSTextFinderActionNextMatch +NSTextFinderActionPreviousMatch +NSTextFinderActionReplace +NSTextFinderActionReplaceAll +NSTextFinderActionReplaceAllInSelection +NSTextFinderActionReplaceAndFind +NSTextFinderActionSelectAll +NSTextFinderActionSelectAllInSelection +NSTextFinderActionSetSearchString +NSTextFinderActionShowFindInterface +NSTextFinderActionShowReplaceInterface +NSTextFinderMatchingTypeContains +NSTextFinderMatchingTypeEndsWith +NSTextFinderMatchingTypeFullWord +NSTextFinderMatchingTypeStartsWith +NSTextLayoutOrientationHorizontal +NSTextLayoutOrientationVertical +NSTextListPrependEnclosingMarker +NSTextReadInapplicableDocumentTypeError +NSTextReadWriteErrorMaximum +NSTextReadWriteErrorMinimum +NSTextStorageEditedAttributes +NSTextStorageEditedCharacters +NSTextTableAutomaticLayoutAlgorithm +NSTextTableFixedLayoutAlgorithm +NSTextWriteInapplicableDocumentTypeError +NSTextWritingDirectionEmbedding +NSTextWritingDirectionOverride +NSTexturedBackgroundWindowMask +NSTexturedRoundedBezelStyle +NSTexturedSquareBezelStyle +NSThickSquareBezelStyle +NSThickerSquareBezelStyle +NSTickMarkAbove +NSTickMarkBelow +NSTickMarkLeft +NSTickMarkRight +NSTimeZoneCalendarUnit +NSTimeZoneDatePickerElementFlag +NSTimeZoneNameStyleDaylightSaving +NSTimeZoneNameStyleGeneric +NSTimeZoneNameStyleShortDaylightSaving +NSTimeZoneNameStyleShortGeneric +NSTimeZoneNameStyleShortStandard +NSTimeZoneNameStyleStandard +NSTitledWindowMask +NSToggleButton +NSToolbarItemVisibilityPriorityHigh +NSToolbarItemVisibilityPriorityLow +NSToolbarItemVisibilityPriorityStandard +NSToolbarItemVisibilityPriorityUser +NSTopTabsBezelBorder +NSTouchEventSubtype +NSTouchPhaseAny +NSTouchPhaseBegan +NSTouchPhaseCancelled +NSTouchPhaseEnded +NSTouchPhaseMoved +NSTouchPhaseStationary +NSTouchPhaseTouching +NSTrackModeMatrix +NSTrackingActiveAlways +NSTrackingActiveInActiveApp +NSTrackingActiveInKeyWindow +NSTrackingActiveWhenFirstResponder +NSTrackingAssumeInside +NSTrackingCursorUpdate +NSTrackingEnabledDuringMouseDrag +NSTrackingInVisibleRect +NSTrackingMouseEnteredAndExited +NSTrackingMouseMoved +NSTransformEntityMappingType +NSTrashDirectory +NSTwoByteGlyphPacking +NSTypesetterBehavior_10_2 +NSTypesetterBehavior_10_2_WithCompatibility +NSTypesetterBehavior_10_3 +NSTypesetterBehavior_10_4 +NSTypesetterContainerBreakAction +NSTypesetterHorizontalTabAction +NSTypesetterLatestBehavior +NSTypesetterLineBreakAction +NSTypesetterOriginalBehavior +NSTypesetterParagraphBreakAction +NSTypesetterWhitespaceAction +NSTypesetterZeroAdvancementAction +NSURLBookmarkCreationMinimalBookmark +NSURLBookmarkCreationPreferFileIDResolution +NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess +NSURLBookmarkCreationSuitableForBookmarkFile +NSURLBookmarkCreationWithSecurityScope +NSURLBookmarkResolutionWithSecurityScope +NSURLBookmarkResolutionWithoutMounting +NSURLBookmarkResolutionWithoutUI +NSURLCredentialPersistenceForSession +NSURLCredentialPersistenceNone +NSURLCredentialPersistencePermanent +NSURLCredentialPersistenceSynchronizable +NSURLHandleLoadFailed +NSURLHandleLoadInProgress +NSURLHandleLoadSucceeded +NSURLHandleNotLoaded +NSURLSessionAuthChallengeCancelAuthenticationChallenge +NSURLSessionAuthChallengePerformDefaultHandling +NSURLSessionAuthChallengeRejectProtectionSpace +NSURLSessionAuthChallengeUseCredential +NSURLSessionResponseAllow +NSURLSessionResponseBecomeDownload +NSURLSessionResponseCancel +NSURLSessionTaskStateCanceling +NSURLSessionTaskStateCompleted +NSURLSessionTaskStateRunning +NSURLSessionTaskStateSuspended +NSUTF16BigEndianStringEncoding +NSUTF16LittleEndianStringEncoding +NSUTF16StringEncoding +NSUTF32BigEndianStringEncoding +NSUTF32LittleEndianStringEncoding +NSUTF32StringEncoding +NSUTF8StringEncoding +NSUbiquitousFileErrorMaximum +NSUbiquitousFileErrorMinimum +NSUbiquitousFileNotUploadedDueToQuotaError +NSUbiquitousFileUbiquityServerNotAvailable +NSUbiquitousFileUnavailableError +NSUbiquitousKeyValueStoreAccountChange +NSUbiquitousKeyValueStoreInitialSyncChange +NSUbiquitousKeyValueStoreQuotaViolationChange +NSUbiquitousKeyValueStoreServerChange +NSUnboldFontMask +NSUncachedRead +NSUndefinedDateComponent +NSUndefinedEntityMappingType +NSUnderlineByWord +NSUnderlinePatternDash +NSUnderlinePatternDashDot +NSUnderlinePatternDashDotDot +NSUnderlinePatternDot +NSUnderlinePatternSolid +NSUnderlineStyleDouble +NSUnderlineStyleNone +NSUnderlineStyleSingle +NSUnderlineStyleThick +NSUndoCloseGroupingRunLoopOrdering +NSUndoFunctionKey +NSUnicodeStringEncoding +NSUnifiedTitleAndToolbarWindowMask +NSUnionSetExpressionType +NSUnitalicFontMask +NSUnknownColorSpaceModel +NSUnknownKeyScriptError +NSUnknownKeySpecifierError +NSUnknownPageOrder +NSUnknownPointingDevice +NSUnscaledWindowMask +NSUpArrowFunctionKey +NSUpTextMovement +NSUpdateWindowsRunLoopOrdering +NSUserCancelledError +NSUserDirectory +NSUserDomainMask +NSUserFunctionKey +NSUserInterfaceLayoutDirectionLeftToRight +NSUserInterfaceLayoutDirectionRightToLeft +NSUserInterfaceLayoutOrientationHorizontal +NSUserInterfaceLayoutOrientationVertical +NSUserNotificationActivationTypeActionButtonClicked +NSUserNotificationActivationTypeContentsClicked +NSUserNotificationActivationTypeNone +NSUserNotificationActivationTypeReplied +NSUtilityWindowMask +NSValidationDateTooLateError +NSValidationDateTooSoonError +NSValidationErrorMaximum +NSValidationErrorMinimum +NSValidationInvalidDateError +NSValidationMissingMandatoryPropertyError +NSValidationMultipleErrorsError +NSValidationNumberTooLargeError +NSValidationNumberTooSmallError +NSValidationRelationshipDeniedDeleteError +NSValidationRelationshipExceedsMaximumCountError +NSValidationRelationshipLacksMinimumCountError +NSValidationStringPatternMatchingError +NSValidationStringTooLongError +NSValidationStringTooShortError +NSVariableExpressionType +NSVerticalRuler +NSViaPanelFontAction +NSViewHeightSizable +NSViewLayerContentsPlacementBottom +NSViewLayerContentsPlacementBottomLeft +NSViewLayerContentsPlacementBottomRight +NSViewLayerContentsPlacementCenter +NSViewLayerContentsPlacementLeft +NSViewLayerContentsPlacementRight +NSViewLayerContentsPlacementScaleAxesIndependently +NSViewLayerContentsPlacementScaleProportionallyToFill +NSViewLayerContentsPlacementScaleProportionallyToFit +NSViewLayerContentsPlacementTop +NSViewLayerContentsPlacementTopLeft +NSViewLayerContentsPlacementTopRight +NSViewLayerContentsRedrawBeforeViewResize +NSViewLayerContentsRedrawCrossfade +NSViewLayerContentsRedrawDuringViewResize +NSViewLayerContentsRedrawNever +NSViewLayerContentsRedrawOnSetNeedsDisplay +NSViewMaxXMargin +NSViewMaxYMargin +NSViewMinXMargin +NSViewMinYMargin +NSViewNotSizable +NSViewWidthSizable +NSVolumeEnumerationProduceFileReferenceURLs +NSVolumeEnumerationSkipHiddenVolumes +NSWantsBidiLevels +NSWarningAlertStyle +NSWeekCalendarUnit +NSWeekOfMonthCalendarUnit +NSWeekOfYearCalendarUnit +NSWeekdayCalendarUnit +NSWeekdayOrdinalCalendarUnit +NSWheelModeColorPanel +NSWidthInsensitiveSearch +NSWindowAbove +NSWindowAnimationBehaviorAlertPanel +NSWindowAnimationBehaviorDefault +NSWindowAnimationBehaviorDocumentWindow +NSWindowAnimationBehaviorNone +NSWindowAnimationBehaviorUtilityWindow +NSWindowBackingLocationDefault +NSWindowBackingLocationMainMemory +NSWindowBackingLocationVideoMemory +NSWindowBelow +NSWindowCloseButton +NSWindowCollectionBehaviorCanJoinAllSpaces +NSWindowCollectionBehaviorDefault +NSWindowCollectionBehaviorFullScreenAuxiliary +NSWindowCollectionBehaviorFullScreenPrimary +NSWindowCollectionBehaviorIgnoresCycle +NSWindowCollectionBehaviorManaged +NSWindowCollectionBehaviorMoveToActiveSpace +NSWindowCollectionBehaviorParticipatesInCycle +NSWindowCollectionBehaviorStationary +NSWindowCollectionBehaviorTransient +NSWindowDepthOnehundredtwentyeightBitRGB +NSWindowDepthSixtyfourBitRGB +NSWindowDepthTwentyfourBitRGB +NSWindowDocumentIconButton +NSWindowDocumentVersionsButton +NSWindowExposedEventType +NSWindowFullScreenButton +NSWindowMiniaturizeButton +NSWindowMovedEventType +NSWindowNumberListAllApplications +NSWindowNumberListAllSpaces +NSWindowOcclusionStateVisible +NSWindowOut +NSWindowSharingNone +NSWindowSharingReadOnly +NSWindowSharingReadWrite +NSWindowToolbarButton +NSWindowZoomButton +NSWindows95InterfaceStyle +NSWindows95OperatingSystem +NSWindowsCP1250StringEncoding +NSWindowsCP1251StringEncoding +NSWindowsCP1252StringEncoding +NSWindowsCP1253StringEncoding +NSWindowsCP1254StringEncoding +NSWindowsNTOperatingSystem +NSWorkspaceLaunchAllowingClassicStartup +NSWorkspaceLaunchAndHide +NSWorkspaceLaunchAndHideOthers +NSWorkspaceLaunchAndPrint +NSWorkspaceLaunchAsync +NSWorkspaceLaunchDefault +NSWorkspaceLaunchInhibitingBackgroundOnly +NSWorkspaceLaunchNewInstance +NSWorkspaceLaunchPreferringClassic +NSWorkspaceLaunchWithErrorPresentation +NSWorkspaceLaunchWithoutActivation +NSWorkspaceLaunchWithoutAddingToRecents +NSWrapCalendarComponents +NSWritingDirectionLeftToRight +NSWritingDirectionNatural +NSWritingDirectionRightToLeft +NSXMLAttributeCDATAKind +NSXMLAttributeDeclarationKind +NSXMLAttributeEntitiesKind +NSXMLAttributeEntityKind +NSXMLAttributeEnumerationKind +NSXMLAttributeIDKind +NSXMLAttributeIDRefKind +NSXMLAttributeIDRefsKind +NSXMLAttributeKind +NSXMLAttributeNMTokenKind +NSXMLAttributeNMTokensKind +NSXMLAttributeNotationKind +NSXMLCommentKind +NSXMLDTDKind +NSXMLDocumentHTMLKind +NSXMLDocumentIncludeContentTypeDeclaration +NSXMLDocumentKind +NSXMLDocumentTextKind +NSXMLDocumentTidyHTML +NSXMLDocumentTidyXML +NSXMLDocumentValidate +NSXMLDocumentXHTMLKind +NSXMLDocumentXInclude +NSXMLDocumentXMLKind +NSXMLElementDeclarationAnyKind +NSXMLElementDeclarationElementKind +NSXMLElementDeclarationEmptyKind +NSXMLElementDeclarationKind +NSXMLElementDeclarationMixedKind +NSXMLElementDeclarationUndefinedKind +NSXMLElementKind +NSXMLEntityDeclarationKind +NSXMLEntityGeneralKind +NSXMLEntityParameterKind +NSXMLEntityParsedKind +NSXMLEntityPredefined +NSXMLEntityUnparsedKind +NSXMLInvalidKind +NSXMLNamespaceKind +NSXMLNodeCompactEmptyElement +NSXMLNodeExpandEmptyElement +NSXMLNodeIsCDATA +NSXMLNodeLoadExternalEntitiesAlways +NSXMLNodeLoadExternalEntitiesNever +NSXMLNodeLoadExternalEntitiesSameOriginOnly +NSXMLNodeNeverEscapeContents +NSXMLNodeOptionsNone +NSXMLNodePreserveAll +NSXMLNodePreserveAttributeOrder +NSXMLNodePreserveCDATA +NSXMLNodePreserveCharacterReferences +NSXMLNodePreserveDTD +NSXMLNodePreserveEmptyElements +NSXMLNodePreserveEntities +NSXMLNodePreserveNamespaceOrder +NSXMLNodePreservePrefixes +NSXMLNodePreserveQuotes +NSXMLNodePreserveWhitespace +NSXMLNodePrettyPrint +NSXMLNodePromoteSignificantWhitespace +NSXMLNodeUseDoubleQuotes +NSXMLNodeUseSingleQuotes +NSXMLNotationDeclarationKind +NSXMLParserAttributeHasNoValueError +NSXMLParserAttributeListNotFinishedError +NSXMLParserAttributeListNotStartedError +NSXMLParserAttributeNotFinishedError +NSXMLParserAttributeNotStartedError +NSXMLParserAttributeRedefinedError +NSXMLParserCDATANotFinishedError +NSXMLParserCharacterRefAtEOFError +NSXMLParserCharacterRefInDTDError +NSXMLParserCharacterRefInEpilogError +NSXMLParserCharacterRefInPrologError +NSXMLParserCommentContainsDoubleHyphenError +NSXMLParserCommentNotFinishedError +NSXMLParserConditionalSectionNotFinishedError +NSXMLParserConditionalSectionNotStartedError +NSXMLParserDOCTYPEDeclNotFinishedError +NSXMLParserDelegateAbortedParseError +NSXMLParserDocumentStartError +NSXMLParserElementContentDeclNotFinishedError +NSXMLParserElementContentDeclNotStartedError +NSXMLParserEmptyDocumentError +NSXMLParserEncodingNotSupportedError +NSXMLParserEntityBoundaryError +NSXMLParserEntityIsExternalError +NSXMLParserEntityIsParameterError +NSXMLParserEntityNotFinishedError +NSXMLParserEntityNotStartedError +NSXMLParserEntityRefAtEOFError +NSXMLParserEntityRefInDTDError +NSXMLParserEntityRefInEpilogError +NSXMLParserEntityRefInPrologError +NSXMLParserEntityRefLoopError +NSXMLParserEntityReferenceMissingSemiError +NSXMLParserEntityReferenceWithoutNameError +NSXMLParserEntityValueRequiredError +NSXMLParserEqualExpectedError +NSXMLParserExternalStandaloneEntityError +NSXMLParserExternalSubsetNotFinishedError +NSXMLParserExtraContentError +NSXMLParserGTRequiredError +NSXMLParserInternalError +NSXMLParserInvalidCharacterError +NSXMLParserInvalidCharacterInEntityError +NSXMLParserInvalidCharacterRefError +NSXMLParserInvalidConditionalSectionError +NSXMLParserInvalidDecimalCharacterRefError +NSXMLParserInvalidEncodingError +NSXMLParserInvalidEncodingNameError +NSXMLParserInvalidHexCharacterRefError +NSXMLParserInvalidURIError +NSXMLParserLTRequiredError +NSXMLParserLTSlashRequiredError +NSXMLParserLessThanSymbolInAttributeError +NSXMLParserLiteralNotFinishedError +NSXMLParserLiteralNotStartedError +NSXMLParserMisplacedCDATAEndStringError +NSXMLParserMisplacedXMLDeclarationError +NSXMLParserMixedContentDeclNotFinishedError +NSXMLParserMixedContentDeclNotStartedError +NSXMLParserNAMERequiredError +NSXMLParserNMTOKENRequiredError +NSXMLParserNamespaceDeclarationError +NSXMLParserNoDTDError +NSXMLParserNotWellBalancedError +NSXMLParserNotationNotFinishedError +NSXMLParserNotationNotStartedError +NSXMLParserOutOfMemoryError +NSXMLParserPCDATARequiredError +NSXMLParserParsedEntityRefAtEOFError +NSXMLParserParsedEntityRefInEpilogError +NSXMLParserParsedEntityRefInInternalError +NSXMLParserParsedEntityRefInInternalSubsetError +NSXMLParserParsedEntityRefInPrologError +NSXMLParserParsedEntityRefMissingSemiError +NSXMLParserParsedEntityRefNoNameError +NSXMLParserPrematureDocumentEndError +NSXMLParserProcessingInstructionNotFinishedError +NSXMLParserProcessingInstructionNotStartedError +NSXMLParserPublicIdentifierRequiredError +NSXMLParserResolveExternalEntitiesAlways +NSXMLParserResolveExternalEntitiesNever +NSXMLParserResolveExternalEntitiesNoNetwork +NSXMLParserResolveExternalEntitiesSameOriginOnly +NSXMLParserSeparatorRequiredError +NSXMLParserSpaceRequiredError +NSXMLParserStandaloneValueError +NSXMLParserStringNotClosedError +NSXMLParserStringNotStartedError +NSXMLParserTagNameMismatchError +NSXMLParserURIFragmentError +NSXMLParserURIRequiredError +NSXMLParserUndeclaredEntityError +NSXMLParserUnfinishedTagError +NSXMLParserUnknownEncodingError +NSXMLParserUnparsedEntityError +NSXMLParserXMLDeclNotFinishedError +NSXMLParserXMLDeclNotStartedError +NSXMLProcessingInstructionKind +NSXMLTextKind +NSXPCConnectionErrorMaximum +NSXPCConnectionErrorMinimum +NSXPCConnectionInterrupted +NSXPCConnectionInvalid +NSXPCConnectionPrivileged +NSXPCConnectionReplyInvalid +NSYearCalendarUnit +NSYearForWeekOfYearCalendarUnit +NSYearMonthDatePickerElementFlag +NSYearMonthDayDatePickerElementFlag +UIAccessibilityNavigationStyleAutomatic +UIAccessibilityNavigationStyleCombined +UIAccessibilityNavigationStyleSeparate +UIAccessibilityScrollDirectionDown +UIAccessibilityScrollDirectionLeft +UIAccessibilityScrollDirectionNext +UIAccessibilityScrollDirectionPrevious +UIAccessibilityScrollDirectionRight +UIAccessibilityScrollDirectionUp +UIAccessibilityZoomTypeInsertionPoint +UIActionSheetStyleAutomatic +UIActionSheetStyleBlackOpaque +UIActionSheetStyleBlackTranslucent +UIActionSheetStyleDefault +UIActivityCategoryAction +UIActivityCategoryShare +UIActivityIndicatorViewStyleGray +UIActivityIndicatorViewStyleWhite +UIActivityIndicatorViewStyleWhiteLarge +UIAlertActionStyleCancel +UIAlertActionStyleDefault +UIAlertActionStyleDestructive +UIAlertControllerStyleActionSheet +UIAlertControllerStyleAlert +UIAlertViewStyleDefault +UIAlertViewStyleLoginAndPasswordInput +UIAlertViewStylePlainTextInput +UIAlertViewStyleSecureTextInput +UIApplicationStateActive +UIApplicationStateBackground +UIApplicationStateInactive +UIAttachmentBehaviorTypeAnchor +UIAttachmentBehaviorTypeItems +UIBackgroundFetchResultFailed +UIBackgroundFetchResultNewData +UIBackgroundFetchResultNoData +UIBackgroundRefreshStatusAvailable +UIBackgroundRefreshStatusDenied +UIBackgroundRefreshStatusRestricted +UIBarButtonItemStyleBordered +UIBarButtonItemStyleDone +UIBarButtonItemStylePlain +UIBarButtonSystemItemAction +UIBarButtonSystemItemAdd +UIBarButtonSystemItemBookmarks +UIBarButtonSystemItemCamera +UIBarButtonSystemItemCancel +UIBarButtonSystemItemCompose +UIBarButtonSystemItemDone +UIBarButtonSystemItemEdit +UIBarButtonSystemItemFastForward +UIBarButtonSystemItemFixedSpace +UIBarButtonSystemItemFlexibleSpace +UIBarButtonSystemItemOrganize +UIBarButtonSystemItemPageCurl +UIBarButtonSystemItemPause +UIBarButtonSystemItemPlay +UIBarButtonSystemItemRedo +UIBarButtonSystemItemRefresh +UIBarButtonSystemItemReply +UIBarButtonSystemItemRewind +UIBarButtonSystemItemSave +UIBarButtonSystemItemSearch +UIBarButtonSystemItemStop +UIBarButtonSystemItemTrash +UIBarButtonSystemItemUndo +UIBarMetricsCompact +UIBarMetricsCompactPrompt +UIBarMetricsDefault +UIBarMetricsDefaultPrompt +UIBarMetricsLandscapePhone +UIBarMetricsLandscapePhonePrompt +UIBarPositionAny +UIBarPositionBottom +UIBarPositionTop +UIBarPositionTopAttached +UIBarStyleBlack +UIBarStyleBlackOpaque +UIBarStyleBlackTranslucent +UIBarStyleDefault +UIBaselineAdjustmentAlignBaselines +UIBaselineAdjustmentAlignCenters +UIBaselineAdjustmentNone +UIBlurEffectStyleDark +UIBlurEffectStyleExtraLight +UIBlurEffectStyleLight +UIButtonTypeContactAdd +UIButtonTypeCustom +UIButtonTypeDetailDisclosure +UIButtonTypeInfoDark +UIButtonTypeInfoLight +UIButtonTypeRoundedRect +UIButtonTypeSystem +UICollectionElementCategoryCell +UICollectionElementCategoryDecorationView +UICollectionElementCategorySupplementaryView +UICollectionUpdateActionDelete +UICollectionUpdateActionInsert +UICollectionUpdateActionMove +UICollectionUpdateActionNone +UICollectionUpdateActionReload +UICollectionViewScrollDirectionHorizontal +UICollectionViewScrollDirectionVertical +UICollectionViewScrollPositionBottom +UICollectionViewScrollPositionCenteredHorizontally +UICollectionViewScrollPositionCenteredVertically +UICollectionViewScrollPositionLeft +UICollectionViewScrollPositionNone +UICollectionViewScrollPositionRight +UICollectionViewScrollPositionTop +UICollisionBehaviorModeBoundaries +UICollisionBehaviorModeEverything +UICollisionBehaviorModeItems +UIControlContentHorizontalAlignmentCenter +UIControlContentHorizontalAlignmentFill +UIControlContentHorizontalAlignmentLeft +UIControlContentHorizontalAlignmentRight +UIControlContentVerticalAlignmentBottom +UIControlContentVerticalAlignmentCenter +UIControlContentVerticalAlignmentFill +UIControlContentVerticalAlignmentTop +UIControlEventAllEditingEvents +UIControlEventAllEvents +UIControlEventAllTouchEvents +UIControlEventApplicationReserved +UIControlEventEditingChanged +UIControlEventEditingDidBegin +UIControlEventEditingDidEnd +UIControlEventEditingDidEndOnExit +UIControlEventSystemReserved +UIControlEventTouchCancel +UIControlEventTouchDown +UIControlEventTouchDownRepeat +UIControlEventTouchDragEnter +UIControlEventTouchDragExit +UIControlEventTouchDragInside +UIControlEventTouchDragOutside +UIControlEventTouchUpInside +UIControlEventTouchUpOutside +UIControlEventValueChanged +UIControlStateApplication +UIControlStateDisabled +UIControlStateHighlighted +UIControlStateNormal +UIControlStateReserved +UIControlStateSelected +UIDataDetectorTypeAddress +UIDataDetectorTypeAll +UIDataDetectorTypeCalendarEvent +UIDataDetectorTypeLink +UIDataDetectorTypeNone +UIDataDetectorTypePhoneNumber +UIDatePickerModeCountDownTimer +UIDatePickerModeDate +UIDatePickerModeDateAndTime +UIDatePickerModeTime +UIDeviceBatteryStateCharging +UIDeviceBatteryStateFull +UIDeviceBatteryStateUnknown +UIDeviceBatteryStateUnplugged +UIDeviceOrientationFaceDown +UIDeviceOrientationFaceUp +UIDeviceOrientationLandscapeLeft +UIDeviceOrientationLandscapeRight +UIDeviceOrientationPortrait +UIDeviceOrientationPortraitUpsideDown +UIDeviceOrientationUnknown +UIDocumentChangeCleared +UIDocumentChangeDone +UIDocumentChangeRedone +UIDocumentChangeUndone +UIDocumentMenuOrderFirst +UIDocumentMenuOrderLast +UIDocumentPickerModeExportToService +UIDocumentPickerModeImport +UIDocumentPickerModeMoveToService +UIDocumentPickerModeOpen +UIDocumentSaveForCreating +UIDocumentSaveForOverwriting +UIDocumentStateClosed +UIDocumentStateEditingDisabled +UIDocumentStateInConflict +UIDocumentStateNormal +UIDocumentStateSavingError +UIEventSubtypeMotionShake +UIEventSubtypeNone +UIEventSubtypeRemoteControlBeginSeekingBackward +UIEventSubtypeRemoteControlBeginSeekingForward +UIEventSubtypeRemoteControlEndSeekingBackward +UIEventSubtypeRemoteControlEndSeekingForward +UIEventSubtypeRemoteControlNextTrack +UIEventSubtypeRemoteControlPause +UIEventSubtypeRemoteControlPlay +UIEventSubtypeRemoteControlPreviousTrack +UIEventSubtypeRemoteControlStop +UIEventSubtypeRemoteControlTogglePlayPause +UIEventTypeMotion +UIEventTypeRemoteControl +UIEventTypeTouches +UIFontDescriptorClassClarendonSerifs +UIFontDescriptorClassFreeformSerifs +UIFontDescriptorClassMask +UIFontDescriptorClassModernSerifs +UIFontDescriptorClassOldStyleSerifs +UIFontDescriptorClassOrnamentals +UIFontDescriptorClassSansSerif +UIFontDescriptorClassScripts +UIFontDescriptorClassSlabSerifs +UIFontDescriptorClassSymbolic +UIFontDescriptorClassTransitionalSerifs +UIFontDescriptorClassUnknown +UIFontDescriptorSymbolicTraits +UIFontDescriptorTraitBold +UIFontDescriptorTraitCondensed +UIFontDescriptorTraitExpanded +UIFontDescriptorTraitItalic +UIFontDescriptorTraitLooseLeading +UIFontDescriptorTraitMonoSpace +UIFontDescriptorTraitTightLeading +UIFontDescriptorTraitUIOptimized +UIFontDescriptorTraitVertical +UIGestureRecognizerStateBegan +UIGestureRecognizerStateCancelled +UIGestureRecognizerStateChanged +UIGestureRecognizerStateEnded +UIGestureRecognizerStateFailed +UIGestureRecognizerStatePossible +UIGestureRecognizerStateRecognized +UIGuidedAccessRestrictionStateAllow +UIGuidedAccessRestrictionStateDeny +UIImageOrientationDown +UIImageOrientationDownMirrored +UIImageOrientationLeft +UIImageOrientationLeftMirrored +UIImageOrientationRight +UIImageOrientationRightMirrored +UIImageOrientationUp +UIImageOrientationUpMirrored +UIImagePickerControllerCameraCaptureModePhoto +UIImagePickerControllerCameraCaptureModeVideo +UIImagePickerControllerCameraDeviceFront +UIImagePickerControllerCameraDeviceRear +UIImagePickerControllerCameraFlashModeAuto +UIImagePickerControllerCameraFlashModeOff +UIImagePickerControllerCameraFlashModeOn +UIImagePickerControllerQualityType640x480 +UIImagePickerControllerQualityTypeHigh +UIImagePickerControllerQualityTypeIFrame1280x720 +UIImagePickerControllerQualityTypeIFrame960x540 +UIImagePickerControllerQualityTypeLow +UIImagePickerControllerQualityTypeMedium +UIImagePickerControllerSourceTypeCamera +UIImagePickerControllerSourceTypePhotoLibrary +UIImagePickerControllerSourceTypeSavedPhotosAlbum +UIImageRenderingModeAlwaysOriginal +UIImageRenderingModeAlwaysTemplate +UIImageRenderingModeAutomatic +UIImageResizingModeStretch +UIImageResizingModeTile +UIInputViewStyleDefault +UIInputViewStyleKeyboard +UIInterfaceOrientationLandscapeLeft +UIInterfaceOrientationLandscapeRight +UIInterfaceOrientationMaskAll +UIInterfaceOrientationMaskAllButUpsideDown +UIInterfaceOrientationMaskLandscape +UIInterfaceOrientationMaskLandscapeLeft +UIInterfaceOrientationMaskLandscapeRight +UIInterfaceOrientationMaskPortrait +UIInterfaceOrientationMaskPortraitUpsideDown +UIInterfaceOrientationPortrait +UIInterfaceOrientationPortraitUpsideDown +UIInterfaceOrientationUnknown +UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis +UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis +UIKeyModifierAlphaShift +UIKeyModifierAlternate +UIKeyModifierCommand +UIKeyModifierControl +UIKeyModifierNumericPad +UIKeyModifierShift +UIKeyboardAppearanceAlert +UIKeyboardAppearanceDark +UIKeyboardAppearanceDefault +UIKeyboardAppearanceLight +UIKeyboardTypeASCIICapable +UIKeyboardTypeAlphabet +UIKeyboardTypeDecimalPad +UIKeyboardTypeDefault +UIKeyboardTypeEmailAddress +UIKeyboardTypeNamePhonePad +UIKeyboardTypeNumberPad +UIKeyboardTypeNumbersAndPunctuation +UIKeyboardTypePhonePad +UIKeyboardTypeTwitter +UIKeyboardTypeURL +UIKeyboardTypeWebSearch +UILayoutConstraintAxisHorizontal +UILayoutConstraintAxisVertical +UILineBreakModeCharacterWrap +UILineBreakModeClip +UILineBreakModeHeadTruncation +UILineBreakModeMiddleTruncation +UILineBreakModeTailTruncation +UILineBreakModeWordWrap +UIMenuControllerArrowDefault +UIMenuControllerArrowDown +UIMenuControllerArrowLeft +UIMenuControllerArrowRight +UIMenuControllerArrowUp +UIModalPresentationCurrentContext +UIModalPresentationCustom +UIModalPresentationFormSheet +UIModalPresentationFullScreen +UIModalPresentationNone +UIModalPresentationOverCurrentContext +UIModalPresentationOverFullScreen +UIModalPresentationPageSheet +UIModalPresentationPopover +UIModalTransitionStyleCoverVertical +UIModalTransitionStyleCrossDissolve +UIModalTransitionStyleFlipHorizontal +UIModalTransitionStylePartialCurl +UINavigationControllerOperationNone +UINavigationControllerOperationPop +UINavigationControllerOperationPush +UIPageViewControllerNavigationDirectionForward +UIPageViewControllerNavigationDirectionReverse +UIPageViewControllerNavigationOrientationHorizontal +UIPageViewControllerNavigationOrientationVertical +UIPageViewControllerSpineLocationMax +UIPageViewControllerSpineLocationMid +UIPageViewControllerSpineLocationMin +UIPageViewControllerSpineLocationNone +UIPageViewControllerTransitionStylePageCurl +UIPageViewControllerTransitionStyleScroll +UIPopoverArrowDirectionAny +UIPopoverArrowDirectionDown +UIPopoverArrowDirectionLeft +UIPopoverArrowDirectionRight +UIPopoverArrowDirectionUnknown +UIPopoverArrowDirectionUp +UIPrintInfoDuplexLongEdge +UIPrintInfoDuplexNone +UIPrintInfoDuplexShortEdge +UIPrintInfoOrientationLandscape +UIPrintInfoOrientationPortrait +UIPrintInfoOutputGeneral +UIPrintInfoOutputGrayscale +UIPrintInfoOutputPhoto +UIPrintInfoOutputPhotoGrayscale +UIPrintJobFailedError +UIPrintNoContentError +UIPrintUnknownImageFormatError +UIPrinterJobTypeDocument +UIPrinterJobTypeEnvelope +UIPrinterJobTypeLabel +UIPrinterJobTypeLargeFormat +UIPrinterJobTypePhoto +UIPrinterJobTypePostcard +UIPrinterJobTypeReceipt +UIPrinterJobTypeRoll +UIPrinterJobTypeUnknown +UIPrintingNotAvailableError +UIProgressViewStyleBar +UIProgressViewStyleDefault +UIPushBehaviorModeContinuous +UIPushBehaviorModeInstantaneous +UIRectCornerAllCorners +UIRectCornerBottomLeft +UIRectCornerBottomRight +UIRectCornerTopLeft +UIRectCornerTopRight +UIRectEdgeAll +UIRectEdgeBottom +UIRectEdgeLeft +UIRectEdgeNone +UIRectEdgeRight +UIRectEdgeTop +UIRemoteNotificationTypeAlert +UIRemoteNotificationTypeBadge +UIRemoteNotificationTypeNewsstandContentAvailability +UIRemoteNotificationTypeNone +UIRemoteNotificationTypeSound +UIReturnKeyDefault +UIReturnKeyDone +UIReturnKeyEmergencyCall +UIReturnKeyGo +UIReturnKeyGoogle +UIReturnKeyJoin +UIReturnKeyNext +UIReturnKeyRoute +UIReturnKeySearch +UIReturnKeySend +UIReturnKeyYahoo +UIScreenOverscanCompensationInsetApplicationFrame +UIScreenOverscanCompensationInsetBounds +UIScreenOverscanCompensationScale +UIScrollViewIndicatorStyleBlack +UIScrollViewIndicatorStyleDefault +UIScrollViewIndicatorStyleWhite +UIScrollViewKeyboardDismissModeInteractive +UIScrollViewKeyboardDismissModeNone +UIScrollViewKeyboardDismissModeOnDrag +UISearchBarIconBookmark +UISearchBarIconClear +UISearchBarIconResultsList +UISearchBarIconSearch +UISearchBarStyleDefault +UISearchBarStyleMinimal +UISearchBarStyleProminent +UISegmentedControlNoSegment +UISegmentedControlSegmentAlone +UISegmentedControlSegmentAny +UISegmentedControlSegmentCenter +UISegmentedControlSegmentLeft +UISegmentedControlSegmentRight +UISegmentedControlStyleBar +UISegmentedControlStyleBezeled +UISegmentedControlStyleBordered +UISegmentedControlStylePlain +UISplitViewControllerDisplayModeAllVisible +UISplitViewControllerDisplayModeAutomatic +UISplitViewControllerDisplayModePrimaryHidden +UISplitViewControllerDisplayModePrimaryOverlay +UIStatusBarAnimationFade +UIStatusBarAnimationNone +UIStatusBarAnimationSlide +UIStatusBarStyleBlackOpaque +UIStatusBarStyleBlackTranslucent +UIStatusBarStyleDefault +UIStatusBarStyleLightContent +UISwipeGestureRecognizerDirectionDown +UISwipeGestureRecognizerDirectionLeft +UISwipeGestureRecognizerDirectionRight +UISwipeGestureRecognizerDirectionUp +UISystemAnimationDelete +UITabBarItemPositioningAutomatic +UITabBarItemPositioningCentered +UITabBarItemPositioningFill +UITabBarSystemItemBookmarks +UITabBarSystemItemContacts +UITabBarSystemItemDownloads +UITabBarSystemItemFavorites +UITabBarSystemItemFeatured +UITabBarSystemItemHistory +UITabBarSystemItemMore +UITabBarSystemItemMostRecent +UITabBarSystemItemMostViewed +UITabBarSystemItemRecents +UITabBarSystemItemSearch +UITabBarSystemItemTopRated +UITableViewCellAccessoryCheckmark +UITableViewCellAccessoryDetailButton +UITableViewCellAccessoryDetailDisclosureButton +UITableViewCellAccessoryDisclosureIndicator +UITableViewCellAccessoryNone +UITableViewCellEditingStyleDelete +UITableViewCellEditingStyleInsert +UITableViewCellEditingStyleNone +UITableViewCellSelectionStyleBlue +UITableViewCellSelectionStyleDefault +UITableViewCellSelectionStyleGray +UITableViewCellSelectionStyleNone +UITableViewCellSeparatorStyleNone +UITableViewCellSeparatorStyleSingleLine +UITableViewCellSeparatorStyleSingleLineEtched +UITableViewCellStateDefaultMask +UITableViewCellStateShowingDeleteConfirmationMask +UITableViewCellStateShowingEditControlMask +UITableViewCellStyleDefault +UITableViewCellStyleSubtitle +UITableViewCellStyleValue1 +UITableViewCellStyleValue2 +UITableViewRowActionStyleDefault +UITableViewRowActionStyleDestructive +UITableViewRowActionStyleNormal +UITableViewRowAnimationAutomatic +UITableViewRowAnimationBottom +UITableViewRowAnimationFade +UITableViewRowAnimationLeft +UITableViewRowAnimationMiddle +UITableViewRowAnimationNone +UITableViewRowAnimationRight +UITableViewRowAnimationTop +UITableViewScrollPositionBottom +UITableViewScrollPositionMiddle +UITableViewScrollPositionNone +UITableViewScrollPositionTop +UITableViewStyleGrouped +UITableViewStylePlain +UITextAlignmentCenter +UITextAlignmentLeft +UITextAlignmentRight +UITextAutocapitalizationTypeAllCharacters +UITextAutocapitalizationTypeNone +UITextAutocapitalizationTypeSentences +UITextAutocapitalizationTypeWords +UITextAutocorrectionTypeDefault +UITextAutocorrectionTypeNo +UITextAutocorrectionTypeYes +UITextBorderStyleBezel +UITextBorderStyleLine +UITextBorderStyleNone +UITextBorderStyleRoundedRect +UITextFieldViewModeAlways +UITextFieldViewModeNever +UITextFieldViewModeUnlessEditing +UITextFieldViewModeWhileEditing +UITextGranularityCharacter +UITextGranularityDocument +UITextGranularityLine +UITextGranularityParagraph +UITextGranularitySentence +UITextGranularityWord +UITextLayoutDirectionDown +UITextLayoutDirectionLeft +UITextLayoutDirectionRight +UITextLayoutDirectionUp +UITextSpellCheckingTypeDefault +UITextSpellCheckingTypeNo +UITextSpellCheckingTypeYes +UITextStorageDirectionBackward +UITextStorageDirectionForward +UITextWritingDirectionLeftToRight +UITextWritingDirectionNatural +UITextWritingDirectionRightToLeft +UITouchPhaseBegan +UITouchPhaseCancelled +UITouchPhaseEnded +UITouchPhaseMoved +UITouchPhaseStationary +UIUserInterfaceIdiomPad +UIUserInterfaceIdiomPhone +UIUserInterfaceIdiomUnspecified +UIUserInterfaceLayoutDirectionLeftToRight +UIUserInterfaceLayoutDirectionRightToLeft +UIUserInterfaceSizeClassCompact +UIUserInterfaceSizeClassRegular +UIUserInterfaceSizeClassUnspecified +UIUserNotificationActionContextDefault +UIUserNotificationActionContextMinimal +UIUserNotificationActivationModeBackground +UIUserNotificationActivationModeForeground +UIUserNotificationTypeAlert +UIUserNotificationTypeBadge +UIUserNotificationTypeNone +UIUserNotificationTypeSound +UIViewAnimationCurveEaseIn +UIViewAnimationCurveEaseInOut +UIViewAnimationCurveEaseOut +UIViewAnimationCurveLinear +UIViewAnimationOptionAllowAnimatedContent +UIViewAnimationOptionAllowUserInteraction +UIViewAnimationOptionAutoreverse +UIViewAnimationOptionBeginFromCurrentState +UIViewAnimationOptionCurveEaseIn +UIViewAnimationOptionCurveEaseInOut +UIViewAnimationOptionCurveEaseOut +UIViewAnimationOptionCurveLinear +UIViewAnimationOptionLayoutSubviews +UIViewAnimationOptionOverrideInheritedCurve +UIViewAnimationOptionOverrideInheritedDuration +UIViewAnimationOptionOverrideInheritedOptions +UIViewAnimationOptionRepeat +UIViewAnimationOptionShowHideTransitionViews +UIViewAnimationOptionTransitionCrossDissolve +UIViewAnimationOptionTransitionCurlDown +UIViewAnimationOptionTransitionCurlUp +UIViewAnimationOptionTransitionFlipFromBottom +UIViewAnimationOptionTransitionFlipFromLeft +UIViewAnimationOptionTransitionFlipFromRight +UIViewAnimationOptionTransitionFlipFromTop +UIViewAnimationOptionTransitionNone +UIViewAnimationTransitionCurlDown +UIViewAnimationTransitionCurlUp +UIViewAnimationTransitionFlipFromLeft +UIViewAnimationTransitionFlipFromRight +UIViewAnimationTransitionNone +UIViewAutoresizingFlexibleBottomMargin +UIViewAutoresizingFlexibleHeight +UIViewAutoresizingFlexibleLeftMargin +UIViewAutoresizingFlexibleRightMargin +UIViewAutoresizingFlexibleTopMargin +UIViewAutoresizingFlexibleWidth +UIViewAutoresizingNone +UIViewContentModeBottom +UIViewContentModeBottomLeft +UIViewContentModeBottomRight +UIViewContentModeCenter +UIViewContentModeLeft +UIViewContentModeRedraw +UIViewContentModeRight +UIViewContentModeScaleAspectFill +UIViewContentModeScaleAspectFit +UIViewContentModeScaleToFill +UIViewContentModeTop +UIViewContentModeTopLeft +UIViewContentModeTopRight +UIViewKeyframeAnimationOptionAllowUserInteraction +UIViewKeyframeAnimationOptionAutoreverse +UIViewKeyframeAnimationOptionBeginFromCurrentState +UIViewKeyframeAnimationOptionCalculationModeCubic +UIViewKeyframeAnimationOptionCalculationModeCubicPaced +UIViewKeyframeAnimationOptionCalculationModeDiscrete +UIViewKeyframeAnimationOptionCalculationModeLinear +UIViewKeyframeAnimationOptionCalculationModePaced +UIViewKeyframeAnimationOptionLayoutSubviews +UIViewKeyframeAnimationOptionOverrideInheritedDuration +UIViewKeyframeAnimationOptionOverrideInheritedOptions +UIViewKeyframeAnimationOptionRepeat +UIViewTintAdjustmentModeAutomatic +UIViewTintAdjustmentModeDimmed +UIViewTintAdjustmentModeNormal +UIWebPaginationBreakingModeColumn +UIWebPaginationBreakingModePage +UIWebPaginationModeBottomToTop +UIWebPaginationModeLeftToRight +UIWebPaginationModeRightToLeft +UIWebPaginationModeTopToBottom +UIWebPaginationModeUnpaginated +UIWebViewNavigationTypeBackForward +UIWebViewNavigationTypeFormResubmitted +UIWebViewNavigationTypeFormSubmitted +UIWebViewNavigationTypeLinkClicked +UIWebViewNavigationTypeOther +UIWebViewNavigationTypeReload \ No newline at end of file diff --git a/sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/functions.txt b/sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/functions.txt new file mode 100644 index 00000000..1bd857e0 --- /dev/null +++ b/sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/functions.txt @@ -0,0 +1,399 @@ +NSAccessibilityActionDescription +NSAccessibilityPostNotification +NSAccessibilityPostNotificationWithUserInfo +NSAccessibilityRaiseBadArgumentException +NSAccessibilityRoleDescription +NSAccessibilityRoleDescriptionForUIElement +NSAccessibilitySetMayContainProtectedContent +NSAccessibilityUnignoredAncestor +NSAccessibilityUnignoredChildren +NSAccessibilityUnignoredChildrenForOnlyChild +NSAccessibilityUnignoredDescendant +NSAllHashTableObjects +NSAllMapTableKeys +NSAllMapTableValues +NSAllocateCollectable +NSAllocateMemoryPages +NSAllocateObject +NSApplicationLoad +NSApplicationMain +NSAvailableWindowDepths +NSBeep +NSBeginAlertSheet +NSBeginCriticalAlertSheet +NSBeginInformationalAlertSheet +NSBestDepth +NSBitsPerPixelFromDepth +NSBitsPerSampleFromDepth +NSClassFromString +NSColorSpaceFromDepth +NSCompareHashTables +NSCompareMapTables +NSContainsRect +NSConvertGlyphsToPackedGlyphs +NSConvertHostDoubleToSwapped +NSConvertHostFloatToSwapped +NSConvertSwappedDoubleToHost +NSConvertSwappedFloatToHost +NSCopyBits +NSCopyHashTableWithZone +NSCopyMapTableWithZone +NSCopyMemoryPages +NSCopyObject +NSCountFrames +NSCountHashTable +NSCountMapTable +NSCountWindows +NSCountWindowsForContext +NSCreateFileContentsPboardType +NSCreateFilenamePboardType +NSCreateHashTable +NSCreateHashTableWithZone +NSCreateMapTable +NSCreateMapTableWithZone +NSCreateZone +NSDeallocateMemoryPages +NSDeallocateObject +NSDecimalAdd +NSDecimalCompact +NSDecimalCompare +NSDecimalCopy +NSDecimalDivide +NSDecimalIsNotANumber +NSDecimalMultiply +NSDecimalMultiplyByPowerOf10 +NSDecimalNormalize +NSDecimalPower +NSDecimalRound +NSDecimalString +NSDecimalSubtract +NSDecrementExtraRefCountWasZero +NSDefaultMallocZone +NSDictionaryOfVariableBindings +NSDisableScreenUpdates +NSDivideRect +NSDottedFrameRect +NSDrawBitmap +NSDrawButton +NSDrawColorTiledRects +NSDrawDarkBezel +NSDrawGrayBezel +NSDrawGroove +NSDrawLightBezel +NSDrawNinePartImage +NSDrawThreePartImage +NSDrawTiledRects +NSDrawWhiteBezel +NSDrawWindowBackground +NSEdgeInsetsMake +NSEnableScreenUpdates +NSEndHashTableEnumeration +NSEndMapTableEnumeration +NSEnumerateHashTable +NSEnumerateMapTable +NSEqualPoints +NSEqualRanges +NSEqualRects +NSEqualSizes +NSEraseRect +NSEventMaskFromType +NSExtraRefCount +NSFileTypeForHFSTypeCode +NSFrameAddress +NSFrameRect +NSFrameRectWithWidth +NSFrameRectWithWidthUsingOperation +NSFreeHashTable +NSFreeMapTable +NSFullUserName +NSGetAlertPanel +NSGetCriticalAlertPanel +NSGetFileType +NSGetFileTypes +NSGetInformationalAlertPanel +NSGetSizeAndAlignment +NSGetUncaughtExceptionHandler +NSGetWindowServerMemory +NSHFSTypeCodeFromFileType +NSHFSTypeOfFile +NSHashGet +NSHashInsert +NSHashInsertIfAbsent +NSHashInsertKnownAbsent +NSHashRemove +NSHeight +NSHighlightRect +NSHomeDirectory +NSHomeDirectoryForUser +NSHostByteOrder +NSIncrementExtraRefCount +NSInsetRect +NSIntegralRect +NSIntegralRectWithOptions +NSInterfaceStyleForKey +NSIntersectionRange +NSIntersectionRect +NSIntersectsRect +NSIsControllerMarker +NSIsEmptyRect +NSIsFreedObject +NSLocationInRange +NSLog +NSLogPageSize +NSLogv +NSMakeCollectable +NSMakePoint +NSMakeRange +NSMakeRect +NSMakeSize +NSMapGet +NSMapInsert +NSMapInsertIfAbsent +NSMapInsertKnownAbsent +NSMapMember +NSMapRemove +NSMaxRange +NSMaxX +NSMaxY +NSMidX +NSMidY +NSMinX +NSMinY +NSMouseInRect +NSNextHashEnumeratorItem +NSNextMapEnumeratorPair +NSNumberOfColorComponents +NSObjectFromCoder +NSOffsetRect +NSOpenStepRootDirectory +NSPageSize +NSPerformService +NSPlanarFromDepth +NSPointFromCGPoint +NSPointFromString +NSPointInRect +NSPointToCGPoint +NSProtocolFromString +NSRangeFromString +NSReadPixel +NSRealMemoryAvailable +NSReallocateCollectable +NSRecordAllocationEvent +NSRectClip +NSRectClipList +NSRectFill +NSRectFillList +NSRectFillListUsingOperation +NSRectFillListWithColors +NSRectFillListWithColorsUsingOperation +NSRectFillListWithGrays +NSRectFillUsingOperation +NSRectFromCGRect +NSRectFromString +NSRectToCGRect +NSRecycleZone +NSRegisterServicesProvider +NSReleaseAlertPanel +NSResetHashTable +NSResetMapTable +NSReturnAddress +NSRoundDownToMultipleOfPageSize +NSRoundUpToMultipleOfPageSize +NSRunAlertPanel +NSRunAlertPanelRelativeToWindow +NSRunCriticalAlertPanel +NSRunCriticalAlertPanelRelativeToWindow +NSRunInformationalAlertPanel +NSRunInformationalAlertPanelRelativeToWindow +NSSearchPathForDirectoriesInDomains +NSSelectorFromString +NSSetFocusRingStyle +NSSetShowsServicesMenuItem +NSSetUncaughtExceptionHandler +NSSetZoneName +NSShouldRetainWithZone +NSShowAnimationEffect +NSShowsServicesMenuItem +NSSizeFromCGSize +NSSizeFromString +NSSizeToCGSize +NSStringFromCGAffineTransform +NSStringFromCGPoint +NSStringFromCGRect +NSStringFromCGSize +NSStringFromCGVector +NSStringFromClass +NSStringFromHashTable +NSStringFromMapTable +NSStringFromPoint +NSStringFromProtocol +NSStringFromRange +NSStringFromRect +NSStringFromSelector +NSStringFromSize +NSStringFromUIEdgeInsets +NSStringFromUIOffset +NSSwapBigDoubleToHost +NSSwapBigFloatToHost +NSSwapBigIntToHost +NSSwapBigLongLongToHost +NSSwapBigLongToHost +NSSwapBigShortToHost +NSSwapDouble +NSSwapFloat +NSSwapHostDoubleToBig +NSSwapHostDoubleToLittle +NSSwapHostFloatToBig +NSSwapHostFloatToLittle +NSSwapHostIntToBig +NSSwapHostIntToLittle +NSSwapHostLongLongToBig +NSSwapHostLongLongToLittle +NSSwapHostLongToBig +NSSwapHostLongToLittle +NSSwapHostShortToBig +NSSwapHostShortToLittle +NSSwapInt +NSSwapLittleDoubleToHost +NSSwapLittleFloatToHost +NSSwapLittleIntToHost +NSSwapLittleLongLongToHost +NSSwapLittleLongToHost +NSSwapLittleShortToHost +NSSwapLong +NSSwapLongLong +NSSwapShort +NSTemporaryDirectory +NSTextAlignmentFromCTTextAlignment +NSTextAlignmentToCTTextAlignment +NSUnionRange +NSUnionRect +NSUnregisterServicesProvider +NSUpdateDynamicServices +NSUserName +NSValue +NSWidth +NSWindowList +NSWindowListForContext +NSZoneCalloc +NSZoneFree +NSZoneFromPointer +NSZoneMalloc +NSZoneName +NSZoneRealloc +NS_AVAILABLE +NS_AVAILABLE_IOS +NS_AVAILABLE_MAC +NS_CALENDAR_DEPRECATED +NS_DEPRECATED +NS_DEPRECATED_IOS +NS_DEPRECATED_MAC +UIAccessibilityConvertFrameToScreenCoordinates +UIAccessibilityConvertPathToScreenCoordinates +UIAccessibilityDarkerSystemColorsEnabled +UIAccessibilityIsBoldTextEnabled +UIAccessibilityIsClosedCaptioningEnabled +UIAccessibilityIsGrayscaleEnabled +UIAccessibilityIsGuidedAccessEnabled +UIAccessibilityIsInvertColorsEnabled +UIAccessibilityIsMonoAudioEnabled +UIAccessibilityIsReduceMotionEnabled +UIAccessibilityIsReduceTransparencyEnabled +UIAccessibilityIsSpeakScreenEnabled +UIAccessibilityIsSpeakSelectionEnabled +UIAccessibilityIsSwitchControlRunning +UIAccessibilityIsVoiceOverRunning +UIAccessibilityPostNotification +UIAccessibilityRegisterGestureConflictWithZoom +UIAccessibilityRequestGuidedAccessSession +UIAccessibilityZoomFocusChanged +UIApplicationMain +UIEdgeInsetsEqualToEdgeInsets +UIEdgeInsetsFromString +UIEdgeInsetsInsetRect +UIEdgeInsetsMake +UIGraphicsAddPDFContextDestinationAtPoint +UIGraphicsBeginImageContext +UIGraphicsBeginImageContextWithOptions +UIGraphicsBeginPDFContextToData +UIGraphicsBeginPDFContextToFile +UIGraphicsBeginPDFPage +UIGraphicsBeginPDFPageWithInfo +UIGraphicsEndImageContext +UIGraphicsEndPDFContext +UIGraphicsGetCurrentContext +UIGraphicsGetImageFromCurrentImageContext +UIGraphicsGetPDFContextBounds +UIGraphicsPopContext +UIGraphicsPushContext +UIGraphicsSetPDFContextDestinationForRect +UIGraphicsSetPDFContextURLForRect +UIGuidedAccessRestrictionStateForIdentifier +UIImageJPEGRepresentation +UIImagePNGRepresentation +UIImageWriteToSavedPhotosAlbum +UIOffsetEqualToOffset +UIOffsetFromString +UIOffsetMake +UIRectClip +UIRectFill +UIRectFillUsingBlendMode +UIRectFrame +UIRectFrameUsingBlendMode +UISaveVideoAtPathToSavedPhotosAlbum +UIVideoAtPathIsCompatibleWithSavedPhotosAlbum +NSAssert +NSAssert1 +NSAssert2 +NSAssert3 +NSAssert4 +NSAssert5 +NSCAssert +NSCAssert1 +NSCAssert2 +NSCAssert3 +NSCAssert4 +NSCAssert5 +NSCParameterAssert +NSDecimalMaxSize +NSDictionaryOfVariableBindings +NSGlyphInfoAtIndex +NSLocalizedString +NSLocalizedStringFromTable +NSLocalizedStringFromTableInBundle +NSLocalizedStringWithDefaultValue +NSParameterAssert +NSStackViewSpacingUseDefault +NSURLResponseUnknownLength +NS_AVAILABLE +NS_AVAILABLE_IOS +NS_AVAILABLE_IPHONE +NS_AVAILABLE_MAC +NS_CALENDAR_DEPRECATED +NS_CALENDAR_DEPRECATED_MAC +NS_CALENDAR_ENUM_DEPRECATED +NS_CLASS_AVAILABLE +NS_CLASS_AVAILABLE_IOS +NS_CLASS_AVAILABLE_MAC +NS_CLASS_DEPRECATED +NS_CLASS_DEPRECATED_IOS +NS_CLASS_DEPRECATED_MAC +NS_DEPRECATED +NS_DEPRECATED_IOS +NS_DEPRECATED_IPHONE +NS_DEPRECATED_MAC +NS_ENUM +NS_ENUM_AVAILABLE +NS_ENUM_AVAILABLE_IOS +NS_ENUM_AVAILABLE_MAC +NS_ENUM_DEPRECATED +NS_ENUM_DEPRECATED_IOS +NS_ENUM_DEPRECATED_MAC +NS_OPTIONS +NS_VALUERETURN +UIDeviceOrientationIsLandscape +UIDeviceOrientationIsPortrait +UIDeviceOrientationIsValidInterfaceOrientation +UIInterfaceOrientationIsLandscape +UIInterfaceOrientationIsPortrait +UI_USER_INTERFACE_IDIOM \ No newline at end of file diff --git a/sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/methods.txt.gz b/sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/methods.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..b0663d240d0c56af176710d47331eb99e2444c93 GIT binary patch literal 82161 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

5D!H4B2 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 literal 0 HcmV?d00001 diff --git a/sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/notifications.txt b/sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/notifications.txt new file mode 100644 index 00000000..412c09f1 --- /dev/null +++ b/sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/notifications.txt @@ -0,0 +1,298 @@ +NSAccessibilityAnnouncementRequestedNotification +NSAccessibilityApplicationActivatedNotification +NSAccessibilityApplicationDeactivatedNotification +NSAccessibilityApplicationHiddenNotification +NSAccessibilityApplicationShownNotification +NSAccessibilityCreatedNotification +NSAccessibilityDrawerCreatedNotification +NSAccessibilityFocusedUIElementChangedNotification +NSAccessibilityFocusedWindowChangedNotification +NSAccessibilityHelpTagCreatedNotification +NSAccessibilityLayoutChangedNotification +NSAccessibilityMainWindowChangedNotification +NSAccessibilityMovedNotification +NSAccessibilityResizedNotification +NSAccessibilityRowCollapsedNotification +NSAccessibilityRowCountChangedNotification +NSAccessibilityRowExpandedNotification +NSAccessibilitySelectedCellsChangedNotification +NSAccessibilitySelectedChildrenChangedNotification +NSAccessibilitySelectedChildrenMovedNotification +NSAccessibilitySelectedColumnsChangedNotification +NSAccessibilitySelectedRowsChangedNotification +NSAccessibilitySelectedTextChangedNotification +NSAccessibilitySheetCreatedNotification +NSAccessibilityTitleChangedNotification +NSAccessibilityUIElementDestroyedNotification +NSAccessibilityUnitsChangedNotification +NSAccessibilityValueChangedNotification +NSAccessibilityWindowCreatedNotification +NSAccessibilityWindowDeminiaturizedNotification +NSAccessibilityWindowMiniaturizedNotification +NSAccessibilityWindowMovedNotification +NSAccessibilityWindowResizedNotification +NSAnimationProgressMarkNotification +NSAntialiasThresholdChangedNotification +NSAppleEventManagerWillProcessFirstEventNotification +NSApplicationDidBecomeActiveNotification +NSApplicationDidChangeOcclusionStateNotification +NSApplicationDidChangeScreenParametersNotification +NSApplicationDidFinishLaunchingNotification +NSApplicationDidFinishRestoringWindowsNotification +NSApplicationDidHideNotification +NSApplicationDidResignActiveNotification +NSApplicationDidUnhideNotification +NSApplicationDidUpdateNotification +NSApplicationLaunchRemoteNotification +NSApplicationLaunchUserNotification +NSApplicationWillBecomeActiveNotification +NSApplicationWillFinishLaunchingNotification +NSApplicationWillHideNotification +NSApplicationWillResignActiveNotification +NSApplicationWillTerminateNotification +NSApplicationWillUnhideNotification +NSApplicationWillUpdateNotification +NSBrowserColumnConfigurationDidChangeNotification +NSBundleDidLoadNotification +NSCalendarDayChangedNotification +NSClassDescriptionNeededForClassNotification +NSColorListDidChangeNotification +NSColorPanelColorDidChangeNotification +NSComboBoxSelectionDidChangeNotification +NSComboBoxSelectionIsChangingNotification +NSComboBoxWillDismissNotification +NSComboBoxWillPopUpNotification +NSConnectionDidDieNotification +NSConnectionDidInitializeNotification +NSContextHelpModeDidActivateNotification +NSContextHelpModeDidDeactivateNotification +NSControlTextDidBeginEditingNotification +NSControlTextDidChangeNotification +NSControlTextDidEndEditingNotification +NSControlTintDidChangeNotification +NSCurrentLocaleDidChangeNotification +NSDidBecomeSingleThreadedNotification +NSDistributedNotification +NSDrawerDidCloseNotification +NSDrawerDidOpenNotification +NSDrawerWillCloseNotification +NSDrawerWillOpenNotification +NSFileHandleConnectionAcceptedNotification +NSFileHandleDataAvailableNotification +NSFileHandleNotification +NSFileHandleReadCompletionNotification +NSFileHandleReadToEndOfFileCompletionNotification +NSFontCollectionDidChangeNotification +NSFontSetChangedNotification +NSHTTPCookieManagerAcceptPolicyChangedNotification +NSHTTPCookieManagerCookiesChangedNotification +NSImageRepRegistryDidChangeNotification +NSKeyValueChangeNotification +NSLocalNotification +NSManagedObjectContextDidSaveNotification +NSManagedObjectContextObjectsDidChangeNotification +NSManagedObjectContextWillSaveNotification +NSMenuDidAddItemNotification +NSMenuDidBeginTrackingNotification +NSMenuDidChangeItemNotification +NSMenuDidEndTrackingNotification +NSMenuDidRemoveItemNotification +NSMenuDidSendActionNotification +NSMenuWillSendActionNotification +NSMetadataQueryDidFinishGatheringNotification +NSMetadataQueryDidStartGatheringNotification +NSMetadataQueryDidUpdateNotification +NSMetadataQueryGatheringProgressNotification +NSNotification +NSOutlineViewColumnDidMoveNotification +NSOutlineViewColumnDidResizeNotification +NSOutlineViewItemDidCollapseNotification +NSOutlineViewItemDidExpandNotification +NSOutlineViewItemWillCollapseNotification +NSOutlineViewItemWillExpandNotification +NSOutlineViewSelectionDidChangeNotification +NSOutlineViewSelectionIsChangingNotification +NSPersistentStoreCoordinatorStoresDidChangeNotification +NSPersistentStoreCoordinatorStoresWillChangeNotification +NSPersistentStoreCoordinatorWillRemoveStoreNotification +NSPersistentStoreDidImportUbiquitousContentChangesNotification +NSPopUpButtonCellWillPopUpNotification +NSPopUpButtonWillPopUpNotification +NSPopoverDidCloseNotification +NSPopoverDidShowNotification +NSPopoverWillCloseNotification +NSPopoverWillShowNotification +NSPortDidBecomeInvalidNotification +NSPreferencePaneCancelUnselectNotification +NSPreferencePaneDoUnselectNotification +NSPreferredScrollerStyleDidChangeNotification +NSRuleEditorRowsDidChangeNotification +NSScreenColorSpaceDidChangeNotification +NSScrollViewDidEndLiveMagnifyNotification +NSScrollViewDidEndLiveScrollNotification +NSScrollViewDidLiveScrollNotification +NSScrollViewWillStartLiveMagnifyNotification +NSScrollViewWillStartLiveScrollNotification +NSSpellCheckerDidChangeAutomaticDashSubstitutionNotification +NSSpellCheckerDidChangeAutomaticQuoteSubstitutionNotification +NSSpellCheckerDidChangeAutomaticSpellingCorrectionNotification +NSSpellCheckerDidChangeAutomaticTextReplacementNotification +NSSplitViewDidResizeSubviewsNotification +NSSplitViewWillResizeSubviewsNotification +NSSystemClockDidChangeNotification +NSSystemColorsDidChangeNotification +NSSystemTimeZoneDidChangeNotification +NSTableViewColumnDidMoveNotification +NSTableViewColumnDidResizeNotification +NSTableViewSelectionDidChangeNotification +NSTableViewSelectionIsChangingNotification +NSTaskDidTerminateNotification +NSTextAlternativesSelectedAlternativeStringNotification +NSTextDidBeginEditingNotification +NSTextDidChangeNotification +NSTextDidEndEditingNotification +NSTextInputContextKeyboardSelectionDidChangeNotification +NSTextStorageDidProcessEditingNotification +NSTextStorageWillProcessEditingNotification +NSTextViewDidChangeSelectionNotification +NSTextViewDidChangeTypingAttributesNotification +NSTextViewWillChangeNotifyingTextViewNotification +NSThreadWillExitNotification +NSToolbarDidRemoveItemNotification +NSToolbarWillAddItemNotification +NSURLCredentialStorageChangedNotification +NSUbiquitousKeyValueStoreDidChangeExternallyNotification +NSUbiquityIdentityDidChangeNotification +NSUndoManagerCheckpointNotification +NSUndoManagerDidCloseUndoGroupNotification +NSUndoManagerDidOpenUndoGroupNotification +NSUndoManagerDidRedoChangeNotification +NSUndoManagerDidUndoChangeNotification +NSUndoManagerWillCloseUndoGroupNotification +NSUndoManagerWillRedoChangeNotification +NSUndoManagerWillUndoChangeNotification +NSUserDefaultsDidChangeNotification +NSUserNotification +NSViewBoundsDidChangeNotification +NSViewDidUpdateTrackingAreasNotification +NSViewFocusDidChangeNotification +NSViewFrameDidChangeNotification +NSViewGlobalFrameDidChangeNotification +NSWillBecomeMultiThreadedNotification +NSWindowDidBecomeKeyNotification +NSWindowDidBecomeMainNotification +NSWindowDidChangeBackingPropertiesNotification +NSWindowDidChangeOcclusionStateNotification +NSWindowDidChangeScreenNotification +NSWindowDidChangeScreenProfileNotification +NSWindowDidDeminiaturizeNotification +NSWindowDidEndLiveResizeNotification +NSWindowDidEndSheetNotification +NSWindowDidEnterFullScreenNotification +NSWindowDidEnterVersionBrowserNotification +NSWindowDidExitFullScreenNotification +NSWindowDidExitVersionBrowserNotification +NSWindowDidExposeNotification +NSWindowDidMiniaturizeNotification +NSWindowDidMoveNotification +NSWindowDidResignKeyNotification +NSWindowDidResignMainNotification +NSWindowDidResizeNotification +NSWindowDidUpdateNotification +NSWindowWillBeginSheetNotification +NSWindowWillCloseNotification +NSWindowWillEnterFullScreenNotification +NSWindowWillEnterVersionBrowserNotification +NSWindowWillExitFullScreenNotification +NSWindowWillExitVersionBrowserNotification +NSWindowWillMiniaturizeNotification +NSWindowWillMoveNotification +NSWindowWillStartLiveResizeNotification +NSWorkspaceActiveSpaceDidChangeNotification +NSWorkspaceDidActivateApplicationNotification +NSWorkspaceDidChangeFileLabelsNotification +NSWorkspaceDidDeactivateApplicationNotification +NSWorkspaceDidHideApplicationNotification +NSWorkspaceDidLaunchApplicationNotification +NSWorkspaceDidMountNotification +NSWorkspaceDidPerformFileOperationNotification +NSWorkspaceDidRenameVolumeNotification +NSWorkspaceDidTerminateApplicationNotification +NSWorkspaceDidUnhideApplicationNotification +NSWorkspaceDidUnmountNotification +NSWorkspaceDidWakeNotification +NSWorkspaceScreensDidSleepNotification +NSWorkspaceScreensDidWakeNotification +NSWorkspaceSessionDidBecomeActiveNotification +NSWorkspaceSessionDidResignActiveNotification +NSWorkspaceWillLaunchApplicationNotification +NSWorkspaceWillPowerOffNotification +NSWorkspaceWillSleepNotification +NSWorkspaceWillUnmountNotification +UIAccessibilityAnnouncementDidFinishNotification +UIAccessibilityBoldTextStatusDidChangeNotification +UIAccessibilityClosedCaptioningStatusDidChangeNotification +UIAccessibilityDarkerSystemColorsStatusDidChangeNotification +UIAccessibilityGrayscaleStatusDidChangeNotification +UIAccessibilityGuidedAccessStatusDidChangeNotification +UIAccessibilityInvertColorsStatusDidChangeNotification +UIAccessibilityMonoAudioStatusDidChangeNotification +UIAccessibilityNotification +UIAccessibilityReduceMotionStatusDidChangeNotification +UIAccessibilityReduceTransparencyStatusDidChangeNotification +UIAccessibilitySpeakScreenStatusDidChangeNotification +UIAccessibilitySpeakSelectionStatusDidChangeNotification +UIAccessibilitySwitchControlStatusDidChangeNotification +UIApplicationBackgroundRefreshStatusDidChangeNotification +UIApplicationDidBecomeActiveNotification +UIApplicationDidChangeStatusBarFrameNotification +UIApplicationDidChangeStatusBarOrientationNotification +UIApplicationDidEnterBackgroundNotification +UIApplicationDidFinishLaunchingNotification +UIApplicationDidReceiveMemoryWarningNotification +UIApplicationLaunchOptionsLocalNotification +UIApplicationLaunchOptionsRemoteNotification +UIApplicationSignificantTimeChangeNotification +UIApplicationUserDidTakeScreenshotNotification +UIApplicationWillChangeStatusBarFrameNotification +UIApplicationWillChangeStatusBarOrientationNotification +UIApplicationWillEnterForegroundNotification +UIApplicationWillResignActiveNotification +UIApplicationWillTerminateNotification +UIContentSizeCategoryDidChangeNotification +UIDeviceBatteryLevelDidChangeNotification +UIDeviceBatteryStateDidChangeNotification +UIDeviceOrientationDidChangeNotification +UIDeviceProximityStateDidChangeNotification +UIDocumentStateChangedNotification +UIKeyboardDidChangeFrameNotification +UIKeyboardDidHideNotification +UIKeyboardDidShowNotification +UIKeyboardWillChangeFrameNotification +UIKeyboardWillHideNotification +UIKeyboardWillShowNotification +UILocalNotification +UIMenuControllerDidHideMenuNotification +UIMenuControllerDidShowMenuNotification +UIMenuControllerMenuFrameDidChangeNotification +UIMenuControllerWillHideMenuNotification +UIMenuControllerWillShowMenuNotification +UIPasteboardChangedNotification +UIPasteboardRemovedNotification +UIScreenBrightnessDidChangeNotification +UIScreenDidConnectNotification +UIScreenDidDisconnectNotification +UIScreenModeDidChangeNotification +UITableViewSelectionDidChangeNotification +UITextFieldTextDidBeginEditingNotification +UITextFieldTextDidChangeNotification +UITextFieldTextDidEndEditingNotification +UITextInputCurrentInputModeDidChangeNotification +UITextViewTextDidBeginEditingNotification +UITextViewTextDidChangeNotification +UITextViewTextDidEndEditingNotification +UIViewControllerShowDetailTargetDidChangeNotification +UIWindowDidBecomeHiddenNotification +UIWindowDidBecomeKeyNotification +UIWindowDidBecomeVisibleNotification +UIWindowDidResignKeyNotification \ No newline at end of file diff --git a/sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/types.txt b/sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/types.txt new file mode 100644 index 00000000..4ad3a6f9 --- /dev/null +++ b/sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/types.txt @@ -0,0 +1,457 @@ +NSAccessibilityPriorityLevel +NSActivityOptions +NSAlertStyle +NSAlignmentOptions +NSAnimationBlockingMode +NSAnimationCurve +NSAnimationEffect +NSAnimationProgress +NSAppleEventManagerSuspensionID +NSApplicationActivationOptions +NSApplicationActivationPolicy +NSApplicationDelegateReply +NSApplicationOcclusionState +NSApplicationPresentationOptions +NSApplicationPrintReply +NSApplicationTerminateReply +NSAttributeType +NSAttributedStringEnumerationOptions +NSBackgroundStyle +NSBackingStoreType +NSBezelStyle +NSBezierPathElement +NSBinarySearchingOptions +NSBitmapFormat +NSBitmapImageFileType +NSBorderType +NSBoxType +NSBrowserColumnResizingType +NSBrowserDropOperation +NSButtonType +NSByteCountFormatterCountStyle +NSByteCountFormatterUnits +NSCalculationError +NSCalendarOptions +NSCalendarUnit +NSCellAttribute +NSCellImagePosition +NSCellStateValue +NSCellType +NSCharacterCollection +NSCollectionViewDropOperation +NSColorPanelMode +NSColorRenderingIntent +NSColorSpaceModel +NSComparisonPredicateModifier +NSComparisonPredicateOptions +NSComparisonResult +NSCompositingOperation +NSCompoundPredicateType +NSControlCharacterAction +NSControlSize +NSControlTint +NSCorrectionIndicatorType +NSCorrectionResponse +NSDataReadingOptions +NSDataSearchOptions +NSDataWritingOptions +NSDateFormatterBehavior +NSDateFormatterStyle +NSDatePickerElementFlags +NSDatePickerMode +NSDatePickerStyle +NSDeleteRule +NSDirectoryEnumerationOptions +NSDocumentChangeType +NSDragOperation +NSDraggingContext +NSDraggingFormation +NSDraggingItemEnumerationOptions +NSDrawerState +NSEntityMappingType +NSEnumerationOptions +NSEventGestureAxis +NSEventMask +NSEventPhase +NSEventSwipeTrackingOptions +NSEventType +NSExpressionType +NSFetchRequestResultType +NSFileCoordinatorReadingOptions +NSFileCoordinatorWritingOptions +NSFileManagerItemReplacementOptions +NSFileVersionAddingOptions +NSFileVersionReplacingOptions +NSFileWrapperReadingOptions +NSFileWrapperWritingOptions +NSFindPanelAction +NSFindPanelSubstringMatchType +NSFocusRingPlacement +NSFocusRingType +NSFontAction +NSFontCollectionVisibility +NSFontFamilyClass +NSFontRenderingMode +NSFontSymbolicTraits +NSFontTraitMask +NSGlyph +NSGlyphInscription +NSGlyphLayoutMode +NSGlyphProperty +NSGradientDrawingOptions +NSGradientType +NSHTTPCookieAcceptPolicy +NSHashEnumerator +NSHashTableOptions +NSImageAlignment +NSImageCacheMode +NSImageFrameStyle +NSImageInterpolation +NSImageLoadStatus +NSImageRepLoadStatus +NSImageScaling +NSInsertionPosition +NSInteger +NSJSONReadingOptions +NSJSONWritingOptions +NSKeyValueChange +NSKeyValueObservingOptions +NSKeyValueSetMutationKind +NSLayoutAttribute +NSLayoutConstraintOrientation +NSLayoutDirection +NSLayoutFormatOptions +NSLayoutPriority +NSLayoutRelation +NSLayoutStatus +NSLevelIndicatorStyle +NSLineBreakMode +NSLineCapStyle +NSLineJoinStyle +NSLineMovementDirection +NSLineSweepDirection +NSLinguisticTaggerOptions +NSLocaleLanguageDirection +NSManagedObjectContextConcurrencyType +NSMapEnumerator +NSMapTableOptions +NSMatchingFlags +NSMatchingOptions +NSMatrixMode +NSMediaLibrary +NSMenuProperties +NSMergePolicyType +NSModalSession +NSMultibyteGlyphPacking +NSNetServiceOptions +NSNetServicesError +NSNotificationCoalescing +NSNotificationSuspensionBehavior +NSNumberFormatterBehavior +NSNumberFormatterPadPosition +NSNumberFormatterRoundingMode +NSNumberFormatterStyle +NSOpenGLContextAuxiliary +NSOpenGLPixelFormatAttribute +NSOpenGLPixelFormatAuxiliary +NSOperationQueuePriority +NSPDFPanelOptions +NSPageControllerTransitionStyle +NSPaperOrientation +NSPasteboardReadingOptions +NSPasteboardWritingOptions +NSPathStyle +NSPersistentStoreRequestType +NSPersistentStoreUbiquitousTransitionType +NSPoint +NSPointerFunctionsOptions +NSPointingDeviceType +NSPopUpArrowPosition +NSPopoverAppearance +NSPopoverBehavior +NSPostingStyle +NSPredicateOperatorType +NSPrintPanelOptions +NSPrintRenderingQuality +NSPrinterTableStatus +NSPrintingOrientation +NSPrintingPageOrder +NSPrintingPaginationMode +NSProgressIndicatorStyle +NSProgressIndicatorThickness +NSProgressIndicatorThreadInfo +NSPropertyListFormat +NSPropertyListMutabilityOptions +NSPropertyListReadOptions +NSPropertyListWriteOptions +NSQTMovieLoopMode +NSRange +NSRect +NSRectEdge +NSRegularExpressionOptions +NSRelativePosition +NSRemoteNotificationType +NSRequestUserAttentionType +NSRoundingMode +NSRuleEditorNestingMode +NSRuleEditorRowType +NSRulerOrientation +NSSaveOperationType +NSSaveOptions +NSScreenAuxiliaryOpaque +NSScrollArrowPosition +NSScrollElasticity +NSScrollViewFindBarPosition +NSScrollerArrow +NSScrollerKnobStyle +NSScrollerPart +NSScrollerStyle +NSSearchPathDirectory +NSSearchPathDomainMask +NSSegmentStyle +NSSegmentSwitchTracking +NSSelectionAffinity +NSSelectionDirection +NSSelectionGranularity +NSSharingContentScope +NSSize +NSSliderType +NSSnapshotEventType +NSSocketNativeHandle +NSSortOptions +NSSpeechBoundary +NSSplitViewDividerStyle +NSStackViewGravity +NSStreamEvent +NSStreamStatus +NSStringCompareOptions +NSStringDrawingOptions +NSStringEncoding +NSStringEncodingConversionOptions +NSStringEnumerationOptions +NSSwappedDouble +NSSwappedFloat +NSTIFFCompression +NSTabState +NSTabViewType +NSTableViewAnimationOptions +NSTableViewColumnAutoresizingStyle +NSTableViewDraggingDestinationFeedbackStyle +NSTableViewDropOperation +NSTableViewGridLineStyle +NSTableViewRowSizeStyle +NSTableViewSelectionHighlightStyle +NSTaskTerminationReason +NSTestComparisonOperation +NSTextAlignment +NSTextBlockDimension +NSTextBlockLayer +NSTextBlockValueType +NSTextBlockVerticalAlignment +NSTextCheckingType +NSTextCheckingTypes +NSTextFieldBezelStyle +NSTextFinderAction +NSTextFinderMatchingType +NSTextLayoutOrientation +NSTextStorageEditActions +NSTextTabType +NSTextTableLayoutAlgorithm +NSTextWritingDirection +NSThreadPrivate +NSTickMarkPosition +NSTimeInterval +NSTimeZoneNameStyle +NSTitlePosition +NSTokenStyle +NSToolTipTag +NSToolbarDisplayMode +NSToolbarSizeMode +NSTouchPhase +NSTrackingAreaOptions +NSTrackingRectTag +NSTypesetterBehavior +NSTypesetterControlCharacterAction +NSTypesetterGlyphInfo +NSUInteger +NSURLBookmarkCreationOptions +NSURLBookmarkFileCreationOptions +NSURLBookmarkResolutionOptions +NSURLCacheStoragePolicy +NSURLCredentialPersistence +NSURLHandleStatus +NSURLRequestCachePolicy +NSURLRequestNetworkServiceType +NSURLSessionAuthChallengeDisposition +NSURLSessionResponseDisposition +NSURLSessionTaskState +NSUnderlineStyle +NSUsableScrollerParts +NSUserInterfaceLayoutDirection +NSUserInterfaceLayoutOrientation +NSUserNotificationActivationType +NSViewLayerContentsPlacement +NSViewLayerContentsRedrawPolicy +NSVolumeEnumerationOptions +NSWhoseSubelementIdentifier +NSWindingRule +NSWindowAnimationBehavior +NSWindowBackingLocation +NSWindowButton +NSWindowCollectionBehavior +NSWindowDepth +NSWindowNumberListOptions +NSWindowOcclusionState +NSWindowOrderingMode +NSWindowSharingType +NSWorkspaceIconCreationOptions +NSWorkspaceLaunchOptions +NSWritingDirection +NSXMLDTDNodeKind +NSXMLDocumentContentKind +NSXMLNodeKind +NSXMLParserError +NSXMLParserExternalEntityResolvingPolicy +NSXPCConnectionOptions +NSZone +UIAccelerationValue +UIAccessibilityNavigationStyle +UIAccessibilityNotifications +UIAccessibilityScrollDirection +UIAccessibilityTraits +UIAccessibilityZoomType +UIActionSheetStyle +UIActivityCategory +UIActivityIndicatorViewStyle +UIAlertActionStyle +UIAlertControllerStyle +UIAlertViewStyle +UIApplicationState +UIAttachmentBehaviorType +UIBackgroundFetchResult +UIBackgroundRefreshStatus +UIBackgroundTaskIdentifier +UIBarButtonItemStyle +UIBarButtonSystemItem +UIBarMetrics +UIBarPosition +UIBarStyle +UIBaselineAdjustment +UIBlurEffectStyle +UIButtonType +UICollectionElementCategory +UICollectionUpdateAction +UICollectionViewScrollDirection +UICollectionViewScrollPosition +UICollisionBehaviorMode +UIControlContentHorizontalAlignment +UIControlContentVerticalAlignment +UIControlEvents +UIControlState +UIDataDetectorTypes +UIDatePickerMode +UIDeviceBatteryState +UIDeviceOrientation +UIDocumentChangeKind +UIDocumentMenuOrder +UIDocumentPickerMode +UIDocumentSaveOperation +UIDocumentState +UIEdgeInsets +UIEventSubtype +UIEventType +UIFontDescriptorClass +UIFontDescriptorSymbolicTraits +UIGestureRecognizerState +UIGuidedAccessRestrictionState +UIImageOrientation +UIImagePickerControllerCameraCaptureMode +UIImagePickerControllerCameraDevice +UIImagePickerControllerCameraFlashMode +UIImagePickerControllerQualityType +UIImagePickerControllerSourceType +UIImageRenderingMode +UIImageResizingMode +UIInputViewStyle +UIInterfaceOrientation +UIInterfaceOrientationMask +UIInterpolatingMotionEffectType +UIKeyModifierFlags +UIKeyboardAppearance +UIKeyboardType +UILayoutConstraintAxis +UILayoutPriority +UILineBreakMode +UIMenuControllerArrowDirection +UIModalPresentationStyle +UIModalTransitionStyle +UINavigationControllerOperation +UIOffset +UIPageViewControllerNavigationDirection +UIPageViewControllerNavigationOrientation +UIPageViewControllerSpineLocation +UIPageViewControllerTransitionStyle +UIPopoverArrowDirection +UIPrintInfoDuplex +UIPrintInfoOrientation +UIPrintInfoOutputType +UIPrinterJobTypes +UIProgressViewStyle +UIPushBehaviorMode +UIRectCorner +UIRectEdge +UIRemoteNotificationType +UIReturnKeyType +UIScreenOverscanCompensation +UIScrollViewIndicatorStyle +UIScrollViewKeyboardDismissMode +UISearchBarIcon +UISearchBarStyle +UISegmentedControlSegment +UISegmentedControlStyle +UISplitViewControllerDisplayMode +UIStatusBarAnimation +UIStatusBarStyle +UISwipeGestureRecognizerDirection +UISystemAnimation +UITabBarItemPositioning +UITabBarSystemItem +UITableViewCellAccessoryType +UITableViewCellEditingStyle +UITableViewCellSelectionStyle +UITableViewCellSeparatorStyle +UITableViewCellStateMask +UITableViewCellStyle +UITableViewRowActionStyle +UITableViewRowAnimation +UITableViewScrollPosition +UITableViewStyle +UITextAlignment +UITextAutocapitalizationType +UITextAutocorrectionType +UITextBorderStyle +UITextDirection +UITextFieldViewMode +UITextGranularity +UITextLayoutDirection +UITextSpellCheckingType +UITextStorageDirection +UITextWritingDirection +UITouchPhase +UIUserInterfaceIdiom +UIUserInterfaceLayoutDirection +UIUserInterfaceSizeClass +UIUserNotificationActionContext +UIUserNotificationActivationMode +UIUserNotificationType +UIViewAnimationCurve +UIViewAnimationOptions +UIViewAnimationTransition +UIViewAutoresizing +UIViewContentMode +UIViewKeyframeAnimationOptions +UIViewTintAdjustmentMode +UIWebPaginationBreakingMode +UIWebPaginationMode +UIWebViewNavigationType +UIWindowLevel \ No newline at end of file diff --git a/sources_non_forked/cocoa.vim/lib/extras/cocoa_methods.py b/sources_non_forked/cocoa.vim/lib/extras/cocoa_methods.py new file mode 100755 index 00000000..0f21946e --- /dev/null +++ b/sources_non_forked/cocoa.vim/lib/extras/cocoa_methods.py @@ -0,0 +1,63 @@ +#!/usr/bin/python +''' +Lists Cocoa methods in given file or ./cocoa_indexes/methods.txt by default. +''' +import re, os, gzip +from cocoa_definitions import default_headers, format_function_line + +def get_methods(headers): + '''Returns list of Cocoa methods.''' + matches = [] + for header in headers: + f = open(header, 'r') + current_class = '' + for line in f: + if current_class == '': + if line[:10] == '@interface' or line[:9] == '@protocol': + current_class = re.match('@(interface|protocol)\s+(\w+)', + line).group(2) + else: + if line[:3] == '@end': + current_class = '' + elif re.match('[-+]\s*\(', line): + method_name = get_method_name(line) + if method_name: + match = current_class + ' ' + method_name + if match not in matches: + matches.append(match) + f.close() + matches = [format_line(line) for line in matches] + matches.sort() + return matches + +def get_method_name(line): + '''Returns the method name & argument types for the given line.''' + if re.search('\w+\s*:', line): + return ' '.join(re.findall('\w+\s*:\s*\(.*?\)', line)) + else: + return re.match(r'[-+]\s*\(.*?\)\s*(\w+)', line).group(1) + +def format_line(line): + '''Removes parentheses/comments/unnecessary spacing for the given line.''' + line = re.sub(r'\s*:\s*', ':', line) + line = re.sub(r'/\*.*?\*/\s*|[()]', '', line) + line = re.sub(r'(NS\S+)Pointer', r'\1 *', line) + return format_function_line(line) + +def extract_file_to(fname=None): + ''' + Extracts methods to given file or ./cocoa_indexes/methods.txt by default. + ''' + if fname is None: + fname = './cocoa_indexes/methods.txt.gz' + if not os.path.isdir(os.path.dirname(fname)): + os.mkdir(os.path.dirname(fname)) + + # This file is quite large, so I've compressed it. + f = gzip.open(fname, 'w') + f.write("\n".join(get_methods(default_headers()))) + f.close() + +if __name__ == '__main__': + from sys import argv + extract_file_to(argv[1] if len(argv) > 1 else None) diff --git a/sources_non_forked/cocoa.vim/lib/extras/superclasses b/sources_non_forked/cocoa.vim/lib/extras/superclasses new file mode 100755 index 0000000000000000000000000000000000000000..2d11c2095654334e533d13b5df380bb61b24fb84 GIT binary patch literal 17116 zcmeHOYiJx*6uz6R8f$7|TWi76Zrc?pwAoZE)KYb~X`-=t(IjoOsn^-fB$>D`XJ*?* zo0>3wH_kd|#BF=SruWrls@l^kYrHp+BjQU&+kcWc z@5?08T$iG8nUvFGgu{%jg`Vp0`k^L2A_2;s zY+a(9me4`i9y=n89e}|DP?0MU*$@+k^T4>RZ%ftiCz}99@^OiL=$@kMA(YY7P+W+8d+R%2KZD_Pmjb|P)DgJtI ze0BjxzGA(oITh`TRYj^$xe~?XEIw52RG*$$jB8cvCY`3QGu6i~scN(9L_WRX z$=Vm3#X|3~Icl#-sq)d%kAqJ{K%6-Vj{6-Sy2t4|M)RvZ|H&NOx*hB;7U_U2yG~1MDi?Fi8*+bnTAYS_~wjv$r66oR=RVFGiMt8Bw_9h=FE|VC(;;cYRhs* z^GMhZNf~+4f!l`^65}8lx0jv5%JdA9-4wK{AIl%a#APM>m+3Q(`E!Q~6B85H$5$L5 zIzI@~f6I;^%U51MJ~)VN&6e?8q@<$u82iyUQ`&usb?zGrm$2;mVE%E6KJvOJxz*5k z7ek%-<30jZJoudo_ANoR5AEBw0?_Q^G_EJYRe zDK>7D>|ba$mVb*2gXP{Rm=XWrhP9bG(@^1RTFbA-6w|05M>5d70T> zp7VcUjFp%zeged_=Dz&9Pa0tZlq73!tJ~0OKQhKsQWuM2R~46c zD0**;r1x%Q_LJ1+{zy74C%f=uX&Y~3GiS)5cCRicX$$6hQl#P<8<~<+bSA~)sTgBT zt&xn5txQ~&G`S^}ibLb%($u=yN(9BW)3eaVfR;(iYAh~knydw^kteYk3`}nR=CR_I zh)rte+D0MxbfW!u<++1pVA|N02e7vW`@xJDbQ&A=pO!OrzkO&OU%)Z#l?4d|1Ofs9 zfq+0jARrJB2nYlO0s;YnfIvVXaOWYg2hZ&)xD&hyyb`AP^7; z2m}NI0s(=5KtLcM5D*9m1Ox(iBmyPKY8l!m-a%g~y}$n;+Eyw9c292wWP1PqDd!RmeJ)&dpWsVQBz5VDCl5;G1|Pjw?72EDUzzQDr)IP zCp>yatX>g5v*BbG6Q}WHmKmov1z~C^W}TW!6jioFI%|@usHv+#FS0Hrb$im9*d}+& zs+^2bZ2$-WsA=XT*(2+%lWi^xb)#2?ckfXZT@JQ4)ptBmUHv5ER#geDrxgu3s6L}> R41v^SOoFu~r2BCW{s9Rf^ +#import + +void usage() +{ + fprintf(stderr, "Usage: superclasses class_name framework\n"); +} + +void print_superclasses(const char classname[], const char framework[]) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + /* Foundation is already included, so no need to load it again. */ + if (strncmp(framework, "Foundation", 256) != 0) { + NSString *bundle = + [@"/System/Library/Frameworks/" stringByAppendingString: + [[NSString stringWithUTF8String:framework] + stringByAppendingPathExtension:@"framework"]]; + [[NSBundle bundleWithPath:bundle] load]; + } + + Class aClass = NSClassFromString([NSString stringWithUTF8String:classname]); + char buf[BUFSIZ]; + + strncpy(buf, classname, BUFSIZ); + while ((aClass = class_getSuperclass(aClass)) != nil) { + strncat(buf, "\\|", BUFSIZ); + strncat(buf, [NSStringFromClass(aClass) UTF8String], BUFSIZ); + } + printf("%s\n", buf); + + [pool drain]; +} + +int main(int argc, char const* argv[]) +{ + if (argc < 3 || argv[1][0] == '-') + usage(); + else { + int i; + for (i = 1; i < argc - 1; i += 2) + print_superclasses(argv[i], argv[i + 1]); + } + return 0; +} diff --git a/sources_non_forked/cocoa.vim/lib/get_methods.sh b/sources_non_forked/cocoa.vim/lib/get_methods.sh new file mode 100755 index 00000000..c75905ef --- /dev/null +++ b/sources_non_forked/cocoa.vim/lib/get_methods.sh @@ -0,0 +1,4 @@ +dir=`dirname $0` +classes=`grep -m 1 ^$1 ${dir}/cocoa_indexes/classes.txt` +if [ -z "$classes" ]; then exit; fi +zgrep "^\($classes\)" ${dir}/cocoa_indexes/methods.txt.gz | sed 's/^[^ ]* //' diff --git a/sources_non_forked/cocoa.vim/plugin/cocoa.vim b/sources_non_forked/cocoa.vim/plugin/cocoa.vim new file mode 100644 index 00000000..5bb533f2 --- /dev/null +++ b/sources_non_forked/cocoa.vim/plugin/cocoa.vim @@ -0,0 +1,16 @@ +" File: cocoa.vim +" Author: Michael Sanders (msanders42 [at] gmail [dot] com) +if exists('s:did_cocoa') || &cp || version < 700 + finish +endif +let s:did_cocoa = 1 + +" These have to load after the normal ftplugins to override the defaults; I'd +" like to put this in ftplugin/objc_cocoa_mappings.vim, but that doesn't seem +" to work.. +au FileType objc ru after/syntax/objc_enhanced.vim + \| let b:match_words = '@\(implementation\|interface\):@end' + \| setl inc=^\s*#\s*import omnifunc=objc#cocoacomplete#Complete + \| if globpath(expand(':p:h'), '*.xcodeproj') != '' | + \ setl makeprg=open\ -a\ xcode\ &&\ osascript\ -e\ 'tell\ app\ \"Xcode\"\ to\ build' + \| endif diff --git a/sources_non_forked/swift.vim/LICENSE b/sources_non_forked/swift.vim/LICENSE new file mode 100644 index 00000000..85a6d5a0 --- /dev/null +++ b/sources_non_forked/swift.vim/LICENSE @@ -0,0 +1,6 @@ +Copyright (c) 2014 Keith Smiley (http://keith.so) +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sources_non_forked/swift.vim/README.md b/sources_non_forked/swift.vim/README.md new file mode 100644 index 00000000..a82c447a --- /dev/null +++ b/sources_non_forked/swift.vim/README.md @@ -0,0 +1,37 @@ +# Swift.vim + +Syntax and indent files for [Swift](https://developer.apple.com/swift/) + +If you don't have a preferred installation method check out +[vim-plug](https://github.com/junegunn/vim-plug). + +## Examples + +![](https://raw.githubusercontent.com/keith/swift.vim/master/screenshots/screen.png) +![](https://raw.githubusercontent.com/keith/swift.vim/master/screenshots/screen2.png) + +## [Syntastic](https://github.com/scrooloose/syntastic/) Integration + +swift.vim can show errors inline from +[swift package manager](https://github.com/apple/swift-package-manager/) +or from [swiftlint](https://github.com/realm/SwiftLint) using +[syntastic](https://github.com/scrooloose/syntastic/). + +![](https://raw.githubusercontent.com/keith/swift.vim/master/screenshots/screen3.png) + +### Usage + +- Install [syntastic](https://github.com/scrooloose/syntastic/) + +- swiftpm integration will be automatically enabled if you're running vim +from a directory containing a `Package.swift` file. + +- SwiftLint integration will be automatically enabled if you have +SwiftLint installed and if you're running vim from a directory +containing a `.swiftlint.yml` file. + +- To enable both at once add this to your vimrc: + +```vim +let g:syntastic_swift_checkers = ['swiftpm', 'swiftlint'] +``` diff --git a/sources_non_forked/swift.vim/ale_linters/swift/swiftlint.vim b/sources_non_forked/swift.vim/ale_linters/swift/swiftlint.vim new file mode 100644 index 00000000..21245c6d --- /dev/null +++ b/sources_non_forked/swift.vim/ale_linters/swift/swiftlint.vim @@ -0,0 +1,48 @@ +function! ale_linters#swift#swiftlint#GetExecutable(buffer) + if get(g:, 'ale_swift_swiftlint_use_defaults', 0) || filereadable('.swiftlint.yml') + return 'swiftlint' + endif + + return '' +endfunction + +function! ale_linters#swift#swiftlint#Handle(buffer, lines) + " Match and ignore file path (anything but ':') + " Match and capture line number + " Match and capture optional column number + " Match and capture warning level ('error' or 'warning') + " Match and capture anything in the message + let l:pattern = '^[^:]\+:\(\d\+\):\(\d\+\)\?:\?\s*\(\w\+\):\s*\(.*\)$' + let l:output = [] + + for l:line in a:lines + let l:match = matchlist(l:line, l:pattern) + + if len(l:match) == 0 + continue + endif + + let l:line_number = l:match[1] + let l:column = l:match[2] + let l:type = toupper(l:match[3][0]) + let l:text = l:match[4] + + call add(l:output, { + \ 'bufnr': a:buffer, + \ 'lnum': l:line_number, + \ 'vcol': 0, + \ 'col': l:column, + \ 'text': l:text, + \ 'type': l:type, + \ }) + endfor + + return l:output +endfunction + +call ale#linter#Define('swift', { + \ 'name': 'swiftlint', + \ 'executable_callback': 'ale_linters#swift#swiftlint#GetExecutable', + \ 'command': 'swiftlint lint --use-stdin', + \ 'callback': 'ale_linters#swift#swiftlint#Handle', + \ }) diff --git a/sources_non_forked/swift.vim/ale_linters/swift/swiftpm.vim b/sources_non_forked/swift.vim/ale_linters/swift/swiftpm.vim new file mode 100644 index 00000000..dab5410e --- /dev/null +++ b/sources_non_forked/swift.vim/ale_linters/swift/swiftpm.vim @@ -0,0 +1,60 @@ +if !exists('g:ale_swift_swiftpm_executable') + let g:ale_swift_swiftpm_executable = 'swift' +endif + +if !exists('g:ale_swift_swiftpm_arguments') + let g:ale_swift_swiftpm_arguments = 'build' +endif + +function! ale_linters#swift#swiftpm#GetExecutable(buffer) + if !filereadable('Package.swift') + return '' + endif + + return g:ale_swift_swiftpm_executable +endfunction + +function! ale_linters#swift#swiftpm#GetCommand(buffer) + return g:ale_swift_swiftpm_executable + \ . ' ' + \ . g:ale_swift_swiftpm_arguments +endfunction + +function! ale_linters#swift#swiftpm#Handle(buffer, lines) + " Match and ignore file path (anything but :) + " Match and capture line number + " Match and capture column number + " Match and capture anything in the message + let l:pattern = '^[^:]\+:\(\d\+\):\(\d\+\):\s*error:\s*\(.*\)$' + let l:output = [] + + for l:line in a:lines + let l:match = matchlist(l:line, l:pattern) + + if len(l:match) == 0 + continue + endif + + let l:line_number = l:match[1] + let l:column = l:match[2] + let l:text = l:match[3] + + call add(l:output, { + \ 'bufnr': a:buffer, + \ 'lnum': l:line_number, + \ 'vcol': 0, + \ 'col': l:column, + \ 'text': l:text, + \ 'type': 'E', + \ }) + endfor + + return l:output +endfunction + +call ale#linter#Define('swift', { + \ 'name': 'swiftpm', + \ 'executable_callback': 'ale_linters#swift#swiftpm#GetExecutable', + \ 'command_callback': 'ale_linters#swift#swiftpm#GetCommand', + \ 'callback': 'ale_linters#swift#swiftpm#Handle', + \ }) diff --git a/sources_non_forked/swift.vim/ctags/swift.cnf b/sources_non_forked/swift.vim/ctags/swift.cnf new file mode 100644 index 00000000..7c5bb2b2 --- /dev/null +++ b/sources_non_forked/swift.vim/ctags/swift.cnf @@ -0,0 +1,9 @@ +--langdef=swift +--langmap=swift:.swift +--regex-swift=/[[:<:]]class[[:>:]][[:space:]]+([[:alnum:]_]+)/\1/c,class/ +--regex-swift=/[[:<:]]enum[[:>:]][[:space:]]+([[:alnum:]_]+)/\1/e,enum/ +--regex-swift=/[[:<:]]func[[:>:]][[:space:]]+([[:alnum:]_]+)/\1/f,function/ +--regex-swift=/[[:<:]]protocol[[:>:]][[:space:]]+([[:alnum:]_]+)/\1/P,protocol/ +--regex-swift=/[[:<:]]struct[[:>:]][[:space:]]+([[:alnum:]_]+)/\1/s,struct/ +--regex-swift=/[[:<:]]extension[[:>:]][[:space:]]+([[:alnum:]_]+)/\1/E,extension/ +--regex-swift=/[[:<:]]typealias[[:>:]][[:space:]]+([[:alnum:]_]+)/\1/t,typealias/ diff --git a/sources_non_forked/swift.vim/example/MainViewController.swift b/sources_non_forked/swift.vim/example/MainViewController.swift new file mode 100644 index 00000000..1ee93b5e --- /dev/null +++ b/sources_non_forked/swift.vim/example/MainViewController.swift @@ -0,0 +1,124 @@ +// +// MainViewController.swift +// HackerNews +// +// Copyright (c) 2014 Amit Burstein. All rights reserved. +// See LICENSE for licensing information. +// +// Abstract: +// Handles fetching and displaying posts from Hacker News. +// + +import UIKit +import QuartzCore + +class MainViewController: UIViewController, UITableViewDataSource { + + // MARK: Properties + + let postCellIdentifier = "PostCell" + let showBrowserIdentifier = "ShowBrowser" + var postFilter = PostFilterType.Top + var posts = HNPost[]() + var refreshControl = UIRefreshControl() + @IBOutlet var tableView: UITableView + + // MARK: Lifecycle + + override func viewDidLoad() { + super.viewDidLoad() + configureUI() + fetchPosts() + } + + override func viewWillAppear(animated: Bool) { + tableView.deselectRowAtIndexPath(tableView.indexPathForSelectedRow(), animated: animated) + super.viewWillAppear(animated) + } + + // MARK: Functions + + func configureUI() { + refreshControl.addTarget(self, action: "fetchPosts", forControlEvents: .ValueChanged) + refreshControl.attributedTitle = NSAttributedString(string: "Pull to Refresh") + tableView.insertSubview(refreshControl, atIndex: 0) + } + + func fetchPosts() { + UIApplication.sharedApplication().networkActivityIndicatorVisible = true; + + HNManager.sharedManager().loadPostsWithFilter(postFilter, completion: { posts in + if (posts != nil && posts.count > 0) { + self.posts = posts as HNPost[] + dispatch_async(dispatch_get_main_queue(), { + self.tableView.reloadSections(NSIndexSet(index: 0), withRowAnimation: .Fade) + self.refreshControl.endRefreshing() + UIApplication.sharedApplication().networkActivityIndicatorVisible = false + }) + } else { + println("Could not fetch posts!") + self.refreshControl.endRefreshing() + UIApplication.sharedApplication().networkActivityIndicatorVisible = false; + } + }) + } + + func stylePostCellAsRead(cell: UITableViewCell) { + cell.textLabel.textColor = UIColor(red: 119/255.0, green: 119/255.0, blue: 119/255.0, alpha: 1) + cell.detailTextLabel.textColor = UIColor(red: 153/255.0, green: 153/255.0, blue: 153/255.0, alpha: 1) + } + + // MARK: UITableViewDataSource + + func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int { + return posts.count + } + + func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { + let cell = tableView.dequeueReusableCellWithIdentifier(postCellIdentifier) as UITableViewCell + + let post = posts[indexPath.row] + + if HNManager.sharedManager().hasUserReadPost(post) { + stylePostCellAsRead(cell) + } + + cell.textLabel.text = post.Title + cell.detailTextLabel.text = "\(post.Points) points by \(post.Username)" + + return cell + } + + // MARK: UIViewController + + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject) { + if segue.identifier == showBrowserIdentifier { + let webView = segue.destinationViewController as BrowserViewController + let cell = sender as UITableViewCell + let post = posts[tableView.indexPathForCell(cell).row] + + HNManager.sharedManager().setMarkAsReadForPost(post) + stylePostCellAsRead(cell) + + webView.post = post + } + } + + // MARK: IBActions + + @IBAction func changePostFilter(sender: UISegmentedControl) { + switch sender.selectedSegmentIndex { + case 0: + postFilter = .Top + fetchPosts() + case 1: + postFilter = .New + fetchPosts() + case 2: + postFilter = .Ask + fetchPosts() + default: + println("Bad segment index!") + } + } +} diff --git a/sources_non_forked/swift.vim/example/URL.swift b/sources_non_forked/swift.vim/example/URL.swift new file mode 100644 index 00000000..131a3d5e --- /dev/null +++ b/sources_non_forked/swift.vim/example/URL.swift @@ -0,0 +1,11 @@ +import UIKit + +class Foo: FooViewController, BarScrollable { + + var canScroll = false + + override func viewDidLoad() { + baseURL = "http://www.oaklandpostonline.com/search/?q=&t=article&c[]=blogs*" + super.viewDidLoad() + } +} diff --git a/sources_non_forked/swift.vim/example/example.swift b/sources_non_forked/swift.vim/example/example.swift new file mode 100644 index 00000000..e28adf36 --- /dev/null +++ b/sources_non_forked/swift.vim/example/example.swift @@ -0,0 +1,361 @@ +#!/Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -i + +// This is a comment + +let foo = 5 // another comment + +/* this is also a comment */ + +// If statements so the indented comments are valid +if foo { + /* this is an indented comment */ +} + +if foo { + /* this is a multi level indented comment /* you know */ */ +} + +// comments check splelling + +/* this is +a multi-line +/* you know */ + +/** foo +bar +*/ + +comment +*/ + +/// foo bar + + +"this is a string no splell checking" +"this is a string\" with an escaped quote" + +// TODO: This is a todo comment +// XXX: This is another todo comment +// FIXME: this is another todo comment +// NOTE: this is another todo comment +/* TODO multiple */ + +// MARK: this is a marker + +if foo { + // this is a indented comment +} + +5 // int + +5.5 // float +5e-2 +5E2 +5.5E-2 +5.5e2 +5.5f2 +5.5abc5.5 // broken + +0xa2ef // hex +0x123P432 +0xa_2ef // hex with underscore +0x13p-43 +0x13r-43 +0x213zdf // broken hex + +0b10101 // binary +0b1010_1 // binary with underscore +0b1234 // broken binary + +0o567 // octal +0o56_7 // octal with underscore +0o5689 // broken octal + +1_000_000 // underscore separated million +1_000_0000_ // broken underscore separated number +1_000_0000. // broken underscore separated float +1_000_000.000_000_1 // just over one million +1_18181888_2.1.1 // broken underscore padded double +1_18181888_2.1 // valid according to swift repl +1_0_0 // valid 100 +1_0_000.2 // valid 10000.2 +1_____0.2________20___2 // also valid 10.2202 +4__3.2_33_33 // valid 43.233 + +// Operators +~ +! +% +^ +& +2 * 2 +- ++ += +| +2 / 5 +. +> +< + +a != b +a != b +a !== b +a !== b +%= +&% +&& +&&= +let a = 10 &* 20 +&+ +&- +8 &/ 20 +&= +let a *= 20 +++ ++= +-- +-= +.. +... +let b = 50 /= 20 +<< +<= +=<< +== +=== +>= +>> +>>= +^= +|= +|| +||= +~= + +// Custom Operators +infix operator ~ { + precedence 20 // Define precedence + associativity none // Define associativity +} + +true +false + +class Shape : NSObject { + var foo: String + var qux: String = "abcd" + let bar = String?[]() + let baz = String()? + let foo = Int() + + init(thing: String) { + foo = thing + super.init(thing) + let bar:String= "123" + + bar! + } + + func foo(thing1 : String, 2thing : Int52) { + + } + + func bar(thing: String?){ + + } +} + +import Cocoa + +struct Thing: NSString { + var foo : Int +} + +enum Card : Int { + case Spade = 1 + case Heart + case Diamond + case Club + indirect case Foo(a: Card) +} + +let indirect = 5 + +struct foo : bar { + switch (foo) { + case foo: + foo + case bar: + default: + stuff + case baz: + fuck + case bar: + bafsd + } + + func foo() { + + } + + func bar(asdf: String) -> Bool { + + } + + func baz() -> (Foo, Bar) + { + + } + + func asdf() { + + } +} + +struct ArgumentList { + var arguments: String[] + + init(argv: UnsafePointer, + count: CInt) + { + foo + } +} + +let a : UnsafePointer + +func foo() { + +} + +init(argv: UnsafePointer, count: CInt) { + for i in 1..count { + let index = Int(i) + let arg = String.fromCString(argv[index]) + arguments.append(arg) + } +} + +func simpleDescription() -> String { + return "A shape with \(numberOfSides.toRaw()) sides." +} + +let library = [ + Movie(name: "foo bar", + dfasdfsdfdirector: "someone", + foo: "bar", + bazzzer: "qux") +] + + +foo as? String +let foo : Int = bar ?? 5 + +let arg: String = "123" +hello(arg, arg2: 1.0, arg3: arg, arg4: "foo", arg5: false) + + +class MainViewController: UIViewController, UITableViewDataSource {} + +@IBAction func changePostFilter(sender: UISegmentedControl) {} +override func prepareForSegue(segue: UIStoryboardSegue, + sender: AnyObject) {} +override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {} +override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {} +lazy var foo : String + +#if foo +bar +#elseif baz +qux +#else +quix +#endif + +client.host = "example.com" +client.pathPrefix = "/foo/" + +@available(*, unavailable, renamed="bar", introduced=1.0, deprecated=2.2, message="hi") +func foo () { + override func loadView() { + super.loadView() + if foo { + foobar + } + } +} + +let foo = CGRectMake(0, (5 - 2), + 100, 200) + + +let dict = [ + "foo": "Bar", + "nest": [ + "fadsf", + ] +] + +if #available(OSX 10.10.3, *) { + // Use APIs OS X 10.10.3 and onwards +} +if #available(watchOS 2, iOS 9.0, OSX 10.11, *) { + // APIs available to watchOS 2.0, iOS 9.0, OSX 10.11 and onwards +} + +// Tests backslashes in strings +"\\".uppercaseString() +"foo \(1 + 1)" +string.rangeOfString("^/Date\\(") + +public var `extension`: String? + +/** +This is the comment body + +- parameter first: The first parameter +- Parameter first: The first parameter + +- returns: Some value +*/ + +public let fareEstimate: FareEstimate //= (nil, nil) // comment should be highlighted as comment + +// optionalFrom should be highlighted the same way +// Operator should also be highlighted +key = map.optionalFrom("string") ?? [] +key = map.optionalFrom("string") +thing = map.optionalFrom("string") ?? .Fallback + +// This should not break all highlighting +print("Copying \(NSProcessInfo().environment["SCRIPT_INPUT_FILE_\(index)"]!)") +// Neither should this +return addressParts.count == 2 ? addressParts[1] : "\(addressParts[1]), \(addressParts[2])" + +// This is multiline garbage +"foo +bar +baz" + +guard let path = NSBundle.mainBundle().pathForResource(imageName, ofType: "png"), +let data = NSData(contentsOfFile: path), +let data = NSData(contentsOfFile: path) else +{ +} + +UIView.animateWithDuration(duration, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: .CurveEaseInOut, animations: { + view.backgroundColor = UIColor.redColor() +}) { finished in + print("indent?") +} + +// Indent last line should hold +self.init(className: "Item", dictionary: [ + "identifier": item.identifier, + "title": item.title, + "link": item.link, + "date": item.date, + "summary": item.summary]) + +XCAssertEqual(variables as NSDictionary, expectedVariables as NSDictionary, "\(template)") diff --git a/sources_non_forked/swift.vim/ftdetect/swift.vim b/sources_non_forked/swift.vim/ftdetect/swift.vim new file mode 100644 index 00000000..5be9bf33 --- /dev/null +++ b/sources_non_forked/swift.vim/ftdetect/swift.vim @@ -0,0 +1,12 @@ +autocmd BufNewFile,BufRead *.swift set filetype=swift +autocmd BufRead * call s:Swift() +function! s:Swift() + if !empty(&filetype) + return + endif + + let line = getline(1) + if line =~ "^#!.*swift" + setfiletype swift + endif +endfunction diff --git a/sources_non_forked/swift.vim/ftplugin/swift.vim b/sources_non_forked/swift.vim/ftplugin/swift.vim new file mode 100644 index 00000000..0945a75f --- /dev/null +++ b/sources_non_forked/swift.vim/ftplugin/swift.vim @@ -0,0 +1,4 @@ +setlocal commentstring=//\ %s +" @-@ adds the literal @ to iskeyword for @IBAction and similar +setlocal iskeyword+=@-@,# +setlocal completefunc=syntaxcomplete#Complete diff --git a/sources_non_forked/swift.vim/indent/swift.vim b/sources_non_forked/swift.vim/indent/swift.vim new file mode 100644 index 00000000..4f41c2db --- /dev/null +++ b/sources_non_forked/swift.vim/indent/swift.vim @@ -0,0 +1,238 @@ +" File: swift.vim +" Author: Keith Smiley +" Description: The indent file for Swift +" Last Modified: December 05, 2014 + +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +let s:cpo_save = &cpo +set cpo&vim + +setlocal nosmartindent +setlocal indentkeys-=e +setlocal indentkeys+=0] +setlocal indentexpr=SwiftIndent() + +function! s:NumberOfMatches(char, string, index) + let instances = 0 + let i = 0 + while i < strlen(a:string) + if a:string[i] == a:char && !s:IsExcludedFromIndentAtPosition(a:index, i + 1) + let instances += 1 + endif + + let i += 1 + endwhile + + return instances +endfunction + +function! s:SyntaxNameAtPosition(line, column) + return synIDattr(synID(a:line, a:column, 0), "name") +endfunction + +function! s:SyntaxName() + return s:SyntaxNameAtPosition(line("."), col(".")) +endfunction + +function! s:IsExcludedFromIndentAtPosition(line, column) + let name = s:SyntaxNameAtPosition(a:line, a:column) + return name ==# "swiftComment" || name ==# "swiftString" +endfunction + +function! s:IsExcludedFromIndent() + return s:SyntaxName() ==# "swiftComment" || s:SyntaxName() ==# "swiftString" +endfunction + +function! s:IsCommentLine(lnum) + return synIDattr(synID(a:lnum, + \ match(getline(a:lnum), "\S") + 1, 0), "name") + \ ==# "swiftComment" +endfunction + +function! SwiftIndent(...) + let clnum = a:0 ? a:1 : v:lnum + + let line = getline(clnum) + let previousNum = prevnonblank(clnum - 1) + while s:IsCommentLine(previousNum) != 0 + let previousNum = prevnonblank(previousNum - 1) + endwhile + + let previous = getline(previousNum) + let cindent = cindent(clnum) + let previousIndent = indent(previousNum) + + let numOpenParens = s:NumberOfMatches("(", previous, previousNum) + let numCloseParens = s:NumberOfMatches(")", previous, previousNum) + let numOpenBrackets = s:NumberOfMatches("{", previous, previousNum) + let numCloseBrackets = s:NumberOfMatches("}", previous, previousNum) + + let currentOpenBrackets = s:NumberOfMatches("{", line, clnum) + let currentCloseBrackets = s:NumberOfMatches("}", line, clnum) + + let numOpenSquare = s:NumberOfMatches("[", previous, previousNum) + let numCloseSquare = s:NumberOfMatches("]", previous, previousNum) + + let currentCloseSquare = s:NumberOfMatches("]", line, clnum) + if numOpenSquare > numCloseSquare && currentCloseSquare < 1 + return previousIndent + shiftwidth() + endif + + if currentCloseSquare > 0 && line !~ '\v\[.*\]' + let column = col(".") + call cursor(line("."), 1) + let openingSquare = searchpair("\\[", "", "\\]", "bWn", "s:IsExcludedFromIndent()") + call cursor(line("."), column) + + if openingSquare == 0 + return -1 + endif + + " - Line starts with closing square, indent as opening square + if line =~ '\v^\s*]' + return indent(openingSquare) + endif + + " - Line contains closing square and more, indent a level above opening + return indent(openingSquare) + shiftwidth() + endif + + if line =~ ":$" + let switch = search("switch", "bWn") + return indent(switch) + elseif previous =~ ":$" + return previousIndent + shiftwidth() + endif + + if numOpenParens == numCloseParens + if numOpenBrackets > numCloseBrackets + if currentCloseBrackets > currentOpenBrackets || line =~ "\\v^\\s*}" + let column = col(".") + call cursor(line("."), 1) + let openingBracket = searchpair("{", "", "}", "bWn", "s:IsExcludedFromIndent()") + call cursor(line("."), column) + if openingBracket == 0 + return -1 + else + return indent(openingBracket) + endif + endif + + return previousIndent + shiftwidth() + elseif previous =~ "}.*{" + if line =~ "\\v^\\s*}" + return previousIndent + endif + + return previousIndent + shiftwidth() + elseif line =~ "}.*{" + let openingBracket = searchpair("{", "", "}", "bWn", "s:IsExcludedFromIndent()") + return indent(openingBracket) + elseif currentCloseBrackets > currentOpenBrackets + let column = col(".") + call cursor(line("."), 1) + let openingBracket = searchpair("{", "", "}", "bWn", "s:IsExcludedFromIndent()") + call cursor(line("."), column) + + let bracketLine = getline(openingBracket) + + let numOpenParensBracketLine = s:NumberOfMatches("(", bracketLine, openingBracket) + let numCloseParensBracketLine = s:NumberOfMatches(")", bracketLine, openingBracket) + if numCloseParensBracketLine > numOpenParensBracketLine + let line = line(".") + let column = col(".") + call cursor(openingParen, column) + let openingParen = searchpair("(", "", ")", "bWn", "s:IsExcludedFromIndent()") + call cursor(line, column) + return indent(openingParen) + endif + return indent(openingBracket) + else + " - Current line is blank, and the user presses 'o' + return previousIndent + endif + endif + + if numCloseParens > 0 + if currentOpenBrackets > 0 || currentCloseBrackets > 0 + if currentOpenBrackets > 0 + if numOpenBrackets > numCloseBrackets + return previousIndent + shiftwidth() + endif + + if line =~ "}.*{" + let openingBracket = searchpair("{", "", "}", "bWn", "s:IsExcludedFromIndent()") + return indent(openingBracket) + endif + + if numCloseParens > numOpenParens + let line = line(".") + let column = col(".") + call cursor(line - 1, column) + let openingParen = searchpair("(", "", ")", "bWn", "s:IsExcludedFromIndent()") + call cursor(line, column) + return indent(openingParen) + endif + + return previousIndent + endif + + if currentCloseBrackets > 0 + let openingBracket = searchpair("{", "", "}", "bWn", "s:IsExcludedFromIndent()") + return indent(openingBracket) + endif + + return cindent + endif + + if numCloseParens < numOpenParens + if numOpenBrackets > numCloseBrackets + return previousIndent + shiftwidth() + endif + + let previousParen = match(previous, "(") + return indent(previousParen) + shiftwidth() + endif + + if numOpenBrackets > numCloseBrackets + let line = line(".") + let column = col(".") + call cursor(previousNum, column) + let openingParen = searchpair("(", "", ")", "bWn", "s:IsExcludedFromIndent()") + call cursor(line, column) + return indent(openingParen) + shiftwidth() + endif + + " - Previous line has close then open braces, indent previous + 1 'sw' + if previous =~ "}.*{" + return previousIndent + shiftwidth() + endif + + let line = line(".") + let column = col(".") + call cursor(previousNum, column) + let openingParen = searchpair("(", "", ")", "bWn", "s:IsExcludedFromIndent()") + call cursor(line, column) + + return indent(openingParen) + endif + + " - Line above has (unmatched) open paren, next line needs indent + if numOpenParens > 0 + let savePosition = getcurpos() + " Must be at EOL because open paren has to be above (left of) the cursor + call cursor(previousNum, col("$")) + let previousParen = searchpair("(", "", ")", "bWn", "s:IsExcludedFromIndent()") + call setpos(".", savePosition) + return indent(previousParen) + shiftwidth() + endif + + return cindent +endfunction + +let &cpo = s:cpo_save +unlet s:cpo_save diff --git a/sources_non_forked/swift.vim/plugin/swift.vim b/sources_non_forked/swift.vim/plugin/swift.vim new file mode 100644 index 00000000..aa232a5c --- /dev/null +++ b/sources_non_forked/swift.vim/plugin/swift.vim @@ -0,0 +1,14 @@ +let g:tagbar_type_swift = { + \ 'ctagstype': 'swift', + \ 'kinds': [ + \ 'P:protocol', + \ 'c:class', + \ 's:struct', + \ 'e:enum', + \ 'E:extension', + \ 'f:function', + \ 't:typealias' + \ ], + \ 'sort': 0, + \ 'deffile': expand(':p:h:h') . '/ctags/swift.cnf' +\ } diff --git a/sources_non_forked/swift.vim/screenshots/screen.png b/sources_non_forked/swift.vim/screenshots/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..d54c09a12116c177a40aa8f79c20db6a460638ff GIT binary patch literal 16168 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 literal 0 HcmV?d00001 diff --git a/sources_non_forked/swift.vim/syntax/swift.vim b/sources_non_forked/swift.vim/syntax/swift.vim new file mode 100644 index 00000000..de8cccdd --- /dev/null +++ b/sources_non_forked/swift.vim/syntax/swift.vim @@ -0,0 +1,290 @@ +" File: swift.vim +" Author: Keith Smiley +" Description: Runtime files for Swift +" Last Modified: June 15, 2014 + +if exists("b:current_syntax") + finish +endif + +" Comments +" Shebang +syntax match swiftShebang "\v#!.*$" + +" Comment contained keywords +syntax keyword swiftTodos contained TODO XXX FIXME NOTE +syntax keyword swiftMarker contained MARK + +" In comment identifiers +function! s:CommentKeywordMatch(keyword) + execute "syntax match swiftDocString \"\\v^\\s*-\\s*". a:keyword . "\\W\"hs=s+1,he=e-1 contained" +endfunction + +syntax case ignore + +call s:CommentKeywordMatch("attention") +call s:CommentKeywordMatch("author") +call s:CommentKeywordMatch("authors") +call s:CommentKeywordMatch("bug") +call s:CommentKeywordMatch("complexity") +call s:CommentKeywordMatch("copyright") +call s:CommentKeywordMatch("date") +call s:CommentKeywordMatch("experiment") +call s:CommentKeywordMatch("important") +call s:CommentKeywordMatch("invariant") +call s:CommentKeywordMatch("note") +call s:CommentKeywordMatch("parameter") +call s:CommentKeywordMatch("postcondition") +call s:CommentKeywordMatch("precondition") +call s:CommentKeywordMatch("remark") +call s:CommentKeywordMatch("remarks") +call s:CommentKeywordMatch("requires") +call s:CommentKeywordMatch("returns") +call s:CommentKeywordMatch("see") +call s:CommentKeywordMatch("since") +call s:CommentKeywordMatch("throws") +call s:CommentKeywordMatch("todo") +call s:CommentKeywordMatch("version") +call s:CommentKeywordMatch("warning") + +syntax case match +delfunction s:CommentKeywordMatch + + +" Literals +" Strings +syntax region swiftString start=/"/ skip=/\\\\\|\\"/ end=/"/ contains=swiftInterpolatedWrapper oneline +syntax region swiftInterpolatedWrapper start="\v[^\\]\zs\\\(\s*" end="\v\s*\)" contained containedin=swiftString contains=swiftInterpolatedString,swiftString oneline +syntax match swiftInterpolatedString "\v\w+(\(\))?" contained containedin=swiftInterpolatedWrapper oneline + +" Numbers +syntax match swiftNumber "\v<\d+>" +syntax match swiftNumber "\v<(\d+_+)+\d+(\.\d+(_+\d+)*)?>" +syntax match swiftNumber "\v<\d+\.\d+>" +syntax match swiftNumber "\v<\d*\.?\d+([Ee]-?)?\d+>" +syntax match swiftNumber "\v<0x[[:xdigit:]_]+([Pp]-?)?\x+>" +syntax match swiftNumber "\v<0b[01_]+>" +syntax match swiftNumber "\v<0o[0-7_]+>" + +" BOOLs +syntax keyword swiftBoolean + \ true + \ false + + +" Operators +syntax match swiftOperator "\v\~" +syntax match swiftOperator "\v\s+!" +syntax match swiftOperator "\v\%" +syntax match swiftOperator "\v\^" +syntax match swiftOperator "\v\&" +syntax match swiftOperator "\v\*" +syntax match swiftOperator "\v-" +syntax match swiftOperator "\v\+" +syntax match swiftOperator "\v\=" +syntax match swiftOperator "\v\|" +syntax match swiftOperator "\v\/" +syntax match swiftOperator "\v\." +syntax match swiftOperator "\v\<" +syntax match swiftOperator "\v\>" +syntax match swiftOperator "\v\?\?" + +" Methods/Functions/Properties +syntax match swiftMethod "\(\.\)\@<=\w\+\((\)\@=" +syntax match swiftProperty "\(\.\)\@<=\<\w\+\>(\@!" + +" Swift closure arguments +syntax match swiftClosureArgument "\$\d\+\(\.\d\+\)\?" + +syntax match swiftAvailability "\v((\*(\s*,\s*[a-zA-Z="0-9.]+)*)|(\w+\s+\d+(\.\d+(.\d+)?)?\s*,\s*)+\*)" contains=swiftString +syntax keyword swiftPlatforms OSX iOS watchOS OSXApplicationExtension iOSApplicationExtension contained containedin=swiftAvailability +syntax keyword swiftAvailabilityArg renamed unavailable introduced deprecated obsoleted message contained containedin=swiftAvailability + +" Keywords {{{ +syntax keyword swiftKeywords + \ associatedtype + \ associativity + \ atexit + \ break + \ case + \ catch + \ class + \ continue + \ convenience + \ default + \ defer + \ deinit + \ didSet + \ do + \ dynamic + \ else + \ extension + \ fallthrough + \ fileprivate + \ final + \ for + \ func + \ get + \ guard + \ if + \ import + \ in + \ infix + \ init + \ inout + \ internal + \ lazy + \ let + \ mutating + \ nil + \ nonmutating + \ operator + \ optional + \ override + \ postfix + \ precedence + \ precedencegroup + \ prefix + \ private + \ protocol + \ public + \ repeat + \ required + \ return + \ self + \ set + \ static + \ subscript + \ super + \ switch + \ throw + \ try + \ typealias + \ unowned + \ var + \ weak + \ where + \ while + \ willSet + +syntax keyword swiftDefinitionModifier + \ rethrows + \ throws + +syntax match swiftMultiwordKeywords "indirect case" +syntax match swiftMultiwordKeywords "indirect enum" +" }}} + +" Names surrounded by backticks. This aren't limited to keywords because 1) +" Swift doesn't limit them to keywords and 2) I couldn't make the keywords not +" highlight at the same time +syntax region swiftEscapedReservedWord start="`" end="`" oneline + +syntax keyword swiftAttributes + \ @assignment + \ @autoclosure + \ @available + \ @convention + \ @discardableResult + \ @exported + \ @IBAction + \ @IBDesignable + \ @IBInspectable + \ @IBOutlet + \ @noescape + \ @nonobjc + \ @noreturn + \ @NSApplicationMain + \ @NSCopying + \ @NSManaged + \ @objc + \ @testable + \ @UIApplicationMain + \ @warn_unused_result + +syntax keyword swiftConditionStatement #available + +syntax keyword swiftStructure + \ struct + \ enum + +syntax keyword swiftDebugIdentifier + \ #column + \ #file + \ #function + \ #line + \ __COLUMN__ + \ __FILE__ + \ __FUNCTION__ + \ __LINE__ + +syntax keyword swiftLineDirective #setline + +syntax region swiftTypeWrapper start="\v:\s*" skip="\s*,\s*$*\s*" end="$\|/"me=e-1 contains=ALLBUT,swiftInterpolatedWrapper transparent +syntax region swiftTypeCastWrapper start="\(as\|is\)\(!\|?\)\=\s\+" end="\v(\s|$|\{)" contains=swiftType,swiftCastKeyword keepend transparent oneline +syntax region swiftGenericsWrapper start="\v\<" end="\v\>" contains=swiftType transparent oneline +syntax region swiftLiteralWrapper start="\v\=\s*" skip="\v[^\[\]]\(\)" end="\v(\[\]|\(\))" contains=ALL transparent oneline +syntax region swiftReturnWrapper start="\v-\>\s*" end="\v(\{|$)" contains=swiftType transparent oneline +syntax match swiftType "\v<\u\w*" contained containedin=swiftTypeWrapper,swiftLiteralWrapper,swiftGenericsWrapper,swiftTypeCastWrapper +syntax match swiftTypeDeclaration /->/ skipwhite nextgroup=swiftType + +syntax keyword swiftImports import +syntax keyword swiftCastKeyword is as contained + +" 'preprocesor' stuff +syntax keyword swiftPreprocessor + \ #if + \ #elseif + \ #else + \ #endif + \ #selector + + +" Comment patterns +syntax match swiftComment "\v\/\/.*$" + \ contains=swiftTodos,swiftDocString,swiftMarker,@Spell oneline +syntax region swiftComment start="/\*" end="\*/" + \ contains=swiftTodos,swiftDocString,swiftMarker,@Spell fold + + +" Set highlights +highlight default link swiftTodos Todo +highlight default link swiftDocString String +highlight default link swiftShebang Comment +highlight default link swiftComment Comment +highlight default link swiftMarker Comment + +highlight default link swiftString String +highlight default link swiftInterpolatedWrapper Delimiter +highlight default link swiftTypeDeclaration Delimiter +highlight default link swiftNumber Number +highlight default link swiftBoolean Boolean + +highlight default link swiftOperator Operator +highlight default link swiftCastKeyword Keyword +highlight default link swiftKeywords Keyword +highlight default link swiftMultiwordKeywords Keyword +highlight default link swiftEscapedReservedWord Normal +highlight default link swiftClosureArgument Operator +highlight default link swiftAttributes PreProc +highlight default link swiftConditionStatement PreProc +highlight default link swiftStructure Structure +highlight default link swiftType Type +highlight default link swiftImports Include +highlight default link swiftPreprocessor PreProc +highlight default link swiftMethod Function +highlight default link swiftProperty Identifier + +highlight default link swiftDefinitionModifier Define +highlight default link swiftConditionStatement PreProc +highlight default link swiftAvailability Normal +highlight default link swiftAvailabilityArg Normal +highlight default link swiftPlatforms Keyword +highlight default link swiftDebugIdentifier PreProc +highlight default link swiftLineDirective PreProc + +" Force vim to sync at least x lines. This solves the multiline comment not +" being highlighted issue +syn sync minlines=100 + +let b:current_syntax = "swift" diff --git a/sources_non_forked/swift.vim/syntax_checkers/swift/swiftlint.vim b/sources_non_forked/swift.vim/syntax_checkers/swift/swiftlint.vim new file mode 100644 index 00000000..706f9279 --- /dev/null +++ b/sources_non_forked/swift.vim/syntax_checkers/swift/swiftlint.vim @@ -0,0 +1,45 @@ +if exists('g:loaded_syntastic_swift_swiftlint_checker') + finish +endif +let g:loaded_syntastic_swift_swiftlint_checker = 1 + +let s:save_cpo = &cpo +set cpo&vim + +function! SyntaxCheckers_swift_swiftlint_IsAvailable() dict + if !executable(self.getExec()) + return 0 + endif + + return get(g:, 'syntastic_swift_swiftlint_use_defaults', 0) + \ || filereadable('.swiftlint.yml') +endfunction + +function! SyntaxCheckers_swift_swiftlint_GetLocList() dict + let makeprg = self.makeprgBuild({ + \ 'args': 'lint --use-script-input-files', + \ 'fname': '' }) + + let errorformat = + \ '%f:%l:%c: %trror: %m,' . + \ '%f:%l:%c: %tarning: %m,' . + \ '%f:%l: %trror: %m,' . + \ '%f:%l: %tarning: %m' + + let env = { + \ 'SCRIPT_INPUT_FILE_COUNT': 1, + \ 'SCRIPT_INPUT_FILE_0': expand('%:p'), + \ } + + return SyntasticMake({ + \ 'makeprg': makeprg, + \ 'errorformat': errorformat, + \ 'env': env }) +endfunction + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'swift', + \ 'name': 'swiftlint' }) + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/sources_non_forked/swift.vim/syntax_checkers/swift/swiftpm.vim b/sources_non_forked/swift.vim/syntax_checkers/swift/swiftpm.vim new file mode 100644 index 00000000..65118fbd --- /dev/null +++ b/sources_non_forked/swift.vim/syntax_checkers/swift/swiftpm.vim @@ -0,0 +1,44 @@ +if exists('g:loaded_syntastic_swift_swiftpm_checker') + finish +endif +let g:loaded_syntastic_swift_swiftpm_checker = 1 + +if !exists('g:syntastic_swift_swiftpm_executable') + let g:syntastic_swift_swiftpm_executable = 'swift' +endif + +if !exists('g:syntastic_swift_swiftpm_arguments') + let g:syntastic_swift_swiftpm_arguments = 'build' +endif + +let s:save_cpo = &cpo +set cpo&vim + +function! SyntaxCheckers_swift_swiftpm_IsAvailable() dict + if !executable(self.getExec()) + return 0 + endif + + return filereadable('Package.swift') +endfunction + +function! SyntaxCheckers_swift_swiftpm_GetLocList() dict + let makeprg = self.makeprgBuild({ + \ 'fname': '', + \ 'args': g:syntastic_swift_swiftpm_arguments }) + + let errorformat = + \ '%f:%l:%c: error: %m' + + return SyntasticMake({ + \ 'makeprg': makeprg, + \ 'errorformat': errorformat }) +endfunction + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'swift', + \ 'name': 'swiftpm', + \ 'exec': g:syntastic_swift_swiftpm_executable }) + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/vimrcs/extended.vim b/vimrcs/extended.vim index a4f0c9b9..9cc38abc 100644 --- a/vimrcs/extended.vim +++ b/vimrcs/extended.vim @@ -29,7 +29,7 @@ set guioptions-=L " Colorscheme set background=dark -colorscheme peaksea +colorscheme murphy """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" From d56a49f5b4d1eaf228007db86963cee2cebf1f78 Mon Sep 17 00:00:00 2001 From: huhuaishun Date: Tue, 18 Apr 2017 13:13:51 +0800 Subject: [PATCH 11/22] add vim-session --- sources_non_forked/vim-misc/.gitignore | 1 + sources_non_forked/vim-misc/INSTALL.md | 13 + sources_non_forked/vim-misc/README.md | 1015 ++++++++++++++ sources_non_forked/vim-misc/addon-info.json | 1 + .../vim-misc/autoload/xolox/misc.vim | 7 + .../vim-misc/autoload/xolox/misc/async.vim | 261 ++++ .../vim-misc/autoload/xolox/misc/buffer.vim | 80 ++ .../vim-misc/autoload/xolox/misc/complete.vim | 26 + .../autoload/xolox/misc/cursorhold.vim | 71 + .../vim-misc/autoload/xolox/misc/echo.exe | Bin 0 -> 7680 bytes .../vim-misc/autoload/xolox/misc/escape.vim | 56 + .../vim-misc/autoload/xolox/misc/format.vim | 46 + .../vim-misc/autoload/xolox/misc/list.vim | 42 + .../vim-misc/autoload/xolox/misc/msg.vim | 129 ++ .../vim-misc/autoload/xolox/misc/open.vim | 100 ++ .../vim-misc/autoload/xolox/misc/option.vim | 116 ++ .../vim-misc/autoload/xolox/misc/os.vim | 284 ++++ .../vim-misc/autoload/xolox/misc/path.vim | 278 ++++ .../vim-misc/autoload/xolox/misc/perm.vim | 100 ++ .../vim-misc/autoload/xolox/misc/persist.vim | 50 + .../vim-misc/autoload/xolox/misc/str.vim | 74 + .../vim-misc/autoload/xolox/misc/test.vim | 125 ++ .../vim-misc/autoload/xolox/misc/tests.vim | 301 +++++ .../vim-misc/autoload/xolox/misc/timer.vim | 130 ++ .../vim-misc/autoload/xolox/misc/version.vim | 34 + sources_non_forked/vim-misc/doc/misc.txt | 1204 +++++++++++++++++ .../vim-misc/plugin/xolox/misc.vim | 19 + .../vim-session-master/.gitignore | 1 + .../vim-session-master/INSTALL.md | 15 + .../vim-session-master/README.md | 646 +++++++++ sources_non_forked/vim-session-master/TODO.md | 5 + .../vim-session-master/addon-info.json | 1 + .../autoload/xolox/session.vim | 1158 ++++++++++++++++ .../autoload/xolox/session/suggestions.vim | 42 + .../vim-session-master/doc/session.txt | 960 +++++++++++++ .../vim-session-master/plugin/session.vim | 205 +++ .../screenshots/session-restore-prompt.png | Bin 0 -> 22330 bytes .../screenshots/session-save-prompt.png | Bin 0 -> 23303 bytes vimrcs/plugins_config.vim | 7 + 39 files changed, 7603 insertions(+) create mode 100755 sources_non_forked/vim-misc/.gitignore create mode 100755 sources_non_forked/vim-misc/INSTALL.md create mode 100755 sources_non_forked/vim-misc/README.md create mode 100755 sources_non_forked/vim-misc/addon-info.json create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc.vim create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/async.vim create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/buffer.vim create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/complete.vim create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/cursorhold.vim create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/echo.exe create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/escape.vim create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/format.vim create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/list.vim create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/msg.vim create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/open.vim create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/option.vim create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/os.vim create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/path.vim create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/perm.vim create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/persist.vim create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/str.vim create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/test.vim create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/tests.vim create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/timer.vim create mode 100755 sources_non_forked/vim-misc/autoload/xolox/misc/version.vim create mode 100755 sources_non_forked/vim-misc/doc/misc.txt create mode 100755 sources_non_forked/vim-misc/plugin/xolox/misc.vim create mode 100755 sources_non_forked/vim-session-master/.gitignore create mode 100755 sources_non_forked/vim-session-master/INSTALL.md create mode 100755 sources_non_forked/vim-session-master/README.md create mode 100755 sources_non_forked/vim-session-master/TODO.md create mode 100755 sources_non_forked/vim-session-master/addon-info.json create mode 100755 sources_non_forked/vim-session-master/autoload/xolox/session.vim create mode 100755 sources_non_forked/vim-session-master/autoload/xolox/session/suggestions.vim create mode 100755 sources_non_forked/vim-session-master/doc/session.txt create mode 100755 sources_non_forked/vim-session-master/plugin/session.vim create mode 100755 sources_non_forked/vim-session-master/screenshots/session-restore-prompt.png create mode 100755 sources_non_forked/vim-session-master/screenshots/session-save-prompt.png diff --git a/sources_non_forked/vim-misc/.gitignore b/sources_non_forked/vim-misc/.gitignore new file mode 100755 index 00000000..926ccaaf --- /dev/null +++ b/sources_non_forked/vim-misc/.gitignore @@ -0,0 +1 @@ +doc/tags diff --git a/sources_non_forked/vim-misc/INSTALL.md b/sources_non_forked/vim-misc/INSTALL.md new file mode 100755 index 00000000..2020f3db --- /dev/null +++ b/sources_non_forked/vim-misc/INSTALL.md @@ -0,0 +1,13 @@ +# Installation instructions + +There are two ways to install the vim-misc plug-in and it's up to you which you prefer, both options are explained below. Please note that below are generic installation instructions while some Vim plug-ins may have external dependencies, please refer to the plug-in's [readme](README.md) for details. + +## Installation using a ZIP archive + +Unzip the most recent ZIP archive of the [vim-misc](http://peterodding.com/code/vim/downloads/misc.zip) plug-in inside your Vim profile directory (usually this is `~/.vim` on UNIX and `%USERPROFILE%\vimfiles` on Windows), restart Vim and execute the command `:helptags ~/.vim/doc` (use `:helptags ~\vimfiles\doc` instead on Windows). + +If you get warnings about overwriting existing files while unpacking the ZIP archive you probably don't need to worry about this because it's most likely caused by files like `README.md`, `INSTALL.md` and `addon-info.json`. If these files bother you then you can remove them after unpacking the ZIP archive, they are not required to use the plug-in. + +## Installation using a Vim plug-in manager + +If you prefer you can also use [Pathogen](http://www.vim.org/scripts/script.php?script_id=2332), [Vundle](https://github.com/gmarik/vundle) or a similar tool to install and update the [vim-misc](https://github.com/xolox/vim-misc) plug-in using a local clone of the git repository. This takes a bit of work to set up the first time but it makes updating much easier, and it keeps each plug-in in its own directory which helps to keep your Vim profile uncluttered. diff --git a/sources_non_forked/vim-misc/README.md b/sources_non_forked/vim-misc/README.md new file mode 100755 index 00000000..937d7c91 --- /dev/null +++ b/sources_non_forked/vim-misc/README.md @@ -0,0 +1,1015 @@ +# Miscellaneous auto-load Vim scripts + +The vim-misc plug-in contains Vim scripts that are used by most of the [Vim +plug-ins I've written] [plugins] yet don't really belong with any single one of +the plug-ins. Basically it's an extended standard library of Vim script +functions that I wrote during the development of my Vim profile and plug-ins. + +In the past these scripts were bundled with each plug-in, however that turned +out to be a maintenance nightmare for me. That's why the miscellaneous scripts +are now a proper plug-in with their own page on Vim Online. + +Because the miscellaneous scripts are no longer bundled with my Vim plug-ins, +users are now required to install the miscellaneous scripts separately. This is +unfortunate for users who are upgrading from a previous release that did bundle +the miscellaneous scripts, but I don't see any way around this. Sorry! + +## Installation + +Please refer to the [installation instructions] [howto-install] on GitHub. + +## Function documentation + +Below is the documentation for the functions included in the miscellaneous +scripts. Anyone is free to use these functions in their own Vim profile and/or +plug-ins. I care about backwards compatibility so won't break it without a good +reason to do so. + +For those who are curious: The function descriptions given below were extracted +from the source code of the miscellaneous scripts using the Python module +`vimdoctool.py` included in [vim-tools] []. + + + +The documentation of the 95 functions below was extracted from +19 Vim scripts on April 1, 2015 at 23:39. + +### Asynchronous Vim script evaluation + +The `xolox#misc#async#call()` function builds on top of `xolox#misc#os#exec()` +to support asynchronous evaluation of Vim scripts. The first (and for now +only) use case is my [vim-easytags][] plug-in which has a bunch of +conflicting requirements: + +1. I want the [vim-easytags][] plug-in to be as portable as possible. + Ideally everything is implemented in Vim script because that's the only + thing I can rely on to be available for all potential users of the + plug-in! + +2. Because of point one I've been forced to implement tags file reading, + parsing, (fold case) sorting and writing in Vim script. This is fine for + small tags files but once they grow to a couple of megabytes it becomes + annoying because Vim is unresponsive during tags file updates (key + presses are fortunately buffered due to Vim's input model but that + doesn't make it a nice user experience :-). + +3. I could (and did in the past) come up with all sorts of hacks to speed + things up without switching away from Vim script, but none of them are + going to solve the fundamental problem that Vim's unresponsive hiccups + become longer as tags files grow larger. + +By now it should be clear where this is heading: _Why not handle tags file +updates in a Vim process that runs in the background without blocking the +Vim process that the user is interacting with?_ It turns out that there are +quite a few details to take care of, but with those out of the way, it might +just work! I'm actually hoping to make asynchronous updates the default mode +in [vim-easytags][]. This means I need this functionality to be as +portable and robust as possible. + +**Status:** This code has seen little testing so I wouldn't trust it too +much just yet. On the other hand, as I said, my intention is to make this +functionality as portable and robust as possible. You be the judge :-). + +[vim-easytags]: http://peterodding.com/code/vim/easytags/ + +#### The `xolox#misc#async#call()` function + +Call a Vim script function asynchronously by starting a hidden Vim process +in the background. Once the function returns the hidden Vim process +terminates itself. This function takes a single argument which is a +dictionary with the following key/value pairs: + + - **function** (required): The name of the Vim function to call inside + the child process (a string). I suggest using an [autoload][] function + for this, see below. + + - **arguments** (optional): A list of arguments to pass to the function. + This list is serialized to a string using [string()][] and deserialized + using [eval()][]. + + - **callback** (optional): The name of a Vim function to call in the + parent process when the child process has completed (a string). + + - **clientserver** (optional): If this is true (1) the child process will + notify the parent process when it has finished (the default is true). + This works using Vim's client/server support which is not always + available. As a fall back Vim's [CursorHold][] automatic command is + also supported (although the effect is not quite as instantaneous :-). + +This functionality is experimental and non trivial to use, so consider +yourself warned :-). + +**Limitations** + +I'm making this functionality available in [vim-misc][] because I think it +can be useful to other plug-ins, however if you are going to use it you +should be aware of the following limitations: + + - Because of the use of multiple processes this functionality is only + suitable for 'heavy' tasks. + + - The function arguments are serialized to a string which is passed to + the hidden Vim process as a command line argument, so the amount of + data you can pass will be limited by your operating environment. + + - The hidden Vim process is explicitly isolated from the user in several + ways (see below for more details). This is to make sure that the hidden + Vim processes are fast and don't clobber the user's editing sessions in + any way. + +**Changes to how Vim normally works** + +You have to be aware that the hidden Vim process is initialized in a +specific way that is very different from your regular Vim editing +sessions: + + - Your [vimrc][] file is ignored using the `-u NONE` command line option. + + - Your [gvimrc][] file (if you even knew it existed ;-) is ignored using + the `-U NONE` command line option. + + - Plug-in loading is skipped using the `--noplugin` command line option. + + - Swap files (see [swap-file][]) are disabled using the `-n` command line + option. This makes sure asynchronous Vim processes don't disturb the + user's editing session. + + - Your [viminfo][] file is ignored using the `-i NONE` command line + option. Just like with swap files this makes sure asynchronous Vim + processes don't disturb the user's editing session. + + - No-compatible mode is enabled using the `-N` command line option + (usually the existence of your vimrc script would have achieved the + same effect but since we disable loading of your vimrc we need to spell + things out for Vim). + +**Use an auto-load function** + +The function you want to call is identified by its name which has to be +defined, but I just explained above that all regular initialization is +disabled for asynchronous Vim processes, so what gives? The answer is to +use an [autoload][] function. This should work fine because the +asynchronous Vim process 'inherits' the value of the ['runtimepath'][] +option from your editing session. + +['runtimepath']: http://vimdoc.sourceforge.net/htmldoc/options.html#'runtimepath' +[autoload]: http://vimdoc.sourceforge.net/htmldoc/eval.html#autoload +[CursorHold]: http://vimdoc.sourceforge.net/htmldoc/autocmd.html#CursorHold +[eval()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#eval() +[gvimrc]: http://vimdoc.sourceforge.net/htmldoc/gui.html#gvimrc +[string()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#string() +[swap-file]: http://vimdoc.sourceforge.net/htmldoc/recover.html#swap-file +[vim-misc]: http://peterodding.com/code/vim/misc/ +[viminfo]: http://vimdoc.sourceforge.net/htmldoc/starting.html#viminfo +[vimrc]: http://vimdoc.sourceforge.net/htmldoc/starting.html#vimrc + +#### The `xolox#misc#async#inside_child()` function + +Entry point inside the hidden Vim process that runs in the background. +Invoked indirectly by `xolox#misc#async#call()` because it runs a command +similar to the following: + + vim --cmd 'call xolox#misc#async#inside_child(...)' + +This function is responsible for calling the user defined function, +capturing exceptions and reporting the results back to the parent Vim +process using Vim's client/server support or a temporary file. + +#### The `xolox#misc#async#callback_to_parent()` function + +When Vim was compiled with client/server support this function (in the +parent process) will be called by `xolox#misc#async#inside_child()` (in +the child process) after the user defined function has returned. This +enables more or less instant callbacks after running an asynchronous +function. + +#### The `xolox#misc#async#periodic_callback()` function + +When client/server support is not being used the vim-misc plug-in +improvises: It uses Vim's [CursorHold][] event to periodically check if an +asynchronous process has written its results to one of the expected +temporary files. If a response is found the temporary file is read and +deleted and then `xolox#misc#async#callback_to_parent()` is called to +process the response. + +[CursorHold]: http://vimdoc.sourceforge.net/htmldoc/autocmd.html#CursorHold + +### Handling of special buffers + +The functions defined here make it easier to deal with special Vim buffers +that contain text generated by a Vim plug-in. For example my [vim-notes +plug-in] [vim-notes] generates several such buffers: + +- [:RecentNotes] [RecentNotes] lists recently modified notes +- [:ShowTaggedNotes] [ShowTaggedNotes] lists notes grouped by tags +- etc. + +Because the text in these buffers is generated, Vim shouldn't bother with +swap files and it should never prompt the user whether to save changes to +the generated text. + +[vim-notes]: http://peterodding.com/code/vim/notes/ +[RecentNotes]: http://peterodding.com/code/vim/notes/#recentnotes_command +[ShowTaggedNotes]: http://peterodding.com/code/vim/notes/#showtaggednotes_command + +#### The `xolox#misc#buffer#is_empty()` function + +Checks if the current buffer is an empty, unchanged buffer which can be +reused. Returns 1 if an empty buffer is found, 0 otherwise. + +#### The `xolox#misc#buffer#prepare()` function + +Open a special buffer, i.e. a buffer that will hold generated contents, +not directly edited by the user. The buffer can be customized by passing a +dictionary with the following key/value pairs as the first argument: + +- **name** (required): The base name of the buffer (i.e. the base name of + the file loaded in the buffer, even though it isn't really a file and + nothing is really 'loaded' :-) +- **path** (required): The pathname of the buffer. May be relevant if + [:lcd] [lcd] or ['autochdir'] [acd] is being used. + +[lcd]: http://vimdoc.sourceforge.net/htmldoc/editing.html#:lcd +[acd]: http://vimdoc.sourceforge.net/htmldoc/options.html#'autochdir' + +#### The `xolox#misc#buffer#lock()` function + +Lock a special buffer so that its contents can no longer be edited. + +#### The `xolox#misc#buffer#unlock()` function + +Unlock a special buffer so that its content can be updated. + +### Tab completion for user defined commands + +#### The `xolox#misc#complete#keywords()` function + +This function can be used to perform keyword completion for user defined +Vim commands based on the contents of the current buffer. Here's an +example of how you would use it: + + :command -nargs=* -complete=customlist,xolox#misc#complete#keywords MyCmd call s:MyCmd() + +### Rate limiting for Vim's CursorHold event + +Several of my Vim plug-ins (e.g. [vim-easytags][], [vim-notes][] and +[vim-session][]) use Vim's [CursorHold][] and [CursorHoldI][] events to +perform periodic tasks when the user doesn't press any keys for a couple of +seconds. These events by default fire after four seconds, this is +configurable using Vim's ['updatetime'][] option. The problem that this +script solves is that there are Vim plug-ins which set the ['updatetime'][] +option to unreasonably low values, thereby breaking my Vim plug-ins and +probably a lot of other Vim plug-ins out there. When users complain about +this I can tell them that another Vim plug-in is to blame, but users don't +care for the difference, their Vim is broken! So I implemented a workaround. +This script enables registration of [CursorHold][] event handlers with a +configurable interval (expressed in seconds). The event handlers will be +called no more than once every interval. + +['updatetime']: http://vimdoc.sourceforge.net/htmldoc/options.html#'updatetime' +[CursorHold]: http://vimdoc.sourceforge.net/htmldoc/autocmd.html#CursorHold +[CursorHoldI]: http://vimdoc.sourceforge.net/htmldoc/autocmd.html#CursorHoldI +[vim-easytags]: http://peterodding.com/code/vim/easytags/ +[vim-notes]: http://peterodding.com/code/vim/notes/ +[vim-session]: http://peterodding.com/code/vim/session/ + +#### The `xolox#misc#cursorhold#register()` function + +Register a [CursorHold][] event handler with a custom interval. This +function takes a single argument which is a dictionary with the following +fields: + + - **function** (required): The name of the event handler function (a + string). + + - **arguments** (optional): A list of arguments to pass to the event + handler function (defaults to an empty list). + + - **interval** (optional): The number of seconds between calls to the + event handler (defaults to 4). + +#### The `xolox#misc#cursorhold#autocmd()` function + +The 'top level event handler' that's called by Vim whenever the +[CursorHold][] or [CursorHoldI][] event fires. It iterates through the +event handlers registered using `xolox#misc#cursorhold#register()` and +calls each event handler at the appropriate interval, keeping track of +the time when each event handler was last run. + +### String escaping functions + +#### The `xolox#misc#escape#pattern()` function + +Takes a single string argument and converts it into a [:substitute] +[subcmd] / [substitute()] [subfun] pattern string that matches the given +string literally. + +[subfun]: http://vimdoc.sourceforge.net/htmldoc/eval.html#substitute() +[subcmd]: http://vimdoc.sourceforge.net/htmldoc/change.html#:substitute + +#### The `xolox#misc#escape#substitute()` function + +Takes a single string argument and converts it into a [:substitute] +[subcmd] / [substitute()] [subfun] replacement string that inserts the +given string literally. + +#### The `xolox#misc#escape#shell()` function + +Takes a single string argument and converts it into a quoted command line +argument. + +I was going to add a long rant here about Vim's ['shellslash' option] +[shellslash], but really, it won't make any difference. Let's just suffice +to say that I have yet to encounter a single person out there who uses +this option for its intended purpose (running a UNIX style shell on +Microsoft Windows). + +[shellslash]: http://vimdoc.sourceforge.net/htmldoc/options.html#'shellslash' + +### Human friendly string formatting for Vim + +#### The `xolox#misc#format#pluralize()` function + +Concatenate a counter (the first argument, expected to be an integer) with +a singular or plural label (the second and third arguments, both expected +to be strings). + +#### The `xolox#misc#format#timestamp()` function + +Format a time stamp (a string containing a formatted floating point +number) into a human friendly format, for example 70 seconds is phrased as +"1 minute and 10 seconds". + +### List handling functions + +#### The `xolox#misc#list#unique()` function + +Remove duplicate values from the given list in-place (preserves order). + +#### The `xolox#misc#list#binsert()` function + +Performs in-place binary insertion, which depending on your use case can +be more efficient than calling Vim's [sort()] [sort] function after each +insertion (in cases where a single, final sort is not an option). Expects +three arguments: + +1. A list +2. A value to insert +3. 1 (true) when case should be ignored, 0 (false) otherwise + +[sort]: http://vimdoc.sourceforge.net/htmldoc/eval.html#sort() + +### Functions to interact with the user + +#### The `xolox#misc#msg#info()` function + +Show a formatted informational message to the user. + +This function has the same argument handling as Vim's [printf()] [] +function with one notable difference: Any arguments which are not numbers +or strings are coerced to strings using Vim's [string()] [] function. + +In the case of `xolox#misc#msg#info()`, automatic string coercion simply +makes the function a bit easier to use. + +The messages emitted by this function have no highlighting. Previously +these messages were highlighted using the [Title group] [hl-title], but it +was pointed out in [pull request 16] [pr-16] that this group shouldn't be +used for informational messages because it is meant for titles and because +of this some color schemes use colors that stand out quite a bit, causing +the informational messages to look like errors. + +[hl-title]: http://vimdoc.sourceforge.net/htmldoc/syntax.html#hl-Title +[pr-16]: https://github.com/xolox/vim-misc/pull/16 +[printf()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#printf() +[string()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#string() + +#### The `xolox#misc#msg#warn()` function + +Show a formatted warning message to the user. + +This function has the same argument handling as the +`xolox#misc#msg#info()` function. + +#### The `xolox#misc#msg#debug()` function + +Show a formatted debugging message to the user, *if the user has enabled +increased verbosity by setting Vim's ['verbose'] [] option to one +(1) or higher*. + +This function has the same argument handling as the +`xolox#misc#msg#info()` function. + +In the case of `xolox#misc#msg#debug()`, automatic string coercion +provides lazy evaluation in the sense that complex data structures are +only converted to strings when the user has enabled increased verbosity. + +['verbose']: http://vimdoc.sourceforge.net/htmldoc/options.html#'verbose' + +### Integration between Vim and its environment + +#### The `xolox#misc#open#file()` function + +Given a pathname or URL as the first argument, this opens the file with +the program associated with the file type. So for example a text file +might open in Vim, an `*.html` file would probably open in your web +browser and a media file would open in a media player. + +This should work on Windows, Mac OS X and most Linux distributions. If +this fails to find a file association, you can pass one or more external +commands to try as additional arguments. For example: + + :call xolox#misc#open#file('/path/to/my/file', 'firefox', 'google-chrome') + +This generally shouldn't be necessary but it might come in handy now and +then. + +#### The `xolox#misc#open#url()` function + +Given a URL as the first argument, this opens the URL in your preferred or +best available web browser: + +- In GUI environments a graphical web browser will open (or a new tab will + be created in an existing window) +- In console Vim without a GUI environment, when you have any of `lynx`, + `links` or `w3m` installed it will launch a command line web browser in + front of Vim (temporarily suspending Vim) + +### Vim and plug-in option handling + +#### The `xolox#misc#option#get()` function + +Expects one or two arguments: 1. The name of a variable and 2. the default +value if the variable does not exist. + +Returns the value of the variable from a buffer local variable, global +variable or the default value, depending on which is defined. + +This is used by some of my Vim plug-ins for option handling, so that users +can customize options for specific buffers. + +#### The `xolox#misc#option#split()` function + +Given a multi-value Vim option like ['runtimepath'] [rtp] this returns a +list of strings. For example: + + :echo xolox#misc#option#split(&runtimepath) + ['/home/peter/Projects/Vim/misc', + '/home/peter/Projects/Vim/colorscheme-switcher', + '/home/peter/Projects/Vim/easytags', + ...] + +[rtp]: http://vimdoc.sourceforge.net/htmldoc/options.html#'runtimepath' + +#### The `xolox#misc#option#join()` function + +Given a list of strings like the ones returned by +`xolox#misc#option#split()`, this joins the strings together into a +single value that can be used to set a Vim option. + +#### The `xolox#misc#option#split_tags()` function + +Customized version of `xolox#misc#option#split()` with specialized +handling for Vim's ['tags' option] [tags]. + +[tags]: http://vimdoc.sourceforge.net/htmldoc/options.html#'tags' + +#### The `xolox#misc#option#join_tags()` function + +Customized version of `xolox#misc#option#join()` with specialized +handling for Vim's ['tags' option] [tags]. + +#### The `xolox#misc#option#eval_tags()` function + +Evaluate Vim's ['tags' option] [tags] without looking at the file +system, i.e. this will report tags files that don't exist yet. Expects +the value of the ['tags' option] [tags] as the first argument. If the +optional second argument is 1 (true) only the first match is returned, +otherwise (so by default) a list with all matches is returned. + +### Operating system interfaces + +#### The `xolox#misc#os#is_mac()` function + +Returns 1 (true) when on Mac OS X, 0 (false) otherwise. You would expect +this to simply check the Vim feature list, but for some obscure reason the +`/usr/bin/vim` included in Mac OS X (verified on version 10.7.5) returns 0 +(false) in response to `has('mac')`, so we check the output of `uname` +to avoid false negatives. + +#### The `xolox#misc#os#is_win()` function + +Returns 1 (true) when on Microsoft Windows, 0 (false) otherwise. + +#### The `xolox#misc#os#find_vim()` function + +Returns the program name of Vim as a string. On Windows and UNIX this just +[v:progname] [] as an absolute pathname while on Mac OS X there is +some special magic to find MacVim's executable even though it's usually +not on the executable search path. If you want, you can override the +value returned from this function by setting the global variable +`g:xolox#misc#os#vim_progname`. + +By default the choice of console Vim vs graphical Vim is made based on +the value of [v:progname] [], but if you have a preference you can pass +the string `vim` or `gvim` as the first and only argument. + +[v:progname]: http://vimdoc.sourceforge.net/htmldoc/eval.html#v:progname + +#### The `xolox#misc#os#exec()` function + +Execute an external command (hiding the console on Microsoft Windows when +my [vim-shell plug-in] [vim-shell] is installed). + +Expects a dictionary with the following key/value pairs as the first +argument: + +- **command** (required): The command line to execute +- **async** (optional): set this to 1 (true) to execute the command in the + background (asynchronously) +- **stdin** (optional): a string or list of strings with the input for the + external command +- **check** (optional): set this to 0 (false) to disable checking of the + exit code of the external command (by default an exception will be + raised when the command fails) + +Returns a dictionary with one or more of the following key/value pairs: + +- **command** (always available): the generated command line that was used + to run the external command +- **exit_code** (only in synchronous mode): the exit status of the + external command (an integer, zero on success) +- **stdout** (only in synchronous mode): the output of the command on the + standard output stream (a list of strings, one for each line) +- **stderr** (only in synchronous mode): the output of the command on the + standard error stream (as a list of strings, one for each line) + +[vim-shell]: http://peterodding.com/code/vim/shell/ + +#### The `xolox#misc#os#can_use_dll()` function + +If a) we're on Microsoft Windows, b) the vim-shell plug-in is installed +and c) the compiled DLL included in vim-shell works, we can use the +vim-shell plug-in to execute external commands! Returns 1 (true) +if we can use the DLL, 0 (false) otherwise. + +### Pathname manipulation functions + +#### The `xolox#misc#path#which()` function + +Scan the executable search path (`$PATH`) for one or more external +programs. Expects one or more string arguments with program names. Returns +a list with the absolute pathnames of all found programs. Here's an +example: + + :echo xolox#misc#path#which('gvim', 'vim') + ['/usr/local/bin/gvim', + '/usr/bin/gvim', + '/usr/local/bin/vim', + '/usr/bin/vim'] + +#### The `xolox#misc#path#split()` function + +Split a pathname (the first and only argument) into a list of pathname +components. + +On Windows, pathnames starting with two slashes or backslashes are UNC +paths where the leading slashes are significant... In this case we split +like this: + +- Input: `'//server/share/directory'` +- Result: `['//server', 'share', 'directory']` + +Everything except Windows is treated like UNIX until someone has a better +suggestion :-). In this case we split like this: + +- Input: `'/foo/bar/baz'` +- Result: `['/', 'foo', 'bar', 'baz']` + +To join a list of pathname components back into a single pathname string, +use the `xolox#misc#path#join()` function. + +#### The `xolox#misc#path#join()` function + +Join a list of pathname components (the first and only argument) into a +single pathname string. This is the counterpart to the +`xolox#misc#path#split()` function and it expects a list of pathname +components as returned by `xolox#misc#path#split()`. + +#### The `xolox#misc#path#directory_separator()` function + +Find the preferred directory separator for the platform and settings. + +#### The `xolox#misc#path#absolute()` function + +Canonicalize and resolve a pathname, *regardless of whether it exists*. +This is intended to support string comparison to determine whether two +pathnames point to the same directory or file. + +#### The `xolox#misc#path#relative()` function + +Make an absolute pathname (the first argument) relative to a directory +(the second argument). + +#### The `xolox#misc#path#merge()` function + +Join a directory pathname and filename into a single pathname. + +#### The `xolox#misc#path#commonprefix()` function + +Find the common prefix of path components in a list of pathnames. + +#### The `xolox#misc#path#starts_with()` function + +Check whether the first pathname starts with the second pathname (expected +to be a directory). This does not perform a regular string comparison; +first it normalizes both pathnames, then it splits them into their +pathname segments and then it compares the segments. + +#### The `xolox#misc#path#encode()` function + +Encode a pathname so it can be used as a filename. This uses URL encoding +to encode special characters. + +#### The `xolox#misc#path#decode()` function + +Decode a pathname previously encoded with `xolox#misc#path#encode()`. + +#### The `xolox#misc#path#is_relative()` function + +Returns true (1) when the pathname given as the first argument is +relative, false (0) otherwise. + +#### The `xolox#misc#path#tempdir()` function + +Create a temporary directory and return the pathname of the directory. + +### Manipulation of UNIX file permissions + +Vim's [writefile()][] function cannot set file permissions for newly created +files and although Vim script has a function to get file permissions (see +[getfperm()][]) there is no equivalent for changing a file's permissions. + +This omission breaks the otherwise very useful idiom of updating a file by +writing its new contents to a temporary file and then renaming the temporary +file into place (which is as close as you're going to get to atomically +updating a file's contents on UNIX) because the file's permissions will not +be preserved! + +**Here's a practical example:** My [vim-easytags][] plug-in writes tags file +updates to a temporary file and renames the temporary file into place. When +I use `sudo -s` on Ubuntu Linux it preserves my environment variables so my +`~/.vimrc` and the [vim-easytags][] plug-in are still loaded. Now when a +tags file is written the file becomes owned by root (my effective user id in +the `sudo` session). Once I leave the `sudo` session I can no longer update +my tags file because it's now owned by root … ಠ_ಠ + +[getfperm()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#getfperm() +[vim-easytags]: http://peterodding.com/code/vim/easytags/ +[writefile()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#writefile() + +#### The `xolox#misc#perm#update()` function + +Atomically update a file's contents while preserving the owner, group and +mode. The first argument is the pathname of the file to update (a string). +The second argument is the list of lines to be written to the file. Writes +the new contents to a temporary file and renames the temporary file into +place, thereby preventing readers from reading a partially written file. +Returns 1 if the file is successfully updated, 0 otherwise. + +Note that if `xolox#misc#perm#get()` and `xolox#misc#perm#set()` cannot be +used to preserve the file owner/group/mode the file is still updated using +a rename (for compatibility with non-UNIX systems and incompatible +`/usr/bin/stat` implementations) so in that case you can still lose the +file's owner/group/mode. + +#### The `xolox#misc#perm#get()` function + +Get the owner, group and permissions of the pathname given as the first +argument. Returns an opaque value which you can later pass to +`xolox#misc#perm#set()`. + +#### The `xolox#misc#perm#set()` function + +Set the permissions (the second argument) of the pathname given as the +first argument. Expects a permissions value created by +`xolox#misc#perm#get()`. + +### Persist/recall Vim values from/to files + +Vim's [string()][] function can be used to serialize Vim script values like +numbers, strings, lists, dictionaries and composites of them to a string +which can later be evaluated using the [eval()][] function to turn it back +into the original value. This Vim script provides functions to use these +functions to persist and recall Vim values from/to files. This is very +useful for communication between (possibly concurrent) Vim processes. + +#### The `xolox#misc#persist#load()` function + +Read a Vim value like a number, string, list or dictionary from a file +using [readfile()][] and [eval()][]. The first argument is the filename of +the file to read (a string). The optional second argument specifies the +default value which is returned when the file can't be loaded. This +function returns the loaded value or the default value (which itself +defaults to the integer 0). + +[eval()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#eval() +[readfile()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#readfile() + +#### The `xolox#misc#persist#save()` function + +Write a Vim value like a number, string, list or dictionary to a file +using [string()][] and [writefile()][]. The first argument is the filename +of the file to write (a string) and the second argument is the value to +write (any value). + +This function writes the serialized value to an intermediate file which is +then renamed into place atomically. This avoids issues with concurrent +processes where for example a producer has written a partial file which is +read by a consumer before the file is complete. In this case the consumer +would read a corrupt value. The rename trick avoids this problem. + +[string()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#string() +[writefile()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#writefile() + +### String handling + +#### The `xolox#misc#str#slug()` function + +Convert a string to a "slug" - something that can be safely used in +filenames and URLs without worrying about quoting/escaping of special +characters. + +#### The `xolox#misc#str#ucfirst()` function + +Uppercase the first character in a string (the first argument). + +#### The `xolox#misc#str#unescape()` function + +Remove back slash escapes from a string (the first argument). + +#### The `xolox#misc#str#compact()` function + +Compact whitespace in a string (the first argument). + +#### The `xolox#misc#str#trim()` function + +Trim all whitespace from the start and end of a string (the first +argument). + +#### The `xolox#misc#str#indent()` function + +Indent all lines in a multi-line string (the first argument) with a +specific number of *space characters* (the second argument, an integer). + +#### The `xolox#misc#str#dedent()` function + +Remove common whitespace from a multi line string. + +### Test runner & infrastructure for Vim plug-ins + +The Vim auto-load script `autoload/xolox/misc/test.vim` contains +infrastructure that can be used to run an automated Vim plug-in test suite. +It provides a framework for running test functions, keeping track of the +test status, making assertions and reporting test results to the user. + +#### The `xolox#misc#test#reset()` function + +Reset counters for executed tests and passed/failed assertions. + +#### The `xolox#misc#test#summarize()` function + +Print a summary of test results, to be interpreted interactively. + +#### The `xolox#misc#test#wrap()` function + +Call a function in a try/catch block and prevent exceptions from bubbling. +The name of the function should be passed as the first and only argument; +it should be a string containing the name of a Vim auto-load function. + +#### The `xolox#misc#test#passed()` function + +Record a test which succeeded. + +#### The `xolox#misc#test#failed()` function + +Record a test which failed. + +#### The `xolox#misc#test#assert_true()` function + +Check whether an expression is true. + +#### The `xolox#misc#test#assert_equals()` function + +Check whether two values are the same. + +#### The `xolox#misc#test#assert_same_type()` function + +Check whether two values are of the same type. + +### Tests for the miscellaneous Vim scripts + +The Vim auto-load script `autoload/xolox/misc/tests.vim` contains the +automated test suite of the miscellaneous Vim scripts. Right now the +coverage is not very high yet, but this will improve over time. + +#### The `xolox#misc#tests#run()` function + +Run the automated test suite of the miscellaneous Vim scripts. To be used +interactively. Intended to be safe to execute irrespective of context. + +#### The `xolox#misc#tests#pattern_escaping()` function + +Test escaping of regular expression patterns with +`xolox#misc#escape#pattern()`. + +#### The `xolox#misc#tests#substitute_escaping()` function + +Test escaping of substitution strings with +`xolox#misc#escape#substitute()`. + +#### The `xolox#misc#tests#shell_escaping()` function + +Test escaping of shell arguments with `xolox#misc#escape#shell()`. + +#### The `xolox#misc#tests#making_a_list_unique()` function + +Test removing of duplicate values from lists with +`xolox#misc#list#unique()`. + +#### The `xolox#misc#tests#binary_insertion()` function + +Test the binary insertion algorithm implemented in +`xolox#misc#list#binsert()`. + +#### The `xolox#misc#tests#getting_configuration_options()` function + +Test getting of scoped plug-in configuration "options" with +`xolox#misc#option#get()`. + +#### The `xolox#misc#tests#splitting_of_multi_valued_options()` function + +Test splitting of multi-valued Vim options with +`xolox#misc#option#split()`. + +#### The `xolox#misc#tests#joining_of_multi_valued_options()` function + +Test joining of multi-valued Vim options with `xolox#misc#option#join()`. + +#### The `xolox#misc#tests#finding_vim_on_the_search_path()` function + +Test looking up Vim's executable on the search path using [v:progname] [] +with `xolox#misc#os#find_vim()`. + +[v:progname]: http://vimdoc.sourceforge.net/htmldoc/eval.html#v:progname + +#### The `xolox#misc#tests#synchronous_command_execution()` function + +Test basic functionality of synchronous command execution with +`xolox#misc#os#exec()`. + +#### The `xolox#misc#tests#synchronous_command_execution_with_stderr()` function + +Test basic functionality of synchronous command execution with +`xolox#misc#os#exec()` including the standard error stream (not available +on Windows when vim-shell is not installed). + +#### The `xolox#misc#tests#synchronous_command_execution_with_raising_of_errors()` function + +Test raising of errors during synchronous command execution with +`xolox#misc#os#exec()`. + +#### The `xolox#misc#tests#synchronous_command_execution_without_raising_errors()` function + +Test synchronous command execution without raising of errors with +`xolox#misc#os#exec()`. + +#### The `xolox#misc#tests#asynchronous_command_execution()` function + +Test the basic functionality of asynchronous command execution with +`xolox#misc#os#exec()`. This runs the external command `mkdir` and tests +that the side effect of creating the directory takes place. This might +seem like a peculiar choice, but it's one of the few 100% portable +commands (Windows + UNIX) that doesn't involve input/output streams. + +#### The `xolox#misc#tests#string_case_transformation()` function + +Test string case transformation with `xolox#misc#str#ucfirst()`. + +#### The `xolox#misc#tests#string_whitespace_compaction()` function + +Test compaction of whitespace in strings with `xolox#misc#str#compact()`. + +#### The `xolox#misc#tests#string_whitespace_trimming()` function + +Test trimming of whitespace in strings with `xolox#misc#str#trim()`. + +#### The `xolox#misc#tests#multiline_string_dedent()` function + +Test dedenting of multi-line strings with `xolox#misc#str#dedent()`. + +#### The `xolox#misc#tests#version_string_parsing()` function + +Test parsing of version strings with `xolox#misc#version#parse()`. + +#### The `xolox#misc#tests#version_string_comparison()` function + +Test comparison of version strings with `xolox#misc#version#at_least()`. + +### Timing of long during operations + +#### The `xolox#misc#timer#resumable()` function + +Create a resumable timer object. This returns an object (a dictionary with +functions) with the following "methods": + + - `start()` instructs the timer object to start counting elapsed time + (when a timer object is created it is not automatically started). + + - `stop()` instructs the timer object to stop counting elapsed time. + This adds the time elapsed since `start()` was last called to the + total elapsed time. This method will raise an error if called out of + sequence. + + - `format()` takes the total elapsed time and reports it as a string + containing a formatted floating point number. + +Timer objects are meant to accurately time short running operations so +they're dependent on Vim's [reltime()][] and [reltimestr()][] functions. +In order to make it possible to use timer objects in my Vim plug-ins +unconditionally there's a fall back to [localtime()][] when [reltime()][] +is not available. In this mode the timer objects are not very useful but +at least they shouldn't raise errors. + +[localtime()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#localtime() +[reltime()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#reltime() +[reltimestr()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#reltimestr() + +#### The `xolox#misc#timer#start()` function + +Start a timer. This returns a list which can later be passed to +`xolox#misc#timer#stop()`. + +#### The `xolox#misc#timer#stop()` function + +Show a formatted debugging message to the user, if the user has enabled +increased verbosity by setting Vim's ['verbose'] [verbose] option to one +(1) or higher. + +This function has the same argument handling as Vim's [printf()] [printf] +function with one difference: At the point where you want the elapsed time +to be embedded, you write `%s` and you pass the list returned by +`xolox#misc#timer#start()` as an argument. + +[verbose]: http://vimdoc.sourceforge.net/htmldoc/options.html#'verbose' +[printf]: http://vimdoc.sourceforge.net/htmldoc/eval.html#printf() + +#### The `xolox#misc#timer#force()` function + +Show a formatted message to the user. This function has the same argument +handling as Vim's [printf()] [printf] function with one difference: At the +point where you want the elapsed time to be embedded, you write `%s` and +you pass the list returned by `xolox#misc#timer#start()` as an argument. + +#### The `xolox#misc#timer#convert()` function + +Convert the value returned by `xolox#misc#timer#start()` to a string +representation of the elapsed time since `xolox#misc#timer#start()` was +called. Other values are returned unmodified (this allows using it with +Vim's [map()][] function). + +[map()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#map() + +### Version string handling + +#### The `xolox#misc#version#parse()` function + +Convert a version string to a list of integers. + +#### The `xolox#misc#version#at_least()` function + +Check whether the second version string is equal to or greater than the +first version string. Returns 1 (true) when it is, 0 (false) otherwise. + + + +## Contact + +If you have questions, bug reports, suggestions, etc. please open an issue or +pull request on [GitHub] []. Download links and documentation can be found on +the plug-in's [homepage] []. If you like the script please vote for it on +[Vim Online] []. + +## License + +This software is licensed under the [MIT license] []. +© 2015 Peter Odding <>. + + +[GitHub]: http://github.com/xolox/vim-misc +[homepage]: http://peterodding.com/code/vim/misc +[MIT license]: http://en.wikipedia.org/wiki/MIT_License +[plugins]: http://peterodding.com/code/vim/ +[Vim Online]: http://www.vim.org/scripts/script.php?script_id=4597 +[vim-tools]: http://peterodding.com/code/vim/tools/ +[howto-install]: https://github.com/xolox/vim-misc/blob/master/INSTALL.md diff --git a/sources_non_forked/vim-misc/addon-info.json b/sources_non_forked/vim-misc/addon-info.json new file mode 100755 index 00000000..934bcf72 --- /dev/null +++ b/sources_non_forked/vim-misc/addon-info.json @@ -0,0 +1 @@ +{"vim_script_nr": 4597, "dependencies": {}, "homepage": "http://peterodding.com/code/vim/misc", "name": "vim-misc"} \ No newline at end of file diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc.vim b/sources_non_forked/vim-misc/autoload/xolox/misc.vim new file mode 100755 index 00000000..19aed51c --- /dev/null +++ b/sources_non_forked/vim-misc/autoload/xolox/misc.vim @@ -0,0 +1,7 @@ +" The version of my miscellaneous scripts. +" +" Author: Peter Odding +" Last Change: May 21, 2015 +" URL: http://peterodding.com/code/vim/misc/ + +let g:xolox#misc#version = '1.17.6' diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc/async.vim b/sources_non_forked/vim-misc/autoload/xolox/misc/async.vim new file mode 100755 index 00000000..294a3a16 --- /dev/null +++ b/sources_non_forked/vim-misc/autoload/xolox/misc/async.vim @@ -0,0 +1,261 @@ +" Asynchronous Vim script evaluation. +" +" Author: Peter Odding +" Last Change: September 17, 2014 +" URL: http://peterodding.com/code/vim/misc/ +" +" The `xolox#misc#async#call()` function builds on top of `xolox#misc#os#exec()` +" to support asynchronous evaluation of Vim scripts. The first (and for now +" only) use case is my [vim-easytags][] plug-in which has a bunch of +" conflicting requirements: +" +" 1. I want the [vim-easytags][] plug-in to be as portable as possible. +" Ideally everything is implemented in Vim script because that's the only +" thing I can rely on to be available for all potential users of the +" plug-in! +" +" 2. Because of point one I've been forced to implement tags file reading, +" parsing, (fold case) sorting and writing in Vim script. This is fine for +" small tags files but once they grow to a couple of megabytes it becomes +" annoying because Vim is unresponsive during tags file updates (key +" presses are fortunately buffered due to Vim's input model but that +" doesn't make it a nice user experience :-). +" +" 3. I could (and did in the past) come up with all sorts of hacks to speed +" things up without switching away from Vim script, but none of them are +" going to solve the fundamental problem that Vim's unresponsive hiccups +" become longer as tags files grow larger. +" +" By now it should be clear where this is heading: _Why not handle tags file +" updates in a Vim process that runs in the background without blocking the +" Vim process that the user is interacting with?_ It turns out that there are +" quite a few details to take care of, but with those out of the way, it might +" just work! I'm actually hoping to make asynchronous updates the default mode +" in [vim-easytags][]. This means I need this functionality to be as +" portable and robust as possible. +" +" **Status:** This code has seen little testing so I wouldn't trust it too +" much just yet. On the other hand, as I said, my intention is to make this +" functionality as portable and robust as possible. You be the judge :-). +" +" [vim-easytags]: http://peterodding.com/code/vim/easytags/ + +if !exists('g:xolox#misc#async#counter') + " Increasing integer number used to match asynchronous responses to the + " requests that generated them. + let g:xolox#misc#async#counter = 1 +endif + +if !exists('g:xolox#misc#async#requests') + " Queue of asynchronous requests that haven't received a response yet. + let g:xolox#misc#async#requests = {} +endif + +function! xolox#misc#async#call(options) " {{{1 + " Call a Vim script function asynchronously by starting a hidden Vim process + " in the background. Once the function returns the hidden Vim process + " terminates itself. This function takes a single argument which is a + " dictionary with the following key/value pairs: + " + " - **function** (required): The name of the Vim function to call inside + " the child process (a string). I suggest using an [autoload][] function + " for this, see below. + " + " - **arguments** (optional): A list of arguments to pass to the function. + " This list is serialized to a string using [string()][] and deserialized + " using [eval()][]. + " + " - **callback** (optional): The name of a Vim function to call in the + " parent process when the child process has completed (a string). + " + " - **clientserver** (optional): If this is true (1) the child process will + " notify the parent process when it has finished (the default is true). + " This works using Vim's client/server support which is not always + " available. As a fall back Vim's [CursorHold][] automatic command is + " also supported (although the effect is not quite as instantaneous :-). + " + " This functionality is experimental and non trivial to use, so consider + " yourself warned :-). + " + " **Limitations** + " + " I'm making this functionality available in [vim-misc][] because I think it + " can be useful to other plug-ins, however if you are going to use it you + " should be aware of the following limitations: + " + " - Because of the use of multiple processes this functionality is only + " suitable for 'heavy' tasks. + " + " - The function arguments are serialized to a string which is passed to + " the hidden Vim process as a command line argument, so the amount of + " data you can pass will be limited by your operating environment. + " + " - The hidden Vim process is explicitly isolated from the user in several + " ways (see below for more details). This is to make sure that the hidden + " Vim processes are fast and don't clobber the user's editing sessions in + " any way. + " + " **Changes to how Vim normally works** + " + " You have to be aware that the hidden Vim process is initialized in a + " specific way that is very different from your regular Vim editing + " sessions: + " + " - Your [vimrc][] file is ignored using the `-u NONE` command line option. + " + " - Your [gvimrc][] file (if you even knew it existed ;-) is ignored using + " the `-U NONE` command line option. + " + " - Plug-in loading is skipped using the `--noplugin` command line option. + " + " - Swap files (see [swap-file][]) are disabled using the `-n` command line + " option. This makes sure asynchronous Vim processes don't disturb the + " user's editing session. + " + " - Your [viminfo][] file is ignored using the `-i NONE` command line + " option. Just like with swap files this makes sure asynchronous Vim + " processes don't disturb the user's editing session. + " + " - No-compatible mode is enabled using the `-N` command line option + " (usually the existence of your vimrc script would have achieved the + " same effect but since we disable loading of your vimrc we need to spell + " things out for Vim). + " + " **Use an auto-load function** + " + " The function you want to call is identified by its name which has to be + " defined, but I just explained above that all regular initialization is + " disabled for asynchronous Vim processes, so what gives? The answer is to + " use an [autoload][] function. This should work fine because the + " asynchronous Vim process 'inherits' the value of the ['runtimepath'][] + " option from your editing session. + " + " ['runtimepath']: http://vimdoc.sourceforge.net/htmldoc/options.html#'runtimepath' + " [autoload]: http://vimdoc.sourceforge.net/htmldoc/eval.html#autoload + " [CursorHold]: http://vimdoc.sourceforge.net/htmldoc/autocmd.html#CursorHold + " [eval()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#eval() + " [gvimrc]: http://vimdoc.sourceforge.net/htmldoc/gui.html#gvimrc + " [string()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#string() + " [swap-file]: http://vimdoc.sourceforge.net/htmldoc/recover.html#swap-file + " [vim-misc]: http://peterodding.com/code/vim/misc/ + " [viminfo]: http://vimdoc.sourceforge.net/htmldoc/starting.html#viminfo + " [vimrc]: http://vimdoc.sourceforge.net/htmldoc/starting.html#vimrc + let unique_number = g:xolox#misc#async#counter + let g:xolox#misc#async#counter += 1 + let request = {'function': a:options['function']} + let request['arguments'] = get(a:options, 'arguments', []) + let request['starttime'] = xolox#misc#timer#start() + let request['number'] = unique_number + let callback = get(a:options, 'callback') + if !empty(callback) + let request['callback'] = callback + endif + if get(a:options, 'clientserver', 1) && !empty(v:servername) + let request['servername'] = v:servername + else + let temporary_file = tempname() + let request['temporary_file'] = temporary_file + endif + let vim_command = printf('let &rtp = %s | call xolox#misc#async#inside_child(%s)', string(&rtp), string(request)) + call xolox#misc#msg#debug("vim-misc %s: Generated asynchronous Vim command #%i: %s", g:xolox#misc#version, unique_number, vim_command) + let quoted_program = xolox#misc#escape#shell(xolox#misc#os#find_vim('vim')) + let quoted_command = xolox#misc#escape#shell(vim_command) + let shell_command = printf('%s -u NONE -U NONE --noplugin -n -N -i NONE --cmd %s', quoted_program, quoted_command) + call xolox#misc#msg#debug("vim-misc %s: Generated asynchronous shell command #%i: %s", g:xolox#misc#version, unique_number, shell_command) + call xolox#misc#os#exec({'command': shell_command, 'async': 1}) + let g:xolox#misc#async#requests[unique_number] = request +endfunction + +function! xolox#misc#async#inside_child(request) " {{{1 + " Entry point inside the hidden Vim process that runs in the background. + " Invoked indirectly by `xolox#misc#async#call()` because it runs a command + " similar to the following: + " + " vim --cmd 'call xolox#misc#async#inside_child(...)' + " + " This function is responsible for calling the user defined function, + " capturing exceptions and reporting the results back to the parent Vim + " process using Vim's client/server support or a temporary file. + try + let response = {'number': a:request['number']} + let starttime = xolox#misc#timer#start() + try + " Call the user defined function and store its result. + let response['result'] = call(a:request['function'], a:request['arguments']) + catch + " Intercept errors raised by the user defined function. + let response['exception'] = v:exception + let response['throwpoint'] = v:throwpoint + endtry + " Record the elapsed time. + let response['elapsed_time'] = xolox#misc#timer#convert(starttime) + " Communicate the results back to the master Vim process. + let servername = get(a:request, 'servername', '') + if !empty(servername) + " Actively notify the parent process using Vim's client/server support? + call remote_expr(servername, printf('xolox#misc#async#callback_to_parent(%s)', string(response))) + else + " 'Passively' notify the parent process by creating the expected + " temporary file. + call xolox#misc#persist#save(a:request['temporary_file'], response) + endif + finally + " Make sure we terminate this hidden Vim process. + quitall! + endtry +endfunction + +function! xolox#misc#async#callback_to_parent(response) " {{{1 + " When Vim was compiled with client/server support this function (in the + " parent process) will be called by `xolox#misc#async#inside_child()` (in + " the child process) after the user defined function has returned. This + " enables more or less instant callbacks after running an asynchronous + " function. + let unique_number = a:response['number'] + let request = g:xolox#misc#async#requests[unique_number] + call xolox#misc#timer#stop("vim-misc %s: Processing asynchronous callback #%i after %s ..", g:xolox#misc#version, unique_number, request['starttime']) + call remove(g:xolox#misc#async#requests, unique_number) + let callback = get(request, 'callback') + if !empty(callback) + call call(callback, [a:response]) + endif +endfunction + +function! xolox#misc#async#periodic_callback() " {{{1 + " When client/server support is not being used the vim-misc plug-in + " improvises: It uses Vim's [CursorHold][] event to periodically check if an + " asynchronous process has written its results to one of the expected + " temporary files. If a response is found the temporary file is read and + " deleted and then `xolox#misc#async#callback_to_parent()` is called to + " process the response. + " + " [CursorHold]: http://vimdoc.sourceforge.net/htmldoc/autocmd.html#CursorHold + if !empty(g:xolox#misc#async#requests) + let num_processed = 0 + call xolox#misc#msg#debug("vim-misc %s: Checking for asynchronous responses (%i responses not yet received) ..", g:xolox#misc#version, len(g:xolox#misc#async#requests)) + for unique_number in sort(keys(g:xolox#misc#async#requests)) + let request = g:xolox#misc#async#requests[unique_number] + let temporary_file = get(request, 'temporary_file', '') + if !empty(temporary_file) && getfsize(temporary_file) > 0 + try + call xolox#misc#msg#debug("vim-misc %s: Found asynchronous response by %s in %s ..", g:xolox#misc#version, request['function'], temporary_file) + call xolox#misc#async#callback_to_parent(xolox#misc#persist#load(temporary_file)) + let num_processed += 1 + finally + call delete(temporary_file) + endtry + endif + endfor + call xolox#misc#msg#debug("vim-misc %s: Processed %i asynchronous responses (%i responses not yet received).", g:xolox#misc#version, num_processed, len(g:xolox#misc#async#requests)) + endif +endfunction + +" }}}1 + +" The interval in the options below is set to one (1) although the default +" value for &updatetime is four seconds. Because vim-misc never modifies +" &updatetime the interval will effectively default to four seconds unless the +" user has set &updatetime to a lower value themselves. +call xolox#misc#cursorhold#register({'function': 'xolox#misc#async#periodic_callback', 'interval': 1}) + +" vim: ts=2 sw=2 et diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc/buffer.vim b/sources_non_forked/vim-misc/autoload/xolox/misc/buffer.vim new file mode 100755 index 00000000..01dca6ef --- /dev/null +++ b/sources_non_forked/vim-misc/autoload/xolox/misc/buffer.vim @@ -0,0 +1,80 @@ +" Handling of special buffers +" +" Author: Peter Odding +" Last Change: May 19, 2013 +" URL: http://peterodding.com/code/vim/misc/ +" +" The functions defined here make it easier to deal with special Vim buffers +" that contain text generated by a Vim plug-in. For example my [vim-notes +" plug-in] [vim-notes] generates several such buffers: +" +" - [:RecentNotes] [RecentNotes] lists recently modified notes +" - [:ShowTaggedNotes] [ShowTaggedNotes] lists notes grouped by tags +" - etc. +" +" Because the text in these buffers is generated, Vim shouldn't bother with +" swap files and it should never prompt the user whether to save changes to +" the generated text. +" +" [vim-notes]: http://peterodding.com/code/vim/notes/ +" [RecentNotes]: http://peterodding.com/code/vim/notes/#recentnotes_command +" [ShowTaggedNotes]: http://peterodding.com/code/vim/notes/#showtaggednotes_command + +function! xolox#misc#buffer#is_empty() " {{{1 + " Checks if the current buffer is an empty, unchanged buffer which can be + " reused. Returns 1 if an empty buffer is found, 0 otherwise. + return !&modified && expand('%') == '' && line('$') <= 1 && getline(1) == '' +endfunction + +function! xolox#misc#buffer#prepare(...) " {{{1 + " Open a special buffer, i.e. a buffer that will hold generated contents, + " not directly edited by the user. The buffer can be customized by passing a + " dictionary with the following key/value pairs as the first argument: + " + " - **name** (required): The base name of the buffer (i.e. the base name of + " the file loaded in the buffer, even though it isn't really a file and + " nothing is really 'loaded' :-) + " - **path** (required): The pathname of the buffer. May be relevant if + " [:lcd] [lcd] or ['autochdir'] [acd] is being used. + " + " [lcd]: http://vimdoc.sourceforge.net/htmldoc/editing.html#:lcd + " [acd]: http://vimdoc.sourceforge.net/htmldoc/options.html#'autochdir' + if a:0 == 1 && type(a:1) == type('') + " Backwards compatibility with old interface. + let options = {'name': a:1, 'path': a:1} + elseif type(a:1) == type({}) + let options = a:1 + else + throw "Invalid arguments" + endif + let winnr = 1 + let found = 0 + for bufnr in tabpagebuflist() + if xolox#misc#path#equals(options['path'], bufname(bufnr)) + execute winnr . 'wincmd w' + let found = 1 + break + else + let winnr += 1 + endif + endfor + if !(found || xolox#misc#buffer#is_empty()) + vsplit + endif + silent execute 'edit' fnameescape(options['path']) + lcd " clear working directory + setlocal buftype=nofile bufhidden=hide noswapfile + let &l:statusline = '[' . options['name'] . ']' + call xolox#misc#buffer#unlock() + silent %delete +endfunction + +function! xolox#misc#buffer#lock() " {{{1 + " Lock a special buffer so that its contents can no longer be edited. + setlocal readonly nomodifiable nomodified +endfunction + +function! xolox#misc#buffer#unlock() " {{{1 + " Unlock a special buffer so that its content can be updated. + setlocal noreadonly modifiable +endfunction diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc/complete.vim b/sources_non_forked/vim-misc/autoload/xolox/misc/complete.vim new file mode 100755 index 00000000..e3818d42 --- /dev/null +++ b/sources_non_forked/vim-misc/autoload/xolox/misc/complete.vim @@ -0,0 +1,26 @@ +" Tab completion for user defined commands. +" +" Author: Peter Odding +" Last Change: July 9, 2014 +" URL: http://peterodding.com/code/vim/misc/ + +function! xolox#misc#complete#keywords(arglead, cmdline, cursorpos) + " This function can be used to perform keyword completion for user defined + " Vim commands based on the contents of the current buffer. Here's an + " example of how you would use it: + " + " :command -nargs=* -complete=customlist,xolox#misc#complete#keywords MyCmd call s:MyCmd() + let words = {} + for line in getline(1, '$') + for word in split(line, '\W\+') + let words[word] = 1 + endfor + endfor + let arguments = [keys(filter(words, 'v:key =~# a:arglead'))] + if &ignorecase + call add(arguments, 1) + endif + return call('sort', arguments) +endfunction + +" vim: ts=2 sw=2 et diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc/cursorhold.vim b/sources_non_forked/vim-misc/autoload/xolox/misc/cursorhold.vim new file mode 100755 index 00000000..cbbde1fe --- /dev/null +++ b/sources_non_forked/vim-misc/autoload/xolox/misc/cursorhold.vim @@ -0,0 +1,71 @@ +" Rate limiting for Vim's CursorHold event. +" +" Author: Peter Odding +" Last Change: June 22, 2014 +" URL: http://peterodding.com/code/vim/misc/ +" +" Several of my Vim plug-ins (e.g. [vim-easytags][], [vim-notes][] and +" [vim-session][]) use Vim's [CursorHold][] and [CursorHoldI][] events to +" perform periodic tasks when the user doesn't press any keys for a couple of +" seconds. These events by default fire after four seconds, this is +" configurable using Vim's ['updatetime'][] option. The problem that this +" script solves is that there are Vim plug-ins which set the ['updatetime'][] +" option to unreasonably low values, thereby breaking my Vim plug-ins and +" probably a lot of other Vim plug-ins out there. When users complain about +" this I can tell them that another Vim plug-in is to blame, but users don't +" care for the difference, their Vim is broken! So I implemented a workaround. +" This script enables registration of [CursorHold][] event handlers with a +" configurable interval (expressed in seconds). The event handlers will be +" called no more than once every interval. +" +" ['updatetime']: http://vimdoc.sourceforge.net/htmldoc/options.html#'updatetime' +" [CursorHold]: http://vimdoc.sourceforge.net/htmldoc/autocmd.html#CursorHold +" [CursorHoldI]: http://vimdoc.sourceforge.net/htmldoc/autocmd.html#CursorHoldI +" [vim-easytags]: http://peterodding.com/code/vim/easytags/ +" [vim-notes]: http://peterodding.com/code/vim/notes/ +" [vim-session]: http://peterodding.com/code/vim/session/ + +if !exists('g:xolox#misc#cursorhold#handlers') + let g:xolox#misc#cursorhold#handlers = [] +endif + +function! xolox#misc#cursorhold#register(options) + " Register a [CursorHold][] event handler with a custom interval. This + " function takes a single argument which is a dictionary with the following + " fields: + " + " - **function** (required): The name of the event handler function (a + " string). + " + " - **arguments** (optional): A list of arguments to pass to the event + " handler function (defaults to an empty list). + " + " - **interval** (optional): The number of seconds between calls to the + " event handler (defaults to 4). + call add(g:xolox#misc#cursorhold#handlers, copy(a:options)) +endfunction + +function! xolox#misc#cursorhold#autocmd() + " The 'top level event handler' that's called by Vim whenever the + " [CursorHold][] or [CursorHoldI][] event fires. It iterates through the + " event handlers registered using `xolox#misc#cursorhold#register()` and + " calls each event handler at the appropriate interval, keeping track of + " the time when each event handler was last run. + for handler in g:xolox#misc#cursorhold#handlers + let function = handler['function'] + let last_run = get(handler, 'last_run', 0) + let interval = get(handler, 'interval', 4) + call xolox#misc#msg#debug("vim-misc %s: Checking handler %s with interval %i and last run %i ..", g:xolox#misc#version, function, interval, last_run) + " Rate limit in case &updatetime is set (very) low. + let time_until_next_run = (last_run + interval) - localtime() + if time_until_next_run > 0 + call xolox#misc#msg#debug("vim-misc %s: Rate limiting handler %s (time until next run: %i seconds).", g:xolox#misc#version, function, time_until_next_run) + else + call xolox#misc#msg#debug("vim-misc %s: Running handler %s ..", g:xolox#misc#version, function) + call call(function, get(handler, 'arguments', [])) + let handler['last_run'] = localtime() + endif + endfor +endfunction + +" vim: ts=2 sw=2 et diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc/echo.exe b/sources_non_forked/vim-misc/autoload/xolox/misc/echo.exe new file mode 100755 index 0000000000000000000000000000000000000000..52f4e792df13bebd4f5743f29ba8fbe59fb40915 GIT binary patch literal 7680 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 literal 0 HcmV?d00001 diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc/escape.vim b/sources_non_forked/vim-misc/autoload/xolox/misc/escape.vim new file mode 100755 index 00000000..29a16ca1 --- /dev/null +++ b/sources_non_forked/vim-misc/autoload/xolox/misc/escape.vim @@ -0,0 +1,56 @@ +" String escaping functions. +" +" Author: Peter Odding +" Last Change: May 19, 2013 +" URL: http://peterodding.com/code/vim/misc/ + +function! xolox#misc#escape#pattern(string) " {{{1 + " Takes a single string argument and converts it into a [:substitute] + " [subcmd] / [substitute()] [subfun] pattern string that matches the given + " string literally. + " + " [subfun]: http://vimdoc.sourceforge.net/htmldoc/eval.html#substitute() + " [subcmd]: http://vimdoc.sourceforge.net/htmldoc/change.html#:substitute + if type(a:string) == type('') + let string = escape(a:string, '^$.*\~[]') + return substitute(string, '\n', '\\n', 'g') + endif + return '' +endfunction + +function! xolox#misc#escape#substitute(string) " {{{1 + " Takes a single string argument and converts it into a [:substitute] + " [subcmd] / [substitute()] [subfun] replacement string that inserts the + " given string literally. + if type(a:string) == type('') + let string = escape(a:string, '\&~%') + return substitute(string, '\n', '\\r', 'g') + endif + return '' +endfunction + +function! xolox#misc#escape#shell(string) " {{{1 + " Takes a single string argument and converts it into a quoted command line + " argument. + " + " I was going to add a long rant here about Vim's ['shellslash' option] + " [shellslash], but really, it won't make any difference. Let's just suffice + " to say that I have yet to encounter a single person out there who uses + " this option for its intended purpose (running a UNIX style shell on + " Microsoft Windows). + " + " [shellslash]: http://vimdoc.sourceforge.net/htmldoc/options.html#'shellslash' + if xolox#misc#os#is_win() + try + let ssl_save = &shellslash + set noshellslash + return shellescape(a:string) + finally + let &shellslash = ssl_save + endtry + else + return shellescape(a:string) + endif +endfunction + +" vim: ts=2 sw=2 et diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc/format.vim b/sources_non_forked/vim-misc/autoload/xolox/misc/format.vim new file mode 100755 index 00000000..44f7b543 --- /dev/null +++ b/sources_non_forked/vim-misc/autoload/xolox/misc/format.vim @@ -0,0 +1,46 @@ +" Human friendly string formatting for Vim. +" +" Author: Peter Odding +" Last Change: June 2, 2013 +" URL: http://peterodding.com/code/vim/misc/ + +function! xolox#misc#format#pluralize(count, singular, plural) " {{{1 + " Concatenate a counter (the first argument, expected to be an integer) with + " a singular or plural label (the second and third arguments, both expected + " to be strings). + if a:count == 0 + return printf('no %s', a:plural) + else + return printf('%i %s', a:count, a:count == 1 ? a:singular : a:plural) + endif +endfunction + +function! xolox#misc#format#timestamp(ts) " {{{1 + " Format a time stamp (a string containing a formatted floating point + " number) into a human friendly format, for example 70 seconds is phrased as + " "1 minute and 10 seconds". + let seconds = a:ts + 0 + " Fast common case with extra precision from reltime(). + if seconds < 5 + let extract = matchstr(a:ts, '^\d\+\(\.0*[1-9][1-9]\?\)\?') + if extract =~ '[123456789]' + return extract . ' second' . (extract != '1' ? 's' : '') + endif + endif + " Generic but slow code. + let result = [] + for [name, size] in [['day', 60 * 60 * 24], ['hour', 60 * 60], ['minute', 60], ['second', 1]] + if seconds >= size + let counter = seconds / size + let seconds = seconds % size + let suffix = counter != 1 ? 's' : '' + call add(result, printf('%i %s%s', counter, name, suffix)) + endif + endfor + " Format the resulting text? + if len(result) == 1 + return result[0] + else + return join(result[0:-2], ', ') . ' and ' . result[-1] + endif +endfunction diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc/list.vim b/sources_non_forked/vim-misc/autoload/xolox/misc/list.vim new file mode 100755 index 00000000..548592a3 --- /dev/null +++ b/sources_non_forked/vim-misc/autoload/xolox/misc/list.vim @@ -0,0 +1,42 @@ +" List handling functions. +" +" Author: Peter Odding +" Last Change: June 2, 2013 +" URL: http://peterodding.com/code/vim/misc/ + +function! xolox#misc#list#unique(list) " {{{1 + " Remove duplicate values from the given list in-place (preserves order). + call reverse(a:list) + call filter(a:list, 'count(a:list, v:val) == 1') + return reverse(a:list) +endfunction + +function! xolox#misc#list#binsert(list, value, ...) " {{{1 + " Performs in-place binary insertion, which depending on your use case can + " be more efficient than calling Vim's [sort()] [sort] function after each + " insertion (in cases where a single, final sort is not an option). Expects + " three arguments: + " + " 1. A list + " 2. A value to insert + " 3. 1 (true) when case should be ignored, 0 (false) otherwise + " + " [sort]: http://vimdoc.sourceforge.net/htmldoc/eval.html#sort() + let idx = s:binsert_r(a:list, 0, len(a:list), a:value, exists('a:1') && a:1) + return insert(a:list, a:value, idx) +endfunction + +function! s:binsert_r(list, low, high, value, ignorecase) + let mid = a:low + (a:high - a:low) / 2 + if a:low == a:high + return a:low + elseif a:ignorecase ? a:value >? a:list[mid] : a:value > a:list[mid] + return s:binsert_r(a:list, mid + 1, a:high, a:value, a:ignorecase) + elseif a:ignorecase ? a:value +" Last Change: March 15, 2015 +" URL: http://peterodding.com/code/vim/misc/ + +if !exists('g:xolox_message_buffer') + " For when I lose my :messages history :-\ + let g:xolox_message_buffer = 100 +endif + +if !exists('g:xolox_messages') + let g:xolox_messages = [] +endif + +function! xolox#misc#msg#info(...) " {{{1 + " Show a formatted informational message to the user. + " + " This function has the same argument handling as Vim's [printf()] [] + " function with one notable difference: Any arguments which are not numbers + " or strings are coerced to strings using Vim's [string()] [] function. + " + " In the case of `xolox#misc#msg#info()`, automatic string coercion simply + " makes the function a bit easier to use. + " + " The messages emitted by this function have no highlighting. Previously + " these messages were highlighted using the [Title group] [hl-title], but it + " was pointed out in [pull request 16] [pr-16] that this group shouldn't be + " used for informational messages because it is meant for titles and because + " of this some color schemes use colors that stand out quite a bit, causing + " the informational messages to look like errors. + " + " [hl-title]: http://vimdoc.sourceforge.net/htmldoc/syntax.html#hl-Title + " [pr-16]: https://github.com/xolox/vim-misc/pull/16 + " [printf()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#printf() + " [string()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#string() + call s:show_message('None', a:000) +endfunction + +function! xolox#misc#msg#warn(...) " {{{1 + " Show a formatted warning message to the user. + " + " This function has the same argument handling as the + " `xolox#misc#msg#info()` function. + call s:show_message('WarningMsg', a:000) +endfunction + +function! xolox#misc#msg#debug(...) " {{{1 + " Show a formatted debugging message to the user, *if the user has enabled + " increased verbosity by setting Vim's ['verbose'] [] option to one + " (1) or higher*. + " + " This function has the same argument handling as the + " `xolox#misc#msg#info()` function. + " + " In the case of `xolox#misc#msg#debug()`, automatic string coercion + " provides lazy evaluation in the sense that complex data structures are + " only converted to strings when the user has enabled increased verbosity. + " + " ['verbose']: http://vimdoc.sourceforge.net/htmldoc/options.html#'verbose' + if &vbs >= 1 + call s:show_message('Question', a:000) + endif +endfunction + +function! s:show_message(hlgroup, args) " {{{1 + " The implementation of info() and warn(). + let nargs = len(a:args) + if nargs == 1 + let message = a:args[0] + elseif nargs >= 2 + let args = map(copy(a:args), 's:coerce_argument(v:val)') + let message = call('printf', args) + endif + if exists('message') + try + " Temporarily disable Vim's |hit-enter| prompt and mode display. + if !exists('s:more_save') + let s:more_save = &more + let s:ruler_save = &ruler + let s:smd_save = &showmode + endif + set nomore noshowmode + if winnr('$') == 1 | set noruler | endif + augroup PluginXoloxHideMode + autocmd! CursorHold,CursorHoldI * call s:clear_message() + augroup END + execute 'echohl' a:hlgroup + " Redraw to avoid the |hit-enter| prompt. We use :silent to avoid issues + " like this one: https://github.com/xolox/vim-easytags/issues/69. + silent! redraw + for line in split(message, "\n") + echomsg line + endfor + if g:xolox_message_buffer > 0 + call add(g:xolox_messages, message) + if len(g:xolox_messages) > g:xolox_message_buffer + call remove(g:xolox_messages, 0) + endif + endif + finally + " Always clear message highlighting, even when interrupted by Ctrl-C. + echohl none + endtry + endif +endfunction + +function! s:coerce_argument(value) " {{{1 + " Callback to coerce printf() arguments into strings. + let value_type = type(a:value) + if value_type != type(0) && value_type != type('') + return string(a:value) + else + return a:value + endif +endfunction + +function! s:clear_message() " {{{1 + " Callback to clear message after some time has passed. + echo '' + let &more = s:more_save + let &showmode = s:smd_save + let &ruler = s:ruler_save + unlet s:more_save s:ruler_save s:smd_save + autocmd! PluginXoloxHideMode + augroup! PluginXoloxHideMode +endfunction + +" vim: ts=2 sw=2 et diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc/open.vim b/sources_non_forked/vim-misc/autoload/xolox/misc/open.vim new file mode 100755 index 00000000..ff0b5e24 --- /dev/null +++ b/sources_non_forked/vim-misc/autoload/xolox/misc/open.vim @@ -0,0 +1,100 @@ +" Integration between Vim and its environment. +" +" Author: Peter Odding +" Last Change: June 19, 2013 +" URL: http://peterodding.com/code/vim/misc/ + +let s:enoimpl = "vim-misc %s: %s() hasn't been implemented for your platform! If you have suggestions, please get in touch at https://github.com/xolox/vim-misc/issues" +let s:handlers = ['gnome-open', 'kde-open', 'exo-open', 'xdg-open', 'cygstart'] + +function! xolox#misc#open#file(location, ...) " {{{1 + " Given a pathname or URL as the first argument, this opens the file with + " the program associated with the file type. So for example a text file + " might open in Vim, an `*.html` file would probably open in your web + " browser and a media file would open in a media player. + " + " This should work on Windows, Mac OS X and most Linux distributions. If + " this fails to find a file association, you can pass one or more external + " commands to try as additional arguments. For example: + " + " :call xolox#misc#open#file('/path/to/my/file', 'firefox', 'google-chrome') + " + " This generally shouldn't be necessary but it might come in handy now and + " then. + if xolox#misc#os#is_win() + try + call xolox#shell#open_with_windows_shell(a:location) + catch /^Vim\%((\a\+)\)\=:E117/ + let command = '!start CMD /C START "" %s' + silent execute printf(command, xolox#misc#escape#shell(a:location)) + endtry + return + elseif xolox#misc#os#is_mac() + call xolox#misc#msg#debug("vim-misc %s: Detected Mac OS X, using 'open' command to open %s ..", g:xolox#misc#version, string(a:location)) + let cmd = 'open ' . shellescape(a:location) . ' 2>&1' + call s:handle_error(cmd, system(cmd)) + return + else + for handler in s:handlers + a:000 + if executable(handler) + call xolox#misc#msg#debug("vim-misc %s: Using '%s' to open '%s'.", g:xolox#misc#version, handler, a:location) + let cmd = shellescape(handler) . ' ' . shellescape(a:location) . ' 2>&1' + call s:handle_error(cmd, system(cmd)) + return + endif + endfor + endif + throw printf(s:enoimpl, g:xolox#misc#version, 'xolox#misc#open#file') +endfunction + +function! xolox#misc#open#url(url) " {{{1 + " Given a URL as the first argument, this opens the URL in your preferred or + " best available web browser: + " + " - In GUI environments a graphical web browser will open (or a new tab will + " be created in an existing window) + " - In console Vim without a GUI environment, when you have any of `lynx`, + " `links` or `w3m` installed it will launch a command line web browser in + " front of Vim (temporarily suspending Vim) + let url = a:url + if url !~ '^\w\+://' + call xolox#misc#msg#debug("vim-misc %s: The URL %s doesn't contain a scheme, improvising ..", g:xolox#misc#version, string(url)) + if url !~ '@' + call xolox#misc#msg#debug("vim-misc %s: Defaulting to http:// URL scheme ..", g:xolox#misc#version) + let url = 'http://' . url + elseif url !~ '^mailto:' + call xolox#misc#msg#debug("vim-misc %s: Defaulting to mailto: URL scheme ..", g:xolox#misc#version) + let url = 'mailto:' . url + endif + endif + let on_unix = has('unix') + let not_on_mac = !xolox#misc#os#is_mac() + let no_gui_available = (has('gui_running') == 0 && $DISPLAY == '') + if on_unix && not_on_mac && no_gui_available + call xolox#misc#msg#debug("vim-misc %s: Using command line web browser because no GUI seems to be available ..", g:xolox#misc#version) + for browser in ['lynx', 'links', 'w3m'] + call xolox#misc#msg#debug("vim-misc %s: Checking whether %s command line web browser is installed ..", g:xolox#misc#version, string(browser)) + if executable(browser) + call xolox#misc#msg#debug("vim-misc %s: Found %s, using it to open %s ..", g:xolox#misc#version, string(browser), string(url)) + execute '!' . browser fnameescape(url) + call s:handle_error(browser . ' ' . url, '') + return + endif + endfor + endif + call xolox#misc#msg#debug("vim-misc %s: Defaulting to GUI web browser to open %s ..", g:xolox#misc#version, string(url)) + call xolox#misc#open#file(url, 'firefox', 'google-chrome') +endfunction + +function! s:handle_error(cmd, output) " {{{1 + if v:shell_error + let message = "vim-misc %s: Failed to execute program! (command line: %s%s)" + let output = strtrans(xolox#misc#str#trim(a:output)) + if output != '' + let output = ", output: " . string(output) + endif + throw printf(message, g:xolox#misc#version, a:cmd, output) + endif +endfunction + +" vim: et ts=2 sw=2 fdm=marker diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc/option.vim b/sources_non_forked/vim-misc/autoload/xolox/misc/option.vim new file mode 100755 index 00000000..47c5f24f --- /dev/null +++ b/sources_non_forked/vim-misc/autoload/xolox/misc/option.vim @@ -0,0 +1,116 @@ +" Vim and plug-in option handling. +" +" Author: Peter Odding +" Last Change: April 1, 2015 +" URL: http://peterodding.com/code/vim/misc/ + +function! xolox#misc#option#get(name, ...) " {{{1 + " Expects one or two arguments: 1. The name of a variable and 2. the default + " value if the variable does not exist. + " + " Returns the value of the variable from a buffer local variable, global + " variable or the default value, depending on which is defined. + " + " This is used by some of my Vim plug-ins for option handling, so that users + " can customize options for specific buffers. + if exists('b:' . a:name) + " Buffer local variable. + return eval('b:' . a:name) + elseif exists('g:' . a:name) + " Global variable. + return eval('g:' . a:name) + elseif exists('a:1') + " Default value. + return a:1 + endif +endfunction + +function! xolox#misc#option#split(value) " {{{1 + " Given a multi-value Vim option like ['runtimepath'] [rtp] this returns a + " list of strings. For example: + " + " :echo xolox#misc#option#split(&runtimepath) + " ['/home/peter/Projects/Vim/misc', + " '/home/peter/Projects/Vim/colorscheme-switcher', + " '/home/peter/Projects/Vim/easytags', + " ...] + " + " [rtp]: http://vimdoc.sourceforge.net/htmldoc/options.html#'runtimepath' + let values = split(a:value, '[^\\]\zs,') + return map(values, 's:unescape(v:val)') +endfunction + +function! s:unescape(s) + return substitute(a:s, '\\\([\\,]\)', '\1', 'g') +endfunction + +function! xolox#misc#option#join(values) " {{{1 + " Given a list of strings like the ones returned by + " `xolox#misc#option#split()`, this joins the strings together into a + " single value that can be used to set a Vim option. + let values = copy(a:values) + call map(values, 's:escape(v:val)') + return join(values, ',') +endfunction + +function! s:escape(s) + return escape(a:s, ',\') +endfunction + +function! xolox#misc#option#split_tags(value) " {{{1 + " Customized version of `xolox#misc#option#split()` with specialized + " handling for Vim's ['tags' option] [tags]. + " + " [tags]: http://vimdoc.sourceforge.net/htmldoc/options.html#'tags' + let values = split(a:value, '[^\\]\zs,') + return map(values, 's:unescape_tags(v:val)') +endfunction + +function! s:unescape_tags(s) + return substitute(a:s, '\\\([\\, ]\)', '\1', 'g') +endfunction + +function! xolox#misc#option#join_tags(values) " {{{1 + " Customized version of `xolox#misc#option#join()` with specialized + " handling for Vim's ['tags' option] [tags]. + let values = copy(a:values) + call map(values, 's:escape_tags(v:val)') + return join(values, ',') +endfunction + +function! s:escape_tags(s) + return escape(a:s, ', ') +endfunction + +function! xolox#misc#option#eval_tags(value, ...) " {{{1 + " Evaluate Vim's ['tags' option] [tags] without looking at the file + " system, i.e. this will report tags files that don't exist yet. Expects + " the value of the ['tags' option] [tags] as the first argument. If the + " optional second argument is 1 (true) only the first match is returned, + " otherwise (so by default) a list with all matches is returned. + let pathnames = [] + let first_only = exists('a:1') ? a:1 : 0 + for pattern in xolox#misc#option#split_tags(a:value) + " Make buffer relative pathnames absolute. + if pattern =~ '^\./' + let suffix = matchstr(pattern, '^./\zs.*$') + let directory = (&cpoptions =~# 'd') ? getcwd() : expand('%:p:h') + let pattern = xolox#misc#path#merge(directory, suffix) + endif + " Make working directory relative pathnames absolute. + if xolox#misc#path#is_relative(pattern) + let pattern = xolox#misc#path#merge(getcwd(), pattern) + endif + " Ignore the trailing `;' for recursive upwards searching because we + " always want the most specific pathname available. + let pattern = substitute(pattern, ';$', '', '') + " Expand the pattern. + call extend(pathnames, split(expand(pattern), "\n")) + if first_only && !empty(pathnames) + return pathnames[0] + endif + endfor + return first_only ? '' : pathnames +endfunction + +" vim: ts=2 sw=2 et diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc/os.vim b/sources_non_forked/vim-misc/autoload/xolox/misc/os.vim new file mode 100755 index 00000000..31e1232e --- /dev/null +++ b/sources_non_forked/vim-misc/autoload/xolox/misc/os.vim @@ -0,0 +1,284 @@ +" Operating system interfaces. +" +" Author: Peter Odding +" Last Change: May 21, 2015 +" URL: http://peterodding.com/code/vim/misc/ + +function! xolox#misc#os#is_mac() " {{{1 + " Returns 1 (true) when on Mac OS X, 0 (false) otherwise. You would expect + " this to simply check the Vim feature list, but for some obscure reason the + " `/usr/bin/vim` included in Mac OS X (verified on version 10.7.5) returns 0 + " (false) in response to `has('mac')`, so we check the output of `uname` + " to avoid false negatives. + if !exists('s:is_mac') + " By default we assume we are *not* on Mac OS X. + let s:is_mac = 0 + if has('mac') || has('macunix') || has('gui_mac') + " If Vim's feature list indicates we are on Mac OS X, we have our answer :-). + let s:is_mac = 1 + elseif !xolox#misc#os#is_win() + " Otherwise we check the output of `uname' to avoid false negatives. + let result = xolox#misc#os#exec({'command': 'uname', 'check': 0}) + if result['exit_code'] == 0 && get(result['stdout'], 0, '') == 'Darwin' + let s:is_mac = 1 + endif + endif + endif + return s:is_mac +endfunction + +function! xolox#misc#os#is_win() " {{{1 + " Returns 1 (true) when on Microsoft Windows, 0 (false) otherwise. + return has('win16') || has('win32') || has('win64') +endfunction + +function! xolox#misc#os#find_vim(...) " {{{1 + " Returns the program name of Vim as a string. On Windows and UNIX this just + " [v:progname] [] as an absolute pathname while on Mac OS X there is + " some special magic to find MacVim's executable even though it's usually + " not on the executable search path. If you want, you can override the + " value returned from this function by setting the global variable + " `g:xolox#misc#os#vim_progname`. + " + " By default the choice of console Vim vs graphical Vim is made based on + " the value of [v:progname] [], but if you have a preference you can pass + " the string `vim` or `gvim` as the first and only argument. + " + " [v:progname]: http://vimdoc.sourceforge.net/htmldoc/eval.html#v:progname + if exists('a:1') + let program_name = a:1 + else + let program_name = v:progname + endif + if exists('g:xolox#misc#os#vim_progname') + let pathname = g:xolox#misc#os#vim_progname + else + let pathname = '' + endif + if empty(pathname) && xolox#misc#os#is_mac() + " Special handling for Mac OS X where MacVim is usually not on the $PATH. + " This always returns the "Vim" executable and not "MacVim" (regardless of + " the caller's preference) because "MacVim" has funky dock magic going on. + call xolox#misc#msg#debug("vim-misc %s: Trying MacVim workaround to find Vim executable ..", g:xolox#misc#version) + let segments = xolox#misc#path#split($VIMRUNTIME) + if segments[-3:] == ['Resources', 'vim', 'runtime'] + let pathname = xolox#misc#path#join(segments[0:-4] + ['MacOS', 'Vim']) + call xolox#misc#msg#debug("vim-misc %s: The MacVim workaround resulted in the Vim executable %s.", g:xolox#misc#version, string(pathname)) + endif + endif + if empty(pathname) + " Default logic. + call xolox#misc#msg#debug("vim-misc %s: Looking for Vim executable named %s on search path ..", g:xolox#misc#version, string(program_name)) + let candidates = xolox#misc#path#which(program_name) + if !empty(candidates) + call xolox#misc#msg#debug("vim-misc %s: Found %i candidate(s) on search path: %s.", g:xolox#misc#version, len(candidates), string(candidates)) + let pathname = candidates[0] + endif + endif + call xolox#misc#msg#debug("vim-misc %s: Reporting Vim executable %s.", g:xolox#misc#version, string(pathname)) + return pathname +endfunction + +function! xolox#misc#os#exec(options) " {{{1 + " Execute an external command (hiding the console on Microsoft Windows when + " my [vim-shell plug-in] [vim-shell] is installed). + " + " Expects a dictionary with the following key/value pairs as the first + " argument: + " + " - **command** (required): The command line to execute + " - **async** (optional): set this to 1 (true) to execute the command in the + " background (asynchronously) + " - **stdin** (optional): a string or list of strings with the input for the + " external command + " - **check** (optional): set this to 0 (false) to disable checking of the + " exit code of the external command (by default an exception will be + " raised when the command fails) + " + " Returns a dictionary with one or more of the following key/value pairs: + " + " - **command** (always available): the generated command line that was used + " to run the external command + " - **exit_code** (only in synchronous mode): the exit status of the + " external command (an integer, zero on success) + " - **stdout** (only in synchronous mode): the output of the command on the + " standard output stream (a list of strings, one for each line) + " - **stderr** (only in synchronous mode): the output of the command on the + " standard error stream (as a list of strings, one for each line) + " + " [vim-shell]: http://peterodding.com/code/vim/shell/ + try + + " Unpack the options. + let cmd = a:options['command'] + let async = get(a:options, 'async', 0) + + " We need to know in a couple of places whether we are on Windows. + let is_win = xolox#misc#os#is_win() + + " Use vim-shell so we don't pop up a console window on Windows? If the + " caller specifically asks us *not* to use vim-shell, we'll respect that + " choice; this is very useful for automated tests :-). + if get(a:options, 'use_dll', 1) == 0 + let use_dll = 0 + else + let use_dll = xolox#misc#os#can_use_dll() + endif + + " Decide whether to redirect the standard output and standard error + " streams to temporary files. + let redirect_output = !async && (use_dll || !is_win) + + " Write the input for the external command to a temporary file? + if has_key(a:options, 'stdin') && use_dll + let tempin = tempname() + if type(a:options['stdin']) == type([]) + let lines = a:options['stdin'] + else + let lines = split(a:options['stdin'], "\n") + endif + call writefile(lines, tempin) + let cmd .= ' < ' . xolox#misc#escape#shell(tempin) + endif + + " Redirect the standard output and/or standard error streams of the + " external process to temporary files? (only in synchronous mode) + if redirect_output + let tempout = tempname() + let temperr = tempname() + let cmd = printf('(%s) 1>%s 2>%s', cmd, xolox#misc#escape#shell(tempout), xolox#misc#escape#shell(temperr)) + endif + + " Use vim-shell or system() to execute the external command? + if use_dll + call xolox#misc#msg#debug("vim-misc %s: Executing external command using compiled DLL: %s", g:xolox#misc#version, cmd) + let exit_code = xolox#shell#execute_with_dll(cmd, async) + else + + " Enable asynchronous mode (very platform specific). + if async + if is_win + " As pointed out in issue 17 [1] the use of `:!start' on Windows + " requires characters like `!', `%' and `#' to be escaped with a + " backslash [2]. Vim's shellescape() function knows how to escape + " these special characters however the use of `:!start' is an + " implementation detail of xolox#misc#os#exec() so I don't want to + " bother callers (who perform the shell escaping) with such a + " specific implementation detail. This is why I resort to manually + " escaping characters documented to have a special meaning [2]. + " + " [1] https://github.com/xolox/vim-misc/issues/17 + " [2] All characters interpreted specially in shell command lines + " executed from Vim's command mode, refer to `:help :!' for + " details. + let cmd = printf('start /b %s', escape(cmd, "\\\n!%#")) + elseif has('unix') + let cmd = printf('(%s) &', cmd) + else + call xolox#misc#msg#warn("vim-misc %s: I don't know how to execute the command %s asynchronously on your platform! Falling back to synchronous mode...", g:xolox#misc#version, cmd) + endif + endif + + " On UNIX we explicitly execute the command line using 'sh' instead of + " the default shell, because we assume that standard output and standard + " error can be redirected separately, but (t)csh does not support this + " (and it might be the default shell). + if has('unix') + call xolox#misc#msg#debug("vim-misc %s: Generated shell expression: %s", g:xolox#misc#version, cmd) + let cmd = printf('sh -c %s', xolox#misc#escape#shell(cmd)) + endif + + " Let the user know what's happening (in case they're interested). + if async && is_win + call xolox#misc#msg#debug("vim-misc %s: Executing external command using !start command: %s", g:xolox#misc#version, cmd) + silent execute '!' . cmd + else + call xolox#misc#msg#debug("vim-misc %s: Executing external command using system() function: %s", g:xolox#misc#version, cmd) + let arguments = [cmd] + if has_key(a:options, 'stdin') + if type(a:options['stdin']) == type([]) + call add(arguments, join(a:options['stdin'], "\n")) + else + call add(arguments, a:options['stdin']) + endif + endif + let stdout = call('system', arguments) + let exit_code = v:shell_error + endif + + endif + + " Return the results as a dictionary with one or more key/value pairs. + let result = {'command': cmd} + if !async + let result['exit_code'] = exit_code + " Get the standard output of the command. + if redirect_output + let result['stdout'] = s:readfile(tempout, 'standard output', a:options['command']) + elseif exists('stdout') + let result['stdout'] = split(stdout, "\n") + else + let result['stdout'] = [] + endif + " Get the standard error of the command. + if exists('temperr') + let result['stderr'] = s:readfile(temperr, 'standard error', a:options['command']) + else + let result['stderr'] = [] + endif + " If we just executed a synchronous command and the caller didn't + " specifically ask us *not* to check the exit code of the external + " command, we'll do so now. The idea here is that it should be easy + " to 'do the right thing'. + if get(a:options, 'check', 1) && exit_code != 0 + " Prepare an error message with enough details so the user can investigate. + let msg = printf("vim-misc %s: External command failed with exit code %d!", g:xolox#misc#version, result['exit_code']) + let msg .= printf("\nCommand line: %s", result['command']) + " If the external command reported an error, we'll include it in our message. + if !empty(result['stderr']) + " This is where we would normally expect to find an error message. + let msg .= printf("\nOutput on standard output stream:\n%s", join(result['stderr'], "\n")) + elseif !empty(result['stdout']) + " Exuberant Ctags on Windows XP reports errors on standard output :-x. + let msg .= printf("\nOutput on standard error stream:\n%s", join(result['stdout'], "\n")) + endif + throw msg + endif + endif + return result + + finally + " Cleanup any temporary files we created. + for name in ['tempin', 'tempout', 'temperr'] + if exists(name) + call delete({name}) + endif + endfor + endtry + +endfunction + +function! xolox#misc#os#can_use_dll() " {{{1 + " If a) we're on Microsoft Windows, b) the vim-shell plug-in is installed + " and c) the compiled DLL included in vim-shell works, we can use the + " vim-shell plug-in to execute external commands! Returns 1 (true) + " if we can use the DLL, 0 (false) otherwise. + let can_use_dll = 0 + try + let can_use_dll = xolox#shell#can_use_dll() + catch /^Vim\%((\a\+)\)\=:E117/ + " Silence E117. + endtry + return can_use_dll +endfunction + +function! s:readfile(fname, label, cmd) " {{{1 + try + return readfile(a:fname) + catch + call xolox#misc#msg#warn("vim-misc %s: Failed to read temporary file (%s) with %s of external command: %s! (external command: %s)", g:xolox#misc#version, a:fname, a:label, v:exception, a:cmd) + return [] + endtry +endfunction + +" vim: ts=2 sw=2 et diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc/path.vim b/sources_non_forked/vim-misc/autoload/xolox/misc/path.vim new file mode 100755 index 00000000..6ff55894 --- /dev/null +++ b/sources_non_forked/vim-misc/autoload/xolox/misc/path.vim @@ -0,0 +1,278 @@ +" Pathname manipulation functions. +" +" Author: Peter Odding +" Last Change: July 7, 2014 +" URL: http://peterodding.com/code/vim/misc/ + +let s:windows_compatible = xolox#misc#os#is_win() + +function! xolox#misc#path#which(...) " {{{1 + " Scan the executable search path (`$PATH`) for one or more external + " programs. Expects one or more string arguments with program names. Returns + " a list with the absolute pathnames of all found programs. Here's an + " example: + " + " :echo xolox#misc#path#which('gvim', 'vim') + " ['/usr/local/bin/gvim', + " '/usr/bin/gvim', + " '/usr/local/bin/vim', + " '/usr/bin/vim'] + let extensions = s:windows_compatible ? split($PATHEXT, ';') : [''] + let matches = [] + let checked = {} + for program in a:000 + for directory in split($PATH, s:windows_compatible ? ';' : ':') + let directory = xolox#misc#path#absolute(directory) + if isdirectory(directory) + let found = 0 + for extension in extensions + let path = xolox#misc#path#merge(directory, program . extension) + if executable(path) + call add(matches, path) + let found = 1 + endif + endfor + if s:windows_compatible && ! found + " Maybe the extension is already contained in program; try without + " $PATHEXT. + let path = xolox#misc#path#merge(directory, program) + if executable(path) + call add(matches, path) + endif + endif + endif + endfor + endfor + return xolox#misc#list#unique(matches) +endfunction + +function! xolox#misc#path#split(path) " {{{1 + " Split a pathname (the first and only argument) into a list of pathname + " components. + " + " On Windows, pathnames starting with two slashes or backslashes are UNC + " paths where the leading slashes are significant... In this case we split + " like this: + " + " - Input: `'//server/share/directory'` + " - Result: `['//server', 'share', 'directory']` + " + " Everything except Windows is treated like UNIX until someone has a better + " suggestion :-). In this case we split like this: + " + " - Input: `'/foo/bar/baz'` + " - Result: `['/', 'foo', 'bar', 'baz']` + " + " To join a list of pathname components back into a single pathname string, + " use the `xolox#misc#path#join()` function. + if type(a:path) == type('') + if s:windows_compatible + if a:path =~ '^[\/][\/]' + " UNC pathname. + return split(a:path, '\%>2c[\/]\+') + else + " If it's not a UNC pathname we can simply split on slashes and + " backslashes, although we should preserve a leading slash (which + " denotes a pathname that is 'absolute to the current drive'). + let absolute = (a:path =~ '^[\/]') + let segments = split(a:path, '[\/]\+') + return absolute ? insert(segments, a:path[0]) : segments + endif + else + " Everything else is treated as UNIX. + let absolute = (a:path =~ '^/') + let segments = split(a:path, '/\+') + return absolute ? insert(segments, '/') : segments + endif + endif + return [] +endfunction + +function! xolox#misc#path#join(parts) " {{{1 + " Join a list of pathname components (the first and only argument) into a + " single pathname string. This is the counterpart to the + " `xolox#misc#path#split()` function and it expects a list of pathname + " components as returned by `xolox#misc#path#split()`. + if type(a:parts) == type([]) + if s:windows_compatible + return join(a:parts, xolox#misc#path#directory_separator()) + elseif get(a:parts, 0) == '/' + " Absolute path on UNIX (non-Windows). + return '/' . join(a:parts[1:], '/') + else + " Relative path on UNIX (non-Windows). + return join(a:parts, '/') + endif + endif + return '' +endfunction + +function! xolox#misc#path#directory_separator() " {{{1 + " Find the preferred directory separator for the platform and settings. + return exists('+shellslash') && &shellslash ? '/' : '\' +endfunction + +function! xolox#misc#path#absolute(path) " {{{1 + " Canonicalize and resolve a pathname, *regardless of whether it exists*. + " This is intended to support string comparison to determine whether two + " pathnames point to the same directory or file. + if type(a:path) == type('') + let path = a:path + " Make the pathname absolute. + if path =~ '^\~' + " Expand ~ to $HOME. + let path = $HOME . '/' . path[1:] + elseif xolox#misc#path#is_relative(path) + " Make relative pathnames absolute. + let path = getcwd() . '/' . path + endif + " Resolve symbolic links to find the canonical pathname. In my tests this + " also removes all symbolic pathname segments (`.' and `..'), even when + " the pathname does not exist. Also there used to be a bug in resolve() + " where it wouldn't resolve pathnames ending in a directory separator. + " Since it's not much trouble to work around, that's what we do. + let path = resolve(substitute(path, s:windows_compatible ? '[\/]\+$' : '/\+$', '', '')) + " Normalize directory separators (especially relevant on Windows). + let parts = xolox#misc#path#split(path) + if s:windows_compatible && parts[0] =~ '^[\/][\/]' + " Also normalize the two leading "directory separators" (I'm not + " sure what else to call them :-) in Windows UNC pathnames. + let parts[0] = repeat(xolox#misc#path#directory_separator(), 2) . parts[0][2:] + elseif s:windows_compatible && parts[0] =~ '^[\/]$' + " If a pathname is relative to the current drive we should add + " the drive letter in order to make the pathname absolute. + let parts[0] = matchstr(getcwd(), '^\a:') + endif + return xolox#misc#path#join(parts) + endif + return '' +endfunction + +function! xolox#misc#path#relative(path, base) " {{{1 + " Make an absolute pathname (the first argument) relative to a directory + " (the second argument). + let path = xolox#misc#path#split(a:path) + let base = xolox#misc#path#split(a:base) + while path != [] && base != [] && path[0] == base[0] + call remove(path, 0) + call remove(base, 0) + endwhile + let distance = repeat(['..'], len(base)) + return xolox#misc#path#join(distance + path) +endfunction + +function! xolox#misc#path#merge(parent, child, ...) " {{{1 + " Join a directory pathname and filename into a single pathname. + if type(a:parent) == type('') && type(a:child) == type('') + " TODO Use xolox#misc#path#is_relative()? + if s:windows_compatible + let parent = substitute(a:parent, '[\\/]\+$', '', '') + let child = substitute(a:child, '^[\\/]\+', '', '') + return parent . '\' . child + else + let parent = substitute(a:parent, '/\+$', '', '') + let child = substitute(a:child, '^/\+', '', '') + return parent . '/' . child + endif + endif + return '' +endfunction + +function! xolox#misc#path#commonprefix(paths) " {{{1 + " Find the common prefix of path components in a list of pathnames. + let common = xolox#misc#path#split(a:paths[0]) + for path in a:paths + let index = 0 + for segment in xolox#misc#path#split(path) + if len(common) <= index + break + elseif common[index] != segment + call remove(common, index, -1) + break + endif + let index += 1 + endfor + endfor + return xolox#misc#path#join(common) +endfunction + +function! xolox#misc#path#starts_with(a, b) " {{{1 + " Check whether the first pathname starts with the second pathname (expected + " to be a directory). This does not perform a regular string comparison; + " first it normalizes both pathnames, then it splits them into their + " pathname segments and then it compares the segments. + let a = xolox#misc#path#split(xolox#misc#path#absolute(a:a)) + let b = xolox#misc#path#split(xolox#misc#path#absolute(a:b)) + return a[0 : len(b) - 1] == b +endfunction + +function! xolox#misc#path#encode(path) " {{{1 + " Encode a pathname so it can be used as a filename. This uses URL encoding + " to encode special characters. + if s:windows_compatible + let mask = '[*|\\/:"<>?%]' + elseif xolox#misc#os#is_mac() + let mask = '[\\/%:]' + else + let mask = '[\\/%]' + endif + return substitute(a:path, mask, '\=printf("%%%x", char2nr(submatch(0)))', 'g') +endfunction + +function! xolox#misc#path#decode(encoded_path) " {{{1 + " Decode a pathname previously encoded with `xolox#misc#path#encode()`. + return substitute(a:encoded_path, '%\(\x\x\?\)', '\=nr2char("0x" . submatch(1))', 'g') +endfunction + +" xolox#misc#path#equals(a, b) - Check whether two pathnames point to the same file. {{{1 + +if s:windows_compatible + function! xolox#misc#path#equals(a, b) + return a:a ==? a:b || xolox#misc#path#absolute(a:a) ==? xolox#misc#path#absolute(a:b) + endfunction +else + function! xolox#misc#path#equals(a, b) + return a:a ==# a:b || xolox#misc#path#absolute(a:a) ==# xolox#misc#path#absolute(a:b) + endfunction +endif + +function! xolox#misc#path#is_relative(path) " {{{1 + " Returns true (1) when the pathname given as the first argument is + " relative, false (0) otherwise. + if a:path =~ '^\w\+://' + return 0 + elseif s:windows_compatible + return a:path !~ '^\(\w:\|[\\/]\)' + else + return a:path !~ '^/' + endif +endfunction + +function! xolox#misc#path#tempdir() " {{{1 + " Create a temporary directory and return the pathname of the directory. + if !exists('s:tempdir_counter') + let s:tempdir_counter = 1 + endif + if exists('*mkdir') + if s:windows_compatible + let template = $TMP . '\vim_tempdir_' + elseif filewritable('/tmp') == 2 + let template = '/tmp/vim_tempdir_' + endif + endif + if !exists('template') + throw "xolox#misc#path#tempdir() hasn't been implemented on your platform!" + endif + while 1 + let directory = template . s:tempdir_counter + try + call mkdir(directory, '', 0700) + return directory + catch /^Vim\%((\a\+)\)\=:E739/ + " Keep looking for a non-existing directory. + endtry + let s:tempdir_counter += 1 + endwhile +endfunction + +" vim: ts=2 sw=2 et diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc/perm.vim b/sources_non_forked/vim-misc/autoload/xolox/misc/perm.vim new file mode 100755 index 00000000..851a74d1 --- /dev/null +++ b/sources_non_forked/vim-misc/autoload/xolox/misc/perm.vim @@ -0,0 +1,100 @@ +" Manipulation of UNIX file permissions. +" +" Author: Peter Odding +" Last Change: June 30, 2014 +" URL: http://peterodding.com/code/vim/misc/ +" +" Vim's [writefile()][] function cannot set file permissions for newly created +" files and although Vim script has a function to get file permissions (see +" [getfperm()][]) there is no equivalent for changing a file's permissions. +" +" This omission breaks the otherwise very useful idiom of updating a file by +" writing its new contents to a temporary file and then renaming the temporary +" file into place (which is as close as you're going to get to atomically +" updating a file's contents on UNIX) because the file's permissions will not +" be preserved! +" +" **Here's a practical example:** My [vim-easytags][] plug-in writes tags file +" updates to a temporary file and renames the temporary file into place. When +" I use `sudo -s` on Ubuntu Linux it preserves my environment variables so my +" `~/.vimrc` and the [vim-easytags][] plug-in are still loaded. Now when a +" tags file is written the file becomes owned by root (my effective user id in +" the `sudo` session). Once I leave the `sudo` session I can no longer update +" my tags file because it's now owned by root … ಠ_ಠ +" +" [getfperm()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#getfperm() +" [vim-easytags]: http://peterodding.com/code/vim/easytags/ +" [writefile()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#writefile() + +function! xolox#misc#perm#update(fname, contents) + " Atomically update a file's contents while preserving the owner, group and + " mode. The first argument is the pathname of the file to update (a string). + " The second argument is the list of lines to be written to the file. Writes + " the new contents to a temporary file and renames the temporary file into + " place, thereby preventing readers from reading a partially written file. + " Returns 1 if the file is successfully updated, 0 otherwise. + " + " Note that if `xolox#misc#perm#get()` and `xolox#misc#perm#set()` cannot be + " used to preserve the file owner/group/mode the file is still updated using + " a rename (for compatibility with non-UNIX systems and incompatible + " `/usr/bin/stat` implementations) so in that case you can still lose the + " file's owner/group/mode. + let starttime = xolox#misc#timer#start() + let temporary_file = printf('%s.tmp', a:fname) + call xolox#misc#msg#debug("vim-misc %s: Writing new contents of %s to temporary file %s ..", g:xolox#misc#version, a:fname, temporary_file) + if writefile(a:contents, temporary_file) == 0 + call xolox#misc#perm#set(temporary_file, xolox#misc#perm#get(a:fname)) + call xolox#misc#msg#debug("vim-misc %s: Replacing %s with %s ..", g:xolox#misc#version, a:fname, temporary_file) + if rename(temporary_file, a:fname) == 0 + call xolox#misc#timer#stop("vim-misc %s: Successfully updated %s using atomic rename in %s.", g:xolox#misc#version, a:fname, starttime) + return 1 + endif + endif + if filereadable(temporary_file) + call delete(temporary_file) + endif + return 0 +endfunction + +function! xolox#misc#perm#get(fname) + " Get the owner, group and permissions of the pathname given as the first + " argument. Returns an opaque value which you can later pass to + " `xolox#misc#perm#set()`. + let pathname = xolox#misc#path#absolute(a:fname) + if filereadable(pathname) + let command = printf('stat --format %s %s', '%U:%G:%a', shellescape(pathname)) + let result = xolox#misc#os#exec({'command': command, 'check': 0}) + if result['exit_code'] == 0 && len(result['stdout']) >= 1 + let tokens = split(result['stdout'][0], ':') + if len(tokens) == 3 + let [owner, group, mode] = tokens + let mode = '0' . mode + call xolox#misc#msg#debug("vim-misc %s: File %s has owner %s, group %s, mode %s.", g:xolox#misc#version, pathname, owner, group, mode) + return [owner, group, mode] + endif + endif + endif + return [] +endfunction + +function! xolox#misc#perm#set(fname, perms) + " Set the permissions (the second argument) of the pathname given as the + " first argument. Expects a permissions value created by + " `xolox#misc#perm#get()`. + if !empty(a:perms) + let pathname = xolox#misc#path#absolute(a:fname) + let [owner, group, mode] = a:perms + if s:run('chown %s:%s %s', owner, group, pathname) && s:run('chmod %s %s', mode, pathname) + call xolox#misc#msg#debug("vim-misc %s: Successfully set %s owner to %s, group to %s and permissions to %s.", g:xolox#misc#version, pathname, owner, group, mode) + return 1 + endif + endif + return 0 +endfunction + +function! s:run(command, ...) + let args = map(copy(a:000), 'shellescape(v:val)') + call insert(args, a:command, 0) + let result = xolox#misc#os#exec({'command': call('printf', args), 'check': 0}) + return result['exit_code'] == 0 +endfunction diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc/persist.vim b/sources_non_forked/vim-misc/autoload/xolox/misc/persist.vim new file mode 100755 index 00000000..5b628fbf --- /dev/null +++ b/sources_non_forked/vim-misc/autoload/xolox/misc/persist.vim @@ -0,0 +1,50 @@ +" Persist/recall Vim values from/to files. +" +" Author: Peter Odding +" Last Change: June 30, 2014 +" URL: http://peterodding.com/code/vim/misc/ +" +" Vim's [string()][] function can be used to serialize Vim script values like +" numbers, strings, lists, dictionaries and composites of them to a string +" which can later be evaluated using the [eval()][] function to turn it back +" into the original value. This Vim script provides functions to use these +" functions to persist and recall Vim values from/to files. This is very +" useful for communication between (possibly concurrent) Vim processes. + +function! xolox#misc#persist#load(filename, ...) " {{{1 + " Read a Vim value like a number, string, list or dictionary from a file + " using [readfile()][] and [eval()][]. The first argument is the filename of + " the file to read (a string). The optional second argument specifies the + " default value which is returned when the file can't be loaded. This + " function returns the loaded value or the default value (which itself + " defaults to the integer 0). + " + " [eval()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#eval() + " [readfile()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#readfile() + let default_value = exists('a:1') ? a:1 : 0 + try + let lines = readfile(a:filename) + return eval(join(lines, "\n")) + catch + return default_value + endtry +endfunction + +function! xolox#misc#persist#save(filename, value) " {{{1 + " Write a Vim value like a number, string, list or dictionary to a file + " using [string()][] and [writefile()][]. The first argument is the filename + " of the file to write (a string) and the second argument is the value to + " write (any value). + " + " This function writes the serialized value to an intermediate file which is + " then renamed into place atomically. This avoids issues with concurrent + " processes where for example a producer has written a partial file which is + " read by a consumer before the file is complete. In this case the consumer + " would read a corrupt value. The rename trick avoids this problem. + " + " [string()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#string() + " [writefile()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#writefile() + return xolox#misc#perm#update(a:filename, split(string(a:value), "\n")) +endfunction + +" vim: ts=2 sw=2 et diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc/str.vim b/sources_non_forked/vim-misc/autoload/xolox/misc/str.vim new file mode 100755 index 00000000..edcab137 --- /dev/null +++ b/sources_non_forked/vim-misc/autoload/xolox/misc/str.vim @@ -0,0 +1,74 @@ +" String handling. +" +" Author: Peter Odding +" Last Change: September 17, 2014 +" URL: http://peterodding.com/code/vim/misc/ + +function! xolox#misc#str#slug(s) " {{{1 + " Convert a string to a "slug" - something that can be safely used in + " filenames and URLs without worrying about quoting/escaping of special + " characters. + return join(split(tolower(a:s), '\W\+'), '-') +endfunction + +function! xolox#misc#str#ucfirst(s) " {{{1 + " Uppercase the first character in a string (the first argument). + return substitute(a:s, '^.', '\U\0', '') +endfunction + +function! xolox#misc#str#unescape(s) " {{{1 + " Remove back slash escapes from a string (the first argument). + return substitute(a:s, '\\\(\_.\)', '\1', 'g') +endfunction + +function! xolox#misc#str#compact(s) " {{{1 + " Compact whitespace in a string (the first argument). + return join(split(a:s), " ") +endfunction + +function! xolox#misc#str#trim(s) " {{{1 + " Trim all whitespace from the start and end of a string (the first + " argument). + return substitute(a:s, '^\_s*\(.\{-}\)\_s*$', '\1', '') +endfunction + +function! xolox#misc#str#indent(text, num_spaces) " {{{1 + " Indent all lines in a multi-line string (the first argument) with a + " specific number of *space characters* (the second argument, an integer). + let lines = split(a:text, "\n") + let indent = repeat(' ', a:num_spaces) + let [idx, limit] = [0, len(lines)] + while idx < limit + if lines[idx] =~ '\S' + let lines[idx] = indent . lines[idx] + endif + let idx += 1 + endwhile + return join(lines, "\n") +endfunction + +function! xolox#misc#str#dedent(text) " {{{1 + " Remove common whitespace from a multi line string. + let lines = split(a:text, "\n") + " First we need to determine the common indentation of all non-empty lines. + for line in lines + if line =~ '\S' + let indent = matchstr(line, '^\s*') + if !exists('common_indent') + let common_indent = indent + elseif len(indent) < len(common_indent) + let common_indent = indent + endif + endif + endfor + " Now we will strip the common indentation. + let [idx, limit] = [0, len(lines)] + let pattern = '^' . common_indent + while idx < limit + let lines[idx] = substitute(lines[idx], pattern, '', '') + let idx += 1 + endwhile + return join(lines, "\n") +endfunction + +" vim: ts=2 sw=2 et diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc/test.vim b/sources_non_forked/vim-misc/autoload/xolox/misc/test.vim new file mode 100755 index 00000000..df4d4651 --- /dev/null +++ b/sources_non_forked/vim-misc/autoload/xolox/misc/test.vim @@ -0,0 +1,125 @@ +" Test runner & infrastructure for Vim plug-ins. +" +" Author: Peter Odding +" Last Change: June 2, 2013 +" URL: http://peterodding.com/code/vim/misc/ +" +" The Vim auto-load script `autoload/xolox/misc/test.vim` contains +" infrastructure that can be used to run an automated Vim plug-in test suite. +" It provides a framework for running test functions, keeping track of the +" test status, making assertions and reporting test results to the user. + +" The process handling tests cannot use the built-in "echo" command from the +" Windows shell because it has way too much idiosyncrasies for me to put up +" with. Seriously. Instead I'm using an "echo.exe" from the UnxUtils project. +if xolox#misc#os#is_win() + let g:xolox#misc#test#echo = xolox#misc#escape#shell(xolox#misc#path#merge(expand(':p:h'), 'echo.exe')) +else + let g:xolox#misc#test#echo = 'echo' +endif + +function! xolox#misc#test#reset() " {{{1 + " Reset counters for executed tests and passed/failed assertions. + let s:num_executed = 0 + let s:num_passed = 0 + let s:num_failed = 0 + let s:tests_started_at = xolox#misc#timer#start() +endfunction + +function! xolox#misc#test#summarize() " {{{1 + " Print a summary of test results, to be interpreted interactively. + call s:delimit_output() + call xolox#misc#timer#force("Took %s to run %s: %s passed, %s failed.", + \ s:tests_started_at, + \ xolox#misc#format#pluralize(s:num_executed, 'test', 'tests'), + \ xolox#misc#format#pluralize(s:num_passed, 'assertion', 'assertions'), + \ xolox#misc#format#pluralize(s:num_failed, 'assertion', 'assertions')) +endfunction + +function! xolox#misc#test#wrap(function) " {{{1 + " Call a function in a try/catch block and prevent exceptions from bubbling. + " The name of the function should be passed as the first and only argument; + " it should be a string containing the name of a Vim auto-load function. + let num_failed = s:num_failed + try + if s:num_passed + s:num_failed > 0 + call s:delimit_output() + endif + let test_name = split(a:function, '#')[-1] + let test_name = substitute(test_name, '_', ' ', 'g') + let test_name = substitute(test_name, '^.', '\U\0', '') + call xolox#misc#msg#info("Running test #%i: %s", s:num_executed + 1, test_name) + call call(a:function, []) + catch + call xolox#misc#msg#warn("Test %s raised exception:", a:function) + call xolox#misc#msg#warn("%s", v:exception) + call xolox#misc#msg#warn("(at %s)", v:throwpoint) + if num_failed == s:num_failed + " Make sure exceptions are counted as failures, but don't inflate the + " number of failed assertions when it's not needed (it can produce + " confusing test output). + call xolox#misc#test#failed() + endif + endtry + let s:num_executed += 1 +endfunction + +function! xolox#misc#test#passed() " {{{1 + " Record a test which succeeded. + let s:num_passed += 1 + call s:print_feedback() +endfunction + +function! xolox#misc#test#failed() " {{{1 + " Record a test which failed. + let s:num_failed += 1 + call s:print_feedback() +endfunction + +function! s:delimit_output() " {{{1 + " Print a delimiter between output of tests. + call xolox#misc#msg#info("%s", repeat("-", 40)) +endfunction + +function! s:print_feedback() " {{{1 + " Let the user know the status of the test suite. + call xolox#misc#msg#info("Test status: %s passed, %s failed ..", + \ xolox#misc#format#pluralize(s:num_passed, 'assertion', 'assertions'), + \ xolox#misc#format#pluralize(s:num_failed, 'assertion', 'assertions')) +endfunction + +function! xolox#misc#test#assert_true(expr) " {{{1 + " Check whether an expression is true. + if a:expr + call xolox#misc#test#passed() + else + call xolox#misc#test#failed() + let msg = "Expected value to be true, got %s instead" + throw printf(msg, string(a:expr)) + endif +endfunction + +function! xolox#misc#test#assert_equals(expected, received) " {{{1 + " Check whether two values are the same. + call xolox#misc#test#assert_same_type(a:expected, a:received) + if a:expected == a:received + call xolox#misc#test#passed() + else + call xolox#misc#test#failed() + let msg = "Expected value %s, received value %s!" + throw printf(msg, string(a:expected), string(a:received)) + endif +endfunction + +function! xolox#misc#test#assert_same_type(expected, received) " {{{1 + " Check whether two values are of the same type. + if type(a:expected) == type(a:received) + call xolox#misc#test#passed() + else + call xolox#misc#test#failed() + let msg = "Expected value of same type as %s, got value %s!" + throw printf(msg, string(a:expected), string(a:received)) + endif +endfunction + +call xolox#misc#test#reset() diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc/tests.vim b/sources_non_forked/vim-misc/autoload/xolox/misc/tests.vim new file mode 100755 index 00000000..f3af1cb8 --- /dev/null +++ b/sources_non_forked/vim-misc/autoload/xolox/misc/tests.vim @@ -0,0 +1,301 @@ +" Tests for the miscellaneous Vim scripts. +" +" Author: Peter Odding +" Last Change: June , 2013 +" URL: http://peterodding.com/code/vim/misc/ +" +" The Vim auto-load script `autoload/xolox/misc/tests.vim` contains the +" automated test suite of the miscellaneous Vim scripts. Right now the +" coverage is not very high yet, but this will improve over time. + +let s:use_dll = 0 +let s:can_use_dll = xolox#misc#os#can_use_dll() + +function! xolox#misc#tests#run() " {{{1 + " Run the automated test suite of the miscellaneous Vim scripts. To be used + " interactively. Intended to be safe to execute irrespective of context. + call xolox#misc#test#reset() + " Run the tests. + call s:test_string_escaping() + call s:test_list_handling() + call s:test_option_handling() + call s:test_command_execution() + call s:test_string_handling() + call s:test_version_handling() + " Report a short summary to the user. + call xolox#misc#test#summarize() +endfunction + +function! s:wrap_exec_test(function) + " Wrapper for tests that use xolox#misc#os#exec(). If we're on Windows and + " the vim-shell plug-in is installed, the test will be run twice: Once with + " vim-shell disabled and once with vim-shell enabled. This makes sure that + " all code paths are tested as much as possible. + call xolox#misc#msg#debug("vim-misc %s: Temporarily disabling vim-shell so we can test vim-misc ..", g:xolox#misc#version) + let s:use_dll = 0 + call xolox#misc#test#wrap(a:function) + if s:can_use_dll + call xolox#misc#msg#debug("vim-misc %s: Re-enabling vim-shell so we can test that as well ..", g:xolox#misc#version) + let s:use_dll = 1 + call xolox#misc#test#wrap(a:function) + endif +endfunction + +" Tests for autoload/xolox/misc/escape.vim {{{1 + +function! s:test_string_escaping() + call xolox#misc#test#wrap('xolox#misc#tests#pattern_escaping') + call xolox#misc#test#wrap('xolox#misc#tests#substitute_escaping') + call s:wrap_exec_test('xolox#misc#tests#shell_escaping') +endfunction + +function! xolox#misc#tests#pattern_escaping() " {{{2 + " Test escaping of regular expression patterns with + " `xolox#misc#escape#pattern()`. + call xolox#misc#test#assert_equals('foo [qux] baz', substitute('foo [bar] baz', xolox#misc#escape#pattern('[bar]'), '[qux]', 'g')) + call xolox#misc#test#assert_equals('also very nasty', substitute('also ~ nasty', xolox#misc#escape#pattern('~'), 'very', 'g')) +endfunction + +function! xolox#misc#tests#substitute_escaping() " {{{2 + " Test escaping of substitution strings with + " `xolox#misc#escape#substitute()`. + call xolox#misc#test#assert_equals('nasty & tricky stuff', substitute('tricky stuff', 'tricky', xolox#misc#escape#substitute('nasty & tricky'), 'g')) +endfunction + +function! xolox#misc#tests#shell_escaping() " {{{2 + " Test escaping of shell arguments with `xolox#misc#escape#shell()`. + let expected_value = 'this < is > a | very " scary ^ string '' indeed' + let result = xolox#misc#os#exec({'command': g:xolox#misc#test#echo . ' ' . xolox#misc#escape#shell(expected_value), 'use_dll': s:use_dll}) + call xolox#misc#test#assert_equals(0, result['exit_code']) + call xolox#misc#test#assert_equals(0, result['exit_code']) + call xolox#misc#test#assert_same_type([], result['stdout']) + call xolox#misc#test#assert_equals(1, len(result['stdout'])) + " XXX On Windows using system() there's a trailing space I can't explain. + " However the point of this test was to show that all characters pass + " through unharmed, so for now I'll just ignore the space :-) + call xolox#misc#test#assert_equals(expected_value, xolox#misc#str#trim(result['stdout'][0])) +endfunction + +" Tests for autoload/xolox/misc/list.vim {{{1 + +function! s:test_list_handling() + call xolox#misc#test#wrap('xolox#misc#tests#making_a_list_unique') + call xolox#misc#test#wrap('xolox#misc#tests#binary_insertion') +endfunction + +function! xolox#misc#tests#making_a_list_unique() " {{{2 + " Test removing of duplicate values from lists with + " `xolox#misc#list#unique()`. + call xolox#misc#test#assert_equals([1, 2, 3, 4, 5], xolox#misc#list#unique([1, 1, 2, 3, 3, 4, 5, 5])) + " Should work for strings just as well. And it should preserve order. + call xolox#misc#test#assert_equals(['a', 'b', 'c'], xolox#misc#list#unique(['a', 'a', 'b', 'b', 'c'])) + " Just to make sure that lists without duplicate values pass through unharmed. + call xolox#misc#test#assert_equals([1, 2, 3, 4, 5], xolox#misc#list#unique([1, 2, 3, 4, 5])) +endfunction + +function! xolox#misc#tests#binary_insertion() " {{{2 + " Test the binary insertion algorithm implemented in + " `xolox#misc#list#binsert()`. + let list = ['a', 'B', 'e'] + " Insert 'c' (should end up between 'B' and 'e'). + call xolox#misc#list#binsert(list, 'c', 1) + call xolox#misc#test#assert_equals(['a', 'B', 'c', 'e'], list) + " Insert 'D' (should end up between 'c' and 'e'). + call xolox#misc#list#binsert(list, 'D', 1) + call xolox#misc#test#assert_equals(['a', 'B', 'c', 'D', 'e'], list) + " Insert 'f' (should end up after 'e', at the end). + call xolox#misc#list#binsert(list, 'f', 1) + call xolox#misc#test#assert_equals(['a', 'B', 'c', 'D', 'e', 'f'], list) +endfunction + +" Tests for autoload/xolox/misc/option.vim {{{1 + +function! s:test_option_handling() + call xolox#misc#test#wrap('xolox#misc#tests#getting_configuration_options') + call xolox#misc#test#wrap('xolox#misc#tests#splitting_of_multi_valued_options') + call xolox#misc#test#wrap('xolox#misc#tests#joining_of_multi_valued_options') +endfunction + +function! xolox#misc#tests#getting_configuration_options() " {{{2 + " Test getting of scoped plug-in configuration "options" with + " `xolox#misc#option#get()`. + let magic_name = 'a_variable_that_none_would_use' + call xolox#misc#test#assert_equals(0, xolox#misc#option#get(magic_name)) + " Test custom default values. + call xolox#misc#test#assert_equals([], xolox#misc#option#get(magic_name, [])) + " Set the option as a global variable. + let global_value = 'global variable' + let g:{magic_name} = global_value + call xolox#misc#test#assert_equals(global_value, xolox#misc#option#get(magic_name)) + " Set the option as a buffer local variable, thereby shadowing the global. + let local_value = 'buffer local variable' + let b:{magic_name} = local_value + call xolox#misc#test#assert_equals(local_value, xolox#misc#option#get(magic_name)) + " Sanity check that it's possible to unshadow as well. + unlet b:{magic_name} + call xolox#misc#test#assert_equals(global_value, xolox#misc#option#get(magic_name)) + " Cleanup after ourselves. + unlet g:{magic_name} + call xolox#misc#test#assert_equals(0, xolox#misc#option#get(magic_name)) +endfunction + +function! xolox#misc#tests#splitting_of_multi_valued_options() " {{{2 + " Test splitting of multi-valued Vim options with + " `xolox#misc#option#split()`. + call xolox#misc#test#assert_equals([], xolox#misc#option#split('')) + call xolox#misc#test#assert_equals(['just one value'], xolox#misc#option#split('just one value')) + call xolox#misc#test#assert_equals(['value 1', 'value 2'], xolox#misc#option#split('value 1,value 2')) + call xolox#misc#test#assert_equals(['value 1', 'value 2', 'tricky,value'], xolox#misc#option#split('value 1,value 2,tricky\,value')) +endfunction + +function! xolox#misc#tests#joining_of_multi_valued_options() " {{{2 + " Test joining of multi-valued Vim options with `xolox#misc#option#join()`. + call xolox#misc#test#assert_equals('', xolox#misc#option#join([])) + call xolox#misc#test#assert_equals('just one value', xolox#misc#option#join(['just one value'])) + call xolox#misc#test#assert_equals('value 1,value 2', xolox#misc#option#join(['value 1', 'value 2'])) + call xolox#misc#test#assert_equals('value 1,value 2,tricky\,value', xolox#misc#option#join(['value 1', 'value 2', 'tricky,value'])) +endfunction + +" Tests for autoload/xolox/misc/os.vim {{{1 + +function! s:test_command_execution() + call xolox#misc#test#wrap('xolox#misc#tests#finding_vim_on_the_search_path') + call s:wrap_exec_test('xolox#misc#tests#synchronous_command_execution') + call s:wrap_exec_test('xolox#misc#tests#synchronous_command_execution_with_stderr') + call s:wrap_exec_test('xolox#misc#tests#synchronous_command_execution_with_raising_of_errors') + call s:wrap_exec_test('xolox#misc#tests#synchronous_command_execution_without_raising_errors') + call s:wrap_exec_test('xolox#misc#tests#asynchronous_command_execution') +endfunction + +function! xolox#misc#tests#finding_vim_on_the_search_path() " {{{2 + " Test looking up Vim's executable on the search path using [v:progname] [] + " with `xolox#misc#os#find_vim()`. + " + " [v:progname]: http://vimdoc.sourceforge.net/htmldoc/eval.html#v:progname + let pathname = xolox#misc#os#find_vim() + call xolox#misc#test#assert_same_type('', pathname) + call xolox#misc#test#assert_true(executable(pathname)) +endfunction + +function! xolox#misc#tests#synchronous_command_execution() " {{{2 + " Test basic functionality of synchronous command execution with + " `xolox#misc#os#exec()`. + let result = xolox#misc#os#exec({'command': printf('%s output', g:xolox#misc#test#echo), 'use_dll': s:use_dll}) + call xolox#misc#test#assert_same_type({}, result) + call xolox#misc#test#assert_equals(0, result['exit_code']) + call xolox#misc#test#assert_equals(['output'], result['stdout']) +endfunction + +function! xolox#misc#tests#synchronous_command_execution_with_stderr() " {{{2 + " Test basic functionality of synchronous command execution with + " `xolox#misc#os#exec()` including the standard error stream (not available + " on Windows when vim-shell is not installed). + if !(xolox#misc#os#is_win() && !s:use_dll) + let result = xolox#misc#os#exec({'command': printf('%s output && %s errors >&2', g:xolox#misc#test#echo, g:xolox#misc#test#echo), 'use_dll': s:use_dll}) + call xolox#misc#test#assert_same_type({}, result) + call xolox#misc#test#assert_equals(0, result['exit_code']) + call xolox#misc#test#assert_equals(['output'], result['stdout']) + call xolox#misc#test#assert_equals(['errors'], result['stderr']) + endif +endfunction + +function! xolox#misc#tests#synchronous_command_execution_with_raising_of_errors() " {{{2 + " Test raising of errors during synchronous command execution with + " `xolox#misc#os#exec()`. + try + call xolox#misc#os#exec({'command': 'exit 1', 'use_dll': s:use_dll}) + call xolox#misc#test#assert_true(0) + catch + call xolox#misc#test#assert_true(1) + endtry +endfunction + +function! xolox#misc#tests#synchronous_command_execution_without_raising_errors() " {{{2 + " Test synchronous command execution without raising of errors with + " `xolox#misc#os#exec()`. + try + let result = xolox#misc#os#exec({'command': 'exit 42', 'check': 0, 'use_dll': s:use_dll}) + call xolox#misc#test#assert_true(1) + call xolox#misc#test#assert_equals(42, result['exit_code']) + catch + call xolox#misc#test#assert_true(0) + endtry +endfunction + +function! xolox#misc#tests#asynchronous_command_execution() " {{{2 + " Test the basic functionality of asynchronous command execution with + " `xolox#misc#os#exec()`. This runs the external command `mkdir` and tests + " that the side effect of creating the directory takes place. This might + " seem like a peculiar choice, but it's one of the few 100% portable + " commands (Windows + UNIX) that doesn't involve input/output streams. + let temporary_directory = xolox#misc#path#tempdir() + let random_name = printf('%i', localtime()) + let expected_directory = xolox#misc#path#merge(temporary_directory, random_name) + let command = 'mkdir ' . xolox#misc#escape#shell(expected_directory) + let result = xolox#misc#os#exec({'command': command, 'async': 1, 'use_dll': s:use_dll}) + call xolox#misc#test#assert_same_type({}, result) + " Make sure the command is really executed. + let timeout = localtime() + 30 + while !isdirectory(expected_directory) && localtime() < timeout + sleep 500 m + endwhile + call xolox#misc#test#assert_true(isdirectory(expected_directory)) +endfunction + +" Tests for autoload/xolox/misc/str.vim {{{1 + +function! s:test_string_handling() + call xolox#misc#test#wrap('xolox#misc#tests#string_case_transformation') + call xolox#misc#test#wrap('xolox#misc#tests#string_whitespace_compaction') + call xolox#misc#test#wrap('xolox#misc#tests#string_whitespace_trimming') + call xolox#misc#test#wrap('xolox#misc#tests#multiline_string_dedent') +endfunction + +function! xolox#misc#tests#string_case_transformation() + " Test string case transformation with `xolox#misc#str#ucfirst()`. + call xolox#misc#test#assert_equals('Foo', xolox#misc#str#ucfirst('foo')) + call xolox#misc#test#assert_equals('BAR', xolox#misc#str#ucfirst('BAR')) +endfunction + +function! xolox#misc#tests#string_whitespace_compaction() + " Test compaction of whitespace in strings with `xolox#misc#str#compact()`. + call xolox#misc#test#assert_equals('foo bar baz', xolox#misc#str#compact(' foo bar baz ')) + call xolox#misc#test#assert_equals('test', xolox#misc#str#compact("\ntest ")) +endfunction + +function! xolox#misc#tests#string_whitespace_trimming() + " Test trimming of whitespace in strings with `xolox#misc#str#trim()`. + call xolox#misc#test#assert_equals('foo bar baz', xolox#misc#str#trim("\nfoo bar baz ")) +endfunction + +function! xolox#misc#tests#multiline_string_dedent() + " Test dedenting of multi-line strings with `xolox#misc#str#dedent()`. + call xolox#misc#test#assert_equals('test', xolox#misc#str#dedent(' test')) + call xolox#misc#test#assert_equals("1\n\n2", xolox#misc#str#dedent(" 1\n\n 2")) + call xolox#misc#test#assert_equals("1\n\n 2", xolox#misc#str#dedent(" 1\n\n 2")) +endfunction + +" Tests for autoload/xolox/misc/version.vim {{{1 + +function! s:test_version_handling() + call xolox#misc#test#wrap('xolox#misc#tests#version_string_parsing') + call xolox#misc#test#wrap('xolox#misc#tests#version_string_comparison') +endfunction + +function! xolox#misc#tests#version_string_parsing() " {{{2 + " Test parsing of version strings with `xolox#misc#version#parse()`. + call xolox#misc#test#assert_equals([1], xolox#misc#version#parse('1')) + call xolox#misc#test#assert_equals([1, 5], xolox#misc#version#parse('1.5')) + call xolox#misc#test#assert_equals([1, 22, 3333, 44444, 55555], xolox#misc#version#parse('1.22.3333.44444.55555')) + call xolox#misc#test#assert_equals([1, 5], xolox#misc#version#parse('1x.5y')) +endfunction + +function! xolox#misc#tests#version_string_comparison() " {{{2 + " Test comparison of version strings with `xolox#misc#version#at_least()`. + call xolox#misc#test#assert_true(xolox#misc#version#at_least('1', '1')) + call xolox#misc#test#assert_true(!xolox#misc#version#at_least('1', '0')) + call xolox#misc#test#assert_true(xolox#misc#version#at_least('1', '2')) + call xolox#misc#test#assert_true(xolox#misc#version#at_least('1.2.3', '1.2.3')) + call xolox#misc#test#assert_true(!xolox#misc#version#at_least('1.2.3', '1.2')) + call xolox#misc#test#assert_true(xolox#misc#version#at_least('1.2.3', '1.2.4')) +endfunction diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc/timer.vim b/sources_non_forked/vim-misc/autoload/xolox/misc/timer.vim new file mode 100755 index 00000000..e97a1866 --- /dev/null +++ b/sources_non_forked/vim-misc/autoload/xolox/misc/timer.vim @@ -0,0 +1,130 @@ +" Timing of long during operations. +" +" Author: Peter Odding +" Last Change: July 19, 2014 +" URL: http://peterodding.com/code/vim/misc/ + +if !exists('g:timer_enabled') + let g:timer_enabled = 0 +endif + +if !exists('g:timer_verbosity') + let g:timer_verbosity = 1 +endif + +let s:has_reltime = has('reltime') +let s:unique_marker = 'xolox#misc#timer#value' + +function! xolox#misc#timer#resumable() " {{{1 + " Create a resumable timer object. This returns an object (a dictionary with + " functions) with the following "methods": + " + " - `start()` instructs the timer object to start counting elapsed time + " (when a timer object is created it is not automatically started). + " + " - `stop()` instructs the timer object to stop counting elapsed time. + " This adds the time elapsed since `start()` was last called to the + " total elapsed time. This method will raise an error if called out of + " sequence. + " + " - `format()` takes the total elapsed time and reports it as a string + " containing a formatted floating point number. + " + " Timer objects are meant to accurately time short running operations so + " they're dependent on Vim's [reltime()][] and [reltimestr()][] functions. + " In order to make it possible to use timer objects in my Vim plug-ins + " unconditionally there's a fall back to [localtime()][] when [reltime()][] + " is not available. In this mode the timer objects are not very useful but + " at least they shouldn't raise errors. + " + " [localtime()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#localtime() + " [reltime()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#reltime() + " [reltimestr()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#reltimestr() + let object = {'total': [0, 0]} + function object.start() dict + if s:has_reltime + let self.current = reltime() + else + let self.current = localtime() + endif + endfunction + function object.stop() dict + if empty(get(self, 'current')) + throw "timer.stop() called on a timer that was never started!" + endif + if s:has_reltime + let elapsed_time_string = xolox#misc#str#trim(reltimestr(reltime(self.current))) + " This is a bit silly (converting to a string and then parsing that) but + " the value of reltime() is documented as being platform specific... + let [seconds, microseconds] = split(elapsed_time_string, '\.') + let self.total[0] += substitute(seconds, '^0*', '', '') + let self.total[1] += substitute(microseconds, '^0*', '', '') + let self.current = [] + else + let self.total[0] += localtime() - self.current + let self.current = 0 + endif + endfunction + function object.format() dict + let seconds = self.total[0] + let microseconds = self.total[1] + if microseconds >= 1000000 + let additional_seconds = microseconds / 1000000 + let seconds += additional_seconds + let microseconds -= additional_seconds * 1000000 + endif + return printf('%i.%06i', seconds, microseconds) + endfunction + return object +endfunction + +function! xolox#misc#timer#start() " {{{1 + " Start a timer. This returns a list which can later be passed to + " `xolox#misc#timer#stop()`. + return [s:unique_marker, s:has_reltime ? reltime() : localtime()] +endfunction + +function! xolox#misc#timer#stop(...) " {{{1 + " Show a formatted debugging message to the user, if the user has enabled + " increased verbosity by setting Vim's ['verbose'] [verbose] option to one + " (1) or higher. + " + " This function has the same argument handling as Vim's [printf()] [printf] + " function with one difference: At the point where you want the elapsed time + " to be embedded, you write `%s` and you pass the list returned by + " `xolox#misc#timer#start()` as an argument. + " + " [verbose]: http://vimdoc.sourceforge.net/htmldoc/options.html#'verbose' + " [printf]: http://vimdoc.sourceforge.net/htmldoc/eval.html#printf() + if (g:timer_enabled || &verbose >= g:timer_verbosity) + call call('xolox#misc#msg#info', map(copy(a:000), 'xolox#misc#timer#convert(v:val)')) + endif +endfunction + +function! xolox#misc#timer#force(...) " {{{1 + " Show a formatted message to the user. This function has the same argument + " handling as Vim's [printf()] [printf] function with one difference: At the + " point where you want the elapsed time to be embedded, you write `%s` and + " you pass the list returned by `xolox#misc#timer#start()` as an argument. + call call('xolox#misc#msg#info', map(copy(a:000), 'xolox#misc#timer#convert(v:val)')) +endfunction + +function! xolox#misc#timer#convert(value) " {{{1 + " Convert the value returned by `xolox#misc#timer#start()` to a string + " representation of the elapsed time since `xolox#misc#timer#start()` was + " called. Other values are returned unmodified (this allows using it with + " Vim's [map()][] function). + " + " [map()]: http://vimdoc.sourceforge.net/htmldoc/eval.html#map() + if type(a:value) == type([]) && len(a:value) == 2 && a:value[0] == s:unique_marker + if s:has_reltime + let ts = xolox#misc#str#trim(reltimestr(reltime(a:value[1]))) + else + let ts = localtime() - a:value[1] + endif + return xolox#misc#format#timestamp(ts) + endif + return a:value +endfunction + +" vim: ts=2 sw=2 et diff --git a/sources_non_forked/vim-misc/autoload/xolox/misc/version.vim b/sources_non_forked/vim-misc/autoload/xolox/misc/version.vim new file mode 100755 index 00000000..0f3ad673 --- /dev/null +++ b/sources_non_forked/vim-misc/autoload/xolox/misc/version.vim @@ -0,0 +1,34 @@ +" Version string handling. +" +" Author: Peter Odding +" Last Change: June 22, 2013 +" URL: http://peterodding.com/code/vim/misc/ + +function! xolox#misc#version#parse(version_string) + " Convert a version string to a list of integers. + let result = map(split(a:version_string, '\.'), 'v:val + 0') + call xolox#misc#msg#debug("vim-misc %s: Parsed version string %s into %s.", g:xolox#misc#version, string(a:version_string), string(result)) + return result +endfunction + +function! xolox#misc#version#at_least(expected_version, available_version) + " Check whether the second version string is equal to or greater than the + " first version string. Returns 1 (true) when it is, 0 (false) otherwise. + let expected_version = xolox#misc#version#parse(a:expected_version) + let available_version = xolox#misc#version#parse(a:available_version) + for idx in range(max([len(expected_version), len(available_version)])) + let expected_number = get(expected_version, idx, 0) + let available_number = get(available_version, idx, 0) + if available_number > expected_number + call xolox#misc#msg#debug("vim-misc %s: Available version (%s) is higher than expected version (%s).", g:xolox#misc#version, a:available_version, a:expected_version) + return 1 + elseif available_number < expected_number + call xolox#misc#msg#debug("vim-misc %s: Available version (%s) is lower than expected version (%s).", g:xolox#misc#version, a:available_version, a:expected_version) + return 0 + endif + endfor + call xolox#misc#msg#debug("vim-misc %s: Available version (%s) is equal to expected version (%s).", g:xolox#misc#version, a:available_version, a:expected_version) + return 1 +endfunction + +" vim: ts=2 sw=2 et diff --git a/sources_non_forked/vim-misc/doc/misc.txt b/sources_non_forked/vim-misc/doc/misc.txt new file mode 100755 index 00000000..3476c465 --- /dev/null +++ b/sources_non_forked/vim-misc/doc/misc.txt @@ -0,0 +1,1204 @@ +*misc.txt* Miscellaneous auto-load Vim scripts + +=============================================================================== +Contents ~ + + 1. Introduction |misc-introduction| + 2. Installation |misc-installation| + 3. Function documentation |misc-function-documentation| + 1. Asynchronous Vim script evaluation |misc-asynchronous-vim-script-evaluation| + 1. The |xolox#misc#async#call()| function + 2. The |xolox#misc#async#inside_child()| function + 3. The |xolox#misc#async#callback_to_parent()| function + 4. The |xolox#misc#async#periodic_callback()| function + 2. Handling of special buffers |misc-handling-of-special-buffers| + 1. The |xolox#misc#buffer#is_empty()| function + 2. The |xolox#misc#buffer#prepare()| function + 3. The |xolox#misc#buffer#lock()| function + 4. The |xolox#misc#buffer#unlock()| function + 3. Tab completion for user defined commands |misc-tab-completion-for-user-defined-commands| + 1. The |xolox#misc#complete#keywords()| function + 4. Rate limiting for Vim's CursorHold event |misc-rate-limiting-for-vims-cursorhold-event| + 1. The |xolox#misc#cursorhold#register()| function + 2. The |xolox#misc#cursorhold#autocmd()| function + 5. String escaping functions |misc-string-escaping-functions| + 1. The |xolox#misc#escape#pattern()| function + 2. The |xolox#misc#escape#substitute()| function + 3. The |xolox#misc#escape#shell()| function + 6. Human friendly string formatting for Vim |misc-human-friendly-string-formatting-for-vim| + 1. The |xolox#misc#format#pluralize()| function + 2. The |xolox#misc#format#timestamp()| function + 7. List handling functions |misc-list-handling-functions| + 1. The |xolox#misc#list#unique()| function + 2. The |xolox#misc#list#binsert()| function + 8. Functions to interact with the user |misc-functions-to-interact-with-user| + 1. The |xolox#misc#msg#info()| function + 2. The |xolox#misc#msg#warn()| function + 3. The |xolox#misc#msg#debug()| function + 9. Integration between Vim and its environment |misc-integration-between-vim-its-environment| + 1. The |xolox#misc#open#file()| function + 2. The |xolox#misc#open#url()| function + 10. Vim and plug-in option handling |misc-vim-plug-in-option-handling| + 1. The |xolox#misc#option#get()| function + 2. The |xolox#misc#option#split()| function + 3. The |xolox#misc#option#join()| function + 4. The |xolox#misc#option#split_tags()| function + 5. The |xolox#misc#option#join_tags()| function + 6. The |xolox#misc#option#eval_tags()| function + 11. Operating system interfaces |misc-operating-system-interfaces| + 1. The |xolox#misc#os#is_mac()| function + 2. The |xolox#misc#os#is_win()| function + 3. The |xolox#misc#os#find_vim()| function + 4. The |xolox#misc#os#exec()| function + 5. The |xolox#misc#os#can_use_dll()| function + 12. Pathname manipulation functions |misc-pathname-manipulation-functions| + 1. The |xolox#misc#path#which()| function + 2. The |xolox#misc#path#split()| function + 3. The |xolox#misc#path#join()| function + 4. The |xolox#misc#path#directory_separator()| function + 5. The |xolox#misc#path#absolute()| function + 6. The |xolox#misc#path#relative()| function + 7. The |xolox#misc#path#merge()| function + 8. The |xolox#misc#path#commonprefix()| function + 9. The |xolox#misc#path#starts_with()| function + 10. The |xolox#misc#path#encode()| function + 11. The |xolox#misc#path#decode()| function + 12. The |xolox#misc#path#is_relative()| function + 13. The |xolox#misc#path#tempdir()| function + 13. Manipulation of UNIX file permissions |misc-manipulation-of-unix-file-permissions| + 1. The |xolox#misc#perm#update()| function + 2. The |xolox#misc#perm#get()| function + 3. The |xolox#misc#perm#set()| function + 14. Persist/recall Vim values from/to files |misc-persist-recall-vim-values-from-to-files| + 1. The |xolox#misc#persist#load()| function + 2. The |xolox#misc#persist#save()| function + 15. String handling |misc-string-handling| + 1. The |xolox#misc#str#slug()| function + 2. The |xolox#misc#str#ucfirst()| function + 3. The |xolox#misc#str#unescape()| function + 4. The |xolox#misc#str#compact()| function + 5. The |xolox#misc#str#trim()| function + 6. The |xolox#misc#str#indent()| function + 7. The |xolox#misc#str#dedent()| function + 16. Test runner & infrastructure for Vim plug-ins |misc-test-runner-infrastructure-for-vim-plug-ins| + 1. The |xolox#misc#test#reset()| function + 2. The |xolox#misc#test#summarize()| function + 3. The |xolox#misc#test#wrap()| function + 4. The |xolox#misc#test#passed()| function + 5. The |xolox#misc#test#failed()| function + 6. The |xolox#misc#test#assert_true()| function + 7. The |xolox#misc#test#assert_equals()| function + 8. The |xolox#misc#test#assert_same_type()| function + 17. Tests for the miscellaneous Vim scripts |tests-for-miscellaneous-vim-scripts| + 1. The |xolox#misc#tests#run()| function + 2. The |xolox#misc#tests#pattern_escaping()| function + 3. The |xolox#misc#tests#substitute_escaping()| function + 4. The |xolox#misc#tests#shell_escaping()| function + 5. The |xolox#misc#tests#making_a_list_unique()| function + 6. The |xolox#misc#tests#binary_insertion()| function + 7. The |xolox#misc#tests#getting_configuration_options()| function + 8. The |xolox#misc#tests#splitting_of_multi_valued_options()| function + 9. The |xolox#misc#tests#joining_of_multi_valued_options()| function + 10. The |xolox#misc#tests#finding_vim_on_the_search_path()| function + 11. The |xolox#misc#tests#synchronous_command_execution()| function + 12. The |xolox#misc#tests#synchronous_command_execution_with_stderr()| function + 13. The |xolox#misc#tests#synchronous_command_execution_with_raising_of_errors()| +function + 14. The |xolox#misc#tests#synchronous_command_execution_without_raising_errors()| +function + 15. The |xolox#misc#tests#asynchronous_command_execution()| function + 16. The |xolox#misc#tests#string_case_transformation()| function + 17. The |xolox#misc#tests#string_whitespace_compaction()| function + 18. The |xolox#misc#tests#string_whitespace_trimming()| function + 19. The |xolox#misc#tests#multiline_string_dedent()| function + 20. The |xolox#misc#tests#version_string_parsing()| function + 21. The |xolox#misc#tests#version_string_comparison()| function + 18. Timing of long during operations |misc-timing-of-long-during-operations| + 1. The |xolox#misc#timer#resumable()| function + 2. The |xolox#misc#timer#start()| function + 3. The |xolox#misc#timer#stop()| function + 4. The |xolox#misc#timer#force()| function + 5. The |xolox#misc#timer#convert()| function + 19. Version string handling |misc-version-string-handling| + 1. The |xolox#misc#version#parse()| function + 2. The |xolox#misc#version#at_least()| function + 4. Contact |misc-contact| + 5. License |misc-license| + 6. References |misc-references| + +=============================================================================== + *misc-introduction* +Introduction ~ + +The vim-misc plug-in contains Vim scripts that are used by most of the Vim +plug-ins I've written [1] yet don't really belong with any single one of the +plug-ins. Basically it's an extended standard library of Vim script functions +that I wrote during the development of my Vim profile and plug-ins. + +In the past these scripts were bundled with each plug-in, however that turned +out to be a maintenance nightmare for me. That's why the miscellaneous scripts +are now a proper plug-in with their own page on Vim Online. + +Because the miscellaneous scripts are no longer bundled with my Vim plug-ins, +users are now required to install the miscellaneous scripts separately. This is +unfortunate for users who are upgrading from a previous release that did bundle +the miscellaneous scripts, but I don't see any way around this. Sorry! + +=============================================================================== + *misc-installation* +Installation ~ + +Please refer to the installation instructions [2] on GitHub. + +=============================================================================== + *misc-function-documentation* +Function documentation ~ + +Below is the documentation for the functions included in the miscellaneous +scripts. Anyone is free to use these functions in their own Vim profile and/or +plug-ins. I care about backwards compatibility so won't break it without a good +reason to do so. + +For those who are curious: The function descriptions given below were extracted +from the source code of the miscellaneous scripts using the Python module +'vimdoctool.py' included in vim-tools [3]. + +The documentation of the 95 functions below was extracted from 19 Vim scripts +on April 1, 2015 at 23:39. + +------------------------------------------------------------------------------- + *misc-asynchronous-vim-script-evaluation* +Asynchronous Vim script evaluation ~ + +The |xolox#misc#async#call()| function builds on top of |xolox#misc#os#exec()| +to support asynchronous evaluation of Vim scripts. The first (and for now only) +use case is my vim-easytags [4] plug-in which has a bunch of conflicting +requirements: + +1. I want the vim-easytags [4] plug-in to be as portable as possible. + Ideally everything is implemented in Vim script because that's the only + thing I can rely on to be available for all potential users of the plug- + in! + +2. Because of point one I've been forced to implement tags file reading, + parsing, (fold case) sorting and writing in Vim script. This is fine for + small tags files but once they grow to a couple of megabytes it becomes + annoying because Vim is unresponsive during tags file updates (key + presses are fortunately buffered due to Vim's input model but that + doesn't make it a nice user experience :-). + +3. I could (and did in the past) come up with all sorts of hacks to speed + things up without switching away from Vim script, but none of them are + going to solve the fundamental problem that Vim's unresponsive hiccups + become longer as tags files grow larger. + +By now it should be clear where this is heading: _Why not handle tags file +updates in a Vim process that runs in the background without blocking the Vim +process that the user is interacting with?_ It turns out that there are quite a +few details to take care of, but with those out of the way, it might just work! +I'm actually hoping to make asynchronous updates the default mode in vim- +easytags [4]. This means I need this functionality to be as portable and robust +as possible. + +**Status:** This code has seen little testing so I wouldn't trust it too much +just yet. On the other hand, as I said, my intention is to make this +functionality as portable and robust as possible. You be the judge :-). + +------------------------------------------------------------------------------- +The *xolox#misc#async#call()* function + +Call a Vim script function asynchronously by starting a hidden Vim process in +the background. Once the function returns the hidden Vim process terminates +itself. This function takes a single argument which is a dictionary with the +following key/value pairs: + +- **function** (required): The name of the Vim function to call inside the + child process (a string). I suggest using an |autoload| function for this, + see below. + +- **arguments** (optional): A list of arguments to pass to the function. This + list is serialized to a string using |string()| and deserialized using + |eval()|. + +- **callback** (optional): The name of a Vim function to call in the parent + process when the child process has completed (a string). + +- **clientserver** (optional): If this is true (1) the child process will + notify the parent process when it has finished (the default is true). This + works using Vim's client/server support which is not always available. As a + fall back Vim's |CursorHold| automatic command is also supported (although + the effect is not quite as instantaneous :-). + +This functionality is experimental and non trivial to use, so consider yourself +warned :-). + +**Limitations** + +I'm making this functionality available in vim-misc [5] because I think it can +be useful to other plug-ins, however if you are going to use it you should be +aware of the following limitations: + +- Because of the use of multiple processes this functionality is only + suitable for 'heavy' tasks. + +- The function arguments are serialized to a string which is passed to the + hidden Vim process as a command line argument, so the amount of data you + can pass will be limited by your operating environment. + +- The hidden Vim process is explicitly isolated from the user in several ways + (see below for more details). This is to make sure that the hidden Vim + processes are fast and don't clobber the user's editing sessions in any + way. + +**Changes to how Vim normally works** + +You have to be aware that the hidden Vim process is initialized in a specific +way that is very different from your regular Vim editing sessions: + +- Your |vimrc| file is ignored using the '-u NONE' command line option. + +- Your |gvimrc| file (if you even knew it existed ;-) is ignored using the + '-U NONE' command line option. + +- Plug-in loading is skipped using the '--noplugin' command line option. + +- Swap files (see |swap-file|) are disabled using the '-n' command line + option. This makes sure asynchronous Vim processes don't disturb the user's + editing session. + +- Your |viminfo| file is ignored using the '-i NONE' command line option. + Just like with swap files this makes sure asynchronous Vim processes don't + disturb the user's editing session. + +- No-compatible mode is enabled using the '-N' command line option (usually + the existence of your vimrc script would have achieved the same effect but + since we disable loading of your vimrc we need to spell things out for + Vim). + +**Use an auto-load function** + +The function you want to call is identified by its name which has to be +defined, but I just explained above that all regular initialization is disabled +for asynchronous Vim processes, so what gives? The answer is to use an +|autoload| function. This should work fine because the asynchronous Vim process +'inherits' the value of the |'runtimepath'| option from your editing session. + +------------------------------------------------------------------------------- +The *xolox#misc#async#inside_child()* function + +Entry point inside the hidden Vim process that runs in the background. Invoked +indirectly by |xolox#misc#async#call()| because it runs a command similar to +the following: +> + vim --cmd 'call xolox#misc#async#inside_child(...)' +< +This function is responsible for calling the user defined function, capturing +exceptions and reporting the results back to the parent Vim process using Vim's +client/server support or a temporary file. + +------------------------------------------------------------------------------- +The *xolox#misc#async#callback_to_parent()* function + +When Vim was compiled with client/server support this function (in the parent +process) will be called by |xolox#misc#async#inside_child()| (in the child +process) after the user defined function has returned. This enables more or +less instant callbacks after running an asynchronous function. + +------------------------------------------------------------------------------- +The *xolox#misc#async#periodic_callback()* function + +When client/server support is not being used the vim-misc plug-in improvises: +It uses Vim's |CursorHold| event to periodically check if an asynchronous +process has written its results to one of the expected temporary files. If a +response is found the temporary file is read and deleted and then +|xolox#misc#async#callback_to_parent()| is called to process the response. + +------------------------------------------------------------------------------- + *misc-handling-of-special-buffers* +Handling of special buffers ~ + +The functions defined here make it easier to deal with special Vim buffers that +contain text generated by a Vim plug-in. For example my vim-notes plug-in [6] +generates several such buffers: + +- :RecentNotes [7] lists recently modified notes +- :ShowTaggedNotes [8] lists notes grouped by tags +- etc. + +Because the text in these buffers is generated, Vim shouldn't bother with swap +files and it should never prompt the user whether to save changes to the +generated text. + +------------------------------------------------------------------------------- +The *xolox#misc#buffer#is_empty()* function + +Checks if the current buffer is an empty, unchanged buffer which can be reused. +Returns 1 if an empty buffer is found, 0 otherwise. + +------------------------------------------------------------------------------- +The *xolox#misc#buffer#prepare()* function + +Open a special buffer, i.e. a buffer that will hold generated contents, not +directly edited by the user. The buffer can be customized by passing a +dictionary with the following key/value pairs as the first argument: + +- **name** (required): The base name of the buffer (i.e. the base name of the + file loaded in the buffer, even though it isn't really a file and nothing + is really 'loaded' :-) + +- **path** (required): The pathname of the buffer. May be relevant if |:lcd| + or |'autochdir'| is being used. + +------------------------------------------------------------------------------- +The *xolox#misc#buffer#lock()* function + +Lock a special buffer so that its contents can no longer be edited. + +------------------------------------------------------------------------------- +The *xolox#misc#buffer#unlock()* function + +Unlock a special buffer so that its content can be updated. + +------------------------------------------------------------------------------- + *misc-tab-completion-for-user-defined-commands* +Tab completion for user defined commands ~ + +------------------------------------------------------------------------------- +The *xolox#misc#complete#keywords()* function + +This function can be used to perform keyword completion for user defined Vim +commands based on the contents of the current buffer. Here's an example of how +you would use it: +> + :command -nargs=* -complete=customlist,xolox#misc#complete#keywords MyCmd call s:MyCmd() +< +------------------------------------------------------------------------------- + *misc-rate-limiting-for-vims-cursorhold-event* +Rate limiting for Vim's CursorHold event ~ + +Several of my Vim plug-ins (e.g. vim-easytags [4], vim-notes [6] and vim- +session [9]) use Vim's |CursorHold| and |CursorHoldI| events to perform +periodic tasks when the user doesn't press any keys for a couple of seconds. +These events by default fire after four seconds, this is configurable using +Vim's |'updatetime'| option. The problem that this script solves is that there +are Vim plug-ins which set the |'updatetime'| option to unreasonably low +values, thereby breaking my Vim plug-ins and probably a lot of other Vim plug- +ins out there. When users complain about this I can tell them that another Vim +plug-in is to blame, but users don't care for the difference, their Vim is +broken! So I implemented a workaround. This script enables registration of +|CursorHold| event handlers with a configurable interval (expressed in +seconds). The event handlers will be called no more than once every interval. + +------------------------------------------------------------------------------- +The *xolox#misc#cursorhold#register()* function + +Register a |CursorHold| event handler with a custom interval. This function +takes a single argument which is a dictionary with the following fields: + +- **function** (required): The name of the event handler function (a string). + +- **arguments** (optional): A list of arguments to pass to the event handler + function (defaults to an empty list). + +- **interval** (optional): The number of seconds between calls to the event + handler (defaults to 4). + +------------------------------------------------------------------------------- +The *xolox#misc#cursorhold#autocmd()* function + +The 'top level event handler' that's called by Vim whenever the |CursorHold| or +|CursorHoldI| event fires. It iterates through the event handlers registered +using |xolox#misc#cursorhold#register()| and calls each event handler at the +appropriate interval, keeping track of the time when each event handler was +last run. + +------------------------------------------------------------------------------- + *misc-string-escaping-functions* +String escaping functions ~ + +------------------------------------------------------------------------------- +The *xolox#misc#escape#pattern()* function + +Takes a single string argument and converts it into a |:substitute| / +|substitute()| pattern string that matches the given string literally. + +------------------------------------------------------------------------------- +The *xolox#misc#escape#substitute()* function + +Takes a single string argument and converts it into a |:substitute| / +|substitute()| replacement string that inserts the given string literally. + +------------------------------------------------------------------------------- +The *xolox#misc#escape#shell()* function + +Takes a single string argument and converts it into a quoted command line +argument. + +I was going to add a long rant here about Vim's |'shellslash'| option, but +really, it won't make any difference. Let's just suffice to say that I have yet +to encounter a single person out there who uses this option for its intended +purpose (running a UNIX style shell on Microsoft Windows). + +------------------------------------------------------------------------------- + *misc-human-friendly-string-formatting-for-vim* +Human friendly string formatting for Vim ~ + +------------------------------------------------------------------------------- +The *xolox#misc#format#pluralize()* function + +Concatenate a counter (the first argument, expected to be an integer) with a +singular or plural label (the second and third arguments, both expected to be +strings). + +------------------------------------------------------------------------------- +The *xolox#misc#format#timestamp()* function + +Format a time stamp (a string containing a formatted floating point number) +into a human friendly format, for example 70 seconds is phrased as "1 minute +and 10 seconds". + +------------------------------------------------------------------------------- + *misc-list-handling-functions* +List handling functions ~ + +------------------------------------------------------------------------------- +The *xolox#misc#list#unique()* function + +Remove duplicate values from the given list in-place (preserves order). + +------------------------------------------------------------------------------- +The *xolox#misc#list#binsert()* function + +Performs in-place binary insertion, which depending on your use case can be +more efficient than calling Vim's |sort()| function after each insertion (in +cases where a single, final sort is not an option). Expects three arguments: + +1. A list +2. A value to insert +3. 1 (true) when case should be ignored, 0 (false) otherwise + +------------------------------------------------------------------------------- + *misc-functions-to-interact-with-user* +Functions to interact with the user ~ + +------------------------------------------------------------------------------- +The *xolox#misc#msg#info()* function + +Show a formatted informational message to the user. + +This function has the same argument handling as Vim's |printf()| function with +one notable difference: Any arguments which are not numbers or strings are +coerced to strings using Vim's |string()| function. + +In the case of |xolox#misc#msg#info()|, automatic string coercion simply makes +the function a bit easier to use. + +The messages emitted by this function have no highlighting. Previously these +messages were highlighted using the Title group (see |hl-Title|), but it was +pointed out in pull request 16 [10] that this group shouldn't be used for +informational messages because it is meant for titles and because of this some +color schemes use colors that stand out quite a bit, causing the informational +messages to look like errors. + +------------------------------------------------------------------------------- +The *xolox#misc#msg#warn()* function + +Show a formatted warning message to the user. + +This function has the same argument handling as the |xolox#misc#msg#info()| +function. + +------------------------------------------------------------------------------- +The *xolox#misc#msg#debug()* function + +Show a formatted debugging message to the user, _if the user has enabled +increased verbosity by setting Vim's |'verbose'| option to one (1) or higher_. + +This function has the same argument handling as the |xolox#misc#msg#info()| +function. + +In the case of |xolox#misc#msg#debug()|, automatic string coercion provides +lazy evaluation in the sense that complex data structures are only converted to +strings when the user has enabled increased verbosity. + +------------------------------------------------------------------------------- + *misc-integration-between-vim-its-environment* +Integration between Vim and its environment ~ + +------------------------------------------------------------------------------- +The *xolox#misc#open#file()* function + +Given a pathname or URL as the first argument, this opens the file with the +program associated with the file type. So for example a text file might open in +Vim, an '*.html' file would probably open in your web browser and a media file +would open in a media player. + +This should work on Windows, Mac OS X and most Linux distributions. If this +fails to find a file association, you can pass one or more external commands to +try as additional arguments. For example: +> + :call xolox#misc#open#file('/path/to/my/file', 'firefox', 'google-chrome') +< +This generally shouldn't be necessary but it might come in handy now and then. + +------------------------------------------------------------------------------- +The *xolox#misc#open#url()* function + +Given a URL as the first argument, this opens the URL in your preferred or best +available web browser: + +- In GUI environments a graphical web browser will open (or a new tab will be + created in an existing window) + +- In console Vim without a GUI environment, when you have any of 'lynx', + 'links' or 'w3m' installed it will launch a command line web browser in + front of Vim (temporarily suspending Vim) + +------------------------------------------------------------------------------- + *misc-vim-plug-in-option-handling* +Vim and plug-in option handling ~ + +------------------------------------------------------------------------------- +The *xolox#misc#option#get()* function + +Expects one or two arguments: 1. The name of a variable and 2. the default +value if the variable does not exist. + +Returns the value of the variable from a buffer local variable, global variable +or the default value, depending on which is defined. + +This is used by some of my Vim plug-ins for option handling, so that users can +customize options for specific buffers. + +------------------------------------------------------------------------------- +The *xolox#misc#option#split()* function + +Given a multi-value Vim option like |'runtimepath'| this returns a list of +strings. For example: +> + :echo xolox#misc#option#split(&runtimepath) + ['/home/peter/Projects/Vim/misc', + '/home/peter/Projects/Vim/colorscheme-switcher', + '/home/peter/Projects/Vim/easytags', + ...] +< +------------------------------------------------------------------------------- +The *xolox#misc#option#join()* function + +Given a list of strings like the ones returned by |xolox#misc#option#split()|, +this joins the strings together into a single value that can be used to set a +Vim option. + +------------------------------------------------------------------------------- +The *xolox#misc#option#split_tags()* function + +Customized version of |xolox#misc#option#split()| with specialized handling for +Vim's |'tags'| option. + +------------------------------------------------------------------------------- +The *xolox#misc#option#join_tags()* function + +Customized version of |xolox#misc#option#join()| with specialized handling for +Vim's |'tags'| option. + +------------------------------------------------------------------------------- +The *xolox#misc#option#eval_tags()* function + +Evaluate Vim's |'tags'| option without looking at the file system, i.e. this +will report tags files that don't exist yet. Expects the value of the |'tags'| +option as the first argument. If the optional second argument is 1 (true) only +the first match is returned, otherwise (so by default) a list with all matches +is returned. + +------------------------------------------------------------------------------- + *misc-operating-system-interfaces* +Operating system interfaces ~ + +------------------------------------------------------------------------------- +The *xolox#misc#os#is_mac()* function + +Returns 1 (true) when on Mac OS X, 0 (false) otherwise. You would expect this +to simply check the Vim feature list, but for some obscure reason the +'/usr/bin/vim' included in Mac OS X (verified on version 10.7.5) returns 0 +(false) in response to "has('mac')", so we check the output of 'uname' to avoid +false negatives. + +------------------------------------------------------------------------------- +The *xolox#misc#os#is_win()* function + +Returns 1 (true) when on Microsoft Windows, 0 (false) otherwise. + +------------------------------------------------------------------------------- +The *xolox#misc#os#find_vim()* function + +Returns the program name of Vim as a string. On Windows and UNIX this just +|v:progname| as an absolute pathname while on Mac OS X there is some special +magic to find MacVim's executable even though it's usually not on the +executable search path. If you want, you can override the value returned from +this function by setting the global variable 'g:xolox#misc#os#vim_progname'. + +By default the choice of console Vim vs graphical Vim is made based on the +value of |v:progname|, but if you have a preference you can pass the string +'vim' or 'gvim' as the first and only argument. + +------------------------------------------------------------------------------- +The *xolox#misc#os#exec()* function + +Execute an external command (hiding the console on Microsoft Windows when my +vim-shell plug-in [11] is installed). + +Expects a dictionary with the following key/value pairs as the first argument: + +- **command** (required): The command line to execute + +- **async** (optional): set this to 1 (true) to execute the command in the + background (asynchronously) + +- **stdin** (optional): a string or list of strings with the input for the + external command + +- **check** (optional): set this to 0 (false) to disable checking of the exit + code of the external command (by default an exception will be raised when + the command fails) + +Returns a dictionary with one or more of the following key/value pairs: + +- **command** (always available): the generated command line that was used to + run the external command + +- **exit_code** (only in synchronous mode): the exit status of the external + command (an integer, zero on success) + +- **stdout** (only in synchronous mode): the output of the command on the + standard output stream (a list of strings, one for each line) + +- **stderr** (only in synchronous mode): the output of the command on the + standard error stream (as a list of strings, one for each line) + +------------------------------------------------------------------------------- +The *xolox#misc#os#can_use_dll()* function + +If a) we're on Microsoft Windows, b) the vim-shell plug-in is installed and c) +the compiled DLL included in vim-shell works, we can use the vim-shell plug-in +to execute external commands! Returns 1 (true) if we can use the DLL, 0 (false) +otherwise. + +------------------------------------------------------------------------------- + *misc-pathname-manipulation-functions* +Pathname manipulation functions ~ + +------------------------------------------------------------------------------- +The *xolox#misc#path#which()* function + +Scan the executable search path ('$PATH') for one or more external programs. +Expects one or more string arguments with program names. Returns a list with +the absolute pathnames of all found programs. Here's an example: +> + :echo xolox#misc#path#which('gvim', 'vim') + ['/usr/local/bin/gvim', + '/usr/bin/gvim', + '/usr/local/bin/vim', + '/usr/bin/vim'] +< +------------------------------------------------------------------------------- +The *xolox#misc#path#split()* function + +Split a pathname (the first and only argument) into a list of pathname +components. + +On Windows, pathnames starting with two slashes or backslashes are UNC paths +where the leading slashes are significant... In this case we split like this: + +- Input: "'//server/share/directory'" +- Result: "['//server', 'share', 'directory']" + +Everything except Windows is treated like UNIX until someone has a better +suggestion :-). In this case we split like this: + +- Input: "'/foo/bar/baz'" +- Result: "['/', 'foo', 'bar', 'baz']" + +To join a list of pathname components back into a single pathname string, use +the |xolox#misc#path#join()| function. + +------------------------------------------------------------------------------- +The *xolox#misc#path#join()* function + +Join a list of pathname components (the first and only argument) into a single +pathname string. This is the counterpart to the |xolox#misc#path#split()| +function and it expects a list of pathname components as returned by +|xolox#misc#path#split()|. + +------------------------------------------------------------------------------- +The *xolox#misc#path#directory_separator()* function + +Find the preferred directory separator for the platform and settings. + +------------------------------------------------------------------------------- +The *xolox#misc#path#absolute()* function + +Canonicalize and resolve a pathname, _regardless of whether it exists_. This is +intended to support string comparison to determine whether two pathnames point +to the same directory or file. + +------------------------------------------------------------------------------- +The *xolox#misc#path#relative()* function + +Make an absolute pathname (the first argument) relative to a directory (the +second argument). + +------------------------------------------------------------------------------- +The *xolox#misc#path#merge()* function + +Join a directory pathname and filename into a single pathname. + +------------------------------------------------------------------------------- +The *xolox#misc#path#commonprefix()* function + +Find the common prefix of path components in a list of pathnames. + +------------------------------------------------------------------------------- +The *xolox#misc#path#starts_with()* function + +Check whether the first pathname starts with the second pathname (expected to +be a directory). This does not perform a regular string comparison; first it +normalizes both pathnames, then it splits them into their pathname segments and +then it compares the segments. + +------------------------------------------------------------------------------- +The *xolox#misc#path#encode()* function + +Encode a pathname so it can be used as a filename. This uses URL encoding to +encode special characters. + +------------------------------------------------------------------------------- +The *xolox#misc#path#decode()* function + +Decode a pathname previously encoded with |xolox#misc#path#encode()|. + +------------------------------------------------------------------------------- +The *xolox#misc#path#is_relative()* function + +Returns true (1) when the pathname given as the first argument is relative, +false (0) otherwise. + +------------------------------------------------------------------------------- +The *xolox#misc#path#tempdir()* function + +Create a temporary directory and return the pathname of the directory. + +------------------------------------------------------------------------------- + *misc-manipulation-of-unix-file-permissions* +Manipulation of UNIX file permissions ~ + +Vim's |writefile()| function cannot set file permissions for newly created +files and although Vim script has a function to get file permissions (see +|getfperm()|) there is no equivalent for changing a file's permissions. + +This omission breaks the otherwise very useful idiom of updating a file by +writing its new contents to a temporary file and then renaming the temporary +file into place (which is as close as you're going to get to atomically +updating a file's contents on UNIX) because the file's permissions will not be +preserved! + +**Here's a practical example:** My vim-easytags [4] plug-in writes tags file +updates to a temporary file and renames the temporary file into place. When I +use 'sudo -s' on Ubuntu Linux it preserves my environment variables so my +'~/.vimrc' and the vim-easytags [4] plug-in are still loaded. Now when a tags +file is written the file becomes owned by root (my effective user id in the +'sudo' session). Once I leave the 'sudo' session I can no longer update my tags +file because it's now owned by root … ಠ_ಠ + +------------------------------------------------------------------------------- +The *xolox#misc#perm#update()* function + +Atomically update a file's contents while preserving the owner, group and mode. +The first argument is the pathname of the file to update (a string). The second +argument is the list of lines to be written to the file. Writes the new +contents to a temporary file and renames the temporary file into place, thereby +preventing readers from reading a partially written file. Returns 1 if the file +is successfully updated, 0 otherwise. + +Note that if |xolox#misc#perm#get()| and |xolox#misc#perm#set()| cannot be used +to preserve the file owner/group/mode the file is still updated using a rename +(for compatibility with non-UNIX systems and incompatible '/usr/bin/stat' +implementations) so in that case you can still lose the file's +owner/group/mode. + +------------------------------------------------------------------------------- +The *xolox#misc#perm#get()* function + +Get the owner, group and permissions of the pathname given as the first +argument. Returns an opaque value which you can later pass to +|xolox#misc#perm#set()|. + +------------------------------------------------------------------------------- +The *xolox#misc#perm#set()* function + +Set the permissions (the second argument) of the pathname given as the first +argument. Expects a permissions value created by |xolox#misc#perm#get()|. + +------------------------------------------------------------------------------- + *misc-persist-recall-vim-values-from-to-files* +Persist/recall Vim values from/to files ~ + +Vim's |string()| function can be used to serialize Vim script values like +numbers, strings, lists, dictionaries and composites of them to a string which +can later be evaluated using the |eval()| function to turn it back into the +original value. This Vim script provides functions to use these functions to +persist and recall Vim values from/to files. This is very useful for +communication between (possibly concurrent) Vim processes. + +------------------------------------------------------------------------------- +The *xolox#misc#persist#load()* function + +Read a Vim value like a number, string, list or dictionary from a file using +|readfile()| and |eval()|. The first argument is the filename of the file to +read (a string). The optional second argument specifies the default value which +is returned when the file can't be loaded. This function returns the loaded +value or the default value (which itself defaults to the integer 0). + +------------------------------------------------------------------------------- +The *xolox#misc#persist#save()* function + +Write a Vim value like a number, string, list or dictionary to a file using +|string()| and |writefile()|. The first argument is the filename of the file to +write (a string) and the second argument is the value to write (any value). + +This function writes the serialized value to an intermediate file which is then +renamed into place atomically. This avoids issues with concurrent processes +where for example a producer has written a partial file which is read by a +consumer before the file is complete. In this case the consumer would read a +corrupt value. The rename trick avoids this problem. + +------------------------------------------------------------------------------- + *misc-string-handling* +String handling ~ + +------------------------------------------------------------------------------- +The *xolox#misc#str#slug()* function + +Convert a string to a "slug" - something that can be safely used in filenames +and URLs without worrying about quoting/escaping of special characters. + +------------------------------------------------------------------------------- +The *xolox#misc#str#ucfirst()* function + +Uppercase the first character in a string (the first argument). + +------------------------------------------------------------------------------- +The *xolox#misc#str#unescape()* function + +Remove back slash escapes from a string (the first argument). + +------------------------------------------------------------------------------- +The *xolox#misc#str#compact()* function + +Compact whitespace in a string (the first argument). + +------------------------------------------------------------------------------- +The *xolox#misc#str#trim()* function + +Trim all whitespace from the start and end of a string (the first argument). + +------------------------------------------------------------------------------- +The *xolox#misc#str#indent()* function + +Indent all lines in a multi-line string (the first argument) with a specific +number of _space characters_ (the second argument, an integer). + +------------------------------------------------------------------------------- +The *xolox#misc#str#dedent()* function + +Remove common whitespace from a multi line string. + +------------------------------------------------------------------------------- + *misc-test-runner-infrastructure-for-vim-plug-ins* +Test runner & infrastructure for Vim plug-ins ~ + +The Vim auto-load script 'autoload/xolox/misc/test.vim' contains infrastructure +that can be used to run an automated Vim plug-in test suite. It provides a +framework for running test functions, keeping track of the test status, making +assertions and reporting test results to the user. + +------------------------------------------------------------------------------- +The *xolox#misc#test#reset()* function + +Reset counters for executed tests and passed/failed assertions. + +------------------------------------------------------------------------------- +The *xolox#misc#test#summarize()* function + +Print a summary of test results, to be interpreted interactively. + +------------------------------------------------------------------------------- +The *xolox#misc#test#wrap()* function + +Call a function in a try/catch block and prevent exceptions from bubbling. The +name of the function should be passed as the first and only argument; it should +be a string containing the name of a Vim auto-load function. + +------------------------------------------------------------------------------- +The *xolox#misc#test#passed()* function + +Record a test which succeeded. + +------------------------------------------------------------------------------- +The *xolox#misc#test#failed()* function + +Record a test which failed. + +------------------------------------------------------------------------------- +The *xolox#misc#test#assert_true()* function + +Check whether an expression is true. + +------------------------------------------------------------------------------- +The *xolox#misc#test#assert_equals()* function + +Check whether two values are the same. + +------------------------------------------------------------------------------- +The *xolox#misc#test#assert_same_type()* function + +Check whether two values are of the same type. + +------------------------------------------------------------------------------- + *tests-for-miscellaneous-vim-scripts* +Tests for the miscellaneous Vim scripts ~ + +The Vim auto-load script 'autoload/xolox/misc/tests.vim' contains the automated +test suite of the miscellaneous Vim scripts. Right now the coverage is not very +high yet, but this will improve over time. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#run()* function + +Run the automated test suite of the miscellaneous Vim scripts. To be used +interactively. Intended to be safe to execute irrespective of context. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#pattern_escaping()* function + +Test escaping of regular expression patterns with +|xolox#misc#escape#pattern()|. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#substitute_escaping()* function + +Test escaping of substitution strings with |xolox#misc#escape#substitute()|. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#shell_escaping()* function + +Test escaping of shell arguments with |xolox#misc#escape#shell()|. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#making_a_list_unique()* function + +Test removing of duplicate values from lists with |xolox#misc#list#unique()|. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#binary_insertion()* function + +Test the binary insertion algorithm implemented in |xolox#misc#list#binsert()|. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#getting_configuration_options()* function + +Test getting of scoped plug-in configuration "options" with +|xolox#misc#option#get()|. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#splitting_of_multi_valued_options()* function + +Test splitting of multi-valued Vim options with |xolox#misc#option#split()|. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#joining_of_multi_valued_options()* function + +Test joining of multi-valued Vim options with |xolox#misc#option#join()|. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#finding_vim_on_the_search_path()* function + +Test looking up Vim's executable on the search path using |v:progname| with +|xolox#misc#os#find_vim()|. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#synchronous_command_execution()* function + +Test basic functionality of synchronous command execution with +|xolox#misc#os#exec()|. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#synchronous_command_execution_with_stderr()* function + +Test basic functionality of synchronous command execution with +|xolox#misc#os#exec()| including the standard error stream (not available on +Windows when vim-shell is not installed). + +------------------------------------------------------------------------------- +The *xolox#misc#tests#synchronous_command_execution_with_raising_of_errors()* +function + +Test raising of errors during synchronous command execution with +|xolox#misc#os#exec()|. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#synchronous_command_execution_without_raising_errors()* +function + +Test synchronous command execution without raising of errors with +|xolox#misc#os#exec()|. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#asynchronous_command_execution()* function + +Test the basic functionality of asynchronous command execution with +|xolox#misc#os#exec()|. This runs the external command 'mkdir' and tests that +the side effect of creating the directory takes place. This might seem like a +peculiar choice, but it's one of the few 100% portable commands (Windows + +UNIX) that doesn't involve input/output streams. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#string_case_transformation()* function + +Test string case transformation with |xolox#misc#str#ucfirst()|. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#string_whitespace_compaction()* function + +Test compaction of whitespace in strings with |xolox#misc#str#compact()|. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#string_whitespace_trimming()* function + +Test trimming of whitespace in strings with |xolox#misc#str#trim()|. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#multiline_string_dedent()* function + +Test dedenting of multi-line strings with |xolox#misc#str#dedent()|. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#version_string_parsing()* function + +Test parsing of version strings with |xolox#misc#version#parse()|. + +------------------------------------------------------------------------------- +The *xolox#misc#tests#version_string_comparison()* function + +Test comparison of version strings with |xolox#misc#version#at_least()|. + +------------------------------------------------------------------------------- + *misc-timing-of-long-during-operations* +Timing of long during operations ~ + +------------------------------------------------------------------------------- +The *xolox#misc#timer#resumable()* function + +Create a resumable timer object. This returns an object (a dictionary with +functions) with the following "methods": + +- 'start()' instructs the timer object to start counting elapsed time (when a + timer object is created it is not automatically started). + +- 'stop()' instructs the timer object to stop counting elapsed time. This + adds the time elapsed since 'start()' was last called to the total elapsed + time. This method will raise an error if called out of sequence. + +- 'format()' takes the total elapsed time and reports it as a string + containing a formatted floating point number. + +Timer objects are meant to accurately time short running operations so they're +dependent on Vim's |reltime()| and |reltimestr()| functions. In order to make +it possible to use timer objects in my Vim plug-ins unconditionally there's a +fall back to |localtime()| when |reltime()| is not available. In this mode the +timer objects are not very useful but at least they shouldn't raise errors. + +------------------------------------------------------------------------------- +The *xolox#misc#timer#start()* function + +Start a timer. This returns a list which can later be passed to +|xolox#misc#timer#stop()|. + +------------------------------------------------------------------------------- +The *xolox#misc#timer#stop()* function + +Show a formatted debugging message to the user, if the user has enabled +increased verbosity by setting Vim's |'verbose'| option to one (1) or higher. + +This function has the same argument handling as Vim's |printf()| function with +one difference: At the point where you want the elapsed time to be embedded, +you write '%s' and you pass the list returned by |xolox#misc#timer#start()| as +an argument. + +------------------------------------------------------------------------------- +The *xolox#misc#timer#force()* function + +Show a formatted message to the user. This function has the same argument +handling as Vim's |printf()| function with one difference: At the point where +you want the elapsed time to be embedded, you write '%s' and you pass the list +returned by |xolox#misc#timer#start()| as an argument. + +------------------------------------------------------------------------------- +The *xolox#misc#timer#convert()* function + +Convert the value returned by |xolox#misc#timer#start()| to a string +representation of the elapsed time since |xolox#misc#timer#start()| was called. +Other values are returned unmodified (this allows using it with Vim's |map()| +function). + +------------------------------------------------------------------------------- + *misc-version-string-handling* +Version string handling ~ + +------------------------------------------------------------------------------- +The *xolox#misc#version#parse()* function + +Convert a version string to a list of integers. + +------------------------------------------------------------------------------- +The *xolox#misc#version#at_least()* function + +Check whether the second version string is equal to or greater than the first +version string. Returns 1 (true) when it is, 0 (false) otherwise. + +=============================================================================== + *misc-contact* +Contact ~ + +If you have questions, bug reports, suggestions, etc. please open an issue or +pull request on GitHub [12]. Download links and documentation can be found on +the plug-in's homepage [13]. If you like the script please vote for it on Vim +Online [14]. + +=============================================================================== + *misc-license* +License ~ + +This software is licensed under the MIT license [15]. © 2015 Peter Odding +. + +=============================================================================== + *misc-references* +References ~ + +[1] http://peterodding.com/code/vim/ +[2] https://github.com/xolox/vim-misc/blob/master/INSTALL.md +[3] http://peterodding.com/code/vim/tools/ +[4] http://peterodding.com/code/vim/easytags/ +[5] http://peterodding.com/code/vim/misc/ +[6] http://peterodding.com/code/vim/notes/ +[7] http://peterodding.com/code/vim/notes/#recentnotes_command +[8] http://peterodding.com/code/vim/notes/#showtaggednotes_command +[9] http://peterodding.com/code/vim/session/ +[10] https://github.com/xolox/vim-misc/pull/16 +[11] http://peterodding.com/code/vim/shell/ +[12] http://github.com/xolox/vim-misc +[13] http://peterodding.com/code/vim/misc +[14] http://www.vim.org/scripts/script.php?script_id=4597 +[15] http://en.wikipedia.org/wiki/MIT_License + +vim: ft=help diff --git a/sources_non_forked/vim-misc/plugin/xolox/misc.vim b/sources_non_forked/vim-misc/plugin/xolox/misc.vim new file mode 100755 index 00000000..af65d553 --- /dev/null +++ b/sources_non_forked/vim-misc/plugin/xolox/misc.vim @@ -0,0 +1,19 @@ +" Vim plug-in +" Author: Peter Odding +" Last Change: June 21, 2014 +" URL: http://peterodding.com/code/vim/misc/ + +" Don't source the plug-in when it's already been loaded or &compatible is set. +if &cp || exists('g:loaded_xolox_misc') + finish +endif + +" Automatic commands used by the vim-misc plug-in. +augroup PluginXoloxMisc + autocmd! CursorHold,CursorHoldI * call xolox#misc#cursorhold#autocmd() +augroup END + +" Make sure the plug-in is only loaded once. +let g:loaded_xolox_misc = 1 + +" vim: ts=2 sw=2 et diff --git a/sources_non_forked/vim-session-master/.gitignore b/sources_non_forked/vim-session-master/.gitignore new file mode 100755 index 00000000..926ccaaf --- /dev/null +++ b/sources_non_forked/vim-session-master/.gitignore @@ -0,0 +1 @@ +doc/tags diff --git a/sources_non_forked/vim-session-master/INSTALL.md b/sources_non_forked/vim-session-master/INSTALL.md new file mode 100755 index 00000000..bd09f8b8 --- /dev/null +++ b/sources_non_forked/vim-session-master/INSTALL.md @@ -0,0 +1,15 @@ +# Installation instructions + +*Please note that the vim-session plug-in requires my vim-misc plug-in which is separately distributed.* + +There are two ways to install the vim-session plug-in and it's up to you which you prefer, both options are explained below. Please note that below are generic installation instructions while some Vim plug-ins may have external dependencies, please refer to the plug-in's [readme](README.md) for details. + +## Installation using ZIP archives + +Unzip the most recent ZIP archives of the [vim-session](http://peterodding.com/code/vim/downloads/session.zip) and [vim-misc](http://peterodding.com/code/vim/downloads/misc.zip) plug-ins inside your Vim profile directory (usually this is `~/.vim` on UNIX and `%USERPROFILE%\vimfiles` on Windows), restart Vim and execute the command `:helptags ~/.vim/doc` (use `:helptags ~\vimfiles\doc` instead on Windows). + +If you get warnings about overwriting existing files while unpacking the ZIP archives you probably don't need to worry about this because it's most likely caused by files like `README.md`, `INSTALL.md` and `addon-info.json`. If these files bother you then you can remove them after unpacking the ZIP archives, they are not required to use the plug-in. + +## Installation using a Vim plug-in manager + +If you prefer you can also use [Pathogen](http://www.vim.org/scripts/script.php?script_id=2332), [Vundle](https://github.com/gmarik/vundle) or a similar tool to install and update the [vim-session](https://github.com/xolox/vim-session) and [vim-misc](https://github.com/xolox/vim-misc) plug-ins using local clones of the git repositories. This takes a bit of work to set up the first time but it makes updating much easier, and it keeps each plug-in in its own directory which helps to keep your Vim profile uncluttered. diff --git a/sources_non_forked/vim-session-master/README.md b/sources_non_forked/vim-session-master/README.md new file mode 100755 index 00000000..c38edaf1 --- /dev/null +++ b/sources_non_forked/vim-session-master/README.md @@ -0,0 +1,646 @@ +# Extended session management for Vim + +The vim-session plug-in improves upon [Vim](http://www.vim.org/)'s built-in [:mksession][mksession] command by enabling you to easily and (if you want) automatically persist and restore your Vim editing sessions. It works by generating a [Vim script](http://vimdoc.sourceforge.net/htmldoc/usr_41.html#script) that restores your current settings and the arrangement of tab pages and/or split windows and the files they contain. + +To persist your current editing session you can execute the `:SaveSession` command. If you don't provide a name for the session 'default' is used (you can change this name with an option). You're free to use whatever characters you like in session names. When you want to restore your session simply execute `:OpenSession`. Again the name 'default' is used if you don't provide one. When a session is active, has been changed and you quit Vim you'll be prompted whether you want to save the open session before quitting Vim: + +![Screenshot of auto-save prompt](https://raw.githubusercontent.com/xolox/vim-session/master/screenshots/session-save-prompt.png) + +If you want, the plug-in can also automatically save your session every few minutes (see the `g:session_autosave_periodic` option). When you start Vim without editing any files and the default session exists, you'll be prompted whether you want to restore the default session: + +![Screenshot of auto-open prompt](https://raw.githubusercontent.com/xolox/vim-session/master/screenshots/session-restore-prompt.png) + +When you start Vim with a custom [server name](http://vimdoc.sourceforge.net/htmldoc/remote.html#--servername) that matches one of the existing session names then the matching session will be automatically restored. For example I use several sessions to quickly edit my Vim plug-ins: + + $ gvim --servername easytags-plugin + $ gvim --servername session-plugin + $ # etc. + +The session scripts created by this plug-in are stored in the directory `~/.vim/sessions` (on UNIX) or `~\vimfiles\sessions` (on Windows) but you can change the location by setting `g:session_directory`. If you're curious what the session scripts generated by vim-session look like see the [sample below](http://peterodding.com/code/vim/session/#sample_session_script). + +If you're still getting to know the plug-in, the "Sessions" menu may help: It contains menu items for most commands defined by the plug-in. + +## Installation + +Please refer to the [installation instructions] [howto-install] available on GitHub. Once you've installed the plug-in the commands below will be available to you. + +## Commands + +Note that environment variables inside command arguments are expanded by the plug-in. + +### The `:SaveSession` command + +This command saves your current editing session just like Vim's built-in [:mksession][mksession] command does. The difference is that you don't pass a full pathname as argument but just a name, any name really. Press `` to get completion of existing session names. If you don't provide an argument the default session name is used, unless an existing session is open in which case the name of that session will be used. + +If the session you're trying to save is already active in another Vim instance you'll get a warning and nothing happens. You can use a bang (!) as in `:SaveSession! ...` to ignore the warning and save the session anyway. + +Your session script will be saved in the directory pointed to by the `g:session_directory` option. + +### The `:OpenSession` command + +This command is basically [:source][source] in disguise, but it supports tab completion of session names and it executes `:CloseSession` before opening the session. When you don't provide a session name and only a single session exists then that session is opened, otherwise the plug-in will ask you to select one from a list: + + Please select the session to restore: + + 1. vim-profile + 2. session-plugin + 3. etc. + + Type number and or click with mouse (empty cancels): + +If the session you're trying to open is already active in another Vim instance you'll get a warning and nothing happens. You can use a bang (!) as in `:OpenSession! ...` to ignore the warning and open the session anyway. + +Note also that when you use a bang (!) right after the command name existing tab pages and windows are closed, discarding any changes in the files you were editing! + +### The `:RestartVim` command + +This command saves your current editing session, restarts Vim and restores your editing session. This can come in handy when you're debugging Vim scripts which can't be easily/safely [reloaded using a more lightweight approach](http://peterodding.com/code/vim/reload/). It should work fine on Windows and UNIX alike but because of technical limitations it only works in graphical Vim. + +Any commands following the `:RestartVim` command are intercepted and executed after Vim is restarted and your session has been restored. This makes it easy to perform manual tests which involve restarting Vim, e.g. `:RestartVim | edit /path/to/file | call MyTest()`. + +### The `:CloseSession` command + +This command closes all but the current tab page and window and then edits a new, empty buffer. If a session is loaded when you execute this command the plug-in will first ask you whether you want to save that session. + +Note that when you use a bang (!) right after the command name existing tab pages and windows are closed, discarding any changes in the files you were editing! + +### The `:DeleteSession` command + +Using this command you can delete any of the sessions created by this plug-in. If the session you are trying to delete is currently active in another Vim instance you'll get a warning and nothing happens. You can use a bang (!) as in `:DeleteSession! ...` to ignore the warning and delete the session anyway. + +Note that this command only deletes the session script, it leaves your open tab pages and windows exactly as they were. + +### The `:ViewSession` command + +Execute this command to view the Vim script generated for a session. This command is useful when you need to review the generated Vim script repeatedly, for example while debugging or modifying the vim-session plug-in. + +### Tab scoped sessions + +When ['sessionoptions'] [sessionoptions] contains 'tabpages' (this is the default) session scripts will persist and restore all windows in all tab pages. When you remove 'tabpages' from ['sessionoptions'] [sessionoptions] you get a sort of light-weight sessions: They are constrained to a single tab page. Vim's [:mksession] [mksession] command and the vim-session plug-in both fully support this. + +You can change ['sessionoptions'] [sessionoptions] in your [vimrc script] [vimrc] but then you can never save a session including tab pages. To decide on the spot whether you want a global or tab scoped session, the vim-session plug-in defines the three commands documented below. + +Note that tab scoped sessions are regular session scripts, so when you load a tab scoped session using `:OpenSession` instead of `:OpenTabSession` the vim-session plug-in *assumes* it is a global session and will close all active tab pages before opening the tab scoped session. + +#### The `:OpenTabSession` command + +Just like `:OpenSession` but applies only to the current tab page. + +#### The `:SaveTabSession` command + +Just like `:SaveSession` but applies only to the current tab page. + +#### The `:AppendTabSession` command + +This command opens a new tab page and loads the given tab scoped session in that tab page. You can give this command a count just like [:tabnew] [tabnew]. + +#### The `:CloseTabSession` command + +Just like `:CloseSession` but applies only to the current tab page. + +## Options + +The following Vim options and plug-in options (global variables) can be used to configure the plug-in to your preferences. + +### The `sessionoptions` setting + +Because the vim-session plug-in uses Vim's [:mksession][mksession] command you can change how it works by setting ['sessionoptions'][sessionoptions] in your [vimrc script] [vimrc], for example: + + " If you only want to save the current tab page: + set sessionoptions-=tabpages + + " If you don't want help windows to be restored: + set sessionoptions-=help + +A lot of people don't like Vim's default behavior of saving hidden and unloaded buffers in sessions (which vim-session inherits due to the use of [:mksession][mksession]). To disable this behavior you can add the following line to your [vimrc script] [vimrc]: + + " Don't save hidden and unloaded buffers in sessions. + set sessionoptions-=buffers + +Note that the vim-session plug-in automatically and unconditionally executes the following change just before saving a session: + + " Don't persist options and mappings because it can corrupt sessions. + set sessionoptions-=options + +### The `g:session_directory` option + +This option controls the location of your session scripts. Its default value is `~/.vim/sessions` (on UNIX) or `~\vimfiles\sessions` (on Windows). If you don't mind the default you don't have to do anything; the directory will be created for you. Note that a leading `~` is expanded to your current home directory (`$HOME` on UNIX, `%USERPROFILE%` on Windows). + +### The `g:session_lock_directory` option + +The vim-session plug-in uses lock files to prevent double loading of sessions. The default location (directory) of these lock files depends on a couple of factors: + +1. If you have explicitly set the `g:session_lock_directory` option that defines the directory. +2. If the directory `/var/lock` exists and is writable that is used as a sane default. +3. As a sane fall back for platforms where `/var/lock` is not available the directory that stores the session scripts themselves is used. + +### The `g:session_lock_enabled` option + +Depending on your workflow locking of editing sessions can get annoying at times, so if you don't care about opening a session more than once and potentially "losing a version of your session" then you can use this option to completely disable session locking as follows: + + " Disable all session locking - I know what I'm doing :-). + let g:session_lock_enabled = 0 + +### The `g:session_default_name` option + +The name of the default session without directory or filename extension (you'll never guess what the default is). + +### The `g:session_default_overwrite` option + +If you set this to true (1), every Vim instance without an explicit session loaded will overwrite the default session (the last Vim instance wins). + +### The `g:session_extension` option + +The filename extension of session scripts. This should include the dot that separates the basename from the extension. Defaults to '.vim'. + +### The `g:session_autoload` option + +By default this option is set to `'prompt'`. This means that when you start Vim without opening any files and the default session script exists, the session plug-in will ask whether you want to restore your default session. When you set this option to `'yes'` and you start Vim without opening any files the default session will be restored without a prompt. To completely disable automatic loading you can set this option to `'no'`. + +### The `g:session_autosave` option + +By default this option is set to `'prompt'`. When you've opened a session and you quit Vim, the session plug-in will ask whether you want to save the changes to your session. Set this option to `'yes'` to always automatically save open sessions when you quit Vim. To completely disable automatic saving you can set this option to `'no'`. + +### The `g:session_autosave_to` option + +If `g:session_autosave` is `'yes'` and this option is a nonempty string, automatic session saving always saves to the session with the name given by `g:session_autosave_to` regardless of what the current session is or any other options. In particular, `g:session_default_overwrite` does not have any effect. By default this option isn't set so none of this applies. Refer to [pull request 81] [81] for a more detailed use case. + +### The `g:session_autosave_periodic` option + +This option sets the interval in minutes for automatic, periodic saving of active sessions. The default is zero which disables the feature. + +Note that when the plug-in automatically saves a session (because you enabled this feature) the plug-in will not prompt for your permission. + +### The `g:session_autosave_silent` option + +If you set this option to true (1) the messages normally emitted by automatic, periodic saving of active sessions are silenced. + +### The `g:session_verbose_messages` option + +The session load/save prompts are quite verbose by default because they explain how to disable the prompts. If you find the additional explanation distracting you can lower the verbosity by setting this option to 0 (false) in your [vimrc script] [vimrc]. + +### The `g:session_default_to_last` option + +By default this option is set to false (0). When you set this option to true (1) and you start Vim, the session plug-in will open your last used session instead of the default session. Note that the session plug-in will still show you the dialog asking whether you want to restore the last used session. To get rid of the dialog you have to set `g:session_autoload` to `'yes'`. + +### The `g:session_persist_font` option + +By default the plug-in will save the GUI font with the session to be reused the next time that session is loaded, this can be disabled by adding the following line to your [vimrc script] [vimrc]: + + :let g:session_persist_font = 0 + +### The `g:session_persist_colors` option + +By default the plug-in will save the color scheme and the ['background' option] [bg] with the session to be reused the next time that session is loaded, this can be disabled by adding the following line to your [vimrc script] [vimrc]: + + :let g:session_persist_colors = 0 + +### The `g:session_persist_globals` option + +The vim-session plug-in uses Vim's [:mksession] [mksession] command but it changes ['sessionoptions'][sessionoptions] so that Vim options and mappings are not persisted. The plug-in does this because persistence of options and mappings can break loading of sessions, in other words it's fragile (in my opinion). + +If you want the plug-in to persist specific global variables or options you can add their names to the list `g:session_persist_globals` in your [vimrc script] [vimrc]: + + " Persist the value of the global option 'makeprg'. + let g:session_persist_globals = ['&makeprg'] + +Because the [vimrc script] [vimrc] is loaded before the plug-in you have to define the list yourself. To persist multiple values: + + " Persist all options related to :make. + let g:session_persist_globals = ['&makeprg', '&makeef'] + +Here's how you persist global variables: (in this case the variables of the session plug-in itself :-) + + " Persist the options of the session plug-in using the session plug-in... + let g:session_persist_globals = ['&sessionoptions'] + call add(g:session_persist_globals, 'g:session_autoload') + call add(g:session_persist_globals, 'g:session_autosave') + call add(g:session_persist_globals, 'g:session_default_to_last') + call add(g:session_persist_globals, 'g:session_persist_globals') + +The example above doesn't persist the `g:session_directory` variable because this variable is used before loading a session script so persisting it inside the session script is pointless. + +### The `g:session_restart_environment` option + +This option is a list of environment variable names (without the dollar signs) that the `:RestartVim` command will pass on to the new instance of Vim. This option is only useful on UNIX. By default the three environment variables `$TERM`, `$VIM` and `$VIMRUNTIME` are included in this list. + +### The `g:session_command_aliases` option + +The names of the commands defined by the session plug-in start with the action they perform, followed by the string 'Session'. Some people prefer it the other way around because they find it easier to remember and you can type `:Session` to get completion of all available commands (actually this works with the other style as well if you type `:*Session` but I digress). If you are one of those people you can enable this option in your [vimrc script] [vimrc] like this: + + :let g:session_command_aliases = 1 + +When this option is enabled the session plug-in will define the following command aliases: + + * `SessionOpen` is an alias for `OpenSession` + * `SessionView` is an alias for `ViewSession` + * `SessionSave` is an alias for `SaveSession` + * `SessionDelete` is an alias for `DeleteSession` + * `SessionClose` is an alias for `CloseSession` + +Then there are the command aliases for tab scoped sessions: + + * `SessionTabOpen` is an alias for `OpenTabSession` + * `SessionTabSave` is an alias for `SaveTabSession` + * `SessionTabAppend` is an alias for `AppendTabSession` + * `SessionTabClose` is an alias for `CloseTabSession` + +The aliases support tab completion just like the real commands; they're exactly the same except for the names. + +When you enable the aliases, the default command names will still be available. If you really don't like them, feel free to delete them using [:delcommand] [delcommand]. + +### The `g:session_menu` option + +By default the plug-in installs a top level menu. If you don't like this you can disable it by adding the following line to your [vimrc script] [vimrc]: + + :let g:session_menu = 0 + +### The `g:session_name_suggestion_function` option + +The default completion of the `:SaveSession` command is based on the names of the existing sessions. You can add your own suggestions using this option by setting the option to the name of a Vim script function. By default this option is set to an example function that suggests the name of the current git or Mercurial feature branch (when you're working in a version control repository). + +### The `g:loaded_session` option + +This variable isn't really an option but if you want to avoid loading the vim-session plug-in you can set this variable to any value in your [vimrc script] [vimrc]: + + :let g:loaded_session = 1 + +## Compatibility with other plug-ins + +Vim's [:mksession][mksession] command isn't really compatible with plug-ins that create buffers with generated content and because of this the vim-session plug-in includes specific workarounds for a couple of popular plug-ins: + + * [BufExplorer](http://www.vim.org/scripts/script.php?script_id=42), [Conque Shell](http://www.vim.org/scripts/script.php?script_id=2771), [NERD tree](http://www.vim.org/scripts/script.php?script_id=1658), [Project](http://www.vim.org/scripts/script.php?script_id=69) and [taglist](http://www.vim.org/scripts/script.php?script_id=273) windows are supported; + * When [shell.vim](http://peterodding.com/code/vim/shell/) is installed Vim's full-screen state is persisted; + * The [netrw](http://vimdoc.sourceforge.net/htmldoc/pi_netrw.html#netrw-start) plug-in supports sessions out of the box. + +If your favorite plug-in doesn't work with the vim-session plug-in drop me a mail and I'll see what I can do. Please include a link to the plug-in in your e-mail so that I can install and test the plug-in. + +## Function reference + + + +The documentation of the 39 functions below was extracted from +2 Vim scripts on April 1, 2015 at 22:22. + +### Public API for the vim-session plug-in + +#### The `xolox#session#save_session()` function + +Save the current Vim editing session to a Vim script using the +[:mksession] [] command and some additional Vim magic provided by the +vim-session plug-in. When the generated session script is later sourced +using the [:source] [] command (possibly in another process or even on +another machine) it will restore the editing session to its previous state +(provided all of the files involved in the session are still there at +their original locations). + +The first argument is expected to be a list, it will be extended with the +lines to be added to the session script. The second argument is expected +to be the filename under which the script will later be saved (it's +embedded in a comment at the top of the script). + +[:mksession]: http://vimdoc.sourceforge.net/htmldoc/starting.html#:mksession +[:source]: http://vimdoc.sourceforge.net/htmldoc/repeat.html#:source + +#### The `xolox#session#save_globals()` function + +Serialize the values of the global variables configured by the user with +the `g:session_persist_globals` option. The first argument is expected to +be a list, it will be extended with the lines to be added to the session +script. + +#### The `xolox#session#save_features()` function + +Save the current state of the following Vim features: + +- Whether syntax highlighting is enabled (`:syntax on`) +- Whether file type detection is enabled (`:filetype on`) +- Whether file type plug-ins are enabled (`:filetype plugin on`) +- Whether file type indent plug-ins are enabled (`:filetype indent on`) + +The first argument is expected to be a list, it will be extended with the +lines to be added to the session script. + +#### The `xolox#session#save_colors()` function + +Save the current color scheme and background color. The first argument is +expected to be a list, it will be extended with the lines to be added to +the session script. + +#### The `xolox#session#save_fullscreen()` function + +Save the full screen state of Vim. This function provides integration +between my [vim-session] [] and [vim-shell] [] plug-ins. The first +argument is expected to be a list, it will be extended with the lines to +be added to the session script. + +[vim-session]: http://peterodding.com/code/vim/session +[vim-shell]: http://peterodding.com/code/vim/shell + +#### The `xolox#session#save_qflist()` function + +Save the contents of the quick-fix list. The first argument is expected to +be a list, it will be extended with the lines to be added to the session +script. + +#### The `xolox#session#save_state()` function + +Wrapper for the [:mksession] [] command that slightly massages the +generated Vim script to get rid of some strange quirks in the way Vim +generates sessions. Also implements support for buffers with content that +was generated by other Vim plug-ins. The first argument is expected to +be a list, it will be extended with the lines to be added to the session +script. + +#### The `xolox#session#save_special_windows()` function + +Implements support for buffers with content that was generated by other +Vim plug-ins. The first argument is expected to be a list, it will be +extended with the lines to be added to the session script. + +#### The `xolox#session#auto_load()` function + +Automatically load the default or last used session when Vim starts. +Normally called by the [VimEnter] [] automatic command event. + +[VimEnter]: http://vimdoc.sourceforge.net/htmldoc/autocmd.html#VimEnter + +#### The `xolox#session#is_empty()` function + +Check that the user has started Vim without editing any files. Used by +`xolox#session#auto_load()` to determine whether automatic session loading +should be performed. Currently checks the following conditions: + +1. That the current buffer is either empty (contains no lines and is not + modified) or showing [vim-startify] []. +2. That the buffer list either empty or persistent. + +[vim-startify]: https://github.com/mhinz/vim-startify/ + +#### The `xolox#session#auto_save()` function + +Automatically save the current editing session when Vim is closed. +Normally called by the [VimLeavePre] [] automatic command event. + +[VimLeavePre]: http://vimdoc.sourceforge.net/htmldoc/autocmd.html#VimLeavePre + +#### The `xolox#session#auto_save_periodic()` function + +Automatically saves the current editing session every few minutes. +Normally called by the [CursorHold] [] and [CursorHoldI] [] automatic +command events. + +[CursorHold]: http://vimdoc.sourceforge.net/htmldoc/autocmd.html#CursorHold +[CursorHoldI]: http://vimdoc.sourceforge.net/htmldoc/autocmd.html#CursorHoldI + +#### The `xolox#session#auto_unlock()` function + +Automatically unlock all sessions when Vim quits. Normally called by the +[VimLeavePre] [] automatic command event. + +[VimLeavePre]: http://vimdoc.sourceforge.net/htmldoc/autocmd.html#VimLeavePre + +#### The `xolox#session#prompt_for_name()` function + +Prompt the user to select one of the existing sessions. The first argument +is expected to be a string describing what will be done to the session +once it's been selected. Returns the name of the selected session as a +string. If no session is selected an empty string is returned. Here's +an example of what the prompt looks like: + + :call xolox#session#prompt_for_name('trash') + + Please select the session to trash: + + 1. first-session + 2. second-session + 3. third-session + + Type number and or click with mouse (empty cancels): + +If only a single session exists there's nothing to choose from so the name +of that session will be returned directly, without prompting the user. + +#### The `xolox#session#name_to_path()` function + +Convert the name of a session (the first argument, expected to be a +string) to an absolute pathname. Any special characters in the session +name will be encoded using URL encoding. This means you're free to use +whatever naming conventions you like (regardless of special characters +like slashes). Returns a string. + +#### The `xolox#session#path_to_name()` function + +Convert the absolute pathname of a session script (the first argument, +expected to be a string) to a session name. This function assumes the +absolute pathname refers to the configured session directory, but it does +not check for it nor does it require it (it simple takes the base name +of the absolute pathname of the session script and decodes it). Returns a +string. + +#### The `xolox#session#get_names()` function + +Get the names of all available sessions. This scans the directory +configured with `g:session_directory` for files that end with the suffix +configured with `g:session_extension`, takes the base name of each file +and decodes any URL encoded characters. Returns a list of strings. + +If the first argument is true (1) then the user defined function +configured with `g:session_name_suggestion_function` is called to find +suggested session names, which are prefixed to the list of available +sessions, otherwise the argument should be false (0). + +#### The `xolox#session#complete_names()` function + +Completion function for user defined Vim commands. Used by commands like +`:OpenSession` and `:DeleteSession` (but not `:SaveSession`) to support +user friendly completion. + +#### The `xolox#session#complete_names_with_suggestions()` function + +Completion function for the Vim command `:SaveSession`. + +#### The `xolox#session#is_tab_scoped()` function + +Determine whether the current session is tab scoped or global. Returns 1 +(true) when the session is tab scoped, 0 (false) otherwise. + +#### The `xolox#session#find_current_session()` function + +Find the name of the current tab scoped or global session. Returns a +string. If no session is active an empty string is returned. + +#### The `xolox#session#get_label()` function + +Get a human readable label based on the scope (tab scoped or global) and +name of a session. The first argument is the name (a string) and the +second argument is a boolean indicating the scope of the session; 1 (true) +means tab scoped and 0 (false) means global scope. Returns a string. + +#### The `xolox#session#options_include()` function + +Check whether Vim's [sessionoptions] [] option includes the keyword given +as the first argument (expected to be a string). Returns 1 (true) when it +does, 0 (false) otherwise. + +[sessionoptions]: http://vimdoc.sourceforge.net/htmldoc/options.html#'sessionoptions' + +#### The `xolox#session#include_tabs()` function + +Check whether Vim's [sessionoptions] [] option includes the `tabpages` +keyword. Returns 1 (true) when it does, 0 (false) otherwise. + +#### The `xolox#session#change_tab_options()` function + +Temporarily change Vim's [sessionoptions] [] option so we can save a tab +scoped session. Saves a copy of the original value to be restored later. + +#### The `xolox#session#restore_tab_options()` function + +Restore the original value of Vim's [sessionoptions] [] option. + +#### The `xolox#session#locking_enabled()` function + +Check whether session locking is enabled. Returns true (1) when locking is +enabled, false (0) otherwise. + +By default session locking is enabled but users can opt-out by setting +`g:session_lock_enabled` to false (0). + +### Example function for session name suggestions + +#### The `xolox#session#suggestions#vcs_feature_branch()` function + +This function implements an example of a function that can be used with +the `g:session_name_suggestion_function` option. It finds the name of the +current git or Mercurial feature branch (if any) and suggests this name as +the name for the session that is being saved with :SaveSession. Returns a +list with one string on success and an empty list on failure. + + + +## Troubleshooting + +### Using multiple platforms (multi boot, Cygwin, etc.) + +Session scripts cannot be shared between platforms because they contain absolute pathnames that most certainly won't match between e.g. Windows and Linux or even Windows and Cygwin. The best you can do is keep separate session scripts for different platforms (and I would certainly consider Cygwin a separate platform altogether :-). For more information please refer to [issue 85] [85]. + +## Contact + +If you have questions, bug reports, suggestions, etc. the author can be contacted at . The latest version is available at and . If you like the script please vote for it on [Vim Online](http://www.vim.org/scripts/script.php?script_id=3150). + +## License + +This software is licensed under the [MIT license](http://en.wikipedia.org/wiki/MIT_License). +© 2015 Peter Odding <> and Ingo Karkat. + +Thanks go out to everyone who has helped to improve the vim-session plug-in (whether through pull requests, bug reports or personal e-mails). + +## Sample session script + +Here's an example session script generated by the vim-session plug-in while I was editing the plug-in itself in Vim: + + " ~/.vim/sessions/example.vim: Vim session script. + " Created by session.vim on 30 August 2010 at 05:26:28. + " Open this file in Vim and run :source % to restore your session. + + set guioptions=aegit + set guifont=Monaco\ 13 + if exists('g:syntax_on') != 1 | syntax on | endif + if exists('g:did_load_filetypes') != 1 | filetype on | endif + if exists('g:did_load_ftplugin') != 1 | filetype plugin on | endif + if exists('g:did_indent_on') != 1 | filetype indent on | endif + if !exists('g:colors_name') || g:colors_name != 'slate' | colorscheme slate | endif + call setqflist([]) + let SessionLoad = 1 + if &cp | set nocp | endif + let s:so_save = &so | let s:siso_save = &siso | set so=0 siso=0 + let v:this_session=expand(":p") + silent only + cd ~/Development/Vim/vim-session + if expand('%') == '' && !&modified && line('$') <= 1 && getline(1) == '' + let s:wipebuf = bufnr('%') + endif + set shortmess=aoO + badd +473 ~/Development/Vim/vim-session/autoload.vim + badd +1 ~/Development/Vim/vim-session/README.md + badd +1 ~/Development/Vim/vim-session/session.vim + badd +1 ~/Development/Vim/vim-session/TODO.md + set lines=43 columns=167 + edit ~/Development/Vim/vim-session/README.md + set splitbelow splitright + set nosplitbelow + set nosplitright + wincmd t + set winheight=1 winwidth=1 + argglobal + let s:l = 28 - ((27 * winheight(0) + 21) / 42) + if s:l < 1 | let s:l = 1 | endif + exe s:l + normal! zt + 28 + normal! 0 + tabedit ~/Development/Vim/vim-session/TODO.md + set splitbelow splitright + set nosplitbelow + set nosplitright + wincmd t + set winheight=1 winwidth=1 + argglobal + let s:l = 6 - ((5 * winheight(0) + 21) / 42) + if s:l < 1 | let s:l = 1 | endif + exe s:l + normal! zt + 6 + normal! 0 + tabedit ~/Development/Vim/vim-session/session.vim + set splitbelow splitright + set nosplitbelow + set nosplitright + wincmd t + set winheight=1 winwidth=1 + argglobal + let s:l = 17 - ((16 * winheight(0) + 21) / 42) + if s:l < 1 | let s:l = 1 | endif + exe s:l + normal! zt + 17 + normal! 014l + tabedit ~/Development/Vim/vim-session/autoload.vim + set splitbelow splitright + set nosplitbelow + set nosplitright + wincmd t + set winheight=1 winwidth=1 + argglobal + let s:l = 473 - ((41 * winheight(0) + 21) / 42) + if s:l < 1 | let s:l = 1 | endif + exe s:l + normal! zt + 473 + normal! 018l + tabnext 4 + if exists('s:wipebuf') + silent exe 'bwipe ' . s:wipebuf + endif + unlet! s:wipebuf + set winheight=1 winwidth=1 shortmess=filnxtToO + let s:sx = expand(":p:r")."x.vim" + if file_readable(s:sx) + exe "source " . fnameescape(s:sx) + endif + let &so = s:so_save | let &siso = s:siso_save + doautoall SessionLoadPost + unlet SessionLoad + + +[81]: https://github.com/xolox/vim-session/pull/81 +[85]: https://github.com/xolox/vim-session/issues/85 +[bg]: http://vimdoc.sourceforge.net/htmldoc/options.html#'background' +[delcommand]: http://vimdoc.sourceforge.net/htmldoc/map.html#:delcommand +[howto-install]: https://github.com/xolox/vim-session/blob/master/INSTALL.md +[mksession]: http://vimdoc.sourceforge.net/htmldoc/starting.html#:mksession +[sessionoptions]: http://vimdoc.sourceforge.net/htmldoc/options.html#%27sessionoptions%27 +[source]: http://vimdoc.sourceforge.net/htmldoc/repeat.html#:source +[tabnew]: http://vimdoc.sourceforge.net/htmldoc/tabpage.html#:tabnew +[vimrc]: http://vimdoc.sourceforge.net/htmldoc/starting.html#vimrc diff --git a/sources_non_forked/vim-session-master/TODO.md b/sources_non_forked/vim-session-master/TODO.md new file mode 100755 index 00000000..2819b4c7 --- /dev/null +++ b/sources_non_forked/vim-session-master/TODO.md @@ -0,0 +1,5 @@ +# To-do list + + * Vim's `:mksession` command doesn't support location list windows, find a good workaround? + * Try to find a more or less generic solution to restoring buffers with content generated at runtime by Vim plug-ins like the [NERD tree](http://www.vim.org/scripts/script.php?script_id=1658) and [Tag List](http://www.vim.org/scripts/script.php?script_id=273). + * Add a [SwapExists](http://vimdoc.sourceforge.net/htmldoc/autocmd.html#SwapExists) example to the documentation which enables multiple Vim processes to edit the same files without [E325 warnings](http://vimdoc.sourceforge.net/htmldoc/usr_11.html#E325). diff --git a/sources_non_forked/vim-session-master/addon-info.json b/sources_non_forked/vim-session-master/addon-info.json new file mode 100755 index 00000000..6106cc5e --- /dev/null +++ b/sources_non_forked/vim-session-master/addon-info.json @@ -0,0 +1 @@ +{"vim_script_nr": 3150, "dependencies": {"vim-misc": {}}, "homepage": "http://peterodding.com/code/vim/session", "name": "vim-session"} \ No newline at end of file diff --git a/sources_non_forked/vim-session-master/autoload/xolox/session.vim b/sources_non_forked/vim-session-master/autoload/xolox/session.vim new file mode 100755 index 00000000..1f580044 --- /dev/null +++ b/sources_non_forked/vim-session-master/autoload/xolox/session.vim @@ -0,0 +1,1158 @@ +" Public API for the vim-session plug-in. +" +" Author: Peter Odding +" Last Change: November 1, 2015 +" URL: http://peterodding.com/code/vim/session/ + +let g:xolox#session#version = '2.13.1' + +" Public API for session persistence. {{{1 + +function! xolox#session#save_session(commands, filename) " {{{2 + " Save the current Vim editing session to a Vim script using the + " [:mksession] [] command and some additional Vim magic provided by the + " vim-session plug-in. When the generated session script is later sourced + " using the [:source] [] command (possibly in another process or even on + " another machine) it will restore the editing session to its previous state + " (provided all of the files involved in the session are still there at + " their original locations). + " + " The first argument is expected to be a list, it will be extended with the + " lines to be added to the session script. The second argument is expected + " to be the filename under which the script will later be saved (it's + " embedded in a comment at the top of the script). + " + " [:mksession]: http://vimdoc.sourceforge.net/htmldoc/starting.html#:mksession + " [:source]: http://vimdoc.sourceforge.net/htmldoc/repeat.html#:source + let is_all_tabs = xolox#session#include_tabs() + call add(a:commands, '" ' . a:filename . ':') + call add(a:commands, '" Vim session script' . (is_all_tabs ? '' : ' for a single tab page') . '.') + call add(a:commands, '" Created by session.vim ' . g:xolox#session#version . ' on ' . strftime('%d %B %Y at %H:%M:%S.')) + call add(a:commands, '" Open this file in Vim and run :source % to restore your session.') + call add(a:commands, '') + if &verbose >= 1 + call add(a:commands, 'set verbose=' . &verbose) + endif + " We save the GUI options only for global sessions, not for tab scoped + " sessions. Also, if the Vim we're currently running in doesn't have GUI + " support, Vim will report &go as an empty string. We should never persist + " this value if the user didn't specifically set it! Otherwise the next time + " the session is restored in a GUI Vim, things will look funky :-). + if has('gui') && is_all_tabs + call add(a:commands, 'set guioptions=' . escape(&go, ' "\')) + if xolox#misc#option#get('session_persist_font', 1) + call add(a:commands, 'silent! set guifont=' . escape(&gfn, ' "\')) + endif + endif + call xolox#session#save_globals(a:commands) + if is_all_tabs + call xolox#session#save_features(a:commands) + if g:session_persist_colors + call xolox#session#save_colors(a:commands) + endif + endif + call xolox#session#save_qflist(a:commands) + call xolox#session#save_state(a:commands) + if is_all_tabs + call xolox#session#save_fullscreen(a:commands) + call add(a:commands, 'doautoall SessionLoadPost') + else + call add(a:commands, 'let s:winrestcmd = winrestcmd()') + call add(a:commands, 'windo doautocmd SessionLoadPost') + call s:jump_to_window(a:commands, tabpagenr(), winnr()) + call add(a:commands, 'silent! execute s:winrestcmd') + endif + call add(a:commands, 'unlet SessionLoad') + call add(a:commands, '" vim: ft=vim ro nowrap smc=128') +endfunction + +function! xolox#session#save_globals(commands) " {{{2 + " Serialize the values of the global variables configured by the user with + " the `g:session_persist_globals` option. The first argument is expected to + " be a list, it will be extended with the lines to be added to the session + " script. + for global in g:session_persist_globals + call add(a:commands, printf("let %s = %s", global, string(eval(global)))) + endfor +endfunction + +function! xolox#session#save_features(commands) " {{{2 + " Save the current state of the following Vim features: + " + " - Whether syntax highlighting is enabled (`:syntax on`) + " - Whether file type detection is enabled (`:filetype on`) + " - Whether file type plug-ins are enabled (`:filetype plugin on`) + " - Whether file type indent plug-ins are enabled (`:filetype indent on`) + " + " The first argument is expected to be a list, it will be extended with the + " lines to be added to the session script. + let template = "if exists('%s') != %i | %s %s | endif" + for [global, command] in [ + \ ['g:syntax_on', 'syntax'], + \ ['g:did_load_filetypes', 'filetype'], + \ ['g:did_load_ftplugin', 'filetype plugin'], + \ ['g:did_indent_on', 'filetype indent']] + let active = exists(global) + let toggle = active ? 'on' : 'off' + call add(a:commands, printf(template, global, active, command, toggle)) + endfor +endfunction + +function! xolox#session#save_colors(commands) " {{{2 + " Save the current color scheme and background color. The first argument is + " expected to be a list, it will be extended with the lines to be added to + " the session script. + call add(a:commands, 'if &background != ' . string(&background)) + call add(a:commands, "\tset background=" . &background) + call add(a:commands, 'endif') + if exists('g:colors_name') && type(g:colors_name) == type('') && g:colors_name != '' + let template = "if !exists('g:colors_name') || g:colors_name != %s | colorscheme %s | endif" + call add(a:commands, printf(template, string(g:colors_name), fnameescape(g:colors_name))) + endif +endfunction + +function! xolox#session#save_fullscreen(commands) " {{{2 + " Save the full screen state of Vim. This function provides integration + " between my [vim-session] [] and [vim-shell] [] plug-ins. The first + " argument is expected to be a list, it will be extended with the lines to + " be added to the session script. + " + " [vim-session]: http://peterodding.com/code/vim/session + " [vim-shell]: http://peterodding.com/code/vim/shell + try + let commands = xolox#shell#persist_fullscreen() + if !empty(commands) + call add(a:commands, "try") + for line in commands + call add(a:commands, " " . line) + endfor + if has('gui_running') && (has('gui_gtk') || has('gui_gtk2') || has('gui_gnome')) + " Without this hack GVim on GTK doesn't preserve the window size. + call add(a:commands, " call feedkeys(\":set lines=" . &lines . " columns=" . &columns . "\\\")") + endif + call add(a:commands, "catch " . '/^Vim\%((\a\+)\)\=:E117/') + call add(a:commands, " \" Ignore missing full-screen plug-in.") + call add(a:commands, "endtry") + endif + catch /^Vim\%((\a\+)\)\=:E117/ + " Ignore missing full-screen functionality. + endtry +endfunction + +function! xolox#session#save_qflist(commands) " {{{2 + " Save the contents of the quick-fix list. The first argument is expected to + " be a list, it will be extended with the lines to be added to the session + " script. + if has('quickfix') + let qf_list = [] + for qf_entry in getqflist() + if has_key(qf_entry, 'bufnr') + if !has_key(qf_entry, 'filename') + let qf_entry.filename = bufname(qf_entry.bufnr) + endif + unlet qf_entry.bufnr + endif + call add(qf_list, qf_entry) + endfor + call add(a:commands, 'call setqflist(' . string(qf_list) . ')') + endif +endfunction + +function! xolox#session#save_state(commands) " {{{2 + " Wrapper for the [:mksession] [] command that slightly massages the + " generated Vim script to get rid of some strange quirks in the way Vim + " generates sessions. Also implements support for buffers with content that + " was generated by other Vim plug-ins. The first argument is expected to + " be a list, it will be extended with the lines to be added to the session + " script. + let tempfile = tempname() + let ssop_save = &sessionoptions + try + " The default value of &sessionoptions includes "options" which causes + " :mksession to include all Vim options and mappings in generated session + " scripts. This can significantly increase the size of session scripts + " which makes them slower to generate and evaluate. It can also be a bit + " buggy, e.g. it breaks Ctrl-S when :runtime mswin.vim has been used. The + " value of &sessionoptions is changed temporarily to avoid these issues. + set ssop-=options + execute 'mksession' fnameescape(tempfile) + let lines = readfile(tempfile) + " Remove the mode line added by :mksession because we'll add our own in + " xolox#session#save_session(). + call s:eat_trailing_line(lines, '" vim: set ft=vim :') + " Remove the "SessionLoadPost" event firing at the end of the :mksession + " output. We will fire the event ourselves when we're really done. + call s:eat_trailing_line(lines, 'unlet SessionLoad') + call s:eat_trailing_line(lines, 'doautoall SessionLoadPost') + call xolox#session#save_special_windows(lines) + if !xolox#session#include_tabs() + " Customize the output of :mksession for tab scoped sessions. + let buffers = tabpagebuflist() + call map(lines, 's:tabpage_filter(buffers, v:val)') + endif + call extend(a:commands, map(lines, 's:state_filter(v:val)')) + " Re-implement Vim's special handling of the initial, empty buffer. + call add(a:commands, "if exists('s:wipebuf')") + call add(a:commands, " if empty(bufname(s:wipebuf))") + call s:cleanup_after_plugin(a:commands, 's:wipebuf') + call add(a:commands, " endif") + call add(a:commands, "endif") + return 1 + finally + let &sessionoptions = ssop_save + call delete(tempfile) + endtry +endfunction + +function! s:eat_trailing_line(session, line) " {{{3 + " Remove matching, trailing strings from a list of strings. + if a:session[-1] == a:line + call remove(a:session, -1) + endif +endfunction + +function! s:tabpage_filter(buffers, line) " {{{3 + " Change output of :mksession if for single tab page. + if a:line =~ '^badd +\d\+ ' + " The :mksession command adds all open buffers to a session even for tab + " scoped sessions. That makes sense, but we want only the buffers in the + " tab page to be included. That's why we filter out any references to the + " rest of the buffers from the script generated by :mksession. + let pathname = matchstr(a:line, '^badd +\d\+ \zs.*') + let bufnr = bufnr('^' . pathname . '$') + if index(a:buffers, bufnr) == -1 + return '" ' . a:line + endif + elseif a:line =~ '^let v:this_session\s*=' + " The :mksession command unconditionally adds the global v:this_session + " variable definition to the session script, but we want a differently + " scoped variable for tab scoped sessions. + return substitute(a:line, 'v:this_session', 't:this_session', 'g') + endif + " Preserve all other lines. + return a:line +endfunction + +function! s:state_filter(line) " {{{3 + " Various changes to the output of :mksession. + if a:line =~ '^normal!\? zo$' + " Silence "E490: No fold found" errors. + return 'silent! ' . a:line + elseif a:line =~ '^file .\{-}\ 0 && winnr('$') > 1 + call add(a:session, winrestcmd) + endif +endfunction + +function! s:check_special_window(session) + " If we detected a special window and the argument to the command is not a + " pathname, this variable should be set to false to disable normalization. + let do_normalize_path = 1 + let bufname = expand('%:t') + if exists('b:NERDTreeRoot') + if !has_key(s:nerdtrees, bufnr('%')) + let command = 'NERDTree' + let argument = b:NERDTreeRoot.path.str() + let s:nerdtrees[bufnr('%')] = 1 + else + let command = 'NERDTreeMirror' + let argument = '' + endif + elseif bufname == '[BufExplorer]' + let command = 'BufExplorer' + let argument = '' + elseif bufname == '__Tag_List__' + let command = 'Tlist' + let argument = '' + elseif exists('g:proj_running') && g:proj_running == bufnr('%') + let command = 'Project' + let argument = expand('%:p') + elseif exists('b:ConqueTerm_Idx') + let command = 'ConqueTerm' + let argument = g:ConqueTerm_Terminals[b:ConqueTerm_Idx]['program_name'] + let do_normalize_path = 0 + elseif &filetype == 'netrw' + let command = 'edit' + let argument = bufname('%') + elseif &buftype == 'quickfix' + let command = 'cwindow' + let argument = '' + endif + if exists('command') + call s:jump_to_window(a:session, tabpagenr(), winnr()) + call add(a:session, 'let s:bufnr_save = bufnr("%")') + call add(a:session, 'let s:cwd_save = getcwd()') + if argument == '' + call add(a:session, command) + else + if do_normalize_path + let argument = fnamemodify(argument, ':~') + if xolox#session#options_include('slash') + let argument = substitute(argument, '\', '/', 'g') + endif + endif + call add(a:session, command . ' ' . fnameescape(argument)) + endif + call s:cleanup_after_plugin(a:session, 's:bufnr_save') + call add(a:session, 'execute "cd" fnameescape(s:cwd_save)') + return 1 + endif +endfunction + +function! s:jump_to_window(session, tabpage, window) + call add(a:session, a:window . 'wincmd w') + if xolox#session#include_tabs() + call add(a:session, 'tabnext ' . a:tabpage) + endif +endfunction + +function! s:nerdtree_persist() + " Remember current working directory and whether NERDTree is loaded. + if exists('b:NERDTreeRoot') + return 'NERDTree ' . fnameescape(b:NERDTreeRoot.path.str()) . ' | only' + else + return 'cd ' . fnameescape(getcwd()) + endif +endfunction + +function! s:cleanup_after_plugin(commands, bufnr_var) + call add(a:commands, "if !getbufvar(" . a:bufnr_var . ", '&modified')") + call add(a:commands, " let s:wipebuflines = getbufline(" . a:bufnr_var . ", 1, '$')") + call add(a:commands, " if len(s:wipebuflines) <= 1 && empty(get(s:wipebuflines, 0, ''))") + call add(a:commands, " silent execute 'bwipeout' " . a:bufnr_var) + call add(a:commands, " endif") + call add(a:commands, "endif") +endfunction + +" Automatic commands to manage the default session. {{{1 + +function! xolox#session#auto_load() " {{{2 + " Automatically load the default or last used session when Vim starts. + " Normally called by the [VimEnter] [] automatic command event. + " + " [VimEnter]: http://vimdoc.sourceforge.net/htmldoc/autocmd.html#VimEnter + if g:session_autoload == 'no' + return + endif + " Check that the user has started Vim without editing any files. + if xolox#session#is_empty() + " Check whether a session matching the user-specified server name exists. + if v:servername !~ '^\cgvim\d*$' + for session in xolox#session#get_names(0) + if v:servername ==? session + call xolox#session#open_cmd(session, '', 'OpenSession') + return + endif + endfor + endif + " Default to the last used session or the default session? + let [has_last_session, session] = s:get_last_or_default_session() + let path = xolox#session#name_to_path(session) + if (g:session_default_to_last == 0 || has_last_session) && filereadable(path) && !s:session_is_locked(session, 'OpenSession') + " Compose the message for the prompt. + let is_default_session = (session == g:session_default_name) + let msg = printf("Do you want to restore your %s editing session%s?", + \ is_default_session ? 'default' : 'last used', + \ is_default_session ? '' : printf(' (%s)', session)) + " Prepare the list of choices. + let choices = ["&Restore", "&Don't Restore"] + if g:session_default_to_last && has_last_session + call add(choices, "&Forget") + endif + " Prompt the user (if not configured otherwise). + let choice = s:prompt(msg, choices, 'g:session_autoload') + if choice == 1 + call xolox#session#open_cmd(session, '', 'OpenSession') + elseif choice == 3 + call s:last_session_forget() + endif + endif + endif +endfunction + +function! xolox#session#is_empty() " {{{2 + " Check that the user has started Vim without editing any files. Used by + " `xolox#session#auto_load()` to determine whether automatic session loading + " should be performed. Currently checks the following conditions: + " + " 1. That the current buffer is either empty (contains no lines and is not + " modified) or showing [vim-startify] []. + " 2. That the buffer list either empty or persistent. + " + " [vim-startify]: https://github.com/mhinz/vim-startify/ + let current_buffer_is_empty = (&modified == 0 && getline(1, '$') == ['']) + let current_buffer_is_startify = (&filetype == 'startify') + let buffer_list_is_empty = (bufname('%') == '' && empty(filter(range(1, bufnr('$')), 'buflisted(v:val) && v:val != ' . bufnr('')))) + let buffer_list_is_persistent = (index(xolox#misc#option#split(&viminfo), '%') >= 0) + return (current_buffer_is_empty || current_buffer_is_startify) && (buffer_list_is_empty || buffer_list_is_persistent) +endfunction + +function! xolox#session#auto_save() " {{{2 + " Automatically save the current editing session when Vim is closed. + " Normally called by the [VimLeavePre] [] automatic command event. + " + " [VimLeavePre]: http://vimdoc.sourceforge.net/htmldoc/autocmd.html#VimLeavePre + if v:dying + " We won't save the session if Vim is not terminating normally. + return + endif + if g:session_autosave == 'no' + " We won't save the session if auto-save is explicitly disabled. + return + endif + " Get the name of the session for automatic saving. + let name = xolox#misc#option#get('session_autosave_to') + if empty(name) + " Get the name of the active session (if any). + let name = xolox#session#find_current_session() + " If no session is active and the user doesn't have any sessions yet, + " help them get started by suggesting to create the default session. + if empty(name) && (empty(xolox#session#get_names(0)) || g:session_default_overwrite) + let name = g:session_default_name + endif + endif + " Prompt the user to save the active/first/default session? + if !empty(name) + let is_tab_scoped = xolox#session#is_tab_scoped() + let msg = "Do you want to save your %s before quitting Vim?" + if s:prompt(printf(msg, xolox#session#get_label(name, is_tab_scoped)), ["&Save", "&Don't Save"], 'g:session_autosave') == 1 + if g:session_default_overwrite && (name == g:session_default_name) + let bang = '!' + else + let bang = '' + endif + if is_tab_scoped + call xolox#session#save_tab_cmd(name, bang, 'SaveTabSession') + else + call xolox#session#save_cmd(name, bang, 'SaveSession') + endif + endif + endif +endfunction + +function! xolox#session#auto_save_periodic() " {{{2 + " Automatically saves the current editing session every few minutes. + " Normally called by the [CursorHold] [] and [CursorHoldI] [] automatic + " command events. + " + " [CursorHold]: http://vimdoc.sourceforge.net/htmldoc/autocmd.html#CursorHold + " [CursorHoldI]: http://vimdoc.sourceforge.net/htmldoc/autocmd.html#CursorHoldI + if g:session_autosave_periodic > 0 + let interval = g:session_autosave_periodic * 60 + let next_save = s:session_last_flushed + interval + if localtime() > next_save + let name = xolox#session#find_current_session() + if !empty(name) + if xolox#session#is_tab_scoped() + let function = 'xolox#session#save_tab_cmd' + let arguments = [name, '', 'SaveTabSession'] + else + let function = 'xolox#session#save_cmd' + let arguments = [name, '', 'SaveSession'] + endif + if xolox#misc#option#get('session_autosave_silent', 0) + " Silence informational messages perceived as noisy. + " https://github.com/xolox/vim-session/issues/120 + silent call call(function, arguments) + else + call call(function, arguments) + endif + endif + endif + endif +endfunction + +function! s:flush_session() + let s:session_last_flushed = localtime() +endfunction + +if !exists('s:session_last_flushed') + call s:flush_session() +endif + +function! xolox#session#auto_unlock() " {{{2 + " Automatically unlock all sessions when Vim quits. Normally called by the + " [VimLeavePre] [] automatic command event. + " + " [VimLeavePre]: http://vimdoc.sourceforge.net/htmldoc/autocmd.html#VimLeavePre + if xolox#session#locking_enabled() + let i = 0 + while i < len(s:lock_files) + let lock_file = s:lock_files[i] + if delete(lock_file) == 0 + call remove(s:lock_files, i) + else + let i += 1 + endif + endwhile + endif +endfunction + +" Commands that enable users to manage multiple sessions. {{{1 + +function! s:prompt(msg, choices, option_name) + let option_value = eval(a:option_name) + if option_value == 'yes' + return 1 + elseif option_value == 'no' + return 0 + else + if g:session_verbose_messages + let format = "%s\n\nNote that you can permanently disable this dialog by adding the following line to your %s script:\n\n\t:let %s = 'no'" + let prompt = printf(format, a:msg, xolox#misc#os#is_win() ? '~\_vimrc' : '~/.vimrc', a:option_name) + else + let prompt = a:msg + endif + return confirm(prompt, join(a:choices, "\n"), 1, 'Question') + endif +endfunction + +function! xolox#session#open_cmd(name, bang, command) abort " {{{2 + let name = s:unescape(a:name) + if empty(name) + let name = xolox#session#prompt_for_name('restore') + endif + if name == '' + return -1 + else + let starttime = xolox#misc#timer#start() + let path = xolox#session#name_to_path(name) + if !filereadable(path) + let msg = "session.vim %s: The %s session at %s doesn't exist!" + call xolox#misc#msg#warn(msg, g:xolox#session#version, string(name), fnamemodify(path, ':~')) + return 0 + elseif a:bang == '!' || !s:session_is_locked(name, a:command) + let oldcwd = s:nerdtree_persist() + call xolox#session#close_cmd(a:bang, 1, name != xolox#session#find_current_session(), a:command) + call s:lock_session(path) + execute 'source' fnameescape(path) + if xolox#session#is_tab_scoped() + call s:lock_session(path) " Retroactively (this is only known after the session has been loaded) add the tabpage to the lock. + let t:session_old_cwd = oldcwd + let session_type = 'tab scoped' + else + let g:session_old_cwd = oldcwd + let session_type = 'global' + endif + call s:last_session_persist(name) + call s:flush_session() + call xolox#misc#timer#stop("session.vim %s: Opened %s %s session in %s.", g:xolox#session#version, session_type, string(name), starttime) + call xolox#misc#msg#info("session.vim %s: Opened %s %s session from %s.", g:xolox#session#version, session_type, string(name), fnamemodify(path, ':~')) + endif + endif + return 1 +endfunction + +function! xolox#session#view_cmd(name) abort " {{{2 + let name = s:unescape(a:name) + " Default to the current session? + if empty(name) + let name = xolox#session#find_current_session() + endif + " Prompt the user to select a session. + if empty(name) + let name = xolox#session#prompt_for_name('view') + endif + if name != '' + let path = xolox#session#name_to_path(name) + if !filereadable(path) + let msg = "session.vim %s: The %s session at %s doesn't exist!" + call xolox#misc#msg#warn(msg, g:xolox#session#version, string(name), fnamemodify(path, ':~')) + else + if has('gui_running') + execute 'tab drop' fnameescape(path) + else + execute 'tabedit' fnameescape(path) + endif + call xolox#misc#msg#info("session.vim %s: Viewing session script %s.", g:xolox#session#version, fnamemodify(path, ':~')) + endif + endif +endfunction + +function! xolox#session#save_cmd(name, bang, command) abort " {{{2 + let starttime = xolox#misc#timer#start() + let name = s:unescape(a:name) + if empty(name) + let name = xolox#session#find_current_session() + endif + if empty(name) + let name = g:session_default_name + endif + let path = xolox#session#name_to_path(name) + let friendly_path = fnamemodify(path, ':~') + if a:bang == '!' || !s:session_is_locked(name, a:command) + let lines = [] + call xolox#session#save_session(lines, friendly_path) + if xolox#misc#os#is_win() && !xolox#session#options_include('unix') + call map(lines, 'v:val . "\r"') + endif + if writefile(lines, path) != 0 + let msg = "session.vim %s: Failed to save %s session to %s!" + call xolox#misc#msg#warn(msg, g:xolox#session#version, string(name), friendly_path) + else + call s:last_session_persist(name) + call s:flush_session() + let label = xolox#session#get_label(name, !xolox#session#include_tabs()) + call xolox#misc#timer#stop("session.vim %s: Saved %s in %s.", g:xolox#session#version, label, starttime) + call xolox#misc#msg#info("session.vim %s: Saved %s to %s.", g:xolox#session#version, label, friendly_path) + if xolox#session#include_tabs() + let v:this_session = path + else + let t:this_session = path + endif + call s:lock_session(path) + endif + endif +endfunction + +function! xolox#session#delete_cmd(name, bang) " {{{2 + let name = s:unescape(a:name) + if empty(name) + let name = xolox#session#prompt_for_name('delete') + endif + if name != '' + let path = xolox#session#name_to_path(name) + if !filereadable(path) + let msg = "session.vim %s: The %s session at %s doesn't exist!" + call xolox#misc#msg#warn(msg, g:xolox#session#version, string(name), fnamemodify(path, ':~')) + elseif a:bang == '!' || !s:session_is_locked(name, 'DeleteSession') + if delete(path) != 0 + let msg = "session.vim %s: Failed to delete %s session at %s!" + call xolox#misc#msg#warn(msg, g:xolox#session#version, string(name), fnamemodify(path, ':~')) + else + call s:unlock_session(path) + let msg = "session.vim %s: Deleted %s session at %s." + call xolox#misc#msg#info(msg, g:xolox#session#version, string(name), fnamemodify(path, ':~')) + endif + endif + endif +endfunction + +function! xolox#session#close_cmd(bang, silent, save_allowed, command) abort " {{{2 + let is_all_tabs = xolox#session#include_tabs() + let name = xolox#session#find_current_session() + if name != '' + if a:save_allowed + let msg = "Do you want to save your %s before closing it?" + let label = xolox#session#get_label(name, !is_all_tabs) + if s:prompt(printf(msg, label), ["&Save", "&Don't Save"], 'g:session_autosave') == 1 + call xolox#session#save_cmd(name, a:bang, a:command) + endif + else + call xolox#misc#msg#debug("session.vim %s: Session reset requested, not saving changes to session ..", g:xolox#session#version) + endif + call s:unlock_session(xolox#session#name_to_path(name)) + endif + " Close al but the current tab page? + if is_all_tabs && tabpagenr('$') > 1 + execute 'tabonly' . a:bang + endif + " Close all but the current window. + if winnr('$') > 1 + execute 'only' . a:bang + endif + " Start editing a new, empty buffer. + execute 'enew' . a:bang + " Close all but the current buffer. + let bufnr_save = bufnr('%') + let all_buffers = is_all_tabs ? range(1, bufnr('$')) : tabpagebuflist() + for bufnr in all_buffers + if buflisted(bufnr) && bufnr != bufnr_save + execute 'silent bdelete' bufnr + endif + endfor + " Restore working directory (and NERDTree?) from before :OpenSession. + if is_all_tabs && exists('g:session_old_cwd') + execute g:session_old_cwd + unlet g:session_old_cwd + elseif !is_all_tabs && exists('t:session_old_cwd') + execute t:session_old_cwd + unlet t:session_old_cwd + endif + call s:flush_session() + if !a:silent + let msg = "session.vim %s: Closed %s." + let label = xolox#session#get_label(xolox#session#find_current_session(), !is_all_tabs) + call xolox#misc#msg#info(msg, g:xolox#session#version, label) + endif + if xolox#session#is_tab_scoped() + let t:this_session = '' + else + let v:this_session = '' + endif + return 1 +endfunction + +function! xolox#session#open_tab_cmd(name, bang, command) abort " {{{2 + try + call xolox#session#change_tab_options() + call xolox#session#open_cmd(a:name, a:bang, a:command) + finally + call xolox#session#restore_tab_options() + endtry +endfunction + +function! xolox#session#save_tab_cmd(name, bang, command) abort " {{{2 + try + call xolox#session#change_tab_options() + call xolox#session#save_cmd(a:name, a:bang, a:command) + finally + call xolox#session#restore_tab_options() + endtry +endfunction + +function! xolox#session#append_tab_cmd(name, bang, count, command) abort " {{{2 + try + call xolox#session#change_tab_options() + let original_tabpage = tabpagenr() + execute printf('%stabnew', a:count == -1 ? '' : a:count) + let status = xolox#session#open_cmd(a:name, a:bang, a:command) + if status <= 0 && empty(bufname('')) + tabclose + if tabpagenr() != original_tabpage + execute original_tabpage . 'tabnext' + endif + if status == 0 + " Switching tab pages cleared the warning message. Repeat it now. + call xolox#misc#msg#warn(get(g:xolox_messages, -1, '')) + endif + endif + finally + call xolox#session#restore_tab_options() + endtry +endfunction + +function! xolox#session#close_tab_cmd(bang, command) abort " {{{2 + let save_allowed = xolox#session#is_tab_scoped() + try + call xolox#session#change_tab_options() + call xolox#session#close_cmd(a:bang, 0, save_allowed, a:command) + finally + call xolox#session#restore_tab_options() + endtry +endfunction + +function! xolox#session#restart_cmd(bang, args) abort " {{{2 + if !has('gui_running') + " In console Vim we can't start a new Vim and kill the old one... + let msg = "session.vim %s: The :RestartVim command only works in graphical Vim!" + call xolox#misc#msg#warn(msg, g:xolox#session#version) + else + " Save the current session (if there is no active + " session we will create a session called "restart"). + let name = xolox#session#find_current_session() + if empty(name) + let name = 'restart' + endif + call xolox#session#save_cmd(name, a:bang, 'RestartVim') + " Generate the Vim command line. + let progname = xolox#misc#escape#shell(xolox#misc#os#find_vim()) + let command = progname . ' -g -c ' . xolox#misc#escape#shell('OpenSession\! ' . fnameescape(name)) + let args = matchstr(a:args, '^\s*|\s*\zs.\+$') + if !empty(args) + let command .= ' -c ' . xolox#misc#escape#shell(args) + endif + if !empty(v:servername) + let command .= ' --servername ' . xolox#misc#escape#shell(v:servername) + endif + " Close the session, releasing the session lock. + call xolox#session#close_cmd(a:bang, 0, 1, 'RestartVim') + " Start the new Vim instance. + if xolox#misc#os#is_win() + " On Microsoft Windows. + execute '!start' command + else + " On anything other than Windows (UNIX like). + let cmdline = [] + for variable in g:session_restart_environment + call add(cmdline, variable . '=' . xolox#misc#escape#shell(fnameescape(eval('$' . variable)))) + endfor + call add(cmdline, command) + call add(cmdline, printf("--cmd ':set enc=%s'", escape(&enc, '\ '))) + silent execute '!' join(cmdline, ' ') '&' + endif + " Close Vim. + silent quitall + endif +endfunction + +" Miscellaneous functions. {{{1 + +function! s:unescape(s) " {{{2 + " Undo escaping of special characters (preceded by a backslash). + let s = substitute(a:s, '\\\(.\)', '\1', 'g') + " Expand any environment variables in the user input. + let s = substitute(s, '\(\$[A-Za-z0-9_]\+\)', '\=expand(submatch(1))', 'g') + return s +endfunction + +function! xolox#session#prompt_for_name(action) " {{{2 + " Prompt the user to select one of the existing sessions. The first argument + " is expected to be a string describing what will be done to the session + " once it's been selected. Returns the name of the selected session as a + " string. If no session is selected an empty string is returned. Here's + " an example of what the prompt looks like: + " + " :call xolox#session#prompt_for_name('trash') + " + " Please select the session to trash: + " + " 1. first-session + " 2. second-session + " 3. third-session + " + " Type number and or click with mouse (empty cancels): + " + " If only a single session exists there's nothing to choose from so the name + " of that session will be returned directly, without prompting the user. + let sessions = sort(xolox#session#get_names(0), 1) + if len(sessions) == 1 + return sessions[0] + elseif !empty(sessions) + let lines = copy(sessions) + for i in range(len(sessions)) + let lines[i] = ' ' . (i + 1) . '. ' . lines[i] + endfor + redraw + sleep 100 m + echo "\nPlease select the session to " . a:action . ":" + sleep 100 m + let i = inputlist([''] + lines + ['']) + if i >= 1 && i <= len(sessions) + return sessions[i - 1] + endif + endif + return '' +endfunction + +function! xolox#session#name_to_path(name) " {{{2 + " Convert the name of a session (the first argument, expected to be a + " string) to an absolute pathname. Any special characters in the session + " name will be encoded using URL encoding. This means you're free to use + " whatever naming conventions you like (regardless of special characters + " like slashes). Returns a string. + let directory = xolox#misc#path#absolute(g:session_directory) + let filename = xolox#misc#path#encode(a:name) . g:session_extension + return xolox#misc#path#merge(directory, filename) +endfunction + +function! xolox#session#path_to_name(path) " {{{2 + " Convert the absolute pathname of a session script (the first argument, + " expected to be a string) to a session name. This function assumes the + " absolute pathname refers to the configured session directory, but it does + " not check for it nor does it require it (it simple takes the base name + " of the absolute pathname of the session script and decodes it). Returns a + " string. + return xolox#misc#path#decode(fnamemodify(a:path, ':t:r')) +endfunction + +function! xolox#session#get_names(include_suggestions) " {{{2 + " Get the names of all available sessions. This scans the directory + " configured with `g:session_directory` for files that end with the suffix + " configured with `g:session_extension`, takes the base name of each file + " and decodes any URL encoded characters. Returns a list of strings. + " + " If the first argument is true (1) then the user defined function + " configured with `g:session_name_suggestion_function` is called to find + " suggested session names, which are prefixed to the list of available + " sessions, otherwise the argument should be false (0). + let directory = xolox#misc#path#absolute(g:session_directory) + let filenames = split(glob(xolox#misc#path#merge(directory, '*' . g:session_extension)), "\n") + call map(filenames, 'xolox#session#path_to_name(v:val)') + if a:include_suggestions && !empty(g:session_name_suggestion_function) + let suggested_names = call(g:session_name_suggestion_function, []) + let filenames = suggested_names + filenames + endif + return filenames +endfunction + +function! xolox#session#complete_names(arg, line, pos) " {{{2 + " Completion function for user defined Vim commands. Used by commands like + " `:OpenSession` and `:DeleteSession` (but not `:SaveSession`) to support + " user friendly completion. + let names = filter(xolox#session#get_names(0), 'v:val =~ a:arg') + return map(names, 'fnameescape(v:val)') +endfunction + +function! xolox#session#complete_names_with_suggestions(arg, line, pos) " {{{2 + " Completion function for the Vim command `:SaveSession`. + let names = filter(xolox#session#get_names(1), 'v:val =~ a:arg') + return map(names, 'fnameescape(v:val)') +endfunction + +function! xolox#session#is_tab_scoped() " {{{2 + " Determine whether the current session is tab scoped or global. Returns 1 + " (true) when the session is tab scoped, 0 (false) otherwise. + return exists('t:this_session') +endfunction + +function! xolox#session#find_current_session() " {{{2 + " Find the name of the current tab scoped or global session. Returns a + " string. If no session is active an empty string is returned. + for variable in ['t:this_session', 'v:this_session'] + if exists(variable) + let filename = eval(variable) + if !empty(filename) + let directory = fnamemodify(filename, ':p:h') + if xolox#misc#path#equals(directory, g:session_directory) + return xolox#session#path_to_name(filename) + endif + endif + endif + endfor + return '' +endfunction + +function! xolox#session#get_label(name, is_tab_scoped) " {{{2 + " Get a human readable label based on the scope (tab scoped or global) and + " name of a session. The first argument is the name (a string) and the + " second argument is a boolean indicating the scope of the session; 1 (true) + " means tab scoped and 0 (false) means global scope. Returns a string. + if a:name == g:session_default_name + let description = 'default editing session' + else + let description = printf('editing session %s', string(a:name)) + endif + if a:is_tab_scoped + let description = printf('tab scoped %s', description) + endif + return description +endfunction + +function! xolox#session#options_include(value) " {{{2 + " Check whether Vim's [sessionoptions] [] option includes the keyword given + " as the first argument (expected to be a string). Returns 1 (true) when it + " does, 0 (false) otherwise. + " + " [sessionoptions]: http://vimdoc.sourceforge.net/htmldoc/options.html#'sessionoptions' + return index(xolox#misc#option#split(&sessionoptions), a:value) >= 0 +endfunction + +" Tab scoped sessions: {{{2 + +function! xolox#session#include_tabs() " {{{3 + " Check whether Vim's [sessionoptions] [] option includes the `tabpages` + " keyword. Returns 1 (true) when it does, 0 (false) otherwise. + return xolox#session#options_include('tabpages') +endfunction + +function! xolox#session#change_tab_options() " {{{3 + " Temporarily change Vim's [sessionoptions] [] option so we can save a tab + " scoped session. Saves a copy of the original value to be restored later. + let s:ssop_save = &sessionoptions + " Only persist the current tab page. + set sessionoptions-=tabpages + " Don't persist the size and position of the Vim window. + set ssop-=winpos ssop-=resize +endfunction + +function! xolox#session#restore_tab_options() " {{{3 + " Restore the original value of Vim's [sessionoptions] [] option. + if exists('s:ssop_save') + let &ssop = s:ssop_save + unlet s:ssop_save + endif +endfunction + +" Default to last used session: {{{2 + +function! s:last_session_file() + let directory = xolox#misc#path#absolute(g:session_directory) + return xolox#misc#path#merge(directory, 'last-session.txt') +endfunction + +function! s:last_session_persist(name) + if g:session_default_to_last + if writefile([a:name], s:last_session_file()) != 0 + call xolox#misc#msg#warn("session.vim %s: Failed to persist name of last used session!", g:xolox#session#version) + endif + endif +endfunction + +function! s:last_session_forget() + let last_session_file = s:last_session_file() + if filereadable(last_session_file) && delete(last_session_file) != 0 + call xolox#misc#msg#warn("session.vim %s: Failed to delete name of last used session!", g:xolox#session#version) + endif +endfunction + +function! s:get_last_or_default_session() + let last_session_file = s:last_session_file() + let has_last_session = filereadable(last_session_file) + if g:session_default_to_last && has_last_session + let lines = readfile(last_session_file) + return [has_last_session, lines[0]] + else + return [has_last_session, g:session_default_name] + endif +endfunction + +" Lock file management: {{{2 + +if !exists('s:lock_files') + let s:lock_files = [] +endif + +function! xolox#session#locking_enabled() + " Check whether session locking is enabled. Returns true (1) when locking is + " enabled, false (0) otherwise. + " + " By default session locking is enabled but users can opt-out by setting + " `g:session_lock_enabled` to false (0). + return xolox#misc#option#get('session_lock_enabled', 1) +endfunction + +function! s:vim_instance_id() + let id = {'pid': getpid()} + if !empty(v:servername) + let id['servername'] = v:servername + endif + if !xolox#session#include_tabs() || xolox#session#is_tab_scoped() + let id['tabpage'] = tabpagenr() + endif + return id +endfunction + +function! s:lock_file_path(session_path) + let directory = xolox#misc#option#get('session_lock_directory', '') + if empty(directory) + " Stale lock files can be really annoying, especially after a reboot + " because that just shouldn't happen - it's always a bug. References: + " - https://github.com/xolox/vim-session/issues/97 + " - https://github.com/xolox/vim-session/issues/110 + " One simple way to give a large group of users what they want is to use a + " volatile directory that is specifically meant for storing lock files. + " I've decided to make this the default when possible. The best reference + " I've been able to find on the proper system wide location for lock files + " is the following (yes, I know, it's Linux specific, so sue me): + " http://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/var.html + let global_lock_directory = '/var/lock' + if filewritable(global_lock_directory) == 2 + let directory = global_lock_directory + endif + endif + if !empty(directory) + let pathname = xolox#misc#path#merge(directory, xolox#misc#path#encode(a:session_path)) + else + let pathname = a:session_path + endif + return pathname . '.lock' +endfunction + +function! s:lock_session(session_path) + if !xolox#session#locking_enabled() + return 1 + endif + let lock_file = s:lock_file_path(a:session_path) + if xolox#misc#persist#save(lock_file, s:vim_instance_id()) + if index(s:lock_files, lock_file) == -1 + call add(s:lock_files, lock_file) + endif + return 1 + endif +endfunction + +function! s:unlock_session(session_path) + if !xolox#session#locking_enabled() + return 1 + endif + let lock_file = s:lock_file_path(a:session_path) + if delete(lock_file) == 0 + let idx = index(s:lock_files, lock_file) + if idx >= 0 + call remove(s:lock_files, idx) + endif + return 1 + endif +endfunction + +function! s:session_is_locked(session_name, command) + if !xolox#session#locking_enabled() + return 0 + endif + let session_path = xolox#session#name_to_path(a:session_name) + let lock_file = s:lock_file_path(session_path) + if filereadable(lock_file) + let this_instance = s:vim_instance_id() + let other_instance = xolox#misc#persist#load(lock_file) + let arguments = [g:xolox#session#version, string(a:session_name)] + if this_instance == other_instance + " Session belongs to current Vim instance and tab page. + return 0 + elseif this_instance['pid'] == other_instance['pid'] + if has_key(other_instance, 'tabpage') + let msg = "session.vim %s: The %s session is already loaded in tab page %s." + call add(arguments, other_instance['tabpage']) + else + let msg = "session.vim %s: The %s session is already loaded in this Vim." + endif + else + let msg = "session.vim %s: The %s session is locked by another Vim instance %s." + if has_key(other_instance, 'servername') + call add(arguments, 'named ' . other_instance['servername']) + else + call add(arguments, 'with PID ' . other_instance['pid']) + endif + let msg .= " If that doesn't seem right maybe you forcefully closed Vim or it crashed?" + endif + let msg .= " Use the command ':%s! %s' to override." + call extend(arguments, [a:command, a:session_name]) + call call('xolox#misc#msg#warn', [msg] + arguments) + return 1 + endif +endfunction + +" vim: ts=2 sw=2 et diff --git a/sources_non_forked/vim-session-master/autoload/xolox/session/suggestions.vim b/sources_non_forked/vim-session-master/autoload/xolox/session/suggestions.vim new file mode 100755 index 00000000..1f844762 --- /dev/null +++ b/sources_non_forked/vim-session-master/autoload/xolox/session/suggestions.vim @@ -0,0 +1,42 @@ +" Example function for session name suggestions. +" +" Author: Peter Odding +" Last Change: July 6, 2014 +" URL: http://peterodding.com/code/vim/session/ + +function! xolox#session#suggestions#vcs_feature_branch() " {{{1 + " This function implements an example of a function that can be used with + " the `g:session_name_suggestion_function` option. It finds the name of the + " current git or Mercurial feature branch (if any) and suggests this name as + " the name for the session that is being saved with :SaveSession. Returns a + " list with one string on success and an empty list on failure. + let [kind, directory] = xolox#session#suggestions#find_vcs_repository() + if kind == 'git' + let command = 'git rev-parse --abbrev-ref HEAD' + let names_to_ignore = ['master'] + elseif kind == 'hg' + let command = 'hg branch' + let names_to_ignore = ['default'] + else + return [] + endif + let result = xolox#misc#os#exec({'command': command, 'check': 0}) + if result['exit_code'] == 0 && !empty(result['stdout']) + let branch_name = xolox#misc#str#trim(result['stdout'][0]) + if !empty(branch_name) && index(names_to_ignore, branch_name) == -1 + return [xolox#misc#str#slug(branch_name)] + endif + endif + return [] +endfunction + +function! xolox#session#suggestions#find_vcs_repository() + for name in ['git', 'hg'] + let match = finddir('.' . name, '.;') + if !empty(match) + let directory = fnamemodify(match, ':h') + return [name, directory] + endif + endfor + return ['', ''] +endfunction diff --git a/sources_non_forked/vim-session-master/doc/session.txt b/sources_non_forked/vim-session-master/doc/session.txt new file mode 100755 index 00000000..2148461f --- /dev/null +++ b/sources_non_forked/vim-session-master/doc/session.txt @@ -0,0 +1,960 @@ +*session.txt* Extended session management for Vim + +=============================================================================== +Contents ~ + + 1. Introduction |session-introduction| + 2. Installation |session-installation| + 3. Commands |session-commands| + 1. The |:SaveSession| command + 2. The |:OpenSession| command + 3. The |:RestartVim| command + 4. The |:CloseSession| command + 5. The |:DeleteSession| command + 6. The |:ViewSession| command + 7. Tab scoped sessions |tab-scoped-sessions| + 1. The |:OpenTabSession| command + 2. The |:SaveTabSession| command + 3. The |:AppendTabSession| command + 4. The |:CloseTabSession| command + 4. Options |session-options| + 1. The |sessionoptions| setting + 2. The |g:session_directory| option + 3. The |g:session_lock_directory| option + 4. The |g:session_lock_enabled| option + 5. The |g:session_default_name| option + 6. The |g:session_default_overwrite| option + 7. The |g:session_extension| option + 8. The |g:session_autoload| option + 9. The |g:session_autosave| option + 10. The |g:session_autosave_to| option + 11. The |g:session_autosave_periodic| option + 12. The |g:session_autosave_silent| option + 13. The |g:session_verbose_messages| option + 14. The |g:session_default_to_last| option + 15. The |g:session_persist_font| option + 16. The |g:session_persist_colors| option + 17. The |g:session_persist_globals| option + 18. The |g:session_restart_environment| option + 19. The |g:session_command_aliases| option + 20. The |g:session_menu| option + 21. The |g:session_name_suggestion_function| option + 22. The |g:loaded_session| option + 5. Compatibility with other plug-ins |session-compatibility-with-other-plug-ins| + 6. Function reference |session-function-reference| + 1. Public API for the vim-session plug-in |public-api-for-vim-session-plug-in| + 1. The |xolox#session#save_session()| function + 2. The |xolox#session#save_globals()| function + 3. The |xolox#session#save_features()| function + 4. The |xolox#session#save_colors()| function + 5. The |xolox#session#save_fullscreen()| function + 6. The |xolox#session#save_qflist()| function + 7. The |xolox#session#save_state()| function + 8. The |xolox#session#save_special_windows()| function + 9. The |xolox#session#auto_load()| function + 10. The |xolox#session#is_empty()| function + 11. The |xolox#session#auto_save()| function + 12. The |xolox#session#auto_save_periodic()| function + 13. The |xolox#session#auto_unlock()| function + 14. The |xolox#session#prompt_for_name()| function + 15. The |xolox#session#name_to_path()| function + 16. The |xolox#session#path_to_name()| function + 17. The |xolox#session#get_names()| function + 18. The |xolox#session#complete_names()| function + 19. The |xolox#session#complete_names_with_suggestions()| function + 20. The |xolox#session#is_tab_scoped()| function + 21. The |xolox#session#find_current_session()| function + 22. The |xolox#session#get_label()| function + 23. The |xolox#session#options_include()| function + 24. The |xolox#session#include_tabs()| function + 25. The |xolox#session#change_tab_options()| function + 26. The |xolox#session#restore_tab_options()| function + 27. The |xolox#session#locking_enabled()| function + 2. Example function for session name suggestions |example-function-for-session-name-suggestions| + 1. The |xolox#session#suggestions#vcs_feature_branch()| function + 7. Troubleshooting |session-troubleshooting| + 1. Using multiple platforms (multi boot, Cygwin, etc.) |session-using-multiple-platforms| + 8. Contact |session-contact| + 9. License |session-license| + 10. Sample session script |sample-session-script| + 11. References |session-references| + +=============================================================================== + *session-introduction* +Introduction ~ + +The vim-session plug-in improves upon Vim's built-in |:mksession| command by +enabling you to easily and (if you want) automatically persist and restore your +Vim editing sessions. It works by generating a Vim |script| that restores your +current settings and the arrangement of tab pages and/or split windows and the +files they contain. + +To persist your current editing session you can execute the |:SaveSession| +command. If you don't provide a name for the session 'default' is used (you can +change this name with an option). You're free to use whatever characters you +like in session names. When you want to restore your session simply execute +|:OpenSession|. Again the name 'default' is used if you don't provide one. When +a session is active, has been changed and you quit Vim you'll be prompted +whether you want to save the open session before quitting Vim: + + Image: Screenshot of auto-save prompt (see reference [1]) + +If you want, the plug-in can also automatically save your session every few +minutes (see the |g:session_autosave_periodic| option). When you start Vim +without editing any files and the default session exists, you'll be prompted +whether you want to restore the default session: + + Image: Screenshot of auto-open prompt (see reference [2]) + +When you start Vim with a custom server name (see |--servername|) that matches +one of the existing session names then the matching session will be +automatically restored. For example I use several sessions to quickly edit my +Vim plug-ins: +> + $ gvim --servername easytags-plugin + $ gvim --servername session-plugin + $ # etc. +< +The session scripts created by this plug-in are stored in the directory +'~/.vim/sessions' (on UNIX) or '~\vimfiles\sessions' (on Windows) but you can +change the location by setting |g:session_directory|. If you're curious what +the session scripts generated by vim-session look like see the sample below +[3]. + +If you're still getting to know the plug-in, the "Sessions" menu may help: It +contains menu items for most commands defined by the plug-in. + +=============================================================================== + *session-installation* +Installation ~ + +Please refer to the installation instructions [4] available on GitHub. Once +you've installed the plug-in the commands below will be available to you. + +=============================================================================== + *session-commands* +Commands ~ + +Note that environment variables inside command arguments are expanded by the +plug-in. + +------------------------------------------------------------------------------- +The *:SaveSession* command + +This command saves your current editing session just like Vim's built-in +|:mksession| command does. The difference is that you don't pass a full +pathname as argument but just a name, any name really. Press '' to get +completion of existing session names. If you don't provide an argument the +default session name is used, unless an existing session is open in which case +the name of that session will be used. + +If the session you're trying to save is already active in another Vim instance +you'll get a warning and nothing happens. You can use a bang (!) as in +':SaveSession! ...' to ignore the warning and save the session anyway. + +Your session script will be saved in the directory pointed to by the +|g:session_directory| option. + +------------------------------------------------------------------------------- +The *:OpenSession* command + +This command is basically |:source| in disguise, but it supports tab completion +of session names and it executes |:CloseSession| before opening the session. +When you don't provide a session name and only a single session exists then +that session is opened, otherwise the plug-in will ask you to select one from a +list: +> + Please select the session to restore: + + 1. vim-profile + 2. session-plugin + 3. etc. + + Type number and or click with mouse (empty cancels): +< +If the session you're trying to open is already active in another Vim instance +you'll get a warning and nothing happens. You can use a bang (!) as in +':OpenSession! ...' to ignore the warning and open the session anyway. + +Note also that when you use a bang (!) right after the command name existing +tab pages and windows are closed, discarding any changes in the files you were +editing! + +------------------------------------------------------------------------------- +The *:RestartVim* command + +This command saves your current editing session, restarts Vim and restores your +editing session. This can come in handy when you're debugging Vim scripts which +can't be easily/safely reloaded using a more lightweight approach [5]. It +should work fine on Windows and UNIX alike but because of technical limitations +it only works in graphical Vim. + +Any commands following the |:RestartVim| command are intercepted and executed +after Vim is restarted and your session has been restored. This makes it easy +to perform manual tests which involve restarting Vim, e.g. ':RestartVim | edit +/path/to/file | call MyTest()'. + +------------------------------------------------------------------------------- +The *:CloseSession* command + +This command closes all but the current tab page and window and then edits a +new, empty buffer. If a session is loaded when you execute this command the +plug-in will first ask you whether you want to save that session. + +Note that when you use a bang (!) right after the command name existing tab +pages and windows are closed, discarding any changes in the files you were +editing! + +------------------------------------------------------------------------------- +The *:DeleteSession* command + +Using this command you can delete any of the sessions created by this plug-in. +If the session you are trying to delete is currently active in another Vim +instance you'll get a warning and nothing happens. You can use a bang (!) as in +':DeleteSession! ...' to ignore the warning and delete the session anyway. + +Note that this command only deletes the session script, it leaves your open tab +pages and windows exactly as they were. + +------------------------------------------------------------------------------- +The *:ViewSession* command + +Execute this command to view the Vim script generated for a session. This +command is useful when you need to review the generated Vim script repeatedly, +for example while debugging or modifying the vim-session plug-in. + +------------------------------------------------------------------------------- + *tab-scoped-sessions* +Tab scoped sessions ~ + +When |'sessionoptions'| contains 'tabpages' (this is the default) session +scripts will persist and restore all windows in all tab pages. When you remove +'tabpages' from |'sessionoptions'| you get a sort of light-weight sessions: +They are constrained to a single tab page. Vim's |:mksession| command and the +vim-session plug-in both fully support this. + +You can change |'sessionoptions'| in your |vimrc| script but then you can never +save a session including tab pages. To decide on the spot whether you want a +global or tab scoped session, the vim-session plug-in defines the three +commands documented below. + +Note that tab scoped sessions are regular session scripts, so when you load a +tab scoped session using |:OpenSession| instead of |:OpenTabSession| the vim- +session plug-in _assumes_ it is a global session and will close all active tab +pages before opening the tab scoped session. + +------------------------------------------------------------------------------- +The *:OpenTabSession* command + +Just like |:OpenSession| but applies only to the current tab page. + +------------------------------------------------------------------------------- +The *:SaveTabSession* command + +Just like |:SaveSession| but applies only to the current tab page. + +------------------------------------------------------------------------------- +The *:AppendTabSession* command + +This command opens a new tab page and loads the given tab scoped session in +that tab page. You can give this command a count just like |:tabnew|. + +------------------------------------------------------------------------------- +The *:CloseTabSession* command + +Just like |:CloseSession| but applies only to the current tab page. + +=============================================================================== + *session-options* +Options ~ + +The following Vim options and plug-in options (global variables) can be used to +configure the plug-in to your preferences. + +------------------------------------------------------------------------------- +The *sessionoptions* setting + +Because the vim-session plug-in uses Vim's |:mksession| command you can change +how it works by setting |'sessionoptions'| in your |vimrc| script, for example: +> + " If you only want to save the current tab page: + set sessionoptions-=tabpages + + " If you don't want help windows to be restored: + set sessionoptions-=help +< +A lot of people don't like Vim's default behavior of saving hidden and unloaded +buffers in sessions (which vim-session inherits due to the use of +|:mksession|). To disable this behavior you can add the following line to your +|vimrc| script: +> + " Don't save hidden and unloaded buffers in sessions. + set sessionoptions-=buffers +< +Note that the vim-session plug-in automatically and unconditionally executes +the following change just before saving a session: +> + " Don't persist options and mappings because it can corrupt sessions. + set sessionoptions-=options +< +------------------------------------------------------------------------------- +The *g:session_directory* option + +This option controls the location of your session scripts. Its default value is +'~/.vim/sessions' (on UNIX) or '~\vimfiles\sessions' (on Windows). If you don't +mind the default you don't have to do anything; the directory will be created +for you. Note that a leading '~' is expanded to your current home directory +('$HOME' on UNIX, '%USERPROFILE%' on Windows). + +------------------------------------------------------------------------------- +The *g:session_lock_directory* option + +The vim-session plug-in uses lock files to prevent double loading of sessions. +The default location (directory) of these lock files depends on a couple of +factors: + +1. If you have explicitly set the |g:session_lock_directory| option that + defines the directory. + +2. If the directory '/var/lock' exists and is writable that is used as a + sane default. + +3. As a sane fall back for platforms where '/var/lock' is not available the + directory that stores the session scripts themselves is used. + +------------------------------------------------------------------------------- +The *g:session_lock_enabled* option + +Depending on your workflow locking of editing sessions can get annoying at +times, so if you don't care about opening a session more than once and +potentially "losing a version of your session" then you can use this option to +completely disable session locking as follows: +> + " Disable all session locking - I know what I'm doing :-). + let g:session_lock_enabled = 0 +< +------------------------------------------------------------------------------- +The *g:session_default_name* option + +The name of the default session without directory or filename extension (you'll +never guess what the default is). + +------------------------------------------------------------------------------- +The *g:session_default_overwrite* option + +If you set this to true (1), every Vim instance without an explicit session +loaded will overwrite the default session (the last Vim instance wins). + +------------------------------------------------------------------------------- +The *g:session_extension* option + +The filename extension of session scripts. This should include the dot that +separates the basename from the extension. Defaults to '.vim'. + +------------------------------------------------------------------------------- +The *g:session_autoload* option + +By default this option is set to "'prompt'". This means that when you start Vim +without opening any files and the default session script exists, the session +plug-in will ask whether you want to restore your default session. When you set +this option to "'yes'" and you start Vim without opening any files the default +session will be restored without a prompt. To completely disable automatic +loading you can set this option to "'no'". + +------------------------------------------------------------------------------- +The *g:session_autosave* option + +By default this option is set to "'prompt'". When you've opened a session and +you quit Vim, the session plug-in will ask whether you want to save the changes +to your session. Set this option to "'yes'" to always automatically save open +sessions when you quit Vim. To completely disable automatic saving you can set +this option to "'no'". + +------------------------------------------------------------------------------- +The *g:session_autosave_to* option + +If |g:session_autosave| is "'yes'" and this option is a nonempty string, +automatic session saving always saves to the session with the name given by +|g:session_autosave_to| regardless of what the current session is or any other +options. In particular, |g:session_default_overwrite| does not have any effect. +By default this option isn't set so none of this applies. Refer to pull request +81 [6] for a more detailed use case. + +------------------------------------------------------------------------------- +The *g:session_autosave_periodic* option + +This option sets the interval in minutes for automatic, periodic saving of +active sessions. The default is zero which disables the feature. + +Note that when the plug-in automatically saves a session (because you enabled +this feature) the plug-in will not prompt for your permission. + +------------------------------------------------------------------------------- +The *g:session_autosave_silent* option + +If you set this option to true (1) the messages normally emitted by automatic, +periodic saving of active sessions are silenced. + +------------------------------------------------------------------------------- +The *g:session_verbose_messages* option + +The session load/save prompts are quite verbose by default because they explain +how to disable the prompts. If you find the additional explanation distracting +you can lower the verbosity by setting this option to 0 (false) in your |vimrc| +script. + +------------------------------------------------------------------------------- +The *g:session_default_to_last* option + +By default this option is set to false (0). When you set this option to true +(1) and you start Vim, the session plug-in will open your last used session +instead of the default session. Note that the session plug-in will still show +you the dialog asking whether you want to restore the last used session. To get +rid of the dialog you have to set |g:session_autoload| to "'yes'". + +------------------------------------------------------------------------------- +The *g:session_persist_font* option + +By default the plug-in will save the GUI font with the session to be reused the +next time that session is loaded, this can be disabled by adding the following +line to your |vimrc| script: +> + :let g:session_persist_font = 0 +< +------------------------------------------------------------------------------- +The *g:session_persist_colors* option + +By default the plug-in will save the color scheme and the |'background'| option +with the session to be reused the next time that session is loaded, this can be +disabled by adding the following line to your |vimrc| script: +> + :let g:session_persist_colors = 0 +< +------------------------------------------------------------------------------- +The *g:session_persist_globals* option + +The vim-session plug-in uses Vim's |:mksession| command but it changes +|'sessionoptions'| so that Vim options and mappings are not persisted. The +plug-in does this because persistence of options and mappings can break loading +of sessions, in other words it's fragile (in my opinion). + +If you want the plug-in to persist specific global variables or options you can +add their names to the list |g:session_persist_globals| in your |vimrc| script: +> + " Persist the value of the global option 'makeprg'. + let g:session_persist_globals = ['&makeprg'] +< +Because the |vimrc| script is loaded before the plug-in you have to define the +list yourself. To persist multiple values: +> + " Persist all options related to :make. + let g:session_persist_globals = ['&makeprg', '&makeef'] +< +Here's how you persist global variables: (in this case the variables of the +session plug-in itself :-) +> + " Persist the options of the session plug-in using the session plug-in... + let g:session_persist_globals = ['&sessionoptions'] + call add(g:session_persist_globals, 'g:session_autoload') + call add(g:session_persist_globals, 'g:session_autosave') + call add(g:session_persist_globals, 'g:session_default_to_last') + call add(g:session_persist_globals, 'g:session_persist_globals') +< +The example above doesn't persist the |g:session_directory| variable because +this variable is used before loading a session script so persisting it inside +the session script is pointless. + +------------------------------------------------------------------------------- +The *g:session_restart_environment* option + +This option is a list of environment variable names (without the dollar signs) +that the |:RestartVim| command will pass on to the new instance of Vim. This +option is only useful on UNIX. By default the three environment variables +'$TERM', '$VIM' and '$VIMRUNTIME' are included in this list. + +------------------------------------------------------------------------------- +The *g:session_command_aliases* option + +The names of the commands defined by the session plug-in start with the action +they perform, followed by the string 'Session'. Some people prefer it the other +way around because they find it easier to remember and you can type +':Session' to get completion of all available commands (actually this +works with the other style as well if you type ':*Session' but I digress). +If you are one of those people you can enable this option in your |vimrc| +script like this: +> + :let g:session_command_aliases = 1 +< +When this option is enabled the session plug-in will define the following +command aliases: + +- 'SessionOpen' is an alias for 'OpenSession' +- 'SessionView' is an alias for 'ViewSession' +- 'SessionSave' is an alias for 'SaveSession' +- 'SessionDelete' is an alias for 'DeleteSession' +- 'SessionClose' is an alias for 'CloseSession' + +Then there are the command aliases for tab scoped sessions: + +- 'SessionTabOpen' is an alias for 'OpenTabSession' +- 'SessionTabSave' is an alias for 'SaveTabSession' +- 'SessionTabAppend' is an alias for 'AppendTabSession' +- 'SessionTabClose' is an alias for 'CloseTabSession' + +The aliases support tab completion just like the real commands; they're exactly +the same except for the names. + +When you enable the aliases, the default command names will still be available. +If you really don't like them, feel free to delete them using |:delcommand|. + +------------------------------------------------------------------------------- +The *g:session_menu* option + +By default the plug-in installs a top level menu. If you don't like this you +can disable it by adding the following line to your |vimrc| script: +> + :let g:session_menu = 0 +< +------------------------------------------------------------------------------- +The *g:session_name_suggestion_function* option + +The default completion of the |:SaveSession| command is based on the names of +the existing sessions. You can add your own suggestions using this option by +setting the option to the name of a Vim script function. By default this option +is set to an example function that suggests the name of the current git or +Mercurial feature branch (when you're working in a version control repository). + +------------------------------------------------------------------------------- +The *g:loaded_session* option + +This variable isn't really an option but if you want to avoid loading the vim- +session plug-in you can set this variable to any value in your |vimrc| script: +> + :let g:loaded_session = 1 +< +=============================================================================== + *session-compatibility-with-other-plug-ins* +Compatibility with other plug-ins ~ + +Vim's |:mksession| command isn't really compatible with plug-ins that create +buffers with generated content and because of this the vim-session plug-in +includes specific workarounds for a couple of popular plug-ins: + +- BufExplorer [7], Conque Shell [8], NERD tree [9], Project [10] and taglist + [11] windows are supported; +- When shell.vim [12] is installed Vim's full-screen state is persisted; +- The netrw (see |netrw-start|) plug-in supports sessions out of the box. + +If your favorite plug-in doesn't work with the vim-session plug-in drop me a +mail and I'll see what I can do. Please include a link to the plug-in in your +e-mail so that I can install and test the plug-in. + +=============================================================================== + *session-function-reference* +Function reference ~ + +The documentation of the 39 functions below was extracted from 2 Vim scripts on +April 1, 2015 at 22:22. + +------------------------------------------------------------------------------- + *public-api-for-vim-session-plug-in* +Public API for the vim-session plug-in ~ + +------------------------------------------------------------------------------- +The *xolox#session#save_session()* function + +Save the current Vim editing session to a Vim script using the |:mksession| +command and some additional Vim magic provided by the vim-session plug-in. When +the generated session script is later sourced using the |:source| command +(possibly in another process or even on another machine) it will restore the +editing session to its previous state (provided all of the files involved in +the session are still there at their original locations). + +The first argument is expected to be a list, it will be extended with the lines +to be added to the session script. The second argument is expected to be the +filename under which the script will later be saved (it's embedded in a comment +at the top of the script). + +------------------------------------------------------------------------------- +The *xolox#session#save_globals()* function + +Serialize the values of the global variables configured by the user with the +|g:session_persist_globals| option. The first argument is expected to be a +list, it will be extended with the lines to be added to the session script. + +------------------------------------------------------------------------------- +The *xolox#session#save_features()* function + +Save the current state of the following Vim features: + +- Whether syntax highlighting is enabled (':syntax on') +- Whether file type detection is enabled (':filetype on') +- Whether file type plug-ins are enabled (':filetype plugin on') +- Whether file type indent plug-ins are enabled (':filetype indent on') + +The first argument is expected to be a list, it will be extended with the lines +to be added to the session script. + +------------------------------------------------------------------------------- +The *xolox#session#save_colors()* function + +Save the current color scheme and background color. The first argument is +expected to be a list, it will be extended with the lines to be added to the +session script. + +------------------------------------------------------------------------------- +The *xolox#session#save_fullscreen()* function + +Save the full screen state of Vim. This function provides integration between +my vim-session [13] and vim-shell [14] plug-ins. The first argument is expected +to be a list, it will be extended with the lines to be added to the session +script. + +------------------------------------------------------------------------------- +The *xolox#session#save_qflist()* function + +Save the contents of the quick-fix list. The first argument is expected to be a +list, it will be extended with the lines to be added to the session script. + +------------------------------------------------------------------------------- +The *xolox#session#save_state()* function + +Wrapper for the |:mksession| command that slightly massages the generated Vim +script to get rid of some strange quirks in the way Vim generates sessions. +Also implements support for buffers with content that was generated by other +Vim plug-ins. The first argument is expected to be a list, it will be extended +with the lines to be added to the session script. + +------------------------------------------------------------------------------- +The *xolox#session#save_special_windows()* function + +Implements support for buffers with content that was generated by other Vim +plug-ins. The first argument is expected to be a list, it will be extended with +the lines to be added to the session script. + +------------------------------------------------------------------------------- +The *xolox#session#auto_load()* function + +Automatically load the default or last used session when Vim starts. Normally +called by the |VimEnter| automatic command event. + +------------------------------------------------------------------------------- +The *xolox#session#is_empty()* function + +Check that the user has started Vim without editing any files. Used by +|xolox#session#auto_load()| to determine whether automatic session loading +should be performed. Currently checks the following conditions: + +1. That the current buffer is either empty (contains no lines and is not + modified) or showing vim-startify [15]. +2. That the buffer list either empty or persistent. + +------------------------------------------------------------------------------- +The *xolox#session#auto_save()* function + +Automatically save the current editing session when Vim is closed. Normally +called by the |VimLeavePre| automatic command event. + +------------------------------------------------------------------------------- +The *xolox#session#auto_save_periodic()* function + +Automatically saves the current editing session every few minutes. Normally +called by the |CursorHold| and |CursorHoldI| automatic command events. + +------------------------------------------------------------------------------- +The *xolox#session#auto_unlock()* function + +Automatically unlock all sessions when Vim quits. Normally called by the +|VimLeavePre| automatic command event. + +------------------------------------------------------------------------------- +The *xolox#session#prompt_for_name()* function + +Prompt the user to select one of the existing sessions. The first argument is +expected to be a string describing what will be done to the session once it's +been selected. Returns the name of the selected session as a string. If no +session is selected an empty string is returned. Here's an example of what the +prompt looks like: +> + :call xolox#session#prompt_for_name('trash') + + Please select the session to trash: + + 1. first-session + 2. second-session + 3. third-session + + Type number and or click with mouse (empty cancels): +< +If only a single session exists there's nothing to choose from so the name of +that session will be returned directly, without prompting the user. + +------------------------------------------------------------------------------- +The *xolox#session#name_to_path()* function + +Convert the name of a session (the first argument, expected to be a string) to +an absolute pathname. Any special characters in the session name will be +encoded using URL encoding. This means you're free to use whatever naming +conventions you like (regardless of special characters like slashes). Returns a +string. + +------------------------------------------------------------------------------- +The *xolox#session#path_to_name()* function + +Convert the absolute pathname of a session script (the first argument, expected +to be a string) to a session name. This function assumes the absolute pathname +refers to the configured session directory, but it does not check for it nor +does it require it (it simple takes the base name of the absolute pathname of +the session script and decodes it). Returns a string. + +------------------------------------------------------------------------------- +The *xolox#session#get_names()* function + +Get the names of all available sessions. This scans the directory configured +with |g:session_directory| for files that end with the suffix configured with +|g:session_extension|, takes the base name of each file and decodes any URL +encoded characters. Returns a list of strings. + +If the first argument is true (1) then the user defined function configured +with |g:session_name_suggestion_function| is called to find suggested session +names, which are prefixed to the list of available sessions, otherwise the +argument should be false (0). + +------------------------------------------------------------------------------- +The *xolox#session#complete_names()* function + +Completion function for user defined Vim commands. Used by commands like +|:OpenSession| and |:DeleteSession| (but not |:SaveSession|) to support user +friendly completion. + +------------------------------------------------------------------------------- +The *xolox#session#complete_names_with_suggestions()* function + +Completion function for the Vim command |:SaveSession|. + +------------------------------------------------------------------------------- +The *xolox#session#is_tab_scoped()* function + +Determine whether the current session is tab scoped or global. Returns 1 (true) +when the session is tab scoped, 0 (false) otherwise. + +------------------------------------------------------------------------------- +The *xolox#session#find_current_session()* function + +Find the name of the current tab scoped or global session. Returns a string. If +no session is active an empty string is returned. + +------------------------------------------------------------------------------- +The *xolox#session#get_label()* function + +Get a human readable label based on the scope (tab scoped or global) and name +of a session. The first argument is the name (a string) and the second argument +is a boolean indicating the scope of the session; 1 (true) means tab scoped and +0 (false) means global scope. Returns a string. + +------------------------------------------------------------------------------- +The *xolox#session#options_include()* function + +Check whether Vim's sessionoptions (see |'sessionoptions'|) option includes the +keyword given as the first argument (expected to be a string). Returns 1 (true) +when it does, 0 (false) otherwise. + +------------------------------------------------------------------------------- +The *xolox#session#include_tabs()* function + +Check whether Vim's sessionoptions (see |'sessionoptions'|) option includes the +'tabpages' keyword. Returns 1 (true) when it does, 0 (false) otherwise. + +------------------------------------------------------------------------------- +The *xolox#session#change_tab_options()* function + +Temporarily change Vim's sessionoptions (see |'sessionoptions'|) option so we +can save a tab scoped session. Saves a copy of the original value to be +restored later. + +------------------------------------------------------------------------------- +The *xolox#session#restore_tab_options()* function + +Restore the original value of Vim's sessionoptions (see |'sessionoptions'|) +option. + +------------------------------------------------------------------------------- +The *xolox#session#locking_enabled()* function + +Check whether session locking is enabled. Returns true (1) when locking is +enabled, false (0) otherwise. + +By default session locking is enabled but users can opt-out by setting +|g:session_lock_enabled| to false (0). + +------------------------------------------------------------------------------- + *example-function-for-session-name-suggestions* +Example function for session name suggestions ~ + +------------------------------------------------------------------------------- +The *xolox#session#suggestions#vcs_feature_branch()* function + +This function implements an example of a function that can be used with the +|g:session_name_suggestion_function| option. It finds the name of the current +git or Mercurial feature branch (if any) and suggests this name as the name for +the session that is being saved with :SaveSession. Returns a list with one +string on success and an empty list on failure. + +=============================================================================== + *session-troubleshooting* +Troubleshooting ~ + +------------------------------------------------------------------------------- + *session-using-multiple-platforms* +Using multiple platforms (multi boot, Cygwin, etc.) ~ + +Session scripts cannot be shared between platforms because they contain +absolute pathnames that most certainly won't match between e.g. Windows and +Linux or even Windows and Cygwin. The best you can do is keep separate session +scripts for different platforms (and I would certainly consider Cygwin a +separate platform altogether :-). For more information please refer to issue 85 +[16]. + +=============================================================================== + *session-contact* +Contact ~ + +If you have questions, bug reports, suggestions, etc. the author can be +contacted at peter@peterodding.com. The latest version is available at +http://peterodding.com/code/vim/session/ and http://github.com/xolox/vim- +session. If you like the script please vote for it on Vim Online [17]. + +=============================================================================== + *session-license* +License ~ + +This software is licensed under the MIT license [18]. © 2015 Peter Odding + and Ingo Karkat. + +Thanks go out to everyone who has helped to improve the vim-session plug-in +(whether through pull requests, bug reports or personal e-mails). + +=============================================================================== + *sample-session-script* +Sample session script ~ + +Here's an example session script generated by the vim-session plug-in while I +was editing the plug-in itself in Vim: +> + " ~/.vim/sessions/example.vim: Vim session script. + " Created by session.vim on 30 August 2010 at 05:26:28. + " Open this file in Vim and run :source % to restore your session. + + set guioptions=aegit + set guifont=Monaco\ 13 + if exists('g:syntax_on') != 1 | syntax on | endif + if exists('g:did_load_filetypes') != 1 | filetype on | endif + if exists('g:did_load_ftplugin') != 1 | filetype plugin on | endif + if exists('g:did_indent_on') != 1 | filetype indent on | endif + if !exists('g:colors_name') || g:colors_name != 'slate' | colorscheme slate | endif + call setqflist([]) + let SessionLoad = 1 + if &cp | set nocp | endif + let s:so_save = &so | let s:siso_save = &siso | set so=0 siso=0 + let v:this_session=expand(":p") + silent only + cd ~/Development/Vim/vim-session + if expand('%') == '' && !&modified && line('$') <= 1 && getline(1) == '' + let s:wipebuf = bufnr('%') + endif + set shortmess=aoO + badd +473 ~/Development/Vim/vim-session/autoload.vim + badd +1 ~/Development/Vim/vim-session/README.md + badd +1 ~/Development/Vim/vim-session/session.vim + badd +1 ~/Development/Vim/vim-session/TODO.md + set lines=43 columns=167 + edit ~/Development/Vim/vim-session/README.md + set splitbelow splitright + set nosplitbelow + set nosplitright + wincmd t + set winheight=1 winwidth=1 + argglobal + let s:l = 28 - ((27 * winheight(0) + 21) / 42) + if s:l < 1 | let s:l = 1 | endif + exe s:l + normal! zt + 28 + normal! 0 + tabedit ~/Development/Vim/vim-session/TODO.md + set splitbelow splitright + set nosplitbelow + set nosplitright + wincmd t + set winheight=1 winwidth=1 + argglobal + let s:l = 6 - ((5 * winheight(0) + 21) / 42) + if s:l < 1 | let s:l = 1 | endif + exe s:l + normal! zt + 6 + normal! 0 + tabedit ~/Development/Vim/vim-session/session.vim + set splitbelow splitright + set nosplitbelow + set nosplitright + wincmd t + set winheight=1 winwidth=1 + argglobal + let s:l = 17 - ((16 * winheight(0) + 21) / 42) + if s:l < 1 | let s:l = 1 | endif + exe s:l + normal! zt + 17 + normal! 014l + tabedit ~/Development/Vim/vim-session/autoload.vim + set splitbelow splitright + set nosplitbelow + set nosplitright + wincmd t + set winheight=1 winwidth=1 + argglobal + let s:l = 473 - ((41 * winheight(0) + 21) / 42) + if s:l < 1 | let s:l = 1 | endif + exe s:l + normal! zt + 473 + normal! 018l + tabnext 4 + if exists('s:wipebuf') + silent exe 'bwipe ' . s:wipebuf + endif + unlet! s:wipebuf + set winheight=1 winwidth=1 shortmess=filnxtToO + let s:sx = expand(":p:r")."x.vim" + if file_readable(s:sx) + exe "source " . fnameescape(s:sx) + endif + let &so = s:so_save | let &siso = s:siso_save + doautoall SessionLoadPost + unlet SessionLoad +< +=============================================================================== + *session-references* +References ~ + +[1] https://raw.githubusercontent.com/xolox/vim-session/master/screenshots/session-save-prompt.png +[2] https://raw.githubusercontent.com/xolox/vim-session/master/screenshots/session-restore-prompt.png +[3] http://peterodding.com/code/vim/session/#sample_session_script +[4] https://github.com/xolox/vim-session/blob/master/INSTALL.md +[5] http://peterodding.com/code/vim/reload/ +[6] https://github.com/xolox/vim-session/pull/81 +[7] http://www.vim.org/scripts/script.php?script_id=42 +[8] http://www.vim.org/scripts/script.php?script_id=2771 +[9] http://www.vim.org/scripts/script.php?script_id=1658 +[10] http://www.vim.org/scripts/script.php?script_id=69 +[11] http://www.vim.org/scripts/script.php?script_id=273 +[12] http://peterodding.com/code/vim/shell/ +[13] http://peterodding.com/code/vim/session +[14] http://peterodding.com/code/vim/shell +[15] https://github.com/mhinz/vim-startify/ +[16] https://github.com/xolox/vim-session/issues/85 +[17] http://www.vim.org/scripts/script.php?script_id=3150 +[18] http://en.wikipedia.org/wiki/MIT_License + +vim: ft=help diff --git a/sources_non_forked/vim-session-master/plugin/session.vim b/sources_non_forked/vim-session-master/plugin/session.vim new file mode 100755 index 00000000..d465ef91 --- /dev/null +++ b/sources_non_forked/vim-session-master/plugin/session.vim @@ -0,0 +1,205 @@ +" Vim script +" Author: Peter Odding +" Last Change: July 6, 2014 +" URL: http://peterodding.com/code/vim/session/ + +" Support for automatic update using the GLVS plug-in. +" GetLatestVimScripts: 3150 1 :AutoInstall: session.zip + +" Don't load the plug-in when &compatible is set or it was already loaded. +if &cp || exists('g:loaded_session') + finish +endif + +" Make sure vim-misc is installed. {{{1 + +try + " The point of this code is to do something completely innocent while making + " sure the vim-misc plug-in is installed. We specifically don't use Vim's + " exists() function because it doesn't load auto-load scripts that haven't + " already been loaded yet (last tested on Vim 7.3). + call type(g:xolox#misc#version) +catch + echomsg "Warning: The vim-session plug-in requires the vim-misc plug-in which seems not to be installed! For more information please review the installation instructions in the readme (also available on the homepage and on GitHub). The vim-session plug-in will now be disabled." + let g:loaded_session = 1 + finish +endtry + +" Configuration defaults. {{{1 + +" The name of the default session (without directory or filename extension). +if !exists('g:session_default_name') + let g:session_default_name = 'default' +endif + +" If you set this to 1 (true), every Vim instance without an explicit session +" loaded will overwrite the default session (the last Vim instance wins). +if !exists('g:session_default_overwrite') + let g:session_default_overwrite = 0 +endif + +" The file extension of session scripts. +if !exists('g:session_extension') + let g:session_extension = '.vim' +endif + +" When you start Vim without opening any files the plug-in will prompt you +" whether you want to load the default session. Other supported values for +" this option are 'yes' (to load the default session without prompting) and +" 'no' (don't prompt and don't load the default session). +if !exists('g:session_autoload') + let g:session_autoload = 'prompt' +endif + +" When you quit Vim the plug-in will prompt you whether you want to save your +" current session. Other supported values for this option are 'yes' (to save +" the session without prompting) and 'no' (don't prompt and don't save the +" session). +if !exists('g:session_autosave') + let g:session_autosave = 'prompt' +endif + +" Periodically save the active session automatically? Set this to the +" auto-save interval in minutes. The value zero disables the feature +" (this is the default). +if !exists('g:session_autosave_periodic') + let g:session_autosave_periodic = 0 +endif + +" Define the verbosity of messages. +if !exists('g:session_verbose_messages') + let g:session_verbose_messages = 1 +endif + +" The session plug-in can automatically open sessions in three ways: based on +" Vim's server name, by remembering the last used session or by opening the +" default session. Enable this option to use the second approach. +if !exists('g:session_default_to_last') + let g:session_default_to_last = 0 +endif + +" List with global variables and &options to persist between sessions. +if !exists('g:session_persist_globals') + let g:session_persist_globals = [] +endif + +" On UNIX the :RestartVim command will pass the following environment +" variables on to the new instance of Vim. +if !exists('g:session_restart_environment') + let g:session_restart_environment = ['TERM', 'VIM', 'VIMRUNTIME'] +endif + +" The default directory where session scripts are stored. +if !exists('g:session_directory') + if xolox#misc#os#is_win() + let g:session_directory = '~\vimfiles\sessions' + else + let g:session_directory = '~/.vim/sessions' + endif +endif + +" Define session command aliases of the form "Session" + Action in addition +" to the real command names which are of the form Action + "Session"? +if !exists('g:session_command_aliases') + let g:session_command_aliases = 0 +endif + +" Allow to turn off the menu. +if !exists('g:session_menu') + let g:session_menu = 1 +endif + +" Toggle the persistence of color schemes and the 'background' option. +if !exists('g:session_persist_colors') + let g:session_persist_colors = 1 +endif + +" Enable user defined session name completion suggestions for :SaveSession. +if !exists('g:session_name_suggestion_function') + let g:session_name_suggestion_function = 'xolox#session#suggestions#vcs_feature_branch' +endif + +" Make sure the sessions directory exists and is writable. {{{1 + +let s:directory = fnamemodify(g:session_directory, ':p') +if !isdirectory(s:directory) + call mkdir(s:directory, 'p') +endif +if filewritable(s:directory) != 2 + let s:msg = "session.vim %s: The sessions directory %s isn't writable!" + call xolox#misc#msg#warn(s:msg, g:xolox#session#version, string(s:directory)) + unlet s:msg + finish +endif +unlet s:directory + +" Menu items to make the plug-in more accessible. {{{1 + +if g:session_menu + amenu 400.10 &Sessions.&Open\ session\.\.\.:OpenSession :OpenSession + amenu 400.20 &Sessions.&Save\ session\.\.\.:SaveSession :SaveSession + amenu 400.30 &Sessions.&Close\ session\.\.\.:CloseSession :CloseSession + amenu 400.40 &Sessions.&Delete\ session\.\.\.:DeleteSession :DeleteSession + amenu 400.50 &Sessions.&View\ session\.\.\.:ViewSession :ViewSession + amenu 400.60 &Sessions.-Sep1- : + amenu 400.70 &Sessions.Open\ tab\ session\.\.\.:OpenTabSession :OpenTabSession + amenu 400.80 &Sessions.&Append\ tab\ session\.\.\.:AppendTabSession :AppendTabSession + amenu 400.90 &Sessions.Save\ tab\ session\.\.\.:SaveTabSession :SaveTabSession + amenu 400.100 &Sessions.Close\ tab\ session\.\.\.:CloseTabSession :CloseTabSession + amenu 400.110 &Sessions.-Sep2- : + amenu 400.120 &Sessions.&Restart\ Vim\.\.\.:RestartVim :RestartVim +endif + +" Automatic commands for automatic session management. {{{1 + +augroup PluginSession + autocmd! + au VimEnter * nested call xolox#session#auto_load() + au VimLeavePre * call xolox#session#auto_save() + au VimLeavePre * call xolox#session#auto_unlock() +augroup END + +call xolox#misc#cursorhold#register({'function': 'xolox#session#auto_save_periodic', 'interval': 60}) + +" Plug-in commands (user defined commands). {{{1 + +" Define commands that enable users to manage multiple named, heavy-weight +" sessions (used to persist/restore a complete Vim editing session including +" one or more tab pages). +command! -bar -bang -nargs=? -complete=customlist,xolox#session#complete_names OpenSession call xolox#session#open_cmd(, , 'OpenSession') +command! -bar -nargs=? -complete=customlist,xolox#session#complete_names ViewSession call xolox#session#view_cmd() +command! -bar -bang -nargs=? -complete=customlist,xolox#session#complete_names_with_suggestions SaveSession call xolox#session#save_cmd(, , 'SaveSession') +command! -bar -bang -nargs=? -complete=customlist,xolox#session#complete_names DeleteSession call xolox#session#delete_cmd(, ) +command! -bar -bang CloseSession call xolox#session#close_cmd(, 0, 1, 'CloseSession') + +" Define commands that enable users to manage multiple named, light-weight +" sessions (used to persist/restore the window layout of a single tab page). +command! -bar -bang -nargs=? -complete=customlist,xolox#session#complete_names OpenTabSession call xolox#session#open_tab_cmd(, , 'OpenTabSession') +command! -bar -bang -nargs=? -complete=customlist,xolox#session#complete_names SaveTabSession call xolox#session#save_tab_cmd(, , 'SaveTabSession') +command! -bar -bang -range=-1 -nargs=? -complete=customlist,xolox#session#complete_names AppendTabSession call xolox#session#append_tab_cmd(, , , 'AppendTabSession') +command! -bar -bang CloseTabSession call xolox#session#close_tab_cmd(, 'CloseTabSession') + +" Define a command to restart Vim editing sessions. +command! -bang -nargs=* -complete=command RestartVim call xolox#session#restart_cmd(, ) + +" Plug-in command aliases. {{{2 + +if g:session_command_aliases + " Define command aliases of the form "Session" + Action in addition to + " the real command names which are of the form Action + "Session" (above). + command! -bar -bang -nargs=? -complete=customlist,xolox#session#complete_names SessionOpen call xolox#session#open_cmd(, , 'SessionOpen') + command! -bar -nargs=? -complete=customlist,xolox#session#complete_names SessionView call xolox#session#view_cmd() + command! -bar -bang -nargs=? -complete=customlist,xolox#session#complete_names SessionSave call xolox#session#save_cmd(, , 'SessionSave') + command! -bar -bang -nargs=? -complete=customlist,xolox#session#complete_names SessionDelete call xolox#session#delete_cmd(, ) + command! -bar -bang SessionClose call xolox#session#close_cmd(, 0, 1, 'SessionClose') + command! -bar -bang -nargs=? -complete=customlist,xolox#session#complete_names SessionTabOpen call xolox#session#open_tab_cmd(, , 'SessionTabOpen') + command! -bar -bang -nargs=? -complete=customlist,xolox#session#complete_names SessionTabSave call xolox#session#save_tab_cmd(, , 'SessionTabSave') + command! -bar -bang -range=-1 -nargs=? -complete=customlist,xolox#session#complete_names SessionTabAppend call xolox#session#append_tab_cmd(, , , 'SessionTabAppend') + command! -bar -bang SessionTabClose call xolox#session#close_tab_cmd(, 'SessionTabClose') +endif + +" Don't reload the plug-in once it has loaded successfully. {{{1 + +let g:loaded_session = 1 + +" vim: ts=2 sw=2 et diff --git a/sources_non_forked/vim-session-master/screenshots/session-restore-prompt.png b/sources_non_forked/vim-session-master/screenshots/session-restore-prompt.png new file mode 100755 index 0000000000000000000000000000000000000000..2e52ea376de25166c93779e45191953ce19b07b5 GIT binary patch literal 22330 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 c :call SyntasticCheckCoffeescript() """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" let g:gitgutter_enabled=0 nnoremap d :GitGutterToggle + +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" => Vim-Session +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +let g:session_directory="~/tmp" +let g:session_autoload="no" + From 7e1431788125a67955442b332664fd485a51b621 Mon Sep 17 00:00:00 2001 From: Huaishun Hu Date: Sun, 3 Sep 2017 14:02:05 +0800 Subject: [PATCH 12/22] enable gitgutter; fix move tab left not working --- my_configs.vim | 2 +- vimrcs/plugins_config.vim | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/my_configs.vim b/my_configs.vim index eb79c630..67a757ac 100644 --- a/my_configs.vim +++ b/my_configs.vim @@ -19,7 +19,7 @@ map gt " mv current tab left map :execute 'tabmove ' . (tabpagenr()-2) " mv current tab right -map :execute 'tabmove ' . tabpagenr() +map :execute 'tabmove ' . (tabpagenr()+1) " new tab map :tabnew diff --git a/vimrcs/plugins_config.vim b/vimrcs/plugins_config.vim index 6b81f556..dcb9ad1f 100644 --- a/vimrcs/plugins_config.vim +++ b/vimrcs/plugins_config.vim @@ -160,7 +160,7 @@ nnoremap c :call SyntasticCheckCoffeescript() """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => Git gutter (Git diff) """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -let g:gitgutter_enabled=0 +let g:gitgutter_enabled=1 nnoremap d :GitGutterToggle """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" From 38e881546f918b7f356d421ee280ccfb90b1b1c8 Mon Sep 17 00:00:00 2001 From: Huaishun Hu Date: Wed, 25 Oct 2017 14:15:53 +0800 Subject: [PATCH 13/22] update vimrc --- my_configs.vim | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/my_configs.vim b/my_configs.vim index 67a757ac..cb48458e 100644 --- a/my_configs.vim +++ b/my_configs.vim @@ -1,13 +1,13 @@ if has("mac") || has("macunix") - set gfn=Hack:h16,Source\ Code\ Pro:h16,Menlo:h16 + set gfn=Hack:h14,Source\ Code\ Pro:h14,Menlo:h14 elseif has("win16") || has("win32") - set gfn=Hack:h18,Source\ Code\ Pro:h16,Bitstream\ Vera\ Sans\ Mono:h15 + set gfn=Hack:h14,Source\ Code\ Pro:h14,Bitstream\ Vera\ Sans\ Mono:h14 elseif has("gui_gtk2") - set gfn=Hack\ 18,Source\ Code\ Pro\ 16,Bitstream\ Vera\ Sans\ Mono\ 15 + set gfn=Hack\ 14,Source\ Code\ Pro\ 14,Bitstream\ Vera\ Sans\ Mono\ 14 elseif has("linux") - set gfn=Hack\ 18,Source\ Code\ Pro\ 16,Bitstream\ Vera\ Sans\ Mono\ 15 + set gfn=Hack\ 14,Source\ Code\ Pro\ 14,Bitstream\ Vera\ Sans\ Mono\ 14 elseif has("unix") - set gfn=Monospace\ 20 + set gfn=Monospace\ 14 endif " move around tabs. conflict with the original screen top/bottom @@ -51,3 +51,8 @@ let g:jsx_ext_required = 0 " Eslint " let g:syntastic_javascript_checkers = ['eslint'] +" disable Syntastic by default +let g:syntastic_mode_map = { 'mode': 'passive' } + +" setl foldmethod=manual + From 3b01a63d518af3ae89de074254a07081061f4dc2 Mon Sep 17 00:00:00 2001 From: Huaishun Hu Date: Mon, 27 Nov 2017 13:41:25 +0800 Subject: [PATCH 14/22] update vimrc --- my_configs.vim | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/my_configs.vim b/my_configs.vim index cb48458e..b7d80cd4 100644 --- a/my_configs.vim +++ b/my_configs.vim @@ -1,13 +1,13 @@ if has("mac") || has("macunix") - set gfn=Hack:h14,Source\ Code\ Pro:h14,Menlo:h14 + set gfn=Hack:h10,Source\ Code\ Pro:h10,Menlo:h10 elseif has("win16") || has("win32") - set gfn=Hack:h14,Source\ Code\ Pro:h14,Bitstream\ Vera\ Sans\ Mono:h14 + set gfn=Hack:h10,Source\ Code\ Pro:h10,Bitstream\ Vera\ Sans\ Mono:h10 elseif has("gui_gtk2") - set gfn=Hack\ 14,Source\ Code\ Pro\ 14,Bitstream\ Vera\ Sans\ Mono\ 14 + set gfn=Hack\ 10,Source\ Code\ Pro\ 10,Bitstream\ Vera\ Sans\ Mono\ 10 elseif has("linux") - set gfn=Hack\ 14,Source\ Code\ Pro\ 14,Bitstream\ Vera\ Sans\ Mono\ 14 + set gfn=Hack\ 10,Source\ Code\ Pro\ 10,Bitstream\ Vera\ Sans\ Mono\ 10 elseif has("unix") - set gfn=Monospace\ 14 + set gfn=Monospace\ 10 endif " move around tabs. conflict with the original screen top/bottom @@ -25,6 +25,8 @@ map :execute 'tabmove ' . (tabpagenr()+1) map :tabnew " close tab map :tabclose +" show all open tabs +map :tabs " toggle NerdTree map :NERDTreeToggle From 77bbe61980710227f27fb08e4c05798494928f9e Mon Sep 17 00:00:00 2001 From: Huaishun Hu Date: Mon, 27 Nov 2017 17:17:56 +0800 Subject: [PATCH 15/22] add tagbar, .ctags for js --- .ctags | 43 + .gitignore | 1 + .tern-config | 5 + package.json | 23 + sources_non_forked/tagbar/.gitattributes | 4 + sources_non_forked/tagbar/.gitignore | 1 + sources_non_forked/tagbar/.info | 2 + sources_non_forked/tagbar/LICENSE | 82 + sources_non_forked/tagbar/README.md | 85 + sources_non_forked/tagbar/autoload/tagbar.vim | 3388 +++++++++++++++++ .../tagbar/autoload/tagbar/debug.vim | 62 + .../autoload/tagbar/prototypes/basetag.vim | 237 ++ .../autoload/tagbar/prototypes/fileinfo.vim | 146 + .../tagbar/prototypes/kindheadertag.vim | 61 + .../autoload/tagbar/prototypes/normaltag.vim | 119 + .../autoload/tagbar/prototypes/pseudotag.vim | 36 + .../autoload/tagbar/prototypes/splittag.vim | 26 + .../autoload/tagbar/prototypes/typeinfo.vim | 42 + .../tagbar/autoload/tagbar/sorting.vim | 57 + .../tagbar/autoload/tagbar/state.vim | 51 + .../tagbar/autoload/tagbar/types/ctags.vim | 752 ++++ .../tagbar/autoload/tagbar/types/uctags.vim | 1064 ++++++ sources_non_forked/tagbar/doc/tagbar.txt | 1569 ++++++++ sources_non_forked/tagbar/plugin/tagbar.vim | 151 + sources_non_forked/tagbar/syntax/tagbar.vim | 64 + vimrcs/plugins_config.vim | 6 + 26 files changed, 8077 insertions(+) create mode 100644 .ctags create mode 100644 .tern-config create mode 100644 package.json create mode 100644 sources_non_forked/tagbar/.gitattributes create mode 100644 sources_non_forked/tagbar/.gitignore create mode 100644 sources_non_forked/tagbar/.info create mode 100644 sources_non_forked/tagbar/LICENSE create mode 100644 sources_non_forked/tagbar/README.md create mode 100644 sources_non_forked/tagbar/autoload/tagbar.vim create mode 100644 sources_non_forked/tagbar/autoload/tagbar/debug.vim create mode 100644 sources_non_forked/tagbar/autoload/tagbar/prototypes/basetag.vim create mode 100644 sources_non_forked/tagbar/autoload/tagbar/prototypes/fileinfo.vim create mode 100644 sources_non_forked/tagbar/autoload/tagbar/prototypes/kindheadertag.vim create mode 100644 sources_non_forked/tagbar/autoload/tagbar/prototypes/normaltag.vim create mode 100644 sources_non_forked/tagbar/autoload/tagbar/prototypes/pseudotag.vim create mode 100644 sources_non_forked/tagbar/autoload/tagbar/prototypes/splittag.vim create mode 100644 sources_non_forked/tagbar/autoload/tagbar/prototypes/typeinfo.vim create mode 100644 sources_non_forked/tagbar/autoload/tagbar/sorting.vim create mode 100644 sources_non_forked/tagbar/autoload/tagbar/state.vim create mode 100644 sources_non_forked/tagbar/autoload/tagbar/types/ctags.vim create mode 100644 sources_non_forked/tagbar/autoload/tagbar/types/uctags.vim create mode 100644 sources_non_forked/tagbar/doc/tagbar.txt create mode 100644 sources_non_forked/tagbar/plugin/tagbar.vim create mode 100644 sources_non_forked/tagbar/syntax/tagbar.vim diff --git a/.ctags b/.ctags new file mode 100644 index 00000000..a8dda83e --- /dev/null +++ b/.ctags @@ -0,0 +1,43 @@ +--exclude=node_modules +--exclude=gulp + +--languages=-JavaScript +--langdef=js +--langmap=js:.js + +--regex-js=/(,|(;|^)[ \t]*(var|let|([A-Za-z_$][A-Za-z0-9_$.]+\.)*))[ \t]*([A-Za-z0-9_$]+)[ \t]*=[ \t]*\{/\5/,object/ +--regex-js=/(,|(;|^)[ \t]*(var|let|([A-Za-z_$][A-Za-z0-9_$.]+\.)*))[ \t]*([A-Za-z0-9_$]+)[ \t]*=[ \t]*function[ \t]*\(/\5/,function/ +--regex-js=/(,|(;|^)[ \t]*(var|let|([A-Za-z_$][A-Za-z0-9_$.]+\.)*))[ \t]*([A-Za-z0-9_$]+)[ \t]*=[ \t]*\[/\5/,array/ +--regex-js=/(,|(;|^)[ \t]*(var|let|([A-Za-z_$][A-Za-z0-9_$.]+\.)*))[ \t]*([A-Za-z0-9_$]+)[ \t]*=[ \t]*[^"]'[^']*/\5/,string/ +--regex-js=/(,|(;|^)[ \t]*(var|let|([A-Za-z_$][A-Za-z0-9_$.]+\.)*))[ \t]*([A-Za-z0-9_$]+)[ \t]*=[ \t]*(true|false)/\5/,boolean/ +--regex-js=/(,|(;|^)[ \t]*(var|let|([A-Za-z_$][A-Za-z0-9_$.]+\.)*))[ \t]*([A-Za-z0-9_$]+)[ \t]*=[ \t]*[0-9]+/\5/,number/ +--regex-js=/(,|(;|^)[ \t]*(var|let|([A-Za-z_$][A-Za-z0-9_$.]+\.)*))[ \t]*([A-Za-z0-9_$]+)[ \t]*=[ \t]*.+([,;=]|$)/\5/,variable/ +--regex-js=/(,|(;|^)[ \t]*(var|let|([A-Za-z_$][A-Za-z0-9_$.]+\.)*))[ \t]*([A-Za-z0-9_$]+)[ \t]*[ \t]*([,;]|$)/\5/,variable/ +--regex-js=/function[ \t]+([A-Za-z0-9_$]+)[ \t]*\([^)]*\)/\1/,function/ + +--regex-js=/(,|^)[ \t]*([A-Za-z_$][A-Za-z0-9_$]+)[ \t]*:[ \t]*\{/\2/,object/ +--regex-js=/(,|^)[ \t]*([A-Za-z_$][A-Za-z0-9_$]+)[ \t]*:[ \t]*function[ \t]*\(/\2/,function/ +--regex-js=/(,|^)[ \t]*([A-Za-z_$][A-Za-z0-9_$]+)[ \t]*:[ \t]*\[/\2/,array/ +--regex-js=/(,|^)[ \t]*([A-Za-z_$][A-Za-z0-9_$]+)[ \t]*:[ \t]*[^"]'[^']*/\2/,string/ +--regex-js=/(,|^)[ \t]*([A-Za-z_$][A-Za-z0-9_$]+)[ \t]*:[ \t]*(true|false)/\2/,boolean/ +--regex-js=/(,|^)[ \t]*([A-Za-z_$][A-Za-z0-9_$]+)[ \t]*:[ \t]*[0-9]+/\2/,number/ +--regex-js=/(,|^)[ \t]*([A-Za-z_$][A-Za-z0-9_$]+)[ \t]*:[ \t]*[^=]+([,;]|$)/\2/,variable/ + + +--langdef=coffee +--langmap=coffee:.coffee.cjsx +--regex-coffee=/(^|=[ \t])*class ([A-Za-z_][A-Za-z0-9_]*\.)*([A-Za-z_][A-Za-z0-9_]*)( extends ([A-Za-z][A-Za-z0-9_.]*)+)?$/\3/c,class/ +--regex-coffee=/^[ \t]*(module\.)?(exports\.)?@?(([A-Za-z_][A-Za-z0-9_.]*)+):.*[-=]>.*$/\3/m,method/ +--regex-coffee=/^[ \t]*([A-Za-z_][A-Za-z0-9_]*\.)*([A-Za-z_][A-Za-z0-9_]*)[ \t]*=.*[-=]>.*$/\2/f,function/ +--regex-coffee=/^[ \t]*([A-Za-z_][A-Za-z0-9_]*\.)*([A-Za-z_][A-Za-z0-9_]*)[ \t]*=[^->]*$/\2/v,variable/ +--regex-coffee=/^[ \t]*@(([A-Za-z_][A-Za-z0-9_.]*)+)[ \t]*=[^->\n]*$/\1/a,attribute/ +--regex-coffee=/^[ \t]*@(([A-Za-z_][A-Za-z0-9_.]*)+):[^->\n]*$/\1/A,static attribute/ +--regex-coffee=/^[ \t]*(([A-Za-z_][A-Za-z0-9_.]*)+):[^->\n]*$/\1/a,attribute/ +--regex-coffee=/((constructor|initialize):[ \t]*\()@(([A-Za-z][A-Za-z0-9_.]*)+)([ \t]*=[ \t]*[^,)]+)?/\3/a,attribute/ + + + +--langdef=scss +--langmap=scss:.scss +--regex-scss=/^[ \t]*@mixin[ \t]+([A-Za-z0-9_]+)/\1/m,mixin/ +--regex-scss=/^[ \t]*@function[ \t]+([A-Za-z0-9_]+)/\1/f,function/ diff --git a/.gitignore b/.gitignore index 0448f793..a170cac3 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ sources_forked/yankring/doc/tags sources_non_forked/tlib/doc/tags sources_non_forked/ctrlp.vim/doc/tags* tags +node_modules diff --git a/.tern-config b/.tern-config new file mode 100644 index 00000000..2b524521 --- /dev/null +++ b/.tern-config @@ -0,0 +1,5 @@ +{ + "plugins": { + "closure": {} + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..2229db08 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "vimrc", + "version": "1.0.0", + "description": "![VIM](https://dnp4pehkvoo6n.cloudfront.net/43c5af597bd5c1a64eb1829f011c208f/as/Ultimate%20Vimrc.svg)", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ChrisOHu/vimrc.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/ChrisOHu/vimrc/issues" + }, + "homepage": "https://github.com/ChrisOHu/vimrc#readme", + "dependencies": { + "tern": "^0.21.0", + "tern-closure": "^0.1.3" + } +} diff --git a/sources_non_forked/tagbar/.gitattributes b/sources_non_forked/tagbar/.gitattributes new file mode 100644 index 00000000..3b1db11a --- /dev/null +++ b/sources_non_forked/tagbar/.gitattributes @@ -0,0 +1,4 @@ +.gitignore export-ignore +.gitattributes export-ignore +README export-ignore +.info export-ignore diff --git a/sources_non_forked/tagbar/.gitignore b/sources_non_forked/tagbar/.gitignore new file mode 100644 index 00000000..0a56e3fc --- /dev/null +++ b/sources_non_forked/tagbar/.gitignore @@ -0,0 +1 @@ +/doc/tags diff --git a/sources_non_forked/tagbar/.info b/sources_non_forked/tagbar/.info new file mode 100644 index 00000000..f4d91373 --- /dev/null +++ b/sources_non_forked/tagbar/.info @@ -0,0 +1,2 @@ +tagbar +3465 diff --git a/sources_non_forked/tagbar/LICENSE b/sources_non_forked/tagbar/LICENSE new file mode 100644 index 00000000..5ae1a752 --- /dev/null +++ b/sources_non_forked/tagbar/LICENSE @@ -0,0 +1,82 @@ +TAGBAR LICENSE + +This is the normal Vim license (see ':h license' in Vim) with the necessary +replacements for the project and maintainer information. + +I) There are no restrictions on distributing unmodified copies of Tagbar + except that they must include this license text. You can also distribute + unmodified parts of Tagbar, likewise unrestricted except that they must + include this license text. You are also allowed to include executables + that you made from the unmodified Tagbar sources, plus your own usage + examples and scripts. + +II) It is allowed to distribute a modified (or extended) version of Tagbar, + including executables and/or source code, when the following four + conditions are met: + 1) This license text must be included unmodified. + 2) The modified Tagbar must be distributed in one of the following five ways: + a) If you make changes to Tagbar yourself, you must clearly describe in + the distribution how to contact you. When the maintainer asks you + (in any way) for a copy of the modified Tagbar you distributed, you + must make your changes, including source code, available to the + maintainer without fee. The maintainer reserves the right to + include your changes in the official version of Tagbar. What the + maintainer will do with your changes and under what license they + will be distributed is negotiable. If there has been no negotiation + then this license, or a later version, also applies to your changes. + The current maintainer is Jan Larres . If this + changes it will be announced in appropriate places (most likely + majutsushi.github.io/tagbar and/or github.com/majutsushi/tagbar). + When it is completely impossible to contact the maintainer, the + obligation to send him your changes ceases. Once the maintainer has + confirmed that he has received your changes they will not have to be + sent again. + b) If you have received a modified Tagbar that was distributed as + mentioned under a) you are allowed to further distribute it + unmodified, as mentioned at I). If you make additional changes the + text under a) applies to those changes. + c) Provide all the changes, including source code, with every copy of + the modified Tagbar you distribute. This may be done in the form of + a context diff. You can choose what license to use for new code you + add. The changes and their license must not restrict others from + making their own changes to the official version of Tagbar. + d) When you have a modified Tagbar which includes changes as mentioned + under c), you can distribute it without the source code for the + changes if the following three conditions are met: + - The license that applies to the changes permits you to distribute + the changes to the Tagbar maintainer without fee or restriction, and + permits the Tagbar maintainer to include the changes in the official + version of Tagbar without fee or restriction. + - You keep the changes for at least three years after last + distributing the corresponding modified Tagbar. When the + maintainer or someone who you distributed the modified Tagbar to + asks you (in any way) for the changes within this period, you must + make them available to him. + - You clearly describe in the distribution how to contact you. This + contact information must remain valid for at least three years + after last distributing the corresponding modified Tagbar, or as + long as possible. + e) When the GNU General Public License (GPL) applies to the changes, + you can distribute the modified Tagbar under the GNU GPL version 2 + or any later version. + 3) A message must be added, at least in the documentation, such that the + user of the modified Tagbar is able to see that it was modified. When + distributing as mentioned under 2)e) adding the message is only + required for as far as this does not conflict with the license used for + the changes. + 4) The contact information as required under 2)a) and 2)d) must not be + removed or changed, except that the person himself can make + corrections. + +III) If you distribute a modified version of Tagbar, you are encouraged to use + the Tagbar license for your changes and make them available to the + maintainer, including the source code. The preferred way to do this is + by e-mail or by uploading the files to a server and e-mailing the URL. If + the number of changes is small (e.g., a modified Makefile) e-mailing a + context diff will do. The e-mail address to be used is + + +IV) It is not allowed to remove this license from the distribution of the + Tagbar sources, parts of it or from a modified version. You may use this + license for previous Tagbar releases instead of the license that they + came with, at your option. diff --git a/sources_non_forked/tagbar/README.md b/sources_non_forked/tagbar/README.md new file mode 100644 index 00000000..ba17c63f --- /dev/null +++ b/sources_non_forked/tagbar/README.md @@ -0,0 +1,85 @@ +# Tagbar: a class outline viewer for Vim + +## What Tagbar is + +Tagbar is a Vim plugin that provides an easy way to browse the tags of the +current file and get an overview of its structure. It does this by creating a +sidebar that displays the ctags-generated tags of the current file, ordered by +their scope. This means that for example methods in C++ are displayed under +the class they are defined in. + +## What Tagbar is not + +Tagbar is not a general-purpose tool for managing `tags` files. It only +creates the tags it needs on-the-fly in-memory without creating any files. +`tags` file management is provided by other plugins, like for example +[easytags](https://github.com/xolox/vim-easytags). + +## Dependencies + +[Vim 7.3.1058](http://www.vim.org/) +[Exuberant Ctags 5.5](http://ctags.sourceforge.net/) or +[Universal Ctags](https://ctags.io) (recommended), a maintained fork of +Exuberant Ctags. + +## Installation + +Extract the archive or clone the repository into a directory in your +`'runtimepath'`, or use a plugin manager of your choice like +[pathogen](https://github.com/tpope/vim-pathogen). Don't forget to run +`:helptags` if your plugin manager doesn't do it for you so you can access the +documentation with `:help tagbar`. + +If the ctags executable is not installed in one of the directories in your +`$PATH` environment variable you have to set the `g:tagbar_ctags_bin` +variable, see the documentation for more info. + +## Quickstart + +Put something like the following into your ~/.vimrc: + +```vim +nmap :TagbarToggle +``` + +If you do this the F8 key will toggle the Tagbar window. You can of course use +any shortcut you want. For more flexible ways to open and close the window +(and the rest of the functionality) see the documentation. + +## Support for additional filetypes + +For filetypes that are not supported by Exuberant Ctags check out [the +wiki](https://github.com/majutsushi/tagbar/wiki) to see whether other projects +offer support for them and how to use them. Please add any other +projects/configurations that you find or create yourself so that others can +benefit from them, too. + +## Note: If the file structure display is wrong + +If you notice that there are some errors in the way your file's structure is +displayed in Tagbar, please make sure that the bug is actually in Tagbar +before you report an issue. Since Tagbar uses +[exuberant-ctags](http://ctags.sourceforge.net/) and compatible programs to do +the actual file parsing, it is likely that the bug is actually in the program +responsible for that filetype instead. + +There is an example in `:h tagbar-issues` about how to run ctags manually so +you can determine where the bug actually is. If the bug is actually in ctags, +please report it on their website instead, as there is nothing I can do about +it in Tagbar. Thank you! + +You can also have a look at [ctags bugs that have previously been filed +against Tagbar](https://github.com/majutsushi/tagbar/issues?labels=ctags-bug&page=1&state=closed). + +## Screenshots + +![screenshot1](https://i.imgur.com/Sf9Ls2r.png) +![screenshot2](https://i.imgur.com/n4bpPv3.png) + +## License + +Vim license, see LICENSE + +## Maintainer + +Jan Larres <[jan@majutsushi.net](mailto:jan@majutsushi.net)> diff --git a/sources_non_forked/tagbar/autoload/tagbar.vim b/sources_non_forked/tagbar/autoload/tagbar.vim new file mode 100644 index 00000000..ea8febf0 --- /dev/null +++ b/sources_non_forked/tagbar/autoload/tagbar.vim @@ -0,0 +1,3388 @@ +" ============================================================================ +" File: tagbar.vim +" Description: List the current file's tags in a sidebar, ordered by class etc +" Author: Jan Larres +" Licence: Vim licence +" Website: http://majutsushi.github.com/tagbar/ +" Version: 2.7 +" Note: This plugin was heavily inspired by the 'Taglist' plugin by +" Yegappan Lakshmanan and uses a small amount of code from it. +" +" Original taglist copyright notice: +" 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, +" taglist.vim is provided *as is* and comes with no warranty of +" any kind, either expressed or implied. In no event will the +" copyright holder be liable for any damamges resulting from the +" use of this software. +" ============================================================================ + +scriptencoding utf-8 + +" Initialization {{{1 + +" If another plugin calls an autoloaded Tagbar function on startup before the +" plugin/tagbar.vim file got loaded, load it explicitly +if exists(':Tagbar') == 0 + runtime plugin/tagbar.vim +endif + +if exists(':Tagbar') == 0 + echomsg 'Tagbar: Could not load plugin code, check your runtimepath!' + finish +endif + +" Basic init {{{2 + +redir => s:ftype_out +silent filetype +redir END +if s:ftype_out !~# 'detection:ON' + echomsg 'Tagbar: Filetype detection is turned off, skipping plugin' + unlet s:ftype_out + finish +endif +unlet s:ftype_out + +let g:tagbar#icon_closed = g:tagbar_iconchars[0] +let g:tagbar#icon_open = g:tagbar_iconchars[1] + +let s:type_init_done = 0 +let s:autocommands_done = 0 +let s:statusline_in_use = 0 +let s:init_done = 0 + +" 0: not checked yet; 1: checked and found; 2: checked and not found +let s:checked_ctags = 0 +let s:checked_ctags_types = 0 +let s:ctags_is_uctags = 0 + +let s:new_window = 1 +let s:is_maximized = 0 +let s:winrestcmd = '' +let s:short_help = 1 +let s:nearby_disabled = 0 +let s:paused = 0 +let s:pwin_by_tagbar = 0 +let s:buffer_seqno = 0 +let s:vim_quitting = 0 +let s:last_alt_bufnr = -1 + +let s:window_expanded = 0 +let s:expand_bufnr = -1 +let s:window_pos = { + \ 'pre' : { 'x' : 0, 'y' : 0 }, + \ 'post' : { 'x' : 0, 'y' : 0 } +\} + +let s:delayed_update_files = [] + +let g:loaded_tagbar = 1 + +let s:last_highlight_tline = 0 + +let s:warnings = { + \ 'type': [], + \ 'encoding': 0 +\ } + +" s:Init() {{{2 +function! s:Init(silent) abort + if s:checked_ctags == 2 && a:silent + return 0 + elseif s:checked_ctags != 1 + if !s:CheckForExCtags(a:silent) + return 0 + endif + endif + + if !s:type_init_done + call s:InitTypes() + endif + + if !s:autocommands_done + call s:CreateAutocommands() + call s:AutoUpdate(fnamemodify(expand('%'), ':p'), 0) + endif + + let s:init_done = 1 + return 1 +endfunction + +" s:InitTypes() {{{2 +function! s:InitTypes() abort + call tagbar#debug#log('Initializing types') + + let supported_types = s:GetSupportedFiletypes() + + if s:ctags_is_uctags + let s:known_types = tagbar#types#uctags#init(supported_types) + else + let s:known_types = tagbar#types#ctags#init(supported_types) + endif + + " Use jsctags/doctorjs if available + let jsctags = s:CheckFTCtags('jsctags', 'javascript') + if jsctags != '' + call tagbar#debug#log('Detected jsctags, overriding typedef') + let type_javascript = tagbar#prototypes#typeinfo#new() + let type_javascript.ctagstype = 'javascript' + let type_javascript.kinds = [ + \ {'short' : 'v', 'long' : 'variables', 'fold' : 0, 'stl' : 0}, + \ {'short' : 'f', 'long' : 'functions', 'fold' : 0, 'stl' : 1} + \ ] + let type_javascript.sro = '.' + let type_javascript.kind2scope = { + \ 'v' : 'namespace', + \ 'f' : 'namespace' + \ } + let type_javascript.scope2kind = { + \ 'namespace' : 'f' + \ } + let type_javascript.ctagsbin = jsctags + let type_javascript.ctagsargs = '-f -' + let type_javascript.ftype = 'javascript' + call type_javascript.createKinddict() + let s:known_types.javascript = type_javascript + endif + + call s:LoadUserTypeDefs() + + " Add an 'unknown' kind to the types for pseudotags that we can't + " determine the correct kind for since they don't have any children that + " are not pseudotags and that therefore don't provide scope information + for typeinfo in values(s:known_types) + if has_key(typeinfo, 'kind2scope') + let unknown_kind = + \ {'short' : '?', 'long' : 'unknown', 'fold' : 0, 'stl' : 1} + " Check for existence first since some types exist under more than + " one name + if index(typeinfo.kinds, unknown_kind) == -1 + call add(typeinfo.kinds, unknown_kind) + endif + let typeinfo.kind2scope['?'] = 'unknown' + endif + endfor + + let s:type_init_done = 1 +endfunction + +" s:LoadUserTypeDefs() {{{2 +function! s:LoadUserTypeDefs(...) abort + if a:0 > 0 + let type = a:1 + + let defdict = {} + let defdict[type] = g:tagbar_type_{type} + else + let defdict = tagbar#getusertypes() + endif + + let transformed = {} + for [type, def] in items(defdict) + let transformed[type] = s:TransformUserTypeDef(def) + let transformed[type].ftype = type + endfor + + for [key, value] in items(transformed) + call tagbar#debug#log("Initializing user type '" . key . "'") + if !has_key(s:known_types, key) || get(value, 'replace', 0) + let s:known_types[key] = tagbar#prototypes#typeinfo#new(value) + else + call extend(s:known_types[key], value) + endif + call s:known_types[key].createKinddict() + endfor +endfunction + +" s:TransformUserTypeDef() {{{2 +" Transform the user definitions into the internal format +function! s:TransformUserTypeDef(def) abort + let newdef = copy(a:def) + + if has_key(a:def, 'kinds') + let newdef.kinds = [] + let kinds = a:def.kinds + for kind in kinds + let kindlist = split(kind, ':') + let kinddict = {'short' : kindlist[0], 'long' : kindlist[1]} + let kinddict.fold = get(kindlist, 2, 0) + let kinddict.stl = get(kindlist, 3, 1) + call add(newdef.kinds, kinddict) + endfor + endif + + " If the user only specified one of kind2scope and scope2kind then use it + " to generate the respective other + if has_key(a:def, 'kind2scope') && !has_key(a:def, 'scope2kind') + let newdef.scope2kind = {} + for [key, value] in items(a:def.kind2scope) + let newdef.scope2kind[value] = key + endfor + elseif has_key(a:def, 'scope2kind') && !has_key(a:def, 'kind2scope') + let newdef.kind2scope = {} + for [key, value] in items(a:def.scope2kind) + let newdef.kind2scope[value] = key + endfor + endif + + return newdef +endfunction + +" s:RestoreSession() {{{2 +" Properly restore Tagbar after a session got loaded +function! s:RestoreSession() abort + if s:init_done + call tagbar#debug#log('Tagbar already initialized; not restoring session') + return + endif + + call tagbar#debug#log('Restoring session') + + let curfile = fnamemodify(bufname('%'), ':p') + + let tagbarwinnr = bufwinnr(s:TagbarBufName()) + if tagbarwinnr == -1 + " Tagbar wasn't open in the saved session, nothing to do + return + endif + + let in_tagbar = 1 + if winnr() != tagbarwinnr + call s:goto_win(tagbarwinnr, 1) + let in_tagbar = 0 + endif + + let s:last_autofocus = 0 + + call s:Init(0) + + call s:InitWindow(g:tagbar_autoclose) + + call s:AutoUpdate(curfile, 0) + + if !in_tagbar + call s:goto_win('p') + endif +endfunction + +" s:MapKeys() {{{2 +function! s:MapKeys() abort + call tagbar#debug#log('Mapping keys') + + nnoremap

?6~V`m#Fb4n!ojoM&8Px}zg940(FMq>TsthV2U zYvWeMFRDa9ez}N?g+lXw*F3zvcKElrxq6-5>D(h0a7_I$e7pLN~ z>)aUeDY`1)FEr2DM5{|>h-C>&T+~w($90}NWN3Y_F5`nOxSOvJ-~?IL{l46f;dxNLagzVf}L2B#|dJxrW|6U z{Rfui?3RDpE6Ka|D4^z{8jt9EzYDu~!$Be4;lNT$@eBPa#fWJN@EeDg7ISUu;ahLd z8ra@oky3(h$zNd(jI9buQ7D@fqFpP@4E6c_c$#z~TF%CVJI51tW`jPP!x`6oh#8|APT zt|AJuSbUbM!!?;%ClG~~O4t$EWQao&6p4s0kJLwDi#lL+WMwTofM(<}(ph${IA?dt7S@0V`2BrD^ zyGHcVAp(zm&~&s{kku zF8KZ(4U{U8ba!ygGy*>0nBHy~h-ou^n1cp8E|B8xKELh2o7!@BdpO(t5|Vhb@9p%^ zF6*o{BpilgMj?T@(IkY;hj0N{C8j-t1-Ir@3c!iFk5wq1QFF_ z!MZ{Wn(^C^fb2At>8&JR0(NE~eBFG#y>stHM(aLLO>?Am6g%^Yb5n^PYn~kWbx>Nx zbYX=$AdPSo46MP-<}vbnTulvsv77Ls|d*<0xL7; z4-B1HgNc}im_^QBrQgfDFu2rQ-|9DSHjeom6*T0FU{A_*n_1EbzAw9Xel?TV*AlQ? zw*0aNH5zvvfAe!tAUZU6rtSzcMauz>LX3inmtQ33?i zL&#jrf&YfKy2OvW*FllMRF#04LW>4Ji$dPY<5dwpqAe{0wn6~=pjQf>2?2j$Gg;Mw zV1ii_o1!b>%dm-?x0|3QP0UJc_s0RHRgz32h6>`o(6`Wb5^aejQCyQ zFp4cyCDBEl{lY}r_BoeG6Vq9*=XA868iRLN_KmP|8a)uxOM`Eyyo?e~?KT_AO=pkC zD^S)foD{!w2>Y?B2H`V{d|u}`1k7%H4bH@V*VHLbj~6!rq~)^TSIwB?pt6%PHTcfd z+Njc~SnFALYLmOc3p!Y^DHw_$R{8iZ|6Uk7&1q63pVyz-ul(}l1H9eAjy&^Ux4UD1 z&(BU(9w0Aht#)%0lRPgReVnW!#v259jZ+|rF{U5CuV!bb&DsiPlUHr8t_D41PgiH_ zpYVdv(b(DI-;rs8i!D*~m{&KC((Z%d3i;4#QJLVHMp_zKIa74j z^o9YXS&m2YJXg*)^Hl2KU^#alAdFGN>Yk~>6JikQO~@QB_hkD>f5OPD_ReaJ>nv5c zS_k=$#SS-t_fL2HAZ}On&8Q$Yk;Nk>g8+Eer`OPm0eF=jHf+@Mlp&tBz2tWBnXvoaTcPezB=<{Te4)bcX>rgVZ{Pr5=@QR(SShe@c7k#~flt~voX(2&{cpwpEB zt@%#LQdgSRGqw_;o$ZuBvJuh8L95-iZNMrjDG2S6EPrF-W3J+QB2f4JCwcKZd+Oe0 z@5Oui((FcS{X??%iK;8oMtiof#(mZ)P20=GPC&)$sbzms;^pJznZlxYXC(zf{t3FO zbiT2Lu?BUPo{luv6FxLBt*jW+rMA~0Pr=-=A>uY7+Rw{7A!OsS(e6K%|KODJ)wlPm zn;3taT7c1YHVI)Np$rR!%5dBF6v)>kYdQau7*3j;mC`^cLN7?KbFp4RcXRb?US_jFlz*gNh8KPf^Q=iuj!>$^oQRoXBgs?n&9R?DZP*;&>MP2h?0 zN?r6@sR>Lvoon!>dH7RT=8H=;9&nB4{VtmGNpbX5kKq4|t7^F!T^B<1#|OEpzh%i; zMNyeAzAvW|t`y|&kSLcwM#J;4T(#|DC-JTVhdP-JD1IkyT8;xn-f%a4jw{fk=e0Ck z0BN?pc`?0`)l|#3t5L1?n=}V^wYaQ25(o%)1%=$8ZBWj#65H!(g2v+Blbd{|FR81A zFXTew`k-%k232Wr+Zk=4XsBJ^HUX2~9cc=|o5Z2eOD@LOX*S6Z0HzC>+}_9DL`uqJ5w4cBPrM2`$Ymuz(Po#SMP;7InwoRQ3Un-z-c%9q z55IKV9XJ({c~hjd-JH#pIbzF=z3ubF)aN#MA>33^@gJ7zx-Il6IoW5aIz6evaka#& zHqOvzozQ2ICpn%MyIo<=GN{DGhw>eXerFen$1rgdw79N7s0oDCsX}Q7!WoQ&bqVy$ zG^9{=Rb0Q2)~N&j%%##c2LFRyM)FU;a9t{Gsjyl_P8hSvc8=ZXp7fg=+?;lddNwL! zH>uNoz`m48c_q{GP_x(#TvWTkdO-z?}E{1g`S1A{K zT)1Vs9+r$UC2U?3)$*nb^I8~rv(R5(Mt;7_aNv-db5gh^KbeM) zHVVbId#@vC%-Dn5&|`^Ir1@sQ?@L)m_UJp^H+s}s+|6e!JWI<71Lm+kuY5&{(uUxK zLoh1rGx|Qf(oVhm&wdHe6WG`D_BtW6CAy&&R&Jp!|LiatM*gO-#l_jV&nYLCWa`F5ooLF1F=(Y0nzd zP2kAK_^0m1RfUPqPX-K1b;-61xr0|6NdWBV_LljF$1G62t3+ZPjRH~05|*B@7h%?{9Q>WS4` z70j-KKfU>QzsOWu=#7~9x^bdts!E2>8x6>nFQR_VQi+CU)ZVuWcWrs>y`HbJ4ZpJJ z>0$M;mbK8brmuRi(JPkmGS-;q>60$X;zDj)S8T4c0aw31{TsNbBG`5L%g^g$a`-SI z^5sT6!OFy=V{L8|{-o^d2!gkw&ycUceaS5r(hM*@!9=rr-QC841E-40J*!b}&kC-< zGO8$w1~XX0cuY6opO#{=)tAB@v$g<6!DjxP}|jm&(?K=8D^wT`|aYV(%vYT3W>BpB@U zD^U}z_doFgKdUQf`$Aj#RgefRpzp9TZKFOxK-PtYaKw$e*BD=Ex9?HzpJ=Jouyb{p zp^!_rH9o{Hh-SCj?N!<|?d-~DOnEiO7c@>%j3MDg;Xq*cek_A2nG$Tw0oXRU8?X3i zuG?;IQ$gDx9GGqFBb%v|Y6hgBMvsS9-AQ&Y2H#z5Hl7)|pE`SvT{y@{9Md6wJ9A}` z3U=@A`n`^W!^v)+Fxwf9nPg9fPqHs%t_4&h8EwG7%$?J}dp{1;lC;Ql6?Q*#oejG& zzDHDHesM)5am?|H1&yJ>@)tD-IyPy}Mg8F>TdfsRa=O~nbTPY0a`0AJ;tBa_#gg;8 zVxIlk!m$Kw5U4jNn~d}Fx{6Yy&e^GYB^bAUi$B7fnp?;y^6Zv%>)ut51oK*y=kSN@?t z;427mEe7wxN3iP5lcOrZ-3&F?>TT59SI<|*$~5Htzy8R()xZ3b%`{K01+Q4mY@2Lu z{}ky@mn0s%5jD2f(jd@!Kqhk!AEFnXaWhH>4HxBL#l86L)T6CWy!}-`K~0WKpFQft z%*w!cd#2QY_GF~{vknNo|Xj?_P|k#?V!;8G1$Bc-mlNNq&p7ZftKS=lkTPu!}B^2VNTF zP(}iOm$8=@$F{T((_!G|1Fjk`uxnKpZ3t+rcisyPA@YheuFBDPCCc(NWn!gUn}4W^ z1<7!s#ld_~-Lf4<87=?^id8e5wc*?+P)fUbUW&%VC59YTKqS$1m*X-EN#47FtR_M} z*lGKsN|UAKu0Io%qVFb1^}ic;^O*###bN&&LtcRYM8Z&&(N^#1)+N^^Y35{@WPG$| zp#J(-f$h3ie4yTzYySxlc+}K z2mVo357eec51B(g`OwBF~izoHXk(D2U$XD*Yz}vP%WwSd+ekwRttaW6tl|EE+ zj|U1L|I^JB|I*);#z317-d95@A}=4q{SoG9uYxqh3n`Vf-0jN*ps*~2nYCioiDAQn*RP1_X~Bm5v=>^grLTy+=vW3GCW7kD zhE3l&KJw^5qm1+8x98hgGm6I{^m<8|-F#f1a%idc$KSYbqhtIi?h0bc!%#TF;7t80 z3kGz^#-lr&b{0CPO0b$Fv$LYw*bWi?`4X6^LrEB{s=wLt{R8%vmB1J6e+D$A@Il;5 zXRZh7>dnm$YQFT3w^vJyJa@$qg_5zsxW zA1=`kf*D*LxN#H{?)G<~wc%0+UQrB%D!|n%zY+x#%fCbZ&+A_xDB9-}tY7O#l{k?6 zarv^f|2>tH33dbfC9Nrr@86mD_b6!AoPE7}eS`Qc|4kVLGwlKqd;gqVfv9l?2WzM` zX)CTao3aHjKXTEhW1XZ2c0waB9$JoBv>c_9=LZl zY}6V`^xhlQop24ztSFEyVa--fBotLM_cic@pemoV@11c^e){Zd zzjAtv$>)$y!y+~Ba<)0hkK}x$lh$&)F1&d0cYps^)##rXp_oi8#BNFCA7{(7{a#*9 zl2!ZKh|VtoS;9jbC2*|KCRpqmmr|c)p-gwqFfj9GNZ=Qo zCwHn_38WJ7z+sU?HDcxr#gDFm0#K2FzlhvB3nd%Pv3o(q^N+zLPuHNCngX*)5tyB! zZ)k9-n>E2x%Gc;=sOWTeGAtJ6a?MZ=J6U#fb-zzQ-VC9!?7ASwXhamYS1OT4^^8~pq?&W=AG`}sf;+I-NV=k|o@N>- z8CSehx7mH=y2#d8>$Vhsw!-|!GK&vy|jj_ zl^Bcm{Pv0DOmsLZn4fizi=W?L{0|C^%;eWNPR1NfR?P4fh+xCF-+z*f#Lm--aL<*) zLiOi|Pr$GiQ7gtS?3ljc=H^*8N(&|;=x^jlpe7)llTD>2xX$n_#s4BLRF8##NDrc?8n zM5kIAK!L-Zc&yyPTGIP$SInW%2)V8P^&Lv|fb%SGQU*F4acN8sM~My$scYr=X-jkNsL=7aT2fW+v5ZbjZ1M^OX314_>vA6Rc+?JX)?`MO zz<`9s@O=)odosbvgKxaT63XprMEHVCl4pAA!jx~rs7L11XodAXnp`hcLLqdbvg@Tq z+m(K9-JW9ui7&HY*5)GT!=GEd>0hkZ-qpoja7Q~8e4T9P)oC8^;*Jw#NhF6zTfx~7 z=P!fCBQE2#%yMBu>!0fHZ|Et`!lUmv=MyfU?kd!WpFP|WdEYeAa$hUROP^cB^#@M3 zQePv3pSa6Q?f*M)V1B~IQ!8J+p{1%%hU=}ye5B8x`eJX#0kTEpfz{7fpCDAw+n zZTa=84vWPIXu~k`b#E1 z$ydUTtqA&Pt6m=lp7xtDP$Mop5Z*0}jLen|9+Zg+q{7%)vIFEnD0x!33%|*hDn8U5 zi-ao?vY4Ww>jh2QZ>P{%)f*kCpMokRI$rurQSJe%W|sQXZNO9}tA%~>(|~t-XA?4A zVj^;axe`@nfN2;#>6mq(Te!8|E4Xd3FcMW;PNN%JdA7_^t^f0;B9U>=8(pR8Ubkl~ zj>VPO#I^Ny>jUu}NAR7PT6CyNdzMT(m;WkZwe6J^td`ztNK93&n{5 z&O&MU`70a})tBM4%m1}TqHE`~jX-OJH4mX|qg6sxt&_3xU}-*8@sWU}-Rr&(=>Vyk zBk9H?Zuhl6qgB)aMT^`kRj%byY+~S9Ym4C4PR=Evici3*s{cBVmWGY)g` zX$Ec6e*W@T@Q!lEB=|Hp>_i1}0uq~KR_OdtkbxOSq(jZ-G^jyedpdJ_3KST4^KYd{ z7?=wg=0bZ66;ncxLXaNFsgd67h%AH)F&D|KV4RAPg;BBHsHuO%KehI7i!$=G=G-#w z2Ctc>PCgzm8eS`qjnG{AP&7Ikt1Hfj%16f+OJFJ;Pesjr)|oC<5|D}uL??dZ>M0|j zPMo96U8CnK?D3kPvrx$07=WbpNvjtg8i;$`>FRN)?w>x|zLY}GRf!nL)p&G|kfy?y zBrcGe=4{aF6e#T>`$xpP8*~Kc{gMid{jJ}H2PJ3fgpL@(VxO-_(GbGml9%;F#Q7@5 zrlQQ`-&-o(i7Ez#C}(?1dwJ&`kWs5!G}5Z3r=US{rMOeLJjcH5L46%nXDCf@#hCCR zvN58_ZWZAj1yNnG)kyQk`7=v%hM;1{e7#FGB2i4UeT5#)a0z`e5VT<{cIBAGZ4M#D zfnluFgE1u1l+z6^n7SGATQK{3!!eY~qB<7{AyuQV4axU>&=jbuUm171gcD#72FO*Y z60%7tAL=2OE&QH^pl%8TQ07BK=wE!Fj|2PG{E9Ne*iDCZ4o1=xj0^bUH1RvcHW2a% z8}m;cbWn6{=QSA;uiTQ@xYTbig^%Jt$5}S8n6~7zj8NPhSzt0-S4UEH!pgcWUVewQ zMWR(E75R;e*YO3@$XGdy-`Hq426J94RfSu1o=}hb*s9=?D9!^Ruv(HZ5EgMKb6JFN zzMMjLq$YPwo+LF)LOq*+Plc*fkhzVxMxBm`vWx%R@g$rS%Ksg7!Mi*?B& zLXuduNXLB13EmKZNc)z4%D!L=-qYY@m&WIlTz`Aq=&$H@+#o=puIyPvAQYy^i!*^u zjbizI4E7*CWcc;S!MgELe7sEb_pv|^s)-&IC(XK!uKSVwQ4YSwgnIxaf%SE|imBmm zUd|B-VUH-2ECzj7_1X3n^XjWPfDgCJXn5JBtze^kut=GJD%qR${R2I-NKSI=yLq2! zn>3k$oOz;VbiiGSs>9Zv{@jeTU2TME2^xk8x<#55lW?cgzT~t<1zRb9PYe;cNAFxZ zk)9Vk`FTJh&#r~^SvL%TWX|#SSMPkd-neJ)K=J&ken|^d?+?&l#6FWbHAh*MU^Jj= ztl;lzZuM$4WrZu^;I{+nHe&amsqf>{8LflYw1(l{ys6ahf}NC9!P4`z(JFfG&qzuH z)G_27Kiv=WP$$3IAIN$`2jQ$&l({DtCJ}u30@X-BwpRg)?+TDhBP(K4vsi`>n6&SQ zmoNiTo2?Lt&v>K)!iehY15kUzyt!iQDNyblO%C-U=Ys-5Q1K8EGv16T6wEB?85n!b z7+NRFSQHTHF~S;>&{9I_qr!;Q?}DG_B$jNkM+}LA3>xYp%!y&x^rW3Lb$j4ANxeJVBoIVh)fgX`m}X1=U<*8_~rXFV(h}JBzrg zdHPjs6Jc!Vq;IF>((9z~iy`Ifl|+ff6+Ar>TI~~=Ubf zUz(OSP06CSFlJ3l5n8bf%ggwF^jj!33-N%^04hGp<*4FpSm?Nm1VIQ?F040I7AxorKUn)&MU*EnO+<^SONO?_>DnZ<|K_^Mcz-nzI!IZ1o;aYhO5v2ZHi%B9W z(RJF>QVpcO1tZU6i-vsC$kI@>vQkYicG&Dvgbb?v&BlL&xPn5l z{Syg0*$;SDzTkg-iN25TGg!deft6NmVbCq41TBjjZl0*J@|#kRea89mmmbQ%p-~=z zz4&6TU3lLz#^S7@%CI8$gpKaZogKpyvX4WG{R%|rZgzX2idU(MGGMv8QIpP?YbLhmpK!6o+W1=A$06`G0oYebRrYQ&etcSDa{>GH5s1m zrtiEnm}lASlTpP(Q(WKLAhu^nObLkze3*-F_P}}}HNr3lI%zg8a~dp-%Wq3w6I&+6 zc!K-{k?`9}lKt0Zi3DK#N+6I|@Zz)gst27+V3@Od_=HM{9_`+;CkxGSzs)1C$OIco zD9Puvp5NLHFn%W>@b|ey_A12*>cR#+VIN{mRN0wZZ81SF#ws5`133(muse=oKD3J_x;Lj1=kZtGGP_x~x$=#r z82?_Zb#+8(K++HVEn(5wBj`DAqzcl}z*~{x`M;_XUQcC{LYVO&v*rU@nW|}_H~j*( zF*qx7g>K^RNSC=hFk}9t4|egJ1BAi&w)yshHjDvVVUSYHJR?MlZN7f@mNwO_B}I$< zxuqa~B3r%}{;5HT467Z^8H;E{B6RdeT%*hC7$n#fhOa5v$EBAMMXoMqR=Im`PqAj} zbK4Hs%xjb*?vzV`)fLK`jxMoi~`Pl1DV zgp*3$Gg0~IsHIDO{M>(i@k_uzzW5(D&Ho(f(EINx8#Ggwga-iaDjaO3nrcK3Hlo_q z3q9@*2aK@CVJ_arlU13KEnHJEyrDafpzv%2$v+Ina#HEJ6vxB>eV zpZlfpNbNg}N2Q%p8HeICm^b>6W_7@~)ANGgo!NPwq$tXI_ony84K=(ytJC>9#dl>a zm_~L9UFb6BxPSazh{3?lP|5)1(V)m|2lwA_pVHW9-3^Q{R#mJ*;~x%Sv%}yHyZaNB zl;hDR4C~a^yjS5w7th+KDm;T^aEu4t+NmiT_3`@XZk`O6=uA`?zY9!bI+$)Y;ZQ&Y z=FMIle2Fz7;Yf^LF>-$3qf|uf;0Q{(mvMf+UePQ#!sl}^Md^&t9Md9WK*uj0kR`%L zO2Q*jYCTUTdV1a?w9#g0)E}~<13pjR?u$p7O^@mr<Ut;@@sZ+9PWqv-cRu`GIt z=Kn?5TgS!GG!451f?IHh;BLVoxCM8&K!D)x8r*`rTX0|8-QC^Y-R&&ozTfY8-rsl5 z=|2)?rnh!xy0@#U>+0&2hwof8?f{EU3iQY9#8)a_8OYQ_jh9TFMdRs9DI7?ZI{krV zsm=i&^Fry6O#q$VbO)jq*~|Gd(*5aZiw^gw^rN}oTtXQ2sbUw6smJUNoH_L7H)+*li3@(S zHACLRNv`e^fZ?;ngy%pSY(N&83SK=rgY6%w`&oF0(Ht3kOU!Nq&#l+fZk;4SEmPMQ(Pb!VVPQ{)OdpOuk>zu4Ebge*y4WBEf09My;Ekyb2-@r?@&- zIklw^dz{01GoIvh!<8(DOxve8z1wObEwyzRjbC*{n#oSSYQ>caz8)uXe$(}@+paQ? ztTk+yHY;Z2@~~#ISyYs0!tYepZ4PC{0UC*{0l^D`Nsm_p9Ep-ID}R#ajNJ0I1l~yK z9Y^fbU4xqkAPFrW@<|H2>`K!}B>Uw_&+KJ86b!!yo#B`lzxJUP3vk|w7Zgj>US#fG z>-*@*Mtr!|ltVAEO+E+}Sp{tzN#dotvU=UJ=V&xCfm|t*YoW@ldv$Fd@FT~PaIoVp zoj2u)+Hb}B{08JSshW!av)1V;PvhS0bxMw(VfxWhxzXg_Au(caFw(HaRJv#A@M?{9 zTh|<@`C~X+@r!x7+0z|yMd(YzXSZtmxvf;2(Qkw6k4%S+CJsosv*yn;x_y=g;n6{$ z{`+m+MKfg*ZWr6r%%IQ$HP?99C!WS4Gb)#HJo4zlb?TW6B>~s^c_~m*af-`QDfsEq z2=>f>vgCiZCLg+c&)%jJ7?1IXOCm~G^0fpG9byQ~(BVvJd8(L^jaPLQH4x@b~VT(*&J7%p53J zQnUOq3<09<2v_c2EDU+L&LU%m87b~rn;Ec>$E6uT-zK%JAXBDc%gfGA$ayEM8I}c+ z#o>T+lH~c27r@BzkrJ(opcOOb`xeuPB35~%n7A;qvpFRatVB$5#OLIQxDLD?+4b&A z(NY8Si~EY+)9xsj5#_4d7z24C)VLTZ2~x|cTLZl(yDfD$LSC*LCq5eEeY0*wlg-Wb zQp!9}PTXi>!kqi_-e+&*Bex!oiDWvFAU=}uJ7RD@gYQEE9a$Ullwwd5WhKe8hnFzn zUJ)@cF@ExeP3A$e6eU!sDW=DTGEE4h$SSvlHpo%k4G2BVxv8~~%AaiySG>ens%B$J z$hVlgxJZQS%Pt~XN=hG)C$XH)#GEm&&%JmSEYm)ZAb3h))~Op$I3`3;n90yY^G;<& z*(jh=GD-bklL?^BXoTa{fQArl%itl0j3>+BQoiP3rnUxu2|?n8UX~DWVf`i*IfhFf zW;5Cfuu!pbvw-F$U*GUATW(@2wDudcOQ34wwUW`QwHW4YZx7G*Iqju1_dj7iC(c_k zO}^zFMU9MFN)Yr=sXRivN6zWV)e|WtQw-K^{neMT`{E8y!OY}{LPJU>tXZa8RK6mT z3=dLe_+LxwVab^{q0I?d;g~asRP2gSzQVY5m#KaDGDHhUDWdSQ$e#1iKhJrwptQ7P z9E&#;L`N0!6d_*`$fwQ>r!e(=s!qT$j)kTdL(!e_9mc#4Tb@($o<1v=Rnmw;{)sM! z_{)hU@5Oql&aFRPkf#&x)6Mka?r9FX>6+vwE*JuG7wWX#gV6lA+TCXjZt9qQ7`CJ`LmxRYurR3*c7&lEPP^On>|mLG?3x+vSuuUB58W z48hBKn2Gzz&{H`@hKaBrPDCzU7Oo;_R0~J?<$qH@VIJf*?BX-QC;Fer{*zi9hT}?h zTg1XCJgf>>40f`-wV+&*{AI4)hLWCJP+AChv?)^?>w|QadHM(^(vWn6Fk=w7FLr0? zqD%6s8PMiaCtrhSlX2HdQlM}p9wR9eRCqa?x8+t)&PFyHOJ)4+t!pw#mFM@{p+EvI zhn48{EYYS}Le9-Yd98a`Go;<|WaHu!H-V?S^P=zRi9WORCu?mx zs`H9$DM#04r&rPV>YkzV8s|cKsh|)7pMTXz_h0Y-&{904 z2hFa?-xh4S3WYzb$qfCe)|Z=2>yzKUSl}v_C?9YIgSRj{K}abX-srKl*HDImm}>3w z#Ys_zSp3;9%Zl~y@_B_KW}$*{aGG9epOP=7+@oPFX%>uK!--mbrmFd$YB9fbpvW{_ zQM7VkL;lOVHpEkKkYem}s3|kYV?9WtQ;<{XEb-8avvkDdYwGXo&zq$~2=_;_SoD=E zn(!$74$P{mhZ@f}A#Hfa z@Ap~gVL*a4#1$L|3Ts20l4@qBU@KQJqIJ&i)6`s8CJ6|o$a#DV5#dKIjJt?H$5Y4- zRoLyQekf5}$^*m6vl)7HuUt1AyE+h@ql5qpyYO~`bUiR46LAldZ;%gYL4Z(K&rKsn z4`s@SyEAqjZMJhAwsWKtq~rRZRqx%sCh|k0C``)%b`A_|0D$A!fu4H3^ar^J)Yy@Q+pZ~8 z^VT(Pt1I=J<@2j}s+%d+`a0kBY=1ld`G+)3nhD~6BDxZQb3FsJ;K5t}E}b;)fg-TD zxJOZoQr4HV7tA4Uu<1mzr06X zT7EeBbPmht;uG&aJ|5ve9?CVWy3-lT?zxepc^NhJvpz+eC-oA4X*5dzD-_ZV{#;Pp zwc@y=aOm3zXUO(u?aTxL1Jdu)1x2)Q>+4KIf-mAyZ_E4ROD<$fDha@8$Y+BnX1N2p!APTbIAw~%(49(uX+#8w|{DYQp# zzoMn6^B4)cPo_vj(~Uf))R^24RqBeH`!286-slU7Wp_Ji$y_O20QneRP7Cd;!RDN( z-)pwK=ALWy!@;>%GQsH|EfA7w^+#I_H1Av3H}{uycAlQ=Y_gU&`i?d5Ep+alIh@mc z!5QOkM#B0iC`00)qv^RR(wMsjFK&HRlz0f$qM{;1_rF2#N=1J*b`i2VuR<*MjgjB} z#vE`SAQMJ+I>)v1$n@irI5&$!S9`*j@p&NfNl7M4Ar(@8F-Xi&a*pb^LY|- z>sKaI1oPqB!IPocp1`bxA}=Pk6dBnB+(?3W#g207x*K+_U=qsk(>RZZ9Fi^4bVbWK zdkxD=ph^RlDv=n|@q1TWbxVY~6AeL`)D-=@n#LH0lsxU7`?71j>ZQ}q330ngt0)Y{6u8g&66+?@4P}6xQcCJP2WHm0h^w)0L z<1JHNaLdNtY>Jbi@So-9)S~P)iaOEj40_WapPq7=D#}GjGAgbMza(G8CR)QNqVQ=H z9a*L3!0@(gU@^p{{mK*xb~2 zBm=01aj5h<|C>Ou3PVcX>O~c!mfrq}_G3o`_n-(Fdhb1r;IB9szaO*hVLn1?l-5`R zfSXb>auD+gI>jexDy?xKWcSHaRh^FzN_!KVN8ep}_)xf&oa%H=yDBi{Z=xg~oKM=~zA+d!U%%Mmc~ z!xXq&W0^C#Uw(5U!}e`6Kwud=kR9KS&srSMYi(98(FwW=h!?EPfy%ZvUtZ!ZU;Dz4 z$Ux7rqo#f{Ydp*_1}Mf)quVCCcS?@_XsXB{{C*pc#Iw>I57?1Q%VAV zv@k0JZ-=w!#)@W`KQK8O9FM*i3ij&fIEyikW<}}h8vd1;p~bh(enY@wl9B9JimtFY zS8xlpnu+hvJO=w-fff=|7}Drqfwcpxre+$A^lPXzEe#s_&u%|aGzJsebQJd-t*l~@7o-?8Qz>ai4%D2a8ok^T{0Js!wGsxM5B?>FAyaDi6d@LhZa-S9n6T#syWQZ|Iw~y z3xKK4X;|tm`g_k{&>Jo7{WTi#w;ka8@@FPul|*d{4E)(xe~lw4_$U8!?CqK}kuz^WIiY!5}1;F2v&4Y~50jDnid0eg!z#;GdpEP=h;ea1mdp%l))SNWJ0Xh5A z=m+4}?~fte0I^;d>OSV+MT)geaY=c+x?0L7Pt!o0*jJbbA68<*&R5WLfu8}D?1C{!$=!$eHL3+d>{}--!|XbGMN2#ittWQ7S^&J>Lzzr^UewuJW`Cdo_5*zm(ox7<82b zWNoAmp41e@M_;~ihGS0sEk0Lxy~}wJMbjfo{&jpj#qT;;_#px<|lmx>#1cbPmhn!F`B@vum_zdXWn(B06&6K+*VXDrS_{DOh z&SjT*CZ1-v*FJM~ZXN5)h+eca@$$kVzkY3uKqSqf_$NY~J0kFAe`~P>9xX)YXw2KM zU}(MpO%G=`*2uXQZ6tAV-J90+O~^o+q|F+YvaW?=%|U=)PI*b~m3^tNCqcQze|nU( zj7Ga_-3x)~6;7HOJqSim&_@sHvh-nlFxm`^+>HKkTvXcnX0eUi@rzw!U81MOCHn4C zx)Ilc!$34Jp%<_@)G3lK8%lnTm~k^tCa4b^Z8m*i=C-d34*O%U*jZq&yVW_i1&XA$ zJhw96FZ^`JuUNVV8HS>q(9>>3rsHc3sK=z+2>Aqxq~w+o@U!<1ti&s_^*yElIf|_D zfJQCAs3c%0mC;q7OTxU61(l#=kafq{-=r7kBJ18pK4jvqs&yHVsYR4Mh1SR zZd6GoB4WrIyv4gvNf*%`FkTsQ4!R~SQ#Ce??7lwvSaV2Yd*6y*wHEGo@y`xJ$ zwmULzDczmZ{%L2cH`{Jm7dWmlJNxWmg79yH{($wVQ&>%jb(QrBNKzW7rf>lApI0{v zbYW-;&{SP){6f9uY!+nab5$dBnJCi9(3C|*=Ky7mW*^Qo-r>3z@=1gf-5j<0|}KYR{unNPd6Ynwc~5R|W~E(hXYyzdSHrxem9_ zM~?CdG^mv5G1+_ORg;~U$uA_q@z_E#`>+P@b(aJOKdjKSz~h8ElWWM7j|-kiu3NvW z>{&g>Z~5-5KKY}j@Vn}g4PCg6X}dQr6Cgf1TD-wslKaBeGb|S5gquoe#7Vxrzr6Iy zWhP2VV2`MNOm|Pu>n8kadlcnDZ~EvNphX>vMn+9-B>WnC)G$;nC#^=h&V`s(o6vkL z0uq;OrQ6FJVi|t53dE*-k6s41Y4+2Cc=1iDHuU&@a@(9Y_VQeg2wi4)gT1xVFLb`@ z+XFVnWPc;R__q?ZZemar_#;mk5S zS1N45UyJYVyi)fgMu_ir0X=_raVjb4y|HE*l-}PJO6q*9Pgvrn=9Zm9F3(>vY;@lQ zGFzX~aLTR*Cf$IEUYQR1QlGz_9qVeV-1`L(6|+x6$vLQI$=qss?(@R`dxIH%{J{Ki z0f>hSNuZf;wfUmKMzg@g3vCw})CRwy49g6o3BbKSE}z7pe-IU?iEmVj0O1woUrU9S z4u?!ui2^E}`j`Gc`0bmNUu17S18L;vcT36$Y3(1)n&J2B5gyDSJnHX-x2nMM#134D zC5v43*R=i>2V441BJ&M`sEmI&bI)%`{a#V_o6(Or{1jDi=T|7BrSh$^Idn2yEYQOl zXjii16SIFBCn-p*vMpzv$wIQ?Z_m5y>+AaJM5QHl$LIkGj6c|R(QdVAT;~1Ic)T0Y zKvf21G`o_r@bY@oTG#~QEPG#^zRBRYvv7uH>Mo7j8|mQK1GjyN!B<(dbhgp^$>uVt zmc29o*1T(rZSUU*9DOoOOtMvQFTc<=m;3e(%Xql&ExuI;3~J@h2%Y3JTy)08G|*WPzy@P6v!ZUU7Nlt8?l{?uY&O68y?mNBy}h{%5iy zM1+VTjf%m$#Rve92Yqb zlIicvrD;CdhUFMil{ATLyVovBHlKkazNuqI-BG`ZV@~VqwXK&4G{q|HYmc_id7x9~ z(TB?Ofs(yg65awMV!JN3S3^A?(3z`>X=bnGkW57oqZEJh^-rCd4jQuOw+Yt*+vYP) z92vG^i87oAkKWdtWnW(;v1r}(!S@ccOxjMT7o1m9KZtCI`EhES@OECTEv<`ix-KN& z__N#3j-sNY1s|Ms?1s*nncke=Xk$MXRfjP&~MOpDY+AIP0 zlb*c|PVBc2o#Yd4nWs&eF2OgM3~Xd_Mq8{7MUHt>uQf8sO*RhziE}sb=srVYgeR^f z>+!s@&V(Df6>`Q}PlWK=ID=<)f5L;2R+*gCbgtg|+w_*i<6U!X1K~(%Dvz4V_{A1B z_S3LgJ5ka8n#OS6IJ&4>8&wOpFDi>ufnmy}KYp{uadwMYbEt+g#x!DAIiR?!*on{A zl!r7w%J3Ap=c=jDr0Q`zjAdH8)YjBH;BJn&5{K|C-A3p)qLzqAQJAAI(Tws_!?$bq zTsY)B!N}%Gm1-Dd&%at;f+p96UZyOBpR%sg{M@qywqQ&t2OaWy41zXFw+F9`5uz&O$}d&MtA<$LnU(Sxa8$ za4d%-i?T_9vIWYZuglv1qLgyFs07vjE3F4h}Sb)F6Q z7i5el&Ja{kh|bsR$D1UQ%X}|#;PWOOPytQJD=oUv97|b8h_h@%=BG{PHn|;iS*ji; zj1?t8R{6no-Y=>O1MC=7;{2+q-&eM#a47lqF?Hodu9(fE zxe9t~2BBmuW)9UW1#>_R9#EiBJA-w5qb<4dUDf02xH+DQ8lZ9r?NefF@rdgj-QMfR zQ9)j_GEfy^5uY`k@Adh9jeRtYy9fa#EEi@QU!=bT1Q?g&RA&8uGlGuTrRTI~vcpq0 zj%vMJPxSX3teMC=9mzm4II=m)7F~9RW(1i+3#NZlT|%4@7rG;dWC?*1jRbjI63Qfz z>bHitnNF=1hKkq$6L5e-M7-Y26x8xQ@935x-4x3fb;h(*1-72Lf1*l3q?X+L&K^zQ z!9K4EhjA_psMajE6cg72*+0BAH#UJLdkl`7K)( z>c9iS>dB&FW7KLegs_fME?Ba$7mSGutSPq{w>({v{oyLd^S+<9>arYUA)tX2m~NTU zh0M70En!uP0!^x1@d+Iwr1nlKf=GiVak`M0&zC>YH)cd6qTpfIO@Xr(e6XYb*1AET z+CO? z6zK&^%>SDqNL0M>xh_i`_#l_v&6^wxH9c|$D{tf8Ghf`+4ou%d1C?)zz`hK%S1!LO z_`F+jj=yY*^R0Z}!0Pg&`o5%z25J)>bDq~12yJmYgfBx2fe)VpZk0r+`!!^hAabe_ zBk~P0rG(g5W#c}R5}_ncjl{TID#+1>$5D~Wh_}ORuG+91;q}h#XfDQF#mJovo*^V2 z2p>77G$>Q*o&8%)}+2`KI5*ac7v}L~SXjDB-Ovo`&oL0Ojg3%9a8oBHFruf$m z#Vn>&po99>+AUqaR<9C$PJxM5LJ_(k(DGxo)*fK)aODG z$E1LUOB-Sy9Y$+V2y#aU6yDL|Ek2(}`9|^WsCHNFn!c*{<3rc;QX3M4^^4az+CFIW z;>{~Uqx^vAvQNhn>FYLR$zE$kDdoYVMCH#6>iB1edklDFqHp1Fi^uj?0!hqQ9bMl~ zpO4+pEurrP6Yw3JFH3vFxI+6^t%?xGdk?jFqgBchocFs=h5nFi3-7Jl?-JLG5A_Ev zR3G=33J=mru*Sy|;J6t%=yPI3yE>u0MoO>@w&JCc3HVa3hl`U9f8udf@f{3V7k6fh zqzPi@@C=yQ5!MiRLCp!!S^(TuZ;HSaFynbRTF>BKEEo(DjHn1#bj)e|G_a?PFQ-kwC)uO`>@0F&7d&2Y8Yz7JNNFQJMXW!=OTs9jG1B~-9 zGGvweCee{B2~y|p%vJ{Y-A3Fr&`8E@pJe+L_3hL9G;bBu$K1qvER^-1xm|geXN7O} zKk)ZC2x8s|+yka8sYchosPzg<3{gdGybufMI;@F)e7jU;jc;LO3Hfe}1G_hH2SZ|D zPURS(U++E#&?SL&d0*(4VeqSH55x#WT+{5&frEE<%a@**t6^9YqbEC&g;X8Rj|~S% z*Z>;Y!C={(H;||!VNoEsx)&sidW*W_WxjiSCc^_aa zQiV;{fBQ+o>z37F#+NC4t522-y{ESyNeOYZFl-xg4?bL-!lzNuhUmL?=zuLS#<9)I9JuScB{?PZI^%_q!W1` zF8rp`x3lMetFs^@Cb^KN-5T^L^zl2X5y7?J&qw_ZP?;E;XK3A<_o@>~Dv}G2Ik1Gc z)@+M(dk`jSV$9;NW@V5su<-V7X!mqA=&UE~RSA1I-M41_+WLu^c8M!3+uRiQy~8L5 z*s4XDCHO)GOML8rA+ioRk@VRdDn&t9f%;ylR%TI}G%Z$5Q^;JTggD5>s>l%#Het4e zq2)xCi0U+IIS`QdeI4X{g33LlY=VfT+YI}XTF`lwXz=hN6T&!$fFS7LAIam=Wcv0l) zO(7@k-4(l%#(hX6U}I=#pB4aE2vqRa7UtH71Nqmez=v24er~1P`Dz6nQHMbFqT>H{< zxVy;kYqwrn)idJycAyZhw(uiCVIj-bR^MhFc?jExYh}S8bK&B$1GSLhM;)8>`HCZ{fARC`Abw+QVYD=|g0tIkPuza=3X%5ZxW>LiL#73tOb&nT5u^J&>OXE=JoN6q$tH|~M zkWduk7=&zz;I_sY9kG@WgL&wG0O2)bl@#hLIdZKJ#pJNrVwgQShQp+7@WGTWPuiB| zeq6-eUGY2_+%Gq}gbJCU`Sl+jkJB`3{JHB4`|h#U!m=*lk#NY}*pUU4tj!7>HYU4e z@P9iZQOmsq5*U;g5{30Nx)zdIV}0gF%BRu=ujc8j&f8Z8@f-JmRqMg=0EE!V#_Hkf zP0WB59JQ$-ytq3T_Ob1saPQ8D=DRbZ&jG&O zdfuvR#9$JE*Gx2y_Y}>)Li)NV(6rOHsYjSOozY@k)bl8^Ai2~WSZDjxa~Zffm08kf zGaIRYTz~K&`B34^RN%0wK3o?prHTKwH^zUBLpOe8YhOC`yWEPpsIATEEZHG&gAQEW zOo#KN)=Y(oCf#TX1ce6twHM3HDCdD|-P}aD{n99#LuWv_$z!@~+<9PEU_v}CD*E}o z0T$x8ozkjWwv*RLUazS(Eb_wB*EsKB25`}?goN)ixr2*iIg^!A&5zP#&6=D?v^-NY z-I@=}gihyADm!A1&1-8_h3&n*fd>@5NK}?=8XqN3u_71CHk-P!bC8Oy>6{HBX=dvr z4kRhGtgguzQy2?Qdn4qr_VjD;P*xJxwOQV@ zx23cfQN4;As0BGHszG<^b$Dl}*<#Ey=$Zh2_~3RdRM8bNAy%UU+lYG=IRl{%#Wznk zkH=-Ae)&(D>!91D0oR)7WHgjgZeKDS58Y4@cg3}GuHPXhwXi5ioql~vd2_KS0Y~?|CD`p!|Jd<{ zAsw6PClUhO-TBI&)4CnwikVIG;zTkl&wn;Iv=_$w3OS`t3Q{rMsQl^KF6y=>ulHU0 zlDq15vGP9y^Kk{#hDS5lgXJ#4rsR{gO4fY)YSVRV&;rs6$hM&6PBCGcnbroV1aG?g z0ImYy_vsq-pp`0USDC4Bh$Aw2-_f6}Uh9B$`?q>Y?g_m1G0z>Xvoc;hM3cu@_!d=D&lz>iSVRN9>FM+U{hABT8UoO79<)tQb5_3E9%Y#xlg1GX zl~|7tz2t3{609=2itXS2qD>kPXq!HnSl!wspYe@Cw_kX`^vNYTQrz$NusF4?c;3DC%w5~8CgImW^mV-e4A zuyjqqvRgkQiOO&9ia;P8zG}a&U_2nkwqL*9HX=hm`eS_eBO=BvAC!KM1vQ_(2~*_8 zkihoiM+GC1l87ZEi}^%Qi}hruZ9`NTfQ_{#1u`_avmb!hDkh_g?NeG*w3fpf;SNR! z67mP(Lv8f#iK)whzU-6&{<*12<7RV`-rHEP*n~tmhv9s7`ofRn28D7at^WGLruh{9 z)!N@tD2u+x@ry8aOz9&7gQrFZE!+WUmoVa=kV7Z3G(ftln*u*6UAYpMwiY2LE2=r^ zI(Tg~Ni=+7)Rt1HBFVf5e5}aNqAxnK$Bke7CB>NLZZV6ySx8U*%;eeCqVL>aLh*c1 zF(+IUa5LqBwc_aHxHWxR3yAF}=vGy;vNrJfEy1?l-JnLdYg;iOiVQ%~y~tjs=XN7^ zG`kMub_)i>Zy=`7V)fE%*jOb6Znxo&sN->nLNIIReC1^AGwo1SI*+W45C5@j+7E&~ zY*s~0aoBqH;WvfbrAnh|S+r1K*nDpBiVl8TAg|*+#j<1*;oFFI2nYH2D z%A;Amdos9KBV=ezbqOb2Tsq9)#KKTxyg=8@iF?TsSv4(83ue+JU+cxw?{b+y0}L>1 z{~#X3Z7l3K+woVH8G}Bn0DNtPrAm)7CIb$F0cN~029K?Feof2x#A1G=ggFZbhbqninYqep!X!ou zlaW{6Zn|K_qCa}dPYkACa5BDRC8fd0$7p~ z^8`gGU2Z1h8%>0?Ic}ws{GcXQatIAkMAS_t_aDMK(Zk0@T8#9k@pf1;QXwMq^}cM( zdX!9bSh#&+9a}-&6?t-uUi4V#DloV84(qi+JvAWZasNNAyfE?nD6g`?T?(xrT%u5x ze?fNb>-wxj$smEnubaPz{LN>D@e$300KNjA1RxLuM}jy)psGZ!aP59(>Kq^C;FWgKYL9n=5} z+8$ zEdIf$D$quzGEl5V?TB&mnW!5J(Z^@!3Fq~mid6b2O~P+9_dvv=`98O)h(&%#yW*v0 zIjI|ZeWN(vbx_5uajky+A_=dyZxB+)%$C^9xGZ>n_Gnm#_@3T$aBnrPTb#`&9``BX zveipk#Fe*61ctgyWa(2rO>YGdJGzO11XUm+#Dnlvf!S=3H7w!VYc}H(`?$b}1 zIE<#g_vbNlv)R3*-Z>I&e=!C`Mi(LNo)7ESEx&~UbCM$LL|^fqpKdMSD2mY6DkiS| zOqlK=7A;dzvZXUg#vTKtxUt3>?pMW%O2a8%973@=MJQo&xJtPPS~$AV7Y5pHm4>4e zKjb4o3!G^&m??vo96vv$t9kMcDxR`mVo;wT#-h(Ib? zvRo^Q4w@kD*Ky>LHwV(?59;AC`G>Z&=Erp^hZAcjIx>bK63_!5jD^VP_HMPMh}=NN zlij-8(T$B3G)9Sfj8!weQ7U`#!PP5%M}umXNAi!O>f$P!&P^boNzSv>q~wNpNu_uL+jhrMTpn!tId=*7rf6Y!h8G{C>|Jpr2r8<1^xvrfPW@r)bW9I%G(KAFfU_6 ziyoo7M9TC1uT2LOZzqBD%5RegcqYwfH8a-3zj5D;ZhTVr!6Ay_^1+BmV#s;ZPlQqL zRWt7I{nL;?=GI61)L`NZyahvl?fi1>wXHG_&CbYq51%g1^b7QPB&x#kzehnqXsK{S zj3MwiYX>~;4~Q|6{?bT%Ap`!=h9+6L0uByL4^P;Yw+z|ggtgkcdY@$9KX@i62rVQJ9^7F68tH>uMJWUd zlld0DIa3)sGF$h=z2P#GlMvMOdp^9TRFV3 zc~c{AGU5@uN?ledGYXqkT7%}9g|aEXQs*5-c~7kSCYy9~Hl*e|JwHXZz~yrRrD0=; z{j^%;QFy%CD- zEs>3+J&(D+&q4Lq?#T4k+?=P@QWXDzh6L|TH{WM`c8+A`LF*kzNlx25B7J3Q#D&*_ zA$SJ^nP<%sGE7#g8{rxE?e{{=@cD=9nxh3B|Loly;>r!e5r&;RX?|R18QGZxPBk$H zG}Z-nCkRb{>(_4Y(z{y&w#^-auW=roX1?|N&1Np7&yh2zV-;RR5oJZ&a*!@{{C2dg z>_%l#`U2Db1S8jYIHyJPO2Ha}=l(R{5$^F|AWAUwvJ$Bq0&$&O&ddI5*id*$ZFBpN zdJVm7Qs`qAtc;qO!y0!hrJz5Z2lh6Tq5`&d?1^U++$w{Bph5X+!2}&-d|vH~+t+_4 zpd#qbriYa(Ib-QR5!M`RTAwWhVeZp>sD1v4U@7S3{?=$9vbAQaL(aEn3nhJ;#;evu zN+tFhIC$2|^5_IIM4Mv6CQ@ObnXcihjTMJH=gB@d!Iy$ZLj} zA?+x9yoWDAu;i_+;{GK)h}9DH3>*4pHJ|w31C7p_IIKMfO)@bc?f;Tb-umk6YOi&| zTxP$Gzoq=rKU!F3za0m(`MUMT^zPQK;#s*wkxa+ZBBR8i!jeX!$DP$_YEOr=N4a+A zO@P)e)?^Y|fI!hH4UyPTvnUb%?2S&|JAFBSCsm5T~zn*AdE7XRDmPj}X^ljFH%fhzs zv6N2|Cb(*bUgcjArA-I_{sz$9PX{_~IrXG;8yAee(qtJ?cvV7n@=#SZMTiTE|kH+@HMRrv~=li-98SHKz{1}Dp(AaT$gILxLi zEq}(RY3&f;^4|80Shw;@#@k*A{BKugZusrF$$eSaKsr;^iyO{^m#)8&2b7^ldHDJRTgO%|p>gn8VhD+a&psORl8Ro!uY zh*}>CJF&II#U7Vn+cI+*KJN7Xv+N^s>hBIro46JLDzgeQUGS`Am*pKpBiUI~8S3Q^ zlbV_PbNzdfmjUT+?bu@xk})%cAmN=qsO4qhGCgYy$ujJNtBz#6RM%+xw$Smyjs9$wLHsfhwD>2&qjIuNvAc~$5H~yF z6A*9uji=E2YBs!Phyz<2&Yl2xiy(Y1#Gqq;Zo^OZhHq8$NA@bYe*+f=C$1lOZV;UB zluo88tqS_?A7Ru;J}t&z-PV`;0Eb3qRMrr4u7w)CsmV!5J}%z+2oKKjrQ0 z|FJwi|HC+EZ0AoZ*-;1&Ho3b>fZ0<8LxogE{UDw%=(Z{V<|P0YqYv{8;%wFjv- zTbpOUk+X8uL`8c~^hTBwK%HjZOebI^ZIe|6(3}Iz!jK7~RkyzN7%Nzw?uto9|1@;? z6Y2L`0!d0HZy3ueJp zCp0{<$-+wb$~AMdxKHn-*{@v52ebNjb*lc5zfF~WeE~6sd)UoJGEt>mqt%#z5|zg7 zp#kOok1=zpFuT%1!eZNte>`QIo!0Us``KIjJtw7+{F<5_-+Xb6G*f|wgKY&NnLqdU zpXY=q@6aL$Ed>tQA#jK1yd?Y=3PK%8qG$;n)DU0Ht?u_HUK1Vl7dtSAGluFP8=pSA z49SuSw`}P{=l}Ztux;U~@F9TCGA)>ZzV{Qq;u8MSWXz&gT)MJ&{{VWlpi9!2eE&dt zdEza|&9n`(>8Wwc|yv!kxtDmB+OjV&7X}>~0?}WH=5U zXqQYMeO0Rc%U_3DmwkfxvIwa*1$n<-O7q#s?xF?9$=HiDTaO;u?!m7@t6O04y>KUATKL2=B@|xzu|J89Bxtsnkn+ZTx9zavLm%M z0#aw|$)F-$nUgX(k1KxWlYB^Zff%5<$4ntaR76Tf;W< z*Tl|6*#Tlp_QQkv@AQ*1boipDX|YGc2@#~+iUT|YNnzPFY24U^snlod^W97-)3FDg z-Y8R$^qTQ^;sE~-M_Rd?K zqV`9LhPr+6JPBL5WXszGFKg18Y2XqM0B^wpqA_ko;{my$lOYQ`4KBYsb3%B2p9A4G>ZYERGMJN?fhiFyP7vKGMc)%^eD4B zbaTlX3W(Y!*RMo^e8C&8+nb!#m2|~8jZRqP4d~UNmK^Y-?3=0XTL}H8I<8Ux?ay!& zk%qd}rK~^s;m;T-)^66_N8itv?!|nTOT~VWT3;M#v?on38VX*-01iAR7-jc3oTS4z ztU((LIfoxkURmi9RniWA2nY?@9|-iMj{AItBTIdmnqEHLWd+2NJKovfYtMFEqvXmr z(!FZ1>mPnr0wwGC<3*_ETH3%9?P0beS-4!M%v7p}5)V1bn4^TNnDB43OLjk7kOQ{Z z8Gbv)&%{Bk)g5Z1wNT@c@kTm?t@X62qcNP{SdV%rR16inK6LqDnew{zc#^CvrR7Mz z>F5e>-tO*0YyXbSE8gM8`qCj{`nOBJmP`Kw$``jy->@G)fs1;t67?DOCDqf7i=E?O z!gPXxO5bi4_XH!zR(dF<$IdPufmm7;dP_PACqIe0ZC5=0>B*r`9FdK9VfMOW2RMA3 zkpdM`rg27r@(n}iUoArfc*CEqp)@%p`!->mKr2XS-1-RsUi48AfqKVZ=aPWYqxEDs zB)YAxv^ocBg;D$89>!c)ap@|OQ;y%7*P2l#jzwn-Y>Nn_i#?Z%C5 zJB@AIww*M#trOdJzS9fubHCqvKl$g(nK`51WM=kSd#$~xP6efwRv%BT-3|$9cCUcJ zcF1L!J~FmwjPFSr*nj4^!V5ycmd#$}+Tx+oWCx6(Y~{6kmMhBPj4JiZ$-a#W_=5_4 z=c9W)sfG9V(`*Sau!+u%5*rc~s)G?w!S2t^7tnh-PwARi>w39Qi@qF6LwKqM+A|wX zVH*IMb$F8g0uv{joCv|XyhtMlXCshm^`ulBL238T3lk7)<#nA*afD5{%+<;Z2|nHc zWJnkGrgv^9dL1`?%cBtmX|EKE7?<7Pi&2kHk%pq{>TYcFM&)ImYPiC4bTzX*h&qN8 z>qy$?pyrx_u7(KcD{j#Kszc-mTR&`9EUl|>c>&K#Dy-G7b9#CjK}yya4TC*BJ^DQY zJ9WafTI{<1f*aD-fNFniEBX7N6RiD4=M5Kj#j8)0p}QTLo`>^oJ+bwwi|+<|STLtK zhc058J$op&Uy{owY@2I;1%>R%#^OC;Qt}lD7M81qBsXT%tSkc5n57W^$HMWL2?`S5 z^wZ;}?r>Ark=LLD7{wu%=KNxbMN3lH*dCqq{v!gEFZxanYD!r8BOIBR`=+y)UVZ86 zH2HRB7xW*sA<+^3e78){&vRSmnY?R_I`x>CV(VraL|VRY!iM5?MEWAd5bBAcBb+_4 zL|1CgR$N0>&pfT-vKJ^jB%EpWx!Zc_Vgi?K37s~V;Sb~mWfbDrEqX!$Wa~7wtr0A- ziP5T!2<@^DJeyq!XUH8B&&A^cI`2IrYKoco7_Ru1p+pP~DPp!3)VLy5KYuZoU66;NO|Z1_AVq(}5{lwz!03IpT=V6Vw(8fexZ6_+kX zjgSgz>tg5wW53CLEP@TeDUG9SGXBZ==oJqW5$F&<*^&H-KcZn+@n>LD^j>c!xwT`p zrhf2lY@2=SDLDBTLB&gjd)n(dj^y6VgqGc-}v~2Yz0iOE?nYD1awKWZq zN-3d;=Nv?7HCxAN7sl<_vouU83o^uyQ(q|6f8Lps!6knD?Cqfms&KnMJDsT;ef8Tp z*jQpee+W9-3+scbgQ~`){BhOv35RahVc5E9;UmJE4G!8w75}yINcnCO@yjy%20(!c!!@<$j+)-P}n*;YGZ1vNm}6 z>9YPO8la#d>2`z?>Y$(>0Lga7?Hsat+vfj?(CujCBmY_<*B+kGJdZ;&IHZw*nd)Rz zfT4OppjOeK2qC{>iY!2cnmQ@ps_es(^iu*PG7YPR5HmMQK3Nk)**p=Dmf5DP+IoQz zT-;5Jfyw)f*n%A5LtwHDfe`RhWtbVj(}h~b@YA)*i9;wp*NE3MxlH6b!9JyjgEmGC zXz!Z&MKW9+f*crnYF*28Eo8P##F63yFXjOJ6n>XM=!9y04c%}*LqxMjAqX*@a^DDa zr<#oXW(~@p`yF|iFaF%ypW-EL4g>|{V2=nD*n$ve45NMl7R;H3juIg+wL%Hm10Q0B zmUnCskH;yNI74XKE`!~)THUoS=lg$8oG6bn&i$MDP;Qk$I)qLwb;y>;mCm0^uI(cK z8~_|km_@n7(wnN^a0_l6CSr*4pwgq2b&%Y=M}EGr%sr3YWz(r(s_yJ5rScdn1C`#V z;m|s~jdurP%HDooOi5AmHp&K)%@HBT8s8S*@)OXpF-f_9B9Vw1;x~eku9lS*n><`6 zGjz;1t^a5}|3x7kgF0b-sTxfAs2|Vs2qy2wORrG;4f&{xL;4 zz}X6WMD}DV>u$H>ng{`^{`A0mvrXlFy^=GE2dgC9A5b%GY^2?OopU~}S_%e>2iW^T z&vEixrxyFcgQLdfpwT+}NBpRguYAt0dmj67?Wc09Gn`l_^uGxiuT}j*o2!IQDJsLU ze9CdZzwy3)w>uZ~4607<(0j9NV-7>==~t6~NUU0N`fcC4$INLJlLW_;sCr}3UcIid zh(7Uga9twUZ<+-6QUTZWK$x)K``?otlO@TF?2q&Z-e4Kw_g*d^Pu0R5s}a=&9TXz} zS2p9@9<5yD@u&bB?c`&1dm=7ZyQUx6_^A%>3d4a(b1s$|6hJ4H8%(R^v}v@BZ!Fzd?qUsn68(>pAE2MV}(;L6Sg+2eq0Ajgz38jwTz{&^GJ ze-E(IHtb}LV?Xz*YW^&3l8$0IR+~zmo>px<=g-}c{ud;J!psLgr$H{ke7$=4#HU!G zeL(FGCMry0tEy=G!1*FTfm%_RzZq{3AgJW8Thag$+PXE%wfIxY7o2BY^BZM=J`2p; zE5CR;WCl%P739Vm=|qvy|+ee2!2hQ<=ORV+m+Kzkrr-h{+lACAZI7P42>&Wxdtr8 z0{3C*4=nN5P@L}*u1k~C8O!E7YBHYZ$iDxmKsDUxa$45Il8tJdR`cI6`2B(=8O~V; zjY0t(pqf|t9KBb@-p);U#@4(OHzcA*vfp?IF1nvPs_c%pRFHvG{LIW*+sE5!S;5wt zzn|m;%6t7!SK0=OC%OsQ)++#v)grn6cf7A4J{RdQoRKx`cg3qhZ>30N$Kk0Y2_MxZ z)NJb|w0Kq)bHO&@gFAMv?E|idc;nSUUtoN-e_70Vr!yit-M^D=C2Kq}=&rog$@Xat+_4h%4g$&3&K=st^*eRQ69Ke< z;I2n<)%iPj-uh?p0y(=2>2Mx6BB3>y ziUIy_zdu>9P;O6P(vr^C8d1a>?Q|aYD59p}{HJm>o<-^Z){JI;>E!CTJE$9Bn>gjz z+Jrd*)mhhME>nC0MbInb!3D3%2#%RRv|07uzhprsUdT9N(-)T;VmIZtj?7$U>-JSy z_%Yz1g@;mObo(7BH3cJ9?5(0s+sYP@V=Aef&R&&Pv)gN7!hDb&b6_mCL(DKbKhBMN z+SDeHJ))5P7qhaZ1#rI|T>H`t7^=bjC-61iI_-uFBDqzmn&TTf{0GdQP)MgS2PIkj zAIuu-lb&FqE;SU3OJSI0Cp{>yF^L-yJ%RFgdAf};aV)XUhD2Hnr`=3*m0$n^w$vuV zk-)60awLS0#XYU)_8ffVAzNDjx9`Mnx)Yg6amMWnxVFh2${?bZgXp)Q;xq$bnrk%$ zoWv3k+kYvzIP88++=2dEq3f}%D4@Mw+#*7bAY#>bWgaqMHOs-!nc64W{z0cW*guaA z%lQdplhdg8_&!RtE>yDgwbQ<~=qRhoE0)TV4*kMK&t%_VGGFLZUp4vnvsW?O7b0b>iMf{iEDT)7W_`=i_BSKGa&$tnTza z0&4A-+*GXvYdqh_s^bN(@Q&H-@e9tX%X9r~vYXuh#Xx2x*evF+$l)T5{PM=NUb2YS zrpQTkb!U@JnXJ@gGPNRot2Iq-xY|Q=f6n`qf1hIX*8gNKaWb)Ro4zQ&EYV~XTh6Vj zl_k#0Vofq{rCEldS`#wrcaWS|$ej!ijA&Y;ZAD`zu%tNNO3K;*la>^jVxo)~Gg`!Z z3pWN^Nm-oiTPXVjMBgIT2CVMRX^DX|QF`Tf)+thZeQtz3j`lK7gcU+>9$xKDC>r#(~;Swx6 zvv>yo;YsVF(pwwGXO4sZ+B^cgqXnEh@=NNkeEN^~#?#CJtUhj&f#%Qn$a5YWNk-Cg9$o;yikFwaybeN68w2s<$M3$snbxze9(pidH1( zsoAby-O%Rt>bw(|e;x{B}PSjP~kYx(Sa7nhMtJ$>3*>{M$1DE4W_S5MM$rDq)nj|r$eGa zgv-AD!l2_L8Jnpg30Jfd?$}V2P$eQWl*_F<&AwK@*yJR#X_Rp{YA>A|7?OdS_()MV zQd78gsrOXU-`5CRvaw+v6%Y_G=pQg(9A@CC|G!uUw`oAhVjt}8a#SzANzQ0%y~HJ0 zGgSxWewOOk?}sy1{H+*P!s`IQwQfuz zZOJ5YPZj6W!VlKnc``$YT5V#z6{i6+9q+ABJAm;|DSc0lTb!@i^d2vDhp9bSd>xBn z>Ub(8=GJVMSGF5(-1O*cvAHGLm`g|SW89S@Zc6W#lV-vq2A0+knK*GYROS|Yf2G{S zyxhfC_K(FD2Fq*Ld_T61NIha>G5V9Bge1{|^^bDeK)*hnv)y`__QXx8!dY=QBgT%% zCp%B8!=-TQ-w!z@t|*C%2oMpt{Md`~7$`IFQd5X|qKC3I&m$Ih4Pcffm?OtDz_FJm zq9m`Q!pwzslG*d)2Gz<4jL)}8xHyoQKPit|p}O6pEl;P}$B2zVt8J9#+VKp{E|;%O zrW8>M_OI1PAW%#TK^{a^p_a6Av6UhcvHPRqETE+N2jnK`1i2;jcN zOl)tN3CccNztoZ;sMPeJXiyp}XyxH^Hokb!(y8IzT5^67)hFh*&sOKlu zc#Q&N{FT5JLo_OR={C%4oj0yU9^C;~(<^6C8TU!8ZI(A0-R@xRRy%Wy|EoGg@YH`) zhhX`)I)vDtyHqgwB?rXRuv8TlCRARugElrl_7%~;azgH%3*|piw%?DCa&XEK8X=|I zQeIM((My8%_(SZzp_O3u7qfsy2I{WmPs82nP{T4Y4QUb@Ir85k)YWOk*Hu1NWj4r> z$gr)wvZ_Xc&D=0T^Q$iD;Y%mFzViM! z0k*Ojj)!2PZkr&vea(kUkXc6pve8C$OM`7?o-~13DLuktK;?VkwBu^zhkYyzoalUm z60bM)A?yw2l#HL45wj(6k`zPug&rN>VSQh=Doq4xhkJb)2jGS^wi- zEkNEJL;Jjys>kNM$@s6bj&!N{VrWbKMP4V7z$(1eR5I(Lc$}{ociPMYnsH)38_&AV zNh|s`r`SvfL3HhuQ1v)%YCBp(L!D@&$Y(Y10k=n0?%8G^;{3sLwc-x7M8QO@7Kj-H zT}F!)BFX~)LUkjZnEEkw1Snpk%WPY8p8=3{U;c(W0#;{(Cx8rO%Z!fRLiVUWZi$r( zn*Xk0^m>=y|1a6+)>p5(^dw`CAKH>|xZ0KYPjXN*f8%188s7#8fa_&@ z|EVP_X!V*u6z98|hkO3V`*JyWio zx3t-SBalzHpkp%~09+yw+fx5im5Ao0??P<)Ua-tKl`!hn_8Rt8oI%xK$*L+3Z3a1g zPgLB%AI*+u={l)6iRCM@)$P2u_e#)U?f6A&@uuGO}M3nNe*x4~}b9JV?-i^}*ubg4m zx7b$AZk}@i(d>G+<5+es&0*w*hqv&4IL~Ttv$SD`l6#exozJ^yRKj9cYoNqLz8j14 z`C4tdQD3Ox`nHobTb$fR^ufu=DxIN%C5et+3s1^*+5;2~6Xrtr|D^a)JRcl&IbH&& zkv>=q2i|CTdCAso$2X9;FCs8()5kw@Mexby^?FhRSY$so9LR;2s+qs}BnFS`tpZEq zpx@oz{z~>S`z?*H?nI+oN5QtaABbC6N)(v0Gp1ACEGxL}0-tmYsd$m;8R&$ySmfBt z%N~yBeN`29xTM@$UJUON0MPraS90NC6P1V}TYP^KZ^mwM$F`jyjkeR-iUqFLb@6!a zk9KfT_)V7Zm?=@o_cJJm81BOx^51&EAp4u;OiN z$YF8VCZ_qe+@4mz;U@0<%1sPX zEIOqKN*3}NAB3;dmHB`MVwVO;LGUqxTWb8_A|5~SuL3Kn05u4IzWpPx15Pa4P)FCF zYKlfW&}Z`@|CQe6yHQFiJA^Q3O^u8RXh=at;eUh|{A;Z#&G}BtU6-vF#EgWkgA?J@W7NlD>AfHul(+300 z?cpavnJd(H%)ie%d%hty8>raf?$3TevYADC|C-PtYR1^z0F zm%SGP8-C7|qxhs@eL*cplC3`VPhVGc+JAJa6@rYwx=M>%o&ni^+O7h7`~Ev4;x1QP znldypz|XIs1{Fn^s69RYL3i4e%Vg@W&Aphv zjFw77ouLF~MvZOz>5Tpv<4lv}zFM1O%c2CltHZNF0`l;`m9-!hB$yO|4 z=oy5*Vt=in1Lnf?wOEFG04DD4)NP4@K~Q@TZA5HWL8!Ul4;=^6X>w@-Eoa$L{DP={ zCS?LK+&4VGI~z1}YYddfO62?_6j}V->hR~fOo0Lo-+a^vfB&O^fC&A4{XqDb{^)ps zfB*j(d||@A1b-Irl}%k1S$E%XsuLVyS-FL86@ljYk)$?tCW6}!4HRECykR7iVYi(; zyT7ZVYRvGiZ$vE{eHnb|VOHc2ux;Tctgg=D-m%9fir{#SbO)!DKMnm>Tf|v$PaOqDj-C z|KokYYQ-iT48&vRp93@KC|;yxSDu{t-6@EL`bC(I-%DN7#XuqEGw!q|n0)-jF92DM zD+Ad#SE{k&HnS_Di2!l%ou@1_Xp+54c>YMCz@g8s3jUOcEQVm1mb1FEl(TgixPi75 zo{`3$KSrep=)zG4nlYJd*_n*hkFTz2z0sr~QB^8(F6mRpZuX*=&mKCk$T{U{A2XHVk88J!dsN8OA@ku(|pE*>;ex|Uqao!8C zIdAO!&O0n66>o8$g$v~mF=DhD|H1WBM6SHr?uX)-us^#3^l#yo>uM1)lM$0-GfN9~ zOElt0U_oAWsst9n(MtAN1;Edpb}o2D={kOmw!9c70}&~c`22fGW*yVw5|-TNY#20= z%vaa78Z^?pfXh8F5HhbA#=jmHtNSURJY0{xP-FO5nRFrI1PB$cTR^>RRRlCE!+Z3i zHFgxw9<{U_2V~uq3r{naY@>K=bkvszM2g5AVIXc&be|da|dw z7me54Z?m>OIOv{-Q%fx88>JyuWOf=ecrit_9|kP|q)aXUH(3hI6swk9oSxJ79r5;-g&eANzgM>zf3NwcGg-nB`%1xbAq9 zfl+`0IbWU8$#s}O;0`A6$p!{g3)-GV8r*Y!#Tb6mCHt^6%cSlUU=o5@^KE zotsC_0N-I29UVNrf)a#NpEIBWY zjQ96n3y6iMnA2@0##PJ34h5bMFN|wSU>;MazTV%wO&Ql-xOjW4BsPf1bVc#_x#PVo zt_0_j1d%B^-?rEm?JXloEw{I2Xa^|dH{Y_Uvk2wPB!g4e!Cc?v-!%$}cUa3(rr=)+ zvf7u96wFyM{916Fo$~W|Qkv{Iu%uRNFs)v!r<_;8`g{^;$eiwfqe{o8ZhZG zQSFd$wK{Q9>CiK!iy1Z?ndFgP4E#cL(S5u!?;qF+TsDgbZzUYSLepf&RimPX z(|x_@qQKE4!AFP1O0F>)*`P}+X-h(MmRWW|uuY{Oi7sbguYF1e>(oZ2 zeNUNNoGk!EY4lJfo@%j;@YTSPCnCY(q*~axx0xq}M82_pH49&MHwk4{HdLpm5bNG-;tq<8OO><4SrjyEo#bTH~6Kz{s6CEj-s+ zXLfvvJ-^4@Y08I5Hq|13&TGI~mSnuUFN-hbjz|{5SP(M|mP)3Ku@TBuzlEt=bE8g+ z(!@DrO|j8aPf|4{)aty^BO_$=9gf8}_a<7;vhn)1waeO@Yk2du;zdm(#a+C)=)>9G z&Q|-{XlE8z>WT8u%y(t>u&gVyf z>$Ib5hDwb^<<2ulK|eXI4@2b}r>Jp4H)%_M?}!7WwN$ZDiRpQ~Fx%h!z|?s$|QMyS(l)+To$C)`p7H zRpgJq?wiuKsp8pA_inw9_;Q@-e$a^L+mSn_h2PtuQ$#%X?}p1}O})ymdp}D@m7aqr z-&B@MH^k((x5gDNyEl`=MBagb?CA!V_b#w37$r3Bl(k!CV(>`@2abB(-=>SSMBwsN zw}o83&8mvOs<A!aF@{w`%J|#ZHjMZ=KGIvR)0Okjaa$ks*A0^2p&+C~&ZGZ7I_6 zM$AONp@2f^az(tRKUYI6G#pcU(!$qhX=6uSQ}1GBM0ay3-Z@ofWpGh2oqj3$bb%0tD^h^} zB{ENJ`mVyuc{_}ao&F$daI=ubh{>>-r`n;WZWW2_TZvsdGmJ(#++IB@Fd!P8%_8ukM85s zRzXc+HlbPERyk7l)iQJ0FAAC}uN>z~c*2Es(wkof-kutx6@dUov+;09hw6LN<;GTVcLE@f)Rc$i+&@Xjo)hp%X%oY3TElfB`p@B@roko5M|k+O#VQ zp)`SFQpn{7>kPHgrRGO8mi#p!xMQTQGjU6Pai3nuYgSqyj|h*QZVtqY`xCtzUgV}nIU=M%~{y#IjJ1c zMDKO%5b{t_yZTA@M{fjPNSMl_!qHDBHeJ?kN&IQ!9)Sfzm>fKr&=m^xjebFn)4U^! zwvMQx=5s;HN2W`c!&xy;t2F=`dlm{(&55&#Wh)b!^38VOUaAr3zhzy8z3MO&&Zn;9C8t@ zS-eC?&R9IHUHwJwz7$?|kV5tIs5w+G8wsQg?oq!~dW#%)*P36MszSV614?3CgG(Ar znFXnZ$q^Dr4;3F# zb2NszU(*PxljBc_#|In#1YQ@WLE` z?MSI9ivafgjBas=J~5tE$HY8d`_j5Zk__t^qm?eNN`EyHrBvh?VdI4!Ux|IZ@;Eo~ z&^rU2y36*;t|U$h*g{NA``U*L3Q=NV+J;{-kkNu!%Z(6*XU?vaU+DN)DQfT+{k7C^?bxuFu zpN;eONTa61@!(y>K{NOC)Atko^KhTRy>%Ek;>)aH7|()xkG!~f7E_I##`-aHcuED znbOPqW$hG(KXhyK4*MISOWn<8KdgNd;I{XAhxY98B#2W#>LLrv#sBo`Y#tjWEFe?6 zUeNethBvc3*66FwlRkj6C<0l*m5oZOpW&-mW?;|;t0(eX7TB}$tL=lup? z)umAN;pAIEP~nyk7>X^S@8xAPlV5cJ<%~y9>oIs@-vo_jLbgga#xhzPcu&?vz3$c& zce3{pe16|n{UAPGp`k1}-#*;-S?C)@3kIs*L2a5j@FhU>^2Pd%T2>xLDY5-ns|0p= zZh1cb7I1bw79v5hI|ek9};T^m1tFl6!eM* z`&R*7;L{%-#*a22{KnwqoUej>^+0`QtM9W31KGOWxs&sK0=EV(N^kO?-%)ro{=@lP zcZ)&FN&d^F{7buJ-{JHBO}i-b4RfeNV}{y>g@x68{E6qflfa+<@_bBjMBj=)W7FyL zUEmT&30GVqJ)(Kv8s-y~id%v1q4;DE5 z_~QfaMgu!1|73F$g9PQ3&!@oa+fwuZX_^-T}DUgY~;-g>6$*RJh^z%QL_;LP&z!lIv8PD2F!0VdLCfB zEe48O;tp5dz=|FvhE+ZS087$Xkt!fQfxhOOd<}QGxV%l!WuN>w=_$SXLRuf_GAaGG z%M-~)9=fgLm$=jzsqTog9Ul!}>VMmkicoo7XNpeE5$z&x9h1&uMRvXBHBC~&=DLvS zQSTpYTxVKTLCCb>dA8>EH(058s#0h6wa^{?lbb0P>c-V%I+P*K0dcW6{?21XKdSI5Nv;7+blp#nTU zBS@r?B9U}(PGPq2W1!V<^$f-FMseP68`Q(Yl7sj>e-Id_w>XpxG&Q6E8wuaBJ&;8O ziU%i?!b^^b8@ilO@wC3-MZsC5HqntWUEX0l;Jz6@cEN^w)f$;;7*hHfHSEhTV;qm@ z<0ktp27RH$VHxuLfZ=_bn`%4R=VX+45SErKkqH}eNNwQS9RAX;uq8Tai9Pd6#Z4mh z=vhPPuobeGD{A8=N!HWea*s-MT>Z>BJ)2o?xGDtymrK3QZDq|wcr3FDhER@&duddq z2f^%~m&5n_%a?O9%j;=ImtmXW)yzobggE4uMND9$-L@jMT|7P7_tw_tHjEaBv-tbC zT*7y4;|gAn;VN<6>jF>)X9uH&N~;rCE=t;nxQ-uLWp3G+jk8JM9kCY@AK*nsaIBSb zU_&JK?;SS!ovvw}*Kc;(ojSRhR2LN?bM2HNg|p5gT*+s0>=XIRr9d7wC}=5_|E-)SA#X3K64j+US? zd`4vsc3hjc)3fe(L{xmzHUKnssB zIqFrLy~lmBQ~Zc>44&JydhYUNiq@eGuvat4rLa)1kiUfqz`A*LsYYM4?Y@?=uxa6w zXS0+59X1P{{&;+cE{mcwE%AAJ?G?c`lYV>-K`PR~2hUjV@UVNJ4u8Vo=RrE5QNv~E zmHvx^mRp?$)>YlDeOndcPkg{@DHUe)(Nz& zaZ@zn(RF2e{;+diKQa2?#$h%`f_~0m%HrfYyg!ht%JNjv4nZMLD)my;d#WM#(6U#I2;H#)7I%^4)>e?p ztTj$wa5A7BpIfa`AZl1=uybz$`;f}k*aB}Rp7N&X!CYAU!!x2kCbtmrgj9S&1@FKfSB;n zeo+gmuq+>^!1=1VXPGw!qAtu-euya|&!Lt4`20JgEvnb97 z5nj|bA#y_pP+wv{(&Gk!{`S_+`3o5j1X9xd*DLh3xq>>^&pMt`3uwh&9fCje8_&^@M!Zg zP$=o3dm6}iGZLiB0PIe5MJuqRDi28dlwb-N_!$l|3`>ym-#Z=FVuzPJgxFRsZV0v@41#_-t+uJm_;PEW&T#G6! z8G~5%aG7LLdw9^2+1C4^yPM&uT1P3>|83T#FEY~fWbwm}fbCIQ>2h{S({Sm>Y$b9* ze}2w$V<3^Q_QwvwudU8E2gqHP$Uu|h7bW2|Q2g4}mE)fw_{-bs;Jqq}BFlx^D{jx8 zm7kMP`?3J2k2M`9eX+?+0~8Vr_GgBPA1+be9yvnkPp8{i4{V_?iAhZBbRj-P#m$Jn za$!ex1jw~>fNlxPlI9+nvv|%FzD4G2!XCX!zEJ)4aL$v1hxdIaw}cwn?eu6Nsl|ox zFN-suKqSe*nf}!R9K+!2Du@*Sn6|2U&NRXjr>=rmMPU0=;NvB@CmB|Mrdp? zV(lOHdwZ%ZnPAl>1+a$2M`);xOjR7T1El358z#MN&xwo76iWiNLiR}eZyGpLrk2jW zriyZhGF+^tpor8hQg~%46+>f(NNJJuxa$PDgUCl%-a(*degwLzlqa!Yca)#jRpo@n zI#Aa~r|+iEoFRI8#6-%L0aFOq-==3cq6~S~_gF11A_c2d`gpxDuP^U=vq?=qS}0W2 zh~hLESe>N@m05RL||DgWY}kj5E0W3ZWe~}+d+(~ohS!xnw?U7>e{>X2F}hc zy!0lM<2r2o2~5Z1$9rJysZqWBST>wNa|DfTd191XinpdWzV)VI$>+?D$Eq0l)XrK)(@pHo|RXwx7Tt@Ys|;n6ykAG z1Krfq*j5{*d7AF7{qaN{=|}1L6=~-?86UfdqrM}&XmMW{=_XL598-km-T?sfi>~FD zTY<#ua2j_QOBL2x=V7oiPw)E^!=t!{DriePz_4;oqqi#8Z}jv#rV35Ys_RcUr|sTB zNUl9NEO|v$Bm`rq&C0nfxKh*gHW(m($+V}A!3zUt|>a47b0gWvV3^_`7* zT8}V&XBTE3w9Kk;=@)Mcl3vn!(6@RYB>?CzyK`r9|+O*piWNR0OAnnJIUXD~0Xhb-BI#$v&!`=X(DW^;Db6}k& zCM*f{FWKh~mnZ6ws8@gR!9X+W+qjGCnm9YWdm9(Ddb`a^pDah`L{j^j3PG9$CW;Bd z2j)eK^?D1FoI{KoaI%p{Ni8$lU(dnr$Y3nedS~@s`2A{x`iaQL4=(!ADeC{uC* z=EK}xhYkXHJ;T^n9L@m0f`9t@h7TDd;BAr~^D?=;yPj5?yBcgGz@OrO6w&>>+sw*4 zshbl)F@@YX<#MU%T{~latA2fykz@Bd%Ph1k?7x%tYmQ0aZe zRkRJ)IDBEE5^G$j!tvO4sm=I++@5%>$>tBNV~f^{ogmo=oPp?GQfKyrt_=IPJ?tmm zBT+B(25$Ly56^ej-G(w_9oLTVU_{ta^+02W^R!?G#llJv|Ssu;VbJyJZ$s_JGV)L^kjK-@UvwdqHZp`)z~XW1P={ zs;0QLC3R)w56czEf0ZEf5eXDPsCNi|H_yVGdaQYvT!hlth?ZKIO*1HP2bPoaMg-<`0VlQdsp=|-cTq12C0EpK9R}1Ik{O#DW=qGy56bi zc`oa~i9zjq!32`+^#4!;6%Zb83CVm^@@Kv>&d&*w_!4#y`!|2uR2LdW!I>s@G zT0>?}tt%dBGy9kfv#96oZdZo;vd5G3za#(AgG|$bDEn&68SdQ#Lm?obMZ%Sh{{Yri z+zCw~%&c-Sb#2fYaIJN8&R&Q=v!_0icHRiWYx`)Dyjn-q^mcq7&mi{Xd8F2SD9s)o zkjQZuZCPDkR=u}yRe}bq1#X?`H!aNHdKz_HbRg=7{F_MlANfE%4-wfPEeo)vTU ze^Bqcg1o85KE~OJMCrO`rTl@sNYdbJ^1Mu*xkZ+-gYeVyY@iQ|p?ZYZn%O{ow#d94 z`JN1hXLy!a_BQ1 z+0g->lI!M0Fx=aFIQH{f1(m-Ix}HnF-*n@)syIcdFX494B&b?5-Ar zj*f~s(9&-}t&cp}OhiSK5{`tO(a_N*7a`_igy=lTz2Pp;SQOxdYgGMPz&7`1FBRdQ zhk{PmS~mgnI3=^>e7)9ZUqRyq3sH4U8sAdXT3s@PLbtm86}}u*Lt;& zLYWte+RY&Hupo4rk`(Dq!o?mW)z{PoQzx;}gddsJ%n!}8cv@poXW0$eP{LV0$RxXy z9n`4B=}Pvn@@TAn{ja&}0hl~m#RCRhoB>TYu&lM6hC@t?JPf`LX9DLnYcs8))B5k+ zDY)*`#u~NZnm5`a5JJYr3sjt?kjj~`sPCC|v_Fz*loeSeLTl2(BAW>Nef*2OHqTwU z!&Fy4mruS6v_;T8&bQB$6!jFhTjPlfji5Lkja=Jir_3T#dLZ>Le@MjV6}p^gSOTvz zACuc{g(`Qc^xhPEf4|rv#-hU|RhsAf_4xvdGsf`!fQdv={22*-hI? z1v2e}RH)Nny@mLKlH4U*>#9tQ1Z{wO*y+ zIBDB5uG*uLO)^EFQH`8_S1xRHIZ1*6;gg((R-OKB=%ka=8igfN0!{I2V<9x*<@~+j z#5vQuTdMW8cF{b;xTU{kt>L}pC6<_f(Y}i_t?e=K`D)$hWedAYefRNmg zColA!OH;QE8cQJ%QGCi>YBknMn*1qJVT}WRhTsWOA;BGk-z4=jrtghVDA8x(o;R;$ zUP?jTc}a4oP&o&n0h>J5IMbU;q;N6QNI*&T`ff=lRP%eX)KxAf-NG$lSBI(#54h@X zun?w|C`C98tXOX!n|A#0L&U(?9ICZv-6s$ea!(&=ZxkF&qX*`NuvXDtvKXJCYl2>0 zR5CY3JEWd%DR7MjebN2>#)%wXp;$sBch&sIUq;6<1xK&yk+sMqC>5S+GZ}&E4|8hW z3Tg1amB7e{k`hqskfCUWL{!7ETw>d6`9z5L;U&N_nU>N`OJIb`q{DdiI6JL#hg%84kG!mW55H1Lwq50D@aR5b@LMOGm*z-k9*Md#~@$G^iyWq z;)q4{=2?gBkeU}Q8dP26yM|GN@`E!6AvaLB8!!)hV+;~2aV97G;js`kywX(>8W*j- z6Bb1a2jB>gwppLNiQ~VV5ak8{doyWuQeK@}U~KcvsA{#tjQ)9V1_w%du@iwp`iAry z@_H~Ji2BEw?5em{HAZqfCaT9uGhJyT-Fm>s=Li$sINYy@Sp&$SCD7xaVGqE=- zQt}nCg7VA=8ibKv78CVzBDwR0#8E5Tcn9SkI!8|6wJQct6_$`nDKVo7^T-#e}xty^X!!BNRYteaAl!n%Q{*~9vMwM_J>^ET5a63Nm*Jm zMefvooRT<(&DneBAcroJB|4f-$HIrmIY#tT?&eOH!2kuX#1|3l@Slcj5Is0rWUI|lRSiPwr(Wt~^ep35feB0-+1N^{1A&EPzh&-YCTdQB6 zeKB_IcdOqmzn%&wiy28>Sn**QlDT72P?Q=1y{A7Ib zO|UsgZB&7PFu+OrmrOy>DZ9Ld1ygGuCm93KNlDQrtF!QA7oFit;$1LhdSxcSVTrQ%M8Ly}Wg1h-dQzwgH%w(L`WFca zvNn}X4<4SKij|b>9GbNT&4%A}yOM&VhEpYvvP{=*)4w!)5gi>FMHNi)`2EGnmljz< zE!b%#D+~~D6+^_zJNJw)?@zB?b$e!Ib$z0R6+>Sihs3R2XB4Y)E2Mz4LR=oo_%)tX zrhD9py8t;eBqVq|ctmSq^#DeA6|KcXEgXx|(f zYiWYQN_Zw?TI?1!t%TUt71{40EIxMyIrK5s-NRO4-e`&sh9e@7J2$)S3j{?Oc4i?m z7z{NpWx^MdLrDrJ7?+U+iDmp&Xk^UM#|m7&nb!Q`^4CHtRhs`+Ax`Q3V8igKZm%pp4E+Ng&L2I{x4_Xb+0N zEQ?|AxNIbB)_hT%@uW>g)~XBnk+G_AwxTFjYWMa1*;z})coEG;xzWcX#knef&qOw~ zm&p3?75E9rk!8n?^7w(hsHRQ|oO?q}O{~3b=#khZ3lRkQn-QazQ6yxUn!%A*XHsA9 z@wc$q3UM(IRo8Ov!>BWPVjgAm-9^^TMABV|N>kG2$U6s^vuXsVGuj9QWQ7=pwQF%= zb-hK$i^n9Wbl#B|(V{rt^P(5USEA6CecC;ekkTNGXYrX!Y`||RF-CvVd$}He`x}ws zBM^9uLNqQIB1HVITy=q*{|vQ`vFGO`L2Dyr`6rkaO~lREJ{=^#V+R7Y2&R9t0^_({ z#H=K9{#uXgZiJJc%Y<~sh9BKE15~eXO8>Cptk76DuoWL#7N0XdHMBwthdV*-XX8Z> z5+6j)e|+K}Ij0|!%Tiu-c zYnI>38m{~W!?g+jiCTe+4ZE znN~NH3mX-q-u0{pU(v?!+2p?b`+i>dZuIH`ae8bAn8?abgo-)`w=++i&8N?Kek+2Y zR>Hc++%~oAD%{EX~2&PZl!iqCo018eF%URIb z>v)3hgGs>&F#e(K)YyB3-n?~{1RTd>W&~i(DDx3x>yjrY^-vDFrX(e~F@2m;*Z!6P z^7Vc)3&hoN3OY+q==q@Gvy{XJANB}Zz0>8!Cwk+(oau%JL8ZzWwZCE@w*z_^CkpSL zcOpC6njKRL$@4#M$Nh~K5k`!Vkp0JK(TKVvxS*(|hM^R@Jk-hEm#^2kbLhkNn}_j@ zl@bbMlGMIGPuEX+nJ=g((%i9Z{tS|DyCGAuo>5;GLGVp%v74j`Y|98Yv6ss{l9}?Q z!v?I%mJW)v6b2F30v+Fb;vy1UY|U~xanZMphmm=9SgCHis}2u<&W4|H(Mlm>N+np`;z zZ@uBj7P~aYCj1pEe1oYtz$FI{K5lMpZQRLUR%`4NaCyN4{!6zat57aqn{P{bP@SQ3 zqA#B&I3XkY4*M=Y0i71h+%x*BpeI8$7HQrKioZ2&Ob&5yPEyNqH%`gBXv*Z(YjSg| z8PMWvulM77ZQ#p9YZiD#eK`9X33N$ZlKT`v zJ0`BBj3HyE-}(?JR!jqDp)G?i>rt0P_Z9~S-ef~S+)Og+l0sLgylr$*&gPluNb74d zYd{TX;#GuK(7u<0TpPRGN~U!Jdlb_M4uH-*=WjD|v& zk-lCqI|K>&?SE#Ky!1jN4@R5(*xjz-kj$;wuAkd)!{?Wm2~wk{e&47Sa(}mu6cnY6 zf$FStv}R)yU$wVy-6FPSei+gHsIcUwn#ZYMpS=R858w*_kY3ND4GoUu89ddwZp{-u zbUyKDXrfyTWG?Z0teU1_U|2so@dkP*&V#>KHPCOqqj&nCqU#SM3L6nJ%w4i%vC-lE zIf+Q0NWV%j2_-%>s+ql*|EG$prSe~Fi^g&ji0#ac6BoxT_AcRHw<b|LwXFLP`W~5I$aL14&`UlMc<5ZYjV4>70?v0I;=ccpEZR( zvrfy$Mk&J``}jJVhJMt$cb0*CnY;>Js1Fw%YX+>tGynY5^`LaAwjEd2Dqpj0#ruE@ zqX(w0wCcr)o17D%{-ij<8Ii(4o7F&&M0sBmVsZUu>R|vY2hMS{;$K(P^?Ck&pL%RZ0o%-imb+w!n3M`@2OW3YTE zD}20#M=i@h6Ya+oIVKv4UTAuGs41qY^&||dJAa85aq44!z#^7!t)9x3n z-@I#?7+XWSrrI1ZQQ&9O^I5FTe3zbjZZq2J6yIA*92!Lws&MK^ZE%xy#IX0{O-kUh zuk0j!+z%gISHbrtQ$nzgm#^rrlTmH;N-5(%xZf(7pT!R3uSz>e4ZgUQB0-gcyC1yj zeTl%O6$KLq;zXg~KLr!NmD+vNCjKu5<(m))!kg(IRgZ->I05?~V&z%Op1{_=F8Ise zmFdq_Aijx1gE5Q$C{sBU_h?!iB$8d&W~k6^7|K=AZOU_h=)h4`8O82X_$Ur7$7*-% ze?@xbfGL7l>ooOk6cPM%e8czxkBVJ#3j&M5lAUmw%1X082Yw>cx+|E+_d7fXFAOf3 zkeRx;z=Fy(e0h16y|v%-_B^JvnhJW=V4+#|AiE+GlUWx?@A0z>~ce1`U#-7@zT$EJEq+H zEjrx4uYag-=X1;aj??Z{`ZVm3BQ(&|CO{^gpT^yIp}poIMBouA3}NtR70jFKZgbIp zUtG7KDkZP%S+5!Lqd&Mj{DB$X7NZS47kf}?)i+1tG%GR&!TahA#?H%AOAG17tK+QA znU|QGk^7$|tcA+f$Kv+!;v^FuU^9l?WiBnhZ*W7EU1F>pO;ZG3Rqwx-c)$hPPhnlsOx8pGMseJ%eN|?IB(@We@*g!DrUpm_fLN)H_cA~SW{d7U!ooLF zQRb{xPtudaNtMsZoBFPA0L+wd4UfTojt#wesSn;1`_(QG%!O}Db^EYxK75Z&rWS|GKe=7mA75!DOc^K! z950I{-x^@Qz?D;K&70kZHz*0=&&?$Kj;LC6E%QrSUlUq#=9YUch#%P+#-W&P6^37y zQ}|$zoxM_Acr@AauE(FntI2KYp7eZ)7Zn&$rLsiVrG|m2?!KC4Ck`OWlyzEk<*qnv zHA<3Ar06;9I<-*Uu}EVw)YEKSms`gcp>0ZgWM6;Gj_um9lv9!=ZXxjFzn&3TU)YaV zN@y+~T0=$NSypS-zWr`GA;K;XP_d+ioLqR;y}a*+QnAE4Dg5e!O_h)J=)LOM?D0~so%w)AV1VmD59h_DBie1crovgssx8$?@4 z&tA%HTN-#;|(=@co?#B}2 zVjU(D80kz(Dt^mkIobo=a{1K^P9>&E>0A=g!6EnfAi>LA>PT>w4`-js_3V3MdHJ6Y zTTHFx(don^6gqO)rkS3WM+bLpD7xB6e!e=thi*-m)o|Qfa@#62E`|$*u+gEUel=p` z8~|FcdLq0EmJmp&?FvL60S+_!?I-T4CmED!n&g3f*x)%<$mzjlxy@-AVGNwr=%0Sc zd5prHJD6E+lXF-oETs}t2BxHgBApBt8$yvErqp#Jw1}uS6S_$k!_$An-FjaB3brt= zj4T=`ijX!(DIPKVbU}ilE^r(-6&XI!nU*eXCG7XMFcUqZ z0!(6|@mT1R)?ue#`l@!Hk*<1iF7i+%UR!zC^jCKhgu|*vVQg}mQTdaUlK*KN6o~;G z=~U+jDpp#*Vv^O@_{1tH|?e(BRzP7W|ySC+Ocz0G8NQ|$5 z{ERC39&QM-bJLg}?gKa{m3VLW5nsMav|Xk-)Gw3*BQ!F~*Sm6P1hPEIBYe2P!v(B_ z8cfRfl0g5qcgp9y8f%Q-m5DFoCg)0KLOn(hL@LUgJ|}pQRX3)hG0=@2dIe8|(LX{6 zDN!NS_XUR(;i|QDX?5wUOz`8G)V0 zizTJqG|R*h$*T<w&h!N#M!i>%gCXfxw0-EkLR7CAV09R1Uz%bD6sii|!#oU9vN+S(OWQ~s>uv5fjZ zOpP%vDdF$4NYSs|v}e}&Qlw1LPYf&e0>3(7_0m&})|2_UW1IEhwlt#8#dxVwbsjg* z8PmOKJWz7VT%kp<_j)SWtnsg`JoZVae%RPXG_wbfk^aD~f@|KiqvO^E`vxJYY zv%wPOt%9hy(){LIyr-yrVgsD5z2Xr5$e$=JQ&5P~#Q6nrfw9Z4-m`x!4BWT-ma_>l znxVD`RQic@iC5Ddg;)$G#j5+46Q>3aNFQ3n?N;QDW`Xr4=N&afNMwwzZU+m1COLr$ zTlpY*f?*G(U?{=utGE4Rwuj@k7^C3sp!r>Ut3gV61sqCLQ`( zTSnPN*9pS!I0Fcuzb}iURvwN2@%#OK3CgIC;mtvmA-s$D_rU)qi~av}vW=SmH_&Ad z4<0##=PLe_La1Xp2BU#oUrki+mtLbrLWy1HZ|3xyNQQBlQ`jV!cU0SuP#T$juYMqE+t)O88`A<&1NT1Fia4;Rt~a#8B_ zO?*Fm#(5GyQ!Y`k1Q!fRo`S~qrX4OvCyZVyEcy<4g(gf#it`eu_62ocJ)1of)Q3|kw~l?U)K}MF1qZzkj4Eye(^eUChjNd zUn?qzp&mFKQRC^w$u*Yc6&TAQGC&T7MP1y@6{0b;4vtz=ai3iT;eVP{8HrWFc})n} z%ijj)GRw_zaUE!U*8T*g@8ediz?H=AF>OW?!t7Pnbx_bcd73?oH~Bd!M&{9WB8wg| zg#K%k7En<^Wp$2Cid|Z}KKo?v?T7bxPQ@Z1bxy5@Y0OH+g zlU1z`7gv7+f0b#@t%cK_)`dn&-=o?j)U1bgs6n#=ZWcPD@y{;}LRU5=PiqVTYg)f# zCmH=M7aL01NEn_cPjv3|$+yh(ym)4SH>=!#Io6JxAO04azWYGz7BgD>IwneW&4<12 zw8&3RMOXomjys{k`FTB)jI&D%stsDrOxM}+MF0ayr9tF{;?Ok6e(>}BIH;O zR`Y{ht7beHIIfQbf!YVhSr{J2?+x0l&!1sy8O+ljXy?nXH8tV0FEW?<Y9MECj=Oz30M9^crznQkYZLt;y*>(<_+1VZL=2IL zJ|4el#BTAkGWb?nM=&Nk9^p7-I$fXjl264S^5ZB_skxz$jB->*&{Le@{&zXBq}KAM z_7K$ZwucCG^CSAA*jHbS%!rg5XWjGb4!fSOnY9e`T-h9ePE##43T4~Wo8^?#;(Oiw zu9GMbNGSLNpS*+SUVAQ$LI06pT%eq-uY~mvZ`2+KGsL?<4s-a)ncjS6g)rXYXMq#yhYm(C9#iOAXJNDLkHi`QjDyT=v7K zE7c+~_VlZ>V6c;D`TB;}^Q_Z57@YItZcg<e|W~ps<5pMZAf-N0Z zqXSy;5WD;7ei%7MG$B)FZ2gxOu?LS}Cavgf5w(wMwO=YOJ|-FUfl=2ZrM-0eyTT9k zq3doEmWi=BJu>3bE4R)z$@QP^X(t)Q5(7R(LKd%+>T1SO5Y{;#R68_6>SOsnYu8`2 z8a3nW_@9Pd41Uyzk-!*5B<#Ik5B1>W@|ZZMDRWNiF+~a3sPo6RE;)v8NN@L|a@b3X z#zZc~E`(Eat4|yo`f`2)bibG=>dK*i@m)bNtN(h|t2Ba~jW+r@6hV%?6|~wkDmwIv z`+;rnn2&WJqk@?(c`*;1*6_$UGc6i68?WTrSzrRM$*?q)sjYDoLZneQWh_tc**8b# zP0gzT4+DU2Ud#(Q`5(m92Uyb9Jit`5!xIgvgbIN-l%0GJOtjTO498^)khr#aGYe%|R;v<+g5X z$OqBVaOs$%&M*ZhGmgh$6nYGlN6?9+dJMug zXr;!Scf`57%ur*KbVoZBTE6Dxx$*WpMwVuW8SqKPtA5kpY!9YiZ;vdliCjZx)6>Bl z1iax9)Y-0^umoz=eesF>ihv3YgxSYq(}mx8h3(YZvD_2?nN1IAMPOB6r3LTtKFL)+ zcVfjC2#HIwDj#)nivO1yoZflIA@slG;AIIP;OUietT7}jvSbE#c5-}Qq}+{vR?@0I z?@Ij`YBiTiOQ}D6xA2w5jbkW4=jaYsw zjwXH((xFcAE_F5aDh?SD|4-1hFTU;xjGC<@NolYYB=0~w>H7hz}9DlWJ4E3}@ z5?5zgo$l9E)Se!@f`Ht?UFuD1^mR10cmBL^pVu(&Inzf+qp#MTIApq?>|q_Jk9XSV z%M`+0>#x#DU++Q@xzw~#mDl~Vr9D9E_;}_V0Gk)=&d`hSxJ!6aA<)=gaqaa1n6O2c3GnF+b{#HI6A0eoNe>o zZO7$vbF@3JbL?NP1hkj@(-5CM%>rk}S4^6)eK${S67y^Y20{j9UR4+rVKRfHN4kEi z#ZCk>5J=h1aknlg%J}8u@PtysROE1}9yO#I^{E<&9jWY@zVC|b!!#M$LjFtLW5s{U zpu?e;m)iaHlV`cnNV(iu&j}j(Ljv#dcb$VDE=nsWEDljbIkz@wMElM;{Banbo39e# zkEgktaP%Q2#8iW0J0`8Fq+;L-+&euXX1jTzMMFhu(?zBKP0bz_BR3rOUd?irH+;@) z`;sjc|3OR?N;K#Ra2A0iiEiw|%R#N8yktF?+Oiq`HNcw)m=nyNkeH;`{xDUw-x)C* z@MFf5xbt|E+a+7NpX-5>K3H0F=3p$!_BpdnL7-#O}I+T!O5Nz%P@5TRefG52|HB8O!_v^mZ~PsR{2^|mV&PA zYOIl!ofT-&G)=@Yt6yW6&Ion9-w)^R@}S4I&UDcsxh~UK@7Fv}^OEtyahzYr%6(4f ztT!hJ0noVcWb1XNkm*h8vyy-v1$3Y;3sK87(t!pjWOiC{Upj7e{7#y>tlIU;r}U*g zu$Kk8E-QT~rwjmwEOA@!>hkH6R@<@16~&sj6y>eegsKeDu7jOk3A$8T@0BVu2d-~C zANICTJ!YX|o}uyG=uMg{3rcI8X!vm00SL2bsy>dIksp4T)AyBB6hL^3-?Sd3R&kyV zSUYlf?Fr#2ex}$G5k{GxjH3Zm&pSx7yzyQ59xN&OIInkMbCzJD0FPY(wq1KbAUmyo zOEazZ6POjCq@JoULRs`2U&32IM;zB-z0rz6GLPnV@%BpoSUJirU6v#!{2?G4#v!^& z_-&=MPTcFV=^bETBlEZhB$GhwdBU-GUF(8fKnI8ro`CEt7Kh<>M`-<{*v z(!%2rP;_|*s=Dx0=_+eH-&`TC0<0&EB)3VcNRkgws}Z`m6bpH^@nZ#cxZl$9TBoY( z+ER^*+G&KAh`K(lf7|Xp^Wio`UDlzy$L`*z!*=+1)6jjtQZV$k$b(o%8N=}H?DRyx zdn?BAi=3#S;76qh(8uWd)PC^3Q%(sLb$SM?ker;H2`8Fq49i4SRgv}fwq>B^TiE*u z7-IXGBh$NEKM7Pg4bI7Lo$D>@Lv#&1SG!}&s~q4Whh6I^IISF?aq(yD#0~d8ZQtHr z2NrJ06KJRg4KcAgejsw~k!C-^Z62LmToIk>r>L=%>hF7A-Xz$)PZKtG`PMBy?O8nCp9GFWv=8_k|Y2Iotz+n|<)0IJP3U1g@PgVzYDstP4& zA02}zkmn@AxTqZgxM4+pPJP=jnb%`5@zQT>@@kRGmC9@5;wwBCnZH6YRHd5VJ6t%H zTcD|5A>>%}(L^@S%9WP_tMsTEhgZcu(>L(qhBS1`$jP_>sLHYU2v@vU<2HFdeigB@ zXmoHyfazyhsB=9*g>I0SAV8acqebROk>6Up zPLmk)Adu@lP35{)MiUy#e|e5%Iy|e|@0Qm}Y=dJ81&2I2ytueS5}EY)JOVw4-=j3y z#o+QQ_l3N4X1^6n9(}7VBs6sT6|3G2sPgQFtE#Wk*M6U#t2@%#hpJ7mK4jBiA(5w3 z{eee!FGpnY0G2+tRhh1$RG+M|gff(@ap?I?2alf()rVX^_B#V1EiIv>_N&poNk{Y! zMBY31J~)RX%*Ua|8w>}nFZmLZqBKHEOD9w0&r5xpN%v1gF8kY)sM;8Vw(VNzXZ?ot zZMs*3M2wJqT%Evm*^Ve|r-L>&Hhvcs3L`cH7P{LrG>6<^J5hE_U@JX8(^;)-`}5)` zeu+dgzt2-w=H?oKJm5q+PgW|EieNA-;r6ukWS>S$J2kgjT-$knyKlF(>C46Bf+1Zr zH`kTzeSHW|C_Q>Bh|&CO9&GB-s_Bm^K<^(jZne${AUCHqji_gKEE4BSrni=aS_?4%;n(76QW^^gJz|Z}OXp_Uy{u^v4 zNi-ItTPv*cR{jb5@94E^F*vB&#k_g1HUVC@^O_Cp7GTq9{^*Y%`8kWYshFDC+u^bX zz6Vwf?1}pHxvyAP-VLL136)1JWjD-iS$o@C0l*i%ENN-jgc^oZ&&}9ee16qu85?Df z$159e;l1+2l_LJ$IBYyK1dg27WBnZ(CT-vQL9VvZI0X^!2A10#Hr{Zo0k)?r@wVrs z*wpSrN6rnihZTpU&A}JE(XUnV`Z-O$Q(*;=^48J>nY8)*e?}8DnP|FqmR@uEsTLOQ zUeenjP7H#rbeQ@;()_CEi7z4dX_ACryYX@}x`4u!(JXLT69M877rGOof|QRc5EEw! z#9?%qA&p;@BiB_5SgPflnSbR~LgV>yH8;4>SfN8xy2a7`hN9xafraV@h&oV^S{Y)X zb*aPZ%MQX;nS3DVY};c)j@frg9Iy7=YSBX+LnL}RS)DdViR8aO-?rhG9tM*;?6$-D zSA9!D912bzJCE6~EM5Gq!PFxQHz#*av2bgx0P*MA{NQtfG+7&%L|MJNWNHG|>H@O_XI=jw( z>&sKndJ=dV|MIbn%fV%99Di#wr1R^PJYX_?QDPd9$ZG6;eiA>R87kEchkY7DgyW*U zGCQ$n_T#luh`(ZcJUhYj#}Kf7Oo5GUWVw=T6tk+mQPkSLiKd}s_v%6WkH4wK| zr;?A+_$0VKpkC@GUMXgqTiSzZw+l*=cbuQip+EeSb1Y2C-q~uA&ISA1X=kI?QYnRa zv1^lfd(FlRyq55uStN{CbH$P#kIj|#)eZ7GV4i@@#1^+JC?=f}9FuWEq;X&AnSsw0 zcieE9@Pj;LKORkrJagR^)^dSJNd~mqLwC2TTnTq*L&FE_!!~YV+)@bk4$|lM%>bEM zAZDNts3CHQ+8b9#UGMZe48I!`HkTd<5=`tWVRjM%lHC zy|pMg4nb{pP31QOd8dyVcHQ!p>~HC_uoiV#k!sYNq;qB~K zCgriFxI*BsHS!7g{H%Td8A;FARl6p|*SkgkPnfmNg9fGP>Db+-_ZR|;z}Jl0?SS_% zw3{Q9?&@}Ljg5qx+eA@4`&<166kN~I<8k9Pj?w}XHFlkpS$3r-q1okEkpKg>UGeItkU7Wa4-_~z{PRhZ7_eE7D93~SPt z##p3*=qEqx>n_`E51Ehu>U3TZHN)TOdFyGRSy{tGJ5xqC((X!5rhqv9Z=?Qg%=6v9 z4*?YQzem3Ro8=eW?td%RLO^sH{rl$s9X|ie#Q;F8kacR@?>4~ zV;AU-&$ASNHeKfE!FpsJtw@b*nKrca_QSwD{xjwwatb)2cv>Q`d0Q(f8sw$qH%Te|C?7Z5FD^cmG`HJMQazw_cwKw~R}h8z5)m;shgjIdw+Wh`U}F zy zHf5^K!+sO59mcOD@n9x`@;}$>^6sUtUTF_f z&uGmVb*uv^24F2rAE^0d$tZCEC?^#sHzkS&BO8TZNq;*3m%CtnM4i+MXzP2%29kP0Mh?O8hynA|$$a_LD(dQ7 zw5uM6I?$`+iNQn{v$3bz6;-j8F}3x8KJnQe85O;w&O9mwa5CW_KAN!9ew;;%Pdy;Z z^=Y;Bib85$e8W^)oCLa+Le@oRDSkC7Frv7#wnWA+VsLc5(F9HvXA|g^L75Q={CqW7 zMm=gA@=3UkKZpFKtL2J;fd~H5r1{dY*=fiIYCxNc2H5S@YYiB!kZR?x&=syU)>Kd0 zfs+fT9988GeRvESGWM9nz*|8n;X+I?-cKh?tEv+zHSzR&TZ7ivt!`UccYgg zauN*X>?)H+>^lr5;*H1x}eTt!B$LfNg)+Mn1`ne^ev zBe#k8oZVD;IqH9gS>y zmYzaDPq6yy+KhW~ySJ-TZp~=4AbD-v29w`DeV-oSA5vt2q6(OpR`YgacpwE8(NwZv z6p!!-P@A|4f@8X8AKMg9+H%!OTZxir;mc0JZC42W`0Vkx$VxG1CGCLZr1pq2L;=gM zC17*~^{94;csjzxP08GgUOR<~-&X#sRZcum&Dw-I8(hBY9~L0e6uc7-lYVky`&_(( zqK(;C!Jy$4VzzPM_)hZC!44z>D{k4oY1kD{T5hd@zSmTui?n1GqF#0e{9?%fwKfo| zrR;K9XmA_Z0qX_X2{aj{UY<4F6TRM)*YT3US zk|Zv6drzq;2y+Y0kAD;I1P4>E@WW=WAoIwxwYDi`)p@4uD|P@QGVY7k5%yHrFo92#QxKWCBP_6H&lK0B8bIf{`2g1Q<@I zCx@HV$gXZVrDW5l-$Wh{YOa!dd${q6D`V~Td_pRJ=Y03R30yiJ?ru~;_lte`KHXA6 z%Jp!evaET?#L(EJe)L5gp_bnmldK62(ziWhIH;Idm97>=H5cjZ%%VueQ@8H+dLxy3 z!kNZ1Y$DbbVnAnm0!SJdfFb;0!GbmP42`x!s zq0oVh>Yc0f>tAB!%J1NCyRgJfYA_s7jL`M?vXH4gt!^srfK`+c%>2Iy>FHxfV49t% zO`;}g#970X>G<>Ms!kgcVi$=H>5T}bMfex7X#biTIY5pmV@@T6nEX%L^(yQbrex)x z1KOprirbQUc%MU{i9?=lWoyLap%dYIkv1p|vSJJ6jpve(PwN9Y0cl(Zk_G;F`>cxu zdxoDT!r5HwmMi2Tmt%Bqvo4fj7umuB&0mGC#^sOSE^J=F#gW+xh&+GP$Dr6bW(%mbuIVIOeNYf7TeR#00F%q~GYK z1fG~uSKcG$SUlSgvyvnyl`SL;WCbr@hJG&av(D=2-|HI5(Ya9wwz^dx(2E$CrhSdt zU@flQR>KgsgxjOXd`pvE>Ws<_5&Osbf>0>$3mAY)1)Pk16)-pbb5On9G=vSJ3_c7O z3Y@A?c_UV3b?tJf4U5`x&}$%CzFqDR$4?7<-uFZgzUE!rkk8@oAl&5z>(3=G5LJpk zgUyUYy*&xW>|c8Yw0}+mSYhMt4%$R1$VCgZ5yt6_*6=|?Opq}4;hggdV4BWDq;KcaicEX%RK<}1p-12(f2NR zn1la}!tuC|%6DC0OXUv1E=C{_c!*azPNA}8CwoPDct%fV)pDqQ_5+}$(GMK7{Uq2l7FOt^56?>x_N5gXz#Qth%(b$SWbJs!^V!|{P^|4;1FCT>gDu0WhKZKc zdx$*$OVzG|z=`9WQT>EyXRrc6m#|qiRU#Q>w;)^n!IhNJKV1#k$r&8 z{Y68QhBa;Kk-JVr=x;$sXawHX zoO#*7n`G!sWc~Tq+AyX7fJ_U`0k>*8F*>y<2@4i-VM&~55_k0rwL1EV@5@Sa;F5WM zv?m?x&G{Q|heTR%Q;CvBEtMZ+g@8cY3-N=b5>~^`@@m&O9)W_w%7y*!6<02)wQM)0UJ3`Be%(m7tglHp7(;>{Q_uG8U_4+`_)>{nHPfmCBL%8FD{p5 zblZN$ozWpf%oQ*;D#h)^rO=1;6f7a?%uF4-O34<$eH1}-wBJK_lZ?Gw+3?nIoN;*N zYPV`o%F^n)L8KeG35}@5m==>+$07H$eo&W_PZhniZFKER6QKh1Le=*l^I67;tRYj;^ms2bnvhFp>cX0i&GNO{sJEpyJ$>(DJ`Au%+Zigvb zu3ev{tC@AVJD>HQ2an1x%BeDMYrL9L8-aH{ z2)g!D&wznWzS|T6Q|MR^^LY;y<>L$Zt*4t@uh&P+mw_^HXgqtZ+tFi~5c#Ya-Y?m_ z!#rYWIs)%^5GX|j8$yvqIe^E#@3yy=8{X5zcga-6>UcF*!nHQdCw1Cu7Gq%Wls;fw zf<8I7;}B#vyGCWdEO&5}*k-rYBoSCtM(H`0d|!C>P>=s0OSi^@<9D%qD?9^4XtV9& zzS#n%H{6mB8a!Hm4LwCQW*8{V(PwN=m-AuF@|4SUJNb!_=sxpscK0*8FEHIVRPjEBHK)sFGTKf3yBrJPgc*P+Idv$}u)7X1aoyF51+vn?ZiGWWbfB1ut zku=`jw10DTc4fFEi-&T3~>%Ih^#;yXRDV7GS^Q&@h1&}T^IL~{} zHxt^9nat8atFzN%zI*VP_k=>UI#sN3_2MvPiw?42H*#lZ5dj-V@nnuP2`-z+y>54q z&Z8;elTgbY$hrIF>SxS`D0ehwi#rStRKTH&@n(_|@ zW2QBKUo%ym*o{Y>zD^BNN(~wYn{XW7HlpvXYwSLSVUg?u4YQ9g)Jx&QoPGwiv`K`5 z?kn~ds=4q6ZPK=N)J?}OJXGHE59hJ%LAw!-2d!VwF7Vy7o)QSBaQ|9h#^05m;#) zBQX$@msE#W15}i0Nc7oxq36uho!KI0pRP_aO_JtrO}u!2866`Q8h5soLeZ^ngwRZi zLE&;Z3Vytei=z@%_&$T4w_cq`)b@A((AeeDa;19_VyKI$)F-?2DYE)9jr*#$0&2ZH zrF;g5>23=ndFq2{-`iz*Q>nE1We{dpECE5Y4`j3DRAl*JI*31=fnH$LQ7dW})>EFK zAUb-DTey>99Etb9lw4X_e92QQWLv|;AXi_o^3?CN%_EA+yl0KCg<#cP(>9|8ooeDl zX^zn%M@3WSaqV?;gh{&(^inK&Zt~&hU?<<*l^A}u&IbF8&IggX0TM*_>?hB+C$-3A zQm|Vlc>b#2da}pZMeYYKy9b)M*NTqrmj!-J#SC8+GmCa^(f9(8felxJQbpYAQr88> z3Erl)uPTZ^$z#jNT9fzH*!vH180Izx$bRz-X6}X$5V*F#tY)pM2hTO_KHP;LY^yk1 zx!8z@3*~yb?r{vEmApp+w`NzOQ`~fXG>^&Lda1Ff8fwP8+RxNDl|I&v#LvsHk}0~V z9HLme^i9JaPOeaLade&1BPN_kC zTy=NW+efaO$MUNF%Y2Q=Na&`b?{+IaeLD1OdwxTO$kNw2t|tWw^R@Q0&_jmYE>Dh^ zV{qz06+^bp?AhZchu8G(*Y;iM@SGBu8iJg=(ZJuSCQE78mC`z>6p0A?^X11*G^z_$ zt^%bxI(G(4JjU%#xf5S+v_UUjgNBOwJoc=}7l*S^mZ6K9WsX{*S6}zWu6$LdKV`qY zT6Ax~F zPus6A-aZ!smY?^Kq%eC5FK)Ab9!gCCgq=`yR?JhJULzu(#w{e5D7%whpEQcsR6h8O zK9Qx27{e5V!fyNN@i;3@P2dm+?+~H4|!jmGlp?t#Ty5A_Z1N?3xh~@CdAWP9|u^Oo+Lw) ztNlKxn)DsSuTO^mEn=X<01XixN8z3xQ@<+0E!y<`RF5;0-foJi&$%ah#SuDze3lz# z2Py4farDw=C!)#y=B!Agl7QNYBJRkO27Ys@_jCMe?XlkeY0gCc&=PGW5&X|-4>#Zq zdSC)|6Y>Vraa4}WZl$g09{rE(<(RW!`RB`fy=6TH=~qRm z$@h3tRIoE>a)*+TCVA>Sr?gUDR5;JKIIGLEFR#W7@7s#lbl2M~het+`$SraQwr?yz2FOw+KsBF%GKWdW2=;RbX zWTEk@#4A`ZAv?F&`MiJJ8xTPsq*TgG{2s2_CTS^=vlD~AY#x}uoT@e-GWd+{Kj_FL z+uXvVoK#SQ)vq?1I34GE8*a2C-gjk8Tr4)Sqzy_T_o3wg)zqQIyQ7q_6P<7v16dV< z-NWTxO1%qTq`<3#;PhpPgHdGIcy)F}O>U=SOOnkc%Q3dK2mMr|6y5y%K&K~bZF`?d zW3C z>vL!C&-YpwUxCyMFtTt8)O&RHoX-}Ug~=-i;)%?at7+)#vCyx)s2+a5FuG2++j1O5 zNgES*Jpj2S@jxLwpWDa8V7T$QxSpyoGxx2&$HrLUU04-Rb+BJJ(O-TE(6%Hk+Y}`? z)i^m!63uLhO6L)Htro9JiuYzdY9bcbW8exF2N3qtYYvzA^s%Q$V#xhwWXm8{<6Dci z2nAP+viSa8!&wmI(buXXI8@UU_0#E1Ci&oZx#2q>S7UzWW*4Wq{4c>T=1OFXFr*`+ z!GgdseuPR7Xa%(4`nTceC4$zX?v}#=qsknRu~lN6GTIO1oT8L+>*$9e6!{51H`xin z`Fc8ZXnsDG`y^WVR5yBP50a5YJQ|v6vG2XBxV6=fCF|cAFK~?xPo`^<5#b5~c0oSz zuxBS+NhVz=_jF5;gpv_Hbhh;)De{z*T@21hNSy$IO4%P1@FsVqbb zTU`(j=0zl*i&W=(jOKUHiK_!SISW{I7&Ne!P=uy(etAY$*zj%k?+9SrRMWO)M07GM z{#;DA#;+DnejHI@ z#1Na7J=J=R6Eeh*GgRYt`OC6JtJ|}*zxCb0hs+DCprWlhF1-g=1d+-A8AheLJ79$w z+^u`iogOsK2r>tL++DXxIpLJn)={q5fMM!I?QtEH66}x(Q2*!w)>h%E+5a1>F12!k-)~^I=^V!8ysGroe-9-x!)tso zXizf-TcMlopOP&XrUKRZH23{iXJKV+1x=-DTDf3=$x`!gAYboeRn}H1Q-Sf_<>yu= zgce~X$OuMiG*k7AYHA(9%Fg65xZGp)cD_={N@-cbK8kjfbRe(OJ+t(=J^Om+237#j zUVhQ8cjLFZ-a&ox!*M+xMU3O-Z>-wlyRoJ|9HTijrGvaNnwrQZcJ_9XTR)DwlEw1Fw!T;gwt;5>twsvo7 zxVux_-HI14?(Py?iaTlX;_mM5uEk4mcPQ?`-M;jB_Oti*o_C+K@=ua0*SfOiTr%eP z-S-&db?0yyMe>eu53r(U&dEG0?hkcdQ5`%VQ)T$!Mo-dQ9zjX8mV1LVUxw6ik7D0L zeI|$64EnxQ&B7H9C+c~92CR=1{R0}NFCRCAV3@J_?mcVJR_MtF%9i42_l|R9K2Yq} z4QxHUyl_)NT6$(Cem&5G&K>G>-c3?)qe@w&ksq}8eWfe}A>jW9;*KcHQrP)=HJIM} zsU;;^fQh0WFMM1*5!Q)p<%4@^6>g z+=!#56b&9P#gvXej_VMZOqWhE9DObE$I4@C^d|02e_4G}yRgR#p*!9F-kc&-An?#9 z?cwC&_tf*gDIY61w#@9edV%lLVvKs$$Y`@oyq?g@#-PDzYP0D$^*S+?ptohyX}8m5 zt6Ij(&{C{|EYQ>d$?MWT4Vpl$ay7gDwvr&^>uQS+9X#vq^YiC6F2x3ah;4;{c*tLHBR9VM|G*&lNHx8mOy&l}aTJ*>N5 z8#zuNmac2;X|{2?+A+OAK8ZfoSXT17tIc(T&CR6DDg0Y2x$JdOg{zgY-BSfCatwBh zmLGvS%9agYh|MuA@_w->7g2Ho)kfo-UwyLx6x(R9#m=Dt=I?x6pP+vpNIiaIkQeB<{1 z>@GM%8{x?P8g|8eSN6%F#VG?DMUn?C%vVN$Loh%s=})})v7vkf5$bc^H-h%xKNCe| zc)9nsbgO2dbI59h~_a-w}`p=u$D^;Wh-} zKW-?_#qm8Bhs__ipVQ-n9Bt0CrH+!ci_S4lHOTMOy){@&Xm=1F*Dh47`|AWh56bHH z?qwlmg_;Qt+n(~6K>^w`=^$*4cUVg}JKNEr7|70m>$Ym(>fWV}-JLmU0HBLba&hM3 z;~8l+__y;u5Z?f)ELKUduTHM&%ziD3mC&>FFvDx zC1%dudsmVpc3lePnP5%lYaeZpq40@66=!!FG4QvYM7&u}H6E3z^qsP%P;FrqwM54u z@v?U4*ps10e!0XiLZ-H0*7Hj9si-U{W>-hSYiW)A^T__!Hu3XYv(Zoa-vuOpe=*_w z{mWm|1(gat4!K`zX1;?u448-$0>+!p%Ub$brcr=(1sG!g0e5e#N{KjXyPR(o8=*Mf zqyo(}c7Wx@wTLiv9@lzR4`pmn91Oqdd4I~=L?CTJbQaD?6MDQ~c_m->Ge;beU~RWf zNlkNM3urx~Gt(WbW+no>_;F3n45_a-a>?lePU#<1OCRpqh3$22`;yn5s>%9uMVDZp z1H?Z%>NTiNRUhT2rzp%0$7;|dUG@)`GwR5oBfS=65@O_ihh1+bT7a&)51InaRe=Vq zbJY)b6cZphy3_#f@PFrg5QME(2w8o@kTd-7ZYwidRI~d71ao4HGEn$yxrNFlTk{*ekHAnOS#mi*r7s5{ z1nJ5^9sjD5liH!?kR+0fzA@h0vRV5I$Y4(PNhsIW!^1gOkJ`>$(Td+ay)yeWjU*~< zhco)Ad_H+O5DkwueJOPZaM%&8dLh@p>-AwyzEdw1W zlt_C%J`k}&KLM#6%Kn`d^hf@hMqnZ`905~FcCCKeb0w&aG zCvI*FOay}rJ{&5){s=9zKUwT+%5u^FK%!;TN9UaKHH zvrZY}wbfCrQ>}Y3CVPY5L;j{*~)#ub35=x*`U{kK2y9$$VP5>w=XxhdZYCk8IwdxY-rB^L_$Du#gcGwCa5@GZnYSH9Q zy?85m8HnQSS-I|!D%0BCAmX~OE0QrQ)o{;SSbb=b?byISAR4hX>+m<`r4Nr@kG3D8 zkhyYp$Z>t1TbX?15a(KV|1?4KUr1$1>|bNs>>|PCt#Xi}oXUpJZeMmv=3cBqKG~j7 zYeQ2CcC~Tys{6L9+}@ z!};yAi~YF_F)+b+9}%{Pfncr&@5Q^1Z;6wsHE8@0f=|n@lwc)3k_?UKU5#feeU(5U zj!iO9!_LUE7ZY)4a)e_vxA;(q;bmj)%gn6X_gQut=YmE zRsqX)Y=Rn7cC?{W*!*jOxt>Tc2`$y; z-DN=agh{&L@A7^SzL!T7*=eUr=J(F0sNA=_&y@x+_OeJs*gfC0f8tg*WjA}=eG*4| zVwXhdk}t|k^p_@AV@8<(z0Tx*#Pn#j53TIZeh^Ss1rv4EgA{R%r20w1vojfA%ula?kxACQk?xp75?AJSqJ1Oi>RpE>; zX`gx8oC~Jdoyeyg3{E=*RtR;P-Y-2TZ4bL*GPDOe!<+ob(l0yvx)*v|SG<5HI%E2y z=E+DZ4>6vG8K>9#?p3@ldYh4QbEErXIINm&-6RDxooHZl8@pA+s&l)30~h?grdDxV zz;_y?`$%MkTv@UeI4K3y6kQ_~PA%g?m??J-dqz>6&|1UbNb`l?Sb-O?Ngz7DG~be; zO~}#Ada1nqEPCzmyuE~wZ(3A}xCA=lcG3};9v&aviW=KdZ zAc14@epXQfE{`LLEm;7aAC+}wUdS>MLSuCZ2{{F36zw3(oB{EGAXm3XAE+wILH?Qk z&5eq5C2`V{Qg7FT28nmV&Nl;;-a%0W?3y9!JHd_%GDR{N5*I#4S6GNy0(8l!hOmPv z>~tZd!!u?{NEkz=n46%3gPKdi4-!r*%&kER9`nqaxB z5)Miz4vRknii8k@{+D*^RgxY(aPSI&d-Ws9AMuuKR+js2Xs4XwGWh#@<;Dkzi^X^t zIhPjU85zHoPIKaD6L`27U1qNyx8V0j9X~cB)ke{GYI#8XU?Vm>2zO^5B&tWJ(cHl9CFQb4xxABN;U`6i1~0^mVQ` ze)9w3Mtx=F@N&i>1KN8N*&yW&fHv2cZ*A9 zff9;=9(qZYB%>Z$H708hh}U^7Ry4{vA{=b~XslN7Qeq|3%1AOcyr*L#-Mg&BlH(w2 zp>K;hThN}{SI7$Y($$4D+8H%39Yhy7PJ+i&?}2|c`N~`%7=VrZMb46Iou5=t@SasT z>=z3T`JH7VUJ0fpDn%4HN% z2-9*?(6M6Sp1msAy+OIo2VP0XEXbKc6tIPF|G=zo)R#dH|3fo+*pJ3U8uJn~L!VMg zRW6{4*|97AG4Gid(DXElftX(p_Qid)KuS<_>0V^t;G%c7I(!-fw7=6E5xgqnc$ai6xcaQ7BQ?(eZIJZX2(6$q4QR^}6 zzbi_}5}!%YD8wfv{8!glKyKhBk25My&3P^WUV;; z3aj{}773OS6$r!ND*Pn}hIEr1#u*e7lTEKK*j2Wts)BO@*6j6uAfKc75T$>OY_bzl zz!wt&_q+;M){iy{^U`dj8+Iwwv2s1TZ+8lenb|zytb33dvHgXJdviHn^#vJ7gdxaZ z{y616_LEa63f5SQakv!sm@6-F9Ims$S>1F$B$B*|{;{jYG2OhyokN^de)3e_@YLJd z%=tEIZaaAF!5h*|UTDZpz;kr)q_)eKuXHpy$AEvIm8Up}Z^&-03WNFatiOCPLjt6@ zyZvv-rxzF}sRA7!L}84|?9=j^NUMh)<{3DiN>3N(KY8pg7$&%zNzhpMxr@3fZ)96uA##IhYi1YmT=90n6k52&^_ zS955aJ`O>@rI^{3rtj;oDdd!k*=f4$S+>s({ug>>9Iv#*l;jf0AfjY`2t^4r7a zkLs9e8!0WFhTOJ4kxaV|tSd`9!R_&E8Oud7>~O+c=uLyXBN=(L8SC-8il7x9N2*M% ztO38*#0PpQ|2F-(D30A;Z$$JuNx`5a&G&|QXPdSf-$nX;Bq64{x5as?6JDT|c=zhF z%o==zek=8QJP*6Ywv2F~Wak|xkAfrty!}hd=GRW($k)0ss{#gVV+#!60S4De-a8aE z3N6n|*%i5baTv=$fAMJ=KLEmC|!@Ru)u{fYOHy zx$!?CxLy^}H`?l)UviMBGyZvi@kh=0WWMX+q3BVF^L~irLB=L-ZoTRS7NGcC&T{2C z;cSoD4&Itl`+7W8+7^Yx3aKjBf0k4Rz2y{-<3;brEuO8UUZ$SG8fv-ze0xffs6mgj z-Cc1EqR^9n5H7zaC#Z7k->+?D%as&8d}zp7sR)R+aSE2-O&Jkvev5GyjQqZl(SCY!&w7aDV$aG$n#@V+9|{FdjAe+C-WU2 zsm8j1u3;2$xN2aT$owck_(W*r%QU1VYP8sUIfJ_sitC4zI?1dAOG~3yA#UI2g&z$; z6Na2(eIV~`>Y&1tbJkHNHoYxHKw@WOVm5tQ_{^^)N?(9Ml<>tipyF1qO_HqAH*2_c znK>^eUlv^by}k*H(al@2-dBHc@{jA{4EHb(BREiVrC|^1w@3b%f1B!LgXm-Fr?V~{ zX)&+ck?*}y{i+yhIjpamJ(ebEtOD;IBW+7QRX@sZs9cEFFVY5vxJA1$+FLto&0AB{ zwEMS5`^CdV2GwS_XO9tonF0%q{i>&$kJ%zRu^zV!%55tM@p6(9zhj@~(^c+u{g=OT zn8DOaT!L$J?T5kjMtVLu$q?Ph{M^^PBSk=r)ADDE=QIK;jRj|XdNI0+xYPTO5LS3f zj&e*tnLSJ|CMKL7Iz|JbQd5x>ZG7eE#JM!eieJ6{gfZW!&w~DAlfd2G;3gLr^vkul zydx9GO9Ly$*U+5biXKi38&to{X3TnhFPs z><%f)cSQ>NUoyzRb!QR3c15t~`>A)I6Qq)aycT=6bq}YTPTOd~&l}rwmG43E^(hxd z;WU<~k;{?tcj8AEb+ca}sYUMv!lp!WL41Pp0wrqmP9&kZuX_^(Z<}y-!x5b~96Q<& zQ)cBf1GLG-xg-Ngw*BR(+o18Qage{a4}KTud=d7@nOl>ys)K=u&3*jr zdeWC*(xM)F?Ef!p6NL8+88oP$OblYuhCR{x0#7_@j~lGdJ#uR!y+CCB_?Ya5L8bpe zJ_r^6fimX=|A8|9PiLLUw}<7nqHzjrpRJS=cyUW6IwhYIWnhE=DSq6D~^hBsXtlLoi_DFFRvNLBo? z_`!yUK?>w8ENXJsW7K%qp~1LY2_^yVYqL4<3@^a z&JZUHPV^fId_20p{iFg{*0ed_39~*$pouVHBwg9F^M}f=spr=vnAX*yu^4X9hj(P1 zb{4$T`E&9^Xmm0Wi&EQolpw|9z1AXI0eA38{c`j%RuKj={ z@zLm;Q;+Ptk$m<&l@%1WQB7Aet==-SIY&lW9h~}NWbl`w?y0*M1}2NQkmb@G!9a#i zKO*tUY~9kK5w1}6{O{B&_}|=?P535=#D^rggdzTmrN#M_VNrcUI#A+>=bb`l}s{lr9dvnrm%*MQ2k z7h&HqhW90`9<-r#u-Y-67bAKuJE1j@T-*V`5Uw4`Y{5$Z2_fMxuTKXNb&Z%TNjsXV zyg})z!GkWRMu+uU4MfWRW+6H{cWhmeyMn&MNTa1@MHwPA+kyt26Av9vSNOBG zmKouJBLo9z9nyK+xSxRlmJH2Gcs(Y-6cYAtX#<5^+l=pj`*u7!S1DBr0Iz=~)~g(O zEg2Y;`B~E``wv#UK=x53c8P9ZSQzRnzG~wxNBK|iUMPneuTtuLZz1>luZ|!PMtS#7 zXN;#iw($nzs#bT1yXrR3eQ4o*MX6Pi7Moqt-0y?>PMixjWLCNmheu-v2GV34`Tf)3 zJtDQIfm+p)i?Rjc9UH3Cx1frbD0 zp706K*(iImf}Q#SucN#MERS?ro%jveEqC)tXFh!JzRbnV?~^P2Nc1-fPvRNgMMYITBzVPh*@e&(j*Cn3-&fIUbt3PV3iCtx11>$YB zW+O!|pPegOh75x(b1j%aR3kb7irmE(S@%&}ElF2)WV*zQ&QvBnlE9>nC$Wxy`<7A= z{_!o1T+~7TWn0odDbLD1r}hMd=9aT{r}GB_XF>>=5NwD>cGcDy!<+zKpKMbPI&%d! z2#yK)RBB7vr^`~}4pw5w>SaYNdk~u_l^AFduw)K@-2u3sDROk(41baGoBf}knLo~9ri_~EYZp;QFD0L@oZX=lMO~xvEVTgevmjG4uH?G`uGm#aRiO=8fgWmAfY!6IHjX$U!IAVgc@{mackPRRJ4rmbBVU9oLJ;^C*wE`x17!n zm1b_lWC@$QF5!6p$@qhGnN;kXB|KrA(h|xtCD0;nlB~>IlCpMKIP{p(g2XJm6j&EA zTzGrWJ}MZ5eB@?Bd?~_Wllo*iEC@g4(2i>c$QV0FjACy6b?G!C^^HJO<%~{i3 zMF|$bVb1^u6z1Lp)x@5#r8ZhZB{IQC{+S|rDyt9lscu(nO$+*5Y#boxkSgv5@adF5 z$^!w)wZ>(5{B<3!JC2aV2IEc**|bSda!e_I&Nph>2@B|luT){Se*MPipL!uSWn;wj z?|xRPye@9WmZKeUaJQwdv-8YOtDg5ws72UAsk_5$(8N^Pl?kaNv2Qi}MwEm+bV)1N zFxB}%vg3yDjmUOou*~l+(M~PqoA>cov2mbdg|!8b@Ju*_bS)bf&*|pU^7BR`71c^1 zl!DgiZ%8pu*m(E}b449&O_|9Z$w_Mf8mYhy}GgF03#HvKEIqBVDusg?|j}`|s zNG)lpYL-m7r@ zVj;r`J7&h!ZwOZpkUZym6Mz#1<`{8-_q)iz4FGw_v3T5lkO)#P7_bIRALDo`yI5%2u1?CJE7bVPji9cJdp+4Efl@X(=SPohO+lg3y4ftZ(p#;NDFpNb=`&W4w$%uG?vY)H4tw%*Ih) zYRPS(c0QO7Gq+`Q7ie_Pl5KJ=8oAo~p=%`bZ^VIh8ad4UkfO0{k*@?T9WV5jbtKsS zHidts#W))mi_at^m7!*@TYkFM`{YID0>B54y(YpNSkqU0?^J+@wFw?84!;vyr9>37 z`~`$(rctCq0|(?&m&&f?OD!|7PHzdZat9;+Og)2y0h&T6X_r#GdDPs}J>XM2{aRkwEV`Nqi$EG$dF)(9R}Uo^m~&Ndkde`)pP_Dy>tVV$EUe|rLZ zDGh~M{k^5nerq?a=BF8qUZt7EIBrf{IhnbYqCB;twFH23&MolBS8TW?8C=M$ax*~2m9nIKTO%o z3V9k^V9sllEXK(QrCjHdDs5_kA2?yuQdD>LoGk*|c0=BL@=N`Z7(FQ`|?(fdOAClNML$C$?#PyU0@~<{PpOSPQw*1y$0in$Ya-SPIUl zJ8Bf%-6)7(E+whd^m5Y;{OOMYk(y*FuT}-iBV=Tdt?wRiI5eBWi&Ik4a;+M5GIIfc z+FfQ~WK?xhVS5WD9E@bwfoVFMO{-_!vh8&fNlutFIrI%La?oO1Q*t!D8*Lt_1O9&| zy2K%5q`yscu?nJ>(7hx@9D=K2LUQ8L07x-WnXy0~=HuPk0Hu1GA>G_}a`(rGKTFRR zrTVk7drAcK3^tNy(-KQ`9o1DhW%N$a(f>9CuJYvSa!IDV;6@$CRxsWATn7nQ4%qkL zy1go`7i7x1`|Ypeo3os^RMqaOKmSXN;y3|Ch~BH6z?fD%8}_Sqm#A}uQ7ayD&I^Wh zy5#&Xf1tk*B!38DUDf-(U>yVFFd|QVhjuX?^Var0pa>rRxZj_J$WNy?Bh}CgaOJu) z?+wv9bboc-ScIKK3W&i;L?aX`;?W|r7PF`6sRKW7TOh)n$n)ggF%B8^5A2W@;biobDhq+i)d2OU^jJkEa5G=F_!{1R|x7um8HF)kJ zsjxocWNn^aKXq})53x5$$vq1xKjrHrElCTA%=iHHN@r1NI##sMx zLIpb9o)#~fgmTerjKq?3><5QX@4*}l(TN`?!4L7t@)~WvyGBbs2Zl;orIA4A7X*Jj z>SSb#E#B?x`_bBABCvAS4}iIvor%HzgvshU|2w~8 zYqcS0^ZHR|GTNiREVJo}l~Q{uH|&z(pcpAhk^*ma)HZ(Ecv$5V<=k!W7t54A{2i)*3I|aYHtzp zw*sk_m0#4oCyxx)4mVv$)+@KFepqt57m0esCa|C;l6H&&fVj<|fd7&I;6+y3%LB=sV zr;s!??Ez`xOJMY;M?jd1t>*-6p8WjN+wp<4bZ49f$*pmAIkf7BU6{P%izn7=p-^KkY)&k!G%OuZZcPP7+PQFsYO+mV3a!mj6bo?iAE z9Am`D${DJZpK+!!!hiRn1`(8)KLm(FJ1!gN!h{|CGHPnR!>|&lWJR@I!Ygz#0CqPW zRz3APYUFW-i1Ur9u1_>Fq<{n8X4@8yuM}6KRML-}qePuq+iiw!-~7sI>--qx07PRc zu$*@_C@y&{;Z2`g#bhny2)DDOq;C@Bq+Au+eHMz0f4LamWm`;oF6tVex4vKRAc$|? zYwCI#8sNJ5q#Q){iG8a=UwnE@?&RU)*qdVgo{s98ar$19e#Qk=nUoZMw-&cDiaf|< z#0I12*e~R(m5fj)26I<7%H~kEav|>Mt2PT)v75PYfIg1C+=Q&|wucW-4>~I<)Qi*Tj0E1i z1Qa-ARcfVd@>2pB^`S@C9r{+_NJUydw+v+`r!<3I}l8^waO|ON%ZAlh5yw2J>*O&Je8U1YPVVCGTnL%)<9KWhi&FhNtKB8W25c z^)n>py#VgxunO=cmCYA}V~j!uiOHw|t4@oz2)sJ}gA9wE<2T|x1~}~vZG9HV{W9LZ zhkZr@r=Bz7&at~>U`r{V|Aa?H(5Hyw_SX{y^7 zih|O7<=rXO51=qO13@lt3!043=pOX$)QqNEb*({D*(?&lgMp<)9;U(8q&Wit-%kR& zp)sas+!bH&%`7qF9J{K0BR+PmmnttK0828Txb?#`miqmpVnPp7NqoDm7dbPgA4yJv zYqLb&pTi>P2+(?peN8_W_zj!&~v{W)&nelDDsh$~31XxiDY*;Dj*&NMSG%_>CUM?1JI37sf za$Np3X;iaXvutWY0(^a#Pcn)RzO0ko^)6G}Yn%Rsbi8PBN45-CPa&Zv}L1BtX{=~09m$8%02!^XZsNGAhh8p1B2=TtF6|YLo_KZGkg04X(=8|<6}Sh`&EfnJn?IwA zGJ>W_Cv2GC?HceF8oovQ^<9@lCJsKv1LvWf#T^U^8(OIQ({Z~PVhmB}kXnEr6Fr?%Jk?iZ_Eu!yx^H>Ln2K#$@X!=pB2oqBf)cBj#DxRR|Rpm#iO z`|s6Bw8TO!NU6MhDV1GYW>Pit#4g?;Dj$QAg6pEd2<<1Z#Y?|S)hn}0k9AhMF=814 zK!_=p#puN+_5;ECqC53P{}o)k-f8*B=hz?}dsx%Ha36BcO6Mb;xIu;FR`)I{z^=|X z^rD3D5&?mJT1UyZ83S$3-oy~MNYy3_N59PrGUL|0l^>G=bQjPgLUtMZq$g#j;rm2ynS%Tyml9SRnWD zggNXEi+h!TMurWk_NI1l0VaC5wfg8YQJfNUrlBse=k+WC4SY6F>X->9ix7{lw5x5q zj)NRAll-5_q{x2=uyVW?@}Ts1NkI#)SK!ZTW|>-4s=*26$b6Rh2#+L#RL%#Fd4urW z(t|*`mqWh-Zgz_&Qq?^A(Q?F|Q(m4vIQrqSIOjEFY}(dfGh3av6gl#d3o#Q=@|9iB z2onY0&Nm zesLHnw3pvTG(bOxs+ch9A+1lT6(%^eEP+=BCYs|H-7p9QDm(2Aum-m)YcZI}CG>s1 zy|@+u%#vaCY}OJnuejiX>~tGrM{jm>t&{*B;tho6?)UC<`Z+H2fyMU-?YI&p*(>PE z!e8$?BP#D=X{Lw$RblBt^rfbsrkBUlCL`_CYbs!<^wzek)w<)!B@beb2a)$w@LyDW z>M@akEm0LIIY+rq6}^4vo~xv1cT5L6?#DZWagV0IVt%sXU<(yB?R=!qq4+WMYYAOV z9tTOvCb@5VM=YyYB6_=LEu&O|f;@!g%21wOaQ;nHhOgz=6@C;pBbkKKNPll+nV6Nd zd#=Usg?*H6yD$B%wtOdIldClhQUo^ff-i%D8JPp1`$q;0ohaliX&OmGh0c(-PRXSn zg(*l}e;7#&JYu3@i!@LAn5( znqMu^GR&n7CWAzQWzkUj`Iq!Y`Q6`+q%J>2PV750+z)N#W{=Tf=pvMBZ3c851RTc#C$MIM2V7lu>jzfWCE2`W&(~s)b*#& zjk6p^s12Em+Ku23$+7XIbm$- zW;#vRy$axa9xCpaK)jW42wCPJ$u2jaZHz-RFsXAjT(@-RLD%-jB{!4Z`pQuW(Fa-n zSQ$GvOXCG$yKJVtjd!O4c&c<5fhXP7{SmA!Hla!drD?QO)|~Tj6Bbug{=|}BI<)O) z(iGlemR=HlMFsilLKGybm8_fZD>Z15U=#G$yJL48lM;lFAh974uAR-jSSd(rt1J3`5(lNqX;# zD7SvDyp4X^7u7CKOJ;TiklPQ_m}>b!;tesF zPLLClxedD!79FTs=IlHVF7U=z{+)eocqe&*Hfd|LDjB}{mX(d8XAm2tubVhkiCy+J z)|zEQJ0gFjr!$;9-#$Id&@zHdfv`vHZpG7YRpM}iK1{18f5AEc%{;p%*#xNDT} zYs$|~VdqN+%26rug4;Mm>@0$i{mL(g1BO(3k(ep?JuF!jE_Ok+X(ISZTfzJGvlY-> zAT__jdxaesMxRhmXPtwHLIh4({EYCA9=i?^@>OK0c`;(T1OPbDRnXEfPjk>`ej1uX zn~H?z=JaiEt(ZoxLD>iX4;QsUtNar#p0CoEIbTnh2MaEhdsUEsMV8U7KEPaDT;7Hm z`Z#&b9!j=Yc1zfPShm!&GjjQT7aV+^Ml$7+dOtogSqkGILLESA031ASVHG-DW9^J_ z@tmBl<5nDaei$s%WAMVenz~=t=e4)v`Je+M*XjOvJrz$%s*7QHd^z+Zin`=@om-Tx zrwj&p+hA?wpcWt`?)3P>hj`?junP~IeZhxn1KtMD)L7~IL;e$imJMa%MkyT7$}Oj- zrvsjHMq)Ng3xh1P8iC&NyN}5&B+{CET8YS(&+pm&NpyvndevqVI6bF4Xa+m>gDTVS z!@*PZGslC0%8UB^%*b&PC1Gtt_tUCE{?eNggx$r-)9f++dUo`Qdj%;WiFS_4ahiIU z1|gyA_3Wjst~7G)5>~V!-1<9|Y#+Zfyl1V3FN55RTX#_BTzaX^@_vxFQ6>@}v@$o@ zsPDC+M;)|AC6JllvF4R|)4FsRF`k}PB~s&Wj}m0CRNdHbuIF9|VKp2J!;C%Jou1p<%Yh9LI zmAs@D#0N&AmV2ptY3v24p1XB&xX)ru=7yP5arlhHl+fIC>}*>vN3==iTFwLUbQiqt z?wIBW%_tYUEC-GbfP&XwGV4N?FYD^62E6Q2S=?Xy>SQFWbsi<`r5Blr80>eKE>*h( zu7UNs*Q-J&`}d3@w~uKzPQAj!je2ei`Ra!q9=cTGMdl7EA?oFvE$Zb&SM=K=!p|IN zlXr*wi;1_foFq8Xmshvf6qq8y31jIT;Y6s1Ubm{w!&|jo!zi5Q1(BpA*Qtmx?=$Et zp5HZjSxR0CCBz7sPmc1HJn`LV2HxMM3QGkIoFL{6SMZ3A`f#0&BJ}nl`EZjloES2- zJWq&-Kc8s;*$)*ixhDY61K2`*m3NCZSggAaMu5H?f(p&<$&0MkDm|Rv)vGwf2G^6j zh)Vm>+#0spJUlG_A(~jN zzwJzZE)}qAFIUxL=NiTflmnNm4K~j+eLlO4dA?Fv#(|*Cw08 zp3G5Rkd_|V9db6)J{G~0u1prXE5|(#GuJ7cCwYUV^2j#->}+LO+9F^`vc9!CfotX_MRIe6xI7*b z@6)6+qg1$Ue{g?q)(Ki{Wr!!@1N$?t0}FrwthWp|ZCQpTl?Xf-jR5+8-RH zVZ%f=-cxoo+ia!&aF9;~;(}ft@)n$aZ}0JXs3_rAU4{(3Yj%rFXK-tJrb6NrK|-G@ z3loa#4kO~=;hg%MOX&NI5&R`j*~r*+f0YsmndnFnu(z5mn_kyt45*# z$7m6shO+=aR&YzSoi6-*u#ibJO4o~X6str#Dw_M{m_|RNB{yrhUK$;ys3LEMc2vl`@gF21xzXimnlCMwq)c4zxMe(SaJ0L~EK_|bcKX3!HV~Kh|`Iy}tXcuL}+!b4dSeVMB!_PV0=4*|ehti(4@HCfkvpCvloaV$0ouhN@yx^jT=O7$IHOVM-Ri^i zVG`b{&iD0Z-rHOugG-%Iw$<>wzkJo1mM+i04 zZ-k^vA9&CLKq#ux7xA*cHyZ90spob(ZD+B6dTJO?jtVOOWW5Y}vdS3#K&;Vv7r?33 zozbtQr_mnk7{;R8p~+&Owm(~6Nsmp*I``5hUc6Y-R6O2?45QJ9pFhR;h=9^h(Z_|U zt}@rnCt28Uqfcn%A>re3J!Owc>50x-!fiW}Q#4?A|7i($Oqj5G}3)k>;l`OZ1io%T%?}xOzY1pa% zZ+p*wy&~~@wvg{y;F7xe(zQFjeg0tog75XzETswFrl&%9@3Qs0lzw!6)p^172Let@ zM{|^xy86C8fBjak_o8z3klw>{r+S9&v$_Ak;IwUvQK!r4uiqcD|5|)iY3Ww(lz>+m zdlm$+v8wh+t&GUaaG(C`jB>Wxtv|xoX5DRhW><9G@U)=HmT&vltm&WheO}tGD;tm2 zu<72nP-atHw|3^Yi>jtfZ_YfPG5gG}u&}VesI?}CrhX_}{c-W!XhRV%d84)Gi@si6 zUUvF{=%)Uhn;GKnl1q#J9FodgX{_M!*G28*+nN8LeY*7E7GKLw;ahg|m{-_*@R`5y z$SvhhSDUS8T3bEL{{DXc@+D4&)jU&e}i9e zD)&~G)BA6|U7+h`wlja-N!y0<+(U9VojZ&FSM9zoC%*g8wY15ZbDa--ef#?3rT>CK z>YCc?n${U)M0FdOb>Dow^2gPWuXv9?y&&4Q_)q-yV709qwzyom<0&2**A;7TzRcnN zKR$-cC4!vhm)QiXG}TkMB+g+wel zrl{^991{1zf3@6w>j|6EUw@5FlF&RDSSRry$}`e)^ZUK-Tg?~mtK0mzw6gkCUC(0P z?rR%fyi(N8S7}?(w1-pVl**5OgIedqx=c6LeNi{}2|E0J2ZG7Sb z6B~+>=P%fCslhp1g5knCzgD-_1uoA;rEA}-?XgO@E|d2@{=Bmu6 zwb0nk#W$Vm0YUB!u9$Ppm>$3CRJeIt<-dDGIYI{9O>in`$Pf{f6_>CF=<9Vf9 t+a9|8nRr{j=kflptFK*?y}vd$@?2>`Oj%mm' ) +let g:minimap_update = + \ get( g:, 'minimap_update', 'mu' ) +let g:minimap_close = + \ get( g:, 'minimap_close', 'mc' ) +let g:minimap_toggle = + \ get( g:, 'minimap_toggle', 'mt' ) + +execute "nnoremap " . " " . + \ g:minimap_show . " :Minimap" +execute "nnoremap " . " " . + \ g:minimap_update . " :MinimapUpdate" +execute "nnoremap " . " " . + \ g:minimap_close . " :MinimapClose" +execute "nnoremap " . " " . + \ g:minimap_toggle . " :MinimapToggle" From 6f466ade5dc7c86979c70402e2d10b6d7a7a6287 Mon Sep 17 00:00:00 2001 From: huhuaishun Date: Fri, 4 Nov 2016 14:40:02 +0800 Subject: [PATCH 09/22] add vim-vue --- sources_non_forked/vim-vue | 1 + 1 file changed, 1 insertion(+) create mode 160000 sources_non_forked/vim-vue diff --git a/sources_non_forked/vim-vue b/sources_non_forked/vim-vue new file mode 160000 index 00000000..f3c29bdb --- /dev/null +++ b/sources_non_forked/vim-vue @@ -0,0 +1 @@ +Subproject commit f3c29bdbc947b8e505c667696cde3ffd02505296 From 7f9ab057bad787780aa2e09f82727ba4df307620 Mon Sep 17 00:00:00 2001 From: huhuaishun Date: Mon, 27 Mar 2017 15:44:07 +0800 Subject: [PATCH 10/22] add cocoa.vim & swift.vim --- my_configs.vim | 2 +- sources_non_forked/cocoa.vim/README.markdown | 24 + .../cocoa.vim/after/syntax/cocoa_keywords.vim | 28 + .../cocoa.vim/after/syntax/objc_enhanced.vim | 59 + .../cocoa.vim/autoload/objc/cocoacomplete.vim | 215 ++ .../cocoa.vim/autoload/objc/man.vim | 185 ++ .../autoload/objc/method_builder.vim | 124 + .../cocoa.vim/autoload/objc/method_list.vim | 115 + .../cocoa.vim/autoload/objc/pum_snippet.vim | 87 + sources_non_forked/cocoa.vim/doc/cocoa.txt | 154 + .../ftplugin/objc_cocoa_mappings.vim | 85 + .../cocoa.vim/lib/cocoa_indexes/classes.txt | 990 ++++++ .../cocoa.vim/lib/cocoa_indexes/constants.txt | 2678 +++++++++++++++++ .../cocoa.vim/lib/cocoa_indexes/functions.txt | 399 +++ .../lib/cocoa_indexes/methods.txt.gz | Bin 0 -> 82161 bytes .../lib/cocoa_indexes/notifications.txt | 298 ++ .../cocoa.vim/lib/cocoa_indexes/types.txt | 457 +++ .../cocoa.vim/lib/extras/README-if-you-like | 2 + .../cocoa.vim/lib/extras/build_syntaxfile.py | 94 + .../cocoa.vim/lib/extras/cocoa_classes.py | 64 + .../cocoa.vim/lib/extras/cocoa_definitions.py | 100 + .../lib/extras/cocoa_definitions.pyc | Bin 0 -> 5478 bytes .../lib/extras/cocoa_indexes/classes.txt | 990 ++++++ .../lib/extras/cocoa_indexes/constants.txt | 2678 +++++++++++++++++ .../lib/extras/cocoa_indexes/functions.txt | 399 +++ .../lib/extras/cocoa_indexes/methods.txt.gz | Bin 0 -> 82161 bytes .../extras/cocoa_indexes/notifications.txt | 298 ++ .../lib/extras/cocoa_indexes/types.txt | 457 +++ .../cocoa.vim/lib/extras/cocoa_methods.py | 63 + .../cocoa.vim/lib/extras/superclasses | Bin 0 -> 17116 bytes .../cocoa.vim/lib/extras/superclasses.m | 47 + .../cocoa.vim/lib/get_methods.sh | 4 + sources_non_forked/cocoa.vim/plugin/cocoa.vim | 16 + sources_non_forked/swift.vim/LICENSE | 6 + sources_non_forked/swift.vim/README.md | 37 + .../swift.vim/ale_linters/swift/swiftlint.vim | 48 + .../swift.vim/ale_linters/swift/swiftpm.vim | 60 + sources_non_forked/swift.vim/ctags/swift.cnf | 9 + .../example/MainViewController.swift | 124 + .../swift.vim/example/URL.swift | 11 + .../swift.vim/example/example.swift | 361 +++ .../swift.vim/ftdetect/swift.vim | 12 + .../swift.vim/ftplugin/swift.vim | 4 + sources_non_forked/swift.vim/indent/swift.vim | 238 ++ sources_non_forked/swift.vim/plugin/swift.vim | 14 + .../swift.vim/screenshots/screen.png | Bin 0 -> 16168 bytes .../swift.vim/screenshots/screen2.png | Bin 0 -> 11732 bytes .../swift.vim/screenshots/screen3.png | Bin 0 -> 107422 bytes sources_non_forked/swift.vim/syntax/swift.vim | 290 ++ .../syntax_checkers/swift/swiftlint.vim | 45 + .../syntax_checkers/swift/swiftpm.vim | 44 + vimrcs/extended.vim | 2 +- 52 files changed, 12415 insertions(+), 2 deletions(-) create mode 100644 sources_non_forked/cocoa.vim/README.markdown create mode 100644 sources_non_forked/cocoa.vim/after/syntax/cocoa_keywords.vim create mode 100644 sources_non_forked/cocoa.vim/after/syntax/objc_enhanced.vim create mode 100644 sources_non_forked/cocoa.vim/autoload/objc/cocoacomplete.vim create mode 100644 sources_non_forked/cocoa.vim/autoload/objc/man.vim create mode 100644 sources_non_forked/cocoa.vim/autoload/objc/method_builder.vim create mode 100644 sources_non_forked/cocoa.vim/autoload/objc/method_list.vim create mode 100644 sources_non_forked/cocoa.vim/autoload/objc/pum_snippet.vim create mode 100644 sources_non_forked/cocoa.vim/doc/cocoa.txt create mode 100644 sources_non_forked/cocoa.vim/ftplugin/objc_cocoa_mappings.vim create mode 100644 sources_non_forked/cocoa.vim/lib/cocoa_indexes/classes.txt create mode 100644 sources_non_forked/cocoa.vim/lib/cocoa_indexes/constants.txt create mode 100644 sources_non_forked/cocoa.vim/lib/cocoa_indexes/functions.txt create mode 100644 sources_non_forked/cocoa.vim/lib/cocoa_indexes/methods.txt.gz create mode 100644 sources_non_forked/cocoa.vim/lib/cocoa_indexes/notifications.txt create mode 100644 sources_non_forked/cocoa.vim/lib/cocoa_indexes/types.txt create mode 100644 sources_non_forked/cocoa.vim/lib/extras/README-if-you-like create mode 100755 sources_non_forked/cocoa.vim/lib/extras/build_syntaxfile.py create mode 100755 sources_non_forked/cocoa.vim/lib/extras/cocoa_classes.py create mode 100755 sources_non_forked/cocoa.vim/lib/extras/cocoa_definitions.py create mode 100644 sources_non_forked/cocoa.vim/lib/extras/cocoa_definitions.pyc create mode 100644 sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/classes.txt create mode 100644 sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/constants.txt create mode 100644 sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/functions.txt create mode 100644 sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/methods.txt.gz create mode 100644 sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/notifications.txt create mode 100644 sources_non_forked/cocoa.vim/lib/extras/cocoa_indexes/types.txt create mode 100755 sources_non_forked/cocoa.vim/lib/extras/cocoa_methods.py create mode 100755 sources_non_forked/cocoa.vim/lib/extras/superclasses create mode 100644 sources_non_forked/cocoa.vim/lib/extras/superclasses.m create mode 100755 sources_non_forked/cocoa.vim/lib/get_methods.sh create mode 100644 sources_non_forked/cocoa.vim/plugin/cocoa.vim create mode 100644 sources_non_forked/swift.vim/LICENSE create mode 100644 sources_non_forked/swift.vim/README.md create mode 100644 sources_non_forked/swift.vim/ale_linters/swift/swiftlint.vim create mode 100644 sources_non_forked/swift.vim/ale_linters/swift/swiftpm.vim create mode 100644 sources_non_forked/swift.vim/ctags/swift.cnf create mode 100644 sources_non_forked/swift.vim/example/MainViewController.swift create mode 100644 sources_non_forked/swift.vim/example/URL.swift create mode 100644 sources_non_forked/swift.vim/example/example.swift create mode 100644 sources_non_forked/swift.vim/ftdetect/swift.vim create mode 100644 sources_non_forked/swift.vim/ftplugin/swift.vim create mode 100644 sources_non_forked/swift.vim/indent/swift.vim create mode 100644 sources_non_forked/swift.vim/plugin/swift.vim create mode 100644 sources_non_forked/swift.vim/screenshots/screen.png create mode 100644 sources_non_forked/swift.vim/screenshots/screen2.png create mode 100644 sources_non_forked/swift.vim/screenshots/screen3.png create mode 100644 sources_non_forked/swift.vim/syntax/swift.vim create mode 100644 sources_non_forked/swift.vim/syntax_checkers/swift/swiftlint.vim create mode 100644 sources_non_forked/swift.vim/syntax_checkers/swift/swiftpm.vim diff --git a/my_configs.vim b/my_configs.vim index 421011e5..eb79c630 100644 --- a/my_configs.vim +++ b/my_configs.vim @@ -49,5 +49,5 @@ let g:mwDefaultHighlightingNum = 10 let g:jsx_ext_required = 0 " Eslint -let g:syntastic_javascript_checkers = ['eslint'] +" let g:syntastic_javascript_checkers = ['eslint'] diff --git a/sources_non_forked/cocoa.vim/README.markdown b/sources_non_forked/cocoa.vim/README.markdown new file mode 100644 index 00000000..4e1d8d1c --- /dev/null +++ b/sources_non_forked/cocoa.vim/README.markdown @@ -0,0 +1,24 @@ +# cocoa.vim + +Vim plugin for Cocoa/Objective-C development with updated (iOS8.1 and OS X 10.9) code completion and syntax highlighting. + +## Installation + +### With [Vundle](https://github.com/gmarik/vundle) + +``` +Plugin 'kentaroi/cocoa.vim' +``` + +### With [Pathogen](https://github.com/tpope/vim-pathogen) + +``` +cd ~/.vim/bundle +git clone https://github.com/kentaroi/cocoa.vim.git +``` + +## Author + +[cocoa.vim](https://github.com/msanders/cocoa.vim) was developed +by [Michael Sanders](https://github.com/msanders). + diff --git a/sources_non_forked/cocoa.vim/after/syntax/cocoa_keywords.vim b/sources_non_forked/cocoa.vim/after/syntax/cocoa_keywords.vim new file mode 100644 index 00000000..523beb42 --- /dev/null +++ b/sources_non_forked/cocoa.vim/after/syntax/cocoa_keywords.vim @@ -0,0 +1,28 @@ +" Description: Syntax highlighting for the cocoa.vim plugin. +" Adds highlighting for Cocoa keywords (classes, types, etc.). +" Last Generated: November 17, 2014 + +" Cocoa Functions +syn keyword cocoaFunction containedin=objcMessage NSAccessibilityActionDescription NSAccessibilityPostNotification NSAccessibilityPostNotificationWithUserInfo NSAccessibilityRaiseBadArgumentException NSAccessibilityRoleDescription NSAccessibilityRoleDescriptionForUIElement NSAccessibilitySetMayContainProtectedContent NSAccessibilityUnignoredAncestor NSAccessibilityUnignoredChildren NSAccessibilityUnignoredChildrenForOnlyChild NSAccessibilityUnignoredDescendant NSAllHashTableObjects NSAllMapTableKeys NSAllMapTableValues NSAllocateCollectable NSAllocateMemoryPages NSAllocateObject NSApplicationLoad NSApplicationMain NSAvailableWindowDepths NSBeep NSBeginAlertSheet NSBeginCriticalAlertSheet NSBeginInformationalAlertSheet NSBestDepth NSBitsPerPixelFromDepth NSBitsPerSampleFromDepth NSClassFromString NSColorSpaceFromDepth NSCompareHashTables NSCompareMapTables NSContainsRect NSConvertGlyphsToPackedGlyphs NSConvertHostDoubleToSwapped NSConvertHostFloatToSwapped NSConvertSwappedDoubleToHost NSConvertSwappedFloatToHost NSCopyBits NSCopyHashTableWithZone NSCopyMapTableWithZone NSCopyMemoryPages NSCopyObject NSCountFrames NSCountHashTable NSCountMapTable NSCountWindows NSCountWindowsForContext NSCreateFileContentsPboardType NSCreateFilenamePboardType NSCreateHashTable NSCreateHashTableWithZone NSCreateMapTable NSCreateMapTableWithZone NSCreateZone NSDeallocateMemoryPages NSDeallocateObject NSDecimalAdd NSDecimalCompact NSDecimalCompare NSDecimalCopy NSDecimalDivide NSDecimalIsNotANumber NSDecimalMultiply NSDecimalMultiplyByPowerOf10 NSDecimalNormalize NSDecimalPower NSDecimalRound NSDecimalString NSDecimalSubtract NSDecrementExtraRefCountWasZero NSDefaultMallocZone NSDictionaryOfVariableBindings NSDisableScreenUpdates NSDivideRect NSDottedFrameRect NSDrawBitmap NSDrawButton NSDrawColorTiledRects NSDrawDarkBezel NSDrawGrayBezel NSDrawGroove NSDrawLightBezel NSDrawNinePartImage NSDrawThreePartImage NSDrawTiledRects NSDrawWhiteBezel NSDrawWindowBackground NSEdgeInsetsMake NSEnableScreenUpdates NSEndHashTableEnumeration NSEndMapTableEnumeration NSEnumerateHashTable NSEnumerateMapTable NSEqualPoints NSEqualRanges NSEqualRects NSEqualSizes NSEraseRect NSEventMaskFromType NSExtraRefCount NSFileTypeForHFSTypeCode NSFrameAddress NSFrameRect NSFrameRectWithWidth NSFrameRectWithWidthUsingOperation NSFreeHashTable NSFreeMapTable NSFullUserName NSGetAlertPanel NSGetCriticalAlertPanel NSGetFileType NSGetFileTypes NSGetInformationalAlertPanel NSGetSizeAndAlignment NSGetUncaughtExceptionHandler NSGetWindowServerMemory NSHFSTypeCodeFromFileType NSHFSTypeOfFile NSHashGet NSHashInsert NSHashInsertIfAbsent NSHashInsertKnownAbsent NSHashRemove NSHeight NSHighlightRect NSHomeDirectory NSHomeDirectoryForUser NSHostByteOrder NSIncrementExtraRefCount NSInsetRect NSIntegralRect NSIntegralRectWithOptions NSInterfaceStyleForKey NSIntersectionRange NSIntersectionRect NSIntersectsRect NSIsControllerMarker NSIsEmptyRect NSIsFreedObject NSLocationInRange NSLog NSLogPageSize NSLogv NSMakeCollectable NSMakePoint NSMakeRange NSMakeRect NSMakeSize NSMapGet NSMapInsert NSMapInsertIfAbsent NSMapInsertKnownAbsent NSMapMember NSMapRemove NSMaxRange NSMaxX NSMaxY NSMidX NSMidY NSMinX NSMinY NSMouseInRect NSNextHashEnumeratorItem NSNextMapEnumeratorPair NSNumberOfColorComponents NSObjectFromCoder NSOffsetRect NSOpenStepRootDirectory NSPageSize NSPerformService NSPlanarFromDepth NSPointFromCGPoint NSPointFromString NSPointInRect NSPointToCGPoint NSProtocolFromString NSRangeFromString NSReadPixel NSRealMemoryAvailable NSReallocateCollectable NSRecordAllocationEvent NSRectClip NSRectClipList NSRectFill NSRectFillList NSRectFillListUsingOperation NSRectFillListWithColors NSRectFillListWithColorsUsingOperation NSRectFillListWithGrays NSRectFillUsingOperation NSRectFromCGRect NSRectFromString NSRectToCGRect NSRecycleZone NSRegisterServicesProvider NSReleaseAlertPanel NSResetHashTable NSResetMapTable NSReturnAddress NSRoundDownToMultipleOfPageSize NSRoundUpToMultipleOfPageSize NSRunAlertPanel NSRunAlertPanelRelativeToWindow NSRunCriticalAlertPanel NSRunCriticalAlertPanelRelativeToWindow NSRunInformationalAlertPanel NSRunInformationalAlertPanelRelativeToWindow NSSearchPathForDirectoriesInDomains NSSelectorFromString NSSetFocusRingStyle NSSetShowsServicesMenuItem NSSetUncaughtExceptionHandler NSSetZoneName NSShouldRetainWithZone NSShowAnimationEffect NSShowsServicesMenuItem NSSizeFromCGSize NSSizeFromString NSSizeToCGSize NSStringFromCGAffineTransform NSStringFromCGPoint NSStringFromCGRect NSStringFromCGSize NSStringFromCGVector NSStringFromClass NSStringFromHashTable NSStringFromMapTable NSStringFromPoint NSStringFromProtocol NSStringFromRange NSStringFromRect NSStringFromSelector NSStringFromSize NSStringFromUIEdgeInsets NSStringFromUIOffset NSSwapBigDoubleToHost NSSwapBigFloatToHost NSSwapBigIntToHost NSSwapBigLongLongToHost NSSwapBigLongToHost NSSwapBigShortToHost NSSwapDouble NSSwapFloat NSSwapHostDoubleToBig NSSwapHostDoubleToLittle NSSwapHostFloatToBig NSSwapHostFloatToLittle NSSwapHostIntToBig NSSwapHostIntToLittle NSSwapHostLongLongToBig NSSwapHostLongLongToLittle NSSwapHostLongToBig NSSwapHostLongToLittle NSSwapHostShortToBig NSSwapHostShortToLittle NSSwapInt NSSwapLittleDoubleToHost NSSwapLittleFloatToHost NSSwapLittleIntToHost NSSwapLittleLongLongToHost NSSwapLittleLongToHost NSSwapLittleShortToHost NSSwapLong NSSwapLongLong NSSwapShort NSTemporaryDirectory NSTextAlignmentFromCTTextAlignment NSTextAlignmentToCTTextAlignment NSUnionRange NSUnionRect NSUnregisterServicesProvider NSUpdateDynamicServices NSUserName NSValue NSWidth NSWindowList NSWindowListForContext NSZoneCalloc NSZoneFree NSZoneFromPointer NSZoneMalloc NSZoneName NSZoneRealloc NS_AVAILABLE NS_AVAILABLE_IOS NS_AVAILABLE_MAC NS_CALENDAR_DEPRECATED NS_DEPRECATED NS_DEPRECATED_IOS NS_DEPRECATED_MAC UIAccessibilityConvertFrameToScreenCoordinates UIAccessibilityConvertPathToScreenCoordinates UIAccessibilityDarkerSystemColorsEnabled UIAccessibilityIsBoldTextEnabled UIAccessibilityIsClosedCaptioningEnabled UIAccessibilityIsGrayscaleEnabled UIAccessibilityIsGuidedAccessEnabled UIAccessibilityIsInvertColorsEnabled UIAccessibilityIsMonoAudioEnabled UIAccessibilityIsReduceMotionEnabled UIAccessibilityIsReduceTransparencyEnabled UIAccessibilityIsSpeakScreenEnabled UIAccessibilityIsSpeakSelectionEnabled UIAccessibilityIsSwitchControlRunning UIAccessibilityIsVoiceOverRunning UIAccessibilityPostNotification UIAccessibilityRegisterGestureConflictWithZoom UIAccessibilityRequestGuidedAccessSession UIAccessibilityZoomFocusChanged UIApplicationMain UIEdgeInsetsEqualToEdgeInsets UIEdgeInsetsFromString UIEdgeInsetsInsetRect UIEdgeInsetsMake UIGraphicsAddPDFContextDestinationAtPoint UIGraphicsBeginImageContext UIGraphicsBeginImageContextWithOptions UIGraphicsBeginPDFContextToData UIGraphicsBeginPDFContextToFile UIGraphicsBeginPDFPage UIGraphicsBeginPDFPageWithInfo UIGraphicsEndImageContext UIGraphicsEndPDFContext UIGraphicsGetCurrentContext UIGraphicsGetImageFromCurrentImageContext UIGraphicsGetPDFContextBounds UIGraphicsPopContext UIGraphicsPushContext UIGraphicsSetPDFContextDestinationForRect UIGraphicsSetPDFContextURLForRect UIGuidedAccessRestrictionStateForIdentifier UIImageJPEGRepresentation UIImagePNGRepresentation UIImageWriteToSavedPhotosAlbum UIOffsetEqualToOffset UIOffsetFromString UIOffsetMake UIRectClip UIRectFill UIRectFillUsingBlendMode UIRectFrame UIRectFrameUsingBlendMode UISaveVideoAtPathToSavedPhotosAlbum UIVideoAtPathIsCompatibleWithSavedPhotosAlbum NSAssert NSAssert1 NSAssert2 NSAssert3 NSAssert4 NSAssert5 NSCAssert NSCAssert1 NSCAssert2 NSCAssert3 NSCAssert4 NSCAssert5 NSCParameterAssert NSDecimalMaxSize NSDictionaryOfVariableBindings NSGlyphInfoAtIndex NSLocalizedString NSLocalizedStringFromTable NSLocalizedStringFromTableInBundle NSLocalizedStringWithDefaultValue NSParameterAssert NSStackViewSpacingUseDefault NSURLResponseUnknownLength NS_AVAILABLE NS_AVAILABLE_IOS NS_AVAILABLE_IPHONE NS_AVAILABLE_MAC NS_CALENDAR_DEPRECATED NS_CALENDAR_DEPRECATED_MAC NS_CALENDAR_ENUM_DEPRECATED NS_CLASS_AVAILABLE NS_CLASS_AVAILABLE_IOS NS_CLASS_AVAILABLE_MAC NS_CLASS_DEPRECATED NS_CLASS_DEPRECATED_IOS NS_CLASS_DEPRECATED_MAC NS_DEPRECATED NS_DEPRECATED_IOS NS_DEPRECATED_IPHONE NS_DEPRECATED_MAC NS_ENUM NS_ENUM_AVAILABLE NS_ENUM_AVAILABLE_IOS NS_ENUM_AVAILABLE_MAC NS_ENUM_DEPRECATED NS_ENUM_DEPRECATED_IOS NS_ENUM_DEPRECATED_MAC NS_OPTIONS NS_VALUERETURN UIDeviceOrientationIsLandscape UIDeviceOrientationIsPortrait UIDeviceOrientationIsValidInterfaceOrientation UIInterfaceOrientationIsLandscape UIInterfaceOrientationIsPortrait UI_USER_INTERFACE_IDIOM + +" Cocoa Classes +syn keyword cocoaClass containedin=objcMessage NSATSTypesetter NSActionCell NSAffineTransform NSAlert NSAnimation NSAnimationContext NSAppearance NSAppleEventDescriptor NSAppleEventManager NSAppleScript NSApplication NSArchiver NSArray NSArrayController NSAssertionHandler NSAtomicStore NSAtomicStoreCacheNode NSAttributeDescription NSAttributedString NSAutoreleasePool NSBezierPath NSBitmapImageRep NSBlockOperation NSBox NSBrowser NSBrowserCell NSBundle NSButton NSButtonCell NSByteCountFormatter NSCIImageRep NSCache NSCachedImageRep NSCachedURLResponse NSCalendar NSCalendarDate NSCell NSCharacterSet NSClassDescription NSClipView NSCloneCommand NSCloseCommand NSCoder NSCollectionView NSCollectionViewItem NSColor NSColorList NSColorPanel NSColorPicker NSColorSpace NSColorWell NSComboBox NSComboBoxCell NSComparisonPredicate NSCompoundPredicate NSCondition NSConditionLock NSConnection NSConstantString NSControl NSController NSCountCommand NSCountedSet NSCreateCommand NSCursor NSCustomImageRep NSData NSDataDetector NSDate NSDateComponents NSDateFormatter NSDatePicker NSDatePickerCell NSDecimalNumber NSDecimalNumberHandler NSDeleteCommand NSDictionary NSDictionaryController NSDirectoryEnumerator NSDistantObject NSDistantObjectRequest NSDistributedLock NSDistributedNotificationCenter NSDockTile NSDocument NSDocumentController NSDraggingImageComponent NSDraggingItem NSDraggingSession NSDrawer NSEPSImageRep NSEntityDescription NSEntityMapping NSEntityMigrationPolicy NSEnumerator NSError NSEvent NSException NSExistsCommand NSExpression NSExpressionDescription NSFetchRequest NSFetchRequestExpression NSFetchedPropertyDescription NSFileCoordinator NSFileHandle NSFileManager NSFileProviderExtension NSFileSecurity NSFileVersion NSFileWrapper NSFont NSFontCollection NSFontDescriptor NSFontManager NSFontPanel NSFormCell NSFormatter NSGarbageCollector NSGetCommand NSGlyphGenerator NSGlyphInfo NSGradient NSGraphicsContext NSHTTPCookie NSHTTPCookieStorage NSHTTPURLResponse NSHashTable NSHelpManager NSHost NSImage NSImageCell NSImageRep NSImageView NSIncrementalStore NSIncrementalStoreNode NSIndexPath NSIndexSet NSIndexSpecifier NSInputManager NSInputServer NSInputStream NSInvocation NSInvocationOperation NSJSONSerialization NSKeyedArchiver NSKeyedUnarchiver NSLayoutConstraint NSLayoutManager NSLevelIndicator NSLevelIndicatorCell NSLinguisticTagger NSLocale NSLock NSLogicalTest NSMachBootstrapServer NSMachPort NSManagedObject NSManagedObjectContext NSManagedObjectID NSManagedObjectModel NSMapTable NSMappingModel NSMatrix NSMediaLibraryBrowserController NSMenu NSMenuItem NSMenuItemCell NSMenuView NSMergeConflict NSMergePolicy NSMessagePort NSMessagePortNameServer NSMetadataItem NSMetadataQuery NSMetadataQueryAttributeValueTuple NSMetadataQueryResultGroup NSMethodSignature NSMiddleSpecifier NSMigrationManager NSMoveCommand NSMovie NSMovieView NSMutableArray NSMutableAttributedString NSMutableCharacterSet NSMutableData NSMutableDictionary NSMutableFontCollection NSMutableIndexSet NSMutableOrderedSet NSMutableParagraphStyle NSMutableSet NSMutableString NSMutableURLRequest NSNameSpecifier NSNetService NSNetServiceBrowser NSNib NSNibConnector NSNibControlConnector NSNibOutletConnector NSNotification NSNotificationCenter NSNotificationQueue NSNull NSNumber NSNumberFormatter NSObject NSObjectController NSOpenGLContext NSOpenGLLayer NSOpenGLPixelBuffer NSOpenGLPixelFormat NSOpenGLView NSOpenPanel NSOperation NSOperationQueue NSOrderedSet NSOrthography NSOutlineView NSOutputStream NSPDFImageRep NSPDFInfo NSPDFPanel NSPICTImageRep NSPageController NSPageLayout NSPanel NSParagraphStyle NSPasteboard NSPasteboardItem NSPathCell NSPathComponentCell NSPathControl NSPersistentDocument NSPersistentStore NSPersistentStoreCoordinator NSPersistentStoreRequest NSPipe NSPointerArray NSPointerFunctions NSPopUpButton NSPopUpButtonCell NSPopover NSPort NSPortCoder NSPortMessage NSPortNameServer NSPositionalSpecifier NSPredicate NSPredicateEditor NSPredicateEditorRowTemplate NSPreferencePane NSPrintInfo NSPrintOperation NSPrintPanel NSPrinter NSProcessInfo NSProgress NSProgressIndicator NSPropertyDescription NSPropertyListSerialization NSPropertyMapping NSPropertySpecifier NSProtocolChecker NSProxy NSPurgeableData NSQuickDrawView NSQuitCommand NSRandomSpecifier NSRangeSpecifier NSRecursiveLock NSRegularExpression NSRelationshipDescription NSRelativeSpecifier NSResponder NSRuleEditor NSRulerMarker NSRulerView NSRunLoop NSRunningApplication NSSaveChangesRequest NSSavePanel NSScanner NSScreen NSScriptClassDescription NSScriptCoercionHandler NSScriptCommand NSScriptCommandDescription NSScriptExecutionContext NSScriptObjectSpecifier NSScriptSuiteRegistry NSScriptWhoseTest NSScrollView NSScroller NSSearchField NSSearchFieldCell NSSecureTextField NSSecureTextFieldCell NSSegmentedCell NSSegmentedControl NSSet NSSetCommand NSShadow NSSharingService NSSharingServicePicker NSSimpleCString NSSimpleHorizontalTypesetter NSSlider NSSliderCell NSSocketPort NSSocketPortNameServer NSSortDescriptor NSSound NSSpecifierTest NSSpeechRecognizer NSSpeechSynthesizer NSSpellChecker NSSpellServer NSSplitView NSStackView NSStatusBar NSStatusItem NSStepper NSStepperCell NSStream NSString NSStringDrawingContext NSTabView NSTabViewItem NSTableCellView NSTableColumn NSTableHeaderCell NSTableHeaderView NSTableRowView NSTableView NSTask NSText NSTextAlternatives NSTextAttachment NSTextAttachmentCell NSTextBlock NSTextCheckingResult NSTextContainer NSTextField NSTextFieldCell NSTextFinder NSTextInputContext NSTextList NSTextStorage NSTextTab NSTextTable NSTextTableBlock NSTextView NSThread NSTimeZone NSTimer NSTokenField NSTokenFieldCell NSToolbar NSToolbarItem NSToolbarItemGroup NSTouch NSTrackingArea NSTreeController NSTreeNode NSTypesetter NSURL NSURLAuthenticationChallenge NSURLCache NSURLComponents NSURLConnection NSURLCredential NSURLCredentialStorage NSURLDownload NSURLHandle NSURLProtectionSpace NSURLProtocol NSURLRequest NSURLResponse NSURLSession NSURLSessionConfiguration NSURLSessionDataTask NSURLSessionDownloadTask NSURLSessionTask NSURLSessionUploadTask NSUUID NSUbiquitousKeyValueStore NSUnarchiver NSUndoManager NSUniqueIDSpecifier NSUserAppleScriptTask NSUserAutomatorTask NSUserDefaults NSUserDefaultsController NSUserNotification NSUserNotificationCenter NSUserScriptTask NSUserUnixTask NSValue NSValueTransformer NSView NSViewAnimation NSViewController NSWhoseSpecifier NSWindow NSWindowController NSWorkspace NSXMLDTD NSXMLDTDNode NSXMLDocument NSXMLElement NSXMLNode NSXMLParser NSXPCConnection NSXPCInterface NSXPCListener NSXPCListenerEndpoint UIAcceleration UIAccelerometer UIAccessibilityCustomAction UIAccessibilityElement UIActionSheet UIActivity UIActivityIndicatorView UIActivityItemProvider UIActivityViewController UIAlertAction UIAlertController UIAlertView UIApplication UIAttachmentBehavior UIBarButtonItem UIBarItem UIBezierPath UIBlurEffect UIButton UICollectionReusableView UICollectionView UICollectionViewCell UICollectionViewController UICollectionViewFlowLayout UICollectionViewFlowLayoutInvalidationContext UICollectionViewLayout UICollectionViewLayoutAttributes UICollectionViewLayoutInvalidationContext UICollectionViewTransitionLayout UICollectionViewUpdateItem UICollisionBehavior UIColor UIControl UIDatePicker UIDevice UIDictationPhrase UIDocument UIDocumentInteractionController UIDocumentMenuViewController UIDocumentPickerExtensionViewController UIDocumentPickerViewController UIDynamicAnimator UIDynamicBehavior UIDynamicItemBehavior UIEvent UIFont UIFontDescriptor UIGestureRecognizer UIGravityBehavior UIImage UIImageAsset UIImagePickerController UIImageView UIInputView UIInputViewController UIInterpolatingMotionEffect UIKeyCommand UILabel UILexicon UILexiconEntry UILocalNotification UILocalizedIndexedCollation UILongPressGestureRecognizer UIManagedDocument UIMarkupTextPrintFormatter UIMenuController UIMenuItem UIMotionEffect UIMotionEffectGroup UIMutableUserNotificationAction UIMutableUserNotificationCategory UINavigationBar UINavigationController UINavigationItem UINib UIPageControl UIPageViewController UIPanGestureRecognizer UIPasteboard UIPercentDrivenInteractiveTransition UIPickerView UIPinchGestureRecognizer UIPopoverBackgroundView UIPopoverController UIPopoverPresentationController UIPresentationController UIPrintFormatter UIPrintInfo UIPrintInteractionController UIPrintPageRenderer UIPrintPaper UIPrinter UIPrinterPickerController UIProgressView UIPushBehavior UIReferenceLibraryViewController UIRefreshControl UIResponder UIRotationGestureRecognizer UIScreen UIScreenEdgePanGestureRecognizer UIScreenMode UIScrollView UISearchBar UISearchController UISearchDisplayController UISegmentedControl UISimpleTextPrintFormatter UISlider UISnapBehavior UISplitViewController UIStepper UIStoryboard UIStoryboardPopoverSegue UIStoryboardSegue UISwipeGestureRecognizer UISwitch UITabBar UITabBarController UITabBarItem UITableView UITableViewCell UITableViewController UITableViewHeaderFooterView UITableViewRowAction UITapGestureRecognizer UITextChecker UITextField UITextInputMode UITextInputStringTokenizer UITextPosition UITextRange UITextSelectionRect UITextView UIToolbar UITouch UITraitCollection UIUserNotificationAction UIUserNotificationCategory UIUserNotificationSettings UIVibrancyEffect UIVideoEditorController UIView UIViewController UIViewPrintFormatter UIVisualEffect UIVisualEffectView UIWebView UIWindow + +" Cocoa Protocol Classes +syn keyword cocoaProtocol containedin=objcProtocol NSAlertDelegate NSAnimatablePropertyContainer NSAnimationDelegate NSAppearanceCustomization NSApplicationDelegate NSBrowserDelegate NSCacheDelegate NSChangeSpelling NSCoding NSCollectionViewDelegate NSColorPickingCustom NSColorPickingDefault NSComboBoxCellDataSource NSComboBoxDataSource NSComboBoxDelegate NSConnectionDelegate NSControlTextEditingDelegate NSCopying NSDatePickerCellDelegate NSDecimalNumberBehaviors NSDiscardableContent NSDockTilePlugIn NSDraggingDestination NSDraggingInfo NSDraggingSource NSDrawerDelegate NSFastEnumeration NSFileManagerDelegate NSFilePresenter NSGlyphStorage NSIgnoreMisspelledWords NSImageDelegate NSInputServerMouseTracker NSInputServiceProvider NSKeyedArchiverDelegate NSKeyedUnarchiverDelegate NSLayoutManagerDelegate NSLocking NSMachPortDelegate NSMatrixDelegate NSMenuDelegate NSMenuItem NSMetadataQueryDelegate NSMutableCopying NSNetServiceBrowserDelegate NSNetServiceDelegate NSOpenSavePanelDelegate NSOutlineViewDataSource NSOutlineViewDelegate NSPageControllerDelegate NSPasteboardItemDataProvider NSPasteboardReading NSPasteboardWriting NSPathCellDelegate NSPathControlDelegate NSPersistentStoreCoordinatorSyncing NSPopoverDelegate NSPortDelegate NSPrintPanelAccessorizing NSRuleEditorDelegate NSSecureCoding NSServicesMenuRequestor NSSharingServiceDelegate NSSharingServicePickerDelegate NSSoundDelegate NSSpeechRecognizerDelegate NSSpeechSynthesizerDelegate NSSpellServerDelegate NSSplitViewDelegate NSStackViewDelegate NSStreamDelegate NSTabViewDelegate NSTableViewDataSource NSTableViewDelegate NSTextAttachmentCell NSTextAttachmentContainer NSTextDelegate NSTextFieldDelegate NSTextFinderBarContainer NSTextFinderClient NSTextInput NSTextInputClient NSTextLayoutOrientationProvider NSTextStorageDelegate NSTextViewDelegate NSTokenFieldCellDelegate NSTokenFieldDelegate NSToolbarDelegate NSToolbarItemValidations NSURLAuthenticationChallengeSender NSURLConnectionDataDelegate NSURLConnectionDelegate NSURLConnectionDownloadDelegate NSURLDownloadDelegate NSURLHandleClient NSURLProtocolClient NSURLSessionDataDelegate NSURLSessionDelegate NSURLSessionDownloadDelegate NSURLSessionTaskDelegate NSUserInterfaceItemIdentification NSUserInterfaceItemSearching NSUserInterfaceValidations NSUserNotificationCenterDelegate NSValidatedToobarItem NSValidatedUserInterfaceItem NSWindowDelegate NSWindowRestoration NSXMLParserDelegate NSXPCListenerDelegate NSXPCProxyCreating UIAccelerometerDelegate UIAccessibilityIdentification UIAccessibilityReadingContent UIActionSheetDelegate UIActivityItemSource UIAdaptivePresentationControllerDelegate UIAlertViewDelegate UIAppearance UIAppearanceContainer UIApplicationDelegate UIBarPositioning UIBarPositioningDelegate UICollectionViewDataSource UICollectionViewDelegate UICollectionViewDelegateFlowLayout UICollisionBehaviorDelegate UIContentContainer UICoordinateSpace UIDataSourceModelAssociation UIDocumentInteractionControllerDelegate UIDocumentMenuDelegate UIDocumentPickerDelegate UIDynamicAnimatorDelegate UIDynamicItem UIGestureRecognizerDelegate UIGuidedAccessRestrictionDelegate UIImagePickerControllerDelegate UIInputViewAudioFeedback UIKeyInput UILayoutSupport UINavigationBarDelegate UINavigationControllerDelegate UIObjectRestoration UIPageViewControllerDataSource UIPageViewControllerDelegate UIPickerViewAccessibilityDelegate UIPickerViewDataSource UIPickerViewDelegate UIPopoverBackgroundViewMethods UIPopoverControllerDelegate UIPopoverPresentationControllerDelegate UIPrintInteractionControllerDelegate UIPrinterPickerControllerDelegate UIScrollViewAccessibilityDelegate UIScrollViewDelegate UISearchBarDelegate UISearchControllerDelegate UISearchDisplayDelegate UISearchResultsUpdating UISplitViewControllerDelegate UIStateRestoring UITabBarControllerDelegate UITabBarDelegate UITableViewDataSource UITableViewDelegate UITextDocumentProxy UITextFieldDelegate UITextInput UITextInputDelegate UITextInputTokenizer UITextInputTraits UITextSelecting UITextViewDelegate UIToolbarDelegate UITraitEnvironment UIVideoEditorControllerDelegate UIViewControllerAnimatedTransitioning UIViewControllerContextTransitioning UIViewControllerInteractiveTransitioning UIViewControllerRestoration UIViewControllerTransitionCoordinator UIViewControllerTransitionCoordinatorContext UIViewControllerTransitioningDelegate UIWebViewDelegate + +" Cocoa Types +syn keyword cocoaType containedin=objcMessage CGFloat NSAccessibilityPriorityLevel NSActivityOptions NSAlertStyle NSAlignmentOptions NSAnimationBlockingMode NSAnimationCurve NSAnimationEffect NSAnimationProgress NSAppleEventManagerSuspensionID NSApplicationActivationOptions NSApplicationActivationPolicy NSApplicationDelegateReply NSApplicationOcclusionState NSApplicationPresentationOptions NSApplicationPrintReply NSApplicationTerminateReply NSAttributeType NSAttributedStringEnumerationOptions NSBackgroundStyle NSBackingStoreType NSBezelStyle NSBezierPathElement NSBinarySearchingOptions NSBitmapFormat NSBitmapImageFileType NSBorderType NSBoxType NSBrowserColumnResizingType NSBrowserDropOperation NSButtonType NSByteCountFormatterCountStyle NSByteCountFormatterUnits NSCalculationError NSCalendarOptions NSCalendarUnit NSCellAttribute NSCellImagePosition NSCellStateValue NSCellType NSCharacterCollection NSCollectionViewDropOperation NSColorPanelMode NSColorRenderingIntent NSColorSpaceModel NSComparisonPredicateModifier NSComparisonPredicateOptions NSComparisonResult NSCompositingOperation NSCompoundPredicateType NSControlCharacterAction NSControlSize NSControlTint NSCorrectionIndicatorType NSCorrectionResponse NSDataReadingOptions NSDataSearchOptions NSDataWritingOptions NSDateFormatterBehavior NSDateFormatterStyle NSDatePickerElementFlags NSDatePickerMode NSDatePickerStyle NSDeleteRule NSDirectoryEnumerationOptions NSDocumentChangeType NSDragOperation NSDraggingContext NSDraggingFormation NSDraggingItemEnumerationOptions NSDrawerState NSEntityMappingType NSEnumerationOptions NSEventGestureAxis NSEventMask NSEventPhase NSEventSwipeTrackingOptions NSEventType NSExpressionType NSFetchRequestResultType NSFileCoordinatorReadingOptions NSFileCoordinatorWritingOptions NSFileManagerItemReplacementOptions NSFileVersionAddingOptions NSFileVersionReplacingOptions NSFileWrapperReadingOptions NSFileWrapperWritingOptions NSFindPanelAction NSFindPanelSubstringMatchType NSFocusRingPlacement NSFocusRingType NSFontAction NSFontCollectionVisibility NSFontFamilyClass NSFontRenderingMode NSFontSymbolicTraits NSFontTraitMask NSGlyph NSGlyphInscription NSGlyphLayoutMode NSGlyphProperty NSGradientDrawingOptions NSGradientType NSHTTPCookieAcceptPolicy NSHashEnumerator NSHashTableOptions NSImageAlignment NSImageCacheMode NSImageFrameStyle NSImageInterpolation NSImageLoadStatus NSImageRepLoadStatus NSImageScaling NSInsertionPosition NSInteger NSJSONReadingOptions NSJSONWritingOptions NSKeyValueChange NSKeyValueObservingOptions NSKeyValueSetMutationKind NSLayoutAttribute NSLayoutConstraintOrientation NSLayoutDirection NSLayoutFormatOptions NSLayoutPriority NSLayoutRelation NSLayoutStatus NSLevelIndicatorStyle NSLineBreakMode NSLineCapStyle NSLineJoinStyle NSLineMovementDirection NSLineSweepDirection NSLinguisticTaggerOptions NSLocaleLanguageDirection NSManagedObjectContextConcurrencyType NSMapEnumerator NSMapTableOptions NSMatchingFlags NSMatchingOptions NSMatrixMode NSMediaLibrary NSMenuProperties NSMergePolicyType NSModalSession NSMultibyteGlyphPacking NSNetServiceOptions NSNetServicesError NSNotificationCoalescing NSNotificationSuspensionBehavior NSNumberFormatterBehavior NSNumberFormatterPadPosition NSNumberFormatterRoundingMode NSNumberFormatterStyle NSOpenGLContextAuxiliary NSOpenGLPixelFormatAttribute NSOpenGLPixelFormatAuxiliary NSOperationQueuePriority NSPDFPanelOptions NSPageControllerTransitionStyle NSPaperOrientation NSPasteboardReadingOptions NSPasteboardWritingOptions NSPathStyle NSPersistentStoreRequestType NSPersistentStoreUbiquitousTransitionType NSPoint NSPointerFunctionsOptions NSPointingDeviceType NSPopUpArrowPosition NSPopoverAppearance NSPopoverBehavior NSPostingStyle NSPredicateOperatorType NSPrintPanelOptions NSPrintRenderingQuality NSPrinterTableStatus NSPrintingOrientation NSPrintingPageOrder NSPrintingPaginationMode NSProgressIndicatorStyle NSProgressIndicatorThickness NSProgressIndicatorThreadInfo NSPropertyListFormat NSPropertyListMutabilityOptions NSPropertyListReadOptions NSPropertyListWriteOptions NSQTMovieLoopMode NSRange NSRect NSRectEdge NSRegularExpressionOptions NSRelativePosition NSRemoteNotificationType NSRequestUserAttentionType NSRoundingMode NSRuleEditorNestingMode NSRuleEditorRowType NSRulerOrientation NSSaveOperationType NSSaveOptions NSScreenAuxiliaryOpaque NSScrollArrowPosition NSScrollElasticity NSScrollViewFindBarPosition NSScrollerArrow NSScrollerKnobStyle NSScrollerPart NSScrollerStyle NSSearchPathDirectory NSSearchPathDomainMask NSSegmentStyle NSSegmentSwitchTracking NSSelectionAffinity NSSelectionDirection NSSelectionGranularity NSSharingContentScope NSSize NSSliderType NSSnapshotEventType NSSocketNativeHandle NSSortOptions NSSpeechBoundary NSSplitViewDividerStyle NSStackViewGravity NSStreamEvent NSStreamStatus NSStringCompareOptions NSStringDrawingOptions NSStringEncoding NSStringEncodingConversionOptions NSStringEnumerationOptions NSSwappedDouble NSSwappedFloat NSTIFFCompression NSTabState NSTabViewType NSTableViewAnimationOptions NSTableViewColumnAutoresizingStyle NSTableViewDraggingDestinationFeedbackStyle NSTableViewDropOperation NSTableViewGridLineStyle NSTableViewRowSizeStyle NSTableViewSelectionHighlightStyle NSTaskTerminationReason NSTestComparisonOperation NSTextAlignment NSTextBlockDimension NSTextBlockLayer NSTextBlockValueType NSTextBlockVerticalAlignment NSTextCheckingType NSTextCheckingTypes NSTextFieldBezelStyle NSTextFinderAction NSTextFinderMatchingType NSTextLayoutOrientation NSTextStorageEditActions NSTextTabType NSTextTableLayoutAlgorithm NSTextWritingDirection NSThreadPrivate NSTickMarkPosition NSTimeInterval NSTimeZoneNameStyle NSTitlePosition NSTokenStyle NSToolTipTag NSToolbarDisplayMode NSToolbarSizeMode NSTouchPhase NSTrackingAreaOptions NSTrackingRectTag NSTypesetterBehavior NSTypesetterControlCharacterAction NSTypesetterGlyphInfo NSUInteger NSURLBookmarkCreationOptions NSURLBookmarkFileCreationOptions NSURLBookmarkResolutionOptions NSURLCacheStoragePolicy NSURLCredentialPersistence NSURLHandleStatus NSURLRequestCachePolicy NSURLRequestNetworkServiceType NSURLSessionAuthChallengeDisposition NSURLSessionResponseDisposition NSURLSessionTaskState NSUnderlineStyle NSUsableScrollerParts NSUserInterfaceLayoutDirection NSUserInterfaceLayoutOrientation NSUserNotificationActivationType NSViewLayerContentsPlacement NSViewLayerContentsRedrawPolicy NSVolumeEnumerationOptions NSWhoseSubelementIdentifier NSWindingRule NSWindowAnimationBehavior NSWindowBackingLocation NSWindowButton NSWindowCollectionBehavior NSWindowDepth NSWindowNumberListOptions NSWindowOcclusionState NSWindowOrderingMode NSWindowSharingType NSWorkspaceIconCreationOptions NSWorkspaceLaunchOptions NSWritingDirection NSXMLDTDNodeKind NSXMLDocumentContentKind NSXMLNodeKind NSXMLParserError NSXMLParserExternalEntityResolvingPolicy NSXPCConnectionOptions NSZone UIAccelerationValue UIAccessibilityNavigationStyle UIAccessibilityNotifications UIAccessibilityScrollDirection UIAccessibilityTraits UIAccessibilityZoomType UIActionSheetStyle UIActivityCategory UIActivityIndicatorViewStyle UIAlertActionStyle UIAlertControllerStyle UIAlertViewStyle UIApplicationState UIAttachmentBehaviorType UIBackgroundFetchResult UIBackgroundRefreshStatus UIBackgroundTaskIdentifier UIBarButtonItemStyle UIBarButtonSystemItem UIBarMetrics UIBarPosition UIBarStyle UIBaselineAdjustment UIBlurEffectStyle UIButtonType UICollectionElementCategory UICollectionUpdateAction UICollectionViewScrollDirection UICollectionViewScrollPosition UICollisionBehaviorMode UIControlContentHorizontalAlignment UIControlContentVerticalAlignment UIControlEvents UIControlState UIDataDetectorTypes UIDatePickerMode UIDeviceBatteryState UIDeviceOrientation UIDocumentChangeKind UIDocumentMenuOrder UIDocumentPickerMode UIDocumentSaveOperation UIDocumentState UIEdgeInsets UIEventSubtype UIEventType UIFontDescriptorClass UIFontDescriptorSymbolicTraits UIGestureRecognizerState UIGuidedAccessRestrictionState UIImageOrientation UIImagePickerControllerCameraCaptureMode UIImagePickerControllerCameraDevice UIImagePickerControllerCameraFlashMode UIImagePickerControllerQualityType UIImagePickerControllerSourceType UIImageRenderingMode UIImageResizingMode UIInputViewStyle UIInterfaceOrientation UIInterfaceOrientationMask UIInterpolatingMotionEffectType UIKeyModifierFlags UIKeyboardAppearance UIKeyboardType UILayoutConstraintAxis UILayoutPriority UILineBreakMode UIMenuControllerArrowDirection UIModalPresentationStyle UIModalTransitionStyle UINavigationControllerOperation UIOffset UIPageViewControllerNavigationDirection UIPageViewControllerNavigationOrientation UIPageViewControllerSpineLocation UIPageViewControllerTransitionStyle UIPopoverArrowDirection UIPrintInfoDuplex UIPrintInfoOrientation UIPrintInfoOutputType UIPrinterJobTypes UIProgressViewStyle UIPushBehaviorMode UIRectCorner UIRectEdge UIRemoteNotificationType UIReturnKeyType UIScreenOverscanCompensation UIScrollViewIndicatorStyle UIScrollViewKeyboardDismissMode UISearchBarIcon UISearchBarStyle UISegmentedControlSegment UISegmentedControlStyle UISplitViewControllerDisplayMode UIStatusBarAnimation UIStatusBarStyle UISwipeGestureRecognizerDirection UISystemAnimation UITabBarItemPositioning UITabBarSystemItem UITableViewCellAccessoryType UITableViewCellEditingStyle UITableViewCellSelectionStyle UITableViewCellSeparatorStyle UITableViewCellStateMask UITableViewCellStyle UITableViewRowActionStyle UITableViewRowAnimation UITableViewScrollPosition UITableViewStyle UITextAlignment UITextAutocapitalizationType UITextAutocorrectionType UITextBorderStyle UITextDirection UITextFieldViewMode UITextGranularity UITextLayoutDirection UITextSpellCheckingType UITextStorageDirection UITextWritingDirection UITouchPhase UIUserInterfaceIdiom UIUserInterfaceLayoutDirection UIUserInterfaceSizeClass UIUserNotificationActionContext UIUserNotificationActivationMode UIUserNotificationType UIViewAnimationCurve UIViewAnimationOptions UIViewAnimationTransition UIViewAutoresizing UIViewContentMode UIViewKeyframeAnimationOptions UIViewTintAdjustmentMode UIWebPaginationBreakingMode UIWebPaginationMode UIWebViewNavigationType UIWindowLevel + +" Cocoa Constants +syn keyword cocoaConstant containedin=objcMessage NSASCIIStringEncoding NSAWTEventType NSAboveBottom NSAboveTop NSAccessibilityPriorityHigh NSAccessibilityPriorityLow NSAccessibilityPriorityMedium NSActivityAutomaticTerminationDisabled NSActivityBackground NSActivityIdleDisplaySleepDisabled NSActivityIdleSystemSleepDisabled NSActivityLatencyCritical NSActivitySuddenTerminationDisabled NSActivityUserInitiated NSActivityUserInitiatedAllowingIdleSystemSleep NSAddEntityMappingType NSAddTraitFontAction NSAdminApplicationDirectory NSAdobeCNS1CharacterCollection NSAdobeGB1CharacterCollection NSAdobeJapan1CharacterCollection NSAdobeJapan2CharacterCollection NSAdobeKorea1CharacterCollection NSAggregateExpressionType NSAlertAlternateReturn NSAlertDefaultReturn NSAlertErrorReturn NSAlertFirstButtonReturn NSAlertOtherReturn NSAlertSecondButtonReturn NSAlertThirdButtonReturn NSAlignAllEdgesInward NSAlignAllEdgesNearest NSAlignAllEdgesOutward NSAlignHeightInward NSAlignHeightNearest NSAlignHeightOutward NSAlignMaxXInward NSAlignMaxXNearest NSAlignMaxXOutward NSAlignMaxYInward NSAlignMaxYNearest NSAlignMaxYOutward NSAlignMinXInward NSAlignMinXNearest NSAlignMinXOutward NSAlignMinYInward NSAlignMinYNearest NSAlignMinYOutward NSAlignRectFlipped NSAlignWidthInward NSAlignWidthNearest NSAlignWidthOutward NSAllApplicationsDirectory NSAllDomainsMask NSAllLibrariesDirectory NSAllPredicateModifier NSAllScrollerParts NSAlphaFirstBitmapFormat NSAlphaNonpremultipliedBitmapFormat NSAlphaShiftKeyMask NSAlternateKeyMask NSAnchoredSearch NSAndPredicateType NSAnimationBlocking NSAnimationEaseIn NSAnimationEaseInOut NSAnimationEaseOut NSAnimationEffectDisappearingItemDefault NSAnimationEffectPoof NSAnimationLinear NSAnimationNonblocking NSAnimationNonblockingThreaded NSAnyEventMask NSAnyKeyExpressionType NSAnyPredicateModifier NSAnyType NSAppKitDefined NSAppKitDefinedMask NSApplicationActivateAllWindows NSApplicationActivateIgnoringOtherApps NSApplicationActivatedEventType NSApplicationActivationPolicyAccessory NSApplicationActivationPolicyProhibited NSApplicationActivationPolicyRegular NSApplicationDeactivatedEventType NSApplicationDefined NSApplicationDefinedMask NSApplicationDelegateReplyCancel NSApplicationDelegateReplyFailure NSApplicationDelegateReplySuccess NSApplicationDirectory NSApplicationOcclusionStateVisible NSApplicationPresentationAutoHideDock NSApplicationPresentationAutoHideMenuBar NSApplicationPresentationAutoHideToolbar NSApplicationPresentationDefault NSApplicationPresentationDisableAppleMenu NSApplicationPresentationDisableForceQuit NSApplicationPresentationDisableHideApplication NSApplicationPresentationDisableMenuBarTransparency NSApplicationPresentationDisableProcessSwitching NSApplicationPresentationDisableSessionTermination NSApplicationPresentationFullScreen NSApplicationPresentationHideDock NSApplicationPresentationHideMenuBar NSApplicationScriptsDirectory NSApplicationSupportDirectory NSArgumentEvaluationScriptError NSArgumentsWrongScriptError NSAscendingPageOrder NSAsciiWithDoubleByteEUCGlyphPacking NSAtBottom NSAtTop NSAtomicWrite NSAttachmentCharacter NSAttributedStringEnumerationLongestEffectiveRangeNotRequired NSAttributedStringEnumerationReverse NSAutoPagination NSAutosaveAsOperation NSAutosaveElsewhereOperation NSAutosaveInPlaceOperation NSAutosaveOperation NSAutosavedInformationDirectory NSBMPFileType NSBackTabCharacter NSBackgroundStyleDark NSBackgroundStyleLight NSBackgroundStyleLowered NSBackgroundStyleRaised NSBackgroundTab NSBackingStoreBuffered NSBackingStoreNonretained NSBackingStoreRetained NSBackspaceCharacter NSBacktabTextMovement NSBackwardsSearch NSBeginFunctionKey NSBeginsWithComparison NSBeginsWithPredicateOperatorType NSBelowBottom NSBelowTop NSBetweenPredicateOperatorType NSBevelLineJoinStyle NSBezelBorder NSBinarySearchingFirstEqual NSBinarySearchingInsertionIndex NSBinarySearchingLastEqual NSBlockExpressionType NSBlueControlTint NSBoldFontMask NSBorderlessWindowMask NSBottomTabsBezelBorder NSBoxCustom NSBoxOldStyle NSBoxPrimary NSBoxSecondary NSBoxSeparator NSBreakFunctionKey NSBrowserAutoColumnResizing NSBrowserDropAbove NSBrowserDropOn NSBrowserNoColumnResizing NSBrowserUserColumnResizing NSBundleExecutableArchitectureI386 NSBundleExecutableArchitecturePPC NSBundleExecutableArchitecturePPC64 NSBundleExecutableArchitectureX86_64 NSButtLineCapStyle NSByteCountFormatterCountStyleBinary NSByteCountFormatterCountStyleDecimal NSByteCountFormatterCountStyleFile NSByteCountFormatterCountStyleMemory NSByteCountFormatterUseAll NSByteCountFormatterUseBytes NSByteCountFormatterUseDefault NSByteCountFormatterUseEB NSByteCountFormatterUseGB NSByteCountFormatterUseKB NSByteCountFormatterUseMB NSByteCountFormatterUsePB NSByteCountFormatterUseTB NSByteCountFormatterUseYBOrHigher NSByteCountFormatterUseZB NSCMYKColorSpaceModel NSCMYKModeColorPanel NSCachesDirectory NSCalculationDivideByZero NSCalculationLossOfPrecision NSCalculationNoError NSCalculationOverflow NSCalculationUnderflow NSCalendarCalendarUnit NSCalendarMatchFirst NSCalendarMatchLast NSCalendarMatchNextTime NSCalendarMatchNextTimePreservingSmallerUnits NSCalendarMatchPreviousTimePreservingSmallerUnits NSCalendarMatchStrictly NSCalendarSearchBackwards NSCalendarUnitCalendar NSCalendarUnitDay NSCalendarUnitEra NSCalendarUnitHour NSCalendarUnitMinute NSCalendarUnitMonth NSCalendarUnitNanosecond NSCalendarUnitQuarter NSCalendarUnitSecond NSCalendarUnitTimeZone NSCalendarUnitWeekOfMonth NSCalendarUnitWeekOfYear NSCalendarUnitWeekday NSCalendarUnitWeekdayOrdinal NSCalendarUnitYear NSCalendarUnitYearForWeekOfYear NSCalendarWrapComponents NSCancelButton NSCancelTextMovement NSCannotCreateScriptCommandError NSCarriageReturnCharacter NSCaseInsensitivePredicateOption NSCaseInsensitiveSearch NSCellAllowsMixedState NSCellChangesContents NSCellDisabled NSCellEditable NSCellHasImageHorizontal NSCellHasImageOnLeftOrBottom NSCellHasOverlappingImage NSCellHighlighted NSCellHitContentArea NSCellHitEditableTextArea NSCellHitNone NSCellHitTrackableArea NSCellIsBordered NSCellIsInsetButton NSCellLightsByBackground NSCellLightsByContents NSCellLightsByGray NSCellState NSCenterTabStopType NSCenterTextAlignment NSChangeAutosaved NSChangeBackgroundCell NSChangeBackgroundCellMask NSChangeCleared NSChangeDiscardable NSChangeDone NSChangeGrayCell NSChangeGrayCellMask NSChangeReadOtherContents NSChangeRedone NSChangeUndone NSCircularBezelStyle NSCircularSlider NSClearControlTint NSClearDisplayFunctionKey NSClearLineFunctionKey NSClipPagination NSClockAndCalendarDatePickerStyle NSClosableWindowMask NSClosePathBezierPathElement NSCollectionViewDropBefore NSCollectionViewDropOn NSCollectorDisabledOption NSColorListModeColorPanel NSColorPanelAllModesMask NSColorPanelCMYKModeMask NSColorPanelColorListModeMask NSColorPanelCrayonModeMask NSColorPanelCustomPaletteModeMask NSColorPanelGrayModeMask NSColorPanelHSBModeMask NSColorPanelRGBModeMask NSColorPanelWheelModeMask NSColorRenderingIntentAbsoluteColorimetric NSColorRenderingIntentDefault NSColorRenderingIntentPerceptual NSColorRenderingIntentRelativeColorimetric NSColorRenderingIntentSaturation NSCommandKeyMask NSCompositeClear NSCompositeCopy NSCompositeDestinationAtop NSCompositeDestinationIn NSCompositeDestinationOut NSCompositeDestinationOver NSCompositeHighlight NSCompositePlusDarker NSCompositePlusLighter NSCompositeSourceAtop NSCompositeSourceIn NSCompositeSourceOut NSCompositeSourceOver NSCompositeXOR NSCompressedFontMask NSCondensedFontMask NSConfinementConcurrencyType NSConstantValueExpressionType NSContainerSpecifierError NSContainsComparison NSContainsPredicateOperatorType NSContentsCellMask NSContinuousCapacityLevelIndicatorStyle NSControlCharacterContainerBreakAction NSControlCharacterHorizontalTabAction NSControlCharacterLineBreakAction NSControlCharacterParagraphBreakAction NSControlCharacterWhitespaceAction NSControlCharacterZeroAdvancementAction NSControlGlyph NSControlKeyMask NSCopyEntityMappingType NSCoreDataError NSCoreServiceDirectory NSCorrectionIndicatorTypeDefault NSCorrectionIndicatorTypeGuesses NSCorrectionIndicatorTypeReversion NSCorrectionResponseAccepted NSCorrectionResponseEdited NSCorrectionResponseIgnored NSCorrectionResponseNone NSCorrectionResponseRejected NSCorrectionResponseReverted NSCrayonModeColorPanel NSCriticalAlertStyle NSCriticalRequest NSCursorPointingDevice NSCursorUpdate NSCursorUpdateMask NSCurveToBezierPathElement NSCustomEntityMappingType NSCustomPaletteModeColorPanel NSCustomSelectorPredicateOperatorType NSDataBase64DecodingIgnoreUnknownCharacters NSDataBase64Encoding64CharacterLineLength NSDataBase64Encoding76CharacterLineLength NSDataBase64EncodingEndLineWithCarriageReturn NSDataBase64EncodingEndLineWithLineFeed NSDataReadingMapped NSDataReadingMappedAlways NSDataReadingMappedIfSafe NSDataReadingUncached NSDataSearchAnchored NSDataSearchBackwards NSDataWritingAtomic NSDataWritingFileProtectionComplete NSDataWritingFileProtectionCompleteUnlessOpen NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication NSDataWritingFileProtectionMask NSDataWritingFileProtectionNone NSDataWritingWithoutOverwriting NSDateComponentUndefined NSDateFormatterBehavior10_0 NSDateFormatterBehavior10_4 NSDateFormatterBehaviorDefault NSDateFormatterFullStyle NSDateFormatterLongStyle NSDateFormatterMediumStyle NSDateFormatterNoStyle NSDateFormatterShortStyle NSDayCalendarUnit NSDecimalTabStopType NSDefaultControlTint NSDefaultTokenStyle NSDeleteCharFunctionKey NSDeleteCharacter NSDeleteFunctionKey NSDeleteLineFunctionKey NSDemoApplicationDirectory NSDescendingPageOrder NSDesktopDirectory NSDeveloperApplicationDirectory NSDeveloperDirectory NSDeviceIndependentModifierFlagsMask NSDeviceNColorSpaceModel NSDiacriticInsensitivePredicateOption NSDiacriticInsensitiveSearch NSDirectPredicateModifier NSDirectSelection NSDirectoryEnumerationSkipsHiddenFiles NSDirectoryEnumerationSkipsPackageDescendants NSDirectoryEnumerationSkipsSubdirectoryDescendants NSDisclosureBezelStyle NSDiscreteCapacityLevelIndicatorStyle NSDisplayWindowRunLoopOrdering NSDocModalWindowMask NSDocumentDirectory NSDocumentationDirectory NSDoubleType NSDownArrowFunctionKey NSDownTextMovement NSDownloadsDirectory NSDragOperationAll_Obsolete NSDragOperationCopy NSDragOperationDelete NSDragOperationEvery NSDragOperationGeneric NSDragOperationLink NSDragOperationMove NSDragOperationNone NSDragOperationPrivate NSDraggingContextOutsideApplication NSDraggingContextWithinApplication NSDraggingFormationDefault NSDraggingFormationList NSDraggingFormationNone NSDraggingFormationPile NSDraggingFormationStack NSDraggingItemEnumerationClearNonenumeratedImages NSDraggingItemEnumerationConcurrent NSDrawerClosedState NSDrawerClosingState NSDrawerOpenState NSDrawerOpeningState NSEndFunctionKey NSEndsWithComparison NSEndsWithPredicateOperatorType NSEnterCharacter NSEntityMigrationPolicyError NSEnumerationConcurrent NSEnumerationReverse NSEqualToComparison NSEqualToPredicateOperatorType NSEraCalendarUnit NSEraDatePickerElementFlag NSEraserPointingDevice NSErrorMergePolicyType NSEvaluatedObjectExpressionType NSEvenOddWindingRule NSEventGestureAxisHorizontal NSEventGestureAxisNone NSEventGestureAxisVertical NSEventMaskBeginGesture NSEventMaskEndGesture NSEventMaskGesture NSEventMaskMagnify NSEventMaskRotate NSEventMaskSmartMagnify NSEventMaskSwipe NSEventPhaseBegan NSEventPhaseCancelled NSEventPhaseChanged NSEventPhaseEnded NSEventPhaseMayBegin NSEventPhaseNone NSEventPhaseStationary NSEventSwipeTrackingClampGestureAmount NSEventSwipeTrackingLockDirection NSEventTypeBeginGesture NSEventTypeEndGesture NSEventTypeGesture NSEventTypeMagnify NSEventTypeQuickLook NSEventTypeRotate NSEventTypeSmartMagnify NSEventTypeSwipe NSEverySubelement NSExclude10_4ElementsIconCreationOption NSExcludeQuickDrawElementsIconCreationOption NSExecutableArchitectureMismatchError NSExecutableErrorMaximum NSExecutableErrorMinimum NSExecutableLinkError NSExecutableLoadError NSExecutableNotLoadableError NSExecutableRuntimeMismatchError NSExecuteFunctionKey NSExpandedFontMask NSExternalRecordImportError NSF10FunctionKey NSF11FunctionKey NSF12FunctionKey NSF13FunctionKey NSF14FunctionKey NSF15FunctionKey NSF16FunctionKey NSF17FunctionKey NSF18FunctionKey NSF19FunctionKey NSF1FunctionKey NSF20FunctionKey NSF21FunctionKey NSF22FunctionKey NSF23FunctionKey NSF24FunctionKey NSF25FunctionKey NSF26FunctionKey NSF27FunctionKey NSF28FunctionKey NSF29FunctionKey NSF2FunctionKey NSF30FunctionKey NSF31FunctionKey NSF32FunctionKey NSF33FunctionKey NSF34FunctionKey NSF35FunctionKey NSF3FunctionKey NSF4FunctionKey NSF5FunctionKey NSF6FunctionKey NSF7FunctionKey NSF8FunctionKey NSF9FunctionKey NSFPCurrentField NSFPPreviewButton NSFPPreviewField NSFPRevertButton NSFPSetButton NSFPSizeField NSFPSizeTitle NSFeatureUnsupportedError NSFetchRequestExpressionType NSFetchRequestType NSFileCoordinatorReadingResolvesSymbolicLink NSFileCoordinatorReadingWithoutChanges NSFileCoordinatorWritingForDeleting NSFileCoordinatorWritingForMerging NSFileCoordinatorWritingForMoving NSFileCoordinatorWritingForReplacing NSFileErrorMaximum NSFileErrorMinimum NSFileHandlingPanelCancelButton NSFileHandlingPanelOKButton NSFileLockingError NSFileManagerItemReplacementUsingNewMetadataOnly NSFileManagerItemReplacementWithoutDeletingBackupItem NSFileNoSuchFileError NSFileReadCorruptFileError NSFileReadInapplicableStringEncodingError NSFileReadInvalidFileNameError NSFileReadNoPermissionError NSFileReadNoSuchFileError NSFileReadTooLargeError NSFileReadUnknownError NSFileReadUnknownStringEncodingError NSFileReadUnsupportedSchemeError NSFileVersionAddingByMoving NSFileVersionReplacingByMoving NSFileWrapperReadingImmediate NSFileWrapperReadingWithoutMapping NSFileWrapperWritingAtomic NSFileWrapperWritingWithNameUpdating NSFileWriteFileExistsError NSFileWriteInapplicableStringEncodingError NSFileWriteInvalidFileNameError NSFileWriteNoPermissionError NSFileWriteOutOfSpaceError NSFileWriteUnknownError NSFileWriteUnsupportedSchemeError NSFileWriteVolumeReadOnlyError NSFindFunctionKey NSFindPanelActionNext NSFindPanelActionPrevious NSFindPanelActionReplace NSFindPanelActionReplaceAll NSFindPanelActionReplaceAllInSelection NSFindPanelActionReplaceAndFind NSFindPanelActionSelectAll NSFindPanelActionSelectAllInSelection NSFindPanelActionSetFindString NSFindPanelActionShowFindPanel NSFindPanelSubstringMatchTypeContains NSFindPanelSubstringMatchTypeEndsWith NSFindPanelSubstringMatchTypeFullWord NSFindPanelSubstringMatchTypeStartsWith NSFitPagination NSFixedPitchFontMask NSFlagsChanged NSFlagsChangedMask NSFloatType NSFloatingPointSamplesBitmapFormat NSFocusRingAbove NSFocusRingBelow NSFocusRingOnly NSFocusRingTypeDefault NSFocusRingTypeExterior NSFocusRingTypeNone NSFontAntialiasedIntegerAdvancementsRenderingMode NSFontAntialiasedRenderingMode NSFontBoldTrait NSFontClarendonSerifsClass NSFontCollectionApplicationOnlyMask NSFontCollectionVisibilityComputer NSFontCollectionVisibilityProcess NSFontCollectionVisibilityUser NSFontCondensedTrait NSFontDefaultRenderingMode NSFontExpandedTrait NSFontFamilyClassMask NSFontFreeformSerifsClass NSFontIntegerAdvancementsRenderingMode NSFontItalicTrait NSFontModernSerifsClass NSFontMonoSpaceTrait NSFontOldStyleSerifsClass NSFontOrnamentalsClass NSFontPanelAllEffectsModeMask NSFontPanelAllModesMask NSFontPanelCollectionModeMask NSFontPanelDocumentColorEffectModeMask NSFontPanelFaceModeMask NSFontPanelShadowEffectModeMask NSFontPanelSizeModeMask NSFontPanelStandardModesMask NSFontPanelStrikethroughEffectModeMask NSFontPanelTextColorEffectModeMask NSFontPanelUnderlineEffectModeMask NSFontSansSerifClass NSFontScriptsClass NSFontSlabSerifsClass NSFontSymbolicClass NSFontTransitionalSerifsClass NSFontUIOptimizedTrait NSFontUnknownClass NSFontVerticalTrait NSForcedOrderingSearch NSFormFeedCharacter NSFormattingError NSFormattingErrorMaximum NSFormattingErrorMinimum NSFourByteGlyphPacking NSFullScreenWindowMask NSFunctionExpressionType NSFunctionKeyMask NSGIFFileType NSGlyphAbove NSGlyphAttributeBidiLevel NSGlyphAttributeElastic NSGlyphAttributeInscribe NSGlyphAttributeSoft NSGlyphBelow NSGlyphInscribeAbove NSGlyphInscribeBase NSGlyphInscribeBelow NSGlyphInscribeOverBelow NSGlyphInscribeOverstrike NSGlyphLayoutAgainstAPoint NSGlyphLayoutAtAPoint NSGlyphLayoutWithPrevious NSGlyphPropertyControlCharacter NSGlyphPropertyElastic NSGlyphPropertyNonBaseCharacter NSGlyphPropertyNull NSGradientConcaveStrong NSGradientConcaveWeak NSGradientConvexStrong NSGradientConvexWeak NSGradientDrawsAfterEndingLocation NSGradientDrawsBeforeStartingLocation NSGradientNone NSGraphiteControlTint NSGrayColorSpaceModel NSGrayModeColorPanel NSGreaterThanComparison NSGreaterThanOrEqualToComparison NSGreaterThanOrEqualToPredicateOperatorType NSGreaterThanPredicateOperatorType NSGrooveBorder NSHPUXOperatingSystem NSHSBModeColorPanel NSHTTPCookieAcceptPolicyAlways NSHTTPCookieAcceptPolicyNever NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain NSHUDWindowMask NSHashTableCopyIn NSHashTableObjectPointerPersonality NSHashTableStrongMemory NSHashTableWeakMemory NSHashTableZeroingWeakMemory NSHeavierFontAction NSHelpButtonBezelStyle NSHelpFunctionKey NSHelpKeyMask NSHighlightModeMatrix NSHomeFunctionKey NSHorizontalRuler NSHourCalendarUnit NSHourMinuteDatePickerElementFlag NSHourMinuteSecondDatePickerElementFlag NSISO2022JPStringEncoding NSISOLatin1StringEncoding NSISOLatin2StringEncoding NSIdentityMappingCharacterCollection NSIllegalTextMovement NSImageAbove NSImageAlignBottom NSImageAlignBottomLeft NSImageAlignBottomRight NSImageAlignCenter NSImageAlignLeft NSImageAlignRight NSImageAlignTop NSImageAlignTopLeft NSImageAlignTopRight NSImageBelow NSImageCacheAlways NSImageCacheBySize NSImageCacheDefault NSImageCacheNever NSImageCellType NSImageFrameButton NSImageFrameGrayBezel NSImageFrameGroove NSImageFrameNone NSImageFramePhoto NSImageInterpolationDefault NSImageInterpolationHigh NSImageInterpolationLow NSImageInterpolationMedium NSImageInterpolationNone NSImageLeft NSImageLoadStatusCancelled NSImageLoadStatusCompleted NSImageLoadStatusInvalidData NSImageLoadStatusReadError NSImageLoadStatusUnexpectedEOF NSImageOnly NSImageOverlaps NSImageRepLoadStatusCompleted NSImageRepLoadStatusInvalidData NSImageRepLoadStatusReadingHeader NSImageRepLoadStatusUnexpectedEOF NSImageRepLoadStatusUnknownType NSImageRepLoadStatusWillNeedAllData NSImageRepMatchesDevice NSImageRight NSImageScaleAxesIndependently NSImageScaleNone NSImageScaleProportionallyDown NSImageScaleProportionallyUpOrDown NSInPredicateOperatorType NSIndexSubelement NSIndexedColorSpaceModel NSInferredMappingModelError NSInformationalAlertStyle NSInformationalRequest NSInlineBezelStyle NSInputMethodsDirectory NSInsertCharFunctionKey NSInsertFunctionKey NSInsertLineFunctionKey NSIntType NSInternalScriptError NSInternalSpecifierError NSIntersectSetExpressionType NSInvalidIndexSpecifierError NSItalicFontMask NSItemReplacementDirectory NSJPEG2000FileType NSJPEGFileType NSJSONReadingAllowFragments NSJSONReadingMutableContainers NSJSONReadingMutableLeaves NSJSONWritingPrettyPrinted NSJapaneseEUCGlyphPacking NSJapaneseEUCStringEncoding NSJustifiedTextAlignment NSKeyDown NSKeyDownMask NSKeyPathExpressionType NSKeySpecifierEvaluationScriptError NSKeyUp NSKeyUpMask NSKeyValueChangeInsertion NSKeyValueChangeRemoval NSKeyValueChangeReplacement NSKeyValueChangeSetting NSKeyValueIntersectSetMutation NSKeyValueMinusSetMutation NSKeyValueObservingOptionInitial NSKeyValueObservingOptionNew NSKeyValueObservingOptionOld NSKeyValueObservingOptionPrior NSKeyValueSetSetMutation NSKeyValueUnionSetMutation NSKeyValueValidationError NSLABColorSpaceModel NSLandscapeOrientation NSLayoutAttributeBaseline NSLayoutAttributeBottom NSLayoutAttributeBottomMargin NSLayoutAttributeCenterX NSLayoutAttributeCenterXWithinMargins NSLayoutAttributeCenterY NSLayoutAttributeCenterYWithinMargins NSLayoutAttributeFirstBaseline NSLayoutAttributeHeight NSLayoutAttributeLastBaseline NSLayoutAttributeLeading NSLayoutAttributeLeadingMargin NSLayoutAttributeLeft NSLayoutAttributeLeftMargin NSLayoutAttributeNotAnAttribute NSLayoutAttributeRight NSLayoutAttributeRightMargin NSLayoutAttributeTop NSLayoutAttributeTopMargin NSLayoutAttributeTrailing NSLayoutAttributeTrailingMargin NSLayoutAttributeWidth NSLayoutCantFit NSLayoutConstraintOrientationHorizontal NSLayoutConstraintOrientationVertical NSLayoutDone NSLayoutFormatAlignAllBaseline NSLayoutFormatAlignAllBottom NSLayoutFormatAlignAllCenterX NSLayoutFormatAlignAllCenterY NSLayoutFormatAlignAllFirstBaseline NSLayoutFormatAlignAllLastBaseline NSLayoutFormatAlignAllLeading NSLayoutFormatAlignAllLeft NSLayoutFormatAlignAllRight NSLayoutFormatAlignAllTop NSLayoutFormatAlignAllTrailing NSLayoutFormatAlignmentMask NSLayoutFormatDirectionLeadingToTrailing NSLayoutFormatDirectionLeftToRight NSLayoutFormatDirectionMask NSLayoutFormatDirectionRightToLeft NSLayoutLeftToRight NSLayoutNotDone NSLayoutOutOfGlyphs NSLayoutPriorityDefaultHigh NSLayoutPriorityDefaultLow NSLayoutPriorityDragThatCanResizeWindow NSLayoutPriorityDragThatCannotResizeWindow NSLayoutPriorityFittingSizeCompression NSLayoutPriorityRequired NSLayoutPriorityWindowSizeStayPut NSLayoutRelationEqual NSLayoutRelationGreaterThanOrEqual NSLayoutRelationLessThanOrEqual NSLayoutRightToLeft NSLeftArrowFunctionKey NSLeftMouseDown NSLeftMouseDownMask NSLeftMouseDragged NSLeftMouseDraggedMask NSLeftMouseUp NSLeftMouseUpMask NSLeftTabStopType NSLeftTabsBezelBorder NSLeftTextAlignment NSLeftTextMovement NSLessThanComparison NSLessThanOrEqualToComparison NSLessThanOrEqualToPredicateOperatorType NSLessThanPredicateOperatorType NSLibraryDirectory NSLighterFontAction NSLikePredicateOperatorType NSLineBorder NSLineBreakByCharWrapping NSLineBreakByClipping NSLineBreakByTruncatingHead NSLineBreakByTruncatingMiddle NSLineBreakByTruncatingTail NSLineBreakByWordWrapping NSLineDoesntMove NSLineMovesDown NSLineMovesLeft NSLineMovesRight NSLineMovesUp NSLineSeparatorCharacter NSLineSweepDown NSLineSweepLeft NSLineSweepRight NSLineSweepUp NSLineToBezierPathElement NSLinearSlider NSLinguisticTaggerJoinNames NSLinguisticTaggerOmitOther NSLinguisticTaggerOmitPunctuation NSLinguisticTaggerOmitWhitespace NSLinguisticTaggerOmitWords NSListModeMatrix NSLiteralSearch NSLocalDomainMask NSLocaleLanguageDirectionBottomToTop NSLocaleLanguageDirectionLeftToRight NSLocaleLanguageDirectionRightToLeft NSLocaleLanguageDirectionTopToBottom NSLocaleLanguageDirectionUnknown NSMACHOperatingSystem NSMacOSRomanStringEncoding NSMachPortDeallocateNone NSMachPortDeallocateReceiveRight NSMachPortDeallocateSendRight NSMacintoshInterfaceStyle NSMainQueueConcurrencyType NSManagedObjectContextLockingError NSManagedObjectExternalRelationshipError NSManagedObjectIDResultType NSManagedObjectMergeError NSManagedObjectReferentialIntegrityError NSManagedObjectResultType NSManagedObjectValidationError NSMapTableCopyIn NSMapTableObjectPointerPersonality NSMapTableStrongMemory NSMapTableWeakMemory NSMapTableZeroingWeakMemory NSMappedRead NSMatchesPredicateOperatorType NSMatchingAnchored NSMatchingCompleted NSMatchingHitEnd NSMatchingInternalError NSMatchingProgress NSMatchingReportCompletion NSMatchingReportProgress NSMatchingRequiredEnd NSMatchingWithTransparentBounds NSMatchingWithoutAnchoringBounds NSMaxXEdge NSMaxYEdge NSMediaLibraryAudio NSMediaLibraryImage NSMediaLibraryMovie NSMenuFunctionKey NSMenuPropertyItemAccessibilityDescription NSMenuPropertyItemAttributedTitle NSMenuPropertyItemEnabled NSMenuPropertyItemImage NSMenuPropertyItemKeyEquivalent NSMenuPropertyItemTitle NSMergeByPropertyObjectTrumpMergePolicyType NSMergeByPropertyStoreTrumpMergePolicyType NSMiddleSubelement NSMigrationCancelledError NSMigrationError NSMigrationManagerDestinationStoreError NSMigrationManagerSourceStoreError NSMigrationMissingMappingModelError NSMigrationMissingSourceModelError NSMinXEdge NSMinYEdge NSMiniControlSize NSMiniaturizableWindowMask NSMinusSetExpressionType NSMinuteCalendarUnit NSMiterLineJoinStyle NSMixedState NSModalResponseAbort NSModalResponseCancel NSModalResponseContinue NSModalResponseOK NSModalResponseStop NSModeSwitchFunctionKey NSMomentaryChangeButton NSMomentaryLight NSMomentaryLightButton NSMomentaryPushButton NSMomentaryPushInButton NSMonthCalendarUnit NSMouseEntered NSMouseEnteredMask NSMouseEventSubtype NSMouseExited NSMouseExitedMask NSMouseMoved NSMouseMovedMask NSMoveToBezierPathElement NSMoviesDirectory NSMusicDirectory NSNEXTSTEPStringEncoding NSNarrowFontMask NSNativeShortGlyphPacking NSNaturalTextAlignment NSNetServiceListenForConnections NSNetServiceNoAutoRename NSNetServicesActivityInProgress NSNetServicesBadArgumentError NSNetServicesCancelledError NSNetServicesCollisionError NSNetServicesInvalidError NSNetServicesNotFoundError NSNetServicesTimeoutError NSNetServicesUnknownError NSNetworkDomainMask NSNewlineCharacter NSNextFunctionKey NSNextStepInterfaceStyle NSNoBorder NSNoCellMask NSNoFontChangeAction NSNoImage NSNoInterfaceStyle NSNoModeColorPanel NSNoScriptError NSNoScrollerParts NSNoSpecifierError NSNoSubelement NSNoTabsBezelBorder NSNoTabsLineBorder NSNoTabsNoBorder NSNoTitle NSNoTopLevelContainersSpecifierError NSNoUnderlineStyle NSNonLossyASCIIStringEncoding NSNonStandardCharacterSetFontMask NSNonZeroWindingRule NSNonactivatingPanelMask NSNormalizedPredicateOption NSNotEqualToPredicateOperatorType NSNotPredicateType NSNotificationCoalescingOnName NSNotificationCoalescingOnSender NSNotificationDeliverImmediately NSNotificationNoCoalescing NSNotificationPostToAllSessions NSNotificationSuspensionBehaviorCoalesce NSNotificationSuspensionBehaviorDeliverImmediately NSNotificationSuspensionBehaviorDrop NSNotificationSuspensionBehaviorHold NSNullCellType NSNullGlyph NSNumberFormatterBehavior10_0 NSNumberFormatterBehavior10_4 NSNumberFormatterBehaviorDefault NSNumberFormatterCurrencyStyle NSNumberFormatterDecimalStyle NSNumberFormatterNoStyle NSNumberFormatterPadAfterPrefix NSNumberFormatterPadAfterSuffix NSNumberFormatterPadBeforePrefix NSNumberFormatterPadBeforeSuffix NSNumberFormatterPercentStyle NSNumberFormatterRoundCeiling NSNumberFormatterRoundDown NSNumberFormatterRoundFloor NSNumberFormatterRoundHalfDown NSNumberFormatterRoundHalfEven NSNumberFormatterRoundHalfUp NSNumberFormatterRoundUp NSNumberFormatterScientificStyle NSNumberFormatterSpellOutStyle NSNumericPadKeyMask NSNumericSearch NSOKButton NSOSF1OperatingSystem NSObjCArrayType NSObjCBitfield NSObjCBoolType NSObjCCharType NSObjCDoubleType NSObjCFloatType NSObjCLongType NSObjCLonglongType NSObjCNoType NSObjCObjectType NSObjCPointerType NSObjCSelectorType NSObjCShortType NSObjCStringType NSObjCStructType NSObjCUnionType NSObjCVoidType NSOffState NSOnOffButton NSOnState NSOneByteGlyphPacking NSOnlyScrollerArrows NSOpenGLCPCurrentRendererID NSOpenGLCPGPUFragmentProcessing NSOpenGLCPGPUVertexProcessing NSOpenGLCPHasDrawable NSOpenGLCPMPSwapsInFlight NSOpenGLCPReclaimResources NSOpenGLCPSurfaceBackingSize NSOpenGLCPSurfaceOpacity NSOpenGLCPSurfaceOrder NSOpenGLCPSwapInterval NSOpenGLGOClearFormatCache NSOpenGLGOFormatCacheSize NSOpenGLGOResetLibrary NSOpenGLGORetainRenderers NSOpenGLGOUseBuildCache NSOpenGLPFAAccelerated NSOpenGLPFAAcceleratedCompute NSOpenGLPFAAccumSize NSOpenGLPFAAllRenderers NSOpenGLPFAAllowOfflineRenderers NSOpenGLPFAAlphaSize NSOpenGLPFAAuxBuffers NSOpenGLPFAAuxDepthStencil NSOpenGLPFABackingStore NSOpenGLPFAClosestPolicy NSOpenGLPFAColorFloat NSOpenGLPFAColorSize NSOpenGLPFACompliant NSOpenGLPFADepthSize NSOpenGLPFADoubleBuffer NSOpenGLPFAFullScreen NSOpenGLPFAMPSafe NSOpenGLPFAMaximumPolicy NSOpenGLPFAMinimumPolicy NSOpenGLPFAMultiScreen NSOpenGLPFAMultisample NSOpenGLPFANoRecovery NSOpenGLPFAOffScreen NSOpenGLPFAOpenGLProfile NSOpenGLPFAPixelBuffer NSOpenGLPFARemotePixelBuffer NSOpenGLPFARendererID NSOpenGLPFARobust NSOpenGLPFASampleAlpha NSOpenGLPFASampleBuffers NSOpenGLPFASamples NSOpenGLPFAScreenMask NSOpenGLPFASingleRenderer NSOpenGLPFAStencilSize NSOpenGLPFAStereo NSOpenGLPFASupersample NSOpenGLPFATripleBuffer NSOpenGLPFAVirtualScreenCount NSOpenGLPFAWindow NSOpenGLProfileVersion3_2Core NSOpenGLProfileVersionLegacy NSOpenStepUnicodeReservedBase NSOperationNotSupportedForKeyScriptError NSOperationNotSupportedForKeySpecifierError NSOperationQueueDefaultMaxConcurrentOperationCount NSOperationQueuePriorityHigh NSOperationQueuePriorityLow NSOperationQueuePriorityNormal NSOperationQueuePriorityVeryHigh NSOperationQueuePriorityVeryLow NSOrPredicateType NSOtherMouseDown NSOtherMouseDownMask NSOtherMouseDragged NSOtherMouseDraggedMask NSOtherMouseUp NSOtherMouseUpMask NSOtherTextMovement NSOverwriteMergePolicyType NSPDFPanelRequestsParentDirectory NSPDFPanelShowsOrientation NSPDFPanelShowsPaperSize NSPNGFileType NSPageControllerTransitionStyleHorizontalStrip NSPageControllerTransitionStyleStackBook NSPageControllerTransitionStyleStackHistory NSPageDownFunctionKey NSPageUpFunctionKey NSPaperOrientationLandscape NSPaperOrientationPortrait NSParagraphSeparatorCharacter NSPasteboardReadingAsData NSPasteboardReadingAsKeyedArchive NSPasteboardReadingAsPropertyList NSPasteboardReadingAsString NSPasteboardWritingPromised NSPathStyleNavigationBar NSPathStylePopUp NSPathStyleStandard NSPatternColorSpaceModel NSPauseFunctionKey NSPenLowerSideMask NSPenPointingDevice NSPenTipMask NSPenUpperSideMask NSPeriodic NSPeriodicMask NSPersistentStoreCoordinatorLockingError NSPersistentStoreIncompatibleSchemaError NSPersistentStoreIncompatibleVersionHashError NSPersistentStoreIncompleteSaveError NSPersistentStoreInvalidTypeError NSPersistentStoreOpenError NSPersistentStoreOperationError NSPersistentStoreSaveConflictsError NSPersistentStoreSaveError NSPersistentStoreTimeoutError NSPersistentStoreTypeMismatchError NSPersistentStoreUbiquitousTransitionTypeAccountAdded NSPersistentStoreUbiquitousTransitionTypeAccountRemoved NSPersistentStoreUbiquitousTransitionTypeContentRemoved NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted NSPersistentStoreUnsupportedRequestTypeError NSPicturesDirectory NSPlainTextTokenStyle NSPointerFunctionsCStringPersonality NSPointerFunctionsCopyIn NSPointerFunctionsIntegerPersonality NSPointerFunctionsMachVirtualMemory NSPointerFunctionsMallocMemory NSPointerFunctionsObjectPersonality NSPointerFunctionsObjectPointerPersonality NSPointerFunctionsOpaqueMemory NSPointerFunctionsOpaquePersonality NSPointerFunctionsStrongMemory NSPointerFunctionsStructPersonality NSPointerFunctionsWeakMemory NSPointerFunctionsZeroingWeakMemory NSPopUpArrowAtBottom NSPopUpArrowAtCenter NSPopUpNoArrow NSPopoverAppearanceHUD NSPopoverAppearanceMinimal NSPopoverBehaviorApplicationDefined NSPopoverBehaviorSemitransient NSPopoverBehaviorTransient NSPortraitOrientation NSPositionAfter NSPositionBefore NSPositionBeginning NSPositionEnd NSPositionReplace NSPositiveDoubleType NSPositiveFloatType NSPositiveIntType NSPostASAP NSPostNow NSPostWhenIdle NSPosterFontMask NSPowerOffEventType NSPreferencePanesDirectory NSPressedTab NSPrevFunctionKey NSPrintFunctionKey NSPrintPanelShowsCopies NSPrintPanelShowsOrientation NSPrintPanelShowsPageRange NSPrintPanelShowsPageSetupAccessory NSPrintPanelShowsPaperSize NSPrintPanelShowsPreview NSPrintPanelShowsPrintSelection NSPrintPanelShowsScaling NSPrintRenderingQualityBest NSPrintRenderingQualityResponsive NSPrintScreenFunctionKey NSPrinterDescriptionDirectory NSPrinterTableError NSPrinterTableNotFound NSPrinterTableOK NSPrintingCancelled NSPrintingFailure NSPrintingReplyLater NSPrintingSuccess NSPrivateQueueConcurrencyType NSProgressIndicatorBarStyle NSProgressIndicatorPreferredAquaThickness NSProgressIndicatorPreferredLargeThickness NSProgressIndicatorPreferredSmallThickness NSProgressIndicatorPreferredThickness NSProgressIndicatorSpinningStyle NSPropertyListBinaryFormat_v1_0 NSPropertyListErrorMaximum NSPropertyListErrorMinimum NSPropertyListImmutable NSPropertyListMutableContainers NSPropertyListMutableContainersAndLeaves NSPropertyListOpenStepFormat NSPropertyListReadCorruptError NSPropertyListReadStreamError NSPropertyListReadUnknownVersionError NSPropertyListWriteStreamError NSPropertyListXMLFormat_v1_0 NSProprietaryStringEncoding NSPushInCell NSPushInCellMask NSPushOnPushOffButton NSQTMovieLoopingBackAndForthPlayback NSQTMovieLoopingPlayback NSQTMovieNormalPlayback NSQuarterCalendarUnit NSRGBColorSpaceModel NSRGBModeColorPanel NSRadioButton NSRadioModeMatrix NSRandomSubelement NSRangeDateMode NSRatingLevelIndicatorStyle NSReceiverEvaluationScriptError NSReceiversCantHandleCommandScriptError NSRecessedBezelStyle NSRedoFunctionKey NSRegularControlSize NSRegularExpressionAllowCommentsAndWhitespace NSRegularExpressionAnchorsMatchLines NSRegularExpressionCaseInsensitive NSRegularExpressionDotMatchesLineSeparators NSRegularExpressionIgnoreMetacharacters NSRegularExpressionSearch NSRegularExpressionUseUnicodeWordBoundaries NSRegularExpressionUseUnixLineSeparators NSRegularSquareBezelStyle NSRelativeAfter NSRelativeBefore NSRelevancyLevelIndicatorStyle NSRemoteNotificationTypeAlert NSRemoteNotificationTypeBadge NSRemoteNotificationTypeNone NSRemoteNotificationTypeSound NSRemoveEntityMappingType NSRemoveTraitFontAction NSRequiredArgumentsMissingScriptError NSResetCursorRectsRunLoopOrdering NSResetFunctionKey NSResizableWindowMask NSReturnTextMovement NSRightArrowFunctionKey NSRightMouseDown NSRightMouseDownMask NSRightMouseDragged NSRightMouseDraggedMask NSRightMouseUp NSRightMouseUpMask NSRightTabStopType NSRightTabsBezelBorder NSRightTextAlignment NSRightTextMovement NSRollbackMergePolicyType NSRoundBankers NSRoundDown NSRoundLineCapStyle NSRoundLineJoinStyle NSRoundPlain NSRoundRectBezelStyle NSRoundUp NSRoundedBezelStyle NSRoundedDisclosureBezelStyle NSRoundedTokenStyle NSRuleEditorNestingModeCompound NSRuleEditorNestingModeList NSRuleEditorNestingModeSimple NSRuleEditorNestingModeSingle NSRuleEditorRowTypeCompound NSRuleEditorRowTypeSimple NSRunAbortedResponse NSRunContinuesResponse NSRunStoppedResponse NSSQLiteError NSSaveAsOperation NSSaveOperation NSSaveOptionsAsk NSSaveOptionsNo NSSaveOptionsYes NSSaveRequestType NSSaveToOperation NSScaleNone NSScaleProportionally NSScaleToFit NSScannedOption NSScreenChangedEventType NSScrollElasticityAllowed NSScrollElasticityAutomatic NSScrollElasticityNone NSScrollLockFunctionKey NSScrollViewFindBarPositionAboveContent NSScrollViewFindBarPositionAboveHorizontalRuler NSScrollViewFindBarPositionBelowContent NSScrollWheel NSScrollWheelMask NSScrollerArrowsDefaultSetting NSScrollerArrowsMaxEnd NSScrollerArrowsMinEnd NSScrollerArrowsNone NSScrollerDecrementArrow NSScrollerDecrementLine NSScrollerDecrementPage NSScrollerIncrementArrow NSScrollerIncrementLine NSScrollerIncrementPage NSScrollerKnob NSScrollerKnobSlot NSScrollerKnobStyleDark NSScrollerKnobStyleDefault NSScrollerKnobStyleLight NSScrollerNoPart NSScrollerStyleLegacy NSScrollerStyleOverlay NSSecondCalendarUnit NSSegmentStyleAutomatic NSSegmentStyleCapsule NSSegmentStyleRoundRect NSSegmentStyleRounded NSSegmentStyleSmallSquare NSSegmentStyleTexturedRounded NSSegmentStyleTexturedSquare NSSegmentSwitchTrackingMomentary NSSegmentSwitchTrackingSelectAny NSSegmentSwitchTrackingSelectOne NSSelectByCharacter NSSelectByParagraph NSSelectByWord NSSelectFunctionKey NSSelectedTab NSSelectingNext NSSelectingPrevious NSSelectionAffinityDownstream NSSelectionAffinityUpstream NSServiceApplicationLaunchFailedError NSServiceApplicationNotFoundError NSServiceErrorMaximum NSServiceErrorMinimum NSServiceInvalidPasteboardDataError NSServiceMalformedServiceDictionaryError NSServiceMiscellaneousError NSServiceRequestTimedOutError NSShadowlessSquareBezelStyle NSSharedPublicDirectory NSSharingContentScopeFull NSSharingContentScopeItem NSSharingContentScopePartial NSSharingServiceErrorMaximum NSSharingServiceErrorMinimum NSSharingServiceNotConfiguredError NSShiftJISStringEncoding NSShiftKeyMask NSShowControlGlyphs NSShowInvisibleGlyphs NSSingleDateMode NSSingleUnderlineStyle NSSizeDownFontAction NSSizeUpFontAction NSSmallCapsFontMask NSSmallControlSize NSSmallIconButtonBezelStyle NSSmallSquareBezelStyle NSSnapshotEventMergePolicy NSSnapshotEventRefresh NSSnapshotEventRollback NSSnapshotEventUndoDeletion NSSnapshotEventUndoInsertion NSSnapshotEventUndoUpdate NSSolarisOperatingSystem NSSortConcurrent NSSortStable NSSpecialPageOrder NSSpeechImmediateBoundary NSSpeechSentenceBoundary NSSpeechWordBoundary NSSpellingStateGrammarFlag NSSpellingStateSpellingFlag NSSplitViewDividerStylePaneSplitter NSSplitViewDividerStyleThick NSSplitViewDividerStyleThin NSSquareLineCapStyle NSStackViewGravityBottom NSStackViewGravityCenter NSStackViewGravityLeading NSStackViewGravityTop NSStackViewGravityTrailing NSStackViewVisibilityPriorityDetachOnlyIfNecessary NSStackViewVisibilityPriorityMustHold NSStackViewVisibilityPriorityNotVisible NSStopFunctionKey NSStreamEventEndEncountered NSStreamEventErrorOccurred NSStreamEventHasBytesAvailable NSStreamEventHasSpaceAvailable NSStreamEventNone NSStreamEventOpenCompleted NSStreamStatusAtEnd NSStreamStatusClosed NSStreamStatusError NSStreamStatusNotOpen NSStreamStatusOpen NSStreamStatusOpening NSStreamStatusReading NSStreamStatusWriting NSStringDrawingDisableScreenFontSubstitution NSStringDrawingOneShot NSStringDrawingTruncatesLastVisibleLine NSStringDrawingUsesDeviceMetrics NSStringDrawingUsesFontLeading NSStringDrawingUsesLineFragmentOrigin NSStringEncodingConversionAllowLossy NSStringEncodingConversionExternalRepresentation NSStringEnumerationByComposedCharacterSequences NSStringEnumerationByLines NSStringEnumerationByParagraphs NSStringEnumerationBySentences NSStringEnumerationByWords NSStringEnumerationLocalized NSStringEnumerationReverse NSStringEnumerationSubstringNotRequired NSSubqueryExpressionType NSSunOSOperatingSystem NSSwitchButton NSSymbolStringEncoding NSSysReqFunctionKey NSSystemDefined NSSystemDefinedMask NSSystemDomainMask NSSystemFunctionKey NSTIFFCompressionCCITTFAX3 NSTIFFCompressionCCITTFAX4 NSTIFFCompressionJPEG NSTIFFCompressionLZW NSTIFFCompressionNEXT NSTIFFCompressionNone NSTIFFCompressionOldJPEG NSTIFFCompressionPackBits NSTIFFFileType NSTabCharacter NSTabTextMovement NSTableColumnAutoresizingMask NSTableColumnNoResizing NSTableColumnUserResizingMask NSTableViewAnimationEffectFade NSTableViewAnimationEffectGap NSTableViewAnimationEffectNone NSTableViewAnimationSlideDown NSTableViewAnimationSlideLeft NSTableViewAnimationSlideRight NSTableViewAnimationSlideUp NSTableViewDashedHorizontalGridLineMask NSTableViewDraggingDestinationFeedbackStyleGap NSTableViewDraggingDestinationFeedbackStyleNone NSTableViewDraggingDestinationFeedbackStyleRegular NSTableViewDraggingDestinationFeedbackStyleSourceList NSTableViewDropAbove NSTableViewDropOn NSTableViewFirstColumnOnlyAutoresizingStyle NSTableViewGridNone NSTableViewLastColumnOnlyAutoresizingStyle NSTableViewNoColumnAutoresizing NSTableViewReverseSequentialColumnAutoresizingStyle NSTableViewRowSizeStyleCustom NSTableViewRowSizeStyleDefault NSTableViewRowSizeStyleLarge NSTableViewRowSizeStyleMedium NSTableViewRowSizeStyleSmall NSTableViewSelectionHighlightStyleNone NSTableViewSelectionHighlightStyleRegular NSTableViewSelectionHighlightStyleSourceList NSTableViewSequentialColumnAutoresizingStyle NSTableViewSolidHorizontalGridLineMask NSTableViewSolidVerticalGridLineMask NSTableViewUniformColumnAutoresizingStyle NSTabletPoint NSTabletPointEventSubtype NSTabletPointMask NSTabletProximity NSTabletProximityEventSubtype NSTabletProximityMask NSTaskTerminationReasonExit NSTaskTerminationReasonUncaughtSignal NSTerminateCancel NSTerminateLater NSTerminateNow NSTextAlignmentCenter NSTextAlignmentJustified NSTextAlignmentLeft NSTextAlignmentNatural NSTextAlignmentRight NSTextBlockAbsoluteValueType NSTextBlockBaselineAlignment NSTextBlockBorder NSTextBlockBottomAlignment NSTextBlockHeight NSTextBlockMargin NSTextBlockMaximumHeight NSTextBlockMaximumWidth NSTextBlockMiddleAlignment NSTextBlockMinimumHeight NSTextBlockMinimumWidth NSTextBlockPadding NSTextBlockPercentageValueType NSTextBlockTopAlignment NSTextBlockWidth NSTextCellType NSTextCheckingAllCustomTypes NSTextCheckingAllSystemTypes NSTextCheckingAllTypes NSTextCheckingTypeAddress NSTextCheckingTypeCorrection NSTextCheckingTypeDash NSTextCheckingTypeDate NSTextCheckingTypeGrammar NSTextCheckingTypeLink NSTextCheckingTypeOrthography NSTextCheckingTypePhoneNumber NSTextCheckingTypeQuote NSTextCheckingTypeRegularExpression NSTextCheckingTypeReplacement NSTextCheckingTypeSpelling NSTextCheckingTypeTransitInformation NSTextFieldAndStepperDatePickerStyle NSTextFieldDatePickerStyle NSTextFieldRoundedBezel NSTextFieldSquareBezel NSTextFinderActionHideFindInterface NSTextFinderActionHideReplaceInterface NSTextFinderActionNextMatch NSTextFinderActionPreviousMatch NSTextFinderActionReplace NSTextFinderActionReplaceAll NSTextFinderActionReplaceAllInSelection NSTextFinderActionReplaceAndFind NSTextFinderActionSelectAll NSTextFinderActionSelectAllInSelection NSTextFinderActionSetSearchString NSTextFinderActionShowFindInterface NSTextFinderActionShowReplaceInterface NSTextFinderMatchingTypeContains NSTextFinderMatchingTypeEndsWith NSTextFinderMatchingTypeFullWord NSTextFinderMatchingTypeStartsWith NSTextLayoutOrientationHorizontal NSTextLayoutOrientationVertical NSTextListPrependEnclosingMarker NSTextReadInapplicableDocumentTypeError NSTextReadWriteErrorMaximum NSTextReadWriteErrorMinimum NSTextStorageEditedAttributes NSTextStorageEditedCharacters NSTextTableAutomaticLayoutAlgorithm NSTextTableFixedLayoutAlgorithm NSTextWriteInapplicableDocumentTypeError NSTextWritingDirectionEmbedding NSTextWritingDirectionOverride NSTexturedBackgroundWindowMask NSTexturedRoundedBezelStyle NSTexturedSquareBezelStyle NSThickSquareBezelStyle NSThickerSquareBezelStyle NSTickMarkAbove NSTickMarkBelow NSTickMarkLeft NSTickMarkRight NSTimeZoneCalendarUnit NSTimeZoneDatePickerElementFlag NSTimeZoneNameStyleDaylightSaving NSTimeZoneNameStyleGeneric NSTimeZoneNameStyleShortDaylightSaving NSTimeZoneNameStyleShortGeneric NSTimeZoneNameStyleShortStandard NSTimeZoneNameStyleStandard NSTitledWindowMask NSToggleButton NSToolbarItemVisibilityPriorityHigh NSToolbarItemVisibilityPriorityLow NSToolbarItemVisibilityPriorityStandard NSToolbarItemVisibilityPriorityUser NSTopTabsBezelBorder NSTouchEventSubtype NSTouchPhaseAny NSTouchPhaseBegan NSTouchPhaseCancelled NSTouchPhaseEnded NSTouchPhaseMoved NSTouchPhaseStationary NSTouchPhaseTouching NSTrackModeMatrix NSTrackingActiveAlways NSTrackingActiveInActiveApp NSTrackingActiveInKeyWindow NSTrackingActiveWhenFirstResponder NSTrackingAssumeInside NSTrackingCursorUpdate NSTrackingEnabledDuringMouseDrag NSTrackingInVisibleRect NSTrackingMouseEnteredAndExited NSTrackingMouseMoved NSTransformEntityMappingType NSTrashDirectory NSTwoByteGlyphPacking NSTypesetterBehavior_10_2 NSTypesetterBehavior_10_2_WithCompatibility NSTypesetterBehavior_10_3 NSTypesetterBehavior_10_4 NSTypesetterContainerBreakAction NSTypesetterHorizontalTabAction NSTypesetterLatestBehavior NSTypesetterLineBreakAction NSTypesetterOriginalBehavior NSTypesetterParagraphBreakAction NSTypesetterWhitespaceAction NSTypesetterZeroAdvancementAction NSURLBookmarkCreationMinimalBookmark NSURLBookmarkCreationPreferFileIDResolution NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess NSURLBookmarkCreationSuitableForBookmarkFile NSURLBookmarkCreationWithSecurityScope NSURLBookmarkResolutionWithSecurityScope NSURLBookmarkResolutionWithoutMounting NSURLBookmarkResolutionWithoutUI NSURLCredentialPersistenceForSession NSURLCredentialPersistenceNone NSURLCredentialPersistencePermanent NSURLCredentialPersistenceSynchronizable NSURLHandleLoadFailed NSURLHandleLoadInProgress NSURLHandleLoadSucceeded NSURLHandleNotLoaded NSURLSessionAuthChallengeCancelAuthenticationChallenge NSURLSessionAuthChallengePerformDefaultHandling NSURLSessionAuthChallengeRejectProtectionSpace NSURLSessionAuthChallengeUseCredential NSURLSessionResponseAllow NSURLSessionResponseBecomeDownload NSURLSessionResponseCancel NSURLSessionTaskStateCanceling NSURLSessionTaskStateCompleted NSURLSessionTaskStateRunning NSURLSessionTaskStateSuspended NSUTF16BigEndianStringEncoding NSUTF16LittleEndianStringEncoding NSUTF16StringEncoding NSUTF32BigEndianStringEncoding NSUTF32LittleEndianStringEncoding NSUTF32StringEncoding NSUTF8StringEncoding NSUbiquitousFileErrorMaximum NSUbiquitousFileErrorMinimum NSUbiquitousFileNotUploadedDueToQuotaError NSUbiquitousFileUbiquityServerNotAvailable NSUbiquitousFileUnavailableError NSUbiquitousKeyValueStoreAccountChange NSUbiquitousKeyValueStoreInitialSyncChange NSUbiquitousKeyValueStoreQuotaViolationChange NSUbiquitousKeyValueStoreServerChange NSUnboldFontMask NSUncachedRead NSUndefinedDateComponent NSUndefinedEntityMappingType NSUnderlineByWord NSUnderlinePatternDash NSUnderlinePatternDashDot NSUnderlinePatternDashDotDot NSUnderlinePatternDot NSUnderlinePatternSolid NSUnderlineStyleDouble NSUnderlineStyleNone NSUnderlineStyleSingle NSUnderlineStyleThick NSUndoCloseGroupingRunLoopOrdering NSUndoFunctionKey NSUnicodeStringEncoding NSUnifiedTitleAndToolbarWindowMask NSUnionSetExpressionType NSUnitalicFontMask NSUnknownColorSpaceModel NSUnknownKeyScriptError NSUnknownKeySpecifierError NSUnknownPageOrder NSUnknownPointingDevice NSUnscaledWindowMask NSUpArrowFunctionKey NSUpTextMovement NSUpdateWindowsRunLoopOrdering NSUserCancelledError NSUserDirectory NSUserDomainMask NSUserFunctionKey NSUserInterfaceLayoutDirectionLeftToRight NSUserInterfaceLayoutDirectionRightToLeft NSUserInterfaceLayoutOrientationHorizontal NSUserInterfaceLayoutOrientationVertical NSUserNotificationActivationTypeActionButtonClicked NSUserNotificationActivationTypeContentsClicked NSUserNotificationActivationTypeNone NSUserNotificationActivationTypeReplied NSUtilityWindowMask NSValidationDateTooLateError NSValidationDateTooSoonError NSValidationErrorMaximum NSValidationErrorMinimum NSValidationInvalidDateError NSValidationMissingMandatoryPropertyError NSValidationMultipleErrorsError NSValidationNumberTooLargeError NSValidationNumberTooSmallError NSValidationRelationshipDeniedDeleteError NSValidationRelationshipExceedsMaximumCountError NSValidationRelationshipLacksMinimumCountError NSValidationStringPatternMatchingError NSValidationStringTooLongError NSValidationStringTooShortError NSVariableExpressionType NSVerticalRuler NSViaPanelFontAction NSViewHeightSizable NSViewLayerContentsPlacementBottom NSViewLayerContentsPlacementBottomLeft NSViewLayerContentsPlacementBottomRight NSViewLayerContentsPlacementCenter NSViewLayerContentsPlacementLeft NSViewLayerContentsPlacementRight NSViewLayerContentsPlacementScaleAxesIndependently NSViewLayerContentsPlacementScaleProportionallyToFill NSViewLayerContentsPlacementScaleProportionallyToFit NSViewLayerContentsPlacementTop NSViewLayerContentsPlacementTopLeft NSViewLayerContentsPlacementTopRight NSViewLayerContentsRedrawBeforeViewResize NSViewLayerContentsRedrawCrossfade NSViewLayerContentsRedrawDuringViewResize NSViewLayerContentsRedrawNever NSViewLayerContentsRedrawOnSetNeedsDisplay NSViewMaxXMargin NSViewMaxYMargin NSViewMinXMargin NSViewMinYMargin NSViewNotSizable NSViewWidthSizable NSVolumeEnumerationProduceFileReferenceURLs NSVolumeEnumerationSkipHiddenVolumes NSWantsBidiLevels NSWarningAlertStyle NSWeekCalendarUnit NSWeekOfMonthCalendarUnit NSWeekOfYearCalendarUnit NSWeekdayCalendarUnit NSWeekdayOrdinalCalendarUnit NSWheelModeColorPanel NSWidthInsensitiveSearch NSWindowAbove NSWindowAnimationBehaviorAlertPanel NSWindowAnimationBehaviorDefault NSWindowAnimationBehaviorDocumentWindow NSWindowAnimationBehaviorNone NSWindowAnimationBehaviorUtilityWindow NSWindowBackingLocationDefault NSWindowBackingLocationMainMemory NSWindowBackingLocationVideoMemory NSWindowBelow NSWindowCloseButton NSWindowCollectionBehaviorCanJoinAllSpaces NSWindowCollectionBehaviorDefault NSWindowCollectionBehaviorFullScreenAuxiliary NSWindowCollectionBehaviorFullScreenPrimary NSWindowCollectionBehaviorIgnoresCycle NSWindowCollectionBehaviorManaged NSWindowCollectionBehaviorMoveToActiveSpace NSWindowCollectionBehaviorParticipatesInCycle NSWindowCollectionBehaviorStationary NSWindowCollectionBehaviorTransient NSWindowDepthOnehundredtwentyeightBitRGB NSWindowDepthSixtyfourBitRGB NSWindowDepthTwentyfourBitRGB NSWindowDocumentIconButton NSWindowDocumentVersionsButton NSWindowExposedEventType NSWindowFullScreenButton NSWindowMiniaturizeButton NSWindowMovedEventType NSWindowNumberListAllApplications NSWindowNumberListAllSpaces NSWindowOcclusionStateVisible NSWindowOut NSWindowSharingNone NSWindowSharingReadOnly NSWindowSharingReadWrite NSWindowToolbarButton NSWindowZoomButton NSWindows95InterfaceStyle NSWindows95OperatingSystem NSWindowsCP1250StringEncoding NSWindowsCP1251StringEncoding NSWindowsCP1252StringEncoding NSWindowsCP1253StringEncoding NSWindowsCP1254StringEncoding NSWindowsNTOperatingSystem NSWorkspaceLaunchAllowingClassicStartup NSWorkspaceLaunchAndHide NSWorkspaceLaunchAndHideOthers NSWorkspaceLaunchAndPrint NSWorkspaceLaunchAsync NSWorkspaceLaunchDefault NSWorkspaceLaunchInhibitingBackgroundOnly NSWorkspaceLaunchNewInstance NSWorkspaceLaunchPreferringClassic NSWorkspaceLaunchWithErrorPresentation NSWorkspaceLaunchWithoutActivation NSWorkspaceLaunchWithoutAddingToRecents NSWrapCalendarComponents NSWritingDirectionLeftToRight NSWritingDirectionNatural NSWritingDirectionRightToLeft NSXMLAttributeCDATAKind NSXMLAttributeDeclarationKind NSXMLAttributeEntitiesKind NSXMLAttributeEntityKind NSXMLAttributeEnumerationKind NSXMLAttributeIDKind NSXMLAttributeIDRefKind NSXMLAttributeIDRefsKind NSXMLAttributeKind NSXMLAttributeNMTokenKind NSXMLAttributeNMTokensKind NSXMLAttributeNotationKind NSXMLCommentKind NSXMLDTDKind NSXMLDocumentHTMLKind NSXMLDocumentIncludeContentTypeDeclaration NSXMLDocumentKind NSXMLDocumentTextKind NSXMLDocumentTidyHTML NSXMLDocumentTidyXML NSXMLDocumentValidate NSXMLDocumentXHTMLKind NSXMLDocumentXInclude NSXMLDocumentXMLKind NSXMLElementDeclarationAnyKind NSXMLElementDeclarationElementKind NSXMLElementDeclarationEmptyKind NSXMLElementDeclarationKind NSXMLElementDeclarationMixedKind NSXMLElementDeclarationUndefinedKind NSXMLElementKind NSXMLEntityDeclarationKind NSXMLEntityGeneralKind NSXMLEntityParameterKind NSXMLEntityParsedKind NSXMLEntityPredefined NSXMLEntityUnparsedKind NSXMLInvalidKind NSXMLNamespaceKind NSXMLNodeCompactEmptyElement NSXMLNodeExpandEmptyElement NSXMLNodeIsCDATA NSXMLNodeLoadExternalEntitiesAlways NSXMLNodeLoadExternalEntitiesNever NSXMLNodeLoadExternalEntitiesSameOriginOnly NSXMLNodeNeverEscapeContents NSXMLNodeOptionsNone NSXMLNodePreserveAll NSXMLNodePreserveAttributeOrder NSXMLNodePreserveCDATA NSXMLNodePreserveCharacterReferences NSXMLNodePreserveDTD NSXMLNodePreserveEmptyElements NSXMLNodePreserveEntities NSXMLNodePreserveNamespaceOrder NSXMLNodePreservePrefixes NSXMLNodePreserveQuotes NSXMLNodePreserveWhitespace NSXMLNodePrettyPrint NSXMLNodePromoteSignificantWhitespace NSXMLNodeUseDoubleQuotes NSXMLNodeUseSingleQuotes NSXMLNotationDeclarationKind NSXMLParserAttributeHasNoValueError NSXMLParserAttributeListNotFinishedError NSXMLParserAttributeListNotStartedError NSXMLParserAttributeNotFinishedError NSXMLParserAttributeNotStartedError NSXMLParserAttributeRedefinedError NSXMLParserCDATANotFinishedError NSXMLParserCharacterRefAtEOFError NSXMLParserCharacterRefInDTDError NSXMLParserCharacterRefInEpilogError NSXMLParserCharacterRefInPrologError NSXMLParserCommentContainsDoubleHyphenError NSXMLParserCommentNotFinishedError NSXMLParserConditionalSectionNotFinishedError NSXMLParserConditionalSectionNotStartedError NSXMLParserDOCTYPEDeclNotFinishedError NSXMLParserDelegateAbortedParseError NSXMLParserDocumentStartError NSXMLParserElementContentDeclNotFinishedError NSXMLParserElementContentDeclNotStartedError NSXMLParserEmptyDocumentError NSXMLParserEncodingNotSupportedError NSXMLParserEntityBoundaryError NSXMLParserEntityIsExternalError NSXMLParserEntityIsParameterError NSXMLParserEntityNotFinishedError NSXMLParserEntityNotStartedError NSXMLParserEntityRefAtEOFError NSXMLParserEntityRefInDTDError NSXMLParserEntityRefInEpilogError NSXMLParserEntityRefInPrologError NSXMLParserEntityRefLoopError NSXMLParserEntityReferenceMissingSemiError NSXMLParserEntityReferenceWithoutNameError NSXMLParserEntityValueRequiredError NSXMLParserEqualExpectedError NSXMLParserExternalStandaloneEntityError NSXMLParserExternalSubsetNotFinishedError NSXMLParserExtraContentError NSXMLParserGTRequiredError NSXMLParserInternalError NSXMLParserInvalidCharacterError NSXMLParserInvalidCharacterInEntityError NSXMLParserInvalidCharacterRefError NSXMLParserInvalidConditionalSectionError NSXMLParserInvalidDecimalCharacterRefError NSXMLParserInvalidEncodingError NSXMLParserInvalidEncodingNameError NSXMLParserInvalidHexCharacterRefError NSXMLParserInvalidURIError NSXMLParserLTRequiredError NSXMLParserLTSlashRequiredError NSXMLParserLessThanSymbolInAttributeError NSXMLParserLiteralNotFinishedError NSXMLParserLiteralNotStartedError NSXMLParserMisplacedCDATAEndStringError NSXMLParserMisplacedXMLDeclarationError NSXMLParserMixedContentDeclNotFinishedError NSXMLParserMixedContentDeclNotStartedError NSXMLParserNAMERequiredError NSXMLParserNMTOKENRequiredError NSXMLParserNamespaceDeclarationError NSXMLParserNoDTDError NSXMLParserNotWellBalancedError NSXMLParserNotationNotFinishedError NSXMLParserNotationNotStartedError NSXMLParserOutOfMemoryError NSXMLParserPCDATARequiredError NSXMLParserParsedEntityRefAtEOFError NSXMLParserParsedEntityRefInEpilogError NSXMLParserParsedEntityRefInInternalError NSXMLParserParsedEntityRefInInternalSubsetError NSXMLParserParsedEntityRefInPrologError NSXMLParserParsedEntityRefMissingSemiError NSXMLParserParsedEntityRefNoNameError NSXMLParserPrematureDocumentEndError NSXMLParserProcessingInstructionNotFinishedError NSXMLParserProcessingInstructionNotStartedError NSXMLParserPublicIdentifierRequiredError NSXMLParserResolveExternalEntitiesAlways NSXMLParserResolveExternalEntitiesNever NSXMLParserResolveExternalEntitiesNoNetwork NSXMLParserResolveExternalEntitiesSameOriginOnly NSXMLParserSeparatorRequiredError NSXMLParserSpaceRequiredError NSXMLParserStandaloneValueError NSXMLParserStringNotClosedError NSXMLParserStringNotStartedError NSXMLParserTagNameMismatchError NSXMLParserURIFragmentError NSXMLParserURIRequiredError NSXMLParserUndeclaredEntityError NSXMLParserUnfinishedTagError NSXMLParserUnknownEncodingError NSXMLParserUnparsedEntityError NSXMLParserXMLDeclNotFinishedError NSXMLParserXMLDeclNotStartedError NSXMLProcessingInstructionKind NSXMLTextKind NSXPCConnectionErrorMaximum NSXPCConnectionErrorMinimum NSXPCConnectionInterrupted NSXPCConnectionInvalid NSXPCConnectionPrivileged NSXPCConnectionReplyInvalid NSYearCalendarUnit NSYearForWeekOfYearCalendarUnit NSYearMonthDatePickerElementFlag NSYearMonthDayDatePickerElementFlag UIAccessibilityNavigationStyleAutomatic UIAccessibilityNavigationStyleCombined UIAccessibilityNavigationStyleSeparate UIAccessibilityScrollDirectionDown UIAccessibilityScrollDirectionLeft UIAccessibilityScrollDirectionNext UIAccessibilityScrollDirectionPrevious UIAccessibilityScrollDirectionRight UIAccessibilityScrollDirectionUp UIAccessibilityZoomTypeInsertionPoint UIActionSheetStyleAutomatic UIActionSheetStyleBlackOpaque UIActionSheetStyleBlackTranslucent UIActionSheetStyleDefault UIActivityCategoryAction UIActivityCategoryShare UIActivityIndicatorViewStyleGray UIActivityIndicatorViewStyleWhite UIActivityIndicatorViewStyleWhiteLarge UIAlertActionStyleCancel UIAlertActionStyleDefault UIAlertActionStyleDestructive UIAlertControllerStyleActionSheet UIAlertControllerStyleAlert UIAlertViewStyleDefault UIAlertViewStyleLoginAndPasswordInput UIAlertViewStylePlainTextInput UIAlertViewStyleSecureTextInput UIApplicationStateActive UIApplicationStateBackground UIApplicationStateInactive UIAttachmentBehaviorTypeAnchor UIAttachmentBehaviorTypeItems UIBackgroundFetchResultFailed UIBackgroundFetchResultNewData UIBackgroundFetchResultNoData UIBackgroundRefreshStatusAvailable UIBackgroundRefreshStatusDenied UIBackgroundRefreshStatusRestricted UIBarButtonItemStyleBordered UIBarButtonItemStyleDone UIBarButtonItemStylePlain UIBarButtonSystemItemAction UIBarButtonSystemItemAdd UIBarButtonSystemItemBookmarks UIBarButtonSystemItemCamera UIBarButtonSystemItemCancel UIBarButtonSystemItemCompose UIBarButtonSystemItemDone UIBarButtonSystemItemEdit UIBarButtonSystemItemFastForward UIBarButtonSystemItemFixedSpace UIBarButtonSystemItemFlexibleSpace UIBarButtonSystemItemOrganize UIBarButtonSystemItemPageCurl UIBarButtonSystemItemPause UIBarButtonSystemItemPlay UIBarButtonSystemItemRedo UIBarButtonSystemItemRefresh UIBarButtonSystemItemReply UIBarButtonSystemItemRewind UIBarButtonSystemItemSave UIBarButtonSystemItemSearch UIBarButtonSystemItemStop UIBarButtonSystemItemTrash UIBarButtonSystemItemUndo UIBarMetricsCompact UIBarMetricsCompactPrompt UIBarMetricsDefault UIBarMetricsDefaultPrompt UIBarMetricsLandscapePhone UIBarMetricsLandscapePhonePrompt UIBarPositionAny UIBarPositionBottom UIBarPositionTop UIBarPositionTopAttached UIBarStyleBlack UIBarStyleBlackOpaque UIBarStyleBlackTranslucent UIBarStyleDefault UIBaselineAdjustmentAlignBaselines UIBaselineAdjustmentAlignCenters UIBaselineAdjustmentNone UIBlurEffectStyleDark UIBlurEffectStyleExtraLight UIBlurEffectStyleLight UIButtonTypeContactAdd UIButtonTypeCustom UIButtonTypeDetailDisclosure UIButtonTypeInfoDark UIButtonTypeInfoLight UIButtonTypeRoundedRect UIButtonTypeSystem UICollectionElementCategoryCell UICollectionElementCategoryDecorationView UICollectionElementCategorySupplementaryView UICollectionUpdateActionDelete UICollectionUpdateActionInsert UICollectionUpdateActionMove UICollectionUpdateActionNone UICollectionUpdateActionReload UICollectionViewScrollDirectionHorizontal UICollectionViewScrollDirectionVertical UICollectionViewScrollPositionBottom UICollectionViewScrollPositionCenteredHorizontally UICollectionViewScrollPositionCenteredVertically UICollectionViewScrollPositionLeft UICollectionViewScrollPositionNone UICollectionViewScrollPositionRight UICollectionViewScrollPositionTop UICollisionBehaviorModeBoundaries UICollisionBehaviorModeEverything UICollisionBehaviorModeItems UIControlContentHorizontalAlignmentCenter UIControlContentHorizontalAlignmentFill UIControlContentHorizontalAlignmentLeft UIControlContentHorizontalAlignmentRight UIControlContentVerticalAlignmentBottom UIControlContentVerticalAlignmentCenter UIControlContentVerticalAlignmentFill UIControlContentVerticalAlignmentTop UIControlEventAllEditingEvents UIControlEventAllEvents UIControlEventAllTouchEvents UIControlEventApplicationReserved UIControlEventEditingChanged UIControlEventEditingDidBegin UIControlEventEditingDidEnd UIControlEventEditingDidEndOnExit UIControlEventSystemReserved UIControlEventTouchCancel UIControlEventTouchDown UIControlEventTouchDownRepeat UIControlEventTouchDragEnter UIControlEventTouchDragExit UIControlEventTouchDragInside UIControlEventTouchDragOutside UIControlEventTouchUpInside UIControlEventTouchUpOutside UIControlEventValueChanged UIControlStateApplication UIControlStateDisabled UIControlStateHighlighted UIControlStateNormal UIControlStateReserved UIControlStateSelected UIDataDetectorTypeAddress UIDataDetectorTypeAll UIDataDetectorTypeCalendarEvent UIDataDetectorTypeLink UIDataDetectorTypeNone UIDataDetectorTypePhoneNumber UIDatePickerModeCountDownTimer UIDatePickerModeDate UIDatePickerModeDateAndTime UIDatePickerModeTime UIDeviceBatteryStateCharging UIDeviceBatteryStateFull UIDeviceBatteryStateUnknown UIDeviceBatteryStateUnplugged UIDeviceOrientationFaceDown UIDeviceOrientationFaceUp UIDeviceOrientationLandscapeLeft UIDeviceOrientationLandscapeRight UIDeviceOrientationPortrait UIDeviceOrientationPortraitUpsideDown UIDeviceOrientationUnknown UIDocumentChangeCleared UIDocumentChangeDone UIDocumentChangeRedone UIDocumentChangeUndone UIDocumentMenuOrderFirst UIDocumentMenuOrderLast UIDocumentPickerModeExportToService UIDocumentPickerModeImport UIDocumentPickerModeMoveToService UIDocumentPickerModeOpen UIDocumentSaveForCreating UIDocumentSaveForOverwriting UIDocumentStateClosed UIDocumentStateEditingDisabled UIDocumentStateInConflict UIDocumentStateNormal UIDocumentStateSavingError UIEventSubtypeMotionShake UIEventSubtypeNone UIEventSubtypeRemoteControlBeginSeekingBackward UIEventSubtypeRemoteControlBeginSeekingForward UIEventSubtypeRemoteControlEndSeekingBackward UIEventSubtypeRemoteControlEndSeekingForward UIEventSubtypeRemoteControlNextTrack UIEventSubtypeRemoteControlPause UIEventSubtypeRemoteControlPlay UIEventSubtypeRemoteControlPreviousTrack UIEventSubtypeRemoteControlStop UIEventSubtypeRemoteControlTogglePlayPause UIEventTypeMotion UIEventTypeRemoteControl UIEventTypeTouches UIFontDescriptorClassClarendonSerifs UIFontDescriptorClassFreeformSerifs UIFontDescriptorClassMask UIFontDescriptorClassModernSerifs UIFontDescriptorClassOldStyleSerifs UIFontDescriptorClassOrnamentals UIFontDescriptorClassSansSerif UIFontDescriptorClassScripts UIFontDescriptorClassSlabSerifs UIFontDescriptorClassSymbolic UIFontDescriptorClassTransitionalSerifs UIFontDescriptorClassUnknown UIFontDescriptorSymbolicTraits UIFontDescriptorTraitBold UIFontDescriptorTraitCondensed UIFontDescriptorTraitExpanded UIFontDescriptorTraitItalic UIFontDescriptorTraitLooseLeading UIFontDescriptorTraitMonoSpace UIFontDescriptorTraitTightLeading UIFontDescriptorTraitUIOptimized UIFontDescriptorTraitVertical UIGestureRecognizerStateBegan UIGestureRecognizerStateCancelled UIGestureRecognizerStateChanged UIGestureRecognizerStateEnded UIGestureRecognizerStateFailed UIGestureRecognizerStatePossible UIGestureRecognizerStateRecognized UIGuidedAccessRestrictionStateAllow UIGuidedAccessRestrictionStateDeny UIImageOrientationDown UIImageOrientationDownMirrored UIImageOrientationLeft UIImageOrientationLeftMirrored UIImageOrientationRight UIImageOrientationRightMirrored UIImageOrientationUp UIImageOrientationUpMirrored UIImagePickerControllerCameraCaptureModePhoto UIImagePickerControllerCameraCaptureModeVideo UIImagePickerControllerCameraDeviceFront UIImagePickerControllerCameraDeviceRear UIImagePickerControllerCameraFlashModeAuto UIImagePickerControllerCameraFlashModeOff UIImagePickerControllerCameraFlashModeOn UIImagePickerControllerQualityType640x480 UIImagePickerControllerQualityTypeHigh UIImagePickerControllerQualityTypeIFrame1280x720 UIImagePickerControllerQualityTypeIFrame960x540 UIImagePickerControllerQualityTypeLow UIImagePickerControllerQualityTypeMedium UIImagePickerControllerSourceTypeCamera UIImagePickerControllerSourceTypePhotoLibrary UIImagePickerControllerSourceTypeSavedPhotosAlbum UIImageRenderingModeAlwaysOriginal UIImageRenderingModeAlwaysTemplate UIImageRenderingModeAutomatic UIImageResizingModeStretch UIImageResizingModeTile UIInputViewStyleDefault UIInputViewStyleKeyboard UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationMaskAll UIInterfaceOrientationMaskAllButUpsideDown UIInterfaceOrientationMaskLandscape UIInterfaceOrientationMaskLandscapeLeft UIInterfaceOrientationMaskLandscapeRight UIInterfaceOrientationMaskPortrait UIInterfaceOrientationMaskPortraitUpsideDown UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationUnknown UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis UIKeyModifierAlphaShift UIKeyModifierAlternate UIKeyModifierCommand UIKeyModifierControl UIKeyModifierNumericPad UIKeyModifierShift UIKeyboardAppearanceAlert UIKeyboardAppearanceDark UIKeyboardAppearanceDefault UIKeyboardAppearanceLight UIKeyboardTypeASCIICapable UIKeyboardTypeAlphabet UIKeyboardTypeDecimalPad UIKeyboardTypeDefault UIKeyboardTypeEmailAddress UIKeyboardTypeNamePhonePad UIKeyboardTypeNumberPad UIKeyboardTypeNumbersAndPunctuation UIKeyboardTypePhonePad UIKeyboardTypeTwitter UIKeyboardTypeURL UIKeyboardTypeWebSearch UILayoutConstraintAxisHorizontal UILayoutConstraintAxisVertical UILineBreakModeCharacterWrap UILineBreakModeClip UILineBreakModeHeadTruncation UILineBreakModeMiddleTruncation UILineBreakModeTailTruncation UILineBreakModeWordWrap UIMenuControllerArrowDefault UIMenuControllerArrowDown UIMenuControllerArrowLeft UIMenuControllerArrowRight UIMenuControllerArrowUp UIModalPresentationCurrentContext UIModalPresentationCustom UIModalPresentationFormSheet UIModalPresentationFullScreen UIModalPresentationNone UIModalPresentationOverCurrentContext UIModalPresentationOverFullScreen UIModalPresentationPageSheet UIModalPresentationPopover UIModalTransitionStyleCoverVertical UIModalTransitionStyleCrossDissolve UIModalTransitionStyleFlipHorizontal UIModalTransitionStylePartialCurl UINavigationControllerOperationNone UINavigationControllerOperationPop UINavigationControllerOperationPush UIPageViewControllerNavigationDirectionForward UIPageViewControllerNavigationDirectionReverse UIPageViewControllerNavigationOrientationHorizontal UIPageViewControllerNavigationOrientationVertical UIPageViewControllerSpineLocationMax UIPageViewControllerSpineLocationMid UIPageViewControllerSpineLocationMin UIPageViewControllerSpineLocationNone UIPageViewControllerTransitionStylePageCurl UIPageViewControllerTransitionStyleScroll UIPopoverArrowDirectionAny UIPopoverArrowDirectionDown UIPopoverArrowDirectionLeft UIPopoverArrowDirectionRight UIPopoverArrowDirectionUnknown UIPopoverArrowDirectionUp UIPrintInfoDuplexLongEdge UIPrintInfoDuplexNone UIPrintInfoDuplexShortEdge UIPrintInfoOrientationLandscape UIPrintInfoOrientationPortrait UIPrintInfoOutputGeneral UIPrintInfoOutputGrayscale UIPrintInfoOutputPhoto UIPrintInfoOutputPhotoGrayscale UIPrintJobFailedError UIPrintNoContentError UIPrintUnknownImageFormatError UIPrinterJobTypeDocument UIPrinterJobTypeEnvelope UIPrinterJobTypeLabel UIPrinterJobTypeLargeFormat UIPrinterJobTypePhoto UIPrinterJobTypePostcard UIPrinterJobTypeReceipt UIPrinterJobTypeRoll UIPrinterJobTypeUnknown UIPrintingNotAvailableError UIProgressViewStyleBar UIProgressViewStyleDefault UIPushBehaviorModeContinuous UIPushBehaviorModeInstantaneous UIRectCornerAllCorners UIRectCornerBottomLeft UIRectCornerBottomRight UIRectCornerTopLeft UIRectCornerTopRight UIRectEdgeAll UIRectEdgeBottom UIRectEdgeLeft UIRectEdgeNone UIRectEdgeRight UIRectEdgeTop UIRemoteNotificationTypeAlert UIRemoteNotificationTypeBadge UIRemoteNotificationTypeNewsstandContentAvailability UIRemoteNotificationTypeNone UIRemoteNotificationTypeSound UIReturnKeyDefault UIReturnKeyDone UIReturnKeyEmergencyCall UIReturnKeyGo UIReturnKeyGoogle UIReturnKeyJoin UIReturnKeyNext UIReturnKeyRoute UIReturnKeySearch UIReturnKeySend UIReturnKeyYahoo UIScreenOverscanCompensationInsetApplicationFrame UIScreenOverscanCompensationInsetBounds UIScreenOverscanCompensationScale UIScrollViewIndicatorStyleBlack UIScrollViewIndicatorStyleDefault UIScrollViewIndicatorStyleWhite UIScrollViewKeyboardDismissModeInteractive UIScrollViewKeyboardDismissModeNone UIScrollViewKeyboardDismissModeOnDrag UISearchBarIconBookmark UISearchBarIconClear UISearchBarIconResultsList UISearchBarIconSearch UISearchBarStyleDefault UISearchBarStyleMinimal UISearchBarStyleProminent UISegmentedControlNoSegment UISegmentedControlSegmentAlone UISegmentedControlSegmentAny UISegmentedControlSegmentCenter UISegmentedControlSegmentLeft UISegmentedControlSegmentRight UISegmentedControlStyleBar UISegmentedControlStyleBezeled UISegmentedControlStyleBordered UISegmentedControlStylePlain UISplitViewControllerDisplayModeAllVisible UISplitViewControllerDisplayModeAutomatic UISplitViewControllerDisplayModePrimaryHidden UISplitViewControllerDisplayModePrimaryOverlay UIStatusBarAnimationFade UIStatusBarAnimationNone UIStatusBarAnimationSlide UIStatusBarStyleBlackOpaque UIStatusBarStyleBlackTranslucent UIStatusBarStyleDefault UIStatusBarStyleLightContent UISwipeGestureRecognizerDirectionDown UISwipeGestureRecognizerDirectionLeft UISwipeGestureRecognizerDirectionRight UISwipeGestureRecognizerDirectionUp UISystemAnimationDelete UITabBarItemPositioningAutomatic UITabBarItemPositioningCentered UITabBarItemPositioningFill UITabBarSystemItemBookmarks UITabBarSystemItemContacts UITabBarSystemItemDownloads UITabBarSystemItemFavorites UITabBarSystemItemFeatured UITabBarSystemItemHistory UITabBarSystemItemMore UITabBarSystemItemMostRecent UITabBarSystemItemMostViewed UITabBarSystemItemRecents UITabBarSystemItemSearch UITabBarSystemItemTopRated UITableViewCellAccessoryCheckmark UITableViewCellAccessoryDetailButton UITableViewCellAccessoryDetailDisclosureButton UITableViewCellAccessoryDisclosureIndicator UITableViewCellAccessoryNone UITableViewCellEditingStyleDelete UITableViewCellEditingStyleInsert UITableViewCellEditingStyleNone UITableViewCellSelectionStyleBlue UITableViewCellSelectionStyleDefault UITableViewCellSelectionStyleGray UITableViewCellSelectionStyleNone UITableViewCellSeparatorStyleNone UITableViewCellSeparatorStyleSingleLine UITableViewCellSeparatorStyleSingleLineEtched UITableViewCellStateDefaultMask UITableViewCellStateShowingDeleteConfirmationMask UITableViewCellStateShowingEditControlMask UITableViewCellStyleDefault UITableViewCellStyleSubtitle UITableViewCellStyleValue1 UITableViewCellStyleValue2 UITableViewRowActionStyleDefault UITableViewRowActionStyleDestructive UITableViewRowActionStyleNormal UITableViewRowAnimationAutomatic UITableViewRowAnimationBottom UITableViewRowAnimationFade UITableViewRowAnimationLeft UITableViewRowAnimationMiddle UITableViewRowAnimationNone UITableViewRowAnimationRight UITableViewRowAnimationTop UITableViewScrollPositionBottom UITableViewScrollPositionMiddle UITableViewScrollPositionNone UITableViewScrollPositionTop UITableViewStyleGrouped UITableViewStylePlain UITextAlignmentCenter UITextAlignmentLeft UITextAlignmentRight UITextAutocapitalizationTypeAllCharacters UITextAutocapitalizationTypeNone UITextAutocapitalizationTypeSentences UITextAutocapitalizationTypeWords UITextAutocorrectionTypeDefault UITextAutocorrectionTypeNo UITextAutocorrectionTypeYes UITextBorderStyleBezel UITextBorderStyleLine UITextBorderStyleNone UITextBorderStyleRoundedRect UITextFieldViewModeAlways UITextFieldViewModeNever UITextFieldViewModeUnlessEditing UITextFieldViewModeWhileEditing UITextGranularityCharacter UITextGranularityDocument UITextGranularityLine UITextGranularityParagraph UITextGranularitySentence UITextGranularityWord UITextLayoutDirectionDown UITextLayoutDirectionLeft UITextLayoutDirectionRight UITextLayoutDirectionUp UITextSpellCheckingTypeDefault UITextSpellCheckingTypeNo UITextSpellCheckingTypeYes UITextStorageDirectionBackward UITextStorageDirectionForward UITextWritingDirectionLeftToRight UITextWritingDirectionNatural UITextWritingDirectionRightToLeft UITouchPhaseBegan UITouchPhaseCancelled UITouchPhaseEnded UITouchPhaseMoved UITouchPhaseStationary UIUserInterfaceIdiomPad UIUserInterfaceIdiomPhone UIUserInterfaceIdiomUnspecified UIUserInterfaceLayoutDirectionLeftToRight UIUserInterfaceLayoutDirectionRightToLeft UIUserInterfaceSizeClassCompact UIUserInterfaceSizeClassRegular UIUserInterfaceSizeClassUnspecified UIUserNotificationActionContextDefault UIUserNotificationActionContextMinimal UIUserNotificationActivationModeBackground UIUserNotificationActivationModeForeground UIUserNotificationTypeAlert UIUserNotificationTypeBadge UIUserNotificationTypeNone UIUserNotificationTypeSound UIViewAnimationCurveEaseIn UIViewAnimationCurveEaseInOut UIViewAnimationCurveEaseOut UIViewAnimationCurveLinear UIViewAnimationOptionAllowAnimatedContent UIViewAnimationOptionAllowUserInteraction UIViewAnimationOptionAutoreverse UIViewAnimationOptionBeginFromCurrentState UIViewAnimationOptionCurveEaseIn UIViewAnimationOptionCurveEaseInOut UIViewAnimationOptionCurveEaseOut UIViewAnimationOptionCurveLinear UIViewAnimationOptionLayoutSubviews UIViewAnimationOptionOverrideInheritedCurve UIViewAnimationOptionOverrideInheritedDuration UIViewAnimationOptionOverrideInheritedOptions UIViewAnimationOptionRepeat UIViewAnimationOptionShowHideTransitionViews UIViewAnimationOptionTransitionCrossDissolve UIViewAnimationOptionTransitionCurlDown UIViewAnimationOptionTransitionCurlUp UIViewAnimationOptionTransitionFlipFromBottom UIViewAnimationOptionTransitionFlipFromLeft UIViewAnimationOptionTransitionFlipFromRight UIViewAnimationOptionTransitionFlipFromTop UIViewAnimationOptionTransitionNone UIViewAnimationTransitionCurlDown UIViewAnimationTransitionCurlUp UIViewAnimationTransitionFlipFromLeft UIViewAnimationTransitionFlipFromRight UIViewAnimationTransitionNone UIViewAutoresizingFlexibleBottomMargin UIViewAutoresizingFlexibleHeight UIViewAutoresizingFlexibleLeftMargin UIViewAutoresizingFlexibleRightMargin UIViewAutoresizingFlexibleTopMargin UIViewAutoresizingFlexibleWidth UIViewAutoresizingNone UIViewContentModeBottom UIViewContentModeBottomLeft UIViewContentModeBottomRight UIViewContentModeCenter UIViewContentModeLeft UIViewContentModeRedraw UIViewContentModeRight UIViewContentModeScaleAspectFill UIViewContentModeScaleAspectFit UIViewContentModeScaleToFill UIViewContentModeTop UIViewContentModeTopLeft UIViewContentModeTopRight UIViewKeyframeAnimationOptionAllowUserInteraction UIViewKeyframeAnimationOptionAutoreverse UIViewKeyframeAnimationOptionBeginFromCurrentState UIViewKeyframeAnimationOptionCalculationModeCubic UIViewKeyframeAnimationOptionCalculationModeCubicPaced UIViewKeyframeAnimationOptionCalculationModeDiscrete UIViewKeyframeAnimationOptionCalculationModeLinear UIViewKeyframeAnimationOptionCalculationModePaced UIViewKeyframeAnimationOptionLayoutSubviews UIViewKeyframeAnimationOptionOverrideInheritedDuration UIViewKeyframeAnimationOptionOverrideInheritedOptions UIViewKeyframeAnimationOptionRepeat UIViewTintAdjustmentModeAutomatic UIViewTintAdjustmentModeDimmed UIViewTintAdjustmentModeNormal UIWebPaginationBreakingModeColumn UIWebPaginationBreakingModePage UIWebPaginationModeBottomToTop UIWebPaginationModeLeftToRight UIWebPaginationModeRightToLeft UIWebPaginationModeTopToBottom UIWebPaginationModeUnpaginated UIWebViewNavigationTypeBackForward UIWebViewNavigationTypeFormResubmitted UIWebViewNavigationTypeFormSubmitted UIWebViewNavigationTypeLinkClicked UIWebViewNavigationTypeOther UIWebViewNavigationTypeReload + +" Cocoa Notifications +syn keyword cocoaNotification containedin=objcMessage NSAccessibilityAnnouncementRequestedNotification NSAccessibilityApplicationActivatedNotification NSAccessibilityApplicationDeactivatedNotification NSAccessibilityApplicationHiddenNotification NSAccessibilityApplicationShownNotification NSAccessibilityCreatedNotification NSAccessibilityDrawerCreatedNotification NSAccessibilityFocusedUIElementChangedNotification NSAccessibilityFocusedWindowChangedNotification NSAccessibilityHelpTagCreatedNotification NSAccessibilityLayoutChangedNotification NSAccessibilityMainWindowChangedNotification NSAccessibilityMovedNotification NSAccessibilityResizedNotification NSAccessibilityRowCollapsedNotification NSAccessibilityRowCountChangedNotification NSAccessibilityRowExpandedNotification NSAccessibilitySelectedCellsChangedNotification NSAccessibilitySelectedChildrenChangedNotification NSAccessibilitySelectedChildrenMovedNotification NSAccessibilitySelectedColumnsChangedNotification NSAccessibilitySelectedRowsChangedNotification NSAccessibilitySelectedTextChangedNotification NSAccessibilitySheetCreatedNotification NSAccessibilityTitleChangedNotification NSAccessibilityUIElementDestroyedNotification NSAccessibilityUnitsChangedNotification NSAccessibilityValueChangedNotification NSAccessibilityWindowCreatedNotification NSAccessibilityWindowDeminiaturizedNotification NSAccessibilityWindowMiniaturizedNotification NSAccessibilityWindowMovedNotification NSAccessibilityWindowResizedNotification NSAnimationProgressMarkNotification NSAntialiasThresholdChangedNotification NSAppleEventManagerWillProcessFirstEventNotification NSApplicationDidBecomeActiveNotification NSApplicationDidChangeOcclusionStateNotification NSApplicationDidChangeScreenParametersNotification NSApplicationDidFinishLaunchingNotification NSApplicationDidFinishRestoringWindowsNotification NSApplicationDidHideNotification NSApplicationDidResignActiveNotification NSApplicationDidUnhideNotification NSApplicationDidUpdateNotification NSApplicationLaunchRemoteNotification NSApplicationLaunchUserNotification NSApplicationWillBecomeActiveNotification NSApplicationWillFinishLaunchingNotification NSApplicationWillHideNotification NSApplicationWillResignActiveNotification NSApplicationWillTerminateNotification NSApplicationWillUnhideNotification NSApplicationWillUpdateNotification NSBrowserColumnConfigurationDidChangeNotification NSBundleDidLoadNotification NSCalendarDayChangedNotification NSClassDescriptionNeededForClassNotification NSColorListDidChangeNotification NSColorPanelColorDidChangeNotification NSComboBoxSelectionDidChangeNotification NSComboBoxSelectionIsChangingNotification NSComboBoxWillDismissNotification NSComboBoxWillPopUpNotification NSConnectionDidDieNotification NSConnectionDidInitializeNotification NSContextHelpModeDidActivateNotification NSContextHelpModeDidDeactivateNotification NSControlTextDidBeginEditingNotification NSControlTextDidChangeNotification NSControlTextDidEndEditingNotification NSControlTintDidChangeNotification NSCurrentLocaleDidChangeNotification NSDidBecomeSingleThreadedNotification NSDistributedNotification NSDrawerDidCloseNotification NSDrawerDidOpenNotification NSDrawerWillCloseNotification NSDrawerWillOpenNotification NSFileHandleConnectionAcceptedNotification NSFileHandleDataAvailableNotification NSFileHandleNotification NSFileHandleReadCompletionNotification NSFileHandleReadToEndOfFileCompletionNotification NSFontCollectionDidChangeNotification NSFontSetChangedNotification NSHTTPCookieManagerAcceptPolicyChangedNotification NSHTTPCookieManagerCookiesChangedNotification NSImageRepRegistryDidChangeNotification NSKeyValueChangeNotification NSLocalNotification NSManagedObjectContextDidSaveNotification NSManagedObjectContextObjectsDidChangeNotification NSManagedObjectContextWillSaveNotification NSMenuDidAddItemNotification NSMenuDidBeginTrackingNotification NSMenuDidChangeItemNotification NSMenuDidEndTrackingNotification NSMenuDidRemoveItemNotification NSMenuDidSendActionNotification NSMenuWillSendActionNotification NSMetadataQueryDidFinishGatheringNotification NSMetadataQueryDidStartGatheringNotification NSMetadataQueryDidUpdateNotification NSMetadataQueryGatheringProgressNotification NSNotification NSOutlineViewColumnDidMoveNotification NSOutlineViewColumnDidResizeNotification NSOutlineViewItemDidCollapseNotification NSOutlineViewItemDidExpandNotification NSOutlineViewItemWillCollapseNotification NSOutlineViewItemWillExpandNotification NSOutlineViewSelectionDidChangeNotification NSOutlineViewSelectionIsChangingNotification NSPersistentStoreCoordinatorStoresDidChangeNotification NSPersistentStoreCoordinatorStoresWillChangeNotification NSPersistentStoreCoordinatorWillRemoveStoreNotification NSPersistentStoreDidImportUbiquitousContentChangesNotification NSPopUpButtonCellWillPopUpNotification NSPopUpButtonWillPopUpNotification NSPopoverDidCloseNotification NSPopoverDidShowNotification NSPopoverWillCloseNotification NSPopoverWillShowNotification NSPortDidBecomeInvalidNotification NSPreferencePaneCancelUnselectNotification NSPreferencePaneDoUnselectNotification NSPreferredScrollerStyleDidChangeNotification NSRuleEditorRowsDidChangeNotification NSScreenColorSpaceDidChangeNotification NSScrollViewDidEndLiveMagnifyNotification NSScrollViewDidEndLiveScrollNotification NSScrollViewDidLiveScrollNotification NSScrollViewWillStartLiveMagnifyNotification NSScrollViewWillStartLiveScrollNotification NSSpellCheckerDidChangeAutomaticDashSubstitutionNotification NSSpellCheckerDidChangeAutomaticQuoteSubstitutionNotification NSSpellCheckerDidChangeAutomaticSpellingCorrectionNotification NSSpellCheckerDidChangeAutomaticTextReplacementNotification NSSplitViewDidResizeSubviewsNotification NSSplitViewWillResizeSubviewsNotification NSSystemClockDidChangeNotification NSSystemColorsDidChangeNotification NSSystemTimeZoneDidChangeNotification NSTableViewColumnDidMoveNotification NSTableViewColumnDidResizeNotification NSTableViewSelectionDidChangeNotification NSTableViewSelectionIsChangingNotification NSTaskDidTerminateNotification NSTextAlternativesSelectedAlternativeStringNotification NSTextDidBeginEditingNotification NSTextDidChangeNotification NSTextDidEndEditingNotification NSTextInputContextKeyboardSelectionDidChangeNotification NSTextStorageDidProcessEditingNotification NSTextStorageWillProcessEditingNotification NSTextViewDidChangeSelectionNotification NSTextViewDidChangeTypingAttributesNotification NSTextViewWillChangeNotifyingTextViewNotification NSThreadWillExitNotification NSToolbarDidRemoveItemNotification NSToolbarWillAddItemNotification NSURLCredentialStorageChangedNotification NSUbiquitousKeyValueStoreDidChangeExternallyNotification NSUbiquityIdentityDidChangeNotification NSUndoManagerCheckpointNotification NSUndoManagerDidCloseUndoGroupNotification NSUndoManagerDidOpenUndoGroupNotification NSUndoManagerDidRedoChangeNotification NSUndoManagerDidUndoChangeNotification NSUndoManagerWillCloseUndoGroupNotification NSUndoManagerWillRedoChangeNotification NSUndoManagerWillUndoChangeNotification NSUserDefaultsDidChangeNotification NSUserNotification NSViewBoundsDidChangeNotification NSViewDidUpdateTrackingAreasNotification NSViewFocusDidChangeNotification NSViewFrameDidChangeNotification NSViewGlobalFrameDidChangeNotification NSWillBecomeMultiThreadedNotification NSWindowDidBecomeKeyNotification NSWindowDidBecomeMainNotification NSWindowDidChangeBackingPropertiesNotification NSWindowDidChangeOcclusionStateNotification NSWindowDidChangeScreenNotification NSWindowDidChangeScreenProfileNotification NSWindowDidDeminiaturizeNotification NSWindowDidEndLiveResizeNotification NSWindowDidEndSheetNotification NSWindowDidEnterFullScreenNotification NSWindowDidEnterVersionBrowserNotification NSWindowDidExitFullScreenNotification NSWindowDidExitVersionBrowserNotification NSWindowDidExposeNotification NSWindowDidMiniaturizeNotification NSWindowDidMoveNotification NSWindowDidResignKeyNotification NSWindowDidResignMainNotification NSWindowDidResizeNotification NSWindowDidUpdateNotification NSWindowWillBeginSheetNotification NSWindowWillCloseNotification NSWindowWillEnterFullScreenNotification NSWindowWillEnterVersionBrowserNotification NSWindowWillExitFullScreenNotification NSWindowWillExitVersionBrowserNotification NSWindowWillMiniaturizeNotification NSWindowWillMoveNotification NSWindowWillStartLiveResizeNotification NSWorkspaceActiveSpaceDidChangeNotification NSWorkspaceDidActivateApplicationNotification NSWorkspaceDidChangeFileLabelsNotification NSWorkspaceDidDeactivateApplicationNotification NSWorkspaceDidHideApplicationNotification NSWorkspaceDidLaunchApplicationNotification NSWorkspaceDidMountNotification NSWorkspaceDidPerformFileOperationNotification NSWorkspaceDidRenameVolumeNotification NSWorkspaceDidTerminateApplicationNotification NSWorkspaceDidUnhideApplicationNotification NSWorkspaceDidUnmountNotification NSWorkspaceDidWakeNotification NSWorkspaceScreensDidSleepNotification NSWorkspaceScreensDidWakeNotification NSWorkspaceSessionDidBecomeActiveNotification NSWorkspaceSessionDidResignActiveNotification NSWorkspaceWillLaunchApplicationNotification NSWorkspaceWillPowerOffNotification NSWorkspaceWillSleepNotification NSWorkspaceWillUnmountNotification UIAccessibilityAnnouncementDidFinishNotification UIAccessibilityBoldTextStatusDidChangeNotification UIAccessibilityClosedCaptioningStatusDidChangeNotification UIAccessibilityDarkerSystemColorsStatusDidChangeNotification UIAccessibilityGrayscaleStatusDidChangeNotification UIAccessibilityGuidedAccessStatusDidChangeNotification UIAccessibilityInvertColorsStatusDidChangeNotification UIAccessibilityMonoAudioStatusDidChangeNotification UIAccessibilityNotification UIAccessibilityReduceMotionStatusDidChangeNotification UIAccessibilityReduceTransparencyStatusDidChangeNotification UIAccessibilitySpeakScreenStatusDidChangeNotification UIAccessibilitySpeakSelectionStatusDidChangeNotification UIAccessibilitySwitchControlStatusDidChangeNotification UIApplicationBackgroundRefreshStatusDidChangeNotification UIApplicationDidBecomeActiveNotification UIApplicationDidChangeStatusBarFrameNotification UIApplicationDidChangeStatusBarOrientationNotification UIApplicationDidEnterBackgroundNotification UIApplicationDidFinishLaunchingNotification UIApplicationDidReceiveMemoryWarningNotification UIApplicationLaunchOptionsLocalNotification UIApplicationLaunchOptionsRemoteNotification UIApplicationSignificantTimeChangeNotification UIApplicationUserDidTakeScreenshotNotification UIApplicationWillChangeStatusBarFrameNotification UIApplicationWillChangeStatusBarOrientationNotification UIApplicationWillEnterForegroundNotification UIApplicationWillResignActiveNotification UIApplicationWillTerminateNotification UIContentSizeCategoryDidChangeNotification UIDeviceBatteryLevelDidChangeNotification UIDeviceBatteryStateDidChangeNotification UIDeviceOrientationDidChangeNotification UIDeviceProximityStateDidChangeNotification UIDocumentStateChangedNotification UIKeyboardDidChangeFrameNotification UIKeyboardDidHideNotification UIKeyboardDidShowNotification UIKeyboardWillChangeFrameNotification UIKeyboardWillHideNotification UIKeyboardWillShowNotification UILocalNotification UIMenuControllerDidHideMenuNotification UIMenuControllerDidShowMenuNotification UIMenuControllerMenuFrameDidChangeNotification UIMenuControllerWillHideMenuNotification UIMenuControllerWillShowMenuNotification UIPasteboardChangedNotification UIPasteboardRemovedNotification UIScreenBrightnessDidChangeNotification UIScreenDidConnectNotification UIScreenDidDisconnectNotification UIScreenModeDidChangeNotification UITableViewSelectionDidChangeNotification UITextFieldTextDidBeginEditingNotification UITextFieldTextDidChangeNotification UITextFieldTextDidEndEditingNotification UITextInputCurrentInputModeDidChangeNotification UITextViewTextDidBeginEditingNotification UITextViewTextDidChangeNotification UITextViewTextDidEndEditingNotification UIViewControllerShowDetailTargetDidChangeNotification UIWindowDidBecomeHiddenNotification UIWindowDidBecomeKeyNotification UIWindowDidBecomeVisibleNotification UIWindowDidResignKeyNotification + +hi link cocoaFunction Keyword +hi link cocoaClass Special +hi link cocoaProtocol cocoaClass +hi link cocoaType Type +hi link cocoaConstant Constant +hi link cocoaNotification Constant \ No newline at end of file diff --git a/sources_non_forked/cocoa.vim/after/syntax/objc_enhanced.vim b/sources_non_forked/cocoa.vim/after/syntax/objc_enhanced.vim new file mode 100644 index 00000000..6a56da0c --- /dev/null +++ b/sources_non_forked/cocoa.vim/after/syntax/objc_enhanced.vim @@ -0,0 +1,59 @@ +" Author: Michael Sanders (msanders42 [at] gmail [dot] com) +" Description: Better syntax highlighting for Objective-C files (part of the +" cocoa.vim plugin). +" Last Updated: June 23, 2009 + +" NOTE: This next file (cocoa_keywords.vim) is rather large and may slow +" things down. Loading it seems to take less than 0.5 microseconds +" on my machine, but I'm not sure of the consequences; if it is slow +" for you, just comment out the next line. +ru after/syntax/cocoa_keywords.vim + +syn match objcDirective '@synthesize\|@property\|@optional\|@required' display +syn keyword objcType IBOutlet IBAction Method +syn keyword objcConstant YES NO TRUE FALSE + +syn region objcImp start='@implementation' end='@end' transparent +syn region objcHeader start='@interface' end='@end' transparent + +" I make this typo sometimes so it's nice to have it highlighted. +syn match objcError '\v(NSLogv=\(\s*)@<=[^@]=["'].*'me=e-1 + +syn match objcSubclass '\(@implementation\|@interface\)\@<=\s*\k\+' display contained containedin=objcImp,objcHeader +syn match objcSuperclass '\(@\(implementation\|interface\)\s*\k\+\s*:\)\@<=\s*\k*' display contained containedin=objcImp,objcHeader + +" Matches "- (void) foo: (int) bar and: (float) foobar" +syn match objcMethod '^\s*[-+]\s*\_.\{-}[\{;]'me=e-1 transparent contains=cParen,objcInstMethod,objcFactMethod +" Matches "bar & foobar" in above +syn match objcMethodArg ')\@<=\s*\k\+' contained containedin=objcMethod +" Matches "foo:" & "and:" in above +syn match objcMethodName '\(^\s*[-+]\s*(\_[^)]*)\)\@<=\_\s*\_\k\+' contained containedin=objcMethod +syn match objcMethodColon '\k\+\s*:' contained containedin=objcMethod +" Don't match these groups in cParen "(...)" +syn cluster cParenGroup add=objcMethodName,objcMethodArg,objcMethodColon +" This fixes a bug with completion inside parens (e.g. if ([NSString ])) +syn cluster cParenGroup remove=objcMethodCall + +" Matches "bar" in "[NSObject bar]" or "bar" in "[[NSObject foo: baz] bar]", +" but NOT "bar" in "[NSObject foo: bar]". +syn match objcMessageName '\(\[\s*\k\+\s\+\|\]\s*\)\@<=\k*\s*\]'me=e-1 display contained containedin=objcMethodCall +" Matches "foo:" in "[NSObject foo: bar]" or "[[NSObject new] foo: bar]" +syn match objcMessageColon '\(\_\S\+\_\s\+\)\@<=\k\+\s*:' display contained containedin=objcMethodCall + +" Don't match these in this strange group for edge cases... +syn cluster cMultiGroup add=objcMessageColon,objcMessageName,objcMethodName,objcMethodArg,objcMethodColon + +" You may want to customize this one. I couldn't find a default group to suit +" it, but you can modify your colorscheme to make this a different color. +hi link objcMethodName Special +hi link objcMethodColon objcMethodName + +hi link objcMethodArg Identifier + +hi link objcMessageName objcMethodArg +hi link objcMessageColon objcMessageName + +hi link objcSubclass objcMethodName +hi link objcSuperclass String + +hi link objcError Error diff --git a/sources_non_forked/cocoa.vim/autoload/objc/cocoacomplete.vim b/sources_non_forked/cocoa.vim/autoload/objc/cocoacomplete.vim new file mode 100644 index 00000000..30444974 --- /dev/null +++ b/sources_non_forked/cocoa.vim/autoload/objc/cocoacomplete.vim @@ -0,0 +1,215 @@ +" File: cocoacomplete.vim (part of the cocoa.vim plugin) +" Author: Michael Sanders (msanders42 [at] gmail [dot] com) +" Last Updated: June 30, 2009 +" Description: An omni-completion plugin for Cocoa/Objective-C. + +let s:lib_dir = fnameescape(expand(':p:h:h:h').'/lib/') +let s:cocoa_indexes = s:lib_dir.'cocoa_indexes/' + +if !isdirectory(s:cocoa_indexes) + echom 'Error in cocoacomplete.vim: could not find ~/.vim/lib/cocoa_indexes directory' +endif + +fun! objc#cocoacomplete#Complete(findstart, base) + if a:findstart + " Column where completion starts: + return match(getline('.'), '\k\+\%'.col('.').'c') + else + let matches = [] + let complete_type = s:GetCompleteType(line('.'), col('.') - 1) + + if complete_type == 'methods' + call s:Complete(a:base, ['alloc', 'init', 'retain', 'release', + \ 'autorelease', 'retainCount', + \ 'description', 'class', 'superclass', + \ 'self', 'zone', 'isProxy', 'hash']) + let obj_pos = s:GetObjPos(line('.'), col('.')) + call extend(matches, s:CompleteMethod(line('.'), obj_pos, a:base)) + elseif complete_type == 'types' || complete_type == 'returntypes' + let opt_types = complete_type == 'returntypes' ? ['IBAction'] : [] + call s:Complete(a:base, opt_types + ['void', 'id', 'BOOL', 'int', + \ 'double', 'float', 'char']) + call extend(matches, s:CompleteCocoa(a:base, 'classes', 'types', + \ 'notifications')) + elseif complete_type != '' + if complete_type =~ 'function_params$' + let complete_type = substitute(complete_type, 'function_params$', '', '') + let functions = s:CompleteFunction(a:base) + endif + + " Mimic vim's dot syntax for other complete types (see :h ft). + let word = a:base == '' ? 'NS' : a:base + let args = [word] + split(complete_type, '\.') + call extend(matches, call('s:CompleteCocoa', args)) + + " List functions after the other items in the menu. + if exists('functions') | call extend(matches, functions) | endif + endif + return matches + endif +endf + +fun s:GetCompleteType(lnum, col) + let scopelist = map(synstack(a:lnum, a:col), 'synIDattr(v:val, "name")') + if empty(scopelist) | return 'types' | endif + + let current_scope = scopelist[-1] + let beforeCursor = strpart(getline(a:lnum), 0, a:col) + + " Completing a function name: + if getline(a:lnum) =~ '\%'.(a:col + 1).'c\s*(' + return 'functions' + elseif current_scope == 'objcSuperclass' + return 'classes' + " Inside brackets "[ ... ]": + elseif index(scopelist, 'objcMethodCall') != -1 + return beforeCursor =~ '\[\k*$' ? 'classes' : 'methods' + " Inside parentheses "( ... )": + elseif current_scope == 'cParen' + " Inside parentheses for method definition: + if beforeCursor =~ '^\s*[-+]\s*([^{;]*' + return beforeCursor =~ '^\s*[-+]\s*([^)]*$' ? 'returntypes' : 'types' + " Inside function, loop, or conditional: + else + return 'classes.types.constants.function_params' + endif + " Inside braces "{ ... }" or after equals "=": + elseif current_scope == 'cBlock' || current_scope == 'objcAssign' || current_scope == '' + let type = current_scope == 'cBlock' ? 'types.constants.' : '' + let type = 'classes.'.type.'function_params' + + if beforeCursor =~ 'IBOutlet' | return 'classes' | endif + return beforeCursor =~ '\v(^|[{};=\])]|return)\s*\k*$'? type : 'methods' + " Directly inside "@implementation ... @end" or "@interface ... @end" + elseif current_scope == 'objcImp' || current_scope == 'objcHeader' + " TODO: Complete delegate/subclass methods + endif + return '' +endf + +" Adds item to the completion menu if they match the base. +fun s:Complete(base, items) + for item in a:items + if item =~ '^'.a:base | call complete_add(item) | endif + endfor +endf + +" Returns position of "foo" in "[foo bar]" or "[baz bar: [foo bar]]". +fun s:GetObjPos(lnum, col) + let beforeCursor = strpart(getline(a:lnum), 0, a:col) + return match(beforeCursor, '\v.*(^|[\[=;])\s*\[*\zs[A-Za-z0-9_@]+') + 1 +endf + +" Completes a method given the position of the object and the method +" being completed. +fun s:CompleteMethod(lnum, col, method) + let class = s:GetCocoaClass(a:lnum, a:col) + if class == '' + let object = matchstr(getline(a:lnum), '\%'.a:col.'c\k\+') + let class = s:GetDeclWord(object) + if class == '' | return [] | endif + endif + let method = s:GetMethodName(a:lnum, a:col, a:method) + let matches = split(system(s:lib_dir.'get_methods.sh '.class. + \ '|grep "^'.method.'"'), "\n") + if exists('g:loaded_snips') " Use snipMate if it's installed + call objc#pum_snippet#Map() + else " Otherwise, only complete the method name. + call map(matches, 'substitute(v:val, ''\v:\zs.{-}\ze(\w+:|$)'', " ", "g")') + endif + + " If dealing with a partial method name, only complete past it. E.g., in + " "[NSString stringWithCharacters:baz l|]" (where | is the cursor), + " only return "length", not "stringWithCharacters:length:". + if stridx(method, ':') != -1 + let method = substitute(method, a:method.'$', '\\\\zs&', '') + call map(matches, 'matchstr(v:val, "'.method.'.*")') + endif + return matches +endf + +" Returns the Cocoa class at a given position if it exists, or +" an empty string "" if it doesn't. +fun s:GetCocoaClass(lnum, col) + let class = matchstr(getline(a:lnum), '\%'.a:col.'c[A-Za-z0-9_"@]\+') + if class =~ '^@"' | return 'NSString' | endif " Treat @"..." as an NSString + let v:errmsg = '' + sil! hi cocoaClass + if v:errmsg == '' && synIDattr(synID(a:lnum, a:col, 0), 'name') == 'cocoaClass' + return class " If cocoaClass is defined, try using that. + endif + return system('grep ^'.class.' '.s:cocoa_indexes.'classes.txt') != '' + \ ? class : '' " Use grep as a fallback. +endf + +" Returns the word before a variable declaration. +fun s:GetDeclWord(var) + let startpos = [line('.'), col('.')] + let line_found = searchdecl(a:var) != 0 ? 0 : line('.') + call cursor(startpos) + let matchstr = '\v(IBOutlet\s+)=\zs\k+\s*\ze\**\s*' + + " If the declaration was not found in the implementation file, check + " the header. + if !line_found && expand('%:e') == 'm' + let header_path = expand('%:p:r').'.h' + if filereadable(header_path) + for line in readfile(header_path) + if line =~ '^\s*\(IBOutlet\)\=\s*\k*\s*\ze\**\s*'.a:var.'\s*' + return matchstr(line, matchstr) + endif + endfor + return '' + endif + endif + + return matchstr(getline(line_found), matchstr.a:var) +endf + +fun s:SearchList(list, regex) + for line in a:list + if line =~ a:regex + return line + endif + endfor + return '' +endf + +" Returns the method name, ready to be searched by grep. +" The "base" word needs to be passed in separately, because +" Vim apparently removes it from the line during completions. +fun s:GetMethodName(lnum, col, base) + let line = getline(a:lnum) + let col = matchend(line, '\%'.a:col.'c\S\+\s\+') + 1 " Skip past class name. + if line =~ '\%'.col.'c\k\+:' + let base = a:base == '' ? '' : ' '.a:base + let method = matchstr(line, '\%'.col.'c.\{-}\ze]').base + return substitute(method, '\v\k+:\zs.{-}\ze(\s*\k+:|'.base.'$)', '[^:]*', 'g') + else + return a:base + endif +endf + +" Completes Cocoa functions, using snippets for the parameters if possible. +fun s:CompleteFunction(word) + let files = s:cocoa_indexes.'functions.txt' " TODO: Add C functions. + let matches = split(system('zgrep -h "^'.a:word.'" '.files), "\n") + if exists('g:loaded_snips') " Use snipMate if it's installed + call objc#pum_snippet#Map() + else " Otherwise, just complete the function name + call map(matches, "{'word':matchstr(v:val, '^\\k\\+'), 'abbr':v:val}") + endif + return matches +endf + +" Completes word for Cocoa "classes", "types", "notifications", or "constants". +" (supplied as the optional parameters). +fun s:CompleteCocoa(word, file, ...) + let files = '' + for file in [a:file] + a:000 + let files .= ' '.s:cocoa_indexes.file.'.txt' + endfor + + return split(system('grep -ho "^'.a:word.'[A-Za-z0-9_]*" '.files), "\n") +endf +" vim:noet:sw=4:ts=4:ft=vim diff --git a/sources_non_forked/cocoa.vim/autoload/objc/man.vim b/sources_non_forked/cocoa.vim/autoload/objc/man.vim new file mode 100644 index 00000000..e4f9a902 --- /dev/null +++ b/sources_non_forked/cocoa.vim/autoload/objc/man.vim @@ -0,0 +1,185 @@ +" File: objc#man.vim (part of the cocoa.vim plugin) +" Author: Michael Sanders (msanders42 [at] gmail [dot] com) +" Description: Allows you to look up Cocoa API docs in Vim. +" Last Updated: December 26, 2009 +" NOTE: See http://tinyurl.com/remove-annoying-alert +" for removing the annoying security alert in Leopard. + +" Return all matches in for ":CocoaDoc " sorted by length. +fun objc#man#Completion(ArgLead, CmdLine, CursorPos) + return system('grep -ho "^'.a:ArgLead.'\w*" ~/.vim/lib/cocoa_indexes/*.txt'. + \ "| perl -e 'print sort {length $a <=> length $b} <>'") +endf + +let s:docsets = [] +let locations = [ + \ {'path': '/Developer/Documentation/DocSets/com.apple.ADC_Reference_Library.CoreReference.docset', + \ 'alias': 'Leopard'}, + \ {'path': '/Developer/Documentation/DocSets/com.apple.adc.documentation.AppleSnowLeopard.CoreReference.docset', + \ 'alias': 'Snow Leopard'}, + \ {'path': '/Developer/Platforms/iPhoneOS.platform/Developer/Documentation/DocSets/com.apple.adc.documentation.AppleiPhone3_0.iPhoneLibrary.docset', + \ 'alias': 'iPhone 3.0'} + \ ] +for location in locations + if isdirectory(location.path) + call add(s:docsets, location) + endif +endfor + +let s:docset_cmd = '/Developer/usr/bin/docsetutil search -skip-text -query ' + +fun s:OpenFile(file) + if a:file =~ '/.*/man/' + exe ':!'.substitute(&kp, '^man -s', 'man', '').' '.a:file + else + " Sometimes Xcode doesn't download a bundle fully, and docsetutil is + " inaccurate. + if !filereadable(matchstr(a:file, '^.*\ze#.*$')) + echoh ErrorMsg + echom 'File "'.a:file.'" is not readable.' + echom 'Check that Xcode has fully downloaded the DocSet.' + echoh None + else + " /usr/bin/open strips the #fragments in file:// URLs, which we need, + " so I'm using applescript instead. + call system('osascript -e ''open location "file://'.a:file.'"'' &') + endif + endif +endf + +fun objc#man#ShowDoc(...) + let word = a:0 ? a:1 : matchstr(getline('.'), '\<\w*\%'.col('.').'c\w\+:\=') + + " Look up the whole method if it takes multiple arguments. + if !a:0 && word[len(word) - 1] == ':' + let word = s:GetMethodName() + endif + + if word == '' + if !a:0 " Mimic K if using it as such + echoh ErrorMsg + echo 'E349: No identifier under cursor' + echoh None + endif + return + endif + + let references = {} + + " First check Cocoa docs for word using docsetutil + for location in s:docsets + let docset = location.path + let response = split(system(s:docset_cmd.word.' '.docset), "\n") + let docset .= '/Contents/Resources/Documents/' " Actual path of files + for line in response + " Format string is: " Language/type/class/word path" + let path = matchstr(line, '\S*$') + if path[0] != '/' | let path = docset.path | endif + + " Ignore duplicate entries + if has_key(references, path) | continue | endif + + let attrs = split(matchstr(line, '^ \zs*\S*'), '/')[:2] + + " Ignore unrecognized entries. + if len(attrs) != 3 | continue | endif + + " If no class is given use type instead + let [lang, type, class] = attrs + if class == '-' | let class = type | endif + let references[path] = {'lang': lang, 'class': class, + \ 'location': location} + endfor + endfor + + " Then try man + let man = system('man -S2:3 -aW '.word) + if man !~ '^No manual entry' + for path in split(man, "\n") + if !has_key(references, path) + let references[path] = {'lang': 'C', 'class': 'man'} + endif + endfor + endif + + if len(references) == 1 + return s:OpenFile(keys(references)[0]) + elseif !empty(references) + echoh ModeMsg | echo word | echoh None + return s:ChooseFrom(references) + else + echoh WarningMsg + echo "Can't find documentation for ".word + echoh None + endif +endf + +fun s:ChooseFrom(references) + let type_abbr = {'cl' : 'Class', 'intf' : 'Protocol', 'cat' : 'Category', + \ 'intfm' : 'Method', 'instm' : 'Method', 'econst' : 'Enum', + \ 'tdef' : 'Typedef', 'macro' : 'Macro', 'data' : 'Data', + \ 'func' : 'Function'} + let inputlist = [] + " Don't display "Objective-C" if all items are objc + let show_lang = !AllKeysEqual(values(a:references), 'lang', 'Objective-C') + let i = 1 + for ref in values(a:references) + let class = ref.class + if has_key(type_abbr, class) | let class = type_abbr[class] | endif + call add(inputlist, i.'. '.(show_lang ? ref['lang'].' ' : '').class.' ('.ref.location.alias.')') + let i += 1 + endfor + let num = inputlist(inputlist) + return num ? s:OpenFile(keys(a:references)[num - 1]) : -1 +endf + +fun AllKeysEqual(list, key, item) + for item in a:list + if item[a:key] != a:item + return 0 + endif + endfor + return 1 +endf + +fun s:GetMethodName() + let pos = [line('.'), col('.')] + let startpos = searchpos('\v^\s*-.{-}\w+:|\[\s*\w+\s+\w+:|\]\s*\w+:', 'cbW') + + " Method declaration (- (foo) bar:) + if getline(startpos[0]) =~ '^\s*-.\{-}\w\+:' + let endpos = searchpos('{', 'W') + " Message inside brackets ([foo bar: baz]) + else + let endpos = searchpairpos('\[', '', '\]', 'W') + endif + call cursor(pos) + + if startpos[0] == 0 || endpos[0] == 0 | return '' | endif + let lines = getline(startpos[0], endpos[0]) + + let lines[0] = strpart(lines[0], startpos[1] - 1) + let lines[-1] = strpart(lines[-1], 0, endpos[1]) + + " Ignore outer brackets + let message = substitute(join(lines), '^\[\|\]$', '', '') + " Ignore nested messages [...] + let message = substitute(message, '\[.\{-}\]', '', 'g') + " Ignore strings (could contain colons) + let message = substitute(message, '".\{-}"', '', 'g') + " Ignore @selector(...) + let message = substitute(message, '@selector(.\{-})', '', 'g') + + return s:MatchAll(message, '\w\+:') +endf + +fun s:MatchAll(haystack, needle) + let matches = matchstr(a:haystack, a:needle) + let index = matchend(a:haystack, a:needle) + while index != -1 + let matches .= matchstr(a:haystack, a:needle, index + 1) + let index = matchend(a:haystack, a:needle, index + 1) + endw + return matches +endf +" vim:noet:sw=4:ts=4:ft=vim diff --git a/sources_non_forked/cocoa.vim/autoload/objc/method_builder.vim b/sources_non_forked/cocoa.vim/autoload/objc/method_builder.vim new file mode 100644 index 00000000..999d38b4 --- /dev/null +++ b/sources_non_forked/cocoa.vim/autoload/objc/method_builder.vim @@ -0,0 +1,124 @@ +" File: objc#method_builder.vim (part of the cocoa.vim plugin) +" Author: Michael Sanders (msanders42 [at] gmail [dot] com) +" Description: Builds an empty implementation (*.m) file given a header (*.h) +" file. When called with no arguments (simply ":BuildMethods"), +" it looks for the corresponding header file of the current *.m +" file (e.g. "foo.m" -> "foo.h"). +" Last Updated: June 03, 2009 +" - make sure you're not in a comment + +" TODO: Relative pathnames +fun objc#method_builder#Completion(ArgLead, CmdLine, CursorPos) + let dir = stridx(a:ArgLead, '/') == -1 ? getcwd() : fnamemodify(a:ArgLead, ':h') + let search = fnamemodify(a:ArgLead, ':t') + let files = split(glob(dir.'/'.search.'*.h') + \ ."\n".glob(dir.'/'.search.'*/'), "\n") + call map(files, 'fnameescape(fnamemodify(v:val, ":."))') + return files +endf + +fun s:Error(msg) + echoh ErrorMsg | echo a:msg | echoh None + return -1 +endf + +fun s:GetDeclarations(file) + let header = readfile(a:file) + let template = [] + let in_comment = 0 + let in_header = 0 + let looking_for_semi = 0 + + for line in header + if in_comment + if stridx(line, '*/') != -1 | let in_comment = 0 | endif + continue " Ignore declarations inside multi-line comments + elseif stridx(line, '/*') != -1 + let in_comment = 1 | continue + endif + + if stridx(line, '@interface') != -1 + let in_header = 1 + let template += ['@implementation'.matchstr(line, '@interface\zs\s\+\w\+'), ''] + continue + elseif in_header && stridx(line, '@end') != -1 + let in_header = 0 + call add(template, '@end') + break " Only process one @interface at a time, for now. + endif + if !in_header | continue | endif + + let first_char = strpart(line, 0, 1) + if first_char == '-' || first_char == '+' || looking_for_semi + let semi_pos = stridx(line, ';') + let looking_for_semi = semi_pos == -1 + if looking_for_semi + call add(template, line) + else + call add(template, strpart(line, 0, semi_pos)) + let template += ['{', "\t", '}', ''] + endif + endif + endfor + return template +endf + +fun objc#method_builder#Build(header) + let headerfile = a:header == '' ? expand('%:p:r').'.h' : a:header + if expand('%:e') != 'm' + return s:Error('Not in an implementation file.') + elseif !filereadable(headerfile) + return s:Error('Could not read header file.') + endif + + let declarations = s:GetDeclarations(headerfile) + + if empty(declarations) + return s:Error('Header file has no method declarations!') + endif + + let len = len(declarations) + let last_change = line('.') + + if search('\V'.substitute(declarations[0], '\s\+', '\\s\\+', '')) + if !searchpair('@implementation', '', '@end', 'W') + return s:Error('Missing @end declaration.') + endif + let i = 2 " Skip past the @implementation line & blank line + let len -= 1 " Skip past @end declaration + let lnum = line('.') - 1 + else + let i = 0 + let lnum = line('.') + endif + let start_line = lnum + + while i < len + let is_method = declarations[i][0] =~ '@\|+\|-' + if !is_method || !search('\V'.substitute(escape(declarations[i], '\'), + \ 'void\|IBAction', '\\(void\\|IBAction\\)', 'g'), 'n') + call append(lnum, declarations[i]) + let lnum += 1 + if is_method | let last_change = lnum | endif + else " Skip method declaration if it is already declared. + if declarations[i][0] == '@' + let i += 1 + else + while declarations[i] != '}' && i < len + let i += 1 + endw + let i += 1 + endif + endif + let i += 1 + endw + call cursor(last_change, 1) + + if lnum == start_line + echoh WarningMsg + let class = matchstr(declarations[0], '@implementation\s\+\zs.*') + echo 'The methods for the "'.class.'" class have already been declared.' + echoh None + endif +endf +" vim:noet:sw=4:ts=4:ft=vim diff --git a/sources_non_forked/cocoa.vim/autoload/objc/method_list.vim b/sources_non_forked/cocoa.vim/autoload/objc/method_list.vim new file mode 100644 index 00000000..5c7246aa --- /dev/null +++ b/sources_non_forked/cocoa.vim/autoload/objc/method_list.vim @@ -0,0 +1,115 @@ +" File: objc#method_list.vim (part of the cocoa.vim plugin) +" Author: Michael Sanders (msanders42 [at] gmail [dot] com) +" Description: Opens a split window containing the methods of the current file. +" Last Updated: July 13, 2009 + +au WinLeave Method\ List callLeaveMethodList() +au WinEnter Method\ List call objc#method_list#Activate(0) + +fun objc#method_list#Activate(update) + let s:opt = {'is':&is, 'hls': &hls} " Save current options. + let s:last_search = @/ + set is nohls + " If methodlist has already been opened, reactivate it. + if exists('s:mlist_buffer') && bufexists(s:mlist_buffer) + let mlist_win = bufwinnr(s:mlist_buffer) + if mlist_win == -1 + sil exe 'belowright sbuf '.s:mlist_buffer + if a:update | call s:UpdateMethodList() | endif + elseif winbufnr(2) == -1 + quit " If no other windows are open, close the method list automatically. + else " If method list is out of focus, bring it back into focus. + exe mlist_win.'winc w' + endif + else " Otherwise, create the method list. + call s:CreateMethodList() + call s:UpdateMethodList() + endif +endf + +fun s:CreateMethodList() + botright new + + let s:sortPref = 0 + let s:mlist_buffer = bufnr('%') + + sil file Method\ List + setl bt=nofile bh=wipe noswf nobl nonu nowrap syn=objc + syn match objcPragmark '^[^-+@].*$' + hi objcPragmark gui=italic term=underline + + nn :calSelectMethod() + nn q q + nn p p + nm l p + nm <2-leftmouse> +endf + +" Returns the lines of all the matches in a dictionary +fun s:GetAllMatches(needle) + let startpos = [line('.'), col('.')] + call cursor(1, 1) + + let results = {} + let line = search(a:needle, 'Wc') + let key = matchstr(getline(line), a:needle) + if !s:InComment(line, 1) && key != '' + let results[key] = line + endif + + while 1 + let line = search(a:needle, 'W') + if !line | break | endif + let key = matchstr(getline(line), a:needle) + if !s:InComment(line, 1) && key != '' + let results[key] = line + endif + endw + + call cursor(startpos) + return results +endf + +fun s:InComment(line, col) + return stridx(synIDattr(synID(a:line, a:col, 0), 'name'), 'omment') != -1 +endf + +fun s:UpdateMethodList() + winc p " Go to source file window + let s:methods = s:GetAllMatches('^\v(\@(implementation|interface) \w+|'. + \ '\s*(\+|-).*|#pragma\s+mark\s+\zs.+)') + winc p " Go to method window + + if empty(s:methods) + winc q + echoh WarningMsg + echo 'There are no methods in this file!' + echoh None + return + endif + + call setline(1, sort(keys(s:methods), 's:SortByLineNum')) + exe "norm! \".line('$').'_' +endf + +fun s:SortByLineNum(i1, i2) + let line1 = s:methods[a:i1] + let line2 = s:methods[a:i2] + return line1 == line2 ? 0 : line1 > line2 ? 1 : -1 +endf + +fun s:SelectMethod() + let number = s:methods[getline('.')] + winc q + winc p + call cursor(number, 1) +endf + +fun s:LeaveMethodList() + for [option, value] in items(s:opt) + exe 'let &'.option.'='.value + endfor + let @/ = s:last_search == '' ? '' : s:last_search + unl s:opt s:last_search +endf +" vim:noet:sw=4:ts=4:ft=vim diff --git a/sources_non_forked/cocoa.vim/autoload/objc/pum_snippet.vim b/sources_non_forked/cocoa.vim/autoload/objc/pum_snippet.vim new file mode 100644 index 00000000..3ee29075 --- /dev/null +++ b/sources_non_forked/cocoa.vim/autoload/objc/pum_snippet.vim @@ -0,0 +1,87 @@ +" File: pum_snippet.vim +" Author: Michael Sanders (msanders42 [at] gmail [dot] com) +" Last Updated: June 12, 2009 +" Description: Uses snipMate to jump through function or method objc +" parameters when autocompleting. Used in cocoacomplete.vim. + +" This function is invoked whenever pum_snippet is to be used; the keys are +" only mapped when used as the trigger, and then immediately unmapped to avoid +" breaking abbreviations, as well as other things. +fun! objc#pum_snippet#Map() + ino =objc#pum_snippet#Trigger(' ') + if !exists('g:SuperTabMappingForward') " Only map tab if not using supertab. + \ || (g:SuperTabMappingForward != '' && g:SuperTabMappingForward != '') + ino =objc#pum_snippet#Trigger("\t") + endif + ino =objc#pum_snippet#Trigger("\n") + let s:start = col('.') + " Completion menu can only be detected when the popup menu is visible, so + " 'menuone' needs to be temporarily set: + let s:cot = &cot + set cot+=menuone +endf + +fun! objc#pum_snippet#Unmap() + call s:UnmapKey('') + call s:UnmapKey('') + call s:UnmapKey('') +endf + +fun s:UnmapKey(key) + if maparg(a:key, 'i') =~? '^=objc#pum_snippet#Trigger(' + sil exe 'iunmap '.a:key + endif +endf + +fun! objc#pum_snippet#Trigger(key) + call objc#pum_snippet#Unmap() + if pumvisible() + let line = getline('.') + let col = col('.') + let word = matchstr(line, '\%'.s:start.'c\k\+(.\{-})\%'.col.'c') + if word != '' + let ConvertWord = function('s:ConvertFunction') + elseif match(line, '\%'.s:start.'c\k\+[^()]*:[^()]*\%'.col.'c') != -1 + let word = matchstr(line, '\%'.s:start.'c\k\+[^()]*\%'.col.'c') + let ConvertWord = function('s:ConvertMethod') + endif + if word != '' + call s:ResetOptions() + let col -= len(word) + sil exe 's/\V'.escape(word, '\/').'\%#//' + return snipMate#expandSnip(ConvertWord(word), col) + endif + endif + call s:ResetOptions() + return a:key +endf + +fun s:ResetOptions() + let &cot = s:cot + unl s:start s:cot +endf + +fun s:ConvertFunction(function) + let name = matchstr(a:function, '^\k\+') + let params = matchstr(a:function, '^\k\+(\zs.*') + let snippet = name.'('.substitute(params, '\v(.{-1})(, |\))', '${0:\1}\2', 'g').'${0}' + return s:OrderSnippet(snippet) +endf + +fun s:ConvertMethod(method) + if stridx(a:method, ':') == -1 | return a:method | endif + let snippet = substitute(a:method, '\v\k+:\zs.{-}\ze(\s*\k+:|$)', '${0:&}', 'g') + return s:OrderSnippet(snippet) +endf + +" Converts "${0} foo ${0} bar ..." to "${1} foo ${2} bar", etc. +fun s:OrderSnippet(snippet) + let snippet = a:snippet + let i = 1 + while stridx(snippet, '${0') != -1 + let snippet = substitute(snippet, '${0', '${'.i, '') + let i += 1 + endw + return snippet +endf +" vim:noet:sw=4:ts=4:ft=vim diff --git a/sources_non_forked/cocoa.vim/doc/cocoa.txt b/sources_non_forked/cocoa.vim/doc/cocoa.txt new file mode 100644 index 00000000..5b6105d3 --- /dev/null +++ b/sources_non_forked/cocoa.vim/doc/cocoa.txt @@ -0,0 +1,154 @@ +*cocoa.txt* Plugin for Cocoa/Objective-C development. + +cocoa.vim *cocoa* +Last Change: March 30, 2010 +Author: Michael Sanders + +|cocoa-introduction| Introduction +|cocoa-installation| Installation +|cocoa-overview| Overview of features +|cocoa-mappings| Mappings +|cocoa-commands| Commands +|cocoa-license| License +|cocoa-contact| Contact + +For Vim version 7.0 or later. +This plugin only works if 'compatible' is not set. +{Vi does not have any of these features.} + +============================================================================== +INTRODUCTION *cocoa-intro* + +Cocoa.vim is a collection of scripts designed to make it easier to develop +Cocoa/Objective-C applications. It includes enhanced syntax highlighting, code +completion, documentation lookup, as well as a number of other features that +can be used to integrate Vim with Xcode, allowing you to essentially replace +Xcode's editor with Vim. + +============================================================================== +INSTALLATION *cocoa-installation* + +Documentation lookup and code completion for Cocoa.vim currently only work on +OS X 10.5+ (although the other parts should work on any platform). To install, +simply unzip cocoa.zip to your home vim directory (typically ~/.vim). + + *cocoa-suggested-plugins* +The code completion in cocoa.vim uses snipMate, if you have it installed, to +allow you to conveniently over the parameters in functions and +methods. If you like cocoa.vim, you may also find objc_matchbracket.vim +useful. + + *leopard-security-alert* +Documentation works by showing the page in your default browser, which +apparently causes Leopard to warn you of opening an html file for every word +you look up. To fix this, see this page: http://tinyurl.com/remove-annoying-alert + +============================================================================== +FEATURE OVERVIEW *cocoa-features* + + 1. Enhanced syntax highlighting; Vim's syntax highlighting for + Objective-C seemed a bit incomplete to me, so I have added a few + niceties, such as highlighting Cocoa keywords and differentiating + the method name and passed objects in method calls and definitions. + 2. Xcode-like mappings; mappings such as (where "d" is "command") + to build & run and to switch to the project window help to + integrate Xcode and Vim. For a complete list of the mappings in + cocoa.vim, see |cocoa-mappings|. + 3. Methods for the current file can be listed and navigated to with + the |:ListMethods| command. + 4. A template of methods declared in a header file (.h) can be built + in an implementation file (.m) with |:BuildMethods|. + 5. Cocoa/C Documentation can be looked up with the |:CocoaDoc| command, + or simply with Vim's |K|. + 6. Code completion for classes, methods, functions, constants, types, + and notifications can be invoked with . Parameters for + methods and functions are automatically converted to snippets to + over if you have snipMate installed. + +============================================================================== +MAPPINGS *cocoa-mappings* *g:objc_man_key* + +Cocoa.vim maps the following keys, some for convenience and others to +integrate with Xcode: +(Disclaimer: Sorry, I could not use the swirly symbols because vim/git was +having encoding issues. Just pretend that e.g. means cmd-r.) + + ||A - Alternate between header (.h) and implementation (.m) file + K - Look up documentation for word under cursor[1] + - A + - Build & Run (Go) + - CMD-R + - Build + - Clean + - Go to Project + - :ListMethods + (in insert mode) - Show omnicompletion menu + - Comment out line + - Decrease indent + - Increase indent + + ([1] This can be customized by the variable g:objc_man_key.) + +============================================================================== +COMMANDS *cocoa-commands* + + *:ListMethods* +:ListMethods Open a split window containing the methods, functions, + and #pragma marks of the current file. + *:BuildMethods* +:BuildMethods [headerfile] + Build a template of methods in an implementation (.m) + from a list declared in a header file (.h). If no + argument is given, the corresponding header file is + used (e.g. "foo.m" -> "foo.h"). + +============================================================================== +CODE COMPLETION *cocoa-completion* + +When cocoa.vim is installed the 'omnifunc' is automatically set to +'cocoacomplete#Complete'. This allows you to complete classes, functions, +methods, etc. with . These keywords are saved from header files in +~/.vim/lib/cocoa_indexes; they have been built for you, although you can build +them again by running ~/.vim/lib/extras/cocoa_definitions.py. + +Completions with parameters (i.e., functions and methods) are automatically +converted to |snipMate| if it is installed. To invoke the snippet, simply +press a whitespace character (space, tab, or return), and then navigate the +snippet as you would in snipMate. + +============================================================================== +LICENSE *cocoa-license* + +Cocoa.vim is released under the MIT license: + +Copyright 2009-2010 Michael Sanders. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +The software is provided "as is", without warranty of any kind, express or +implied, including but not limited to the warranties of merchantability, +fitness for a particular purpose and noninfringement. In no event shall the +authors or copyright holders be liable for any claim, damages or other +liability, whether in an action of contract, tort or otherwise, arising from, +out of or in connection with the software or the use or other dealings in the +software. + +============================================================================== +CONTACT *cocoa-contact* *cocoa-author* + +To contact the author (Michael Sanders), you may email: + + msanders42+cocoa.vim gmail com + +Thanks for your interest in the script! + +============================================================================== +vim:tw=78:ts=8:ft=help:norl:enc=utf-8: diff --git a/sources_non_forked/cocoa.vim/ftplugin/objc_cocoa_mappings.vim b/sources_non_forked/cocoa.vim/ftplugin/objc_cocoa_mappings.vim new file mode 100644 index 00000000..629d0b7c --- /dev/null +++ b/sources_non_forked/cocoa.vim/ftplugin/objc_cocoa_mappings.vim @@ -0,0 +1,85 @@ +" File: objc_cocoa_mappings.vim +" Author: Michael Sanders (msanders42 [at] gmail [dot] com) +" Description: Sets up mappings for cocoa.vim. +" Last Updated: December 26, 2009 + +if exists('b:cocoa_proj') || &cp || version < 700 + finish +endif +let b:cocoa_proj = fnameescape(globpath(expand(':p:h'), '*.xcodeproj')) +" Search a few levels up to see if we can find the project file +if empty(b:cocoa_proj) + let b:cocoa_proj = fnameescape(globpath(expand(':p:h:h'), '*.xcodeproj')) + + if empty(b:cocoa_proj) + let b:cocoa_proj = fnameescape(globpath(expand(':p:h:h:h'), '*.xcodeproj')) + if empty(b:cocoa_proj) + let b:cocoa_proj = fnameescape(globpath(expand(':p:h:h:h:h'), '*.xcodeproj')) + endif + endif +endif +let g:x = b:cocoa_proj + +com! -buffer ListMethods call objc#method_list#Activate(1) +com! -buffer -nargs=? -complete=customlist,objc#method_builder#Completion BuildMethods call objc#method_builder#Build('') +com! -buffer -nargs=? -complete=custom,objc#man#Completion CocoaDoc call objc#man#ShowDoc('') +com! -buffer -nargs=? Alternate call AlternateFile() + +let objc_man_key = exists('objc_man_key') ? objc_man_key : 'K' +exe 'nn '.objc_man_key.' :call objc#man#ShowDoc()' + +nn A :calAlternateFile() + +" Mimic some of Xcode's mappings. +nn :wcalBuildAnd('launch') +nn :wcalXcodeRun('build') +nn :wcalXcodeRun('clean') +" TODO: Add this +" nn :wcalBuildAnd('debug') +nn :calAlternateFile() +nn :call system('open -a Xcode '.b:cocoa_proj) +nn :ListMethods +nm +ino +nn I// +nn << +nn >> + +if exists('*s:AlternateFile') | finish | endif + +" Switch from header file to implementation file (and vice versa). +fun s:AlternateFile() + let path = expand('%:p:r').'.' + let extensions = expand('%:e') == 'h' ? ['m', 'c', 'cpp'] : ['h'] + if !s:ReadableExtensionIn(path, extensions) + echoh ErrorMsg | echo 'Alternate file not readable.' | echoh None + endif +endf + +" Returns true and switches to file if file with extension in any of +" |extensions| is readable, or returns false if not. +fun s:ReadableExtensionIn(path, extensions) + for ext in a:extensions + if filereadable(a:path.ext) + exe 'e'.fnameescape(a:path.ext) + return 1 + endif + endfor + return 0 +endf + +" Opens Xcode and runs Applescript command. +fun s:XcodeRun(command) + call system("open -a Xcode ".b:cocoa_proj." && osascript -e 'tell app " + \ .'"Xcode" to '.a:command."' &") +endf + +fun s:BuildAnd(command) + call system("open -a Xcode ".b:cocoa_proj." && osascript -e 'tell app " + \ ."\"Xcode\"' -e '" + \ .'set target_ to project of active project document ' + \ ."' -e '" + \ .'if (build target_) starts with "Build succeeded" then ' + \ .a:command.' target_' + \ ."' -e 'end tell'") +endf diff --git a/sources_non_forked/cocoa.vim/lib/cocoa_indexes/classes.txt b/sources_non_forked/cocoa.vim/lib/cocoa_indexes/classes.txt new file mode 100644 index 00000000..9854451d --- /dev/null +++ b/sources_non_forked/cocoa.vim/lib/cocoa_indexes/classes.txt @@ -0,0 +1,990 @@ +ABAddressBook\|NSObject +ABGroup\|ABRecord\|NSObject +ABImageClient +ABMultiValue\|NSObject +ABMutableMultiValue\|ABMultiValue\|NSObject +ABPeoplePickerView\|NSView\|NSResponder\|NSObject +ABPerson\|ABRecord\|NSObject +ABPersonPicker +ABPersonPickerDelegate +ABPersonView\|NSView\|NSResponder\|NSObject +ABRecord\|NSObject +ABSearchElement\|NSObject +CIColor\|NSObject +CIImage\|NSObject +DOMAbstractView\|DOMObject\|WebScriptObject\|NSObject +DOMAttr\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMBlob\|DOMObject\|WebScriptObject\|NSObject +DOMCDATASection\|DOMText\|DOMCharacterData\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMCSSCharsetRule\|DOMCSSRule\|DOMObject\|WebScriptObject\|NSObject +DOMCSSFontFaceRule\|DOMCSSRule\|DOMObject\|WebScriptObject\|NSObject +DOMCSSImportRule\|DOMCSSRule\|DOMObject\|WebScriptObject\|NSObject +DOMCSSMediaRule\|DOMCSSRule\|DOMObject\|WebScriptObject\|NSObject +DOMCSSPageRule\|DOMCSSRule\|DOMObject\|WebScriptObject\|NSObject +DOMCSSPrimitiveValue\|DOMCSSValue\|DOMObject\|WebScriptObject\|NSObject +DOMCSSRule\|DOMObject\|WebScriptObject\|NSObject +DOMCSSRuleList\|DOMObject\|WebScriptObject\|NSObject +DOMCSSStyleDeclaration\|DOMObject\|WebScriptObject\|NSObject +DOMCSSStyleRule\|DOMCSSRule\|DOMObject\|WebScriptObject\|NSObject +DOMCSSStyleSheet\|DOMStyleSheet\|DOMObject\|WebScriptObject\|NSObject +DOMCSSUnknownRule\|DOMCSSRule\|DOMObject\|WebScriptObject\|NSObject +DOMCSSValue\|DOMObject\|WebScriptObject\|NSObject +DOMCSSValueList\|DOMCSSValue\|DOMObject\|WebScriptObject\|NSObject +DOMCharacterData\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMComment\|DOMCharacterData\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMCounter\|DOMObject\|WebScriptObject\|NSObject +DOMDocument\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMDocumentFragment\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMDocumentType\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMEntity\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMEntityReference\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMEvent\|DOMObject\|WebScriptObject\|NSObject +DOMEventListener +DOMEventTarget +DOMFile\|DOMBlob\|DOMObject\|WebScriptObject\|NSObject +DOMFileList\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLAnchorElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLAppletElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLAreaElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLBRElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLBaseElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLBaseFontElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLBodyElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLButtonElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLCollection\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLDListElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLDirectoryElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLDivElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLDocument\|DOMDocument\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLEmbedElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLFieldSetElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLFontElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLFormElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLFrameElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLFrameSetElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLHRElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLHeadElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLHeadingElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLHtmlElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLIFrameElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLImageElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLInputElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLLIElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLLabelElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLLegendElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLLinkElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLMapElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLMarqueeElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLMenuElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLMetaElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLModElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLOListElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLObjectElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLOptGroupElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLOptionElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLOptionsCollection\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLParagraphElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLParamElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLPreElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLQuoteElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLScriptElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLSelectElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLStyleElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLTableCaptionElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLTableCellElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLTableColElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLTableElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLTableRowElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLTableSectionElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLTextAreaElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLTitleElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMHTMLUListElement\|DOMHTMLElement\|DOMElement\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMImplementation\|DOMObject\|WebScriptObject\|NSObject +DOMKeyboardEvent\|DOMUIEvent\|DOMEvent\|DOMObject\|WebScriptObject\|NSObject +DOMMediaList\|DOMObject\|WebScriptObject\|NSObject +DOMMouseEvent\|DOMUIEvent\|DOMEvent\|DOMObject\|WebScriptObject\|NSObject +DOMMutationEvent\|DOMEvent\|DOMObject\|WebScriptObject\|NSObject +DOMNamedNodeMap\|DOMObject\|WebScriptObject\|NSObject +DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMNodeFilter\|DOMObject\|WebScriptObject\|NSObject +DOMNodeIterator\|DOMObject\|WebScriptObject\|NSObject +DOMNodeList\|DOMObject\|WebScriptObject\|NSObject +DOMNotation\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMObject\|WebScriptObject\|NSObject +DOMOverflowEvent\|DOMEvent\|DOMObject\|WebScriptObject\|NSObject +DOMProcessingInstruction\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMProgressEvent\|DOMEvent\|DOMObject\|WebScriptObject\|NSObject +DOMRGBColor\|DOMObject\|WebScriptObject\|NSObject +DOMRange\|DOMObject\|WebScriptObject\|NSObject +DOMRect\|DOMObject\|WebScriptObject\|NSObject +DOMStyleSheet\|DOMObject\|WebScriptObject\|NSObject +DOMStyleSheetList\|DOMObject\|WebScriptObject\|NSObject +DOMText\|DOMCharacterData\|DOMNode\|DOMObject\|WebScriptObject\|NSObject +DOMTreeWalker\|DOMObject\|WebScriptObject\|NSObject +DOMUIEvent\|DOMEvent\|DOMObject\|WebScriptObject\|NSObject +DOMWheelEvent\|DOMMouseEvent\|DOMUIEvent\|DOMEvent\|DOMObject\|WebScriptObject\|NSObject +DOMXPathExpression\|DOMObject\|WebScriptObject\|NSObject +DOMXPathNSResolver +DOMXPathResult\|DOMObject\|WebScriptObject\|NSObject +GKAchievement\|NSObject +GKAchievementChallenge\|GKChallenge\|NSObject +GKAchievementDescription\|NSObject +GKAchievementViewController\|NSViewController\|NSResponder\|NSObject +GKAchievementViewControllerDelegate +GKChallenge\|NSObject +GKChallengeEventHandler\|NSObject +GKChallengeEventHandlerDelegate +GKChallengeListener +GKFriendRequestComposeViewController\|NSViewController\|NSResponder\|NSObject +GKFriendRequestComposeViewControllerDelegate +GKGameCenterControllerDelegate +GKGameCenterViewController\|NSViewController\|NSResponder\|NSObject +GKInvite\|NSObject +GKInviteEventListener +GKLeaderboard\|NSObject +GKLeaderboardSet +GKLeaderboardViewController\|NSViewController\|NSResponder\|NSObject +GKLeaderboardViewControllerDelegate +GKLocalPlayer\|GKPlayer\|NSObject +GKLocalPlayerListener +GKMatch\|NSObject +GKMatchDelegate +GKMatchRequest\|NSObject +GKMatchmaker\|NSObject +GKMatchmakerViewController\|NSViewController\|NSResponder\|NSObject +GKMatchmakerViewControllerDelegate +GKNotificationBanner\|NSObject +GKPeerPickerController +GKPeerPickerControllerDelegate +GKPlayer\|NSObject +GKSavedGame +GKSavedGameListener +GKScore\|NSObject +GKScoreChallenge\|GKChallenge\|NSObject +GKSession\|NSObject +GKSessionDelegate +GKTurnBasedEventHandler\|NSObject +GKTurnBasedEventListener +GKTurnBasedExchangeReply +GKTurnBasedMatch\|NSObject +GKTurnBasedMatchmakerViewController\|NSViewController\|NSResponder\|NSObject +GKTurnBasedMatchmakerViewControllerDelegate +GKTurnBasedParticipant\|NSObject +GKVoiceChat\|NSObject +GKVoiceChatClient +GKVoiceChatService +ISyncChange\|NSObject +ISyncClient\|NSObject +ISyncConflictPropertyType +ISyncFilter\|NSObject +ISyncFiltering +ISyncManager\|NSObject +ISyncRecordReference\|NSObject +ISyncRecordSnapshot\|NSObject +ISyncSession\|NSObject +ISyncSessionDriver\|NSObject +ISyncSessionDriverDataSource +NSATSTypesetter\|NSTypesetter\|NSObject +NSActionCell\|NSCell\|NSObject +NSAffineTransform\|NSObject +NSAlert\|NSObject +NSAlertDelegate +NSAnimatablePropertyContainer +NSAnimation\|NSObject +NSAnimationContext\|NSObject +NSAnimationDelegate +NSAppearance\|NSObject +NSAppearanceCustomization +NSAppleEventDescriptor\|NSObject +NSAppleEventManager\|NSObject +NSAppleScript\|NSObject +NSApplication\|NSResponder\|NSObject +NSApplicationDelegate +NSArchiver\|NSCoder\|NSObject +NSArray\|NSObject +NSArrayController\|NSObjectController\|NSController\|NSObject +NSAssertionHandler\|NSObject +NSAtomicStore\|NSPersistentStore\|NSObject +NSAtomicStoreCacheNode\|NSObject +NSAttributeDescription\|NSPropertyDescription\|NSObject +NSAttributedString\|NSObject +NSAutoreleasePool\|NSObject +NSBezierPath\|NSObject +NSBitmapImageRep\|NSImageRep\|NSObject +NSBlockOperation\|NSOperation\|NSObject +NSBox\|NSView\|NSResponder\|NSObject +NSBrowser\|NSControl\|NSView\|NSResponder\|NSObject +NSBrowserCell\|NSCell\|NSObject +NSBrowserDelegate +NSBundle\|NSObject +NSButton\|NSControl\|NSView\|NSResponder\|NSObject +NSButtonCell\|NSActionCell\|NSCell\|NSObject +NSByteCountFormatter\|NSFormatter\|NSObject +NSCIImageRep\|NSImageRep\|NSObject +NSCache\|NSObject +NSCacheDelegate +NSCachedImageRep\|NSImageRep\|NSObject +NSCachedURLResponse\|NSObject +NSCalendar\|NSObject +NSCalendarDate\|NSDate\|NSObject +NSCell\|NSObject +NSChangeSpelling +NSCharacterSet\|NSObject +NSClassDescription\|NSObject +NSClipView\|NSView\|NSResponder\|NSObject +NSCloneCommand\|NSScriptCommand\|NSObject +NSCloseCommand\|NSScriptCommand\|NSObject +NSCoder\|NSObject +NSCoding +NSCollectionView\|NSView\|NSResponder\|NSObject +NSCollectionViewDelegate +NSCollectionViewItem\|NSViewController\|NSResponder\|NSObject +NSColor\|NSObject +NSColorList\|NSObject +NSColorPanel\|NSPanel\|NSWindow\|NSResponder\|NSObject +NSColorPicker\|NSObject +NSColorPickingCustom +NSColorPickingDefault +NSColorSpace\|NSObject +NSColorWell\|NSControl\|NSView\|NSResponder\|NSObject +NSComboBox\|NSTextField\|NSControl\|NSView\|NSResponder\|NSObject +NSComboBoxCell\|NSTextFieldCell\|NSActionCell\|NSCell\|NSObject +NSComboBoxCellDataSource +NSComboBoxDataSource +NSComboBoxDelegate +NSComparisonPredicate\|NSPredicate\|NSObject +NSCompoundPredicate\|NSPredicate\|NSObject +NSCondition\|NSObject +NSConditionLock\|NSObject +NSConnection\|NSObject +NSConnectionDelegate +NSConstantString\|NSSimpleCString\|NSString\|NSObject +NSControl\|NSView\|NSResponder\|NSObject +NSControlTextEditingDelegate +NSController\|NSObject +NSCopying +NSCountCommand\|NSScriptCommand\|NSObject +NSCountedSet\|NSMutableSet\|NSSet\|NSObject +NSCreateCommand\|NSScriptCommand\|NSObject +NSCursor\|NSObject +NSCustomImageRep\|NSImageRep\|NSObject +NSData\|NSObject +NSDataDetector\|NSRegularExpression\|NSObject +NSDate\|NSObject +NSDateComponents\|NSObject +NSDateFormatter\|NSFormatter\|NSObject +NSDatePicker\|NSControl\|NSView\|NSResponder\|NSObject +NSDatePickerCell\|NSActionCell\|NSCell\|NSObject +NSDatePickerCellDelegate +NSDecimalNumber\|NSNumber\|NSValue\|NSObject +NSDecimalNumberBehaviors +NSDecimalNumberHandler\|NSObject +NSDeleteCommand\|NSScriptCommand\|NSObject +NSDictionary\|NSObject +NSDictionaryController\|NSArrayController\|NSObjectController\|NSController\|NSObject +NSDirectoryEnumerator\|NSEnumerator\|NSObject +NSDiscardableContent +NSDistantObject\|NSProxy +NSDistantObjectRequest\|NSObject +NSDistributedLock\|NSObject +NSDistributedNotificationCenter\|NSNotificationCenter\|NSObject +NSDockTile\|NSObject +NSDockTilePlugIn +NSDocument\|NSObject +NSDocumentController\|NSObject +NSDraggingDestination +NSDraggingImageComponent\|NSObject +NSDraggingInfo +NSDraggingItem\|NSObject +NSDraggingSession\|NSObject +NSDraggingSource +NSDrawer\|NSResponder\|NSObject +NSDrawerDelegate +NSEPSImageRep\|NSImageRep\|NSObject +NSEntityDescription\|NSObject +NSEntityMapping\|NSObject +NSEntityMigrationPolicy\|NSObject +NSEnumerator\|NSObject +NSError\|NSObject +NSEvent\|NSObject +NSException\|NSObject +NSExistsCommand\|NSScriptCommand\|NSObject +NSExpression\|NSObject +NSExpressionDescription\|NSPropertyDescription\|NSObject +NSFastEnumeration +NSFetchRequest\|NSPersistentStoreRequest\|NSObject +NSFetchRequestExpression\|NSExpression\|NSObject +NSFetchedPropertyDescription\|NSPropertyDescription\|NSObject +NSFileCoordinator\|NSObject +NSFileHandle\|NSObject +NSFileManager\|NSObject +NSFileManagerDelegate +NSFilePresenter +NSFileProviderExtension +NSFileSecurity\|NSObject +NSFileVersion\|NSObject +NSFileWrapper\|NSObject +NSFont\|NSObject +NSFontCollection\|NSObject +NSFontDescriptor\|NSObject +NSFontManager\|NSObject +NSFontPanel\|NSPanel\|NSWindow\|NSResponder\|NSObject +NSFormCell\|NSActionCell\|NSCell\|NSObject +NSFormatter\|NSObject +NSGarbageCollector\|NSObject +NSGetCommand\|NSScriptCommand\|NSObject +NSGlyphGenerator\|NSObject +NSGlyphInfo\|NSObject +NSGlyphStorage +NSGradient\|NSObject +NSGraphicsContext\|NSObject +NSHTTPCookie\|NSObject +NSHTTPCookieStorage\|NSObject +NSHTTPURLResponse\|NSURLResponse\|NSObject +NSHashTable\|NSObject +NSHelpManager\|NSObject +NSHost\|NSObject +NSIgnoreMisspelledWords +NSImage\|NSObject +NSImageCell\|NSCell\|NSObject +NSImageDelegate +NSImageRep\|NSObject +NSImageView\|NSControl\|NSView\|NSResponder\|NSObject +NSIncrementalStore\|NSPersistentStore\|NSObject +NSIncrementalStoreNode\|NSObject +NSIndexPath\|NSObject +NSIndexSet\|NSObject +NSIndexSpecifier\|NSScriptObjectSpecifier\|NSObject +NSInputManager\|NSObject +NSInputServer\|NSObject +NSInputServerMouseTracker +NSInputServiceProvider +NSInputStream\|NSStream\|NSObject +NSInvocation\|NSObject +NSInvocationOperation\|NSOperation\|NSObject +NSJSONSerialization\|NSObject +NSKeyedArchiver\|NSCoder\|NSObject +NSKeyedArchiverDelegate +NSKeyedUnarchiver\|NSCoder\|NSObject +NSKeyedUnarchiverDelegate +NSLayoutConstraint\|NSObject +NSLayoutManager\|NSObject +NSLayoutManagerDelegate +NSLevelIndicator\|NSControl\|NSView\|NSResponder\|NSObject +NSLevelIndicatorCell\|NSActionCell\|NSCell\|NSObject +NSLinguisticTagger\|NSObject +NSLocale\|NSObject +NSLock\|NSObject +NSLocking +NSLogicalTest\|NSScriptWhoseTest\|NSObject +NSMachBootstrapServer\|NSPortNameServer\|NSObject +NSMachPort\|NSPort\|NSObject +NSMachPortDelegate +NSManagedObject\|NSObject +NSManagedObjectContext\|NSObject +NSManagedObjectID\|NSObject +NSManagedObjectModel\|NSObject +NSMapTable\|NSObject +NSMappingModel\|NSObject +NSMatrix\|NSControl\|NSView\|NSResponder\|NSObject +NSMatrixDelegate +NSMediaLibraryBrowserController\|NSObject +NSMenu\|NSObject +NSMenuDelegate +NSMenuItem\|NSObject +NSMenuItemCell\|NSButtonCell\|NSActionCell\|NSCell\|NSObject +NSMenuView\|NSView\|NSResponder\|NSObject +NSMergeConflict\|NSObject +NSMergePolicy\|NSObject +NSMessagePort\|NSPort\|NSObject +NSMessagePortNameServer\|NSPortNameServer\|NSObject +NSMetadataItem\|NSObject +NSMetadataQuery\|NSObject +NSMetadataQueryAttributeValueTuple\|NSObject +NSMetadataQueryDelegate +NSMetadataQueryResultGroup\|NSObject +NSMethodSignature\|NSObject +NSMiddleSpecifier\|NSScriptObjectSpecifier\|NSObject +NSMigrationManager\|NSObject +NSMoveCommand\|NSScriptCommand\|NSObject +NSMovie\|NSObject +NSMovieView\|NSView\|NSResponder\|NSObject +NSMutableArray\|NSArray\|NSObject +NSMutableAttributedString\|NSAttributedString\|NSObject +NSMutableCharacterSet\|NSCharacterSet\|NSObject +NSMutableCopying +NSMutableData\|NSData\|NSObject +NSMutableDictionary\|NSDictionary\|NSObject +NSMutableFontCollection\|NSFontCollection\|NSObject +NSMutableIndexSet\|NSIndexSet\|NSObject +NSMutableOrderedSet\|NSOrderedSet\|NSObject +NSMutableParagraphStyle\|NSParagraphStyle\|NSObject +NSMutableSet\|NSSet\|NSObject +NSMutableString\|NSString\|NSObject +NSMutableURLRequest\|NSURLRequest\|NSObject +NSNameSpecifier\|NSScriptObjectSpecifier\|NSObject +NSNetService\|NSObject +NSNetServiceBrowser\|NSObject +NSNetServiceBrowserDelegate +NSNetServiceDelegate +NSNib\|NSObject +NSNibConnector\|NSObject +NSNibControlConnector\|NSNibConnector\|NSObject +NSNibOutletConnector\|NSNibConnector\|NSObject +NSNotification\|NSObject +NSNotificationCenter\|NSObject +NSNotificationQueue\|NSObject +NSNull\|NSObject +NSNumber\|NSValue\|NSObject +NSNumberFormatter\|NSFormatter\|NSObject +NSObject +NSObjectController\|NSController\|NSObject +NSOpenGLContext\|NSObject +NSOpenGLLayer\|CAOpenGLLayer\|CALayer\|NSObject +NSOpenGLPixelBuffer\|NSObject +NSOpenGLPixelFormat\|NSObject +NSOpenGLView\|NSView\|NSResponder\|NSObject +NSOpenPanel\|NSSavePanel\|NSPanel\|NSWindow\|NSResponder\|NSObject +NSOpenSavePanelDelegate +NSOperation\|NSObject +NSOperationQueue\|NSObject +NSOrderedSet\|NSObject +NSOrthography\|NSObject +NSOutlineView\|NSTableView\|NSControl\|NSView\|NSResponder\|NSObject +NSOutlineViewDataSource +NSOutlineViewDelegate +NSOutputStream\|NSStream\|NSObject +NSPDFImageRep\|NSImageRep\|NSObject +NSPDFInfo\|NSObject +NSPDFPanel\|NSObject +NSPICTImageRep\|NSImageRep\|NSObject +NSPageController\|NSViewController\|NSResponder\|NSObject +NSPageControllerDelegate +NSPageLayout\|NSObject +NSPanel\|NSWindow\|NSResponder\|NSObject +NSParagraphStyle\|NSObject +NSPasteboard\|NSObject +NSPasteboardItem\|NSObject +NSPasteboardItemDataProvider +NSPasteboardReading +NSPasteboardWriting +NSPathCell\|NSActionCell\|NSCell\|NSObject +NSPathCellDelegate +NSPathComponentCell\|NSTextFieldCell\|NSActionCell\|NSCell\|NSObject +NSPathControl\|NSControl\|NSView\|NSResponder\|NSObject +NSPathControlDelegate +NSPersistentDocument\|NSDocument\|NSObject +NSPersistentStore\|NSObject +NSPersistentStoreCoordinator\|NSObject +NSPersistentStoreCoordinatorSyncing +NSPersistentStoreRequest\|NSObject +NSPipe\|NSObject +NSPointerArray\|NSObject +NSPointerFunctions\|NSObject +NSPopUpButton\|NSButton\|NSControl\|NSView\|NSResponder\|NSObject +NSPopUpButtonCell\|NSMenuItemCell\|NSButtonCell\|NSActionCell\|NSCell\|NSObject +NSPopover\|NSResponder\|NSObject +NSPopoverDelegate +NSPort\|NSObject +NSPortCoder\|NSCoder\|NSObject +NSPortDelegate +NSPortMessage\|NSObject +NSPortNameServer\|NSObject +NSPositionalSpecifier\|NSObject +NSPredicate\|NSObject +NSPredicateEditor\|NSRuleEditor\|NSControl\|NSView\|NSResponder\|NSObject +NSPredicateEditorRowTemplate\|NSObject +NSPreferencePane\|NSObject +NSPrintInfo\|NSObject +NSPrintOperation\|NSObject +NSPrintPanel\|NSObject +NSPrintPanelAccessorizing +NSPrinter\|NSObject +NSProcessInfo\|NSObject +NSProgress\|NSObject +NSProgressIndicator\|NSView\|NSResponder\|NSObject +NSPropertyDescription\|NSObject +NSPropertyListSerialization\|NSObject +NSPropertyMapping\|NSObject +NSPropertySpecifier\|NSScriptObjectSpecifier\|NSObject +NSProtocolChecker\|NSProxy +NSProxy +NSPurgeableData\|NSMutableData\|NSData\|NSObject +NSQuickDrawView\|NSView\|NSResponder\|NSObject +NSQuitCommand\|NSScriptCommand\|NSObject +NSRandomSpecifier\|NSScriptObjectSpecifier\|NSObject +NSRangeSpecifier\|NSScriptObjectSpecifier\|NSObject +NSRecursiveLock\|NSObject +NSRegularExpression\|NSObject +NSRelationshipDescription\|NSPropertyDescription\|NSObject +NSRelativeSpecifier\|NSScriptObjectSpecifier\|NSObject +NSResponder\|NSObject +NSRuleEditor\|NSControl\|NSView\|NSResponder\|NSObject +NSRuleEditorDelegate +NSRulerMarker\|NSObject +NSRulerView\|NSView\|NSResponder\|NSObject +NSRunLoop\|NSObject +NSRunningApplication\|NSObject +NSSaveChangesRequest\|NSPersistentStoreRequest\|NSObject +NSSavePanel\|NSPanel\|NSWindow\|NSResponder\|NSObject +NSScanner\|NSObject +NSScreen\|NSObject +NSScriptClassDescription\|NSClassDescription\|NSObject +NSScriptCoercionHandler\|NSObject +NSScriptCommand\|NSObject +NSScriptCommandDescription\|NSObject +NSScriptExecutionContext\|NSObject +NSScriptObjectSpecifier\|NSObject +NSScriptSuiteRegistry\|NSObject +NSScriptWhoseTest\|NSObject +NSScrollView\|NSView\|NSResponder\|NSObject +NSScroller\|NSControl\|NSView\|NSResponder\|NSObject +NSSearchField\|NSTextField\|NSControl\|NSView\|NSResponder\|NSObject +NSSearchFieldCell\|NSTextFieldCell\|NSActionCell\|NSCell\|NSObject +NSSecureCoding +NSSecureTextField\|NSTextField\|NSControl\|NSView\|NSResponder\|NSObject +NSSecureTextFieldCell\|NSTextFieldCell\|NSActionCell\|NSCell\|NSObject +NSSegmentedCell\|NSActionCell\|NSCell\|NSObject +NSSegmentedControl\|NSControl\|NSView\|NSResponder\|NSObject +NSServicesMenuRequestor +NSSet\|NSObject +NSSetCommand\|NSScriptCommand\|NSObject +NSShadow\|NSObject +NSSharingService\|NSObject +NSSharingServiceDelegate +NSSharingServicePicker\|NSObject +NSSharingServicePickerDelegate +NSSimpleCString\|NSString\|NSObject +NSSimpleHorizontalTypesetter\|NSTypesetter\|NSObject +NSSlider\|NSControl\|NSView\|NSResponder\|NSObject +NSSliderCell\|NSActionCell\|NSCell\|NSObject +NSSocketPort\|NSPort\|NSObject +NSSocketPortNameServer\|NSPortNameServer\|NSObject +NSSortDescriptor\|NSObject +NSSound\|NSObject +NSSoundDelegate +NSSpecifierTest\|NSScriptWhoseTest\|NSObject +NSSpeechRecognizer\|NSObject +NSSpeechRecognizerDelegate +NSSpeechSynthesizer\|NSObject +NSSpeechSynthesizerDelegate +NSSpellChecker\|NSObject +NSSpellServer\|NSObject +NSSpellServerDelegate +NSSplitView\|NSView\|NSResponder\|NSObject +NSSplitViewDelegate +NSStackView\|NSView\|NSResponder\|NSObject +NSStackViewDelegate +NSStatusBar\|NSObject +NSStatusItem\|NSObject +NSStepper\|NSControl\|NSView\|NSResponder\|NSObject +NSStepperCell\|NSActionCell\|NSCell\|NSObject +NSStream\|NSObject +NSStreamDelegate +NSString\|NSObject +NSStringDrawingContext\|NSObject +NSTabView\|NSView\|NSResponder\|NSObject +NSTabViewDelegate +NSTabViewItem\|NSObject +NSTableCellView\|NSView\|NSResponder\|NSObject +NSTableColumn\|NSObject +NSTableHeaderCell\|NSTextFieldCell\|NSActionCell\|NSCell\|NSObject +NSTableHeaderView\|NSView\|NSResponder\|NSObject +NSTableRowView\|NSView\|NSResponder\|NSObject +NSTableView\|NSControl\|NSView\|NSResponder\|NSObject +NSTableViewDataSource +NSTableViewDelegate +NSTask\|NSObject +NSText\|NSView\|NSResponder\|NSObject +NSTextAlternatives\|NSObject +NSTextAttachment\|NSObject +NSTextAttachmentCell\|NSCell\|NSObject +NSTextAttachmentContainer +NSTextBlock\|NSObject +NSTextCheckingResult\|NSObject +NSTextContainer\|NSObject +NSTextDelegate +NSTextField\|NSControl\|NSView\|NSResponder\|NSObject +NSTextFieldCell\|NSActionCell\|NSCell\|NSObject +NSTextFieldDelegate +NSTextFinder\|NSObject +NSTextFinderBarContainer +NSTextFinderClient +NSTextInput +NSTextInputClient +NSTextInputContext\|NSObject +NSTextLayoutOrientationProvider +NSTextList\|NSObject +NSTextStorage\|NSMutableAttributedString\|NSAttributedString\|NSObject +NSTextStorageDelegate +NSTextTab\|NSObject +NSTextTable\|NSTextBlock\|NSObject +NSTextTableBlock\|NSTextBlock\|NSObject +NSTextView\|NSText\|NSView\|NSResponder\|NSObject +NSTextViewDelegate +NSThread\|NSObject +NSTimeZone\|NSObject +NSTimer\|NSObject +NSTokenField\|NSTextField\|NSControl\|NSView\|NSResponder\|NSObject +NSTokenFieldCell\|NSTextFieldCell\|NSActionCell\|NSCell\|NSObject +NSTokenFieldCellDelegate +NSTokenFieldDelegate +NSToolbar\|NSObject +NSToolbarDelegate +NSToolbarItem\|NSObject +NSToolbarItemGroup\|NSToolbarItem\|NSObject +NSToolbarItemValidations +NSTouch\|NSObject +NSTrackingArea\|NSObject +NSTreeController\|NSObjectController\|NSController\|NSObject +NSTreeNode\|NSObject +NSTypesetter\|NSObject +NSURL\|NSObject +NSURLAuthenticationChallenge\|NSObject +NSURLAuthenticationChallengeSender +NSURLCache\|NSObject +NSURLComponents\|NSObject +NSURLConnection\|NSObject +NSURLConnectionDataDelegate +NSURLConnectionDelegate +NSURLConnectionDownloadDelegate +NSURLCredential\|NSObject +NSURLCredentialStorage\|NSObject +NSURLDownload\|NSObject +NSURLDownloadDelegate +NSURLHandle\|NSObject +NSURLHandleClient +NSURLProtectionSpace\|NSObject +NSURLProtocol\|NSObject +NSURLProtocolClient +NSURLRequest\|NSObject +NSURLResponse\|NSObject +NSURLSession +NSURLSessionConfiguration +NSURLSessionDataDelegate +NSURLSessionDataTask +NSURLSessionDelegate +NSURLSessionDownloadDelegate +NSURLSessionDownloadTask +NSURLSessionTask +NSURLSessionTaskDelegate +NSURLSessionUploadTask +NSUUID\|NSObject +NSUbiquitousKeyValueStore\|NSObject +NSUnarchiver\|NSCoder\|NSObject +NSUndoManager\|NSObject +NSUniqueIDSpecifier\|NSScriptObjectSpecifier\|NSObject +NSUserAppleScriptTask\|NSUserScriptTask\|NSObject +NSUserAutomatorTask\|NSUserScriptTask\|NSObject +NSUserDefaults\|NSObject +NSUserDefaultsController\|NSController\|NSObject +NSUserInterfaceItemIdentification +NSUserInterfaceItemSearching +NSUserInterfaceValidations +NSUserNotification\|NSObject +NSUserNotificationCenter\|NSObject +NSUserNotificationCenterDelegate +NSUserScriptTask\|NSObject +NSUserUnixTask\|NSUserScriptTask\|NSObject +NSValidatedToobarItem +NSValidatedUserInterfaceItem +NSValue\|NSObject +NSValueTransformer\|NSObject +NSView\|NSResponder\|NSObject +NSViewAnimation\|NSAnimation\|NSObject +NSViewController\|NSResponder\|NSObject +NSWhoseSpecifier\|NSScriptObjectSpecifier\|NSObject +NSWindow\|NSResponder\|NSObject +NSWindowController\|NSResponder\|NSObject +NSWindowDelegate +NSWindowRestoration +NSWorkspace\|NSObject +NSXMLDTD\|NSXMLNode\|NSObject +NSXMLDTDNode\|NSXMLNode\|NSObject +NSXMLDocument\|NSXMLNode\|NSObject +NSXMLElement\|NSXMLNode\|NSObject +NSXMLNode\|NSObject +NSXMLParser\|NSObject +NSXMLParserDelegate +NSXPCConnection\|NSObject +NSXPCInterface\|NSObject +NSXPCListener\|NSObject +NSXPCListenerDelegate +NSXPCListenerEndpoint\|NSObject +NSXPCProxyCreating +QTCaptureAudioPreviewOutput\|QTCaptureOutput\|NSObject +QTCaptureConnection\|NSObject +QTCaptureDecompressedAudioOutput\|QTCaptureOutput\|NSObject +QTCaptureDecompressedVideoOutput\|QTCaptureOutput\|NSObject +QTCaptureDevice\|NSObject +QTCaptureDeviceInput\|QTCaptureInput\|NSObject +QTCaptureFileOutput\|QTCaptureOutput\|NSObject +QTCaptureInput\|NSObject +QTCaptureLayer\|CALayer\|NSObject +QTCaptureMovieFileOutput\|QTCaptureFileOutput\|QTCaptureOutput\|NSObject +QTCaptureOutput\|NSObject +QTCaptureSession\|NSObject +QTCaptureVideoPreviewOutput\|QTCaptureOutput\|NSObject +QTCaptureView\|NSView\|NSResponder\|NSObject +QTCompressionOptions\|NSObject +QTDataReference\|NSObject +QTExportOptions\|NSObject +QTExportSession\|NSObject +QTExportSessionDelegate +QTFormatDescription\|NSObject +QTMedia\|NSObject +QTMetadataItem\|NSObject +QTMovie\|NSObject +QTMovieLayer\|CALayer\|NSObject +QTMovieModernizer\|NSObject +QTMovieView\|NSView\|NSResponder\|NSObject +QTSampleBuffer\|NSObject +QTTrack\|NSObject +ScreenSaverDefaults\|NSUserDefaults\|NSObject +ScreenSaverView\|NSView\|NSResponder\|NSObject +UIAcceleration +UIAccelerometer +UIAccelerometerDelegate +UIAccessibilityCustomAction +UIAccessibilityElement +UIAccessibilityIdentification +UIAccessibilityReadingContent +UIActionSheet +UIActionSheetDelegate +UIActivity +UIActivityIndicatorView +UIActivityItemProvider +UIActivityItemSource +UIActivityViewController +UIAdaptivePresentationControllerDelegate +UIAlertAction +UIAlertController +UIAlertView +UIAlertViewDelegate +UIAppearance +UIAppearanceContainer +UIApplication +UIApplicationDelegate +UIAttachmentBehavior +UIBarButtonItem +UIBarItem +UIBarPositioning +UIBarPositioningDelegate +UIBezierPath +UIBlurEffect +UIButton +UICollectionReusableView +UICollectionView +UICollectionViewCell +UICollectionViewController +UICollectionViewDataSource +UICollectionViewDelegate +UICollectionViewDelegateFlowLayout +UICollectionViewFlowLayout +UICollectionViewFlowLayoutInvalidationContext +UICollectionViewLayout +UICollectionViewLayoutAttributes +UICollectionViewLayoutInvalidationContext +UICollectionViewTransitionLayout +UICollectionViewUpdateItem +UICollisionBehavior +UICollisionBehaviorDelegate +UIColor +UIContentContainer +UIControl +UICoordinateSpace +UIDataSourceModelAssociation +UIDatePicker +UIDevice +UIDictationPhrase +UIDocument +UIDocumentInteractionController +UIDocumentInteractionControllerDelegate +UIDocumentMenuDelegate +UIDocumentMenuViewController +UIDocumentPickerDelegate +UIDocumentPickerExtensionViewController +UIDocumentPickerViewController +UIDynamicAnimator +UIDynamicAnimatorDelegate +UIDynamicBehavior +UIDynamicItem +UIDynamicItemBehavior +UIEvent +UIFont +UIFontDescriptor +UIGestureRecognizer +UIGestureRecognizerDelegate +UIGravityBehavior +UIGuidedAccessRestrictionDelegate +UIImage +UIImageAsset +UIImagePickerController +UIImagePickerControllerDelegate +UIImageView +UIInputView +UIInputViewAudioFeedback +UIInputViewController +UIInterpolatingMotionEffect +UIKeyCommand +UIKeyInput +UILabel +UILayoutSupport +UILexicon +UILexiconEntry +UILocalNotification +UILocalizedIndexedCollation +UILongPressGestureRecognizer +UIManagedDocument +UIMarkupTextPrintFormatter +UIMenuController +UIMenuItem +UIMotionEffect +UIMotionEffectGroup +UIMutableUserNotificationAction +UIMutableUserNotificationCategory +UINavigationBar +UINavigationBarDelegate +UINavigationController +UINavigationControllerDelegate +UINavigationItem +UINib +UIObjectRestoration +UIPageControl +UIPageViewController +UIPageViewControllerDataSource +UIPageViewControllerDelegate +UIPanGestureRecognizer +UIPasteboard +UIPercentDrivenInteractiveTransition +UIPickerView +UIPickerViewAccessibilityDelegate +UIPickerViewDataSource +UIPickerViewDelegate +UIPinchGestureRecognizer +UIPopoverBackgroundView +UIPopoverBackgroundViewMethods +UIPopoverController +UIPopoverControllerDelegate +UIPopoverPresentationController +UIPopoverPresentationControllerDelegate +UIPresentationController +UIPrintFormatter +UIPrintInfo +UIPrintInteractionController +UIPrintInteractionControllerDelegate +UIPrintPageRenderer +UIPrintPaper +UIPrinter +UIPrinterPickerController +UIPrinterPickerControllerDelegate +UIProgressView +UIPushBehavior +UIReferenceLibraryViewController +UIRefreshControl +UIResponder +UIRotationGestureRecognizer +UIScreen +UIScreenEdgePanGestureRecognizer +UIScreenMode +UIScrollView +UIScrollViewAccessibilityDelegate +UIScrollViewDelegate +UISearchBar +UISearchBarDelegate +UISearchController +UISearchControllerDelegate +UISearchDisplayController +UISearchDisplayDelegate +UISearchResultsUpdating +UISegmentedControl +UISimpleTextPrintFormatter +UISlider +UISnapBehavior +UISplitViewController +UISplitViewControllerDelegate +UIStateRestoring +UIStepper +UIStoryboard +UIStoryboardPopoverSegue +UIStoryboardSegue +UISwipeGestureRecognizer +UISwitch +UITabBar +UITabBarController +UITabBarControllerDelegate +UITabBarDelegate +UITabBarItem +UITableView +UITableViewCell +UITableViewController +UITableViewDataSource +UITableViewDelegate +UITableViewHeaderFooterView +UITableViewRowAction +UITapGestureRecognizer +UITextChecker +UITextDocumentProxy +UITextField +UITextFieldDelegate +UITextInput +UITextInputDelegate +UITextInputMode +UITextInputStringTokenizer +UITextInputTokenizer +UITextInputTraits +UITextPosition +UITextRange +UITextSelecting +UITextSelectionRect +UITextView +UITextViewDelegate +UIToolbar +UIToolbarDelegate +UITouch +UITraitCollection +UITraitEnvironment +UIUserNotificationAction +UIUserNotificationCategory +UIUserNotificationSettings +UIVibrancyEffect +UIVideoEditorController +UIVideoEditorControllerDelegate +UIView +UIViewController +UIViewControllerAnimatedTransitioning +UIViewControllerContextTransitioning +UIViewControllerInteractiveTransitioning +UIViewControllerRestoration +UIViewControllerTransitionCoordinator +UIViewControllerTransitionCoordinatorContext +UIViewControllerTransitioningDelegate +UIViewPrintFormatter +UIVisualEffect +UIVisualEffectView +UIWebView +UIWebViewDelegate +UIWindow +WebArchive\|NSObject +WebBackForwardList\|NSObject +WebDataSource\|NSObject +WebDocumentRepresentation +WebDocumentSearching +WebDocumentText +WebDocumentView +WebDownload\|NSURLDownload\|NSObject +WebDownloadDelegate +WebFrame\|NSObject +WebFrameView\|NSView\|NSResponder\|NSObject +WebHistory\|NSObject +WebHistoryItem\|NSObject +WebOpenPanelResultListener\|NSObject +WebPlugInViewFactory +WebPolicyDecisionListener\|NSObject +WebPreferences\|NSObject +WebResource\|NSObject +WebScriptObject\|NSObject +WebUndefined\|NSObject +WebView\|NSView\|NSResponder\|NSObject \ No newline at end of file diff --git a/sources_non_forked/cocoa.vim/lib/cocoa_indexes/constants.txt b/sources_non_forked/cocoa.vim/lib/cocoa_indexes/constants.txt new file mode 100644 index 00000000..0c4ac2de --- /dev/null +++ b/sources_non_forked/cocoa.vim/lib/cocoa_indexes/constants.txt @@ -0,0 +1,2678 @@ +NSASCIIStringEncoding +NSAWTEventType +NSAboveBottom +NSAboveTop +NSAccessibilityPriorityHigh +NSAccessibilityPriorityLow +NSAccessibilityPriorityMedium +NSActivityAutomaticTerminationDisabled +NSActivityBackground +NSActivityIdleDisplaySleepDisabled +NSActivityIdleSystemSleepDisabled +NSActivityLatencyCritical +NSActivitySuddenTerminationDisabled +NSActivityUserInitiated +NSActivityUserInitiatedAllowingIdleSystemSleep +NSAddEntityMappingType +NSAddTraitFontAction +NSAdminApplicationDirectory +NSAdobeCNS1CharacterCollection +NSAdobeGB1CharacterCollection +NSAdobeJapan1CharacterCollection +NSAdobeJapan2CharacterCollection +NSAdobeKorea1CharacterCollection +NSAggregateExpressionType +NSAlertAlternateReturn +NSAlertDefaultReturn +NSAlertErrorReturn +NSAlertFirstButtonReturn +NSAlertOtherReturn +NSAlertSecondButtonReturn +NSAlertThirdButtonReturn +NSAlignAllEdgesInward +NSAlignAllEdgesNearest +NSAlignAllEdgesOutward +NSAlignHeightInward +NSAlignHeightNearest +NSAlignHeightOutward +NSAlignMaxXInward +NSAlignMaxXNearest +NSAlignMaxXOutward +NSAlignMaxYInward +NSAlignMaxYNearest +NSAlignMaxYOutward +NSAlignMinXInward +NSAlignMinXNearest +NSAlignMinXOutward +NSAlignMinYInward +NSAlignMinYNearest +NSAlignMinYOutward +NSAlignRectFlipped +NSAlignWidthInward +NSAlignWidthNearest +NSAlignWidthOutward +NSAllApplicationsDirectory +NSAllDomainsMask +NSAllLibrariesDirectory +NSAllPredicateModifier +NSAllScrollerParts +NSAlphaFirstBitmapFormat +NSAlphaNonpremultipliedBitmapFormat +NSAlphaShiftKeyMask +NSAlternateKeyMask +NSAnchoredSearch +NSAndPredicateType +NSAnimationBlocking +NSAnimationEaseIn +NSAnimationEaseInOut +NSAnimationEaseOut +NSAnimationEffectDisappearingItemDefault +NSAnimationEffectPoof +NSAnimationLinear +NSAnimationNonblocking +NSAnimationNonblockingThreaded +NSAnyEventMask +NSAnyKeyExpressionType +NSAnyPredicateModifier +NSAnyType +NSAppKitDefined +NSAppKitDefinedMask +NSApplicationActivateAllWindows +NSApplicationActivateIgnoringOtherApps +NSApplicationActivatedEventType +NSApplicationActivationPolicyAccessory +NSApplicationActivationPolicyProhibited +NSApplicationActivationPolicyRegular +NSApplicationDeactivatedEventType +NSApplicationDefined +NSApplicationDefinedMask +NSApplicationDelegateReplyCancel +NSApplicationDelegateReplyFailure +NSApplicationDelegateReplySuccess +NSApplicationDirectory +NSApplicationOcclusionStateVisible +NSApplicationPresentationAutoHideDock +NSApplicationPresentationAutoHideMenuBar +NSApplicationPresentationAutoHideToolbar +NSApplicationPresentationDefault +NSApplicationPresentationDisableAppleMenu +NSApplicationPresentationDisableForceQuit +NSApplicationPresentationDisableHideApplication +NSApplicationPresentationDisableMenuBarTransparency +NSApplicationPresentationDisableProcessSwitching +NSApplicationPresentationDisableSessionTermination +NSApplicationPresentationFullScreen +NSApplicationPresentationHideDock +NSApplicationPresentationHideMenuBar +NSApplicationScriptsDirectory +NSApplicationSupportDirectory +NSArgumentEvaluationScriptError +NSArgumentsWrongScriptError +NSAscendingPageOrder +NSAsciiWithDoubleByteEUCGlyphPacking +NSAtBottom +NSAtTop +NSAtomicWrite +NSAttachmentCharacter +NSAttributedStringEnumerationLongestEffectiveRangeNotRequired +NSAttributedStringEnumerationReverse +NSAutoPagination +NSAutosaveAsOperation +NSAutosaveElsewhereOperation +NSAutosaveInPlaceOperation +NSAutosaveOperation +NSAutosavedInformationDirectory +NSBMPFileType +NSBackTabCharacter +NSBackgroundStyleDark +NSBackgroundStyleLight +NSBackgroundStyleLowered +NSBackgroundStyleRaised +NSBackgroundTab +NSBackingStoreBuffered +NSBackingStoreNonretained +NSBackingStoreRetained +NSBackspaceCharacter +NSBacktabTextMovement +NSBackwardsSearch +NSBeginFunctionKey +NSBeginsWithComparison +NSBeginsWithPredicateOperatorType +NSBelowBottom +NSBelowTop +NSBetweenPredicateOperatorType +NSBevelLineJoinStyle +NSBezelBorder +NSBinarySearchingFirstEqual +NSBinarySearchingInsertionIndex +NSBinarySearchingLastEqual +NSBlockExpressionType +NSBlueControlTint +NSBoldFontMask +NSBorderlessWindowMask +NSBottomTabsBezelBorder +NSBoxCustom +NSBoxOldStyle +NSBoxPrimary +NSBoxSecondary +NSBoxSeparator +NSBreakFunctionKey +NSBrowserAutoColumnResizing +NSBrowserDropAbove +NSBrowserDropOn +NSBrowserNoColumnResizing +NSBrowserUserColumnResizing +NSBundleExecutableArchitectureI386 +NSBundleExecutableArchitecturePPC +NSBundleExecutableArchitecturePPC64 +NSBundleExecutableArchitectureX86_64 +NSButtLineCapStyle +NSByteCountFormatterCountStyleBinary +NSByteCountFormatterCountStyleDecimal +NSByteCountFormatterCountStyleFile +NSByteCountFormatterCountStyleMemory +NSByteCountFormatterUseAll +NSByteCountFormatterUseBytes +NSByteCountFormatterUseDefault +NSByteCountFormatterUseEB +NSByteCountFormatterUseGB +NSByteCountFormatterUseKB +NSByteCountFormatterUseMB +NSByteCountFormatterUsePB +NSByteCountFormatterUseTB +NSByteCountFormatterUseYBOrHigher +NSByteCountFormatterUseZB +NSCMYKColorSpaceModel +NSCMYKModeColorPanel +NSCachesDirectory +NSCalculationDivideByZero +NSCalculationLossOfPrecision +NSCalculationNoError +NSCalculationOverflow +NSCalculationUnderflow +NSCalendarCalendarUnit +NSCalendarMatchFirst +NSCalendarMatchLast +NSCalendarMatchNextTime +NSCalendarMatchNextTimePreservingSmallerUnits +NSCalendarMatchPreviousTimePreservingSmallerUnits +NSCalendarMatchStrictly +NSCalendarSearchBackwards +NSCalendarUnitCalendar +NSCalendarUnitDay +NSCalendarUnitEra +NSCalendarUnitHour +NSCalendarUnitMinute +NSCalendarUnitMonth +NSCalendarUnitNanosecond +NSCalendarUnitQuarter +NSCalendarUnitSecond +NSCalendarUnitTimeZone +NSCalendarUnitWeekOfMonth +NSCalendarUnitWeekOfYear +NSCalendarUnitWeekday +NSCalendarUnitWeekdayOrdinal +NSCalendarUnitYear +NSCalendarUnitYearForWeekOfYear +NSCalendarWrapComponents +NSCancelButton +NSCancelTextMovement +NSCannotCreateScriptCommandError +NSCarriageReturnCharacter +NSCaseInsensitivePredicateOption +NSCaseInsensitiveSearch +NSCellAllowsMixedState +NSCellChangesContents +NSCellDisabled +NSCellEditable +NSCellHasImageHorizontal +NSCellHasImageOnLeftOrBottom +NSCellHasOverlappingImage +NSCellHighlighted +NSCellHitContentArea +NSCellHitEditableTextArea +NSCellHitNone +NSCellHitTrackableArea +NSCellIsBordered +NSCellIsInsetButton +NSCellLightsByBackground +NSCellLightsByContents +NSCellLightsByGray +NSCellState +NSCenterTabStopType +NSCenterTextAlignment +NSChangeAutosaved +NSChangeBackgroundCell +NSChangeBackgroundCellMask +NSChangeCleared +NSChangeDiscardable +NSChangeDone +NSChangeGrayCell +NSChangeGrayCellMask +NSChangeReadOtherContents +NSChangeRedone +NSChangeUndone +NSCircularBezelStyle +NSCircularSlider +NSClearControlTint +NSClearDisplayFunctionKey +NSClearLineFunctionKey +NSClipPagination +NSClockAndCalendarDatePickerStyle +NSClosableWindowMask +NSClosePathBezierPathElement +NSCollectionViewDropBefore +NSCollectionViewDropOn +NSCollectorDisabledOption +NSColorListModeColorPanel +NSColorPanelAllModesMask +NSColorPanelCMYKModeMask +NSColorPanelColorListModeMask +NSColorPanelCrayonModeMask +NSColorPanelCustomPaletteModeMask +NSColorPanelGrayModeMask +NSColorPanelHSBModeMask +NSColorPanelRGBModeMask +NSColorPanelWheelModeMask +NSColorRenderingIntentAbsoluteColorimetric +NSColorRenderingIntentDefault +NSColorRenderingIntentPerceptual +NSColorRenderingIntentRelativeColorimetric +NSColorRenderingIntentSaturation +NSCommandKeyMask +NSCompositeClear +NSCompositeCopy +NSCompositeDestinationAtop +NSCompositeDestinationIn +NSCompositeDestinationOut +NSCompositeDestinationOver +NSCompositeHighlight +NSCompositePlusDarker +NSCompositePlusLighter +NSCompositeSourceAtop +NSCompositeSourceIn +NSCompositeSourceOut +NSCompositeSourceOver +NSCompositeXOR +NSCompressedFontMask +NSCondensedFontMask +NSConfinementConcurrencyType +NSConstantValueExpressionType +NSContainerSpecifierError +NSContainsComparison +NSContainsPredicateOperatorType +NSContentsCellMask +NSContinuousCapacityLevelIndicatorStyle +NSControlCharacterContainerBreakAction +NSControlCharacterHorizontalTabAction +NSControlCharacterLineBreakAction +NSControlCharacterParagraphBreakAction +NSControlCharacterWhitespaceAction +NSControlCharacterZeroAdvancementAction +NSControlGlyph +NSControlKeyMask +NSCopyEntityMappingType +NSCoreDataError +NSCoreServiceDirectory +NSCorrectionIndicatorTypeDefault +NSCorrectionIndicatorTypeGuesses +NSCorrectionIndicatorTypeReversion +NSCorrectionResponseAccepted +NSCorrectionResponseEdited +NSCorrectionResponseIgnored +NSCorrectionResponseNone +NSCorrectionResponseRejected +NSCorrectionResponseReverted +NSCrayonModeColorPanel +NSCriticalAlertStyle +NSCriticalRequest +NSCursorPointingDevice +NSCursorUpdate +NSCursorUpdateMask +NSCurveToBezierPathElement +NSCustomEntityMappingType +NSCustomPaletteModeColorPanel +NSCustomSelectorPredicateOperatorType +NSDataBase64DecodingIgnoreUnknownCharacters +NSDataBase64Encoding64CharacterLineLength +NSDataBase64Encoding76CharacterLineLength +NSDataBase64EncodingEndLineWithCarriageReturn +NSDataBase64EncodingEndLineWithLineFeed +NSDataReadingMapped +NSDataReadingMappedAlways +NSDataReadingMappedIfSafe +NSDataReadingUncached +NSDataSearchAnchored +NSDataSearchBackwards +NSDataWritingAtomic +NSDataWritingFileProtectionComplete +NSDataWritingFileProtectionCompleteUnlessOpen +NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication +NSDataWritingFileProtectionMask +NSDataWritingFileProtectionNone +NSDataWritingWithoutOverwriting +NSDateComponentUndefined +NSDateFormatterBehavior10_0 +NSDateFormatterBehavior10_4 +NSDateFormatterBehaviorDefault +NSDateFormatterFullStyle +NSDateFormatterLongStyle +NSDateFormatterMediumStyle +NSDateFormatterNoStyle +NSDateFormatterShortStyle +NSDayCalendarUnit +NSDecimalTabStopType +NSDefaultControlTint +NSDefaultTokenStyle +NSDeleteCharFunctionKey +NSDeleteCharacter +NSDeleteFunctionKey +NSDeleteLineFunctionKey +NSDemoApplicationDirectory +NSDescendingPageOrder +NSDesktopDirectory +NSDeveloperApplicationDirectory +NSDeveloperDirectory +NSDeviceIndependentModifierFlagsMask +NSDeviceNColorSpaceModel +NSDiacriticInsensitivePredicateOption +NSDiacriticInsensitiveSearch +NSDirectPredicateModifier +NSDirectSelection +NSDirectoryEnumerationSkipsHiddenFiles +NSDirectoryEnumerationSkipsPackageDescendants +NSDirectoryEnumerationSkipsSubdirectoryDescendants +NSDisclosureBezelStyle +NSDiscreteCapacityLevelIndicatorStyle +NSDisplayWindowRunLoopOrdering +NSDocModalWindowMask +NSDocumentDirectory +NSDocumentationDirectory +NSDoubleType +NSDownArrowFunctionKey +NSDownTextMovement +NSDownloadsDirectory +NSDragOperationAll_Obsolete +NSDragOperationCopy +NSDragOperationDelete +NSDragOperationEvery +NSDragOperationGeneric +NSDragOperationLink +NSDragOperationMove +NSDragOperationNone +NSDragOperationPrivate +NSDraggingContextOutsideApplication +NSDraggingContextWithinApplication +NSDraggingFormationDefault +NSDraggingFormationList +NSDraggingFormationNone +NSDraggingFormationPile +NSDraggingFormationStack +NSDraggingItemEnumerationClearNonenumeratedImages +NSDraggingItemEnumerationConcurrent +NSDrawerClosedState +NSDrawerClosingState +NSDrawerOpenState +NSDrawerOpeningState +NSEndFunctionKey +NSEndsWithComparison +NSEndsWithPredicateOperatorType +NSEnterCharacter +NSEntityMigrationPolicyError +NSEnumerationConcurrent +NSEnumerationReverse +NSEqualToComparison +NSEqualToPredicateOperatorType +NSEraCalendarUnit +NSEraDatePickerElementFlag +NSEraserPointingDevice +NSErrorMergePolicyType +NSEvaluatedObjectExpressionType +NSEvenOddWindingRule +NSEventGestureAxisHorizontal +NSEventGestureAxisNone +NSEventGestureAxisVertical +NSEventMaskBeginGesture +NSEventMaskEndGesture +NSEventMaskGesture +NSEventMaskMagnify +NSEventMaskRotate +NSEventMaskSmartMagnify +NSEventMaskSwipe +NSEventPhaseBegan +NSEventPhaseCancelled +NSEventPhaseChanged +NSEventPhaseEnded +NSEventPhaseMayBegin +NSEventPhaseNone +NSEventPhaseStationary +NSEventSwipeTrackingClampGestureAmount +NSEventSwipeTrackingLockDirection +NSEventTypeBeginGesture +NSEventTypeEndGesture +NSEventTypeGesture +NSEventTypeMagnify +NSEventTypeQuickLook +NSEventTypeRotate +NSEventTypeSmartMagnify +NSEventTypeSwipe +NSEverySubelement +NSExclude10_4ElementsIconCreationOption +NSExcludeQuickDrawElementsIconCreationOption +NSExecutableArchitectureMismatchError +NSExecutableErrorMaximum +NSExecutableErrorMinimum +NSExecutableLinkError +NSExecutableLoadError +NSExecutableNotLoadableError +NSExecutableRuntimeMismatchError +NSExecuteFunctionKey +NSExpandedFontMask +NSExternalRecordImportError +NSF10FunctionKey +NSF11FunctionKey +NSF12FunctionKey +NSF13FunctionKey +NSF14FunctionKey +NSF15FunctionKey +NSF16FunctionKey +NSF17FunctionKey +NSF18FunctionKey +NSF19FunctionKey +NSF1FunctionKey +NSF20FunctionKey +NSF21FunctionKey +NSF22FunctionKey +NSF23FunctionKey +NSF24FunctionKey +NSF25FunctionKey +NSF26FunctionKey +NSF27FunctionKey +NSF28FunctionKey +NSF29FunctionKey +NSF2FunctionKey +NSF30FunctionKey +NSF31FunctionKey +NSF32FunctionKey +NSF33FunctionKey +NSF34FunctionKey +NSF35FunctionKey +NSF3FunctionKey +NSF4FunctionKey +NSF5FunctionKey +NSF6FunctionKey +NSF7FunctionKey +NSF8FunctionKey +NSF9FunctionKey +NSFPCurrentField +NSFPPreviewButton +NSFPPreviewField +NSFPRevertButton +NSFPSetButton +NSFPSizeField +NSFPSizeTitle +NSFeatureUnsupportedError +NSFetchRequestExpressionType +NSFetchRequestType +NSFileCoordinatorReadingResolvesSymbolicLink +NSFileCoordinatorReadingWithoutChanges +NSFileCoordinatorWritingForDeleting +NSFileCoordinatorWritingForMerging +NSFileCoordinatorWritingForMoving +NSFileCoordinatorWritingForReplacing +NSFileErrorMaximum +NSFileErrorMinimum +NSFileHandlingPanelCancelButton +NSFileHandlingPanelOKButton +NSFileLockingError +NSFileManagerItemReplacementUsingNewMetadataOnly +NSFileManagerItemReplacementWithoutDeletingBackupItem +NSFileNoSuchFileError +NSFileReadCorruptFileError +NSFileReadInapplicableStringEncodingError +NSFileReadInvalidFileNameError +NSFileReadNoPermissionError +NSFileReadNoSuchFileError +NSFileReadTooLargeError +NSFileReadUnknownError +NSFileReadUnknownStringEncodingError +NSFileReadUnsupportedSchemeError +NSFileVersionAddingByMoving +NSFileVersionReplacingByMoving +NSFileWrapperReadingImmediate +NSFileWrapperReadingWithoutMapping +NSFileWrapperWritingAtomic +NSFileWrapperWritingWithNameUpdating +NSFileWriteFileExistsError +NSFileWriteInapplicableStringEncodingError +NSFileWriteInvalidFileNameError +NSFileWriteNoPermissionError +NSFileWriteOutOfSpaceError +NSFileWriteUnknownError +NSFileWriteUnsupportedSchemeError +NSFileWriteVolumeReadOnlyError +NSFindFunctionKey +NSFindPanelActionNext +NSFindPanelActionPrevious +NSFindPanelActionReplace +NSFindPanelActionReplaceAll +NSFindPanelActionReplaceAllInSelection +NSFindPanelActionReplaceAndFind +NSFindPanelActionSelectAll +NSFindPanelActionSelectAllInSelection +NSFindPanelActionSetFindString +NSFindPanelActionShowFindPanel +NSFindPanelSubstringMatchTypeContains +NSFindPanelSubstringMatchTypeEndsWith +NSFindPanelSubstringMatchTypeFullWord +NSFindPanelSubstringMatchTypeStartsWith +NSFitPagination +NSFixedPitchFontMask +NSFlagsChanged +NSFlagsChangedMask +NSFloatType +NSFloatingPointSamplesBitmapFormat +NSFocusRingAbove +NSFocusRingBelow +NSFocusRingOnly +NSFocusRingTypeDefault +NSFocusRingTypeExterior +NSFocusRingTypeNone +NSFontAntialiasedIntegerAdvancementsRenderingMode +NSFontAntialiasedRenderingMode +NSFontBoldTrait +NSFontClarendonSerifsClass +NSFontCollectionApplicationOnlyMask +NSFontCollectionVisibilityComputer +NSFontCollectionVisibilityProcess +NSFontCollectionVisibilityUser +NSFontCondensedTrait +NSFontDefaultRenderingMode +NSFontExpandedTrait +NSFontFamilyClassMask +NSFontFreeformSerifsClass +NSFontIntegerAdvancementsRenderingMode +NSFontItalicTrait +NSFontModernSerifsClass +NSFontMonoSpaceTrait +NSFontOldStyleSerifsClass +NSFontOrnamentalsClass +NSFontPanelAllEffectsModeMask +NSFontPanelAllModesMask +NSFontPanelCollectionModeMask +NSFontPanelDocumentColorEffectModeMask +NSFontPanelFaceModeMask +NSFontPanelShadowEffectModeMask +NSFontPanelSizeModeMask +NSFontPanelStandardModesMask +NSFontPanelStrikethroughEffectModeMask +NSFontPanelTextColorEffectModeMask +NSFontPanelUnderlineEffectModeMask +NSFontSansSerifClass +NSFontScriptsClass +NSFontSlabSerifsClass +NSFontSymbolicClass +NSFontTransitionalSerifsClass +NSFontUIOptimizedTrait +NSFontUnknownClass +NSFontVerticalTrait +NSForcedOrderingSearch +NSFormFeedCharacter +NSFormattingError +NSFormattingErrorMaximum +NSFormattingErrorMinimum +NSFourByteGlyphPacking +NSFullScreenWindowMask +NSFunctionExpressionType +NSFunctionKeyMask +NSGIFFileType +NSGlyphAbove +NSGlyphAttributeBidiLevel +NSGlyphAttributeElastic +NSGlyphAttributeInscribe +NSGlyphAttributeSoft +NSGlyphBelow +NSGlyphInscribeAbove +NSGlyphInscribeBase +NSGlyphInscribeBelow +NSGlyphInscribeOverBelow +NSGlyphInscribeOverstrike +NSGlyphLayoutAgainstAPoint +NSGlyphLayoutAtAPoint +NSGlyphLayoutWithPrevious +NSGlyphPropertyControlCharacter +NSGlyphPropertyElastic +NSGlyphPropertyNonBaseCharacter +NSGlyphPropertyNull +NSGradientConcaveStrong +NSGradientConcaveWeak +NSGradientConvexStrong +NSGradientConvexWeak +NSGradientDrawsAfterEndingLocation +NSGradientDrawsBeforeStartingLocation +NSGradientNone +NSGraphiteControlTint +NSGrayColorSpaceModel +NSGrayModeColorPanel +NSGreaterThanComparison +NSGreaterThanOrEqualToComparison +NSGreaterThanOrEqualToPredicateOperatorType +NSGreaterThanPredicateOperatorType +NSGrooveBorder +NSHPUXOperatingSystem +NSHSBModeColorPanel +NSHTTPCookieAcceptPolicyAlways +NSHTTPCookieAcceptPolicyNever +NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain +NSHUDWindowMask +NSHashTableCopyIn +NSHashTableObjectPointerPersonality +NSHashTableStrongMemory +NSHashTableWeakMemory +NSHashTableZeroingWeakMemory +NSHeavierFontAction +NSHelpButtonBezelStyle +NSHelpFunctionKey +NSHelpKeyMask +NSHighlightModeMatrix +NSHomeFunctionKey +NSHorizontalRuler +NSHourCalendarUnit +NSHourMinuteDatePickerElementFlag +NSHourMinuteSecondDatePickerElementFlag +NSISO2022JPStringEncoding +NSISOLatin1StringEncoding +NSISOLatin2StringEncoding +NSIdentityMappingCharacterCollection +NSIllegalTextMovement +NSImageAbove +NSImageAlignBottom +NSImageAlignBottomLeft +NSImageAlignBottomRight +NSImageAlignCenter +NSImageAlignLeft +NSImageAlignRight +NSImageAlignTop +NSImageAlignTopLeft +NSImageAlignTopRight +NSImageBelow +NSImageCacheAlways +NSImageCacheBySize +NSImageCacheDefault +NSImageCacheNever +NSImageCellType +NSImageFrameButton +NSImageFrameGrayBezel +NSImageFrameGroove +NSImageFrameNone +NSImageFramePhoto +NSImageInterpolationDefault +NSImageInterpolationHigh +NSImageInterpolationLow +NSImageInterpolationMedium +NSImageInterpolationNone +NSImageLeft +NSImageLoadStatusCancelled +NSImageLoadStatusCompleted +NSImageLoadStatusInvalidData +NSImageLoadStatusReadError +NSImageLoadStatusUnexpectedEOF +NSImageOnly +NSImageOverlaps +NSImageRepLoadStatusCompleted +NSImageRepLoadStatusInvalidData +NSImageRepLoadStatusReadingHeader +NSImageRepLoadStatusUnexpectedEOF +NSImageRepLoadStatusUnknownType +NSImageRepLoadStatusWillNeedAllData +NSImageRepMatchesDevice +NSImageRight +NSImageScaleAxesIndependently +NSImageScaleNone +NSImageScaleProportionallyDown +NSImageScaleProportionallyUpOrDown +NSInPredicateOperatorType +NSIndexSubelement +NSIndexedColorSpaceModel +NSInferredMappingModelError +NSInformationalAlertStyle +NSInformationalRequest +NSInlineBezelStyle +NSInputMethodsDirectory +NSInsertCharFunctionKey +NSInsertFunctionKey +NSInsertLineFunctionKey +NSIntType +NSInternalScriptError +NSInternalSpecifierError +NSIntersectSetExpressionType +NSInvalidIndexSpecifierError +NSItalicFontMask +NSItemReplacementDirectory +NSJPEG2000FileType +NSJPEGFileType +NSJSONReadingAllowFragments +NSJSONReadingMutableContainers +NSJSONReadingMutableLeaves +NSJSONWritingPrettyPrinted +NSJapaneseEUCGlyphPacking +NSJapaneseEUCStringEncoding +NSJustifiedTextAlignment +NSKeyDown +NSKeyDownMask +NSKeyPathExpressionType +NSKeySpecifierEvaluationScriptError +NSKeyUp +NSKeyUpMask +NSKeyValueChangeInsertion +NSKeyValueChangeRemoval +NSKeyValueChangeReplacement +NSKeyValueChangeSetting +NSKeyValueIntersectSetMutation +NSKeyValueMinusSetMutation +NSKeyValueObservingOptionInitial +NSKeyValueObservingOptionNew +NSKeyValueObservingOptionOld +NSKeyValueObservingOptionPrior +NSKeyValueSetSetMutation +NSKeyValueUnionSetMutation +NSKeyValueValidationError +NSLABColorSpaceModel +NSLandscapeOrientation +NSLayoutAttributeBaseline +NSLayoutAttributeBottom +NSLayoutAttributeBottomMargin +NSLayoutAttributeCenterX +NSLayoutAttributeCenterXWithinMargins +NSLayoutAttributeCenterY +NSLayoutAttributeCenterYWithinMargins +NSLayoutAttributeFirstBaseline +NSLayoutAttributeHeight +NSLayoutAttributeLastBaseline +NSLayoutAttributeLeading +NSLayoutAttributeLeadingMargin +NSLayoutAttributeLeft +NSLayoutAttributeLeftMargin +NSLayoutAttributeNotAnAttribute +NSLayoutAttributeRight +NSLayoutAttributeRightMargin +NSLayoutAttributeTop +NSLayoutAttributeTopMargin +NSLayoutAttributeTrailing +NSLayoutAttributeTrailingMargin +NSLayoutAttributeWidth +NSLayoutCantFit +NSLayoutConstraintOrientationHorizontal +NSLayoutConstraintOrientationVertical +NSLayoutDone +NSLayoutFormatAlignAllBaseline +NSLayoutFormatAlignAllBottom +NSLayoutFormatAlignAllCenterX +NSLayoutFormatAlignAllCenterY +NSLayoutFormatAlignAllFirstBaseline +NSLayoutFormatAlignAllLastBaseline +NSLayoutFormatAlignAllLeading +NSLayoutFormatAlignAllLeft +NSLayoutFormatAlignAllRight +NSLayoutFormatAlignAllTop +NSLayoutFormatAlignAllTrailing +NSLayoutFormatAlignmentMask +NSLayoutFormatDirectionLeadingToTrailing +NSLayoutFormatDirectionLeftToRight +NSLayoutFormatDirectionMask +NSLayoutFormatDirectionRightToLeft +NSLayoutLeftToRight +NSLayoutNotDone +NSLayoutOutOfGlyphs +NSLayoutPriorityDefaultHigh +NSLayoutPriorityDefaultLow +NSLayoutPriorityDragThatCanResizeWindow +NSLayoutPriorityDragThatCannotResizeWindow +NSLayoutPriorityFittingSizeCompression +NSLayoutPriorityRequired +NSLayoutPriorityWindowSizeStayPut +NSLayoutRelationEqual +NSLayoutRelationGreaterThanOrEqual +NSLayoutRelationLessThanOrEqual +NSLayoutRightToLeft +NSLeftArrowFunctionKey +NSLeftMouseDown +NSLeftMouseDownMask +NSLeftMouseDragged +NSLeftMouseDraggedMask +NSLeftMouseUp +NSLeftMouseUpMask +NSLeftTabStopType +NSLeftTabsBezelBorder +NSLeftTextAlignment +NSLeftTextMovement +NSLessThanComparison +NSLessThanOrEqualToComparison +NSLessThanOrEqualToPredicateOperatorType +NSLessThanPredicateOperatorType +NSLibraryDirectory +NSLighterFontAction +NSLikePredicateOperatorType +NSLineBorder +NSLineBreakByCharWrapping +NSLineBreakByClipping +NSLineBreakByTruncatingHead +NSLineBreakByTruncatingMiddle +NSLineBreakByTruncatingTail +NSLineBreakByWordWrapping +NSLineDoesntMove +NSLineMovesDown +NSLineMovesLeft +NSLineMovesRight +NSLineMovesUp +NSLineSeparatorCharacter +NSLineSweepDown +NSLineSweepLeft +NSLineSweepRight +NSLineSweepUp +NSLineToBezierPathElement +NSLinearSlider +NSLinguisticTaggerJoinNames +NSLinguisticTaggerOmitOther +NSLinguisticTaggerOmitPunctuation +NSLinguisticTaggerOmitWhitespace +NSLinguisticTaggerOmitWords +NSListModeMatrix +NSLiteralSearch +NSLocalDomainMask +NSLocaleLanguageDirectionBottomToTop +NSLocaleLanguageDirectionLeftToRight +NSLocaleLanguageDirectionRightToLeft +NSLocaleLanguageDirectionTopToBottom +NSLocaleLanguageDirectionUnknown +NSMACHOperatingSystem +NSMacOSRomanStringEncoding +NSMachPortDeallocateNone +NSMachPortDeallocateReceiveRight +NSMachPortDeallocateSendRight +NSMacintoshInterfaceStyle +NSMainQueueConcurrencyType +NSManagedObjectContextLockingError +NSManagedObjectExternalRelationshipError +NSManagedObjectIDResultType +NSManagedObjectMergeError +NSManagedObjectReferentialIntegrityError +NSManagedObjectResultType +NSManagedObjectValidationError +NSMapTableCopyIn +NSMapTableObjectPointerPersonality +NSMapTableStrongMemory +NSMapTableWeakMemory +NSMapTableZeroingWeakMemory +NSMappedRead +NSMatchesPredicateOperatorType +NSMatchingAnchored +NSMatchingCompleted +NSMatchingHitEnd +NSMatchingInternalError +NSMatchingProgress +NSMatchingReportCompletion +NSMatchingReportProgress +NSMatchingRequiredEnd +NSMatchingWithTransparentBounds +NSMatchingWithoutAnchoringBounds +NSMaxXEdge +NSMaxYEdge +NSMediaLibraryAudio +NSMediaLibraryImage +NSMediaLibraryMovie +NSMenuFunctionKey +NSMenuPropertyItemAccessibilityDescription +NSMenuPropertyItemAttributedTitle +NSMenuPropertyItemEnabled +NSMenuPropertyItemImage +NSMenuPropertyItemKeyEquivalent +NSMenuPropertyItemTitle +NSMergeByPropertyObjectTrumpMergePolicyType +NSMergeByPropertyStoreTrumpMergePolicyType +NSMiddleSubelement +NSMigrationCancelledError +NSMigrationError +NSMigrationManagerDestinationStoreError +NSMigrationManagerSourceStoreError +NSMigrationMissingMappingModelError +NSMigrationMissingSourceModelError +NSMinXEdge +NSMinYEdge +NSMiniControlSize +NSMiniaturizableWindowMask +NSMinusSetExpressionType +NSMinuteCalendarUnit +NSMiterLineJoinStyle +NSMixedState +NSModalResponseAbort +NSModalResponseCancel +NSModalResponseContinue +NSModalResponseOK +NSModalResponseStop +NSModeSwitchFunctionKey +NSMomentaryChangeButton +NSMomentaryLight +NSMomentaryLightButton +NSMomentaryPushButton +NSMomentaryPushInButton +NSMonthCalendarUnit +NSMouseEntered +NSMouseEnteredMask +NSMouseEventSubtype +NSMouseExited +NSMouseExitedMask +NSMouseMoved +NSMouseMovedMask +NSMoveToBezierPathElement +NSMoviesDirectory +NSMusicDirectory +NSNEXTSTEPStringEncoding +NSNarrowFontMask +NSNativeShortGlyphPacking +NSNaturalTextAlignment +NSNetServiceListenForConnections +NSNetServiceNoAutoRename +NSNetServicesActivityInProgress +NSNetServicesBadArgumentError +NSNetServicesCancelledError +NSNetServicesCollisionError +NSNetServicesInvalidError +NSNetServicesNotFoundError +NSNetServicesTimeoutError +NSNetServicesUnknownError +NSNetworkDomainMask +NSNewlineCharacter +NSNextFunctionKey +NSNextStepInterfaceStyle +NSNoBorder +NSNoCellMask +NSNoFontChangeAction +NSNoImage +NSNoInterfaceStyle +NSNoModeColorPanel +NSNoScriptError +NSNoScrollerParts +NSNoSpecifierError +NSNoSubelement +NSNoTabsBezelBorder +NSNoTabsLineBorder +NSNoTabsNoBorder +NSNoTitle +NSNoTopLevelContainersSpecifierError +NSNoUnderlineStyle +NSNonLossyASCIIStringEncoding +NSNonStandardCharacterSetFontMask +NSNonZeroWindingRule +NSNonactivatingPanelMask +NSNormalizedPredicateOption +NSNotEqualToPredicateOperatorType +NSNotPredicateType +NSNotificationCoalescingOnName +NSNotificationCoalescingOnSender +NSNotificationDeliverImmediately +NSNotificationNoCoalescing +NSNotificationPostToAllSessions +NSNotificationSuspensionBehaviorCoalesce +NSNotificationSuspensionBehaviorDeliverImmediately +NSNotificationSuspensionBehaviorDrop +NSNotificationSuspensionBehaviorHold +NSNullCellType +NSNullGlyph +NSNumberFormatterBehavior10_0 +NSNumberFormatterBehavior10_4 +NSNumberFormatterBehaviorDefault +NSNumberFormatterCurrencyStyle +NSNumberFormatterDecimalStyle +NSNumberFormatterNoStyle +NSNumberFormatterPadAfterPrefix +NSNumberFormatterPadAfterSuffix +NSNumberFormatterPadBeforePrefix +NSNumberFormatterPadBeforeSuffix +NSNumberFormatterPercentStyle +NSNumberFormatterRoundCeiling +NSNumberFormatterRoundDown +NSNumberFormatterRoundFloor +NSNumberFormatterRoundHalfDown +NSNumberFormatterRoundHalfEven +NSNumberFormatterRoundHalfUp +NSNumberFormatterRoundUp +NSNumberFormatterScientificStyle +NSNumberFormatterSpellOutStyle +NSNumericPadKeyMask +NSNumericSearch +NSOKButton +NSOSF1OperatingSystem +NSObjCArrayType +NSObjCBitfield +NSObjCBoolType +NSObjCCharType +NSObjCDoubleType +NSObjCFloatType +NSObjCLongType +NSObjCLonglongType +NSObjCNoType +NSObjCObjectType +NSObjCPointerType +NSObjCSelectorType +NSObjCShortType +NSObjCStringType +NSObjCStructType +NSObjCUnionType +NSObjCVoidType +NSOffState +NSOnOffButton +NSOnState +NSOneByteGlyphPacking +NSOnlyScrollerArrows +NSOpenGLCPCurrentRendererID +NSOpenGLCPGPUFragmentProcessing +NSOpenGLCPGPUVertexProcessing +NSOpenGLCPHasDrawable +NSOpenGLCPMPSwapsInFlight +NSOpenGLCPReclaimResources +NSOpenGLCPSurfaceBackingSize +NSOpenGLCPSurfaceOpacity +NSOpenGLCPSurfaceOrder +NSOpenGLCPSwapInterval +NSOpenGLGOClearFormatCache +NSOpenGLGOFormatCacheSize +NSOpenGLGOResetLibrary +NSOpenGLGORetainRenderers +NSOpenGLGOUseBuildCache +NSOpenGLPFAAccelerated +NSOpenGLPFAAcceleratedCompute +NSOpenGLPFAAccumSize +NSOpenGLPFAAllRenderers +NSOpenGLPFAAllowOfflineRenderers +NSOpenGLPFAAlphaSize +NSOpenGLPFAAuxBuffers +NSOpenGLPFAAuxDepthStencil +NSOpenGLPFABackingStore +NSOpenGLPFAClosestPolicy +NSOpenGLPFAColorFloat +NSOpenGLPFAColorSize +NSOpenGLPFACompliant +NSOpenGLPFADepthSize +NSOpenGLPFADoubleBuffer +NSOpenGLPFAFullScreen +NSOpenGLPFAMPSafe +NSOpenGLPFAMaximumPolicy +NSOpenGLPFAMinimumPolicy +NSOpenGLPFAMultiScreen +NSOpenGLPFAMultisample +NSOpenGLPFANoRecovery +NSOpenGLPFAOffScreen +NSOpenGLPFAOpenGLProfile +NSOpenGLPFAPixelBuffer +NSOpenGLPFARemotePixelBuffer +NSOpenGLPFARendererID +NSOpenGLPFARobust +NSOpenGLPFASampleAlpha +NSOpenGLPFASampleBuffers +NSOpenGLPFASamples +NSOpenGLPFAScreenMask +NSOpenGLPFASingleRenderer +NSOpenGLPFAStencilSize +NSOpenGLPFAStereo +NSOpenGLPFASupersample +NSOpenGLPFATripleBuffer +NSOpenGLPFAVirtualScreenCount +NSOpenGLPFAWindow +NSOpenGLProfileVersion3_2Core +NSOpenGLProfileVersionLegacy +NSOpenStepUnicodeReservedBase +NSOperationNotSupportedForKeyScriptError +NSOperationNotSupportedForKeySpecifierError +NSOperationQueueDefaultMaxConcurrentOperationCount +NSOperationQueuePriorityHigh +NSOperationQueuePriorityLow +NSOperationQueuePriorityNormal +NSOperationQueuePriorityVeryHigh +NSOperationQueuePriorityVeryLow +NSOrPredicateType +NSOtherMouseDown +NSOtherMouseDownMask +NSOtherMouseDragged +NSOtherMouseDraggedMask +NSOtherMouseUp +NSOtherMouseUpMask +NSOtherTextMovement +NSOverwriteMergePolicyType +NSPDFPanelRequestsParentDirectory +NSPDFPanelShowsOrientation +NSPDFPanelShowsPaperSize +NSPNGFileType +NSPageControllerTransitionStyleHorizontalStrip +NSPageControllerTransitionStyleStackBook +NSPageControllerTransitionStyleStackHistory +NSPageDownFunctionKey +NSPageUpFunctionKey +NSPaperOrientationLandscape +NSPaperOrientationPortrait +NSParagraphSeparatorCharacter +NSPasteboardReadingAsData +NSPasteboardReadingAsKeyedArchive +NSPasteboardReadingAsPropertyList +NSPasteboardReadingAsString +NSPasteboardWritingPromised +NSPathStyleNavigationBar +NSPathStylePopUp +NSPathStyleStandard +NSPatternColorSpaceModel +NSPauseFunctionKey +NSPenLowerSideMask +NSPenPointingDevice +NSPenTipMask +NSPenUpperSideMask +NSPeriodic +NSPeriodicMask +NSPersistentStoreCoordinatorLockingError +NSPersistentStoreIncompatibleSchemaError +NSPersistentStoreIncompatibleVersionHashError +NSPersistentStoreIncompleteSaveError +NSPersistentStoreInvalidTypeError +NSPersistentStoreOpenError +NSPersistentStoreOperationError +NSPersistentStoreSaveConflictsError +NSPersistentStoreSaveError +NSPersistentStoreTimeoutError +NSPersistentStoreTypeMismatchError +NSPersistentStoreUbiquitousTransitionTypeAccountAdded +NSPersistentStoreUbiquitousTransitionTypeAccountRemoved +NSPersistentStoreUbiquitousTransitionTypeContentRemoved +NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted +NSPersistentStoreUnsupportedRequestTypeError +NSPicturesDirectory +NSPlainTextTokenStyle +NSPointerFunctionsCStringPersonality +NSPointerFunctionsCopyIn +NSPointerFunctionsIntegerPersonality +NSPointerFunctionsMachVirtualMemory +NSPointerFunctionsMallocMemory +NSPointerFunctionsObjectPersonality +NSPointerFunctionsObjectPointerPersonality +NSPointerFunctionsOpaqueMemory +NSPointerFunctionsOpaquePersonality +NSPointerFunctionsStrongMemory +NSPointerFunctionsStructPersonality +NSPointerFunctionsWeakMemory +NSPointerFunctionsZeroingWeakMemory +NSPopUpArrowAtBottom +NSPopUpArrowAtCenter +NSPopUpNoArrow +NSPopoverAppearanceHUD +NSPopoverAppearanceMinimal +NSPopoverBehaviorApplicationDefined +NSPopoverBehaviorSemitransient +NSPopoverBehaviorTransient +NSPortraitOrientation +NSPositionAfter +NSPositionBefore +NSPositionBeginning +NSPositionEnd +NSPositionReplace +NSPositiveDoubleType +NSPositiveFloatType +NSPositiveIntType +NSPostASAP +NSPostNow +NSPostWhenIdle +NSPosterFontMask +NSPowerOffEventType +NSPreferencePanesDirectory +NSPressedTab +NSPrevFunctionKey +NSPrintFunctionKey +NSPrintPanelShowsCopies +NSPrintPanelShowsOrientation +NSPrintPanelShowsPageRange +NSPrintPanelShowsPageSetupAccessory +NSPrintPanelShowsPaperSize +NSPrintPanelShowsPreview +NSPrintPanelShowsPrintSelection +NSPrintPanelShowsScaling +NSPrintRenderingQualityBest +NSPrintRenderingQualityResponsive +NSPrintScreenFunctionKey +NSPrinterDescriptionDirectory +NSPrinterTableError +NSPrinterTableNotFound +NSPrinterTableOK +NSPrintingCancelled +NSPrintingFailure +NSPrintingReplyLater +NSPrintingSuccess +NSPrivateQueueConcurrencyType +NSProgressIndicatorBarStyle +NSProgressIndicatorPreferredAquaThickness +NSProgressIndicatorPreferredLargeThickness +NSProgressIndicatorPreferredSmallThickness +NSProgressIndicatorPreferredThickness +NSProgressIndicatorSpinningStyle +NSPropertyListBinaryFormat_v1_0 +NSPropertyListErrorMaximum +NSPropertyListErrorMinimum +NSPropertyListImmutable +NSPropertyListMutableContainers +NSPropertyListMutableContainersAndLeaves +NSPropertyListOpenStepFormat +NSPropertyListReadCorruptError +NSPropertyListReadStreamError +NSPropertyListReadUnknownVersionError +NSPropertyListWriteStreamError +NSPropertyListXMLFormat_v1_0 +NSProprietaryStringEncoding +NSPushInCell +NSPushInCellMask +NSPushOnPushOffButton +NSQTMovieLoopingBackAndForthPlayback +NSQTMovieLoopingPlayback +NSQTMovieNormalPlayback +NSQuarterCalendarUnit +NSRGBColorSpaceModel +NSRGBModeColorPanel +NSRadioButton +NSRadioModeMatrix +NSRandomSubelement +NSRangeDateMode +NSRatingLevelIndicatorStyle +NSReceiverEvaluationScriptError +NSReceiversCantHandleCommandScriptError +NSRecessedBezelStyle +NSRedoFunctionKey +NSRegularControlSize +NSRegularExpressionAllowCommentsAndWhitespace +NSRegularExpressionAnchorsMatchLines +NSRegularExpressionCaseInsensitive +NSRegularExpressionDotMatchesLineSeparators +NSRegularExpressionIgnoreMetacharacters +NSRegularExpressionSearch +NSRegularExpressionUseUnicodeWordBoundaries +NSRegularExpressionUseUnixLineSeparators +NSRegularSquareBezelStyle +NSRelativeAfter +NSRelativeBefore +NSRelevancyLevelIndicatorStyle +NSRemoteNotificationTypeAlert +NSRemoteNotificationTypeBadge +NSRemoteNotificationTypeNone +NSRemoteNotificationTypeSound +NSRemoveEntityMappingType +NSRemoveTraitFontAction +NSRequiredArgumentsMissingScriptError +NSResetCursorRectsRunLoopOrdering +NSResetFunctionKey +NSResizableWindowMask +NSReturnTextMovement +NSRightArrowFunctionKey +NSRightMouseDown +NSRightMouseDownMask +NSRightMouseDragged +NSRightMouseDraggedMask +NSRightMouseUp +NSRightMouseUpMask +NSRightTabStopType +NSRightTabsBezelBorder +NSRightTextAlignment +NSRightTextMovement +NSRollbackMergePolicyType +NSRoundBankers +NSRoundDown +NSRoundLineCapStyle +NSRoundLineJoinStyle +NSRoundPlain +NSRoundRectBezelStyle +NSRoundUp +NSRoundedBezelStyle +NSRoundedDisclosureBezelStyle +NSRoundedTokenStyle +NSRuleEditorNestingModeCompound +NSRuleEditorNestingModeList +NSRuleEditorNestingModeSimple +NSRuleEditorNestingModeSingle +NSRuleEditorRowTypeCompound +NSRuleEditorRowTypeSimple +NSRunAbortedResponse +NSRunContinuesResponse +NSRunStoppedResponse +NSSQLiteError +NSSaveAsOperation +NSSaveOperation +NSSaveOptionsAsk +NSSaveOptionsNo +NSSaveOptionsYes +NSSaveRequestType +NSSaveToOperation +NSScaleNone +NSScaleProportionally +NSScaleToFit +NSScannedOption +NSScreenChangedEventType +NSScrollElasticityAllowed +NSScrollElasticityAutomatic +NSScrollElasticityNone +NSScrollLockFunctionKey +NSScrollViewFindBarPositionAboveContent +NSScrollViewFindBarPositionAboveHorizontalRuler +NSScrollViewFindBarPositionBelowContent +NSScrollWheel +NSScrollWheelMask +NSScrollerArrowsDefaultSetting +NSScrollerArrowsMaxEnd +NSScrollerArrowsMinEnd +NSScrollerArrowsNone +NSScrollerDecrementArrow +NSScrollerDecrementLine +NSScrollerDecrementPage +NSScrollerIncrementArrow +NSScrollerIncrementLine +NSScrollerIncrementPage +NSScrollerKnob +NSScrollerKnobSlot +NSScrollerKnobStyleDark +NSScrollerKnobStyleDefault +NSScrollerKnobStyleLight +NSScrollerNoPart +NSScrollerStyleLegacy +NSScrollerStyleOverlay +NSSecondCalendarUnit +NSSegmentStyleAutomatic +NSSegmentStyleCapsule +NSSegmentStyleRoundRect +NSSegmentStyleRounded +NSSegmentStyleSmallSquare +NSSegmentStyleTexturedRounded +NSSegmentStyleTexturedSquare +NSSegmentSwitchTrackingMomentary +NSSegmentSwitchTrackingSelectAny +NSSegmentSwitchTrackingSelectOne +NSSelectByCharacter +NSSelectByParagraph +NSSelectByWord +NSSelectFunctionKey +NSSelectedTab +NSSelectingNext +NSSelectingPrevious +NSSelectionAffinityDownstream +NSSelectionAffinityUpstream +NSServiceApplicationLaunchFailedError +NSServiceApplicationNotFoundError +NSServiceErrorMaximum +NSServiceErrorMinimum +NSServiceInvalidPasteboardDataError +NSServiceMalformedServiceDictionaryError +NSServiceMiscellaneousError +NSServiceRequestTimedOutError +NSShadowlessSquareBezelStyle +NSSharedPublicDirectory +NSSharingContentScopeFull +NSSharingContentScopeItem +NSSharingContentScopePartial +NSSharingServiceErrorMaximum +NSSharingServiceErrorMinimum +NSSharingServiceNotConfiguredError +NSShiftJISStringEncoding +NSShiftKeyMask +NSShowControlGlyphs +NSShowInvisibleGlyphs +NSSingleDateMode +NSSingleUnderlineStyle +NSSizeDownFontAction +NSSizeUpFontAction +NSSmallCapsFontMask +NSSmallControlSize +NSSmallIconButtonBezelStyle +NSSmallSquareBezelStyle +NSSnapshotEventMergePolicy +NSSnapshotEventRefresh +NSSnapshotEventRollback +NSSnapshotEventUndoDeletion +NSSnapshotEventUndoInsertion +NSSnapshotEventUndoUpdate +NSSolarisOperatingSystem +NSSortConcurrent +NSSortStable +NSSpecialPageOrder +NSSpeechImmediateBoundary +NSSpeechSentenceBoundary +NSSpeechWordBoundary +NSSpellingStateGrammarFlag +NSSpellingStateSpellingFlag +NSSplitViewDividerStylePaneSplitter +NSSplitViewDividerStyleThick +NSSplitViewDividerStyleThin +NSSquareLineCapStyle +NSStackViewGravityBottom +NSStackViewGravityCenter +NSStackViewGravityLeading +NSStackViewGravityTop +NSStackViewGravityTrailing +NSStackViewVisibilityPriorityDetachOnlyIfNecessary +NSStackViewVisibilityPriorityMustHold +NSStackViewVisibilityPriorityNotVisible +NSStopFunctionKey +NSStreamEventEndEncountered +NSStreamEventErrorOccurred +NSStreamEventHasBytesAvailable +NSStreamEventHasSpaceAvailable +NSStreamEventNone +NSStreamEventOpenCompleted +NSStreamStatusAtEnd +NSStreamStatusClosed +NSStreamStatusError +NSStreamStatusNotOpen +NSStreamStatusOpen +NSStreamStatusOpening +NSStreamStatusReading +NSStreamStatusWriting +NSStringDrawingDisableScreenFontSubstitution +NSStringDrawingOneShot +NSStringDrawingTruncatesLastVisibleLine +NSStringDrawingUsesDeviceMetrics +NSStringDrawingUsesFontLeading +NSStringDrawingUsesLineFragmentOrigin +NSStringEncodingConversionAllowLossy +NSStringEncodingConversionExternalRepresentation +NSStringEnumerationByComposedCharacterSequences +NSStringEnumerationByLines +NSStringEnumerationByParagraphs +NSStringEnumerationBySentences +NSStringEnumerationByWords +NSStringEnumerationLocalized +NSStringEnumerationReverse +NSStringEnumerationSubstringNotRequired +NSSubqueryExpressionType +NSSunOSOperatingSystem +NSSwitchButton +NSSymbolStringEncoding +NSSysReqFunctionKey +NSSystemDefined +NSSystemDefinedMask +NSSystemDomainMask +NSSystemFunctionKey +NSTIFFCompressionCCITTFAX3 +NSTIFFCompressionCCITTFAX4 +NSTIFFCompressionJPEG +NSTIFFCompressionLZW +NSTIFFCompressionNEXT +NSTIFFCompressionNone +NSTIFFCompressionOldJPEG +NSTIFFCompressionPackBits +NSTIFFFileType +NSTabCharacter +NSTabTextMovement +NSTableColumnAutoresizingMask +NSTableColumnNoResizing +NSTableColumnUserResizingMask +NSTableViewAnimationEffectFade +NSTableViewAnimationEffectGap +NSTableViewAnimationEffectNone +NSTableViewAnimationSlideDown +NSTableViewAnimationSlideLeft +NSTableViewAnimationSlideRight +NSTableViewAnimationSlideUp +NSTableViewDashedHorizontalGridLineMask +NSTableViewDraggingDestinationFeedbackStyleGap +NSTableViewDraggingDestinationFeedbackStyleNone +NSTableViewDraggingDestinationFeedbackStyleRegular +NSTableViewDraggingDestinationFeedbackStyleSourceList +NSTableViewDropAbove +NSTableViewDropOn +NSTableViewFirstColumnOnlyAutoresizingStyle +NSTableViewGridNone +NSTableViewLastColumnOnlyAutoresizingStyle +NSTableViewNoColumnAutoresizing +NSTableViewReverseSequentialColumnAutoresizingStyle +NSTableViewRowSizeStyleCustom +NSTableViewRowSizeStyleDefault +NSTableViewRowSizeStyleLarge +NSTableViewRowSizeStyleMedium +NSTableViewRowSizeStyleSmall +NSTableViewSelectionHighlightStyleNone +NSTableViewSelectionHighlightStyleRegular +NSTableViewSelectionHighlightStyleSourceList +NSTableViewSequentialColumnAutoresizingStyle +NSTableViewSolidHorizontalGridLineMask +NSTableViewSolidVerticalGridLineMask +NSTableViewUniformColumnAutoresizingStyle +NSTabletPoint +NSTabletPointEventSubtype +NSTabletPointMask +NSTabletProximity +NSTabletProximityEventSubtype +NSTabletProximityMask +NSTaskTerminationReasonExit +NSTaskTerminationReasonUncaughtSignal +NSTerminateCancel +NSTerminateLater +NSTerminateNow +NSTextAlignmentCenter +NSTextAlignmentJustified +NSTextAlignmentLeft +NSTextAlignmentNatural +NSTextAlignmentRight +NSTextBlockAbsoluteValueType +NSTextBlockBaselineAlignment +NSTextBlockBorder +NSTextBlockBottomAlignment +NSTextBlockHeight +NSTextBlockMargin +NSTextBlockMaximumHeight +NSTextBlockMaximumWidth +NSTextBlockMiddleAlignment +NSTextBlockMinimumHeight +NSTextBlockMinimumWidth +NSTextBlockPadding +NSTextBlockPercentageValueType +NSTextBlockTopAlignment +NSTextBlockWidth +NSTextCellType +NSTextCheckingAllCustomTypes +NSTextCheckingAllSystemTypes +NSTextCheckingAllTypes +NSTextCheckingTypeAddress +NSTextCheckingTypeCorrection +NSTextCheckingTypeDash +NSTextCheckingTypeDate +NSTextCheckingTypeGrammar +NSTextCheckingTypeLink +NSTextCheckingTypeOrthography +NSTextCheckingTypePhoneNumber +NSTextCheckingTypeQuote +NSTextCheckingTypeRegularExpression +NSTextCheckingTypeReplacement +NSTextCheckingTypeSpelling +NSTextCheckingTypeTransitInformation +NSTextFieldAndStepperDatePickerStyle +NSTextFieldDatePickerStyle +NSTextFieldRoundedBezel +NSTextFieldSquareBezel +NSTextFinderActionHideFindInterface +NSTextFinderActionHideReplaceInterface +NSTextFinderActionNextMatch +NSTextFinderActionPreviousMatch +NSTextFinderActionReplace +NSTextFinderActionReplaceAll +NSTextFinderActionReplaceAllInSelection +NSTextFinderActionReplaceAndFind +NSTextFinderActionSelectAll +NSTextFinderActionSelectAllInSelection +NSTextFinderActionSetSearchString +NSTextFinderActionShowFindInterface +NSTextFinderActionShowReplaceInterface +NSTextFinderMatchingTypeContains +NSTextFinderMatchingTypeEndsWith +NSTextFinderMatchingTypeFullWord +NSTextFinderMatchingTypeStartsWith +NSTextLayoutOrientationHorizontal +NSTextLayoutOrientationVertical +NSTextListPrependEnclosingMarker +NSTextReadInapplicableDocumentTypeError +NSTextReadWriteErrorMaximum +NSTextReadWriteErrorMinimum +NSTextStorageEditedAttributes +NSTextStorageEditedCharacters +NSTextTableAutomaticLayoutAlgorithm +NSTextTableFixedLayoutAlgorithm +NSTextWriteInapplicableDocumentTypeError +NSTextWritingDirectionEmbedding +NSTextWritingDirectionOverride +NSTexturedBackgroundWindowMask +NSTexturedRoundedBezelStyle +NSTexturedSquareBezelStyle +NSThickSquareBezelStyle +NSThickerSquareBezelStyle +NSTickMarkAbove +NSTickMarkBelow +NSTickMarkLeft +NSTickMarkRight +NSTimeZoneCalendarUnit +NSTimeZoneDatePickerElementFlag +NSTimeZoneNameStyleDaylightSaving +NSTimeZoneNameStyleGeneric +NSTimeZoneNameStyleShortDaylightSaving +NSTimeZoneNameStyleShortGeneric +NSTimeZoneNameStyleShortStandard +NSTimeZoneNameStyleStandard +NSTitledWindowMask +NSToggleButton +NSToolbarItemVisibilityPriorityHigh +NSToolbarItemVisibilityPriorityLow +NSToolbarItemVisibilityPriorityStandard +NSToolbarItemVisibilityPriorityUser +NSTopTabsBezelBorder +NSTouchEventSubtype +NSTouchPhaseAny +NSTouchPhaseBegan +NSTouchPhaseCancelled +NSTouchPhaseEnded +NSTouchPhaseMoved +NSTouchPhaseStationary +NSTouchPhaseTouching +NSTrackModeMatrix +NSTrackingActiveAlways +NSTrackingActiveInActiveApp +NSTrackingActiveInKeyWindow +NSTrackingActiveWhenFirstResponder +NSTrackingAssumeInside +NSTrackingCursorUpdate +NSTrackingEnabledDuringMouseDrag +NSTrackingInVisibleRect +NSTrackingMouseEnteredAndExited +NSTrackingMouseMoved +NSTransformEntityMappingType +NSTrashDirectory +NSTwoByteGlyphPacking +NSTypesetterBehavior_10_2 +NSTypesetterBehavior_10_2_WithCompatibility +NSTypesetterBehavior_10_3 +NSTypesetterBehavior_10_4 +NSTypesetterContainerBreakAction +NSTypesetterHorizontalTabAction +NSTypesetterLatestBehavior +NSTypesetterLineBreakAction +NSTypesetterOriginalBehavior +NSTypesetterParagraphBreakAction +NSTypesetterWhitespaceAction +NSTypesetterZeroAdvancementAction +NSURLBookmarkCreationMinimalBookmark +NSURLBookmarkCreationPreferFileIDResolution +NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess +NSURLBookmarkCreationSuitableForBookmarkFile +NSURLBookmarkCreationWithSecurityScope +NSURLBookmarkResolutionWithSecurityScope +NSURLBookmarkResolutionWithoutMounting +NSURLBookmarkResolutionWithoutUI +NSURLCredentialPersistenceForSession +NSURLCredentialPersistenceNone +NSURLCredentialPersistencePermanent +NSURLCredentialPersistenceSynchronizable +NSURLHandleLoadFailed +NSURLHandleLoadInProgress +NSURLHandleLoadSucceeded +NSURLHandleNotLoaded +NSURLSessionAuthChallengeCancelAuthenticationChallenge +NSURLSessionAuthChallengePerformDefaultHandling +NSURLSessionAuthChallengeRejectProtectionSpace +NSURLSessionAuthChallengeUseCredential +NSURLSessionResponseAllow +NSURLSessionResponseBecomeDownload +NSURLSessionResponseCancel +NSURLSessionTaskStateCanceling +NSURLSessionTaskStateCompleted +NSURLSessionTaskStateRunning +NSURLSessionTaskStateSuspended +NSUTF16BigEndianStringEncoding +NSUTF16LittleEndianStringEncoding +NSUTF16StringEncoding +NSUTF32BigEndianStringEncoding +NSUTF32LittleEndianStringEncoding +NSUTF32StringEncoding +NSUTF8StringEncoding +NSUbiquitousFileErrorMaximum +NSUbiquitousFileErrorMinimum +NSUbiquitousFileNotUploadedDueToQuotaError +NSUbiquitousFileUbiquityServerNotAvailable +NSUbiquitousFileUnavailableError +NSUbiquitousKeyValueStoreAccountChange +NSUbiquitousKeyValueStoreInitialSyncChange +NSUbiquitousKeyValueStoreQuotaViolationChange +NSUbiquitousKeyValueStoreServerChange +NSUnboldFontMask +NSUncachedRead +NSUndefinedDateComponent +NSUndefinedEntityMappingType +NSUnderlineByWord +NSUnderlinePatternDash +NSUnderlinePatternDashDot +NSUnderlinePatternDashDotDot +NSUnderlinePatternDot +NSUnderlinePatternSolid +NSUnderlineStyleDouble +NSUnderlineStyleNone +NSUnderlineStyleSingle +NSUnderlineStyleThick +NSUndoCloseGroupingRunLoopOrdering +NSUndoFunctionKey +NSUnicodeStringEncoding +NSUnifiedTitleAndToolbarWindowMask +NSUnionSetExpressionType +NSUnitalicFontMask +NSUnknownColorSpaceModel +NSUnknownKeyScriptError +NSUnknownKeySpecifierError +NSUnknownPageOrder +NSUnknownPointingDevice +NSUnscaledWindowMask +NSUpArrowFunctionKey +NSUpTextMovement +NSUpdateWindowsRunLoopOrdering +NSUserCancelledError +NSUserDirectory +NSUserDomainMask +NSUserFunctionKey +NSUserInterfaceLayoutDirectionLeftToRight +NSUserInterfaceLayoutDirectionRightToLeft +NSUserInterfaceLayoutOrientationHorizontal +NSUserInterfaceLayoutOrientationVertical +NSUserNotificationActivationTypeActionButtonClicked +NSUserNotificationActivationTypeContentsClicked +NSUserNotificationActivationTypeNone +NSUserNotificationActivationTypeReplied +NSUtilityWindowMask +NSValidationDateTooLateError +NSValidationDateTooSoonError +NSValidationErrorMaximum +NSValidationErrorMinimum +NSValidationInvalidDateError +NSValidationMissingMandatoryPropertyError +NSValidationMultipleErrorsError +NSValidationNumberTooLargeError +NSValidationNumberTooSmallError +NSValidationRelationshipDeniedDeleteError +NSValidationRelationshipExceedsMaximumCountError +NSValidationRelationshipLacksMinimumCountError +NSValidationStringPatternMatchingError +NSValidationStringTooLongError +NSValidationStringTooShortError +NSVariableExpressionType +NSVerticalRuler +NSViaPanelFontAction +NSViewHeightSizable +NSViewLayerContentsPlacementBottom +NSViewLayerContentsPlacementBottomLeft +NSViewLayerContentsPlacementBottomRight +NSViewLayerContentsPlacementCenter +NSViewLayerContentsPlacementLeft +NSViewLayerContentsPlacementRight +NSViewLayerContentsPlacementScaleAxesIndependently +NSViewLayerContentsPlacementScaleProportionallyToFill +NSViewLayerContentsPlacementScaleProportionallyToFit +NSViewLayerContentsPlacementTop +NSViewLayerContentsPlacementTopLeft +NSViewLayerContentsPlacementTopRight +NSViewLayerContentsRedrawBeforeViewResize +NSViewLayerContentsRedrawCrossfade +NSViewLayerContentsRedrawDuringViewResize +NSViewLayerContentsRedrawNever +NSViewLayerContentsRedrawOnSetNeedsDisplay +NSViewMaxXMargin +NSViewMaxYMargin +NSViewMinXMargin +NSViewMinYMargin +NSViewNotSizable +NSViewWidthSizable +NSVolumeEnumerationProduceFileReferenceURLs +NSVolumeEnumerationSkipHiddenVolumes +NSWantsBidiLevels +NSWarningAlertStyle +NSWeekCalendarUnit +NSWeekOfMonthCalendarUnit +NSWeekOfYearCalendarUnit +NSWeekdayCalendarUnit +NSWeekdayOrdinalCalendarUnit +NSWheelModeColorPanel +NSWidthInsensitiveSearch +NSWindowAbove +NSWindowAnimationBehaviorAlertPanel +NSWindowAnimationBehaviorDefault +NSWindowAnimationBehaviorDocumentWindow +NSWindowAnimationBehaviorNone +NSWindowAnimationBehaviorUtilityWindow +NSWindowBackingLocationDefault +NSWindowBackingLocationMainMemory +NSWindowBackingLocationVideoMemory +NSWindowBelow +NSWindowCloseButton +NSWindowCollectionBehaviorCanJoinAllSpaces +NSWindowCollectionBehaviorDefault +NSWindowCollectionBehaviorFullScreenAuxiliary +NSWindowCollectionBehaviorFullScreenPrimary +NSWindowCollectionBehaviorIgnoresCycle +NSWindowCollectionBehaviorManaged +NSWindowCollectionBehaviorMoveToActiveSpace +NSWindowCollectionBehaviorParticipatesInCycle +NSWindowCollectionBehaviorStationary +NSWindowCollectionBehaviorTransient +NSWindowDepthOnehundredtwentyeightBitRGB +NSWindowDepthSixtyfourBitRGB +NSWindowDepthTwentyfourBitRGB +NSWindowDocumentIconButton +NSWindowDocumentVersionsButton +NSWindowExposedEventType +NSWindowFullScreenButton +NSWindowMiniaturizeButton +NSWindowMovedEventType +NSWindowNumberListAllApplications +NSWindowNumberListAllSpaces +NSWindowOcclusionStateVisible +NSWindowOut +NSWindowSharingNone +NSWindowSharingReadOnly +NSWindowSharingReadWrite +NSWindowToolbarButton +NSWindowZoomButton +NSWindows95InterfaceStyle +NSWindows95OperatingSystem +NSWindowsCP1250StringEncoding +NSWindowsCP1251StringEncoding +NSWindowsCP1252StringEncoding +NSWindowsCP1253StringEncoding +NSWindowsCP1254StringEncoding +NSWindowsNTOperatingSystem +NSWorkspaceLaunchAllowingClassicStartup +NSWorkspaceLaunchAndHide +NSWorkspaceLaunchAndHideOthers +NSWorkspaceLaunchAndPrint +NSWorkspaceLaunchAsync +NSWorkspaceLaunchDefault +NSWorkspaceLaunchInhibitingBackgroundOnly +NSWorkspaceLaunchNewInstance +NSWorkspaceLaunchPreferringClassic +NSWorkspaceLaunchWithErrorPresentation +NSWorkspaceLaunchWithoutActivation +NSWorkspaceLaunchWithoutAddingToRecents +NSWrapCalendarComponents +NSWritingDirectionLeftToRight +NSWritingDirectionNatural +NSWritingDirectionRightToLeft +NSXMLAttributeCDATAKind +NSXMLAttributeDeclarationKind +NSXMLAttributeEntitiesKind +NSXMLAttributeEntityKind +NSXMLAttributeEnumerationKind +NSXMLAttributeIDKind +NSXMLAttributeIDRefKind +NSXMLAttributeIDRefsKind +NSXMLAttributeKind +NSXMLAttributeNMTokenKind +NSXMLAttributeNMTokensKind +NSXMLAttributeNotationKind +NSXMLCommentKind +NSXMLDTDKind +NSXMLDocumentHTMLKind +NSXMLDocumentIncludeContentTypeDeclaration +NSXMLDocumentKind +NSXMLDocumentTextKind +NSXMLDocumentTidyHTML +NSXMLDocumentTidyXML +NSXMLDocumentValidate +NSXMLDocumentXHTMLKind +NSXMLDocumentXInclude +NSXMLDocumentXMLKind +NSXMLElementDeclarationAnyKind +NSXMLElementDeclarationElementKind +NSXMLElementDeclarationEmptyKind +NSXMLElementDeclarationKind +NSXMLElementDeclarationMixedKind +NSXMLElementDeclarationUndefinedKind +NSXMLElementKind +NSXMLEntityDeclarationKind +NSXMLEntityGeneralKind +NSXMLEntityParameterKind +NSXMLEntityParsedKind +NSXMLEntityPredefined +NSXMLEntityUnparsedKind +NSXMLInvalidKind +NSXMLNamespaceKind +NSXMLNodeCompactEmptyElement +NSXMLNodeExpandEmptyElement +NSXMLNodeIsCDATA +NSXMLNodeLoadExternalEntitiesAlways +NSXMLNodeLoadExternalEntitiesNever +NSXMLNodeLoadExternalEntitiesSameOriginOnly +NSXMLNodeNeverEscapeContents +NSXMLNodeOptionsNone +NSXMLNodePreserveAll +NSXMLNodePreserveAttributeOrder +NSXMLNodePreserveCDATA +NSXMLNodePreserveCharacterReferences +NSXMLNodePreserveDTD +NSXMLNodePreserveEmptyElements +NSXMLNodePreserveEntities +NSXMLNodePreserveNamespaceOrder +NSXMLNodePreservePrefixes +NSXMLNodePreserveQuotes +NSXMLNodePreserveWhitespace +NSXMLNodePrettyPrint +NSXMLNodePromoteSignificantWhitespace +NSXMLNodeUseDoubleQuotes +NSXMLNodeUseSingleQuotes +NSXMLNotationDeclarationKind +NSXMLParserAttributeHasNoValueError +NSXMLParserAttributeListNotFinishedError +NSXMLParserAttributeListNotStartedError +NSXMLParserAttributeNotFinishedError +NSXMLParserAttributeNotStartedError +NSXMLParserAttributeRedefinedError +NSXMLParserCDATANotFinishedError +NSXMLParserCharacterRefAtEOFError +NSXMLParserCharacterRefInDTDError +NSXMLParserCharacterRefInEpilogError +NSXMLParserCharacterRefInPrologError +NSXMLParserCommentContainsDoubleHyphenError +NSXMLParserCommentNotFinishedError +NSXMLParserConditionalSectionNotFinishedError +NSXMLParserConditionalSectionNotStartedError +NSXMLParserDOCTYPEDeclNotFinishedError +NSXMLParserDelegateAbortedParseError +NSXMLParserDocumentStartError +NSXMLParserElementContentDeclNotFinishedError +NSXMLParserElementContentDeclNotStartedError +NSXMLParserEmptyDocumentError +NSXMLParserEncodingNotSupportedError +NSXMLParserEntityBoundaryError +NSXMLParserEntityIsExternalError +NSXMLParserEntityIsParameterError +NSXMLParserEntityNotFinishedError +NSXMLParserEntityNotStartedError +NSXMLParserEntityRefAtEOFError +NSXMLParserEntityRefInDTDError +NSXMLParserEntityRefInEpilogError +NSXMLParserEntityRefInPrologError +NSXMLParserEntityRefLoopError +NSXMLParserEntityReferenceMissingSemiError +NSXMLParserEntityReferenceWithoutNameError +NSXMLParserEntityValueRequiredError +NSXMLParserEqualExpectedError +NSXMLParserExternalStandaloneEntityError +NSXMLParserExternalSubsetNotFinishedError +NSXMLParserExtraContentError +NSXMLParserGTRequiredError +NSXMLParserInternalError +NSXMLParserInvalidCharacterError +NSXMLParserInvalidCharacterInEntityError +NSXMLParserInvalidCharacterRefError +NSXMLParserInvalidConditionalSectionError +NSXMLParserInvalidDecimalCharacterRefError +NSXMLParserInvalidEncodingError +NSXMLParserInvalidEncodingNameError +NSXMLParserInvalidHexCharacterRefError +NSXMLParserInvalidURIError +NSXMLParserLTRequiredError +NSXMLParserLTSlashRequiredError +NSXMLParserLessThanSymbolInAttributeError +NSXMLParserLiteralNotFinishedError +NSXMLParserLiteralNotStartedError +NSXMLParserMisplacedCDATAEndStringError +NSXMLParserMisplacedXMLDeclarationError +NSXMLParserMixedContentDeclNotFinishedError +NSXMLParserMixedContentDeclNotStartedError +NSXMLParserNAMERequiredError +NSXMLParserNMTOKENRequiredError +NSXMLParserNamespaceDeclarationError +NSXMLParserNoDTDError +NSXMLParserNotWellBalancedError +NSXMLParserNotationNotFinishedError +NSXMLParserNotationNotStartedError +NSXMLParserOutOfMemoryError +NSXMLParserPCDATARequiredError +NSXMLParserParsedEntityRefAtEOFError +NSXMLParserParsedEntityRefInEpilogError +NSXMLParserParsedEntityRefInInternalError +NSXMLParserParsedEntityRefInInternalSubsetError +NSXMLParserParsedEntityRefInPrologError +NSXMLParserParsedEntityRefMissingSemiError +NSXMLParserParsedEntityRefNoNameError +NSXMLParserPrematureDocumentEndError +NSXMLParserProcessingInstructionNotFinishedError +NSXMLParserProcessingInstructionNotStartedError +NSXMLParserPublicIdentifierRequiredError +NSXMLParserResolveExternalEntitiesAlways +NSXMLParserResolveExternalEntitiesNever +NSXMLParserResolveExternalEntitiesNoNetwork +NSXMLParserResolveExternalEntitiesSameOriginOnly +NSXMLParserSeparatorRequiredError +NSXMLParserSpaceRequiredError +NSXMLParserStandaloneValueError +NSXMLParserStringNotClosedError +NSXMLParserStringNotStartedError +NSXMLParserTagNameMismatchError +NSXMLParserURIFragmentError +NSXMLParserURIRequiredError +NSXMLParserUndeclaredEntityError +NSXMLParserUnfinishedTagError +NSXMLParserUnknownEncodingError +NSXMLParserUnparsedEntityError +NSXMLParserXMLDeclNotFinishedError +NSXMLParserXMLDeclNotStartedError +NSXMLProcessingInstructionKind +NSXMLTextKind +NSXPCConnectionErrorMaximum +NSXPCConnectionErrorMinimum +NSXPCConnectionInterrupted +NSXPCConnectionInvalid +NSXPCConnectionPrivileged +NSXPCConnectionReplyInvalid +NSYearCalendarUnit +NSYearForWeekOfYearCalendarUnit +NSYearMonthDatePickerElementFlag +NSYearMonthDayDatePickerElementFlag +UIAccessibilityNavigationStyleAutomatic +UIAccessibilityNavigationStyleCombined +UIAccessibilityNavigationStyleSeparate +UIAccessibilityScrollDirectionDown +UIAccessibilityScrollDirectionLeft +UIAccessibilityScrollDirectionNext +UIAccessibilityScrollDirectionPrevious +UIAccessibilityScrollDirectionRight +UIAccessibilityScrollDirectionUp +UIAccessibilityZoomTypeInsertionPoint +UIActionSheetStyleAutomatic +UIActionSheetStyleBlackOpaque +UIActionSheetStyleBlackTranslucent +UIActionSheetStyleDefault +UIActivityCategoryAction +UIActivityCategoryShare +UIActivityIndicatorViewStyleGray +UIActivityIndicatorViewStyleWhite +UIActivityIndicatorViewStyleWhiteLarge +UIAlertActionStyleCancel +UIAlertActionStyleDefault +UIAlertActionStyleDestructive +UIAlertControllerStyleActionSheet +UIAlertControllerStyleAlert +UIAlertViewStyleDefault +UIAlertViewStyleLoginAndPasswordInput +UIAlertViewStylePlainTextInput +UIAlertViewStyleSecureTextInput +UIApplicationStateActive +UIApplicationStateBackground +UIApplicationStateInactive +UIAttachmentBehaviorTypeAnchor +UIAttachmentBehaviorTypeItems +UIBackgroundFetchResultFailed +UIBackgroundFetchResultNewData +UIBackgroundFetchResultNoData +UIBackgroundRefreshStatusAvailable +UIBackgroundRefreshStatusDenied +UIBackgroundRefreshStatusRestricted +UIBarButtonItemStyleBordered +UIBarButtonItemStyleDone +UIBarButtonItemStylePlain +UIBarButtonSystemItemAction +UIBarButtonSystemItemAdd +UIBarButtonSystemItemBookmarks +UIBarButtonSystemItemCamera +UIBarButtonSystemItemCancel +UIBarButtonSystemItemCompose +UIBarButtonSystemItemDone +UIBarButtonSystemItemEdit +UIBarButtonSystemItemFastForward +UIBarButtonSystemItemFixedSpace +UIBarButtonSystemItemFlexibleSpace +UIBarButtonSystemItemOrganize +UIBarButtonSystemItemPageCurl +UIBarButtonSystemItemPause +UIBarButtonSystemItemPlay +UIBarButtonSystemItemRedo +UIBarButtonSystemItemRefresh +UIBarButtonSystemItemReply +UIBarButtonSystemItemRewind +UIBarButtonSystemItemSave +UIBarButtonSystemItemSearch +UIBarButtonSystemItemStop +UIBarButtonSystemItemTrash +UIBarButtonSystemItemUndo +UIBarMetricsCompact +UIBarMetricsCompactPrompt +UIBarMetricsDefault +UIBarMetricsDefaultPrompt +UIBarMetricsLandscapePhone +UIBarMetricsLandscapePhonePrompt +UIBarPositionAny +UIBarPositionBottom +UIBarPositionTop +UIBarPositionTopAttached +UIBarStyleBlack +UIBarStyleBlackOpaque +UIBarStyleBlackTranslucent +UIBarStyleDefault +UIBaselineAdjustmentAlignBaselines +UIBaselineAdjustmentAlignCenters +UIBaselineAdjustmentNone +UIBlurEffectStyleDark +UIBlurEffectStyleExtraLight +UIBlurEffectStyleLight +UIButtonTypeContactAdd +UIButtonTypeCustom +UIButtonTypeDetailDisclosure +UIButtonTypeInfoDark +UIButtonTypeInfoLight +UIButtonTypeRoundedRect +UIButtonTypeSystem +UICollectionElementCategoryCell +UICollectionElementCategoryDecorationView +UICollectionElementCategorySupplementaryView +UICollectionUpdateActionDelete +UICollectionUpdateActionInsert +UICollectionUpdateActionMove +UICollectionUpdateActionNone +UICollectionUpdateActionReload +UICollectionViewScrollDirectionHorizontal +UICollectionViewScrollDirectionVertical +UICollectionViewScrollPositionBottom +UICollectionViewScrollPositionCenteredHorizontally +UICollectionViewScrollPositionCenteredVertically +UICollectionViewScrollPositionLeft +UICollectionViewScrollPositionNone +UICollectionViewScrollPositionRight +UICollectionViewScrollPositionTop +UICollisionBehaviorModeBoundaries +UICollisionBehaviorModeEverything +UICollisionBehaviorModeItems +UIControlContentHorizontalAlignmentCenter +UIControlContentHorizontalAlignmentFill +UIControlContentHorizontalAlignmentLeft +UIControlContentHorizontalAlignmentRight +UIControlContentVerticalAlignmentBottom +UIControlContentVerticalAlignmentCenter +UIControlContentVerticalAlignmentFill +UIControlContentVerticalAlignmentTop +UIControlEventAllEditingEvents +UIControlEventAllEvents +UIControlEventAllTouchEvents +UIControlEventApplicationReserved +UIControlEventEditingChanged +UIControlEventEditingDidBegin +UIControlEventEditingDidEnd +UIControlEventEditingDidEndOnExit +UIControlEventSystemReserved +UIControlEventTouchCancel +UIControlEventTouchDown +UIControlEventTouchDownRepeat +UIControlEventTouchDragEnter +UIControlEventTouchDragExit +UIControlEventTouchDragInside +UIControlEventTouchDragOutside +UIControlEventTouchUpInside +UIControlEventTouchUpOutside +UIControlEventValueChanged +UIControlStateApplication +UIControlStateDisabled +UIControlStateHighlighted +UIControlStateNormal +UIControlStateReserved +UIControlStateSelected +UIDataDetectorTypeAddress +UIDataDetectorTypeAll +UIDataDetectorTypeCalendarEvent +UIDataDetectorTypeLink +UIDataDetectorTypeNone +UIDataDetectorTypePhoneNumber +UIDatePickerModeCountDownTimer +UIDatePickerModeDate +UIDatePickerModeDateAndTime +UIDatePickerModeTime +UIDeviceBatteryStateCharging +UIDeviceBatteryStateFull +UIDeviceBatteryStateUnknown +UIDeviceBatteryStateUnplugged +UIDeviceOrientationFaceDown +UIDeviceOrientationFaceUp +UIDeviceOrientationLandscapeLeft +UIDeviceOrientationLandscapeRight +UIDeviceOrientationPortrait +UIDeviceOrientationPortraitUpsideDown +UIDeviceOrientationUnknown +UIDocumentChangeCleared +UIDocumentChangeDone +UIDocumentChangeRedone +UIDocumentChangeUndone +UIDocumentMenuOrderFirst +UIDocumentMenuOrderLast +UIDocumentPickerModeExportToService +UIDocumentPickerModeImport +UIDocumentPickerModeMoveToService +UIDocumentPickerModeOpen +UIDocumentSaveForCreating +UIDocumentSaveForOverwriting +UIDocumentStateClosed +UIDocumentStateEditingDisabled +UIDocumentStateInConflict +UIDocumentStateNormal +UIDocumentStateSavingError +UIEventSubtypeMotionShake +UIEventSubtypeNone +UIEventSubtypeRemoteControlBeginSeekingBackward +UIEventSubtypeRemoteControlBeginSeekingForward +UIEventSubtypeRemoteControlEndSeekingBackward +UIEventSubtypeRemoteControlEndSeekingForward +UIEventSubtypeRemoteControlNextTrack +UIEventSubtypeRemoteControlPause +UIEventSubtypeRemoteControlPlay +UIEventSubtypeRemoteControlPreviousTrack +UIEventSubtypeRemoteControlStop +UIEventSubtypeRemoteControlTogglePlayPause +UIEventTypeMotion +UIEventTypeRemoteControl +UIEventTypeTouches +UIFontDescriptorClassClarendonSerifs +UIFontDescriptorClassFreeformSerifs +UIFontDescriptorClassMask +UIFontDescriptorClassModernSerifs +UIFontDescriptorClassOldStyleSerifs +UIFontDescriptorClassOrnamentals +UIFontDescriptorClassSansSerif +UIFontDescriptorClassScripts +UIFontDescriptorClassSlabSerifs +UIFontDescriptorClassSymbolic +UIFontDescriptorClassTransitionalSerifs +UIFontDescriptorClassUnknown +UIFontDescriptorSymbolicTraits +UIFontDescriptorTraitBold +UIFontDescriptorTraitCondensed +UIFontDescriptorTraitExpanded +UIFontDescriptorTraitItalic +UIFontDescriptorTraitLooseLeading +UIFontDescriptorTraitMonoSpace +UIFontDescriptorTraitTightLeading +UIFontDescriptorTraitUIOptimized +UIFontDescriptorTraitVertical +UIGestureRecognizerStateBegan +UIGestureRecognizerStateCancelled +UIGestureRecognizerStateChanged +UIGestureRecognizerStateEnded +UIGestureRecognizerStateFailed +UIGestureRecognizerStatePossible +UIGestureRecognizerStateRecognized +UIGuidedAccessRestrictionStateAllow +UIGuidedAccessRestrictionStateDeny +UIImageOrientationDown +UIImageOrientationDownMirrored +UIImageOrientationLeft +UIImageOrientationLeftMirrored +UIImageOrientationRight +UIImageOrientationRightMirrored +UIImageOrientationUp +UIImageOrientationUpMirrored +UIImagePickerControllerCameraCaptureModePhoto +UIImagePickerControllerCameraCaptureModeVideo +UIImagePickerControllerCameraDeviceFront +UIImagePickerControllerCameraDeviceRear +UIImagePickerControllerCameraFlashModeAuto +UIImagePickerControllerCameraFlashModeOff +UIImagePickerControllerCameraFlashModeOn +UIImagePickerControllerQualityType640x480 +UIImagePickerControllerQualityTypeHigh +UIImagePickerControllerQualityTypeIFrame1280x720 +UIImagePickerControllerQualityTypeIFrame960x540 +UIImagePickerControllerQualityTypeLow +UIImagePickerControllerQualityTypeMedium +UIImagePickerControllerSourceTypeCamera +UIImagePickerControllerSourceTypePhotoLibrary +UIImagePickerControllerSourceTypeSavedPhotosAlbum +UIImageRenderingModeAlwaysOriginal +UIImageRenderingModeAlwaysTemplate +UIImageRenderingModeAutomatic +UIImageResizingModeStretch +UIImageResizingModeTile +UIInputViewStyleDefault +UIInputViewStyleKeyboard +UIInterfaceOrientationLandscapeLeft +UIInterfaceOrientationLandscapeRight +UIInterfaceOrientationMaskAll +UIInterfaceOrientationMaskAllButUpsideDown +UIInterfaceOrientationMaskLandscape +UIInterfaceOrientationMaskLandscapeLeft +UIInterfaceOrientationMaskLandscapeRight +UIInterfaceOrientationMaskPortrait +UIInterfaceOrientationMaskPortraitUpsideDown +UIInterfaceOrientationPortrait +UIInterfaceOrientationPortraitUpsideDown +UIInterfaceOrientationUnknown +UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis +UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis +UIKeyModifierAlphaShift +UIKeyModifierAlternate +UIKeyModifierCommand +UIKeyModifierControl +UIKeyModifierNumericPad +UIKeyModifierShift +UIKeyboardAppearanceAlert +UIKeyboardAppearanceDark +UIKeyboardAppearanceDefault +UIKeyboardAppearanceLight +UIKeyboardTypeASCIICapable +UIKeyboardTypeAlphabet +UIKeyboardTypeDecimalPad +UIKeyboardTypeDefault +UIKeyboardTypeEmailAddress +UIKeyboardTypeNamePhonePad +UIKeyboardTypeNumberPad +UIKeyboardTypeNumbersAndPunctuation +UIKeyboardTypePhonePad +UIKeyboardTypeTwitter +UIKeyboardTypeURL +UIKeyboardTypeWebSearch +UILayoutConstraintAxisHorizontal +UILayoutConstraintAxisVertical +UILineBreakModeCharacterWrap +UILineBreakModeClip +UILineBreakModeHeadTruncation +UILineBreakModeMiddleTruncation +UILineBreakModeTailTruncation +UILineBreakModeWordWrap +UIMenuControllerArrowDefault +UIMenuControllerArrowDown +UIMenuControllerArrowLeft +UIMenuControllerArrowRight +UIMenuControllerArrowUp +UIModalPresentationCurrentContext +UIModalPresentationCustom +UIModalPresentationFormSheet +UIModalPresentationFullScreen +UIModalPresentationNone +UIModalPresentationOverCurrentContext +UIModalPresentationOverFullScreen +UIModalPresentationPageSheet +UIModalPresentationPopover +UIModalTransitionStyleCoverVertical +UIModalTransitionStyleCrossDissolve +UIModalTransitionStyleFlipHorizontal +UIModalTransitionStylePartialCurl +UINavigationControllerOperationNone +UINavigationControllerOperationPop +UINavigationControllerOperationPush +UIPageViewControllerNavigationDirectionForward +UIPageViewControllerNavigationDirectionReverse +UIPageViewControllerNavigationOrientationHorizontal +UIPageViewControllerNavigationOrientationVertical +UIPageViewControllerSpineLocationMax +UIPageViewControllerSpineLocationMid +UIPageViewControllerSpineLocationMin +UIPageViewControllerSpineLocationNone +UIPageViewControllerTransitionStylePageCurl +UIPageViewControllerTransitionStyleScroll +UIPopoverArrowDirectionAny +UIPopoverArrowDirectionDown +UIPopoverArrowDirectionLeft +UIPopoverArrowDirectionRight +UIPopoverArrowDirectionUnknown +UIPopoverArrowDirectionUp +UIPrintInfoDuplexLongEdge +UIPrintInfoDuplexNone +UIPrintInfoDuplexShortEdge +UIPrintInfoOrientationLandscape +UIPrintInfoOrientationPortrait +UIPrintInfoOutputGeneral +UIPrintInfoOutputGrayscale +UIPrintInfoOutputPhoto +UIPrintInfoOutputPhotoGrayscale +UIPrintJobFailedError +UIPrintNoContentError +UIPrintUnknownImageFormatError +UIPrinterJobTypeDocument +UIPrinterJobTypeEnvelope +UIPrinterJobTypeLabel +UIPrinterJobTypeLargeFormat +UIPrinterJobTypePhoto +UIPrinterJobTypePostcard +UIPrinterJobTypeReceipt +UIPrinterJobTypeRoll +UIPrinterJobTypeUnknown +UIPrintingNotAvailableError +UIProgressViewStyleBar +UIProgressViewStyleDefault +UIPushBehaviorModeContinuous +UIPushBehaviorModeInstantaneous +UIRectCornerAllCorners +UIRectCornerBottomLeft +UIRectCornerBottomRight +UIRectCornerTopLeft +UIRectCornerTopRight +UIRectEdgeAll +UIRectEdgeBottom +UIRectEdgeLeft +UIRectEdgeNone +UIRectEdgeRight +UIRectEdgeTop +UIRemoteNotificationTypeAlert +UIRemoteNotificationTypeBadge +UIRemoteNotificationTypeNewsstandContentAvailability +UIRemoteNotificationTypeNone +UIRemoteNotificationTypeSound +UIReturnKeyDefault +UIReturnKeyDone +UIReturnKeyEmergencyCall +UIReturnKeyGo +UIReturnKeyGoogle +UIReturnKeyJoin +UIReturnKeyNext +UIReturnKeyRoute +UIReturnKeySearch +UIReturnKeySend +UIReturnKeyYahoo +UIScreenOverscanCompensationInsetApplicationFrame +UIScreenOverscanCompensationInsetBounds +UIScreenOverscanCompensationScale +UIScrollViewIndicatorStyleBlack +UIScrollViewIndicatorStyleDefault +UIScrollViewIndicatorStyleWhite +UIScrollViewKeyboardDismissModeInteractive +UIScrollViewKeyboardDismissModeNone +UIScrollViewKeyboardDismissModeOnDrag +UISearchBarIconBookmark +UISearchBarIconClear +UISearchBarIconResultsList +UISearchBarIconSearch +UISearchBarStyleDefault +UISearchBarStyleMinimal +UISearchBarStyleProminent +UISegmentedControlNoSegment +UISegmentedControlSegmentAlone +UISegmentedControlSegmentAny +UISegmentedControlSegmentCenter +UISegmentedControlSegmentLeft +UISegmentedControlSegmentRight +UISegmentedControlStyleBar +UISegmentedControlStyleBezeled +UISegmentedControlStyleBordered +UISegmentedControlStylePlain +UISplitViewControllerDisplayModeAllVisible +UISplitViewControllerDisplayModeAutomatic +UISplitViewControllerDisplayModePrimaryHidden +UISplitViewControllerDisplayModePrimaryOverlay +UIStatusBarAnimationFade +UIStatusBarAnimationNone +UIStatusBarAnimationSlide +UIStatusBarStyleBlackOpaque +UIStatusBarStyleBlackTranslucent +UIStatusBarStyleDefault +UIStatusBarStyleLightContent +UISwipeGestureRecognizerDirectionDown +UISwipeGestureRecognizerDirectionLeft +UISwipeGestureRecognizerDirectionRight +UISwipeGestureRecognizerDirectionUp +UISystemAnimationDelete +UITabBarItemPositioningAutomatic +UITabBarItemPositioningCentered +UITabBarItemPositioningFill +UITabBarSystemItemBookmarks +UITabBarSystemItemContacts +UITabBarSystemItemDownloads +UITabBarSystemItemFavorites +UITabBarSystemItemFeatured +UITabBarSystemItemHistory +UITabBarSystemItemMore +UITabBarSystemItemMostRecent +UITabBarSystemItemMostViewed +UITabBarSystemItemRecents +UITabBarSystemItemSearch +UITabBarSystemItemTopRated +UITableViewCellAccessoryCheckmark +UITableViewCellAccessoryDetailButton +UITableViewCellAccessoryDetailDisclosureButton +UITableViewCellAccessoryDisclosureIndicator +UITableViewCellAccessoryNone +UITableViewCellEditingStyleDelete +UITableViewCellEditingStyleInsert +UITableViewCellEditingStyleNone +UITableViewCellSelectionStyleBlue +UITableViewCellSelectionStyleDefault +UITableViewCellSelectionStyleGray +UITableViewCellSelectionStyleNone +UITableViewCellSeparatorStyleNone +UITableViewCellSeparatorStyleSingleLine +UITableViewCellSeparatorStyleSingleLineEtched +UITableViewCellStateDefaultMask +UITableViewCellStateShowingDeleteConfirmationMask +UITableViewCellStateShowingEditControlMask +UITableViewCellStyleDefault +UITableViewCellStyleSubtitle +UITableViewCellStyleValue1 +UITableViewCellStyleValue2 +UITableViewRowActionStyleDefault +UITableViewRowActionStyleDestructive +UITableViewRowActionStyleNormal +UITableViewRowAnimationAutomatic +UITableViewRowAnimationBottom +UITableViewRowAnimationFade +UITableViewRowAnimationLeft +UITableViewRowAnimationMiddle +UITableViewRowAnimationNone +UITableViewRowAnimationRight +UITableViewRowAnimationTop +UITableViewScrollPositionBottom +UITableViewScrollPositionMiddle +UITableViewScrollPositionNone +UITableViewScrollPositionTop +UITableViewStyleGrouped +UITableViewStylePlain +UITextAlignmentCenter +UITextAlignmentLeft +UITextAlignmentRight +UITextAutocapitalizationTypeAllCharacters +UITextAutocapitalizationTypeNone +UITextAutocapitalizationTypeSentences +UITextAutocapitalizationTypeWords +UITextAutocorrectionTypeDefault +UITextAutocorrectionTypeNo +UITextAutocorrectionTypeYes +UITextBorderStyleBezel +UITextBorderStyleLine +UITextBorderStyleNone +UITextBorderStyleRoundedRect +UITextFieldViewModeAlways +UITextFieldViewModeNever +UITextFieldViewModeUnlessEditing +UITextFieldViewModeWhileEditing +UITextGranularityCharacter +UITextGranularityDocument +UITextGranularityLine +UITextGranularityParagraph +UITextGranularitySentence +UITextGranularityWord +UITextLayoutDirectionDown +UITextLayoutDirectionLeft +UITextLayoutDirectionRight +UITextLayoutDirectionUp +UITextSpellCheckingTypeDefault +UITextSpellCheckingTypeNo +UITextSpellCheckingTypeYes +UITextStorageDirectionBackward +UITextStorageDirectionForward +UITextWritingDirectionLeftToRight +UITextWritingDirectionNatural +UITextWritingDirectionRightToLeft +UITouchPhaseBegan +UITouchPhaseCancelled +UITouchPhaseEnded +UITouchPhaseMoved +UITouchPhaseStationary +UIUserInterfaceIdiomPad +UIUserInterfaceIdiomPhone +UIUserInterfaceIdiomUnspecified +UIUserInterfaceLayoutDirectionLeftToRight +UIUserInterfaceLayoutDirectionRightToLeft +UIUserInterfaceSizeClassCompact +UIUserInterfaceSizeClassRegular +UIUserInterfaceSizeClassUnspecified +UIUserNotificationActionContextDefault +UIUserNotificationActionContextMinimal +UIUserNotificationActivationModeBackground +UIUserNotificationActivationModeForeground +UIUserNotificationTypeAlert +UIUserNotificationTypeBadge +UIUserNotificationTypeNone +UIUserNotificationTypeSound +UIViewAnimationCurveEaseIn +UIViewAnimationCurveEaseInOut +UIViewAnimationCurveEaseOut +UIViewAnimationCurveLinear +UIViewAnimationOptionAllowAnimatedContent +UIViewAnimationOptionAllowUserInteraction +UIViewAnimationOptionAutoreverse +UIViewAnimationOptionBeginFromCurrentState +UIViewAnimationOptionCurveEaseIn +UIViewAnimationOptionCurveEaseInOut +UIViewAnimationOptionCurveEaseOut +UIViewAnimationOptionCurveLinear +UIViewAnimationOptionLayoutSubviews +UIViewAnimationOptionOverrideInheritedCurve +UIViewAnimationOptionOverrideInheritedDuration +UIViewAnimationOptionOverrideInheritedOptions +UIViewAnimationOptionRepeat +UIViewAnimationOptionShowHideTransitionViews +UIViewAnimationOptionTransitionCrossDissolve +UIViewAnimationOptionTransitionCurlDown +UIViewAnimationOptionTransitionCurlUp +UIViewAnimationOptionTransitionFlipFromBottom +UIViewAnimationOptionTransitionFlipFromLeft +UIViewAnimationOptionTransitionFlipFromRight +UIViewAnimationOptionTransitionFlipFromTop +UIViewAnimationOptionTransitionNone +UIViewAnimationTransitionCurlDown +UIViewAnimationTransitionCurlUp +UIViewAnimationTransitionFlipFromLeft +UIViewAnimationTransitionFlipFromRight +UIViewAnimationTransitionNone +UIViewAutoresizingFlexibleBottomMargin +UIViewAutoresizingFlexibleHeight +UIViewAutoresizingFlexibleLeftMargin +UIViewAutoresizingFlexibleRightMargin +UIViewAutoresizingFlexibleTopMargin +UIViewAutoresizingFlexibleWidth +UIViewAutoresizingNone +UIViewContentModeBottom +UIViewContentModeBottomLeft +UIViewContentModeBottomRight +UIViewContentModeCenter +UIViewContentModeLeft +UIViewContentModeRedraw +UIViewContentModeRight +UIViewContentModeScaleAspectFill +UIViewContentModeScaleAspectFit +UIViewContentModeScaleToFill +UIViewContentModeTop +UIViewContentModeTopLeft +UIViewContentModeTopRight +UIViewKeyframeAnimationOptionAllowUserInteraction +UIViewKeyframeAnimationOptionAutoreverse +UIViewKeyframeAnimationOptionBeginFromCurrentState +UIViewKeyframeAnimationOptionCalculationModeCubic +UIViewKeyframeAnimationOptionCalculationModeCubicPaced +UIViewKeyframeAnimationOptionCalculationModeDiscrete +UIViewKeyframeAnimationOptionCalculationModeLinear +UIViewKeyframeAnimationOptionCalculationModePaced +UIViewKeyframeAnimationOptionLayoutSubviews +UIViewKeyframeAnimationOptionOverrideInheritedDuration +UIViewKeyframeAnimationOptionOverrideInheritedOptions +UIViewKeyframeAnimationOptionRepeat +UIViewTintAdjustmentModeAutomatic +UIViewTintAdjustmentModeDimmed +UIViewTintAdjustmentModeNormal +UIWebPaginationBreakingModeColumn +UIWebPaginationBreakingModePage +UIWebPaginationModeBottomToTop +UIWebPaginationModeLeftToRight +UIWebPaginationModeRightToLeft +UIWebPaginationModeTopToBottom +UIWebPaginationModeUnpaginated +UIWebViewNavigationTypeBackForward +UIWebViewNavigationTypeFormResubmitted +UIWebViewNavigationTypeFormSubmitted +UIWebViewNavigationTypeLinkClicked +UIWebViewNavigationTypeOther +UIWebViewNavigationTypeReload \ No newline at end of file diff --git a/sources_non_forked/cocoa.vim/lib/cocoa_indexes/functions.txt b/sources_non_forked/cocoa.vim/lib/cocoa_indexes/functions.txt new file mode 100644 index 00000000..1bd857e0 --- /dev/null +++ b/sources_non_forked/cocoa.vim/lib/cocoa_indexes/functions.txt @@ -0,0 +1,399 @@ +NSAccessibilityActionDescription +NSAccessibilityPostNotification +NSAccessibilityPostNotificationWithUserInfo +NSAccessibilityRaiseBadArgumentException +NSAccessibilityRoleDescription +NSAccessibilityRoleDescriptionForUIElement +NSAccessibilitySetMayContainProtectedContent +NSAccessibilityUnignoredAncestor +NSAccessibilityUnignoredChildren +NSAccessibilityUnignoredChildrenForOnlyChild +NSAccessibilityUnignoredDescendant +NSAllHashTableObjects +NSAllMapTableKeys +NSAllMapTableValues +NSAllocateCollectable +NSAllocateMemoryPages +NSAllocateObject +NSApplicationLoad +NSApplicationMain +NSAvailableWindowDepths +NSBeep +NSBeginAlertSheet +NSBeginCriticalAlertSheet +NSBeginInformationalAlertSheet +NSBestDepth +NSBitsPerPixelFromDepth +NSBitsPerSampleFromDepth +NSClassFromString +NSColorSpaceFromDepth +NSCompareHashTables +NSCompareMapTables +NSContainsRect +NSConvertGlyphsToPackedGlyphs +NSConvertHostDoubleToSwapped +NSConvertHostFloatToSwapped +NSConvertSwappedDoubleToHost +NSConvertSwappedFloatToHost +NSCopyBits +NSCopyHashTableWithZone +NSCopyMapTableWithZone +NSCopyMemoryPages +NSCopyObject +NSCountFrames +NSCountHashTable +NSCountMapTable +NSCountWindows +NSCountWindowsForContext +NSCreateFileContentsPboardType +NSCreateFilenamePboardType +NSCreateHashTable +NSCreateHashTableWithZone +NSCreateMapTable +NSCreateMapTableWithZone +NSCreateZone +NSDeallocateMemoryPages +NSDeallocateObject +NSDecimalAdd +NSDecimalCompact +NSDecimalCompare +NSDecimalCopy +NSDecimalDivide +NSDecimalIsNotANumber +NSDecimalMultiply +NSDecimalMultiplyByPowerOf10 +NSDecimalNormalize +NSDecimalPower +NSDecimalRound +NSDecimalString +NSDecimalSubtract +NSDecrementExtraRefCountWasZero +NSDefaultMallocZone +NSDictionaryOfVariableBindings +NSDisableScreenUpdates +NSDivideRect +NSDottedFrameRect +NSDrawBitmap +NSDrawButton +NSDrawColorTiledRects +NSDrawDarkBezel +NSDrawGrayBezel +NSDrawGroove +NSDrawLightBezel +NSDrawNinePartImage +NSDrawThreePartImage +NSDrawTiledRects +NSDrawWhiteBezel +NSDrawWindowBackground +NSEdgeInsetsMake +NSEnableScreenUpdates +NSEndHashTableEnumeration +NSEndMapTableEnumeration +NSEnumerateHashTable +NSEnumerateMapTable +NSEqualPoints +NSEqualRanges +NSEqualRects +NSEqualSizes +NSEraseRect +NSEventMaskFromType +NSExtraRefCount +NSFileTypeForHFSTypeCode +NSFrameAddress +NSFrameRect +NSFrameRectWithWidth +NSFrameRectWithWidthUsingOperation +NSFreeHashTable +NSFreeMapTable +NSFullUserName +NSGetAlertPanel +NSGetCriticalAlertPanel +NSGetFileType +NSGetFileTypes +NSGetInformationalAlertPanel +NSGetSizeAndAlignment +NSGetUncaughtExceptionHandler +NSGetWindowServerMemory +NSHFSTypeCodeFromFileType +NSHFSTypeOfFile +NSHashGet +NSHashInsert +NSHashInsertIfAbsent +NSHashInsertKnownAbsent +NSHashRemove +NSHeight +NSHighlightRect +NSHomeDirectory +NSHomeDirectoryForUser +NSHostByteOrder +NSIncrementExtraRefCount +NSInsetRect +NSIntegralRect +NSIntegralRectWithOptions +NSInterfaceStyleForKey +NSIntersectionRange +NSIntersectionRect +NSIntersectsRect +NSIsControllerMarker +NSIsEmptyRect +NSIsFreedObject +NSLocationInRange +NSLog +NSLogPageSize +NSLogv +NSMakeCollectable +NSMakePoint +NSMakeRange +NSMakeRect +NSMakeSize +NSMapGet +NSMapInsert +NSMapInsertIfAbsent +NSMapInsertKnownAbsent +NSMapMember +NSMapRemove +NSMaxRange +NSMaxX +NSMaxY +NSMidX +NSMidY +NSMinX +NSMinY +NSMouseInRect +NSNextHashEnumeratorItem +NSNextMapEnumeratorPair +NSNumberOfColorComponents +NSObjectFromCoder +NSOffsetRect +NSOpenStepRootDirectory +NSPageSize +NSPerformService +NSPlanarFromDepth +NSPointFromCGPoint +NSPointFromString +NSPointInRect +NSPointToCGPoint +NSProtocolFromString +NSRangeFromString +NSReadPixel +NSRealMemoryAvailable +NSReallocateCollectable +NSRecordAllocationEvent +NSRectClip +NSRectClipList +NSRectFill +NSRectFillList +NSRectFillListUsingOperation +NSRectFillListWithColors +NSRectFillListWithColorsUsingOperation +NSRectFillListWithGrays +NSRectFillUsingOperation +NSRectFromCGRect +NSRectFromString +NSRectToCGRect +NSRecycleZone +NSRegisterServicesProvider +NSReleaseAlertPanel +NSResetHashTable +NSResetMapTable +NSReturnAddress +NSRoundDownToMultipleOfPageSize +NSRoundUpToMultipleOfPageSize +NSRunAlertPanel +NSRunAlertPanelRelativeToWindow +NSRunCriticalAlertPanel +NSRunCriticalAlertPanelRelativeToWindow +NSRunInformationalAlertPanel +NSRunInformationalAlertPanelRelativeToWindow +NSSearchPathForDirectoriesInDomains +NSSelectorFromString +NSSetFocusRingStyle +NSSetShowsServicesMenuItem +NSSetUncaughtExceptionHandler +NSSetZoneName +NSShouldRetainWithZone +NSShowAnimationEffect +NSShowsServicesMenuItem +NSSizeFromCGSize +NSSizeFromString +NSSizeToCGSize +NSStringFromCGAffineTransform +NSStringFromCGPoint +NSStringFromCGRect +NSStringFromCGSize +NSStringFromCGVector +NSStringFromClass +NSStringFromHashTable +NSStringFromMapTable +NSStringFromPoint +NSStringFromProtocol +NSStringFromRange +NSStringFromRect +NSStringFromSelector +NSStringFromSize +NSStringFromUIEdgeInsets +NSStringFromUIOffset +NSSwapBigDoubleToHost +NSSwapBigFloatToHost +NSSwapBigIntToHost +NSSwapBigLongLongToHost +NSSwapBigLongToHost +NSSwapBigShortToHost +NSSwapDouble +NSSwapFloat +NSSwapHostDoubleToBig +NSSwapHostDoubleToLittle +NSSwapHostFloatToBig +NSSwapHostFloatToLittle +NSSwapHostIntToBig +NSSwapHostIntToLittle +NSSwapHostLongLongToBig +NSSwapHostLongLongToLittle +NSSwapHostLongToBig +NSSwapHostLongToLittle +NSSwapHostShortToBig +NSSwapHostShortToLittle +NSSwapInt +NSSwapLittleDoubleToHost +NSSwapLittleFloatToHost +NSSwapLittleIntToHost +NSSwapLittleLongLongToHost +NSSwapLittleLongToHost +NSSwapLittleShortToHost +NSSwapLong +NSSwapLongLong +NSSwapShort +NSTemporaryDirectory +NSTextAlignmentFromCTTextAlignment +NSTextAlignmentToCTTextAlignment +NSUnionRange +NSUnionRect +NSUnregisterServicesProvider +NSUpdateDynamicServices +NSUserName +NSValue +NSWidth +NSWindowList +NSWindowListForContext +NSZoneCalloc +NSZoneFree +NSZoneFromPointer +NSZoneMalloc +NSZoneName +NSZoneRealloc +NS_AVAILABLE +NS_AVAILABLE_IOS +NS_AVAILABLE_MAC +NS_CALENDAR_DEPRECATED +NS_DEPRECATED +NS_DEPRECATED_IOS +NS_DEPRECATED_MAC +UIAccessibilityConvertFrameToScreenCoordinates +UIAccessibilityConvertPathToScreenCoordinates +UIAccessibilityDarkerSystemColorsEnabled +UIAccessibilityIsBoldTextEnabled +UIAccessibilityIsClosedCaptioningEnabled +UIAccessibilityIsGrayscaleEnabled +UIAccessibilityIsGuidedAccessEnabled +UIAccessibilityIsInvertColorsEnabled +UIAccessibilityIsMonoAudioEnabled +UIAccessibilityIsReduceMotionEnabled +UIAccessibilityIsReduceTransparencyEnabled +UIAccessibilityIsSpeakScreenEnabled +UIAccessibilityIsSpeakSelectionEnabled +UIAccessibilityIsSwitchControlRunning +UIAccessibilityIsVoiceOverRunning +UIAccessibilityPostNotification +UIAccessibilityRegisterGestureConflictWithZoom +UIAccessibilityRequestGuidedAccessSession +UIAccessibilityZoomFocusChanged +UIApplicationMain +UIEdgeInsetsEqualToEdgeInsets +UIEdgeInsetsFromString +UIEdgeInsetsInsetRect +UIEdgeInsetsMake +UIGraphicsAddPDFContextDestinationAtPoint +UIGraphicsBeginImageContext +UIGraphicsBeginImageContextWithOptions +UIGraphicsBeginPDFContextToData +UIGraphicsBeginPDFContextToFile +UIGraphicsBeginPDFPage +UIGraphicsBeginPDFPageWithInfo +UIGraphicsEndImageContext +UIGraphicsEndPDFContext +UIGraphicsGetCurrentContext +UIGraphicsGetImageFromCurrentImageContext +UIGraphicsGetPDFContextBounds +UIGraphicsPopContext +UIGraphicsPushContext +UIGraphicsSetPDFContextDestinationForRect +UIGraphicsSetPDFContextURLForRect +UIGuidedAccessRestrictionStateForIdentifier +UIImageJPEGRepresentation +UIImagePNGRepresentation +UIImageWriteToSavedPhotosAlbum +UIOffsetEqualToOffset +UIOffsetFromString +UIOffsetMake +UIRectClip +UIRectFill +UIRectFillUsingBlendMode +UIRectFrame +UIRectFrameUsingBlendMode +UISaveVideoAtPathToSavedPhotosAlbum +UIVideoAtPathIsCompatibleWithSavedPhotosAlbum +NSAssert +NSAssert1 +NSAssert2 +NSAssert3 +NSAssert4 +NSAssert5 +NSCAssert +NSCAssert1 +NSCAssert2 +NSCAssert3 +NSCAssert4 +NSCAssert5 +NSCParameterAssert +NSDecimalMaxSize +NSDictionaryOfVariableBindings +NSGlyphInfoAtIndex +NSLocalizedString +NSLocalizedStringFromTable +NSLocalizedStringFromTableInBundle +NSLocalizedStringWithDefaultValue +NSParameterAssert +NSStackViewSpacingUseDefault +NSURLResponseUnknownLength +NS_AVAILABLE +NS_AVAILABLE_IOS +NS_AVAILABLE_IPHONE +NS_AVAILABLE_MAC +NS_CALENDAR_DEPRECATED +NS_CALENDAR_DEPRECATED_MAC +NS_CALENDAR_ENUM_DEPRECATED +NS_CLASS_AVAILABLE +NS_CLASS_AVAILABLE_IOS +NS_CLASS_AVAILABLE_MAC +NS_CLASS_DEPRECATED +NS_CLASS_DEPRECATED_IOS +NS_CLASS_DEPRECATED_MAC +NS_DEPRECATED +NS_DEPRECATED_IOS +NS_DEPRECATED_IPHONE +NS_DEPRECATED_MAC +NS_ENUM +NS_ENUM_AVAILABLE +NS_ENUM_AVAILABLE_IOS +NS_ENUM_AVAILABLE_MAC +NS_ENUM_DEPRECATED +NS_ENUM_DEPRECATED_IOS +NS_ENUM_DEPRECATED_MAC +NS_OPTIONS +NS_VALUERETURN +UIDeviceOrientationIsLandscape +UIDeviceOrientationIsPortrait +UIDeviceOrientationIsValidInterfaceOrientation +UIInterfaceOrientationIsLandscape +UIInterfaceOrientationIsPortrait +UI_USER_INTERFACE_IDIOM \ No newline at end of file diff --git a/sources_non_forked/cocoa.vim/lib/cocoa_indexes/methods.txt.gz b/sources_non_forked/cocoa.vim/lib/cocoa_indexes/methods.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..b0663d240d0c56af176710d47331eb99e2444c93 GIT binary patch literal 82161 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