Difference between revisions of "How to use Vifm as your music player"

From Vifm Wiki
Jump to navigation Jump to search
m
Line 2: Line 2:
 
Simply copy and paste this into your vifmrc:
 
Simply copy and paste this into your vifmrc:
  
{{NOTE|text=As of this edit you should have the most recent version of mpc compiled from github.}}
+
{{NOTE|text=You need [https://github.com/junegunn/fzf fzf] for this}}
 +
{{NOTE|text=You should also have the most recent version of mpc compiled from github.}}
  
You ''can'' use older versions and still get 99% of the functionality, but certain mappings will have to be adjusted for displaying the current status.
+
You '''can''' use older versions of mpc and still get 99% of the functionality, but certain mappings will have to be adjusted for displaying the current status.
 +
Make you that you set the shell variables at the beginning here to their appropriate locations on the harddrive.
  
 
<source lang="vim">
 
<source lang="vim">
Line 16: Line 18:
 
nnoremap l :!mpc seek +5 %i<cr>:mpcStat 2<cr>
 
nnoremap l :!mpc seek +5 %i<cr>:mpcStat 2<cr>
 
nnoremap b :!mpc seek -5 %i<cr>:mpcStat 2<cr>
 
nnoremap b :!mpc seek -5 %i<cr>:mpcStat 2<cr>
nnoremap ymp :!mpc toggle %i<cr>:mpcStat 2<cr>
+
nnoremap rmp :!mpc toggle %i<cr>:mpcStat 2<cr>
nnoremap ymw :ShowSong<cr>
+
nnoremap rmw :ShowSong<cr>
nnoremap ymg :GotoSong<cr>
+
nnoremap rmg :GotoSong<cr>
nnoremap ymt :mpcStat 2<cr>
+
nnoremap rmt :mpcStat 2<cr>
nnoremap ym3 :echo system('mpc status "vol:%volume% rep %repeat% rand %random% single %single%"')<cr>
+
nnoremap rm3 :echo system('mpc status "vol:%volume% rep %repeat% rand %random% single %single%"')<cr>
nnoremap ym0 :let $IGNORE = system('mpd_restart')<cr>:echo 'Music player daemon has been restarted'<cr>
+
nnoremap rm0 :let $IGNORE = system('mpd_restart')<cr>:echo 'Music player daemon has been restarted'<cr>
nnoremap ymi :mpcinsert<cr>:!echo Song %f:t inserted. %S<cr>
+
nnoremap rmi :mpcinsert<cr>:!echo Song %f:t inserted. %S<cr>
nnoremap yma :mpcadd<cr>:!echo Song %f:t added. %S<cr>
+
nnoremap rma :mpcadd<cr>:!echo Song %f:t added. %S<cr>
nnoremap ymm :mpciaplay<cr>:ShowSong<cr>
+
nnoremap rmm :!echo "%f" | sed -e 's/\([^\]\) /\1\n/g' -e 's/\\//g' | xargs -d '\n' -L 1 realpath --relative-to=$MUSIC_DIR %M | sort -nr | xargs -d '\n' -L 1 mpc insert<cr>:mpcplay<cr>:ShowSong<cr>
nnoremap ymd :Delfind<cr>
+
nnoremap rmd :Delfind<cr>
nnoremap ymf :goto $MUSIC_DIR<cr>i:FZFfind<cr>
+
nnoremap rmf :goto $MUSIC_DIR<cr>i:FZFfind<cr>
nnoremap yms :Playfind<cr>
+
nnoremap rms :Playfind<cr>
nnoremap ymc :!mpc crop %i<cr>:echo 'Playlist cropped'<cr>
+
nnoremap rmc :!mpc crop %i<cr>:echo 'Playlist cropped'<cr>
nnoremap yme :!mpc clear %i<cr>:echo 'Playlist cleared'<cr>
+
nnoremap rme :!mpc clear %i<cr>:echo 'Playlist cleared'<cr>
nnoremap ymn :let $IGNORE = system('mpc next')<cr>:ShowSong<cr>
+
nnoremap rmn :let $IGNORE = system('mpc next')<cr>:ShowSong<cr>
nnoremap ymv :let $IGNORE = system('mpc prev')<cr>:ShowSong<cr>
+
nnoremap rmv :let $IGNORE = system('mpc prev')<cr>:ShowSong<cr>
nnoremap ymr :let $IGNORE = system('mpc seek 0%')<cr>:let $IGNORE = system('mpc play')<cr>:mpcStat 1<cr>
+
nnoremap rmr :let $IGNORE = system('mpc seek 0%')<cr>:let $IGNORE = system('mpc play')<cr>:mpcStat 1<cr>
nnoremap ymR :let $IGNORE = system('mpc stop')<cr>:!mpc play 1 %i<cr>
+
nnoremap rmR :let $IGNORE = system('mpc stop')<cr>:!mpc play 1 %i<cr>
nnoremap ymx :let $IGNORE = system('mpc random')<cr>:!mpc status "Random is %%random%%<cr>
+
nnoremap rmx :let $IGNORE = system('mpc random')<cr>:echo system('mpc status "Random is %random%"')<cr>
nnoremap yml :let $IGNORE = system('mpc repeat %i')<cr>:!mpc status "Repeat is %%repeat%%"<cr>
+
nnoremap rml :let $IGNORE = system('mpc repeat')<cr>:echo system('mpc status "Repeat is %repeat%"')<cr>
nnoremap ymS :let $IGNORE = system('mpc single')<cr>:echo system('mpc status "Single is %single%"')<cr>
+
nnoremap rmS :let $IGNORE = system('mpc single')<cr>:echo system('mpc status "Single is %single%"')<cr>
nnoremap ymh :!mpc shuffle %i<cr>:echo 'Playlist shuffled'<cr>
+
nnoremap rmh :!mpc shuffle %i<cr>:echo 'Playlist shuffled'<cr>
nnoremap ymL :PlayListfind<cr>:!sleep 0.2 %i<cr>:Playfind<cr>
+
nnoremap rmL :PlayListfind<cr>:!sleep 0.2 %i<cr>:Playfind<cr>
 
nnoremap + :!mpc volume +5 %i<cr>:echo system('mpc status "Volume is:%volume%"')<cr>
 
nnoremap + :!mpc volume +5 %i<cr>:echo system('mpc status "Volume is:%volume%"')<cr>
 
nnoremap - :!mpc volume -5 %i<cr>:echo system('mpc status "Volume is:%volume%"')<cr>
 
nnoremap - :!mpc volume -5 %i<cr>:echo system('mpc status "Volume is:%volume%"')<cr>
Line 48: Line 50:
 
command ShowSong mpc -f "$SONG_FORMAT" current %S
 
command ShowSong mpc -f "$SONG_FORMAT" current %S
 
command GotoSong :exe 'goto "$MUSIC_DIR/'.system('mpc -f "%%file%%" | sed -ne "1p" --').'"'
 
command GotoSong :exe 'goto "$MUSIC_DIR/'.system('mpc -f "%%file%%" | sed -ne "1p" --').'"'
command mpcinsert :let $IGNORE = system(expand('mpc search filename "$(realpath --relative-to=$MUSIC_DIR %%f)" | mpc insert'))
 
 
command mpcadd :let $IGNORE = system(expand('mpc search filename "$(realpath --relative-to=$MUSIC_DIR %%f)" | mpc add'))
 
command mpcadd :let $IGNORE = system(expand('mpc search filename "$(realpath --relative-to=$MUSIC_DIR %%f)" | mpc add'))
 
command pls mpc save %a | echo "Playlist saved." %i
 
command pls mpc save %a | echo "Playlist saved." %i
 
command pll mpc load %a %i
 
command pll mpc load %a %i
 
command mpcStat :echo system('mpc | sed -ne '.%a.'p --')
 
command mpcStat :echo system('mpc | sed -ne '.%a.'p --')
command mpcls mpc playlist %a | sed -e "s/$(mpc | sed -ne '1p')/& */" -- %M
+
command mpcls mpc playlist | sed -e "s%%$(mpc | sed -ne '1p')%%& *%%" -- %M
command mpciaplay :mpcinsert | if system('mpc | sed -ne 2p -- | cut -d " " -f 1') == '' | execute '!mpc toggle &' | else | execute '!mpc next &' | endif
+
" Unfortunitly vifm doesn't have the capability to give a user command the functionality of
 +
" something like :rename
 +
" command mpcEdit !mpc playlist | $EDITOR - /tmp/tmp.m3u
 +
command mpcplay :if system('mpc | sed -ne 2p -- | cut -d " " -f 1') == '' | execute '!mpc toggle &' | else | execute '!mpc next &' | endif
 
" }}}2
 
" }}}2
 
" }}}1
 
" }}}1
 
</source>
 
</source>
  
Here's a video showcasing all the features:
+
Here's a video showcasing almost all the features [https://youtu.be/6JNZKT7VgIg]:

Revision as of 16:09, 22 May 2021

If you have mpc then with some scripting you can use Vifm as your music player! Simply copy and paste this into your vifmrc:

NOTE You need fzf for this

NOTE You should also have the most recent version of mpc compiled from github.

You can use older versions of mpc and still get 99% of the functionality, but certain mappings will have to be adjusted for displaying the current status. Make you that you set the shell variables at the beginning here to their appropriate locations on the harddrive.

" {{{1 MUSIC PLAYER
let $SONG_FORMAT="[[%artist% - ]%title%]|[%file%]"
let $MUSIC_DIR=expand("$HOME/music")
let $PLAY_LIST=expand("$HOME/music/play_list")
" {{{2 MAPPINGS
nnoremap L :!mpc seek +5%% %i<cr>:mpcStat 2<cr>
nnoremap B :!mpc seek -5%% %i<cr>:mpcStat 2<cr>
nnoremap l :!mpc seek +5 %i<cr>:mpcStat 2<cr>
nnoremap b :!mpc seek -5 %i<cr>:mpcStat 2<cr>
nnoremap rmp :!mpc toggle %i<cr>:mpcStat 2<cr>
nnoremap rmw :ShowSong<cr>
nnoremap rmg :GotoSong<cr>
nnoremap rmt :mpcStat 2<cr>
nnoremap rm3 :echo system('mpc status "vol:%volume% rep %repeat% rand %random% single %single%"')<cr>
nnoremap rm0 :let $IGNORE = system('mpd_restart')<cr>:echo 'Music player daemon has been restarted'<cr>
nnoremap rmi :mpcinsert<cr>:!echo Song %f:t inserted. %S<cr>
nnoremap rma :mpcadd<cr>:!echo Song %f:t added. %S<cr>
nnoremap rmm :!echo "%f" | sed -e 's/\([^\]\) /\1\n/g' -e 's/\\//g' | xargs -d '\n' -L 1 realpath --relative-to=$MUSIC_DIR %M | sort -nr | xargs -d '\n' -L 1 mpc insert<cr>:mpcplay<cr>:ShowSong<cr>
nnoremap rmd :Delfind<cr>
nnoremap rmf :goto $MUSIC_DIR<cr>i:FZFfind<cr>
nnoremap rms :Playfind<cr>
nnoremap rmc :!mpc crop %i<cr>:echo 'Playlist cropped'<cr>
nnoremap rme :!mpc clear %i<cr>:echo 'Playlist cleared'<cr>
nnoremap rmn :let $IGNORE = system('mpc next')<cr>:ShowSong<cr>
nnoremap rmv :let $IGNORE = system('mpc prev')<cr>:ShowSong<cr>
nnoremap rmr :let $IGNORE = system('mpc seek 0%')<cr>:let $IGNORE = system('mpc play')<cr>:mpcStat 1<cr>
nnoremap rmR :let $IGNORE = system('mpc stop')<cr>:!mpc play 1 %i<cr>
nnoremap rmx :let $IGNORE = system('mpc random')<cr>:echo system('mpc status "Random is %random%"')<cr>
nnoremap rml :let $IGNORE = system('mpc repeat')<cr>:echo system('mpc status "Repeat is %repeat%"')<cr>
nnoremap rmS :let $IGNORE = system('mpc single')<cr>:echo system('mpc status "Single is %single%"')<cr>
nnoremap rmh :!mpc shuffle %i<cr>:echo 'Playlist shuffled'<cr>
nnoremap rmL :PlayListfind<cr>:!sleep 0.2 %i<cr>:Playfind<cr>
nnoremap + :!mpc volume +5 %i<cr>:echo system('mpc status "Volume is:%volume%"')<cr>
nnoremap - :!mpc volume -5 %i<cr>:echo system('mpc status "Volume is:%volume%"')<cr>
" }}}2
" {{{2 COMMANDS
command! Playfind :exe '!mpc play "'.system('mpc playlist | nl | grep -Fv "$(mpc | sed -ne "1p" --)" | fzf --height 40 --with-nth 2.. 2>/dev/tty | cut -f 1 | tr -d " "').'" &>/dev/null %IU' | redraw
command! PlayListfind :exe '!mpc load "'.system('mpc lsplaylist | fzf --height 40 2>/dev/tty').'"' | redraw
command Delfind :exe '!mpc del "'.system('mpc playlist | nl | fzf --height 40 --with-nth 2.. 2>/dev/tty | cut -f 1 | tr -d " "').'" & &>/dev/null %IU' | redraw
command ShowSong mpc -f "$SONG_FORMAT" current %S
command GotoSong :exe 'goto "$MUSIC_DIR/'.system('mpc -f "%%file%%" | sed -ne "1p" --').'"'
command mpcadd :let $IGNORE = system(expand('mpc search filename "$(realpath --relative-to=$MUSIC_DIR %%f)" | mpc add'))
command pls mpc save %a | echo "Playlist saved." %i
command pll mpc load %a %i
command mpcStat :echo system('mpc | sed -ne '.%a.'p --')
command mpcls mpc playlist | sed -e "s%%$(mpc | sed -ne '1p')%%& *%%" -- %M
" Unfortunitly vifm doesn't have the capability to give a user command the functionality of
" something like :rename
" command mpcEdit !mpc playlist | $EDITOR - /tmp/tmp.m3u
command mpcplay :if system('mpc | sed -ne 2p -- | cut -d " " -f 1') == '' | execute '!mpc toggle &' | else | execute '!mpc next &' | endif
" }}}2
" }}}1

Here's a video showcasing almost all the features [1]: