St: Difference between revisions
imported>Legendofmiracles m removes a few of the `1`'s as they really are unnecessary and only clutter things up |
imported>IgorM m Fixed syntax highlighting |
||
(8 intermediate revisions by 4 users not shown) | |||
Line 44: | Line 44: | ||
Followed by: | Followed by: | ||
<syntaxhighlight> | <syntaxhighlight lang=console> | ||
$ nix-env -i -f my-custom-st | $ nix-env -i -f my-custom-st | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 51: | Line 51: | ||
Most customization of <code>st</code> that alters its base feature set comes in the form of applying patches to the source code. | Most customization of <code>st</code> that alters its base feature set comes in the form of applying patches to the source code. | ||
=== Obtaining hashes === | |||
To apply a patch you need to obtain the hash, the hash should be obtained with the following command | |||
<syntaxhighlight lang="console"> | |||
$ nix-prefetch-url <url> | |||
</syntaxhighlight> | |||
example | |||
<syntaxhighlight lang="console"> | |||
$ nix-prefetch-url https://st.suckless.org/patches/rightclickpaste/st-rightclickpaste-0.8.2.diff | |||
</syntaxhighlight> | |||
=== Patches === | === Patches === | ||
Line 129: | Line 141: | ||
})) | })) | ||
];</syntaxhighlight> | ];</syntaxhighlight> | ||
== Using DWM == | |||
However, this will not work for <code>dwm</code>. (Probably <code>services.xserver.windowManager.dwm</code> can only see the <code>dwm</code> in <code>pkgs</code>, not the one in <code>environment.systemPackages</code>.) But you can use an overlay, like this: | However, this will not work for <code>dwm</code>. (Probably <code>services.xserver.windowManager.dwm</code> can only see the <code>dwm</code> in <code>pkgs</code>, not the one in <code>environment.systemPackages</code>.) But you can use an overlay, like this: | ||
Line 141: | Line 155: | ||
configFile = super.writeText "config.h" (builtins.readFile ./dwm-config.h); | configFile = super.writeText "config.h" (builtins.readFile ./dwm-config.h); | ||
postPatch = oldAttrs.postPatch or "" + "\necho 'Using own config file...'\n cp ${configFile} config.def.h"; | postPatch = oldAttrs.postPatch or "" + "\necho 'Using own config file...'\n cp ${configFile} config.def.h"; | ||
}); | |||
}) | |||
]; | |||
</syntaxhighlight> | |||
It should also be mentioned that the <code>st.overrideAttrs</code> should be added to the overlays when using <code>dwm</code> with dwm changes and st changes the overlay could look like this | |||
<syntaxhighlight lang="nix"> | |||
nixpkgs.overlays = [ | |||
(self: super: { | |||
dwm = super.dwm.overrideAttrs (oldAttrs: rec { | |||
patches = [ | |||
./path/to/my-dwm-patch.patch | |||
]; | |||
configFile = super.writeText "config.h" (builtins.readFile ./dwm-config.h); | |||
postPatch = oldAttrs.postPatch or "" + "\necho 'Using own config file...'\n cp ${configFile} config.def.h"; | |||
}); | |||
}) | |||
st = super.st.overrideAttrs (oldAttrs: rec { | |||
patches = [ | |||
./path/to/my-dwm-patch.patch | |||
]; | |||
configFile = super.writeText "config.h" (builtins.readFile ./st-config.h); | |||
postPatch = "${oldAttrs.postPatch}\ncp ${configFile} config.def.h\n" | |||
}); | }); | ||
}) | }) | ||
Line 166: | Line 204: | ||
buildInputs = oldAttrs.buildInputs ++ [ harfbuzz ]; | buildInputs = oldAttrs.buildInputs ++ [ harfbuzz ]; | ||
# If you want it to be always up to date use fetchTarball instead of fetchFromGitHub | # If you want it to be always up to date use fetchTarball instead of fetchFromGitHub | ||
# src = | # src = builtins.fetchTarball { | ||
# url = "https://github.com/lukesmithxyz/st/archive/master.tar.gz"; | # url = "https://github.com/lukesmithxyz/st/archive/master.tar.gz"; | ||
# }; | # }; | ||
Line 190: | Line 228: | ||
</nowiki>}} | </nowiki>}} | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="console"> | ||
nix-shell st-test.nix | $ nix-shell st-test.nix | ||
unpackPhase | $ unpackPhase | ||
ls | $ ls | ||
cd theunpackeddir | $ cd theunpackeddir | ||
patchPhase | $ patchPhase | ||
</syntaxhighlight> | </syntaxhighlight> | ||
[https://nixos.org/manual/nixpkgs/stable/#sec-stdenv-phases Additional phases] | [https://nixos.org/manual/nixpkgs/stable/#sec-stdenv-phases Additional phases] |
Latest revision as of 09:41, 30 September 2023
st
the suckless terminal or the simple terminal
most things here apply for dwm and other suckless software too
The examples below only assume you are running Linux (at the time of this writing, darwin/OS X does not support st
).
Installing
NixOS
Add st
to the list of available packages in your configuration.nix
.
System-wide:
environment.systemPackages = with pkgs; [
st
];
Only available to certain users:
users.users.alice.packages = with pkgs; [
st
];
Other Linux distributions
You will need to write a roughly equivalent nix expression and install it the imperative way.
E.g.
my-custom-st
# pinned nixpkgs from nix.dev > "toward reproducibility"
{ pkgs ? import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/3590f02e7d5760e52072c1a729ee2250b5560746.tar.gz") {}
}:
# specifics elided for brevity
pkgs.st.overrideAttrs { ... }
Followed by:
$ nix-env -i -f my-custom-st
Patching
Most customization of st
that alters its base feature set comes in the form of applying patches to the source code.
Obtaining hashes
To apply a patch you need to obtain the hash, the hash should be obtained with the following command
$ nix-prefetch-url <url>
example
$ nix-prefetch-url https://st.suckless.org/patches/rightclickpaste/st-rightclickpaste-0.8.2.diff
Patches
Can be applied by including them in an attribute override in your systemPackages declaration:
environment.systemPackages = with pkgs; [
(st.overrideAttrs (oldAttrs: rec {
patches = [
# You can specify local patches
./path/to/local.diff
# Fetch them directly from `st.suckless.org`
(fetchpatch {
url = "https://st.suckless.org/patches/rightclickpaste/st-rightclickpaste-0.8.2.diff";
sha256 = "1y4fkwn911avwk3nq2cqmgb2rynbqibgcpx7yriir0lf2x2ww1b6";
})
# Or from any other source
(fetchpatch {
url = "https://raw.githubusercontent.com/fooUser/barRepo/1111111/somepatch.diff";
sha256 = "222222222222222222222222222222222222222222";
})
];
}))
];
Patch Dependencies
Can be included with the buildInputs
line like in the following ligature patch example:
environment.systemPackages = with pkgs; [
(st.overrideAttrs (oldAttrs: rec {
buildInputs = oldAttrs.buildInputs ++ [ harfbuzz ];
patches = [
(fetchpatch {
url = "https://st.suckless.org/patches/ligatures/0.8.3/st-ligatures-20200430-0.8.3.diff";
sha256 = "67b668c77677bfcaff42031e2656ce9cf173275e1dfd6f72587e8e8726298f09";
})
];
}))
];
Config
Configuration is accomplished through a config.h
file.
Header file
environment.systemPackages = with pkgs; [
(st.overrideAttrs (oldAttrs: rec {
# Using a local file
configFile = writeText "config.def.h" (builtins.readFile ./path/to/local/config.h);
# Or one pulled from GitHub
# configFile = writeText "config.def.h" (builtins.readFile "${fetchFromGitHub { owner = "LukeSmithxyz"; repo = "st"; rev = "8ab3d03681479263a11b05f7f1b53157f61e8c3b"; sha256 = "1brwnyi1hr56840cdx0qw2y19hpr0haw4la9n0rqdn0r2chl8vag"; }}/config.h");
postPatch = "${oldAttrs.postPatch}\n cp ${configFile} config.def.h";
}))
];
All together now
environment.systemPackages = with pkgs; [
(st.overrideAttrs (oldAttrs: rec {
# ligatures dependency
buildInputs = oldAttrs.buildInputs ++ [ harfbuzz ];
patches = [
# ligatures patch
(fetchpatch {
url = "https://st.suckless.org/patches/ligatures/0.8.3/st-ligatures-20200430-0.8.3.diff";
sha256 = "67b668c77677bfcaff42031e2656ce9cf173275e1dfd6f72587e8e8726298f09";
})
];
# version controlled config file
configFile = writeText "config.def.h" (builtins.readFile "${fetchFromGitHub { owner = "me"; repo = "my-custom-st-stuff"; rev = "1111222233334444"; sha256 = "11111111111111111111111111111111111"; }}/config.h");
postPatch = oldAttrs.postPatch ++ ''cp ${configFile} config.def.h'';
}))
];
Using DWM
However, this will not work for dwm
. (Probably services.xserver.windowManager.dwm
can only see the dwm
in pkgs
, not the one in environment.systemPackages
.) But you can use an overlay, like this:
nixpkgs.overlays = [
(self: super: {
dwm = super.dwm.overrideAttrs (oldAttrs: rec {
patches = [
./path/to/my-dwm-patch.patch
];
configFile = super.writeText "config.h" (builtins.readFile ./dwm-config.h);
postPatch = oldAttrs.postPatch or "" + "\necho 'Using own config file...'\n cp ${configFile} config.def.h";
});
})
];
It should also be mentioned that the st.overrideAttrs
should be added to the overlays when using dwm
with dwm changes and st changes the overlay could look like this
nixpkgs.overlays = [
(self: super: {
dwm = super.dwm.overrideAttrs (oldAttrs: rec {
patches = [
./path/to/my-dwm-patch.patch
];
configFile = super.writeText "config.h" (builtins.readFile ./dwm-config.h);
postPatch = oldAttrs.postPatch or "" + "\necho 'Using own config file...'\n cp ${configFile} config.def.h";
});
})
st = super.st.overrideAttrs (oldAttrs: rec {
patches = [
./path/to/my-dwm-patch.patch
];
configFile = super.writeText "config.h" (builtins.readFile ./st-config.h);
postPatch = "${oldAttrs.postPatch}\ncp ${configFile} config.def.h\n"
});
})
];
Remote config
If instead, you would prefer to build a pre-configured repository or realize more intense configuration, fork the mainline repository (or find one you like) and replace the value of the src
attribute in the override.
Forks
Luke smiths st fork is used as the example
environment.systemPackages = with pkgs; [
(st.overrideAttrs (oldAttrs: rec {
src = fetchFromGitHub {
owner = "LukeSmithxyz";
repo = "st";
rev = "8ab3d03681479263a11b05f7f1b53157f61e8c3b";
sha256 = "1brwnyi1hr56840cdx0qw2y19hpr0haw4la9n0rqdn0r2chl8vag";
};
# Make sure you include whatever dependencies the fork needs to build properly!
buildInputs = oldAttrs.buildInputs ++ [ harfbuzz ];
# If you want it to be always up to date use fetchTarball instead of fetchFromGitHub
# src = builtins.fetchTarball {
# url = "https://github.com/lukesmithxyz/st/archive/master.tar.gz";
# };
}))
];
Troubleshooting
See files after patching
st-test.nix
with import <nixpkgs> {};
(st.overrideAttrs (oldAttrs: rec {
buildInputs = oldAttrs.buildInputs ++ [ harfbuzz ];
patches = [
(fetchpatch {
url = "https://st.suckless.org/patches/ligatures/0.8.3/st-ligatures-20200430-0.8.3.diff";
sha256 = "18fllssg5d5gik1x0ppz232vdphr0y2j5z8lhs5j9zjs8m9ria5w";
})
];
}))
$ nix-shell st-test.nix
$ unpackPhase
$ ls
$ cd theunpackeddir
$ patchPhase