parent
4fe5afa755
commit
4b702bf6b7
4
.github/CODEOWNERS
vendored
4
.github/CODEOWNERS
vendored
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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'
|
||||
'';
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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 { })
|
||||
|
|
135
modules/programs/ncmpcpp.nix
Normal file
135
modules/programs/ncmpcpp.nix
Normal 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";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
|
@ -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
|
||||
|
|
1
tests/modules/programs/ncmpcpp-linux/default.nix
Normal file
1
tests/modules/programs/ncmpcpp-linux/default.nix
Normal file
|
@ -0,0 +1 @@
|
|||
{ ncmpcpp-use-mpd-config = ./ncmpcpp-use-mpd-config.nix; }
|
|
@ -0,0 +1 @@
|
|||
mpd_music_dir=/home/user/music
|
|
@ -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
|
||||
'';
|
||||
};
|
||||
}
|
4
tests/modules/programs/ncmpcpp/default.nix
Normal file
4
tests/modules/programs/ncmpcpp/default.nix
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
ncmpcpp-empty-settings = ./ncmpcpp-empty-settings.nix;
|
||||
ncmpcpp-example-settings = ./ncmpcpp-example-settings.nix;
|
||||
}
|
16
tests/modules/programs/ncmpcpp/ncmpcpp-empty-settings.nix
Normal file
16
tests/modules/programs/ncmpcpp/ncmpcpp-empty-settings.nix
Normal 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
|
||||
'';
|
||||
};
|
||||
}
|
|
@ -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
|
|
@ -0,0 +1,4 @@
|
|||
display_volume_level=no
|
||||
mpd_music_dir=/home/user/music
|
||||
playlist_disable_highlight_delay=0
|
||||
user_interface=alternative
|
60
tests/modules/programs/ncmpcpp/ncmpcpp-example-settings.nix
Normal file
60
tests/modules/programs/ncmpcpp/ncmpcpp-example-settings.nix
Normal 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}
|
||||
'';
|
||||
};
|
||||
}
|
Loading…
Reference in a new issue