ncmpcpp: add module

PR #1457
This commit is contained in:
Olmo Kramer 2020-08-26 21:20:54 +02:00 committed by Robert Helgesson
parent 4fe5afa755
commit 4b702bf6b7
No known key found for this signature in database
GPG Key ID: 36BDAA14C2797E89
14 changed files with 282 additions and 0 deletions

4
.github/CODEOWNERS vendored
View File

@ -77,6 +77,10 @@
/modules/programs/mpv.nix @tadeokondrak
/modules/programs/ncmpcpp.nix @olmokramer
/tests/modules/programs/ncmpcpp @olmokramer
/tests/modules/programs/ncmpcpp-linux @olmokramer
/modules/programs/ne.nix @cwyc
/tests/modules/programs/ne @cwyc

View File

@ -35,4 +35,10 @@
fingerprint = "D446 E58D 87A0 31C7 EC15 88D7 B461 2924 45C6 E696";
}];
};
olmokramer = {
name = "Olmo Kramer";
email = "olmokramer@users.noreply.github.com";
github = "olmokramer";
githubId = 3612514;
};
}

View File

@ -1642,6 +1642,13 @@ in
A new module is available: 'programs.mcfly'
'';
}
{
time = "2020-09-01T18:38:18+00:00";
message = ''
A new module is available: 'programs.ncmpcpp'
'';
}
];
};
}

View File

@ -90,6 +90,7 @@ let
(loadModule ./programs/mercurial.nix { })
(loadModule ./programs/mpv.nix { })
(loadModule ./programs/msmtp.nix { })
(loadModule ./programs/ncmpcpp.nix { })
(loadModule ./programs/ne.nix { })
(loadModule ./programs/neomutt.nix { })
(loadModule ./programs/neovim.nix { })

View File

@ -0,0 +1,135 @@
{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.programs.ncmpcpp;
renderSettings = settings:
concatStringsSep "\n" (mapAttrsToList renderSetting settings);
renderSetting = name: value: "${name}=${renderValue value}";
renderValue = option:
{
int = toString option;
bool = if option then "yes" else "no";
string = option;
}.${builtins.typeOf option};
renderBindings = bindings: concatStringsSep "\n" (map renderBinding bindings);
renderBinding = { key, command }:
concatStringsSep "\n " ([ ''def_key "${key}"'' ] ++ maybeWrapList command);
maybeWrapList = xs: if isList xs then xs else [ xs ];
valueType = with types; oneOf [ bool int str ];
bindingType = types.submodule ({ name, config, ... }: {
options = {
key = mkOption {
type = types.str;
description = "Key to bind.";
example = "j";
};
command = mkOption {
type = with types; either str (listOf str);
description = "Command or sequence of commands to be executed.";
example = "scroll_down";
};
};
});
in {
meta.maintainers = with maintainers; [ olmokramer ];
options.programs.ncmpcpp = {
enable =
mkEnableOption "ncmpcpp - an ncurses Music Player Daemon (MPD) client";
package = mkOption {
type = types.package;
default = pkgs.ncmpcpp;
defaultText = literalExample "pkgs.ncmpcpp";
description = ''
Package providing the <code>ncmpcpp</code> command.
'';
example =
literalExample "pkgs.ncmpcpp.override { visualizerSupport = true; }";
};
mpdMusicDir = mkOption {
type = types.nullOr types.path;
default = let mpdCfg = config.services.mpd;
in if pkgs.stdenv.hostPlatform.isLinux && mpdCfg.enable then
mpdCfg.musicDirectory
else
null;
defaultText = literalExample ''
if pkgs.stdenv.hostPlatform.isLinux && config.services.mpd.enable then
config.services.mpd.musicDirectory
else
null
'';
description = ''
Value of the <code>mpd_music_dir</code> setting. On Linux platforms the
value of <varname>services.mpd.musicDirectory</varname> is used as the
default if <varname>services.mpd.enable</varname> is
<literal>true</literal>.
'';
example = "~/music";
};
settings = mkOption {
type = types.attrsOf valueType;
default = { };
description = ''
Attribute set from name of a setting to its value. For available options
see
<citerefentry>
<refentrytitle>ncmpcpp</refentrytitle>
<manvolnum>1</manvolnum>
</citerefentry>.
'';
example = { ncmpcpp_directory = "~/.local/share/ncmpcpp"; };
};
bindings = mkOption {
type = types.listOf bindingType;
default = [ ];
description = "List of keybindings.";
example = literalExample ''
[
{ key = "j"; command = "scroll_down"; }
{ key = "k"; command = "scroll_up"; }
{ key = "J"; command = [ "select_item" "scroll_down" ]; }
{ key = "K"; command = [ "select_item" "scroll_up" ]; }
]
'';
};
};
config = mkIf cfg.enable {
warnings = mkIf (cfg.settings ? mpd_music_dir && cfg.mpdMusicDir != null) [
("programs.ncmpcpp.settings.mpd_music_dir will be overridden by"
+ " programs.ncmpcpp.mpdMusicDir.")
];
home.packages = [ cfg.package ];
xdg.configFile = {
"ncmpcpp/config" = let
settings = cfg.settings // optionalAttrs (cfg.mpdMusicDir != null) {
mpd_music_dir = toString cfg.mpdMusicDir;
};
in mkIf (settings != { }) { text = renderSettings settings + "\n"; };
"ncmpcpp/bindings" = mkIf (cfg.bindings != [ ]) {
text = renderBindings cfg.bindings + "\n";
};
};
};
}

