From 829094c1ea2a87269cbb1996580162be48fef3b3 Mon Sep 17 00:00:00 2001 From: Wang Shidong Date: Sat, 16 May 2020 14:02:51 +0800 Subject: [PATCH] Improve tools#mpv layer (#3534) --- autoload/SpaceVim/layers/tools/mpv.vim | 80 +++++++++++++++++++++----- docs/cn/layers.md | 4 ++ docs/cn/layers/tools/mpv.md | 53 +++++++++++++++++ docs/layers.md | 4 +- docs/layers/tools/mpv.md | 51 ++++++++++++++++ 5 files changed, 178 insertions(+), 14 deletions(-) create mode 100644 docs/cn/layers/tools/mpv.md create mode 100644 docs/layers/tools/mpv.md diff --git a/autoload/SpaceVim/layers/tools/mpv.vim b/autoload/SpaceVim/layers/tools/mpv.vim index ed383af99..f414a2368 100644 --- a/autoload/SpaceVim/layers/tools/mpv.vim +++ b/autoload/SpaceVim/layers/tools/mpv.vim @@ -6,16 +6,53 @@ " License: GPLv3 "============================================================================= +if exists('s:musics_directory') + finish +else + let s:musics_directory = '~/Musics' + let s:mpv_interpreter = 'mpv' + let s:loop_mode = 'random' + let s:stop_mpv = 0 +endif let s:JOB = SpaceVim#api#import('job') +let s:NUM = SpaceVim#api#import('data#number') function! SpaceVim#layers#tools#mpv#config() abort - + call s:load_musics() + let g:_spacevim_mappings_space.m.m = {'name' : '+mpv'} + call SpaceVim#mapping#space#def('nnoremap', ['m', 'm', 'l'], 'Leaderf menu --name MpvPlayer', 'fuzzy-find-musics', 1) + call SpaceVim#mapping#space#def('nnoremap', ['m', 'm', 'l'], 'Leaderf menu --name MpvPlayer', 'fuzzy-find-musics', 1) + call SpaceVim#mapping#space#def('nnoremap', ['m', 'm', 'n'], 'call call(' + \ . string(s:_function('s:next')) . ', [])', + \ 'next-music', 1) + call SpaceVim#mapping#space#def('nnoremap', ['m', 'm', 's'], 'call call(' + \ . string(s:_function('s:stop')) . ', [])', + \ 'stop-mpv', 1) endfunction -function! SpaceVim#layers#tools#mpv#loadMusics() abort - let musics = SpaceVim#util#globpath('~/Musics', '*.mp3') +function! SpaceVim#layers#tools#mpv#set_variable(var) abort + let s:musics_directory = get(a:var, 'musics_directory', 1) + let s:mpv_interpreter = get(a:var, 'mpv_interpreter', 1) +endfunction + +function! SpaceVim#layers#tools#mpv#play(fpath) + let s:stop_mpv = 0 + if s:playId != 0 + call s:JOB.stop(s:playId) + let s:playId = 0 + endif + let s:playId = s:JOB.start([s:mpv_interpreter,'--vid=no',a:fpath],{ + \ 'on_stdout': function('s:handler'), + \ 'on_stderr': function('s:handler'), + \ 'on_exit': function('s:handler'), + \ }) + command! MStop call s:stop() +endfunction + +function! s:load_musics() abort + let musics = SpaceVim#util#globpath(s:musics_directory, '*.mp3') let g:unite_source_menu_menus.MpvPlayer.command_candidates = [] for m in musics call add(g:unite_source_menu_menus.MpvPlayer.command_candidates, @@ -28,26 +65,43 @@ endfunction let s:playId = 0 fu! s:handler(id, data, event) abort if a:event ==# 'exit' - echom 'job ' . a:id . ' exit with code:' . string(a:data) - let s:playId = 0 + if s:loop_mode ==# 'random' && !s:stop_mpv + let next = s:NUM.random(0, len(g:unite_source_menu_menus.MpvPlayer.command_candidates)) + echohl TODO + echo 'playing:' . g:unite_source_menu_menus.MpvPlayer.command_candidates[next][0] + echohl NONE + exe g:unite_source_menu_menus.MpvPlayer.command_candidates[next][1] + endif endif endf function! s:stop() abort if s:playId != 0 - call jobstop(s:playId) + call s:JOB.stop(s:playId) let s:playId = 0 endif delcommand MStop + let s:stop_mpv = 1 endfunction -function! s:play(file,...) abort + +function! s:next() abort if s:playId != 0 call s:JOB.stop(s:playId) let s:playId = 0 endif - let s:playId = s:JOB.start(['mpv','--vid=no',a:file],{ - \ 'on_stdout': function('s:handler'), - \ 'on_stderr': function('s:handler'), - \ 'on_exit': function('s:handler'), - \ }) - command! MStop call zvim#mpv#stop() endfunction + + +" function() wrapper +if v:version > 703 || v:version == 703 && has('patch1170') + function! s:_function(fstr) abort + return function(a:fstr) + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + let s:_s = '' . s:_SID() . '_' + function! s:_function(fstr) abort + return function(substitute(a:fstr, 's:', s:_s, 'g')) + endfunction +endif diff --git a/docs/cn/layers.md b/docs/cn/layers.md index e7c674ff0..4db72956e 100644 --- a/docs/cn/layers.md +++ b/docs/cn/layers.md @@ -76,6 +76,7 @@ Vim 插件以及相关配置。而 SpaceVim 是以模块的方式来组织和管 | [denite](denite/) | 这一模块为 SpaceVim 提供了以 denite 为核心的异步模糊查找机制,支持模糊搜索文件、历史记录、函数列表等。 | | [edit](edit/) | 这一模块为 SpaceVim 提供了更好的文本编辑体验,提供更多种文本对象。 | | [floobits](floobits/) | 这一模块为 SpaceVim 提供了 floobits 协作工具的支持,实现多人协作编辑等功能。 | +| [foldsearch](foldsearch/) | 这一模块为 SpaceVim 提供了 foldsearch 支持,实现的异步搜索折叠的功能。 | | [format](format/) | 这一模块为 SpaceVim 提供了代码异步格式化功能,支持高度自定义配置和多种语言。 | | [fzf](fzf/) | 这一模块为 SpaceVim 提供了以 fzf 为核心的异步模糊查找机制,支持模糊搜索文件、历史记录、函数列表等。 | | [git](git/) | 这一模块为 SpaceVim 提供了 Git 支持,根据当前 Vim 版本特性,选择 gina 或者 gita 作为默认的后台 Git 插件。 | @@ -83,6 +84,7 @@ Vim 插件以及相关配置。而 SpaceVim 是以模块的方式来组织和管 | [gtags](gtags/) | 这一模块为 SpaceVim 提供了全局的 gtags 索引管理,提供快速检索定义和引用的功能。 | | [japanese](japanese/) | 这一模块为 SpaceVim 的日文用户提供了日文的 Vim 帮助文档,同时提供部分插件的日文帮助文档。 | | [lang#WebAssembly](lang/WebAssembly/) | 这一模块为 SpaceVim 提供了 WebAssembly 的开发支持。 | +| [lang#actionscript](lang/actionscript/) | 这一模块为 actionscript 提供语法高亮 | | [lang#agda](lang/agda/) | 这一模块为 SpaceVim 提供了 Agda 的开发支持,主要包括语法高亮及一键运行。 | | [lang#asciidoc](lang/asciidoc/) | 这一模块为 SpaceVim 提供了 AsciiDoc 的编辑支持,包括格式化、自动生成文章目录、代码块等特性。 | | [lang#aspectj](lang/aspectj/) | 这一模块为 SpaceVim 提供了 AsepctJ 的编辑支持,包括代码高亮。 | @@ -92,6 +94,7 @@ Vim 插件以及相关配置。而 SpaceVim 是以模块的方式来组织和管 | [lang#c](lang/c/) | 这一模块为 SpaceVim 提供了 C/C++/Object-C 的开发支持,包括代码补全、语法检查等特性。 | | [lang#chapel](lang/chapel/) | 这一模块为 chapel 开发提供支持,包括交互式编程、一键运行等特性。 | | [lang#clojure](lang/clojure/) | 这一模块为 SpaceVim 提供了 Clojure 的开发支持,包括代码补全、语法检查、代码格式化等特性。 | +| [lang#coffeescript](lang/coffeescript/) | 这一模块为 CoffeeScript 开发提供支持,包括交互式编程、一键运行等特性。 | | [lang#crystal](lang/crystal/) | 这一模块为 crystal 开发提供支持,包括交互式编程、一键运行等特性。 | | [lang#csharp](lang/csharp/) | 这一模块为 SpaceVim 提供了 CSharp 的开发支持,包括代码高亮、对齐、补全等特性。 | | [lang#d](lang/d/) | 这一模块为 d 开发提供支持,包括语法高亮、自动补全、一键运行等特性。 | @@ -166,6 +169,7 @@ Vim 插件以及相关配置。而 SpaceVim 是以模块的方式来组织和管 | [test](test/) | 这一模块为 SpaceVim 提供了一个测试框架,支持快速运行多种语言的单元测试。 | | [tmux](tmux/) | 这一模块为 SpaceVim 提供了一些在 Vim 内操作 tmux 的功能,使得在 tmux 窗口之间跳转更加便捷。 | | [tools#dash](tools/dash/) | 这一模块为 SpaceVim 提供了 Dash 支持,可快速查找光标位置的单词。 | +| [tools#mpv](tools/mpv/) | 这一模块为 SpaceVim 提供了 mpv 支持,可快速查找光标位置的单词。 | | [tools](tools/) | 这一模块为 SpaceVim 提供了多种常用工具,包括日历、计算器等多种工具类插件,并针对 Vim8 以及 Neovim 提供了更好的插件选择。 | | [ui](ui/) | 这一模块为 SpaceVim 提供了 IDE-like 的界面,包括状态栏、文件树、语法树等等特性。 | | [unite](unite/) | 这一模块为 SpaceVim 提供以 Unite 为核心的模糊查找机制,支持模糊搜索文件、历史纪录、函数列表等。 | diff --git a/docs/cn/layers/tools/mpv.md b/docs/cn/layers/tools/mpv.md new file mode 100644 index 000000000..0d2ac0c8f --- /dev/null +++ b/docs/cn/layers/tools/mpv.md @@ -0,0 +1,53 @@ +--- +title: "SpaceVim tools#mpv 模块" +description: "这一模块为 SpaceVim 提供了mpv支持,可快速查找光标位置的单词。" +lang: zh +--- + +# [可用模块](../) >> tools#mpv + + + +- [模块描述](#模块描述) +- [启用模块](#启用模块) +- [模块选项](#模块选项) +- [快捷键](#快捷键) + + + +## 模块描述 + +该模块为 SpaceVim 提供了 mpv 集成。 + +## 启用模块 + +tools#mpv 模块默认并未启用,如果需要启用该模块,需要在配置文件里面加入: + +```toml +[[layers]] + name = "tools#mpv" +``` + +## 模块选项 + +- `musics_directory`: 设置音乐存放文件夹 +- `mpv_interpreter`: mpv 可执行命令路径 +- `loop_mode`: 循环模式,默认是 `random` + +example: + +```toml +[[layers]] + name = 'tools#mpv' + mpv_interpreter = 'D:\Program Files\mpv\mpv.exe' + musics_directory = 'F:\other\musics' +``` + + +## 快捷键 + +| 快捷键 | 功能描述 | +| ----------- | ---------------- | +| `SPC m m l` | 模糊搜索音乐列表 | +| `SPC m m n` | 下一首 | +| `SPC m m s` | 停止播放 | diff --git a/docs/layers.md b/docs/layers.md index 238fd5692..bc2cd3c3b 100644 --- a/docs/layers.md +++ b/docs/layers.md @@ -83,7 +83,7 @@ Some layers are enabled by default. The following example shows how to disable ` | [denite](denite/) | This layers provide a heavily customized Denite centric work-flow | | [edit](edit/) | Improve code edit expr in SpaceVim, provide more text opjects. | | [floobits](floobits/) | This layer adds support for the peer programming tool floobits to SpaceVim. | -| [foldsearch](foldsearch/) | This layer provides functions that fold away lines that don't match a specific search pattern.| +| [foldsearch](foldsearch/) | This layer provides functions that fold away lines that don't match a specific search pattern. | | [format](format/) | Code formatting support for SpaceVim | | [fzf](fzf/) | This layers provide a heavily customized fzf centric work-flow | | [git](git/) | This layers adds extensive support for git | @@ -91,6 +91,7 @@ Some layers are enabled by default. The following example shows how to disable ` | [gtags](gtags/) | This layer provide gtags manager for project | | [japanese](japanese/) | Layer for japanese users, include japanese docs and runtime messages | | [lang#WebAssembly](lang/WebAssembly/) | This layer adds WebAssembly support to SpaceVim | +| [lang#actionscript](lang/actionscript/) | This layer is for actionscript syntax highlighting | | [lang#agda](lang/agda/) | This layer adds Agda language support to SpaceVim. | | [lang#asciidoc](lang/asciidoc/) | Edit AsciiDoc within vim, autopreview AsciiDoc in the default browser, with this layer you can also format AsciiDoc file. | | [lang#aspectj](lang/aspectj/) | AsepctJ language support, include syntax highlighting. | @@ -178,6 +179,7 @@ Some layers are enabled by default. The following example shows how to disable ` | [test](test/) | This layer allows to run tests directly on SpaceVim | | [tmux](tmux/) | This layers adds extensive support for tmux | | [tools#dash](tools/dash/) | This layer provides Dash integration for SpaceVim | +| [tools#mpv](tools/mpv/) | This layer provides mpv integration for SpaceVim | | [tools#zeal](tools/zeal/) | This layer provides Zeal integration for SpaceVim | | [tools](tools/) | This layer provides some tools for vim | | [ui](ui/) | Awesome UI layer for SpaceVim, provide IDE-like UI for neovim and vim in both TUI and GUI | diff --git a/docs/layers/tools/mpv.md b/docs/layers/tools/mpv.md new file mode 100644 index 000000000..abb2c3304 --- /dev/null +++ b/docs/layers/tools/mpv.md @@ -0,0 +1,51 @@ +--- +title: "SpaceVim tools#mpv layer" +description: "This layer provides mpv integration for SpaceVim" +--- + +# [SpaceVim Layers:](https://spacevim.org/layers) tools#mpv + + + +- [Description](#description) +- [Install](#install) +- [Options](#options) +- [Key bindings](#key-bindings) + + + +## Description + +This layer provides mpv integration for SpaceVim. + +## Install + +To use this configuration layer, add it to your `~/.SpaceVim.d/init.toml`. + +```toml +[[layers]] + name = "tools#mpv" +``` + +## Options + +- `musics_directory`: the directory of musics +- `mpv_interpreter`: mpv executable path +- `loop_mode`: loop mode, default is `random` + +example: + +```toml +[[layers]] + name = 'tools#mpv' + mpv_interpreter = 'D:\Program Files\mpv\mpv.exe' + musics_directory = 'F:\other\musics' +``` + +## Key bindings + +| Key Binding | Description | +| ----------- | ----------------- | +| `SPC m m l` | fuzzy find musics | +| `SPC m m n` | next musics | +| `SPC m m s` | stop mpv |