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


in the following examples it is assumed that <syntaxhighlight lang="nix" inline>environment.systemPackages</syntaxhighlight> is in <code>/etc/nixos/</code> and there is a <code>/etc/nixos/programs/st/</code>
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 ==


=== Official Patches ===
Most customization of <code>st</code> that alters its base feature set comes in the form of applying patches to the source code.


Can be applied by first downloading them from `st.suckless.org/patches` like so:
=== Patches ===


curl https://st.suckless.org/patches/rightclickpaste/st-rightclickpaste-0.8.2.diff > /etc/nixos/programs/st/rightclicktopaste.diff
Can be applied by including them in an attribute override in your systemPackages declaration:
 
And then 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 = [
       ./programs/st/rightclicktopaste.diff
      # You can specify local patches
       # Patches can also be fetched directly
       ./path/to/local.diff
       (pkgs.fetchpatch {
       # 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>


=== Unofficial Patches ===
=== Patch Dependencies ===


Hosted on GitHub can be applied in a similar fashion using:
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 = [
       "${fetchFromGitHub { owner = "foo"; repo = "bar"; rev = "0.0.1"; sha256 = "111111111111111111111111111111111111111111111111111"; }}/some-custom-patch.diff"
       (fetchpatch {
        url = "https://st.suckless.org/patches/ligatures/0.8.3/st-ligatures-20200430-0.8.3.diff";
        sha256 = "67b668c77677bfcaff42031e2656ce9cf173275e1dfd6f72587e8e8726298f09";
      })
     ];
     ];
   }))
   }))
];</syntaxhighlight>
];</syntaxhighlight>


=== Patch Dependencies ===
== Config ==


Can be included with the `buildInputs` line like in the following ligature patch example:
Configuration is accomplished through a <code>config.h</code> file.


curl https://st.suckless.org/patches/ligatures/0.8.3/st-ligatures-20200430-0.8.3.diff > /etc/nixos/programs/st/ligatures.diff
=== Header file ===


<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 ++ (with pkgs; [ harfbuzz ]);
     # Using a local file
     patches = [
    configFile = writeText "config.def.h" (builtins.readFile ./path/to/local/config.h);
      ./programs/st/ligatures.diff
     # 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>


== Config ==
== All together now ==
 
=== Local config ===


<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
environment.systemPackages = with pkgs; [
environment.systemPackages = with pkgs; [
   (st.overrideAttrs (oldAttrs: rec {
   (st.overrideAttrs (oldAttrs: rec {
     configFile = pkgs.writeText "config.def.h" (builtins.readFile ./programs/st/config.h);
    # 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 ===
== 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 = pkgs.fetchFromGitHub {
     src = fetchFromGitHub {
       owner = "LukeSmithxyz";
       owner = "LukeSmithxyz";
       repo = "st";
       repo = "st";
Line 86: Line 142:
       sha256 = "1brwnyi1hr56840cdx0qw2y19hpr0haw4la9n0rqdn0r2chl8vag";
       sha256 = "1brwnyi1hr56840cdx0qw2y19hpr0haw4la9n0rqdn0r2chl8vag";
     };
     };
     buildInputs = oldAttrs.buildInputs ++ (with super; [ harfbuzz ]);
    # 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 fetchFromGitHuh
     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";