View File

@ -53,6 +53,7 @@ import nmt {
./modules/programs/lf
./modules/programs/lieer
./modules/programs/mbsync
./modules/programs/ncmpcpp
./modules/programs/ne
./modules/programs/neomutt
./modules/programs/newsboat
@ -81,6 +82,7 @@ import nmt {
./modules/programs/firefox
./modules/programs/getmail
./modules/services/lieer
./modules/programs/ncmpcpp-linux
./modules/programs/rofi
./modules/programs/waybar
./modules/services/kanshi

View File

@ -0,0 +1 @@
{ ncmpcpp-use-mpd-config = ./ncmpcpp-use-mpd-config.nix; }

View File

@ -0,0 +1 @@
mpd_music_dir=/home/user/music

View File

@ -0,0 +1,25 @@
{ pkgs, ... }:
{
config = {
programs.ncmpcpp.enable = true;
services.mpd.enable = true;
services.mpd.musicDirectory = "/home/user/music";
nixpkgs.overlays = [
(self: super: {
ncmpcpp = pkgs.writeScriptBin "dummy-ncmpcpp" "";
mpd = pkgs.writeScriptBin "dummy-mpd" "";
})
];
nmt.script = ''
assertFileContent \
home-files/.config/ncmpcpp/config \
${./ncmpcpp-use-mpd-config-expected-config}
assertPathNotExists home-files/.config/ncmpcpp/bindings
'';
};
}

View File

@ -0,0 +1,4 @@
{
ncmpcpp-empty-settings = ./ncmpcpp-empty-settings.nix;
ncmpcpp-example-settings = ./ncmpcpp-example-settings.nix;
}

View File

@ -0,0 +1,16 @@
{ pkgs, ... }:
{
config = {
programs.ncmpcpp.enable = true;
nixpkgs.overlays =
[ (self: super: { ncmpcpp = pkgs.writeScriptBin "dummy-ncmpcpp" ""; }) ];
nmt.script = ''
assertPathNotExists home-files/.config/ncmpcpp/config
assertPathNotExists home-files/.config/ncmpcpp/bindings
'';
};
}

View File

@ -0,0 +1,16 @@
def_key "j"
scroll_down
def_key "k"
scroll_up
def_key "J"
select_item
scroll_down
def_key "K"
select_item
scroll_up
def_key "x"
delete_playlist_items
def_key "x"
delete_browser_items
def_key "x"
delete_stored_playlist

View File

@ -0,0 +1,4 @@
display_volume_level=no
mpd_music_dir=/home/user/music
playlist_disable_highlight_delay=0
user_interface=alternative

View File

@ -0,0 +1,60 @@
{ pkgs, ... }:
{
config = {
programs.ncmpcpp = {
enable = true;
mpdMusicDir = "/home/user/music";
settings = {
user_interface = "alternative";
display_volume_level = false;
playlist_disable_highlight_delay = 0;
};
bindings = [
{
key = "j";
command = "scroll_down";
}
{
key = "k";
command = "scroll_up";
}
{
key = "J";
command = [ "select_item" "scroll_down" ];
}
{
key = "K";
command = [ "select_item" "scroll_up" ];
}
{
key = "x";
command = "delete_playlist_items";
}
{
key = "x";
command = "delete_browser_items";
}
{
key = "x";
command = "delete_stored_playlist";
}
];
};
nixpkgs.overlays =
[ (self: super: { ncmpcpp = pkgs.writeScriptBin "dummy-ncmpcpp" ""; }) ];
nmt.script = ''
assertFileContent \
home-files/.config/ncmpcpp/config \
${./ncmpcpp-example-settings-expected-config}
assertFileContent \
home-files/.config/ncmpcpp/bindings \
${./ncmpcpp-example-settings-expected-bindings}
'';
};
}