From 6f180c243fb274c498fd9809cfc7ab58ee527828 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 6 Jul 2023 20:54:13 +0800 Subject: [PATCH] feat(ctags): implement ctags#update in lua --- bundle/gtags.vim/autoload/ctags.vim | 8 ++- bundle/gtags.vim/lua/ctags/init.lua | 107 ++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 bundle/gtags.vim/lua/ctags/init.lua diff --git a/bundle/gtags.vim/autoload/ctags.vim b/bundle/gtags.vim/autoload/ctags.vim index d955d6dee..5c665d5a9 100644 --- a/bundle/gtags.vim/autoload/ctags.vim +++ b/bundle/gtags.vim/autoload/ctags.vim @@ -11,6 +11,13 @@ scriptencoding utf-8 if exists('g:loaded_ctags') finish endif +let g:loaded_ctags = 1 +if has('nvim-0.7.0') + function! ctags#update(...) abort + lua require('ctags').update() + endfunction + finish +endif let s:LOGGER =SpaceVim#logger#derive('ctags') @@ -27,7 +34,6 @@ endif let s:JOB = SpaceVim#api#import('job') let s:FILE = SpaceVim#api#import('file') -let g:loaded_ctags = 1 let s:is_u_ctags = 0 let s:version_checked = 0 diff --git a/bundle/gtags.vim/lua/ctags/init.lua b/bundle/gtags.vim/lua/ctags/init.lua new file mode 100644 index 000000000..78f76a7dc --- /dev/null +++ b/bundle/gtags.vim/lua/ctags/init.lua @@ -0,0 +1,107 @@ +--============================================================================= +-- init.lua --- ctags plugin +-- Copyright (c) 2016-2023 Wang Shidong & Contributors +-- Author: Wang Shidong < wsdjeg@outlook.com > +-- URL: https://spacevim.org +-- License: GPLv3 +--============================================================================= + +local M = {} + +local log = require('spacevim.logger').derive('ctags') +local job = require('spacevim.api.job') +local f = require('spacevim.api.file') + +local version_checked = false +local gtags_ctags_bin = 'ctags' +local is_u_ctags = false + +local function version_std_out(id, data, event) -- {{{ + for _, line in ipairs(data) do + if vim.startswith(line, 'Universal Ctags') then + is_u_ctags = true + break + end + end +end +-- }}} + +local function version_exit(id, code, singin) -- {{{ + if code == 0 and singin == 0 then + version_checked = true + log.info('ctags version checking done:') + log.info(' ctags bin:' .. gtags_ctags_bin) + M.update() + end +end +-- }}} + +local function on_update_exit(id, code, single) -- {{{ + if code == 0 and single == 0 then + log.info('ctags database updated successfully') + else + log.warn('failed to update ctags database, exit code:' .. code .. ' single:' .. single) + end +end +-- }}} +local function on_update_stdout(id, data, event) -- {{{ + for _, d in ipairs(data) do + log.debug('stdout:' .. d) + end +end +-- }}} + +local function on_update_stderr(id, data, event) -- {{{ + for _, d in ipairs(data) do + log.debug('stderr:' .. d) + end +end +-- }}} + +local function extend(t1, t2) -- {{{ + for _, v in ipairs(t2) do + table.insert(t1, v) + end +end +-- }}} +function M.update() -- {{{ + gtags_ctags_bin = vim.g.gtags_ctags_bin or gtags_ctags_bin + local project_root = vim.fn.getcwd() + if not version_checked then + log.info('start to check ctags version') + job.start({ gtags_ctags_bin, '--version' }, { + on_stdout = version_std_out, + on_exit = version_exit, + }) + return + else + log.info('update ctags database for ' .. project_root) + end + local dir = f.unify_path(vim.g.tags_cache_dir) .. f.path_to_fname(project_root) + local cmd = { gtags_ctags_bin } + if is_u_ctags then + table.insert(cmd, '-G') + end + if vim.fn.isdirectory(dir) == 0 then + if vim.fn.mkdir(dir, 'p') == 0 then + log.warn('failed to create database dir:' .. dir) + return + end + end + + if vim.fn.isdirectory(dir) == 1 then + extend(cmd, { '-R', '--extra=+f', '-o', dir .. '/tags', project_root }) + log.debug('ctags command:' .. vim.inspect(cmd)) + local jobid = job.start(cmd, { + on_stdout = on_update_stdout, + on_stderr = on_update_stderr, + on_exit = on_update_exit, + }) + if jobid <= 0 then + log.debug('failed to start ctags job, return jobid:' .. jobid) + end + end +end +-- }}} + +return M