mirror of
https://github.com/neovim/neovim.git
synced 2025-10-21 01:02:09 +00:00
feat(lua)!: execute Lua with "nvim -l"
Problem: Nvim has Lua but the "nvim" CLI can't easily be used to execute Lua scripts, especially scripts that take arguments or produce output. Solution: - support "nvim -l [args...]" for running scripts. closes #15749 - exit without +q - remove lua2dox_filter - remove Doxyfile. This wasn't used anyway, because the doxygen config is inlined in gen_vimdoc.py (`Doxyfile` variable). - use "nvim -l" in docs-gen CI job Examples: $ nvim -l scripts/lua2dox.lua --help Lua2DoX (0.2 20130128) ... $ echo "print(vim.inspect(_G.arg))" | nvim -l - --arg1 --arg2 $ echo 'print(vim.inspect(vim.api.nvim_buf_get_text(1,0,0,-1,-1,{})))' | nvim +"put ='text'" -l - TODO? -e executes Lua code -l loads a module -i enters REPL _after running the other arguments_.
This commit is contained in:
@@ -55,11 +55,19 @@ if sys.version_info < MIN_PYTHON_VERSION:
|
||||
doxygen_version = tuple((int(i) for i in subprocess.check_output(["doxygen", "-v"],
|
||||
universal_newlines=True).split()[0].split('.')))
|
||||
|
||||
# Until 0.9 is released, need this hacky way to check that "nvim -l foo.lua" works.
|
||||
nvim_version = list(line for line in subprocess.check_output(['nvim', '-h'], universal_newlines=True).split('\n')
|
||||
if '-l ' in line)
|
||||
|
||||
if doxygen_version < MIN_DOXYGEN_VERSION:
|
||||
print("\nRequires doxygen {}.{}.{}+".format(*MIN_DOXYGEN_VERSION))
|
||||
print("Your doxygen version is {}.{}.{}\n".format(*doxygen_version))
|
||||
sys.exit(1)
|
||||
|
||||
if len(nvim_version) == 0:
|
||||
print("\nRequires 'nvim -l' feature, see https://github.com/neovim/neovim/pull/18706")
|
||||
sys.exit(1)
|
||||
|
||||
# DEBUG = ('DEBUG' in os.environ)
|
||||
INCLUDE_C_DECL = ('INCLUDE_C_DECL' in os.environ)
|
||||
INCLUDE_DEPRECATED = ('INCLUDE_DEPRECATED' in os.environ)
|
||||
@@ -79,7 +87,7 @@ base_dir = os.path.dirname(os.path.dirname(script_path))
|
||||
out_dir = os.path.join(base_dir, 'tmp-{target}-doc')
|
||||
filter_cmd = '%s %s' % (sys.executable, script_path)
|
||||
msgs = [] # Messages to show on exit.
|
||||
lua2dox_filter = os.path.join(base_dir, 'scripts', 'lua2dox_filter')
|
||||
lua2dox = os.path.join(base_dir, 'scripts', 'lua2dox.lua')
|
||||
|
||||
CONFIG = {
|
||||
'api': {
|
||||
@@ -993,7 +1001,7 @@ def delete_lines_below(filename, tokenstr):
|
||||
fp.writelines(lines[0:i])
|
||||
|
||||
|
||||
def main(config, args):
|
||||
def main(doxygen_config, args):
|
||||
"""Generates:
|
||||
|
||||
1. Vim :help docs
|
||||
@@ -1021,7 +1029,7 @@ def main(config, args):
|
||||
# runtime/lua/vim/lsp.lua:209: warning: argument 'foo' not found
|
||||
stderr=(subprocess.STDOUT if debug else subprocess.DEVNULL))
|
||||
p.communicate(
|
||||
config.format(
|
||||
doxygen_config.format(
|
||||
input=' '.join(
|
||||
[f'"{file}"' for file in CONFIG[target]['files']]),
|
||||
output=output_dir,
|
||||
@@ -1108,11 +1116,7 @@ def main(config, args):
|
||||
fn_map_full.update(fn_map)
|
||||
|
||||
if len(sections) == 0:
|
||||
if target == 'lua':
|
||||
fail(f'no sections for target: {target} (this usually means'
|
||||
+ ' "luajit" was not found by scripts/lua2dox_filter)')
|
||||
else:
|
||||
fail(f'no sections for target: {target}')
|
||||
fail(f'no sections for target: {target} (look for errors near "Preprocessing" log lines above)')
|
||||
if len(sections) > len(CONFIG[target]['section_order']):
|
||||
raise RuntimeError(
|
||||
'found new modules "{}"; update the "section_order" map'.format(
|
||||
@@ -1159,7 +1163,7 @@ def main(config, args):
|
||||
def filter_source(filename):
|
||||
name, extension = os.path.splitext(filename)
|
||||
if extension == '.lua':
|
||||
p = subprocess.run([lua2dox_filter, filename], stdout=subprocess.PIPE)
|
||||
p = subprocess.run(['nvim', '-l', lua2dox, filename], stdout=subprocess.PIPE)
|
||||
op = ('?' if 0 != p.returncode else p.stdout.decode('utf-8'))
|
||||
print(op)
|
||||
else:
|
||||
|
@@ -27,14 +27,13 @@ http://search.cpan.org/~alec/Doxygen-Lua-0.02/lib/Doxygen/Lua.pm
|
||||
Running
|
||||
-------
|
||||
|
||||
This file "lua2dox.lua" gets called by "lua2dox_filter" (bash).
|
||||
This script "lua2dox.lua" gets called by "gen_vimdoc.py".
|
||||
|
||||
Doxygen must be on your system. You can experiment like so:
|
||||
|
||||
- Run "doxygen -g" to create a default Doxyfile.
|
||||
- Then alter it to let it recognise lua. Add the two following lines:
|
||||
- Then alter it to let it recognise lua. Add the following line:
|
||||
FILE_PATTERNS = *.lua
|
||||
FILTER_PATTERNS = *.lua=lua2dox_filter
|
||||
- Then run "doxygen".
|
||||
|
||||
The core function reads the input file (filename or stdin) and outputs some pseudo C-ish language.
|
||||
@@ -117,26 +116,6 @@ local function string_split(Str, Pattern)
|
||||
return splitStr
|
||||
end
|
||||
|
||||
--! \class TCore_Commandline
|
||||
--! \brief reads/parses commandline
|
||||
local TCore_Commandline = class()
|
||||
|
||||
--! \brief constructor
|
||||
function TCore_Commandline.init(this)
|
||||
this.argv = arg
|
||||
this.parsed = {}
|
||||
this.params = {}
|
||||
end
|
||||
|
||||
--! \brief get value
|
||||
function TCore_Commandline.getRaw(this, Key, Default)
|
||||
local val = this.argv[Key]
|
||||
if not val then
|
||||
val = Default
|
||||
end
|
||||
return val
|
||||
end
|
||||
|
||||
-------------------------------
|
||||
--! \brief file buffer
|
||||
--!
|
||||
@@ -147,7 +126,7 @@ local TStream_Read = class()
|
||||
--!
|
||||
--! \param Filename name of file to read (or nil == stdin)
|
||||
function TStream_Read.getContents(this, Filename)
|
||||
assert(Filename)
|
||||
assert(Filename, ('invalid file: %s'):format(Filename))
|
||||
-- get lines from file
|
||||
-- syphon lines to our table
|
||||
local filecontents = {}
|
||||
@@ -548,15 +527,14 @@ end
|
||||
local This_app = TApp()
|
||||
|
||||
--main
|
||||
local cl = TCore_Commandline()
|
||||
|
||||
local argv1 = cl:getRaw(2)
|
||||
local argv1 = arg[1]
|
||||
if argv1 == '--help' then
|
||||
TCore_IO_writeln(This_app:getVersion())
|
||||
TCore_IO_writeln(This_app:getCopyright())
|
||||
TCore_IO_writeln([[
|
||||
run as:
|
||||
lua2dox_filter <param>
|
||||
nvim -l scripts/lua2dox.lua <param>
|
||||
--------------
|
||||
Param:
|
||||
<filename> : interprets filename
|
||||
|
@@ -1,90 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
###########################################################################
|
||||
# Copyright (C) 2012 by Simon Dales #
|
||||
# simon@purrsoft.co.uk #
|
||||
# #
|
||||
# This program is free software; you can redistribute it and/or modify #
|
||||
# it under the terms of the GNU General Public License as published by #
|
||||
# the Free Software Foundation; either version 2 of the License, or #
|
||||
# (at your option) any later version. #
|
||||
# #
|
||||
# This program 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 General Public License for more details. #
|
||||
# #
|
||||
# You should have received a copy of the GNU General Public License #
|
||||
# along with this program; if not, write to the #
|
||||
# Free Software Foundation, Inc., #
|
||||
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
|
||||
###########################################################################
|
||||
LANG=""
|
||||
|
||||
##! \brief test executable to see if it exists
|
||||
test_executable() {
|
||||
P_EXE="$1"
|
||||
#########
|
||||
WHICH=$(which "$P_EXE")
|
||||
if test -z "${WHICH}"; then
|
||||
echo "not found \"${P_EXE}\""
|
||||
else
|
||||
EXE="${P_EXE}"
|
||||
fi
|
||||
}
|
||||
|
||||
##! \brief sets the lua interpreter
|
||||
set_lua() {
|
||||
if test -z "${EXE}"; then
|
||||
test_executable '.deps/usr/bin/luajit'
|
||||
fi
|
||||
|
||||
if test -z "${EXE}"; then
|
||||
test_executable 'luajit'
|
||||
fi
|
||||
|
||||
if test -z "${EXE}"; then
|
||||
test_executable 'lua'
|
||||
fi
|
||||
}
|
||||
|
||||
##! \brief makes canonical name of file
|
||||
##!
|
||||
##! Note that "readlink -f" doesn't work in MacOSX
|
||||
##!
|
||||
do_readlink() {
|
||||
pushd . > /dev/null
|
||||
TARGET_FILE=$1
|
||||
|
||||
cd "$(dirname $TARGET_FILE)"
|
||||
TARGET_FILE=$(basename "$TARGET_FILE")
|
||||
|
||||
# Iterate down a (possible) chain of symlinks
|
||||
while [ -L "$TARGET_FILE" ]; do
|
||||
TARGET_FILE=$(readlink "$TARGET_FILE")
|
||||
cd $(dirname "$TARGET_FILE")
|
||||
TARGET_FILE=$(basename "$TARGET_FILE")
|
||||
done
|
||||
|
||||
PHYS_DIR=$(pwd -P)
|
||||
RESULT=$PHYS_DIR
|
||||
popd > /dev/null
|
||||
}
|
||||
|
||||
##main
|
||||
set_lua
|
||||
if test -z "${EXE}"; then
|
||||
echo "no lua interpreter found"
|
||||
exit 1
|
||||
else
|
||||
BASENAME=$(basename "$0")
|
||||
do_readlink "$0"
|
||||
DIRNAME="${RESULT}"
|
||||
|
||||
LUASCRIPT="${DIRNAME}/lua2dox.lua ${BASENAME}"
|
||||
#echo "lua[${LUASCRIPT}]"
|
||||
|
||||
${EXE} ${LUASCRIPT} $@
|
||||
fi
|
||||
|
||||
##eof
|
Reference in New Issue
Block a user