St: Difference between revisions
imported>Artturin add with pkgs; and add paths |
imported>Mwilsoncoding removed extra `pkgs` mentions, replaced curl example in favor of `fetchpatch`, |
||
| Line 1: | Line 1: | ||
st the suckless terminal or the simple terminal | <code>st</code> the suckless terminal or the simple terminal | ||
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"> | <syntaxhighlight lang="nix"> | ||
environment.systemPackages = with pkgs; [ | environment.systemPackages = with pkgs; [ | ||
st | st | ||
];</syntaxhighlight> | ];</syntaxhighlight> | ||
Only available to certain users: | |||
<syntaxhighlight lang="nix"> | |||
users.users.alice.packages = with pkgs; [ | |||
st | |||
];</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> | |||
$ 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. | |||
=== Patches === | |||
Can be applied by including them in an attribute override in your systemPackages declaration: | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
| Line 23: | Line 55: | ||
(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/1111111111111111111111111111111111111111/somepatch.diff"; | |||
sha256 = "222222222222222222222222222222222222222222"; | |||
}) | }) | ||
]; | ]; | ||
| Line 33: | Line 71: | ||
];</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 = with pkgs; [ | 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 = with pkgs; [ | 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 ++ ''cp ${configFile} config.def.h''; | |||
})) | })) | ||
];</syntaxhighlight> | ];</syntaxhighlight> | ||
== | == All together now == | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
environment.systemPackages = with pkgs; [ | 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 == | |||
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 | ||
| Line 80: | Line 136: | ||
environment.systemPackages = with pkgs; [ | 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 142: | ||
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 ]; | ||
# If you want it to be always up to date use fetchTarball instead of fetchFromGitHub | |||
# src = pkgs.fetchTarball { | # src = pkgs.fetchTarball { | ||
# url = "https://github.com/lukesmithxyz/st/archive/master.tar.gz"; | # url = "https://github.com/lukesmithxyz/st/archive/master.tar.gz"; | ||