• Stars
    star
    179
  • Rank 206,588 (Top 5 %)
  • Language
    Nix
  • License
    Apache License 2.0
  • Created almost 4 years ago
  • Updated 6 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

🐾 Convert Dconf files (e.g. Gnome Shell) to Nix, as expected by Home Manager

dconf2nix

CI Status

A convenient converter of DConf files to Nix, as expected by Home Manager's dconf settings. So you can Nixify your Gnome Shell configuration 😉


Benchmarks

Take it with a grain of salt but on my machine it takes an average of 7.1ms to process a 349 lines configuration and generate a Nix file with 433 lines.

benchmarks

Introduction

Given the following dconf settings:

[org/gnome/desktop/peripherals/mouse]
natural-scroll=false
speed=-0.5

[org/gnome/desktop/peripherals/touchpad]
tap-to-click=false
two-finger-scrolling-enabled=true

[org/gnome/desktop/input-sources]
current=uint32 0
sources=[('xkb', 'us')]
xkb-options=[' terminate:ctrl_alt_bksp ', ' lv3:ralt_switch ', ' caps:ctrl_modifier ']

[org/gnome/desktop/screensaver]
picture-uri=' file:///home/gvolpe/Pictures/nixos.png '

You will get the following output when running dconf2nix:

{ lib, ... }:

let
  mkTuple = lib.hm.gvariant.mkTuple;
in
{
  dconf.settings = {
    "org/gnome/desktop/peripherals/mouse" = {
      natural-scroll = false;
      speed = -0.5;
    };

    "org/gnome/desktop/peripherals/touchpad" = {
      tap-to-click = false;
      two-finger-scrolling-enabled = true;
    };

    "org/gnome/desktop/input-sources" = {
      current = "uint32 0";
      sources = [ (mkTuple [ "xkb" "us" ]) ];
      xkb-options = [ "terminate:ctrl_alt_bksp" "lv3:ralt_switch" "caps:ctrl_modifier" ];
    };

    "org/gnome/desktop/screensaver" = {
      picture-uri = "file:///home/gvolpe/Pictures/nixos.png";
    };
  };

}

It makes use of the Home Manager's dconf.settings key.

You can make changes in the UI and create a dump of your dconf file at any time, which you can Nixify so Home Manager can restore the next time you run home-manager switch. To create a dump, run the following command:

dconf dump / > dconf.settings

Run

The easiest way is to pipe the standard input to dconf2nix and expect the result in the standard output:

dconf dump / | dconf2nix > dconf.nix

If you have an input file instead, you can run the following command:

dconf2nix -i data/dconf.settings -o output/dconf.nix

Type --help for some more information.

dconf2nix - Nixify dconf configuration files

Usage: dconf2nix [-v|--version] 
                 [[-r|--root ARG] [-e|--emoji] [--verbose] | (-i|--input ARG)
                   (-o|--output ARG) [-r|--root ARG] [-e|--emoji] [--verbose]]
  Convert a dconf file into a Nix file, as expected by Home Manager.

Available options:
  -h,--help                Show this help text
  -v,--version             Show the current version
  -r,--root ARG            Custom root path. e.g.: system/locale/
  -e,--emoji               Enable emoji support (adds a bit of overhead)
  --verbose                Verbose mode (debug)
  -i,--input ARG           Path to the dconf file (input)
  -o,--output ARG          Path to the Nix output file (to be created)
  -r,--root ARG            Custom root path. e.g.: system/locale/
  -e,--emoji               Enable emoji support (adds a bit of overhead)
  --verbose                Verbose mode (debug)

Custom root

By default, dconf2nix expects the root to be /. If you want to create a dump of a custom root, you can use the --root flag. For example:

dconf dump /system/locale/ | dconf2nix --root system/locale > dconf.nix

This will generate an output similar to the one below.

{
  dconf.settings = {
    "system/locale" = {
      region = "en_US.UTF-8";
    };

  };
}

Emoji support

