Bram Moolenaar wrote:
<snip>
> I suppose it will now be easy to support --enable-pythoninterp=dynamic
> and --enable-python3interp=dynamic
>
> We could wait for people to test this, but on the other hand if we want
> to do the same for ruby/tcl/mzscheme we need to do it now, next week I
> won't include patches like this.
In the same vein, I'll attaching a patch that adds dynamic support for the Lua
interface. I won't be able to test it in Windows until next week. I'm taking
the opportunity to also patch the help file.
Cheers,
Luis
--
Computers are useless. They can only give you answers.
-- Pablo Picasso
--
Luis Carvalho (Kozure)
lua -e 'print((("[email protected]"):gsub("(%u+%.)","")))'
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
--- vim.orig/src/Makefile 2010-07-21 19:24:21.112479023 -0300
+++ vim/src/Makefile 2010-07-21 18:01:18.635456732 -0300
@@ -1314,7 +1314,7 @@
.SUFFIXES: .c .o .pro
PRE_DEFS = -Iproto $(DEFS) $(GUI_DEFS) $(GUI_IPATH) $(CPPFLAGS) $(EXTRA_IPATHS)
-POST_DEFS = $(X_CFLAGS) $(LUA_CFLAGS) $(MZSCHEME_CFLAGS) $(TCL_CFLAGS) $(RUBY_CFLAGS) $(EXTRA_DEFS)
+POST_DEFS = $(X_CFLAGS) $(MZSCHEME_CFLAGS) $(TCL_CFLAGS) $(RUBY_CFLAGS) $(EXTRA_DEFS)
ALL_CFLAGS = $(PRE_DEFS) $(CFLAGS) $(PROFILE_CFLAGS) $(POST_DEFS)
@@ -2488,7 +2488,7 @@
$(CCC) -o $@ if_xcmdsrv.c
objects/if_lua.o: if_lua.c
- $(CCC) -o $@ if_lua.c
+ $(CCC) $(LUA_CFLAGS) -o $@ if_lua.c
objects/if_mzsch.o: if_mzsch.c $(MZSCHEME_EXTRA)
$(CCC) -o $@ $(MZSCHEME_CFLAGS_EXTRA) if_mzsch.c
--- vim.orig/src/config.h.in 2010-07-21 19:24:22.927516762 -0300
+++ vim/src/config.h.in 2010-07-21 18:03:00.340489646 -0300
@@ -319,6 +319,9 @@
/* Define if you want to include the Lua interpreter. */
#undef FEAT_LUA
+/* Define for linking via dlopen() or LoadLibrary() */
+#undef DYNAMIC_LUA
+
/* Define if you want to include the MzScheme interpreter. */
#undef FEAT_MZSCHEME
--- vim.orig/src/configure.in 2010-07-21 19:24:20.199472694 -0300
+++ vim/src/configure.in 2010-07-21 19:13:47.696263464 -0300
@@ -413,11 +413,11 @@
dnl Check for Lua feature.
AC_MSG_CHECKING(--enable-luainterp argument)
AC_ARG_ENABLE(luainterp,
- [ --enable-luainterp Include Lua interpreter.], ,
+ [ --enable-luainterp[=OPTS] Include Lua interpreter. [default=no] [OPTS=no/yes/dynamic]], ,
[enable_luainterp="no"])
AC_MSG_RESULT($enable_luainterp)
-if test "$enable_luainterp" = "yes"; then
+if test "$enable_luainterp" = "yes" -o "$enable_luainterp" = "dynamic"; then
dnl -- find the lua executable
AC_SUBST(vi_cv_path_lua)
@@ -477,6 +477,11 @@
LUA_OBJ="objects/if_lua.o"
LUA_PRO="if_lua.pro"
AC_DEFINE(FEAT_LUA)
+ if test "$enable_luainterp" = "dynamic"; then
+ AC_DEFINE(DYNAMIC_LUA)
+ LUA_LIBS=""
+ LUA_CFLAGS="-DDYNAMIC_LUA_DLL=\\\"liblua${vi_cv_version_lua}.so\\\" $LUA_CFLAGS"
+ fi
fi
AC_SUBST(LUA_SRC)
AC_SUBST(LUA_OBJ)
--- vim.orig/src/if_lua.c 2010-07-21 19:24:21.292455466 -0300
+++ vim/src/if_lua.c 2010-07-22 10:32:45.396540334 -0300
@@ -41,6 +41,19 @@
#ifdef DYNAMIC_LUA
+
+#ifndef WIN3264
+#include <dlfcn.h>
+#define HANDLE void*
+#define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL)
+#define symbol_from_dll dlsym
+#define close_dll dlclose
+#else
+#define load_dll LoadLibrary
+#define symbol_from_dll GetProcAddress
+#define close_dll FreeLibrary
+#endif
+
/* lauxlib */
#define luaL_register dll_luaL_register
#define luaL_typerror dll_luaL_typerror
@@ -227,14 +240,14 @@
{NULL, NULL}
};
-static HINSTANCE hinstLua = 0;
+static HANDLE hinstLua = NULL;
static void
end_dynamic_lua(void)
{
if (hinstLua)
{
- FreeLibrary(hinstLua);
+ close_dll(hinstLua);
hinstLua = 0;
}
}
@@ -244,7 +257,7 @@
{
const luaV_Reg *reg;
if (hinstLua) return OK;
- hinstLua = LoadLibrary(libname);
+ hinstLua = load_dll(libname);
if (!hinstLua)
{
if (verbose)
@@ -253,8 +266,8 @@
}
for (reg = luaV_dll; reg->func; reg++)
{
- if ((*reg->func = GetProcAddress(hinstLua, reg->name)) == NULL) {
- FreeLibrary(hinstLua);
+ if ((*reg->func = symbol_from_dll(hinstLua, reg->name)) == NULL) {
+ close_dll(hinstLua);
hinstLua = 0;
if (verbose)
EMSG2(_(e_loadfunc), reg->name);
--- vim.orig/runtime/doc/if_lua.txt 2010-07-21 19:24:25.299476540 -0300
+++ vim/runtime/doc/if_lua.txt 2010-07-22 10:07:29.127454922 -0300
@@ -1,4 +1,4 @@
-*if_lua.txt* For Vim version 7.3b. Last change: 2008 Aug 31
+*if_lua.txt* For Vim version 7.3. Last change: 2010 Jul 22
VIM REFERENCE MANUAL by Luis Carvalho
@@ -56,7 +56,7 @@
<
*:luado*
-:[range]luado {body} Execute Lua function$function (line)${body}$end$ for
+:[range]luado {body} Execute Lua function "function (line) {body} end" for
each line in the [range], with the function argument
being set to the text of each line in turn, without a
trailing <EOL>. If the value returned by the function
@@ -88,10 +88,10 @@
All these commands execute a Lua chunk from either the command line (:lua and
:luado) or a file (:luafile) with the given line [range]. Similarly to the Lua
interpreter, each chunk has its own scope and so only global variables are
-shared between command calls. Lua default libraries$table$,$string$,$math$,
-and$package$are available,$io$and$debug$are not, and$os$is restricted to
-functions$date$,$clock$,$time$,$difftime$, and$getenv$. In addition,
-Lua$print$function has its output redirected to the Vim message area, with
+shared between command calls. Lua default libraries "table", "string", "math",
+and "package" are available, "io" and "debug" are not, and "os" is restricted
+to functions "date", "clock", "time", "difftime", and "getenv". In addition,
+Lua "print" function has its output redirected to the Vim message area, with
arguments separated by a white space instead of a tab.
Lua uses the "vim" module (see |lua-vim|) to issue commands to Vim
@@ -104,36 +104,39 @@
2. The vim module *lua-vim*
Lua interfaces Vim through the "vim" module. The first and last line of the
-input range are stored in$vim.firstline$and$vim.lastline$respectively. The
+input range are stored in "vim.firstline" and "vim.lastline" respectively. The
module also includes routines for buffer, window, and current line queries,
Vim evaluation and command execution, and others.
- $vim.isbuffer(value)$ Returns#true#if$value$is a buffer userdata and
- $false$otherwise (see |lua-buffer|).
+ vim.isbuffer(value) Returns 'true' (boolean, not string) if
+ "value" is a buffer userdata and 'false'
+ otherwise (see |lua-buffer|).
+
+ vim.buffer([arg]) If "arg" is a number, returns buffer with
+ number "arg" in the buffer list or, if "arg"
+ is a string, returns buffer whose full or short
+ name is "arg". In both cases, returns 'nil'
+ (nil value, not string) if the buffer is not
+ found. Otherwise, if "toboolean(arg)" is
+ 'true' returns the first buffer in the buffer
+ list or else the current buffer.
+
+ vim.iswindow(value) Returns 'true' (boolean, not string) if
+ "value" is a window userdata and
+ 'false' otherwise (see |lua-window|).
+
+ vim.window([arg]) If "arg" is a number, returns window with
+ number "arg" or 'nil' (nil value, not string)
+ if not found. Otherwise, if "toboolean(arg)"
+ is 'true' returns the first window or else the
+ current window.
- $vim.buffer($[arg]$)$ If$arg$is a number, returns buffer with number
- $arg$in the buffer list or, if$arg$is
- a string, returns buffer whose full or short
- name is$arg$. In both cases, returns#nil#if
- the buffer is not found. Otherwise, if
- $toboolean(arg)$is#true#returns the first
- buffer in the buffer list or else the current
- buffer.
-
- $vim.iswindow(value)$ Returns#true#if$value$is a window userdata and
- $false$otherwise (see |lua-window|).
-
- $vim.window($[arg]$)$ If$arg$is a number, returns window with number
- $arg$or#nil#if not found. Otherwise, if
- $toboolean(arg)$is#true#returns the first
- window or else the current window.
-
- $vim.command(${cmd}$)$ Executes the vim (ex-mode) command {cmd}.
+ vim.command({cmd}) Executes the vim (ex-mode) command {cmd}.
Examples: >
:lua vim.command"set tw=60"
:lua vim.command"normal ddp"
<
- $vim.eval(${expr}$)$ Evaluates expression {expr} (see |expression|),
+ vim.eval({expr}) Evaluates expression {expr} (see |expression|),
converts the result to Lua, and returns it.
Vim strings and numbers are directly converted
to Lua strings and numbers respectively. Vim
@@ -143,12 +146,12 @@
:lua tw = vim.eval"&tw"
:lua print(vim.eval"{'a': 'one'}".a)
<
- $vim.line()$ Returns the current line (without the trailing
+ vim.line() Returns the current line (without the trailing
<EOL>), a Lua string.
- $vim.beep()$ Beeps.
+ vim.beep() Beeps.
- $vim.open(${fname}$)$ Opens a new buffer for file {fname} and
+ vim.open({fname}) Opens a new buffer for file {fname} and
returns it. Note that the buffer is not set as
current.
@@ -156,29 +159,31 @@
==============================================================================
3. Buffer userdata *lua-buffer*
-Buffer userdata represent vim buffers. A buffer userdata$b$has the following
+Buffer userdata represent vim buffers. A buffer userdata "b" has the following
properties and methods:
Properties
----------
- #o#$b()$sets$b$as the current buffer.
- #o#$#b$is the number of lines in buffer$b$.
- #o#$b[k]$represents line number$k$:$b[k] = newline$replaces line$k$
- with string$newline$and$b[k] =$#nil#deletes line$k$.
- #o#$b.name$contains the short name of buffer$b$(read-only).
- #o#$b.fname$contains the full name of buffer$b$(read-only).
- #o#$b.number$contains the position of buffer$b$in the buffer list
+ o "b()" sets "b" as the current buffer.
+ o "#b" is the number of lines in buffer "b".
+ o "b[k]" represents line number k: "b[k] = newline" replaces line k
+ with string "newline" and "b[k] = nil" deletes line k.
+ o "b.name" contains the short name of buffer "b" (read-only).
+ o "b.fname" contains the full name of buffer "b" (read-only).
+ o "b.number" contains the position of buffer "b" in the buffer list
(read-only).
Methods
-------
- #o#$b:insert(newline$[, pos]$)$inserts string$newline$at position$pos$
- in the buffer. The default value for$pos$is$#b + 1$. If$pos == 0$
- then$newline$becomes the first line in the buffer.
- #o#$b:next()$returns the buffer next to$b$in the buffer list.
- #o#$b:previous()$returns the buffer previous to$b$in the buffer list.
- #o#$b:isvalid()$returns#true#if buffer$b$corresponds to a "real" (not
- freed from memory) Vim buffer.
+ o "b:insert(newline[, pos])" inserts string "newline" at (optional)
+ position "pos" in the buffer. The default value for "pos" is
+ "#b + 1". If "pos == 0" then "newline" becomes the first line in
+ the buffer.
+ o "b:next()" returns the buffer next to "b" in the buffer list.
+ o "b:previous()" returns the buffer previous to "b" in the buffer
+ list.
+ o "b:isvalid()" returns 'true' (boolean) if buffer "b" corresponds to
+ a "real" (not freed from memory) Vim buffer.
Examples:
>
@@ -206,24 +211,24 @@
==============================================================================
4. Window userdata *lua-window*
-Window objects represent vim windows. A window userdata$w$has the following
+Window objects represent vim windows. A window userdata "w" has the following
properties and methods:
Properties
----------
- #o#$w()$sets$w$as the current window.
- #o#$w.buffer$contains the buffer of window$w$(read-only).
- #o#$w.line$represents the cursor line position in window$w$.
- #o#$w.col$represents the cursor column position in window$w$.
- #o#$w.width$represents the width of window$w$.
- #o#$w.height$represents the height of window$w$.
+ o "w()" sets "w" as the current window.
+ o "w.buffer" contains the buffer of window "w" (read-only).
+ o "w.line" represents the cursor line position in window "w".
+ o "w.col" represents the cursor column position in window "w".
+ o "w.width" represents the width of window "w".
+ o "w.height" represents the height of window "w".
Methods
-------
- #o#$w:next()$returns the window next to$w$.
- #o#$w:previous()$returns the window previous to$w$.
- #o#$w:isvalid()$returns#true#if window$w$corresponds to a "real" (not
- freed from memory) Vim window.
+ o "w:next()" returns the window next to "w".
+ o "w:previous()" returns the window previous to "w".
+ o "w:isvalid()" returns 'true' (boolean) if window "w" corresponds to
+ a "real" (not freed from memory) Vim window.
Examples:
>