enable_tclinterp
with_tclsh
enable_rubyinterp
+with_ruby_command
enable_cscope
enable_workshop
enable_netbeans
--with-plthome=PLTHOME Use PLTHOME.
--with-python-config-dir=PATH Python's config directory
--with-tclsh=PATH which tclsh to use (default: tclsh8.0)
+ --with-ruby-command=RUBY name of the Ruby command (default: ruby)
--with-x use the X Window System
--with-gtk-prefix=PFX Prefix where GTK is installed (optional)
--with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)
{ $as_echo "$as_me:$LINENO: result: $enable_rubyinterp" >&5
$as_echo "$enable_rubyinterp" >&6; }
if test "$enable_rubyinterp" = "yes"; then
+ { $as_echo "$as_me:$LINENO: checking --with-ruby-command argument" >&5
+$as_echo_n "checking --with-ruby-command argument... " >&6; }
- # Extract the first word of "ruby", so it can be a program name with args.
-set dummy ruby; ac_word=$2
+# Check whether --with-ruby-command was given.
+if test "${with_ruby_command+set}" = set; then
+ withval=$with_ruby_command; RUBY_CMD="$withval"; { $as_echo "$as_me:$LINENO: result: $RUBY_CMD" >&5
+$as_echo "$RUBY_CMD" >&6; }
+else
+ RUBY_CMD="ruby"; { $as_echo "$as_me:$LINENO: result: defaulting to $RUBY_CMD" >&5
+$as_echo "defaulting to $RUBY_CMD" >&6; }
+fi
+
+
+ # Extract the first word of "$RUBY_CMD", so it can be a program name with args.
+set dummy $RUBY_CMD; ac_word=$2
{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_path_vi_cv_path_ruby+set}" = set; then
$as_echo "OK" >&6; }
{ $as_echo "$as_me:$LINENO: checking Ruby header files" >&5
$as_echo_n "checking Ruby header files... " >&6; }
- rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG["archdir"] || $hdrdir' 2>/dev/null`
+ rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG["rubyhdrdir"] || Config::CONFIG["archdir"] || $hdrdir' 2>/dev/null`
if test "X$rubyhdrdir" != "X"; then
{ $as_echo "$as_me:$LINENO: result: $rubyhdrdir" >&5
$as_echo "$rubyhdrdir" >&6; }
RUBY_CFLAGS="-I$rubyhdrdir"
+ rubyarch=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["arch"]'`
+ if test -d "$rubyhdrdir/$rubyarch"; then
+ RUBY_CFLAGS="$RUBY_CFLAGS -I$rubyhdrdir/$rubyarch"
+ fi
+ rubyversion=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["ruby_version"].gsub(/\./, "")[0,2]'`
+ RUBY_CFLAGS="$RUBY_CFLAGS -DRUBY_VERSION=$rubyversion"
rubylibs=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["LIBS"]'`
if test "X$rubylibs" != "X"; then
RUBY_LIBS="$rubylibs"
_ACEOF
else
- { $as_echo "$as_me:$LINENO: result: not found" >&5
-$as_echo "not found" >&6; }
+ { $as_echo "$as_me:$LINENO: result: not found; disabling Ruby" >&5
+$as_echo "not found; disabling Ruby" >&6; }
fi
else
{ $as_echo "$as_me:$LINENO: result: too old; need Ruby version 1.6.0 or later" >&5
#endif
#include <ruby.h>
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+# include <ruby/encoding.h>
+#endif
#undef EXTERN
#undef _
# define __OPENTRANSPORTPROVIDERS__
#endif
+/*
+ * Backward compatiblity for Ruby 1.8 and earlier.
+ * Ruby 1.9 does not provide STR2CSTR, instead StringValuePtr is provided.
+ * Ruby 1.9 does not provide RXXX(s)->len and RXXX(s)->ptr, instead
+ * RXXX_LEN(s) and RXXX_PTR(s) are provided.
+ */
+#ifndef StringValuePtr
+# define StringValuePtr(s) STR2CSTR(s)
+#endif
+#ifndef RARRAY_LEN
+# define RARRAY_LEN(s) RARRAY(s)->len
+#endif
+#ifndef RARRAY_PTR
+# define RARRAY_PTR(s) RARRAY(s)->ptr
+#endif
+#ifndef RSTRING_LEN
+# define RSTRING_LEN(s) RSTRING(s)->len
+#endif
+#ifndef RSTRING_PTR
+# define RSTRING_PTR(s) RSTRING(s)->ptr
+#endif
+
#include "vim.h"
#include "version.h"
#define rb_str_concat dll_rb_str_concat
#define rb_str_new dll_rb_str_new
#define rb_str_new2 dll_rb_str_new2
-#define ruby_errinfo (*dll_ruby_errinfo)
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+# define rb_errinfo dll_rb_errinfo
+#else
+# define ruby_errinfo (*dll_ruby_errinfo)
+#endif
#define ruby_init dll_ruby_init
#define ruby_init_loadpath dll_ruby_init_loadpath
#define NtInitialize dll_NtInitialize
# define rb_w32_snprintf dll_rb_w32_snprintf
#endif
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+# define ruby_script dll_ruby_script
+# define rb_enc_find_index dll_rb_enc_find_index
+# define rb_enc_find dll_rb_enc_find
+# define rb_enc_str_new dll_rb_enc_str_new
+# define rb_sprintf dll_rb_sprintf
+#endif
+
/*
* Pointers for dynamic link
*/
static VALUE (*dll_rb_str_concat) (VALUE, VALUE);
static VALUE (*dll_rb_str_new) (const char*, long);
static VALUE (*dll_rb_str_new2) (const char*);
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+static VALUE (*dll_rb_errinfo) (void);
+#else
static VALUE *dll_ruby_errinfo;
+#endif
static void (*dll_ruby_init) (void);
static void (*dll_ruby_init_loadpath) (void);
static void (*dll_NtInitialize) (int*, char***);
static int (*dll_rb_w32_snprintf)(char*, size_t, const char*, ...);
#endif
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+static void (*dll_ruby_script) (const char*);
+static int (*dll_rb_enc_find_index) (const char*);
+static rb_encoding* (*dll_rb_enc_find) (const char*);
+static VALUE (*dll_rb_enc_str_new) (const char*, long, rb_encoding*);
+static VALUE (*dll_rb_sprintf) (const char*, ...);
+#endif
+
static HINSTANCE hinstRuby = 0; /* Instance of ruby.dll */
/*
{"rb_str_concat", (RUBY_PROC*)&dll_rb_str_concat},
{"rb_str_new", (RUBY_PROC*)&dll_rb_str_new},
{"rb_str_new2", (RUBY_PROC*)&dll_rb_str_new2},
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+ {"rb_errinfo", (RUBY_PROC*)&dll_rb_errinfo},
+#else
{"ruby_errinfo", (RUBY_PROC*)&dll_ruby_errinfo},
+#endif
{"ruby_init", (RUBY_PROC*)&dll_ruby_init},
{"ruby_init_loadpath", (RUBY_PROC*)&dll_ruby_init_loadpath},
{"NtInitialize", (RUBY_PROC*)&dll_NtInitialize},
#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
{"rb_w32_snprintf", (RUBY_PROC*)&dll_rb_w32_snprintf},
+#endif
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+ {"ruby_script", (RUBY_PROC*)&dll_ruby_script},
+ {"rb_enc_find_index", (RUBY_PROC*)&dll_rb_enc_find_index},
+ {"rb_enc_find", (RUBY_PROC*)&dll_rb_enc_find},
+ {"rb_enc_str_new", (RUBY_PROC*)&dll_rb_enc_str_new},
+ {"rb_sprintf", (RUBY_PROC*)&dll_rb_sprintf},
#endif
{"", NULL},
};
vim_free(script);
}
+/*
+ * In Ruby 1.9 or later, ruby String object has encoding.
+ * conversion buffer string of vim to ruby String object using
+ * VIM encoding option.
+ */
+ static VALUE
+vim_str2rb_enc_str(const char *s)
+{
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+ int isnum;
+ long lval;
+ char_u *sval;
+ rb_encoding *enc;
+
+ isnum = get_option_value((char_u *)"enc", &lval, &sval, 0);
+ if (isnum == 0)
+ {
+ enc = rb_enc_find((char *)sval);
+ vim_free(sval);
+ if (enc) {
+ return rb_enc_str_new(s, strlen(s), enc);
+ }
+ }
+#endif
+ return rb_str_new2(s);
+}
+
+ static VALUE
+eval_enc_string_protect(const char *str, int *state)
+{
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+ int isnum;
+ long lval;
+ char_u *sval;
+ rb_encoding *enc;
+ VALUE v;
+
+ isnum = get_option_value((char_u *)"enc", &lval, &sval, 0);
+ if (isnum == 0)
+ {
+ enc = rb_enc_find((char *)sval);
+ vim_free(sval);
+ if (enc)
+ {
+ v = rb_sprintf("#-*- coding:%s -*-\n%s", rb_enc_name(enc), str);
+ return rb_eval_string_protect(StringValuePtr(v), state);
+ }
+ }
+#endif
+ return rb_eval_string_protect(str, state);
+}
+
void ex_rubydo(exarg_T *eap)
{
int state;
for (i = eap->line1; i <= eap->line2; i++) {
VALUE line, oldline;
- line = oldline = rb_str_new2((char *)ml_get(i));
+ line = oldline = vim_str2rb_enc_str((char *)ml_get(i));
rb_lastline_set(line);
- rb_eval_string_protect((char *) eap->arg, &state);
+ eval_enc_string_protect((char *) eap->arg, &state);
if (state) {
error_print(state);
break;
EMSG(_("E265: $_ must be an instance of String"));
return;
}
- ml_replace(i, (char_u *) STR2CSTR(line), 1);
+ ml_replace(i, (char_u *) StringValuePtr(line), 1);
changed();
#ifdef SYNTAX_HL
syn_changed(i); /* recompute syntax hl. for this line */
int argc = 1;
char *argv[] = {"gvim.exe"};
NtInitialize(&argc, &argv);
+#endif
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+ RUBY_INIT_STACK;
#endif
ruby_init();
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+ ruby_script("vim-ruby");
+#endif
ruby_init_loadpath();
ruby_io_init();
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+ rb_enc_find_index("encdb");
+#endif
ruby_vim_init();
ruby_initialized = 1;
#ifdef DYNAMIC_RUBY
static void error_print(int state)
{
#ifndef DYNAMIC_RUBY
+#if !(defined(RUBY_VERSION) && RUBY_VERSION >= 19)
RUBYEXTERN VALUE ruby_errinfo;
+#endif
#endif
VALUE eclass;
VALUE einfo;
break;
case TAG_RAISE:
case TAG_FATAL:
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+ eclass = CLASS_OF(rb_errinfo());
+ einfo = rb_obj_as_string(rb_errinfo());
+#else
eclass = CLASS_OF(ruby_errinfo);
einfo = rb_obj_as_string(ruby_errinfo);
- if (eclass == rb_eRuntimeError && RSTRING(einfo)->len == 0) {
+#endif
+ if (eclass == rb_eRuntimeError && RSTRING_LEN(einfo) == 0) {
EMSG(_("E272: unhandled exception"));
}
else {
epath = rb_class_path(eclass);
vim_snprintf(buff, BUFSIZ, "%s: %s",
- RSTRING(epath)->ptr, RSTRING(einfo)->ptr);
+ RSTRING_PTR(epath), RSTRING_PTR(einfo));
p = strchr(buff, '\n');
if (p) *p = '\0';
EMSG(buff);
char *buff, *p;
str = rb_obj_as_string(str);
- buff = ALLOCA_N(char, RSTRING(str)->len);
- strcpy(buff, RSTRING(str)->ptr);
+ buff = ALLOCA_N(char, RSTRING_LEN(str));
+ strcpy(buff, RSTRING_PTR(str));
p = strchr(buff, '\n');
if (p) *p = '\0';
MSG(buff);
static VALUE vim_set_option(VALUE self UNUSED, VALUE str)
{
- do_set((char_u *)STR2CSTR(str), 0);
+ do_set((char_u *)StringValuePtr(str), 0);
update_screen(NOT_VALID);
return Qnil;
}
static VALUE vim_command(VALUE self UNUSED, VALUE str)
{
- do_cmdline_cmd((char_u *)STR2CSTR(str));
+ do_cmdline_cmd((char_u *)StringValuePtr(str));
return Qnil;
}
static VALUE vim_evaluate(VALUE self UNUSED, VALUE str)
{
#ifdef FEAT_EVAL
- char_u *value = eval_to_string((char_u *)STR2CSTR(str), NULL, TRUE);
+ char_u *value = eval_to_string((char_u *)StringValuePtr(str), NULL, TRUE);
if (value != NULL)
{
if (n > 0 && n <= buf->b_ml.ml_line_count)
{
char *line = (char *)ml_get_buf(buf, n, FALSE);
- return line ? rb_str_new2(line) : Qnil;
+ return line ? vim_str2rb_enc_str(line) : Qnil;
}
- rb_raise(rb_eIndexError, "index %d out of buffer", n);
+ rb_raise(rb_eIndexError, "line number %ld out of range", (long)n);
#ifndef __GNUC__
return Qnil; /* For stop warning */
#endif
static VALUE set_buffer_line(buf_T *buf, linenr_T n, VALUE str)
{
- char *line = STR2CSTR(str);
+ char *line = StringValuePtr(str);
aco_save_T aco;
if (n > 0 && n <= buf->b_ml.ml_line_count && line != NULL)
}
else
{
- rb_raise(rb_eIndexError, "index %d out of buffer", n);
+ rb_raise(rb_eIndexError, "line number %ld out of range", (long)n);
#ifndef __GNUC__
return Qnil; /* For stop warning */
#endif
}
else
{
- rb_raise(rb_eIndexError, "index %d out of buffer", n);
+ rb_raise(rb_eIndexError, "line number %ld out of range", n);
}
return Qnil;
}
static VALUE buffer_append(VALUE self, VALUE num, VALUE str)
{
buf_T *buf = get_buf(self);
- char *line = STR2CSTR(str);
+ char *line = StringValuePtr(str);
long n = NUM2LONG(num);
aco_save_T aco;
- if (n >= 0 && n <= buf->b_ml.ml_line_count && line != NULL)
+ if (line != NULL) {
+ rb_raise(rb_eIndexError, "NULL line");
+ }
+ else if (n >= 0 && n <= buf->b_ml.ml_line_count)
{
/* set curwin/curbuf for "buf" and save some things */
aucmd_prepbuf(&aco, buf);
update_curbuf(NOT_VALID);
}
else {
- rb_raise(rb_eIndexError, "index %d out of buffer", n);
+ rb_raise(rb_eIndexError, "line number %ld out of range", n);
}
return str;
}
win_T *win = get_win(self);
Check_Type(pos, T_ARRAY);
- if (RARRAY(pos)->len != 2)
+ if (RARRAY_LEN(pos) != 2)
rb_raise(rb_eArgError, "array length must be 2");
- lnum = RARRAY(pos)->ptr[0];
- col = RARRAY(pos)->ptr[1];
+ lnum = RARRAY_PTR(pos)[0];
+ col = RARRAY_PTR(pos)[1];
win->w_cursor.lnum = NUM2LONG(lnum);
win->w_cursor.col = NUM2UINT(col);
check_cursor(); /* put cursor on an existing line */
if (i > 0) rb_str_cat(str, ", ", 2);
rb_str_concat(str, rb_inspect(argv[i]));
}
- MSG(RSTRING(str)->ptr);
+ MSG(RSTRING_PTR(str));
return Qnil;
}