Emojis are supported since version 0.0.12, and it needs to be explicitly enabled, as these add a little parsing overhead via the emojis package.

The following dconf input.

[ org/gnome/Characters ]
recent-characters=['💡']
some-other-character=['🤓']

Can be parsed as follows.

$ dconf2nix -i data/emoji.settings -o output/emoji.nix --emoji

Failing to pass the --emoji flag will result in a timeout error.

Supported types

For now, only types supported by Home Manager as specified here are supported. If there's enough interest, we might be able to work on supporting the full specification.

Due to the lack of support, dconf2nix parses dictionaries and list of variants as simple strings to avoid failing to parse a file and retain most of the information.

Gnome Shell configuration

Once you have your dconf.nix, you can import it via Home Manager.

{
  programs.home-manager.enable = true;

  imports = [
    ./dconf.nix
  ];
}

If you are using the Home Manager module for NixOS you can import it like so:

{
  home-manager.users.joe = { pkgs, ... }: {
    imports = [ ./dconf.nix ];
	# ...
  };
}

Installation

dconf2nix is available on nixpkgs and can be installed as any other package. It can also be used without installing. For example, with flakes.

$ nix run nixpkgs#dconf2nix -- --version
<<< DCONF2NIX >>>
Version: 0.0.12
Maintainer: Gabriel Volpe (https://gvolpe.com)
Source code: https://github.com/gvolpe/dconf2nix

To build it from source, it is recommend to use Cachix to reduce the compilation time.

Have a look at the latest releases for more information.

Troubleshooting

Do consider the caveats mentioned above in the Supported Types section.

Development

To compile and run the tests locally.

cabal new-configure
cabal new-run dconf2nix-tests

To generate the static binary.

cabal new-configure --disable-executable-dynamic --ghc-option=-optl=-static --ghc-option=-optl=-pthread
nix-build

If everything goes well, the binary should be under result/bin/.

More Repositories

1

nix-config

👾 NixOS configuration
Nix
712
star
2

trading

💱 Trading application written in Scala 3 that showcases an Event-Driven Architecture (EDA) and Functional Programming (FP)
Scala
597
star
3

pfps-shopping-cart

🛒 The Shopping Cart application developed in the book "Practical FP in Scala: A hands-on approach"
Scala
516
star
4

pfps-examples

🏮 Standalone examples shown in the book "Practical FP in Scala: A hands-on approach"
Scala
189
star
5

advanced-http4s

🌈 Code samples of advanced features of Http4s in combination with some features of Fs2 not often seen.
Scala
142
star
6

sbt-nix.g8

❄️ Get started with Nix in Scala
Nix
115
star
7

scalar-feda

Scala
96
star
8

http4s-good-practices

Collection of what I consider good practices in Http4s (WIP)
75
star
9

neovim-flake

Nix flake for Neovim & Scala Metals
Nix
73
star
10

shopping-cart-haskell

💎 Haskell version of the Shopping Cart application developed in the book "Practical FP in Scala: A hands-on approach"
Haskell
65
star
11

musikell

🎸 Artists, Albums and Songs represented using Neo4j + GraphQL
Haskell
55
star
12

newtypes

Zero-cost wrappers (newtypes) for Scala 3
Scala
41
star
13

exchange-rates

💱 Querying a rate-limited currency exchange API using Redis as a cache
Haskell
41
star
14

light-play-rest-api

This project aims to be the reference to create a Light Weight REST API using Play Framework 2.4.x.
Scala
35
star
15

vim-setup

👾 My NeoVim configuration for Scala & Haskell development (permanently moved to https://github.com/gvolpe/dotfiles)
Vim Script
30
star
16

fts

🔍 Postgres full-text search (fts)
Haskell
28
star
17

classy-optics

🔎 Source code shown at my talks at Scale by the Bay 2018 and Scalar 2019
Scala
26
star
18

haskell-book-exercises

From the book "Haskell Programming from first principles"
Haskell
26
star
19

stm-demo

Bank transfer examples using STM in both Haskell and Scala (zio-stm)
Scala
17
star
20

postgresql-resilient

Automatic re-connection support for PostgreSQL.
Haskell
16
star
21

akka-cluster-demo

Testing the Akka 2.4 feature "akka.cluster.sharding.remember-entities"
Scala
15
star
22

nmd

NixOS Module Documentation generator
Nix
15
star
23

social-graph-api

Authentication & Social Graph API built on top of Redis, Neo4J and Play!
Scala
13
star
24

fsm-streams

Scala
13
star
25

BeautyLine

https://www.gnome-look.org/p/1425426/
12
star
26

hll-algorithm-sample

HLL Algorithm and Web Scraping sample
Scala
11
star
27

simple-http4s-api

Just a simple API using "http4s" and Json support on top of Play Json and Circe
Scala
11
star
28

effects-playground

🎯 Learning different effect systems by example
Haskell
11
star
29

split-morphism

➰ Split Morphisms
Haskell
10
star
30

types-matter

Examples shown in my talk "Why types matter". See also https://github.com/gvolpe/par-dual
Haskell
10
star
31

stargazers-raffle

Run a raffle among the 🌟 stargazers 🌟 of a Github project!
Scala
10
star
32

akka-stream-full-project

Complete project using Akka Stream with Error Handling and ~100% Test Coverage
Scala
9
star
33

cats-functional-data-validation

Functional Data Validation in Scala using the Cats library
Scala
8
star
34

cats-effect-demo

Code samples for the use cases given at my Dublin Scala Meetup's talk
Scala
8
star
35

typed-actors-demo

Simple demo using Typed Actors by @knutwalker
Scala
8
star
36

bookies

My solution to a coding challenge
Scala
7
star
37

users-api-test

Basic Users API including Authentication using Http4s v0.18 and Cats Effect v0.5
Scala
6
star
38

falsisign.nix

Nix derivations for falsisign. Save trees, ink, time, and stick it to the bureaucrats!
Nix
5
star
39

learning-haskell

Learning Haskell
Haskell
4
star
40

http4s-crud-demo

CRUD operations and Error Handling using Http4s
Scala
4
star
41

dependent-types

Personal notes taken from the course ThCS. Introduction to programming with dependent types in Scala.
Scala
4
star
42

par-dual

🔁 ParDual class for a Parallel <-> Sequential relationship
Haskell
4
star
43

advanced-scala-exercises

Solved exercises of the Advanced Scala with Scalaz book by Noel Welsh and Dave Gurnell
Scala
4
star
44

social-network

Social Network example Twitter-alike (followers / following) implemented on top of Titan Db
Scala
4
star
45

eta-servant-api

Simple Servant REST Api working on ETA (https://eta-lang.org/)
Haskell
4
star
46

scala-lab

Playground for Scala 3's experimental features
Scala
4
star
47

http4s-auth

Authentication library for Http4s
Scala
3
star
48

reader-monad-sample

Example of Dependency Injection in Scala with Reader Monads
Scala
3
star
49

nixos-hyprland

NixOS on Wayland / Hyprland
Nix
3
star
50

classy-lens

Photography website
CSS
3
star
51

truco-argentino

Classic card games
C++
3
star
52

optics-exercises

Book exercises
Haskell
3
star
53

gvolpe-bot

Telegram Bot built using the Canoe library
Scala
3
star
54

functional-chain-of-responsibility

Functional Chain of Responsibility pattern
Scala
3
star
55

problem-solving

Just having fun solving algorithmic problems in λ Haskell & Scala
Haskell
3
star
56

idris-dependent-types

Dependent Types research in the Idris language
Idris
3
star
57

pricer-streams-demo

Scalaz Streams demo project
Scala
3
star
58

free-monad-example

Simple example of a Custom Free Monad Coyoneda using Scalaz.
Scala
2
star
59

shapeless-demo

Shapeless playground
Scala
2
star
60

play-cors-filter

Play! Framework API with CORS Filter
Scala
2
star
61

coursera-reactive-prog

Curso online de programación reactiva https://www.coursera.org/course/reactive
Scala
2
star
62

simple-file-reader-akka-actors

Simple file reader using Akka actors in Scala
Scala
2
star
63

pricer-fs2-demo

Demo project using FS2 (Functional Streams for Scala)
Scala
2
star
64

free-as-a-monad

Running 2 or more algebras with Coproduct and Inject when using the Free Monad
Scala
2
star
65

blog

Principled Software Craftsmanship
SCSS
2
star
66

logger-writer-monad

Pure functional log of transactions using the Scalaz Writer Monad.
Scala
2
star
67

play-oauth-silhouette

Example using OAuth with Play! Framework and Silhouette
Scala
2
star
68

ChatGPT.nvim

Neovim plugin for interacting with OpenAI GPT-3 chatbot, providing an easy interface for exploring GPT-3 and NLP.
Lua
1
star
69

cloud-haskell-demo

Getting Started with Cloud Haskell
Haskell
1
star
70

rate-limiter

Haskell
1
star
71

play-2.5.0-M1-streams

Exploring the integration of Akka Stream included in the first milestone version of Play! 2.5.0
Scala
1
star
72

ytui-music-nix

Nixified ytui-music client
Nix
1
star
73

running

A personal running program to train for a 10k run and a half marathon
1
star
74

scalaz-streams-playground

Playing around with Scalaz Streams
Scala
1
star
75

di-macwire-sample

Example of Dependency Injection in Scala using Macwire.
Scala
1
star
76

haskell-sample-box

Collection of useful stuff learned day by day.
Haskell
1
star
77

amqp-demo

Haskell
1
star
78

streaming-playground

Haskell
1
star
79

neovim-coc

My previous NeoVim configuration with CoC for LSP support
Vim Script
1
star
80

steward

Run Scala Steward on my repos
1
star
81

cake-pattern-sample

Example of Cake pattern implementation in Scala.
Scala
1
star
82

slides

1
star
83

redis-scala-script

Redis massive data update with transactions built on top of SCRedis.
Scala
1
star
84

servant-api

Simple API built using Servant
Haskell
1
star
85

functional-data-validation

Functional Data Validation in Haskell (Examples of my talk in Eindhoven, NL on June 2017)
Haskell
1
star
86

bazecor-nix

Nix flake for Bazecor
Nix
1
star
87

transient-demo

Some computational examples using the Transient library
Haskell
1
star
88

play-web-sockets

Example using Web Sockets in Play! Framework 2
Scala
1
star
89

phantom-ssl-extension

Extension for the Cassandra client phantom supporting SSL connections and username / password authentication for Java 8.
Scala
1
star
90

pipes-concurrency-tutorial

Pipes Concurrency Tutorial personal notes
Haskell
1
star
91

pipes-tutorial

Haskell Pipes Tutorial personal notes
Haskell
1
star
92

link-checker-akka

Example of a link checker using the actor model of Akka provided by Roland Kuhn in the Reactive Programming course on Coursera.
Scala
1
star
93

events-processor-prototype

Reactive consumer of events coming from a Rabbit MQ queue using Akka streams.
Scala
1
star
94

bash-scripting

Generic Bash Scripting & Utilities that I've been creating for repetitive tasks.
Shell
1
star
95

summoner-benchmarks

Source code for the benchmarks published in my blog
Scala
1
star
96

mtl-generic-reader

Exploring the idea of deriving `cats.mtl.ApplicativeAsk` instances for `zio.Task` and `cats.effect.IO` in a principled way.
Scala
1
star
97

gvolpe-website

Source code to generate the static website https://gvolpe.com/
JavaScript
1
star
98

computation-expressions-demo

Simple comparison of the use of the standard Scala Future and the scala async library for asynchronous computation.
Scala
1
star
99

monocle-lenses

Using Monocle lenses to modify nested properties in case classes
Scala
1
star
100

medellin-talk

Haskell
1
star