aboutsummaryrefslogtreecommitdiff
path: root/runtime
Commit message (Collapse)AuthorAge
...
| * refactor(lua): deprecate tbl_flattenJustin M. Keyes2024-04-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: Besides being redundant with vim.iter():flatten(), `tbl_flatten` has these problems: - Has `tbl_` prefix but only accepts lists. - Discards some results! Compare the following: - iter.flatten(): ``` vim.iter({1, { { a = 2 } }, { 3 } }):flatten():totable() ``` - tbl_flatten: ``` vim.tbl_flatten({1, { { a = 2 } }, { 3 } }) ``` Solution: Deprecate tbl_flatten. Note: iter:flatten() currently fails ("flatten() requires a list-like table") on this code from gen_lsp.lua: local anonym = vim.iter({ -- remove nil anonymous_num > 1 and '' or nil, '---@class ' .. anonymous_classname, }):flatten():totable() Should we enhance :flatten() to work for arrays?
| * vim-patch:d3ff129ce8c6Christian Clason2024-04-22
| | | | | | | | | | | | | | | | | | | | | | | | | | runtime(astro): Add filetype, syntax and indent plugin related: vim/vim#14558 closes: vim/vim#14561 ported from: https://github.com/wuelnerdotexe/vim-astro https://github.com/vim/vim/commit/d3ff129ce8c68770c47d72ab3f30a21c19530eee Co-authored-by: Philip H <47042125+pheiduck@users.noreply.github.com>
| * refactor(lua): rename tbl_isarray => isarrayJustin M. Keyes2024-04-21
| | | | | | | | | | | | | | tbl_isarray was not released yet, so it will not go through a deprecation cycle. ref #24572
| * refactor(lua): rename tbl_islist => islistJustin M. Keyes2024-04-21
| | | | | | | | ref #24572
| * refactor(treesitter): language loadingLewis Russell2024-04-21
| |
| * perf(treesitter): incremental foldupdateJaehwang Jung2024-04-21
| | | | | | | | | | | | | | | | | | | | | | Problem: While the fold level computation is incremental, the evaluation of the foldexpr is done on the full buffer. Despite that the foldexpr reads from the cache, it can take tens of milliseconds for moderately big (10K lines) buffers. Solution: Track the range of lines on which the foldexpr should be evaluated.
| * Merge pull request #27872 from luukvbaal/cmdheightbfredl2024-04-21
| |\ | | | | | | fix(ui): don't force 'cmdheight' to zero with ext_messages
| | * fix(ui): don't force 'cmdheight' to zero with ext_messagesLuuk van Baal2024-04-20
| | | | | | | | | | | | Remove remaining code that prevents non-zero 'cmdheight' with ext_messages.
| * | vim-patch:564166f68184Christian Clason2024-04-21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ftplugin(cmake): Add include and suffixesadd closes: vim/vim#14520 https://github.com/vim/vim/commit/564166f68184071775cffffe331a9e12241be1ac Co-authored-by: Wu, Zhenyu <wuzhenyu@ustc.edu>
| * | feat(treesitter): handle quantified fold capturesRiley Bruins2024-04-20
| |/
| * feat(lsp): add vim.lsp.buf.subtypes(), vim.lsp.buf.supertypes() (#28388)Yinzuo Jiang2024-04-20
| | | | | | | | Co-authored-by: Mathias Fußenegger <mfussenegger@users.noreply.github.com> Co-authored-by: Maria José Solano <majosolano99@gmail.com>
| * fix(vim.ui.open): try wslview before explorer.exe #28424Justin M. Keyes2024-04-20
| | | | | | | | | | | | | | | | | | Problem: explorer.exe is unreliable on WSL. Solution: Try wslview before explorer.exe. fix #28410
| * refactor: add xmemcpyz() and use it in place of some xstrlcpy() (#28422)zeertzjq2024-04-20
| | | | | | | | | | | | Problem: Using xstrlcpy() when the exact length of the string to be copied is known is not ideal because it requires adding 1 to the length and an unnecessary strlen(). Solution: Add xmemcpyz() and use it in place of such xstrlcpy() calls.
| * vim-patch:9.1.0355: filetype: flake.lock files are not recognizedChristian Clason2024-04-19
| | | | | | | | | | | | | | | | | | | | | | | | Problem: filetype: flake.lock files are not recognized Solution: Detect 'flake.lock' as json filetype (Riley Bruins) closes: vim/vim#14589 https://github.com/vim/vim/commit/ce736033ae86e14e8b1a56a3e4843c7ab24e48d2 Co-authored-by: Riley Bruins <ribru17@hotmail.com>
| * vim-patch:cee034112d41Christian Clason2024-04-19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | runtime(bp): fix comment definition in filetype plugin (vim/vim#14594) I somehow messed up the previous patch, I think a copy-paste error when creating the file. Blueprint files have C and C++ style comments, not shell-like '#' comments. https://github.com/vim/vim/commit/cee034112d41372d4c31abc327c6536b24fc25bd Co-authored-by: Bruno BELANYI <bruno@belanyi.fr>
| * refactor(vim.iter)!: remove vim.iter.map/filter/totable #26138Justin M. Keyes2024-04-19
| | | | | | | | | | | | | | | | Problem: The use-case for the convenience functions vim.iter.map(), vim.iter.filter(), vim.iter.totable() is not clear. Solution: Drop them for now. We can revisit after 0.10 release.
| * vim-patch:9.1.0354: runtime(uci): No support for uci file types (#28409)zeertzjq2024-04-19
| | | | | | | | | | | | | | | | | | | | | | | | | | Problem: runtime(uci): No support for uci file types (Wu, Zhenyu) Solution: include basic uci ftplugin and syntax plugins (Colin Caine) closes: vim/vim#14575 https://github.com/vim/vim/commit/4b3fab14dbde971f15d8783e9ef125b19fdbc829 Co-authored-by: Colin Caine <complaints@cmcaine.co.uk> Co-authored-by: Wu, Zhenyu <wuzhenyu@ustc.edu>
| * vim-patch:36e667ab837c (#28407)zeertzjq2024-04-19
| | | | | | | | | | | | | | | | | | | | | | | | runtime(java): Support "g:ftplugin_java_source_path" with archived files Also, document for "g:ftplugin_java_source_path" its current modification of the local value of the 'path' option. closes: vim/vim#14570 https://github.com/vim/vim/commit/36e667ab837cd27b8c0c9df5c2db8008b2e1b76c Co-authored-by: Aliaksei Budavei <0x000c70@gmail.com>
| * docs: update supported platformsdundargoc2024-04-18
| |
| * fix(lsp): correct deprecation message #28403Maria José Solano2024-04-18
| |
| * feat(lua): enable(enable:boolean, filter:table) #28374Justin M. Keyes2024-04-18
| | | | | | | | | | | | | | | | | | | | | | | | | | Problem: We need to establish a pattern for `enable()`. Solution: - First `enable()` parameter is always `enable:boolean`. - Update `vim.diagnostic.enable()` - Update `vim.lsp.inlay_hint.enable()`. - It was not released yet, so no deprecation is needed. But to help HEAD users, it will show an informative error. - vim.deprecate(): - Improve message when the "removal version" is a *current or older* version.
| * refactor(lsp): merge rpc.domain_socket_connect into rpc.connect (#28398)Mathias Fußenegger2024-04-18
| | | | | | See discussion in https://github.com/neovim/neovim/pull/26850
| * fix(healthcheck): expand vimrc variable (#28379)Michael2024-04-17
| |
| * feat(lua): vim.fs.normalize() resolves ".", ".." #28203Famiu Haque2024-04-16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: `vim.fs.normalize` does not resolve `.` and `..` components. This makes no sense as the entire point of normalization is to remove redundancy from the path. The path normalization functions in several other languages (Java, Python, C++, etc.) also resolve `.` and `..` components. Reference: - Python: https://docs.python.org/3/library/os.path.html#os.path.normpath - Java: https://docs.oracle.com/javase/8/docs/api/java/nio/file/Path.html#normalize-- - C++: https://en.cppreference.com/w/cpp/filesystem/path/lexically_normal Solution: Resolve "." and ".." in `vim.fs.normalize`. Before: "~/foo/bar/../baz/./" => "~/foo/bar/../baz/." After: "~/foo/bar/../baz/./" => "~/foo/baz"
| * feat(defaults): use ripgrep (rg) for 'grepprg' if availableLuna Saphie Mittelbach2024-04-16
| |
| * fix: vim.validate() order is not deterministic #28377Justin M. Keyes2024-04-16
| | | | | | | | | | | | | | | | | | | | | | | | | | Problem: The order of the validation performed by vim.validate() is unpredictable. - harder to write reliable tests. - confusing UX because validation result might return different errors randomly. Solution: Iterate the input using `vim.spairs()`. Future: Ideally, the caller could provide an "ordered dict".
| * Merge #28227 feat(diagnostic): is_enabled, enable(…, enable:boolean)Justin M. Keyes2024-04-16
| |\
| | * feat(diagnostic): enable(…, opts)Justin M. Keyes2024-04-15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: vim.diagnostic.enable() does not match the signature of vim.lsp.inlay_hint.enable() Solution: - Change the signature so that the first 2 args are (bufnr, enable). - Introduce a 3rd `opts` arg. - Currently it only supports `opts.ns_id`.
| | * feat(diagnostic): is_enabled, enable(…, enable:boolean)Justin M. Keyes2024-04-15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: `vim.diagnostic.is_disabled` and `vim.diagnostic.disable` are unnecessary and inconsistent with the "toggle" pattern (established starting with `vim.lsp.inlay_hint`, see https://github.com/neovim/neovim/pull/25512#pullrequestreview-1676750276 As a reminder, the rationale is: - we always need `enable()` - we always end up needing `is_enabled()` - "toggle" can be achieved via `enable(not is_enabled())` - therefore, - `toggle()` and `disable()` are redundant - `is_disabled()` is a needless inconsistency Solution: - Introduce `vim.diagnostic.is_enabled`, and `vim.diagnostic.enable(…, enable:boolean)` - Note: Future improvement would be to add an `enable()` overload `enable(enable:boolean, opts: table)`. - Deprecate `vim.diagnostic.is_disabled`, `vim.diagnostic.disable`
| * | vim-patch:8a31de6dd275 (#28361)zeertzjq2024-04-16
| | | | | | | | | | | | | | | | | | | | | compiler(rime_deployer): include new compiler, use it for '*.custom.yaml' files (vim/vim#14460) https://github.com/vim/vim/commit/8a31de6dd275b3dc925fee556ccccd5db8ee2504 Co-authored-by: wzy <32936898+Freed-Wu@users.noreply.github.com>
| * | vim-patch:9.1.0326: filetype: some requirements files are not recognized ↵zeertzjq2024-04-16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | (#28360) Problem: filetype: some requirements files are not recognized Solution: Detect '*-requirements.txt', 'constraints.txt', 'requirements.in', 'requirements/*.txt' and 'requires/*.txt' as requirements filetype, include pip compiler, include requirements filetype and syntax plugin (Wu, Zhenyu, @raimon49) closes: vim/vim#14379 https://github.com/vim/vim/commit/f9f5424d3e75bbdb35aa48fa6f9241d9479b35e8 Co-authored-by: Wu, Zhenyu <wuzhenyu@ustc.edu> Co-authored-by: raimon <raimon49@hotmail.com>
| * | vim-patch:9.1.0325: CMakeCache.txt files not recognized (#28359)zeertzjq2024-04-16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | vim-patch:9.1.0325: filetype: CMakeCache.txt files not recognized Problem: filetype: CMakeCache.txt files not recognized Solution: Detect 'CMakeCache.txt' files as cmakecache filetype, include basic syntax script for cmakecache (Wu, Zhenyu, @bfrg) closes: vim/vim#14384 https://github.com/vim/vim/commit/62c09e032c6b2d49fffac726300d142381924b98 Co-authored-by: Wu, Zhenyu <wuzhenyu@ustc.edu> Co-authored-by: bfrg <bfrg@users.noreply.github.com>
| * | vim-patch:4052474a1bd2 (#28358)zeertzjq2024-04-16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | runtime(java): Recognise non-ASCII identifiers (vim/vim#14543) * runtime(java): Recognise non-ASCII identifiers Also: - Remove the already commented out and less general in its definition javaFuncDef alternative. - Stop recognising some bespoke {p,trace} debugging API. Non-ASCII identifiers have been supported from the outset of the Java language. > An _identifier_ is an unlimited-length sequence of _Java > letters_ and _Java digits_, the first of which must be a > Java letter. An identifier cannot have the same spelling > (Unicode character sequence) as a keyword . . . Boolean > literal . . . or the null literal . . . > . . . . . . . . > Letters and digits may be drawn from the entire Unicode > character set . . . > . . . . . . . . > A Java letter is a character for which the method > Character.isJavaLetter . . . returns true. A Java > letter-or-digit is a character for which the method > Character.isJavaLetterOrDigit . . . returns true. > . . . . . . . . > The Java letters include . . . for historical reasons, the > ASCII underscore (_) . . . and dollar sign ($) . . . (Separate syntax tests will be written when particular parts now touched will have been further improved.) Reference: https://javaalmanac.io/jdk/1.0/langspec.pdf [§3.8] * Take on the maintenance of Java filetype and syntax files https://github.com/vim/vim/commit/4052474a1bd2fe756bc7dc596d29d0d7581e35ae Co-authored-by: Aliaksei Budavei <32549825+zzzyxwvut@users.noreply.github.com>
| * | vim-patch:9.1.0324: filetype: some json files are not recognizedzeertzjq2024-04-16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: filetype: some json files are not recognized Solution: Detect '.jscsrc' and '.vsconfig' as jsonc filetype (Wu, Zhenyu) See: - https://github.com/microsoft/PowerToys/blob/main/.vsconfig - https://jscs-dev.github.io/ closes: vim/vim#14452 https://github.com/vim/vim/commit/c59a8648b2d8b3e17f12cd45f74a31b1aa385d2d Co-authored-by: Wu, Zhenyu <wuzhenyu@ustc.edu>
| * | vim-patch:9.1.0323: filetype: cabal config files may not be recognizedzeertzjq2024-04-16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: filetype: cabal config files may not be recognized Solution: Change filetype pattern to '*/{,.}cabal/config' (Wu Zhenyu) closes: vim/vim#14498 https://github.com/vim/vim/commit/799dedec0e959d7a18df8a06d497770706d1627c Co-authored-by: Wu, Zhenyu <wuzhenyu@ustc.edu>
| * | vim-patch:9.1.0322: filetype: some mail tools not recognizedzeertzjq2024-04-16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: filetype: some mail tools not recognized Solution: Detect '.mbsncrc' as conf, '.msmtprc' as msmtp and '.notmuch-config' as ini filetype (Shane-XB-Qian) closes: vim/vim#14533 https://github.com/vim/vim/commit/a7a9a476cf388f89286216188b8c8ae10702d9e2 Co-authored-by: shane.xb.qian <shane.qian@foxmail.com>
| * | vim-patch:fb8f31ea7d7f (#28356)zeertzjq2024-04-16
| | | | | | | | | | | | | | | | | | | | | | | | | | | runtime(doc): document pandoc compiler and enable configuring arguments closes: vim/vim#14550 https://github.com/vim/vim/commit/fb8f31ea7d7f3f42e9bdce7b4434fd93fba8876f Co-authored-by: Konfekt <Konfekt@users.noreply.github.com>
| * | vim-patch:dd83b63eb5b7 (#28351)Josef Litoš2024-04-16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | runtime(i3config/swayconfig): update syntax scripts modifications with the goals of: - simplifying structure by using group `cluster`s - improving visual highlighting responsiveness by using `nextgroup` - improving recursive wm-msg command highlighting - separating command variants meant for runtime and for config only closes: vim/vim#14544 https://github.com/vim/vim/commit/dd83b63eb5b7884c1c882eb984778492f6951ed7
| * | fix(checkhealth): error in node.js check #28348Ivan Georgiev2024-04-15
| |/ | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: :checkhealth node.js check fails: ERROR Failed to run healthcheck for "provider.node" plugin ... node/health.lua:98: attempt to call local 'message' (a string value) `message` is called as a function, when it is actually a string. Solution: Pass `message` to `warn()` as an argument. Fix #28346
| * fix(vim.ui): open() may wait indefinitely #28325Justin M. Keyes2024-04-15
| | | | | | | | | | | | | | | | | | | | | | | | Problem: vim.ui.open "locks up" Nvim if the spawned process does not terminate. #27986 Solution: - Change `vim.ui.open()`: - Do not call `wait()`. - Return a `SystemObj`. The caller can decide if it wants to `wait()`. - Change `gx` to `wait()` only a short time. - Allows `gx` to show a message if the command fails, without the risk of waiting forever.
| * vim-patch:4ba70cab37d2 (#28338)zeertzjq2024-04-15
| | | | | | | | | | | | | | | | | | | | | | | | runtime(vim): Update base-syntax, fix nested function folding (vim/vim#14397) Only match function folding start and end patterns at the start of a line, excluding heredocs and :append/:change/:insert commands. Fixes vim/vim#14393 https://github.com/vim/vim/commit/4ba70cab37d2a625d8c59bb136070ef9d1976934 Co-authored-by: dkearns <dougkearns@gmail.com>
| * vim-patch:e92ed1b45c54 (#28337)zeertzjq2024-04-15
| | | | | | | | | | | | | | runtime(vim): don't set compiler, update a comment for vimdoc compiler (vim/vim#14532) https://github.com/vim/vim/commit/e92ed1b45c5432235b0541521124d965b9d6a9a2 Co-authored-by: Shane-XB-Qian <shane.qian@foxmail.com>
| * vim-patch:9.1.0329: String interpolation fails for Dict type (#28335)zeertzjq2024-04-15
| | | | | | | | | | | | | | | | | | | | | | | | | | Problem: String interpolation fails for Dict type Solution: Support Dict data type properly, also support :put =Dict (without having to convert it to string() first) (Yegappan Lakshmanan) fixes: vim/vim#14529 closes: vim/vim#14541 https://github.com/vim/vim/commit/f01493c55062c01b1cdf9b1e946577f4d1bdddf3 Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
| * feat(api)!: nvim_open_win: noautocmd blocks all autocmds #28192Sean Dewar2024-04-14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: noautocmd is confusing; despite its name, it doesn't block all autocommands (instead it blocks only those related to setting the buffer), and is commonly used by plugins to open windows while producing minimal side-effects. Solution: be consistent and block all autocommands when noautocmd is set. This includes WinNew (again), plus autocommands from entering the window (if enter is set) like WinEnter, WinLeave, TabEnter, .etc. See the discussion at https://github.com/neovim/neovim/pull/14659#issuecomment-2040029517 for more information. Remove win_set_buf's noautocmd argument, as it's no longer needed. NOTE: pum_create_float_preview sets noautocmd for win_set_buf, but all its callers already use block_autocmds. Despite that, pum_create_float_preview doesn't actually properly handle autocommands (it has no checks for whether those from win_enter or nvim_create_buf free the window). For now, ensure autocommands are blocked within it for correctness (in case it's ever called outside of a block_autocmds context; the function seems to have been refactored in #26739 anyway).
| * fix(defaults): only repeat macro for each selected line if linewise (#28289)zeertzjq2024-04-15
| | | | | | | | | | | | As mentioned in #28287, repeating a macro for each selected line doesn't really make sense in non-linewise Visual mode. Fix #28287
| * vim-patch:9.1.0318: filetype: translate shell config files are not recognizedChristian Clason2024-04-14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: filetype: translate shell config files are not recognized Solution: Detect 'init.trans', 'translate-shell' and '.trans' files as clojure (Wu, Zhenyu) See: https://github.com/soimort/translate-shell/wiki/Configuration closes: vim/vim#14499 https://github.com/vim/vim/commit/4b5cd7257ee99384940d5210cf50298ff925924e Co-authored-by: Wu, Zhenyu <wuzhenyu@ustc.edu>
| * vim-patch:9.1.0317: filetype: matplotlibrc files are not recognizedChristian Clason2024-04-14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: filetype: matplotlibrc files are not recognized Solution: Detect 'matplotlibrc' file as yaml filetype (Wu, Zhenyu) See: https://matplotlib.org/stable/users/explain/customizing.html#the-matplotlibrc-file closes: vim/vim#14501 https://github.com/vim/vim/commit/55d4f3c006689945599589a90036923b1752754f Co-authored-by: Wu, Zhenyu <wuzhenyu@ustc.edu>
| * vim-patch:9.1.0316: filetype: some sh and confini files not recognizedChristian Clason2024-04-14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: filetype: some sh and confini files not recognized Solution: Detect neofetch, '.xprofile', XDG-User-Dirs files, paru and makepkg config files (Wu, Zhenyu) See: - https://github.com/dylanaraps/neofetch/wiki/Customizing-Info#config-file-location - https://www.freedesktop.org/wiki/Software/xdg-user-dirs/ closes: vim/vim#14505 https://github.com/vim/vim/commit/5a9f7e6750727f81d0638e7ce0ee6bcb01742570 Co-authored-by: Wu, Zhenyu <wuzhenyu@ustc.edu>
| * vim-patch:9.1.0315: filetype: a few more dosini files are not recognizedChristian Clason2024-04-14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: filetype: a few more dosini files are not recognized Solution: Detect wakatime, reply config files, flatpak, nfs config files and a few more python tools as dosini (or toml) (Wu, Zhenyu) Refer: - https://packaging.python.org/en/latest/specifications/pypirc/ - https://jorisroovers.com/gitlint/latest/configuration/ - https://pylint.pycqa.org/en/latest/user_guide/usage/run.html#command-line-options - https://docs.bpython-interpreter.org/en/latest/configuration.html - https://mypy.readthedocs.io/en/stable/config_file.html#the-mypy-configuration-file - https://black.readthedocs.io/en/stable/usage_and_configuration/the_basics.html#configuration-via-a-file - https://github.com/wakatime/wakatime-cli?tab=readme-ov-file#usage - https://metacpan.org/dist/Reply/view/bin/reply#-cfg-~/.replyrc close: vim/vim#14512 https://github.com/vim/vim/commit/0881329d129866fa49444e7fb6e622e54285a8ff Co-authored-by: Wu, Zhenyu <wuzhenyu@ustc.edu>
| * vim-patch:ce06493aeb3d (#28321)zeertzjq2024-04-14
| | | | | | | | | | | | | | | | | | | | | | | | | | runtime(vim): Update base-syntax, add legacy header folding Allow for syntax-based folding of Vim9 script legacy header regions. This is enabled with the "H" flag of the g:vimsyn_folding config variable. closes: vim/vim#14530 https://github.com/vim/vim/commit/ce06493aeb3d198d13de289ac39d1ed0f1604429 Co-authored-by: Doug Kearns <dougkearns@gmail.com>