St: Difference between revisions
imported>Artturin No edit summary |
No edit summary |
||
| (18 intermediate revisions by 9 users not shown) | |||
| Line 1: | Line 1: | ||
st | {{DISPLAYTITLE:st}} | ||
[[Category:Applications]] | |||
<code>st</code> 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 <code>st</code>). | |||
== Installing == | == Installing == | ||
=== NixOS === | |||
Add <code>st</code> to the list of available packages in your <code>configuration.nix</code>. | |||
System-wide: | |||
<syntaxhighlight lang="nix"> | |||
environment.systemPackages = with pkgs; [ | |||
st | |||
];</syntaxhighlight> | |||
Only available to certain users: | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
users.users.alice.packages = with pkgs; [ | |||
st | st | ||
];</syntaxhighlight> | ];</syntaxhighlight> | ||
=== Other Linux distributions === | |||
You will need to write a roughly equivalent nix expression and install it the imperative way. | |||
E.g. | |||
<code>my-custom-st</code> | |||
<syntaxhighlight lang="nix"> | |||
# 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 { ... }</syntaxhighlight> | |||
Followed by: | |||
<syntaxhighlight lang=console> | |||
$ nix-env -i -f my-custom-st | |||
</syntaxhighlight> | |||
== Patching == | == Patching == | ||
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 === | |||
Can be applied by including them in an attribute override in your systemPackages declaration: | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
environment.systemPackages = [ | environment.systemPackages = with pkgs; [ | ||
(st.overrideAttrs (oldAttrs: rec { | (st.overrideAttrs (oldAttrs: rec { | ||
patches = [ | 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"; | url = "https://st.suckless.org/patches/rightclickpaste/st-rightclickpaste-0.8.2.diff"; | ||
sha256 = "1y4fkwn911avwk3nq2cqmgb2rynbqibgcpx7yriir0lf2x2ww1b6"; | sha256 = "1y4fkwn911avwk3nq2cqmgb2rynbqibgcpx7yriir0lf2x2ww1b6"; | ||
}) | |||
# Or from any other source | |||
(fetchpatch { | |||
url = "https://raw.githubusercontent.com/fooUser/barRepo/1111111/somepatch.diff"; | |||
sha256 = "222222222222222222222222222222222222222222"; | |||
}) | }) | ||
]; | ]; | ||
| Line 33: | Line 88: | ||
];</syntaxhighlight> | ];</syntaxhighlight> | ||
=== | === Patch Dependencies === | ||
Can be included with the <code>buildInputs</code> line like in the following ligature patch example: | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
environment.systemPackages = [ | environment.systemPackages = with pkgs; [ | ||
(st.overrideAttrs (oldAttrs: rec { | (st.overrideAttrs (oldAttrs: rec { | ||
buildInputs = oldAttrs.buildInputs ++ [ harfbuzz ]; | |||
patches = [ | patches = [ | ||
(fetchpatch { | |||
url = "https://st.suckless.org/patches/ligatures/0.8.3/st-ligatures-20200430-0.8.3.diff"; | |||
sha256 = "67b668c77677bfcaff42031e2656ce9cf173275e1dfd6f72587e8e8726298f09"; | |||
}) | |||
]; | ]; | ||
})) | })) | ||
];</syntaxhighlight> | ];</syntaxhighlight> | ||
== | == Config == | ||
Configuration is accomplished through a <code>config.h</code> file. | |||
=== Header file === | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
environment.systemPackages = [ | environment.systemPackages = with pkgs; [ | ||
(st.overrideAttrs (oldAttrs: rec { | (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"; | |||
})) | })) | ||
];</syntaxhighlight> | ];</syntaxhighlight> | ||
== | == All together now == | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
environment.systemPackages = [ | environment.systemPackages = with pkgs; [ | ||
(st.overrideAttrs (oldAttrs: rec { | (st.overrideAttrs (oldAttrs: rec { | ||
configFile = | # 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''; | postPatch = oldAttrs.postPatch ++ ''cp ${configFile} config.def.h''; | ||
})) | })) | ||
];</syntaxhighlight> | ];</syntaxhighlight> | ||
=== Remote config === | == 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: | |||
<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"; | |||
}); | |||
}) | |||
]; | |||
</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" | |||
}); | |||
}) | |||
]; | |||
</syntaxhighlight> | |||
== 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 <code>src</code> attribute in the override. | |||
=== Forks === | |||
Luke smiths st fork is used as the example | Luke smiths st fork is used as the example | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
environment.systemPackages = [ | environment.systemPackages = with pkgs; [ | ||
(st.overrideAttrs (oldAttrs: rec { | (st.overrideAttrs (oldAttrs: rec { | ||
src = | src = fetchFromGitHub { | ||
owner = "LukeSmithxyz"; | owner = "LukeSmithxyz"; | ||
repo = "st"; | repo = "st"; | ||
| Line 86: | Line 201: | ||
sha256 = "1brwnyi1hr56840cdx0qw2y19hpr0haw4la9n0rqdn0r2chl8vag"; | sha256 = "1brwnyi1hr56840cdx0qw2y19hpr0haw4la9n0rqdn0r2chl8vag"; | ||
}; | }; | ||
buildInputs = oldAttrs.buildInputs ++ | # Make sure you include whatever dependencies the fork needs to build properly! | ||
# If you want it to be always up to date use fetchTarball instead of | buildInputs = oldAttrs.buildInputs ++ [ harfbuzz ]; | ||
# src = | # 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"; | # url = "https://github.com/lukesmithxyz/st/archive/master.tar.gz"; | ||
# }; | # }; | ||
})) | })) | ||
];</syntaxhighlight> | ];</syntaxhighlight> | ||
== Troubleshooting == | |||
=== See files after patching === | |||
{{file|st-test.nix|nix| | |||
with import <nixpkgs> {}; | |||
<nowiki> | |||
(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"; | |||
}) | |||
]; | |||
})) | |||
</nowiki>}} | |||
<syntaxhighlight lang="console"> | |||
$ nix-shell st-test.nix | |||
$ unpackPhase | |||
$ ls | |||
$ cd theunpackeddir | |||
$ patchPhase | |||
</syntaxhighlight> | |||
[https://nixos.org/manual/nixpkgs/stable/#sec-stdenv-phases Additional phases] | |||