From 992584d8b8c93c05af982f734286afec9dc6ae41 Mon Sep 17 00:00:00 2001 From: Wang Shidong Date: Mon, 31 Dec 2018 09:09:35 -0600 Subject: [PATCH] Improve runner plugin (#2397) --- autoload/SpaceVim.vim | 12 +++++ autoload/SpaceVim/api/vim/statusline.vim | 2 +- autoload/SpaceVim/plugins/runner.vim | 68 ++++++++++++++++++++++-- doc/SpaceVim.txt | 36 ++++++++----- docs/cn/documentation.md | 23 ++++++++ docs/documentation.md | 24 +++++++++ 6 files changed, 147 insertions(+), 18 deletions(-) diff --git a/autoload/SpaceVim.vim b/autoload/SpaceVim.vim index 69cd46732..b109027cd 100644 --- a/autoload/SpaceVim.vim +++ b/autoload/SpaceVim.vim @@ -331,6 +331,18 @@ let g:spacevim_statusline_inactive_separator = 'arrow' " Enable/Disable showing full path of current buffer on statusline let g:spacevim_enable_statusline_bfpath = 0 +"" +" @section enable_statusline_tag, options-enable_statusline_tag +" @parentsection options +" Enable/Disable showing current tag on statusline +" > +" enable_statusline_tag = false +" < + +"" +" Enable/Disable showing current tag on statusline +let g:spacevim_enable_statusline_tag = 1 + "" " Define the left section of statusline in active windows. By default: " > diff --git a/autoload/SpaceVim/api/vim/statusline.vim b/autoload/SpaceVim/api/vim/statusline.vim index 13e4ba2c0..e2d69917f 100644 --- a/autoload/SpaceVim/api/vim/statusline.vim +++ b/autoload/SpaceVim/api/vim/statusline.vim @@ -66,7 +66,7 @@ function! s:self.build(left_sections, right_sections, lsep, rsep, fname, tag, hi let l .= '%#' . a:hi_b . '_' . a:hi_z . '#' . a:lsep . '%=' endif endif - if self.check_width(len, a:tag, a:winwidth) + if self.check_width(len, a:tag, a:winwidth) && g:spacevim_enable_statusline_tag let l .= '%#' . a:hi_z . '#' . a:tag endif let l .= '%#' . a:hi_b . '_' . a:hi_z . '#' . a:rsep diff --git a/autoload/SpaceVim/plugins/runner.vim b/autoload/SpaceVim/plugins/runner.vim index e79d17b91..4154f206b 100644 --- a/autoload/SpaceVim/plugins/runner.vim +++ b/autoload/SpaceVim/plugins/runner.vim @@ -22,7 +22,15 @@ function! s:open_win() abort botright split __runner__ let lines = &lines * 30 / 100 exe 'resize ' . lines - setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline nospell nonu norelativenumber + setlocal buftype=nofile bufhidden=wipe nobuflisted nolist + \ noswapfile + \ nowrap + \ cursorline + \ nospell + \ nonu + \ norelativenumber + \ winfixheight + \ nomodifiable set filetype=SpaceVimRunner nnoremap q :call SpaceVim#plugins#runner#close() let s:bufnr = bufnr('%') @@ -34,10 +42,11 @@ let s:target = '' function! s:async_run(runner) abort if type(a:runner) == type('') try - let cmd = printf(a:runner, bufname('%')) + let cmd = printf(a:runner, get(s:, 'selected_file', bufname('%'))) catch let cmd = a:runner endtry + call SpaceVim#logger#info(' cmd:' . string(cmd)) call s:BUFFER.buf_set_lines(s:bufnr, s:lines , s:lines + 3, 0, ['[Running] ' . cmd, '', repeat('-', 20)]) let s:lines += 3 let s:start_time = reltime() @@ -63,7 +72,8 @@ function! s:async_run(runner) abort \ }) elseif type(a:runner) == type({}) let exe = call(a:runner.exe, []) - let cmd = exe + a:runner.opt + [bufname('%')] + let cmd = exe + a:runner.opt + [get(s:, 'selected_file', bufname('%'))] + call SpaceVim#logger#info(' cmd:' . string(cmd)) call s:BUFFER.buf_set_lines(s:bufnr, s:lines , s:lines + 3, 0, ['[Running] ' . join(cmd), '', repeat('-', 20)]) let s:lines += 3 let s:start_time = reltime() @@ -104,9 +114,14 @@ endfunction function! SpaceVim#plugins#runner#reg_runner(ft, runner) abort let s:runners[a:ft] = a:runner + let desc = '[' . a:ft . '] ' . string(a:runner) + let cmd = "call SpaceVim#plugins#runner#set_language('" . a:ft . "')" + call add(g:unite_source_menu_menus.RunnerLanguage.command_candidates, [desc,cmd]) endfunction -function! SpaceVim#plugins#runner#open() abort +" this func should support specific a runner +" the runner can be a string +function! SpaceVim#plugins#runner#open(...) abort let s:lines = 0 let s:status = { \ 'is_running' : 0, @@ -114,7 +129,8 @@ function! SpaceVim#plugins#runner#open() abort \ 'has_errors' : 0, \ 'exit_code' : 0 \ } - let runner = get(s:runners, &filetype, '') + let s:selected_language = get(s:, 'selected_language', &filetype) + let runner = get(a:000, 0, get(s:runners, empty(s:selected_language) ? &filetype : s:selected_language , '')) if !empty(runner) call s:open_win() call s:async_run(runner) @@ -199,6 +215,7 @@ function! SpaceVim#plugins#runner#status() abort elseif s:status.is_exit == 1 return 'exit code : ' . s:status.exit_code \ . ' time: ' . s:STRING.trim(reltimestr(s:end_time)) + \ . ' language: ' . get(s:, 'selected_language', &ft) endif return '' endfunction @@ -209,3 +226,44 @@ function! SpaceVim#plugins#runner#close() abort endif exe 'bd ' s:bufnr endfunction + +function! SpaceVim#plugins#runner#select_file() abort + let s:lines = 0 + let s:status = { + \ 'is_running' : 0, + \ 'is_exit' : 0, + \ 'has_errors' : 0, + \ 'exit_code' : 0 + \ } + let s:selected_file = browse(0,'select a file to run', getcwd(), '') + let runner = get(a:000, 0, get(s:runners, &filetype, '')) + let s:selected_language = &filetype + if !empty(runner) + call SpaceVim#logger#info('Code runner startting:') + call SpaceVim#logger#info('selected file :' . s:selected_file) + call s:open_win() + call s:async_run(runner) + call s:update_statusline() + endif +endfunction + +let g:unite_source_menu_menus = + \ get(g:,'unite_source_menu_menus',{}) +let g:unite_source_menu_menus.RunnerLanguage = {'description': + \ 'Custom mapped keyboard shortcuts [SPC] p p'} +let g:unite_source_menu_menus.RunnerLanguage.command_candidates = + \ get(g:unite_source_menu_menus.RunnerLanguage,'command_candidates', []) + +function! SpaceVim#plugins#runner#select_language() + " @todo use denite or unite to select language + " and set the s:selected_language + " the all language is keys(s:runners) + Denite menu:RunnerLanguage +endfunction + +function! SpaceVim#plugins#runner#set_language(lang) + " @todo use denite or unite to select language + " and set the s:selected_language + " the all language is keys(s:runners) + let s:selected_language = a:lang +endfunction diff --git a/doc/SpaceVim.txt b/doc/SpaceVim.txt index da704d6f7..5cb8f5869 100644 --- a/doc/SpaceVim.txt +++ b/doc/SpaceVim.txt @@ -26,18 +26,19 @@ CONTENTS *SpaceVim-contents* 6. enable_insert_leader..........|SpaceVim-options-enable_insert_leader| 7. enable_neomake......................|SpaceVim-options-enable_neomake| 8. enable_statusline_mode......|SpaceVim-options-enable_statusline_mode| - 9. enable_ycm..............................|SpaceVim-options-enable_ycm| - 10. error_symbol.........................|SpaceVim-options-error_symbol| - 11. guifont...................................|SpaceVim-options-guifont| - 12. lint_on_the_fly...................|SpaceVim-options-lint_on_the_fly| - 13. max_column.............................|SpaceVim-options-max_column| - 14. plugin_bundle_dir...............|SpaceVim-options-plugin_bundle_dir| - 15. plugin_manager_processes.|SpaceVim-options-plugin_manager_processes| - 16. realtime_leader_guide.......|SpaceVim-options-realtime_leader_guide| - 17. relativenumber.....................|SpaceVim-options-relativenumber| - 18. sidebar_width.......................|SpaceVim-options-sidebar_width| - 19. snippet_engine.....................|SpaceVim-options-snippet_engine| - 20. windows_leader.....................|SpaceVim-options-windows_leader| + 9. enable_statusline_tag........|SpaceVim-options-enable_statusline_tag| + 10. enable_ycm.............................|SpaceVim-options-enable_ycm| + 11. error_symbol.........................|SpaceVim-options-error_symbol| + 12. guifont...................................|SpaceVim-options-guifont| + 13. lint_on_the_fly...................|SpaceVim-options-lint_on_the_fly| + 14. max_column.............................|SpaceVim-options-max_column| + 15. plugin_bundle_dir...............|SpaceVim-options-plugin_bundle_dir| + 16. plugin_manager_processes.|SpaceVim-options-plugin_manager_processes| + 17. realtime_leader_guide.......|SpaceVim-options-realtime_leader_guide| + 18. relativenumber.....................|SpaceVim-options-relativenumber| + 19. sidebar_width.......................|SpaceVim-options-sidebar_width| + 20. snippet_engine.....................|SpaceVim-options-snippet_engine| + 21. windows_leader.....................|SpaceVim-options-windows_leader| 3. Configuration...........................................|SpaceVim-config| 4. Commands..............................................|SpaceVim-commands| 5. Functions............................................|SpaceVim-functions| @@ -179,6 +180,14 @@ statusline. To enable this feature: enable_statusline_mode = true < +============================================================================== +ENABLE_STATUSLINE_TAG *SpaceVim-options-enable_statusline_tag* + +Enable/Disable showing current tag on statusline +> + enable_statusline_tag = false +< + ============================================================================== ENABLE_YCM *SpaceVim-options-enable_ycm* @@ -418,6 +427,9 @@ See more details in: http://spacevim.org/documentation/#statusline *g:spacevim_enable_statusline_bfpath* Enable/Disable showing full path of current buffer on statusline + *g:spacevim_enable_statusline_tag* +Enable/Disable showing current tag on statusline + *g:spacevim_statusline_left_sections* Define the left section of statusline in active windows. By default: > diff --git a/docs/cn/documentation.md b/docs/cn/documentation.md index f6ced7af8..1678932fc 100644 --- a/docs/cn/documentation.md +++ b/docs/cn/documentation.md @@ -87,6 +87,7 @@ lang: cn - [Examples](#examples) - [注释(Commentings)](#注释commentings) - [多方式编码](#多方式编码) + - [异步运行器和交互式编程](#异步运行器和交互式编程) - [错误处理](#错误处理) - [工程管理](#工程管理) - [Searching files in project](#searching-files-in-project) @@ -1696,6 +1697,28 @@ set enc=utf-8 write ``` +### 异步运行器和交互式编程 + +SpaceVim 提供了一个异步执行命令和交互式编程的插件, +在大多数语言模块中,已经为该语言定义了默认的执行命令,通常快捷键为`SPC l r`。 +如果需要添加额外的命令,可以使用启动函数。比如:添加使用 F5 按键异步编译当前项目。 + +```viml +nnoremap :call SpaceVim#plugins#runner#open('make') +``` + +目前,SpaceVim 支持如下特性: + +- 使用默认命令一键运行当前文件 +- 使用系统文件管理器选择文件并执行 +- 根据文件顶部标识,选择合适解析器 +- 中断代码运行 +- 底部窗口异步展示运行结果 +- 设置默认的运行语言 +- 选择指定语言来运行 +- 支持交互式编程 +- 运行选择的代码片段 + ### 错误处理 SpaceVim 通过 [neomake](https://github.com/neomake/neomake) fly 工具来进行错误反馈. 默认在操作保存时进行错误检查. diff --git a/docs/documentation.md b/docs/documentation.md index ef7bb0ba5..1a3994e04 100644 --- a/docs/documentation.md +++ b/docs/documentation.md @@ -85,6 +85,7 @@ description: "General documentation about how to using SpaceVim, including the q - [Examples](#examples) - [Commenting](#commenting) - [Multi-Encodings](#multi-encodings) + - [Code runner and REPL](#code-runner-and-repl) - [Errors handling](#errors-handling) - [Managing projects](#managing-projects) - [Searching files in project](#searching-files-in-project) @@ -1738,6 +1739,29 @@ set enc=utf-8 write ``` +### Code runner and REPL + +SpaceVim provides an asynchronously code runner plugin. In most language layer, +we have defind a key bidning `SPC l r` for running current +buffer. If you need to add new command, you can use bootstrap func. for example: +use `F5` to build project asynchronously. + +```viml +nnoremap :call SpaceVim#plugins#runner#open('make') +``` + +These following features have been added to runner and repl plugin: + +- Run current file with default command +- Run code file through system file explorer, only supported in gvim. +- Run code per Shebang +- Stop code running +- View output in Output Window +- Set default language to run +- Select language to run +- REPL support +- Run selected code snippet + ### Errors handling SpaceVim uses [neomake](https://github.com/neomake/neomake) to gives error feedback on the fly.