diff --git a/README.md b/README.md index d3733bb..d27629d 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,11 @@ https://github.com/katono/rogue.vim ## Requirements -rogue.vim requires Lua-enabled Vim. -Check `:echo has('lua')` returns 1 and `:echo luaeval('_VERSION')` returns `Lua 5.1` or later. +rogue.vim requires Lua-enabled Vim or neovim. +Please make sure that at least one of the following conditions is met. + +- `:echo has('lua')` returns 1 and `:echo luaeval('_VERSION')` returns `Lua 5.1` or later. +- `:echo has('nvim')` returns 1 and `:echo luaeval('_VERSION')` returns `Lua 5.1` or later. LuaJIT is recommended because that is very fast. diff --git a/autoload/rogue/curses.lua b/autoload/rogue/curses.lua index 442ca49..de2b4f2 100644 --- a/autoload/rogue/curses.lua +++ b/autoload/rogue/curses.lua @@ -75,7 +75,7 @@ end function g.refresh() if vim then - vim.command("normal gg") + g.vim_command("normal gg") end local update = false local done_redraw = false @@ -87,17 +87,17 @@ function g.refresh() row_str = dungeon_row(i):sub(1, dungeon_str_buffer[i].col) end if vim then - if i == g.DROWS-1 and vim.eval("&lines") == g.DROWS then + if i == g.DROWS-1 and g.vim_eval("&lines") == g.DROWS then row_str = row_str .. dungeon_str_buffer[i].str if g.update_flag or row_str ~= last_print_area then - vim.command("redraw") - print((vim.eval("has('gui_running')") ~= 0 and '' or ' ') .. row_str) - vim.command("redrawstatus") + g.vim_command("redraw") + print((g.vim_eval("has('gui_running')") ~= 0 and '' or ' ') .. row_str) + g.vim_command("redrawstatus") last_print_area = row_str done_redraw = true end else - if g.update_flag and i == 0 and vim.eval("&lines") > g.DROWS then + if g.update_flag and i == 0 and g.vim_eval("&lines") > g.DROWS then print(' ') end if dungeon_str_buffer[i].str ~= '' then @@ -111,7 +111,7 @@ function g.refresh() if g.update_flag or row_str ~= last_row_str[i] then local cmd_str cmd_str = 'call setline(' .. tostring(i + 1) .. ', "' .. row_str .. '")' - vim.command(cmd_str) + g.vim_command(cmd_str) last_row_str[i] = row_str update = true end @@ -124,6 +124,6 @@ function g.refresh() end g.update_flag = false if update and not done_redraw then - vim.command("redraw") + g.vim_command("redraw") end end diff --git a/autoload/rogue/debug.lua b/autoload/rogue/debug.lua index 2a2fae7..7db4d88 100644 --- a/autoload/rogue/debug.lua +++ b/autoload/rogue/debug.lua @@ -23,7 +23,7 @@ function g.msgbox(fmt, ...) if not g.DEBUG or not vim then return end - vim.eval("confirm('" .. string.format(fmt, ...) .. "')") + g.vim_eval("confirm('" .. string.format(fmt, ...) .. "')") end function g.log(fmt, ...) @@ -178,7 +178,7 @@ function g.breakpoint(log_flag) local level = 2 local prompt = '\n'..g.__FILE_LINE__(level)..'\n'..'Breakpoint: ' while true do - local input = vim.eval('input("'..prompt..'", "", "tag")') + local input = g.vim_eval('input("'..prompt..'", "", "tag")') if input == '' then break end diff --git a/autoload/rogue/init.lua b/autoload/rogue/init.lua index a4ffd4a..c51689d 100644 --- a/autoload/rogue/init.lua +++ b/autoload/rogue/init.lua @@ -29,7 +29,7 @@ local function set_nick_name() end local default_name = g.mesg[542] if vim then - g.nick_name = vim.eval('inputdialog("'..g.mesg[13]..' ", "'..default_name..'")') + g.nick_name = g.vim_eval('inputdialog("'..g.mesg[13]..' ", "'..default_name..'")') if g.nick_name == '' then g.nick_name = default_name end diff --git a/autoload/rogue/main.lua b/autoload/rogue/main.lua index 26de4ae..b408e9f 100644 --- a/autoload/rogue/main.lua +++ b/autoload/rogue/main.lua @@ -7,7 +7,7 @@ end Rogue = {} local g = Rogue -- alias -g.version = '1.0.2' +g.version = '1.0.3' -- Checks added global data is Rogue only local function check_global() @@ -38,9 +38,9 @@ local function init_dirs() g.game_dir = g.game_dir:gsub('\\', '/') g.game_dir = g.game_dir:gsub('~', g.home_dir) if vim then - local exists = vim.eval('isdirectory("' .. g.game_dir .. '")') + local exists = g.vim_eval('isdirectory("' .. g.game_dir .. '")') if exists == 0 then - vim.command('call mkdir("' .. g.game_dir .. '", "p")') + g.vim_command('call mkdir("' .. g.game_dir .. '", "p")') end end end @@ -118,11 +118,11 @@ local function read_mesg() local needs_iconv = g.get_vim_variable("s:needs_iconv") if needs_iconv ~= 0 then g.needs_iconv = true - vim.command('let &encoding = "utf-8"') + g.vim_command('let &encoding = "utf-8"') for k, v in pairs(g.mesg) do g.mesg[k] = g.iconv_from_utf8(v) end - vim.command('let &encoding = s:save_encoding') + g.vim_command('let &encoding = s:save_encoding') end end return true @@ -134,8 +134,8 @@ local function main() return end if vim then - if vim.eval("&columns") < g.DCOLS or vim.eval("&lines") < g.DROWS then - vim.eval('confirm("' .. g.mesg[14] .. '")') + if g.vim_eval("&columns") < g.DCOLS or g.vim_eval("&lines") < g.DROWS then + g.vim_eval('confirm("' .. g.mesg[14] .. '")') return end end diff --git a/autoload/rogue/mesg b/autoload/rogue/mesg index ab46ff6..14124b3 100644 --- a/autoload/rogue/mesg +++ b/autoload/rogue/mesg @@ -725,3 +725,7 @@ do_args() file: rogue.vim rogue#rogue#main 544 "ゲームが中断されています。再開しますか?" "The game is suspended. Resume it?" + +file: play.lua +doshell() +545 ":sh コマンドはサポートされていません" ":sh command is not supported" diff --git a/autoload/rogue/mesg_E b/autoload/rogue/mesg_E index 8532049..c072c32 100644 --- a/autoload/rogue/mesg_E +++ b/autoload/rogue/mesg_E @@ -724,3 +724,7 @@ do_args() file: rogue.vim rogue#rogue#main 544 "The game is suspended. Resume it?" "ゲームが中断されています。再開しますか?" + +file: play.lua +doshell() +545 ":sh command is not supported" ":sh コマンドはサポートされていません" diff --git a/autoload/rogue/message.lua b/autoload/rogue/message.lua index b8ca2a1..0860390 100644 --- a/autoload/rogue/message.lua +++ b/autoload/rogue/message.lua @@ -20,7 +20,7 @@ end function g.rgetchar() local n if vim then - n = vim.eval("getchar()") + n = g.vim_eval("getchar()") else os.execute("stty -echo cbreak") n = string.byte(io.stdin:read(1)) @@ -29,7 +29,7 @@ function g.rgetchar() local c = '' if type(n) == 'string' then if vim then - if n == vim.eval('"\\"') then + if n == g.vim_eval('"\\"') then c = 'BS' end end @@ -44,7 +44,7 @@ function g.rgetchar() end else if vim then - c = vim.eval("nr2char("..tostring(n)..")") + c = g.vim_eval("nr2char("..tostring(n)..")") elseif n <= 0x7E then c = string.char(n) end @@ -205,7 +205,5 @@ function g.clear_stats() end function g.sound_bell() - if vim then - vim.beep() - end + g.vim_beep() end diff --git a/autoload/rogue/play.lua b/autoload/rogue/play.lua index a7c5352..faeeda8 100644 --- a/autoload/rogue/play.lua +++ b/autoload/rogue/play.lua @@ -64,7 +64,12 @@ end local function doshell() if vim then - vim.command("sh") + if g.vim_eval("exists(':shell')") == 0 then + -- :shell command is removed in neovim. + g.message(g.mesg[545]) + else + g.vim_command("sh") + end end end diff --git a/autoload/rogue/rogue.vim b/autoload/rogue/rogue.vim index 165edf2..bcb4072 100644 --- a/autoload/rogue/rogue.vim +++ b/autoload/rogue/rogue.vim @@ -2,7 +2,7 @@ let s:FILE_DIR = fnamemodify(expand(""), ':h') . '/' let s:FILE_DIR = substitute(s:FILE_DIR, '\\', '/', 'g') function! rogue#rogue#main(args) - if !has('lua') + if !has('lua') && !(has('nvim') && exists('*luaeval') && luaeval('vim.api ~= nil')) echo "Sorry. Rogue.vim needs '+lua'." return endif diff --git a/autoload/rogue/save.lua b/autoload/rogue/save.lua index d0a9536..fadee1b 100644 --- a/autoload/rogue/save.lua +++ b/autoload/rogue/save.lua @@ -114,9 +114,9 @@ function g.restore(fname) end g.xxx(true) buf = g.xxxx(buf) - vim.command('let &encoding = "utf-8"') + g.vim_command('let &encoding = "utf-8"') buf = g.iconv_from_utf8(buf) - vim.command('let &encoding = s:save_encoding') + g.vim_command('let &encoding = s:save_encoding') local Rogue_copy = assert(g.loadstring('return ' .. buf), g.mesg[508])() if g.home_dir ~= Rogue_copy.home_dir then diff --git a/autoload/rogue/score.lua b/autoload/rogue/score.lua index 2bdc62d..b138dab 100644 --- a/autoload/rogue/score.lua +++ b/autoload/rogue/score.lua @@ -345,9 +345,9 @@ function g.put_scores(monster, other) local buf = fp:read("*a") g.xxx(true) buf = g.xxxx(buf) - vim.command('let &encoding = "utf-8"') + g.vim_command('let &encoding = "utf-8"') buf = g.iconv_from_utf8(buf) - vim.command('let &encoding = s:save_encoding') + g.vim_command('let &encoding = s:save_encoding') scores = assert(g.loadstring('return ' .. buf), g.mesg[199])() fp:close() end diff --git a/autoload/rogue/util.lua b/autoload/rogue/util.lua index bf8ec36..693e4a2 100644 --- a/autoload/rogue/util.lua +++ b/autoload/rogue/util.lua @@ -7,10 +7,41 @@ else g.loadstring = loadstring end +if vim.api then + function g.vim_beep() + vim.api.nvim_command('silent normal! ') + end + function g.vim_eval(var) + return vim.api.nvim_eval(var) + end + function g.vim_command(cmd) + return vim.api.nvim_command(cmd) + end +elseif vim then + function g.vim_beep() + vim.beep() + end + function g.vim_eval(var) + return vim.eval(var) + end + function g.vim_command(cmd) + return vim.command(cmd) + end +else + function g.vim_beep() + end + function g.vim_eval(var) + return nil + end + function g.vim_command(var) + return nil + end +end + function g.get_vim_variable(var) if vim then - if vim.eval("exists('" .. var .. "')") ~= 0 then - return vim.eval(var) + if g.vim_eval("exists('" .. var .. "')") ~= 0 then + return g.vim_eval(var) end end return '' @@ -49,9 +80,9 @@ end function g.set_vim_variable(var, value) if vim then if type(value) == 'number' then - vim.command('let ' .. var .. ' = ' .. tostring(value)) + g.vim_command('let ' .. var .. ' = ' .. tostring(value)) elseif type(value) == 'string' then - vim.command('let ' .. var .. ' = "' .. value .. '"') + g.vim_command('let ' .. var .. ' = "' .. value .. '"') end end end @@ -131,7 +162,7 @@ end function g.strwidth(s) local len if vim then - len = vim.eval('strwidth("' .. s .. '")') + len = g.vim_eval('strwidth("' .. s .. '")') else len = #s end @@ -141,7 +172,7 @@ end function g.getftime(fname) local t if vim then - t = vim.eval('getftime("' .. fname .. '")') + t = g.vim_eval('getftime("' .. fname .. '")') else t = -1 end @@ -169,7 +200,7 @@ end function g.msleep(n) if vim then - vim.command('sleep ' .. tostring(n) .. 'm') + g.vim_command('sleep ' .. tostring(n) .. 'm') end end @@ -198,7 +229,7 @@ end function g.iconv_from_utf8(str) if g.needs_iconv then str = str:gsub("'", "''") - str = vim.eval("iconv('" .. str .. "', 'utf-8', s:save_encoding)") + str = g.vim_eval("iconv('" .. str .. "', 'utf-8', s:save_encoding)") end return str end @@ -206,7 +237,7 @@ end function g.iconv_to_utf8(str) if g.needs_iconv then str = str:gsub("'", "''") - str = vim.eval("iconv('" .. str .. "', s:save_encoding, 'utf-8')") + str = g.vim_eval("iconv('" .. str .. "', s:save_encoding, 'utf-8')") end return str end diff --git a/doc/rogue.jax b/doc/rogue.jax index 9d32ef1..446157c 100644 --- a/doc/rogue.jax +++ b/doc/rogue.jax @@ -1,6 +1,6 @@ *rogue.txt* データ分離版ローグ・クローンIIの移植 -Version: 1.0.2 +Version: 1.0.3 Author: KATO Noriaki License: MIT License diff --git a/doc/rogue.txt b/doc/rogue.txt index ad476e4..5eefb25 100644 --- a/doc/rogue.txt +++ b/doc/rogue.txt @@ -1,6 +1,6 @@ *rogue.txt* Porting of Rogue-clone II for Vim -Version: 1.0.2 +Version: 1.0.3 Author: KATO Noriaki License: MIT License