1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-03-13 02:05:40 +08:00

Add lua system api & test (#4392)

This commit is contained in:
Wang Shidong 2021-08-14 09:30:57 +08:00 committed by GitHub
parent 3b455c1b7f
commit 66f3306acb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 263 additions and 20 deletions

View File

@ -49,7 +49,7 @@ jobs:
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install ninja-build gettext libtool libtool-bin autoconf automake cmake g++ pkg-config unzip curl
sudo apt-get install ninja-build gettext libtool libtool-bin autoconf automake cmake g++ pkg-config unzip curl lua5.2 liblua5.2-dev
- name: Install ${{ matrix.vimbin }} ${{ matrix.vimtag }}
run: |
.ci/install/linux.sh $VIM_BIN $VIM_TAG

View File

@ -40,7 +40,7 @@ function! s:name() abort
endif
endfunction
let s:system['name'] = s:name()
let s:system['name'] = function('s:name')
function! s:isDarwin() abort
if exists('s:is_darwin')

View File

@ -345,6 +345,17 @@ else
endif
" this function is only for test
function! s:self.luaeval(expr) abort
let rst = luaeval(a:expr)
if type(rst) ==# 5
return float2nr(rst)
else
return rst
endif
endfunction
function! SpaceVim#api#vim#compatible#get() abort
return deepcopy(s:self)

View File

@ -76,7 +76,12 @@ function! SpaceVim#default#options() abort
set backup
set undofile
set undolevels=1000
let g:data_dir = g:spacevim_data_dir.'/SpaceVim/'
" Neovim 0.5 changed the undofile format
if has('nvim-0.5.0')
let g:data_dir = g:spacevim_data_dir.'/SpaceVim/'
else
let g:data_dir = g:spacevim_data_dir.'/SpaceVim/old/'
endif
let g:backup_dir = g:data_dir . 'backup//'
let g:swap_dir = g:data_dir . 'swap//'
let g:undo_dir = g:data_dir . 'undofile//'

View File

@ -5,17 +5,55 @@ description: "system API provides some basic functions and values for current os
# [Available APIs](../) >> system
## values
<!-- vim-markdown-toc GFM -->
- [Intro](#intro)
- [Valuables](#valuables)
- [Functions](#functions)
- [Usage](#usage)
<!-- vim-markdown-toc -->
## Intro
The `system` provides basic functions for os detection.
## Valuables
| name | values | description |
| --------- | :----: | -------------------------- |
| isWindows | 0 or 1 | check if the os is windows |
| isLinux | 0 or 1 | check if the os is linux |
| isOSX | 0 or 1 | check if the os is OSX |
| isDarwin | 0 or 1 | check if the os is Darwin |
## functions
## Functions
| name | description |
| ---------- | -------------------------------------- |
| fileformat | return the icon of current file format |
| name | description |
| ------------ | ---------------------------------------- |
| fileformat() | return the icon of current file format |
| isDarwin() | return 0 or 1, check if the os is Darwin |
## Usage
This api can be used in both vim script and lua script.
**vim script:**
```vim
let s:system = SpaceVim#api#import('system')
" check the if current os is Windows.
if s:system.isWindows
echom "OS is Windows"
endif
```
**lua script:**
```lua
local sys = require('spacevim.api').import('system')
if sys.isWindows == 1 then
print('this is windows os!')
end
```

View File

@ -9,8 +9,9 @@ lang: zh
<!-- vim-markdown-toc GFM -->
- [简介](#简介)
- [values](#values)
- [functions](#functions)
- [变量](#变量)
- [函数](#函数)
- [基本使用](#基本使用)
<!-- vim-markdown-toc -->
@ -18,7 +19,7 @@ lang: zh
system 函数提供了系统相关函数,包括判断当前系统平台,文件格式等函数。
## values
## 变量
| names | values | descriptions |
| --------- | ------ | -------------------------- |
@ -27,8 +28,34 @@ system 函数提供了系统相关函数,包括判断当前系统平台,文
| isOSX | 0 or 1 | check if the os is OSX |
| isDarwin | 0 or 1 | check if the os is Darwin |
## functions
## 函数
| names | descriptions |
| ---------- | -------------------------------------- |
| fileformat | return the icon of current file format |
| name | description |
| ------------ | ---------------------------------------- |
| fileformat() | return the icon of current file format |
| isDarwin() | return 0 or 1, check if the os is Darwin |
## 基本使用
这一个函数接口提供了两种版本可供使用Vim 脚本 和 Lua 脚本:
**vim script:**
```vim
let s:system = SpaceVim#api#import('system')
" check the if current os is Windows.
if s:system.isWindows
echom "OS is Windows"
endif
```
**lua script:**
```lua
local sys = require('spacevim.api').import('system')
if sys.isWindows == 1 then
print('this is windows os!')
end
```

View File

@ -10,15 +10,67 @@ function M.bootstrap()
options.init()
layers.init()
end
function M.eval(l)
if vim['api'] ~= nil then
return vim.eval(l)
else
if vim.api ~= nil then
return vim.api.nvim_eval(l)
else
return vim.eval(l)
end
end
-- there is no want to call viml function in old vim and neovim
function M.call(funcname, ...)
if vim.call ~= nil then
return vim.call(funcname, ...)
else
if vim.api ~= nil then
return vim.api.nvim_call_function(funcname, {...})
else
end
end
end
-- this is for Vim and old neovim
M.fn = setmetatable({}, {
__index = function(t, key)
local _fn
if vim.api ~= nil and vim.api[key] ~= nil then
_fn = function()
error(string.format("Tried to call API function with vim.fn: use vim.api.%s instead", key))
end
else
_fn = function(...)
return M.call(key, ...)
end
end
t[key] = _fn
return _fn
end
})
-- This is for vim and old neovim to use vim.o
M.vim_options = setmetatable({}, {
__index = function(t, key)
local _fn
if vim.api ~= nil then
-- for neovim
return vim.api.nvim_get_option(key)
else
-- for vim
_fn = M.eval('&' .. key)
end
t[key] = _fn
return _fn
end
})
-- this function is only for vim
function M.has(feature)
return M.eval('float2nr(has("' .. feature .. '"))')
end
return M

View File

@ -0,0 +1,94 @@
local has = nil
local fn = nil
local vim_options = nil
if vim.o ~= nil then
vim_options = vim.o
else
vim_options = require('spacevim').vim_options
end
if vim.api == nil then
has = require('spacevim').has
else
if vim.fn ~= nil then
has = vim.fn.has
else
has = require('spacevim').has
end
end
if vim.fn == nil then
fn = require('spacevim').fn
else
fn = vim.fn
end
local M = {}
if has('win16') ==1 or has('win32') == 1 or has('win64') == 1 then
M.isWindows = 1
else
M.isWindows = 0
end
if has('unix') == 1 and has('macunix') == 0 and has('win32unix') == 0 then
M.isLinux = 1
else
M.isLinux = 0
end
M.isOSX = has('macunix')
function M.name()
if M.isLinux == 1 then
return 'linux'
elseif M.isWindows == 1 then
if has('win32unix') == 1 then
return 'cygwin'
else
return 'windows'
end
else
return 'mac'
end
end
local is_darwin = nil
function M.isDarwin()
if is_darwin ~= nil then
return is_darwin
end
if has('macunix') == 1 then
is_darwin = 1
return is_darwin
end
if has('unix') ~= 1 then
is_darwin = 0
return is_darwin
end
if fn.system('uname -s') == "Darwin\n" then
is_darwin = 1
else
is_darwin = 0
end
return is_darwin
end
function M.fileformat()
local fileformat = ''
if vim_options.fileformat == 'dos' then
fileformat = ''
elseif vim_options.fileformat == 'unix' then
if M.isDarwin() == 1 then
fileformat = ''
else
fileformat = ''
end
elseif vim_options.fileformat == 'mac' then
fileformat = ''
end
return fileformat
end
return M

16
test/lua/api/system.vader Normal file
View File

@ -0,0 +1,16 @@
Execute ( lua api system ):
let api_system = SpaceVim#api#import('system')
let cmp = SpaceVim#api#import('vim#compatible')
Log 'test system.isWindows'
AssertEqual cmp.luaeval('require("spacevim.api").import("system").isWindows'), api_system.isWindows
Log 'test system.isLinux'
AssertEqual cmp.luaeval('require("spacevim.api").import("system").isLinux'), api_system.isLinux
Log 'test system.isOSX'
AssertEqual cmp.luaeval('require("spacevim.api").import("system").isOSX'), api_system.isOSX
Log 'test system.name()'
AssertEqual cmp.luaeval('require("spacevim.api").import("system").name()'), api_system.name()
Log 'test system.isDarwin()'
AssertEqual cmp.luaeval('require("spacevim.api").import("system").isDarwin()'), api_system.isDarwin()
Log 'test system.fileformat()'
AssertEqual cmp.luaeval('require("spacevim.api").import("system").fileformat()'), api_system.fileformat()
unlet api_system