* Early feedback on Guix Home
@ 2021-06-23 13:15 Ludovic Courtès
2021-06-24 5:40 ` Andrew Tropin
` (2 more replies)
0 siblings, 3 replies; 18+ messages in thread
From: Ludovic Courtès @ 2021-06-23 13:15 UTC (permalink / raw)
To: Andrew Tropin, Xinglu Chen; +Cc: guix-devel
Hello!
As discussed on IRC a few days ago, I finally gave Guix Home a try and I
like it!
I thought I’d share my first impressions so we can try and address them
in the process of getting it merged.
First, I think one of the main reasons why it took me so long to try it
out is that I was afraid of what would happen at “activation time” (upon
reconfigure). Were my dot files going to be deleted? If so, which ones
exactly should I back up? That led me to look more closely at the code
to better understand what was going to happen. I found
‘symlink-manager.scm’, which is what I was looking for, but that code is
fairly complex.
Anyway, I backed up a bunch of files :-) and eventually gave it a try,
just to notice that ‘guix home reconfigure’ was very careful about
creating backups of any files it was going to overwrite, and it was also
explicitly saying what it’s doing. Perfect.
I see two possible improvements:
1. Make the manual very upfront about that: don’t be afraid, config
files are backed up at that location, etc.
2. Review ‘symlink-manager.scm’ and work on simplifying it to make it
easier to understand what’s going on.
Second, the other thing that stopped me from getting started is the
initial config. How could I move from all my undisciplined dotfiles to
the single explicit config? Eventually, I found that starting with
nothing but packages, ‘home-bash-service-type’, and
‘home-ssh-service-type’ was the most reasonable option to begin with.
Unfortunately, even ‘home-ssh-service-type’ was difficult to handle: I
have a long ‘.ssh/config’ file and I wasn’t going to turn that into
‘ssh-host’ lines by hand.
Possible actions:
1. Provide a ‘guix home init’ command (or similar) that creates an
initial Home config based on existing config.
2. In some cases, such as OpenSSH, provide converters from the native
format to its Scheme equivalent (maybe?).
3. For each service, provide an escape hatch: a way for users to
provide a raw config file. We do that for all or most of the Guix
System services, and it helps a lot when people are starting from
an existing config.
In terms of API, I noticed that in places such as
‘home-bash-configuration’, config snippets are represented as a list of
strings (internally passed to ‘mixed-text-file’). That forces users to
mix different languages in their .scm file—e.g., half of my Home config
is .bash{rc,_profile} snippets embedded in Scheme strings. That’s
inconvenient.
Possible action:
1. Change config records to accept file-like objects instead of
strings. That way, users can choose to have snippets inlined (in a
‘plain-file’ object) or separate (via ‘local-file’). See for
example how ‘tor-configuration->torrc’ does it.
That’s it. I hope it makes sense to you!
I encourage everyone to give it a spin, fearlessly!
What I did was (roughly):
git clone https://git.sr.ht/~abcdw/rde
guix git authenticate \
"257cebd587b66e4d865b3537a9a88cccd7107c95" \
"2841 9AC6 5038 7440 C7E9 2FFA 2208 D209 58C1 DEB0" \
-k origin/keyring
./pre-inst-env guix home reconfigure /path/to/home-config.scm
Thanks,
Ludo’.
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Early feedback on Guix Home
2021-06-23 13:15 Early feedback on Guix Home Ludovic Courtès
@ 2021-06-24 5:40 ` Andrew Tropin
2021-06-29 10:25 ` Ludovic Courtès
2021-06-24 8:14 ` Xinglu Chen
2021-06-24 16:50 ` jbranso
2 siblings, 1 reply; 18+ messages in thread
From: Andrew Tropin @ 2021-06-24 5:40 UTC (permalink / raw)
To: Ludovic Courtès, Xinglu Chen; +Cc: guix-devel
Ludovic Courtès <ludo@gnu.org> writes:
> Hello!
>
> As discussed on IRC a few days ago, I finally gave Guix Home a try and I
> like it!
>
> I thought I’d share my first impressions so we can try and address them
> in the process of getting it merged.
>
> First, I think one of the main reasons why it took me so long to try it
> out is that I was afraid of what would happen at “activation time” (upon
> reconfigure). Were my dot files going to be deleted? If so, which ones
> exactly should I back up? That led me to look more closely at the code
> to better understand what was going to happen.
Good to know, added a todo to make it clearer in the documentation.
> I found ‘symlink-manager.scm’, which is what I was looking for, but
> that code is fairly complex.
Yep, perhaps it a little monstous) Maybe cleaning it up is a good idea
before sending the patch to guix.
> Anyway, I backed up a bunch of files :-) and eventually gave it a try,
> just to notice that ‘guix home reconfigure’ was very careful about
> creating backups of any files it was going to overwrite, and it was also
> explicitly saying what it’s doing. Perfect.
>
> I see two possible improvements:
>
> 1. Make the manual very upfront about that: don’t be afraid, config
> files are backed up at that location, etc.
>
> 2. Review ‘symlink-manager.scm’ and work on simplifying it to make it
> easier to understand what’s going on.
Sounds reasonable)
> Second, the other thing that stopped me from getting started is the
> initial config. How could I move from all my undisciplined dotfiles to
> the single explicit config? Eventually, I found that starting with
> nothing but packages, ‘home-bash-service-type’, and
> ‘home-ssh-service-type’ was the most reasonable option to begin with.
>
> Unfortunately, even ‘home-ssh-service-type’ was difficult to handle: I
> have a long ‘.ssh/config’ file and I wasn’t going to turn that into
> ‘ssh-host’ lines by hand.
>
> Possible actions:
>
> 1. Provide a ‘guix home init’ command (or similar) that creates an
> initial Home config based on existing config.
Xinglu implemented `guix home import`, which creates a simple
home-environment configuration, which contains the same packages as ~/.guix-profile
> 2. In some cases, such as OpenSSH, provide converters from the native
> format to its Scheme equivalent (maybe?).
It's a good idea and Xinglu also mentioned it, but I find it to be a lot
of extra work, so I propose to postpone it until next time, IMO it's
better to focus on moving Guix Home from rde repo first in the current
state and add new functionality after that step is done, otherwise we
can stuck with wip-guix-home for months.
> 3. For each service, provide an escape hatch: a way for users to
> provide a raw config file. We do that for all or most of the Guix
> System services, and it helps a lot when people are starting from
> an existing config.
We do it as well, the only difference is that we try to utilize target
program capabilities or slurp-file-gexp helper for that.
The first one means that target configuration format allows to use some
directive to load the content of another file:
https://git.sr.ht/~abcdw/rde/tree/master/gnu/home-services/ssh.scm#L190
https://git.sr.ht/~abcdw/rde/tree/master/gnu/home-services/emacs.scm#L200
The second one inlines the content of file directly in configuration.
In most cases it's done by providing a gexp, which reads the content of
the file in the store and returning its content as a string to make
mixed-text-file to add it to the target configuration.
https://git.sr.ht/~abcdw/rde/tree/master/gnu/home-services/emacs.scm#L208
> In terms of API, I noticed that in places such as
> ‘home-bash-configuration’, config snippets are represented as a list of
> strings (internally passed to ‘mixed-text-file’). That forces users to
> mix different languages in their .scm file—e.g., half of my Home config
> is .bash{rc,_profile} snippets embedded in Scheme strings. That’s
> inconvenient.
Can you elaborate on that please, ideally with some examples.
> Possible action:
>
> 1. Change config records to accept file-like objects instead of
> strings. That way, users can choose to have snippets inlined (in a
> ‘plain-file’ object) or separate (via ‘local-file’). See for
> example how ‘tor-configuration->torrc’ does it.
>
> That’s it. I hope it makes sense to you!
Make a lot of sense, thank you for the feedback and suggestions!)
> I encourage everyone to give it a spin, fearlessly!
> What I did was (roughly):
>
> git clone https://git.sr.ht/~abcdw/rde
> guix git authenticate \
> "257cebd587b66e4d865b3537a9a88cccd7107c95" \
> "2841 9AC6 5038 7440 C7E9 2FFA 2208 D209 58C1 DEB0" \
> -k origin/keyring
And to get the initial configuration, it's a good idea to take a look at
gnu/home/examples directory or call import action:
./pre-inst-env guix home import > /path/to/home-config.scm
> ./pre-inst-env guix home reconfigure /path/to/home-config.scm
For people, who is not yet familiar with Guix Home, the project and
documentation web pages:
https://sr.ht/~abcdw/rde/
https://guix-home.trop.in/Home-Configuration.html#Home-Configuration
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Early feedback on Guix Home
2021-06-23 13:15 Early feedback on Guix Home Ludovic Courtès
2021-06-24 5:40 ` Andrew Tropin
@ 2021-06-24 8:14 ` Xinglu Chen
2021-06-24 15:18 ` Andrew Tropin
2021-06-29 10:33 ` Ludovic Courtès
2021-06-24 16:50 ` jbranso
2 siblings, 2 replies; 18+ messages in thread
From: Xinglu Chen @ 2021-06-24 8:14 UTC (permalink / raw)
To: Ludovic Courtès, Andrew Tropin; +Cc: guix-devel
[-- Attachment #1: Type: text/plain, Size: 5830 bytes --]
On Wed, Jun 23 2021, Ludovic Courtès wrote:
> Hello!
>
> As discussed on IRC a few days ago, I finally gave Guix Home a try and I
> like it!
>
> I thought I’d share my first impressions so we can try and address them
> in the process of getting it merged.
>
> First, I think one of the main reasons why it took me so long to try it
> out is that I was afraid of what would happen at “activation time” (upon
> reconfigure). Were my dot files going to be deleted? If so, which ones
> exactly should I back up? That led me to look more closely at the code
> to better understand what was going to happen. I found
> ‘symlink-manager.scm’, which is what I was looking for, but that code is
> fairly complex.
>
> Anyway, I backed up a bunch of files :-) and eventually gave it a try,
> just to notice that ‘guix home reconfigure’ was very careful about
> creating backups of any files it was going to overwrite, and it was also
> explicitly saying what it’s doing. Perfect.
Yeah, the output is pretty verbose, which is good if someone is just
getting started with it, but there should probably also be an option to
make it less verbose.
> I see two possible improvements:
>
> 1. Make the manual very upfront about that: don’t be afraid, config
> files are backed up at that location, etc.
Yeah, the manual needs some more work, maybe we should add an ‘migrating
to Guix Home’ section?
> 2. Review ‘symlink-manager.scm’ and work on simplifying it to make it
> easier to understand what’s going on.
>
> Second, the other thing that stopped me from getting started is the
> initial config. How could I move from all my undisciplined dotfiles to
> the single explicit config? Eventually, I found that starting with
> nothing but packages, ‘home-bash-service-type’, and
> ‘home-ssh-service-type’ was the most reasonable option to begin with.
>
> Unfortunately, even ‘home-ssh-service-type’ was difficult to handle: I
> have a long ‘.ssh/config’ file and I wasn’t going to turn that into
> ‘ssh-host’ lines by hand.
There is a ‘home-generic-service’ procedure that allows one to install
packages in dump a file somewhere in their home directory.
(home-generic-service
'ssh-config
#:packages (list openssh)
#:files `(("ssh/config"
,(local-file "/path/to/some/ssh/config"))))
> Possible actions:
>
> 1. Provide a ‘guix home init’ command (or similar) that creates an
> initial Home config based on existing config.
As Andrew mentioned, I recently added a ‘guix home import’ command, but
in only imports the installed user packages. Creating configurations
for the packages would require a lot more work, unless we just read the
contents of ~/.bashrc and ~/.config/git/config and use
‘home-generic-service’ and ‘plain-file’, instead of using
‘home-bash-configuration’ and ‘home-git-configuration’.
> 2. In some cases, such as OpenSSH, provide converters from the native
> format to its Scheme equivalent (maybe?).
That would require a lot of work; we would have to parse all sorts of
weird configuration formats, not to mention that the upstream
configuration format can change in the future. It would be nice to
have, but I don’t think it should be a blocker for merging Guix Home.
> 3. For each service, provide an escape hatch: a way for users to
> provide a raw config file. We do that for all or most of the Guix
> System services, and it helps a lot when people are starting from
> an existing config.
Since we already have the ‘home-generic-service’ helper, I am not sure
if explicitly providing an escape hatch for every single service is
worth it. I feel like the point is to use Scheme to configure things,
and not to just concatenate big opaque strings. People who haven’t
re-written their configs in Scheme can always use
‘home-generic-service’. ‘home-generic-service’ is also useful if say
the user wants to configure Mpv, but there is no Mpv service in Guix
Home.
> In terms of API, I noticed that in places such as
> ‘home-bash-configuration’, config snippets are represented as a list of
> strings (internally passed to ‘mixed-text-file’). That forces users to
> mix different languages in their .scm file—e.g., half of my Home config
> is .bash{rc,_profile} snippets embedded in Scheme strings. That’s
> inconvenient.
>
> Possible action:
>
> 1. Change config records to accept file-like objects instead of
> strings. That way, users can choose to have snippets inlined (in a
> ‘plain-file’ object) or separate (via ‘local-file’). See for
> example how ‘tor-configuration->torrc’ does it.
Yeah, there is a ‘slurp-file-gexp’ procedure that let’s one read an
extenal file, but using existing APIs like ‘local-file’ is probably a
better idea.
> That’s it. I hope it makes sense to you!
Thank you for the feedback! Great to see that people are using and
enjoying Guix Home :)
> I encourage everyone to give it a spin, fearlessly!
> What I did was (roughly):
>
> git clone https://git.sr.ht/~abcdw/rde
> guix git authenticate \
> "257cebd587b66e4d865b3537a9a88cccd7107c95" \
> "2841 9AC6 5038 7440 C7E9 2FFA 2208 D209 58C1 DEB0" \
> -k origin/keyring
> ./pre-inst-env guix home reconfigure /path/to/home-config.scm
Alternatively, one can also use it as a channel:
(channel
(name 'rde)
(url "https://git.sr.ht/~abcdw/rde"))
(introduction
(make-channel-introduction
"257cebd587b66e4d865b3537a9a88cccd7107c95"
(openpgp-fingerprint
"2841 9AC6 5038 7440 C7E9 2FFA 2208 D209 58C1 DEB0"))))
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 861 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Early feedback on Guix Home
2021-06-24 8:14 ` Xinglu Chen
@ 2021-06-24 15:18 ` Andrew Tropin
2021-06-29 10:33 ` Ludovic Courtès
1 sibling, 0 replies; 18+ messages in thread
From: Andrew Tropin @ 2021-06-24 15:18 UTC (permalink / raw)
To: Xinglu Chen, Ludovic Courtès; +Cc: guix-devel
Xinglu Chen <public@yoctocell.xyz> writes:
> On Wed, Jun 23 2021, Ludovic Courtès wrote:
>
>> Hello!
>>
>> As discussed on IRC a few days ago, I finally gave Guix Home a try and I
>> like it!
>>
>> I thought I’d share my first impressions so we can try and address them
>> in the process of getting it merged.
>>
>> First, I think one of the main reasons why it took me so long to try it
>> out is that I was afraid of what would happen at “activation time” (upon
>> reconfigure). Were my dot files going to be deleted? If so, which ones
>> exactly should I back up? That led me to look more closely at the code
>> to better understand what was going to happen. I found
>> ‘symlink-manager.scm’, which is what I was looking for, but that code is
>> fairly complex.
>>
>> Anyway, I backed up a bunch of files :-) and eventually gave it a try,
>> just to notice that ‘guix home reconfigure’ was very careful about
>> creating backups of any files it was going to overwrite, and it was also
>> explicitly saying what it’s doing. Perfect.
>
> Yeah, the output is pretty verbose, which is good if someone is just
> getting started with it, but there should probably also be an option to
> make it less verbose.
>
>> I see two possible improvements:
>>
>> 1. Make the manual very upfront about that: don’t be afraid, config
>> files are backed up at that location, etc.
>
> Yeah, the manual needs some more work, maybe we should add an ‘migrating
> to Guix Home’ section?
Yup, on my todo list.
>> 2. Review ‘symlink-manager.scm’ and work on simplifying it to make it
>> easier to understand what’s going on.
>>
>> Second, the other thing that stopped me from getting started is the
>> initial config. How could I move from all my undisciplined dotfiles to
>> the single explicit config? Eventually, I found that starting with
>> nothing but packages, ‘home-bash-service-type’, and
>> ‘home-ssh-service-type’ was the most reasonable option to begin with.
>>
>> Unfortunately, even ‘home-ssh-service-type’ was difficult to handle: I
>> have a long ‘.ssh/config’ file and I wasn’t going to turn that into
>> ‘ssh-host’ lines by hand.
>
> There is a ‘home-generic-service’ procedure that allows one to install
> packages in dump a file somewhere in their home directory.
>
> (home-generic-service
> 'ssh-config
> #:packages (list openssh)
> #:files `(("ssh/config"
> ,(local-file "/path/to/some/ssh/config"))))
>
>> Possible actions:
>>
>> 1. Provide a ‘guix home init’ command (or similar) that creates an
>> initial Home config based on existing config.
>
> As Andrew mentioned, I recently added a ‘guix home import’ command, but
> in only imports the installed user packages. Creating configurations
> for the packages would require a lot more work, unless we just read the
> contents of ~/.bashrc and ~/.config/git/config and use
> ‘home-generic-service’ and ‘plain-file’, instead of using
> ‘home-bash-configuration’ and ‘home-git-configuration’.
>
>> 2. In some cases, such as OpenSSH, provide converters from the native
>> format to its Scheme equivalent (maybe?).
>
> That would require a lot of work; we would have to parse all sorts of
> weird configuration formats, not to mention that the upstream
> configuration format can change in the future. It would be nice to
> have, but I don’t think it should be a blocker for merging Guix Home.
>
>> 3. For each service, provide an escape hatch: a way for users to
>> provide a raw config file. We do that for all or most of the Guix
>> System services, and it helps a lot when people are starting from
>> an existing config.
>
> Since we already have the ‘home-generic-service’ helper, I am not sure
> if explicitly providing an escape hatch for every single service is
> worth it. I feel like the point is to use Scheme to configure things,
> and not to just concatenate big opaque strings. People who haven’t
> re-written their configs in Scheme can always use
> ‘home-generic-service’. ‘home-generic-service’ is also useful if say
> the user wants to configure Mpv, but there is no Mpv service in Guix
> Home.
In most cases we allows gexps or/and file-like objects (with
`local-file` and include/load or similar directive provided by target
software it's easy to include/source already existing file), so it's
almost always a way to take current plain-text file configuration and
include or slurp it into configuration home-service. In other words,
there is already an escape hatch for almost every home-service.
>> In terms of API, I noticed that in places such as
>> ‘home-bash-configuration’, config snippets are represented as a list of
>> strings (internally passed to ‘mixed-text-file’). That forces users to
>> mix different languages in their .scm file—e.g., half of my Home config
>> is .bash{rc,_profile} snippets embedded in Scheme strings. That’s
>> inconvenient.
>>
>> Possible action:
>>
>> 1. Change config records to accept file-like objects instead of
>> strings. That way, users can choose to have snippets inlined (in a
>> ‘plain-file’ object) or separate (via ‘local-file’). See for
>> example how ‘tor-configuration->torrc’ does it.
>
> Yeah, there is a ‘slurp-file-gexp’ procedure that let’s one read an
> extenal file, but using existing APIs like ‘local-file’ is probably a
> better idea.
`slurp-file-gexp` is a simple function, which returns a gexp, which
reads file from store and returns it's content (in most cases to be
added to mixed-text-file), it's expected that user will use it with
file-like object provided by local-file or any other way. The final
configuration will look like:
`((key1 . value2)
(key2 . (list of values))
,(slurp-file-gexp (local-file "./file/to/inline"))
(key3 . value3))
It's done this way, because for many apps it's hard to provide a
separate field like in tor-configuration, because it's not clear where
this file should be added (at the end or at the beginning of the file or
inside special section). To make a generic solution we do not provide a
separate field for file-like object, which contains "plain-text"
configuration, but allows to use one of two options above, which allows
to achieve the same, but provides more fleixbility and makes
configurations of home-services more consistent/uniform.
I'll try to write a guideline for defining home-services in the near
future and will try to explain all the patterns and best practices for
service configurations, after that will start adjusting currently
existing services to conform guideline (in case they do not yet).
>> That’s it. I hope it makes sense to you!
>
> Thank you for the feedback! Great to see that people are using and
> enjoying Guix Home :)
>
>> I encourage everyone to give it a spin, fearlessly!
>> What I did was (roughly):
>>
>> git clone https://git.sr.ht/~abcdw/rde
>> guix git authenticate \
>> "257cebd587b66e4d865b3537a9a88cccd7107c95" \
>> "2841 9AC6 5038 7440 C7E9 2FFA 2208 D209 58C1 DEB0" \
>> -k origin/keyring
>> ./pre-inst-env guix home reconfigure /path/to/home-config.scm
>
> Alternatively, one can also use it as a channel:
>
> (channel
> (name 'rde)
> (url "https://git.sr.ht/~abcdw/rde"))
> (introduction
> (make-channel-introduction
> "257cebd587b66e4d865b3537a9a88cccd7107c95"
> (openpgp-fingerprint
> "2841 9AC6 5038 7440 C7E9 2FFA 2208 D209 58C1 DEB0"))))
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Early feedback on Guix Home
2021-06-23 13:15 Early feedback on Guix Home Ludovic Courtès
2021-06-24 5:40 ` Andrew Tropin
2021-06-24 8:14 ` Xinglu Chen
@ 2021-06-24 16:50 ` jbranso
2021-06-24 17:42 ` Andrew Tropin
2 siblings, 1 reply; 18+ messages in thread
From: jbranso @ 2021-06-24 16:50 UTC (permalink / raw)
To: Xinglu Chen, Ludovic Courtès, Andrew Tropin; +Cc: guix-devel
June 24, 2021 8:14 AM, "Xinglu Chen" <public@yoctocell.xyz> wrote:
> On Wed, Jun 23 2021, Ludovic Courtès wrote:
>
> Alternatively, one can also use it as a channel:
>
> (channel
> (name 'rde)
> (url "https://git.sr.ht/~abcdw/rde"))
> (introduction
> (make-channel-introduction
> "257cebd587b66e4d865b3537a9a88cccd7107c95"
> (openpgp-fingerprint
> "2841 9AC6 5038 7440 C7E9 2FFA 2208 D209 58C1 DEB0"))))
Maybe I'm doing it wrong...my ~/.config/guix/channels.scm
;; Add variant packages to those Guix provides.
(append
(list
(channel
(name 'guix-packages)
(url "https://notabug.org/jbranso/guix-packages"))
(channel
(name 'rde)
(url "https://git.sr.ht/~abcdw/rde")
(introduction
(make-channel-introduction
"257cebd587b66e4d865b3537a9a88cccd7107c95"
(openpgp-fingerprint
"2841 9AC6 5038 7440 C7E9 2FFA 2208 D209 58C1 DEB0")))))
%default-channels)
$ guix pull
Updating channel 'guix-packages' from Git repository at
'https://notabug.org/jbranso/guix-packages'...
Updating channel 'rde' from Git repository at 'https://git.sr.ht/~abcdw/rde'...
Updating channel 'guix' from Git repository at 'https://git.savannah.gnu.org/git/guix.git'...
Authenticating channel 'guix', commits 9edb3f6 to 8553f00 (3 new commits)...
Building from these channels:
guix https://git.savannah.gnu.org/git/guix.git 8553f00
rde https://git.sr.ht/~abcdw/rde 6d32c23
guix-packageshttps://notabug.org/jbranso/guix-packages d4b6f35
$ guix build home.scm
$ guix pull
I suppose for now I will use Ludo's suggestion:
git clone https://git.sr.ht/~abcdw/rde
guix git authenticate \
"257cebd587b66e4d865b3537a9a88cccd7107c95" \
"2841 9AC6 5038 7440 C7E9 2FFA 2208 D209 58C1 DEB0" \
-k origin/keyring
./pre-inst-env guix home reconfigure /path/to/home-config.scm
Failed to execute process './pre-inst-env'. Reason:
exec: Exec format error
The file './pre-inst-env' is marked as an executable but could not be run by the operating system.
Eventually I'll be able to get it to work! But I do like the concept!
#+BEGIN_SRC scheme
(use-modules (gnu home)
(gnu home-services)
(gnu home-services ssh)
(gnu home-services shells)
(gnu home-services files)
(gnu services)
(gnu packages admin)
(guix gexp)
(my-home packages) ;; %defines %my-packages
)
(home-environment
(home-directory "/home/joshua")
;; (symlink-name ".guix-home-env")
(packages %my-packages)
(services
(list
(service home-bash-service-type
(home-bash-configuration
(guix-defaults? #t)
(bash-profile '("\ export HISTFILE=$XDG_CACHE_HOME/.bash_history;\n"
"if [[ -z $DISPLAY ]] && [[ $(tty) = /dev/tty3 ]]; then\n"
"# this may fix a bug that I have with termite confusing backspace as space in guix environment\n"
"# export TERM=linux\n"
"# shepherd -c /home/joshua/.config/shepherd/init.scm &\n"
"export MOZ_ENABLE_WAYLAND=1;\n"
"export GUIX_PACKAGE_PATH=/home/joshua/prog/gnu/guix/guix-packages/;\n"
"export XDG_DATA_DIRS=/var/lib/flatpak/exports/share:/home/joshua/.local/share/flatpak/exports/share:$XDG_DATA_DIRS;\n"
"exec dbus-run-session sway;\n"
"fi"
))
(bashrc
'("alias lamora='ssh -p 63355 lamora'"))))
(simple-service 'termite-config
home-files-service-type
(list `("config/termite/config"
,(local-file "config-files/termite-config"
"config"))))
(simple-service 'sway-config
home-files-service-type
(list `("config/sway/config"
,(local-file "config-files/sway-config"
"config"))))
(simple-service 'sway-config
home-files-service-type
(list `("config/sway/status.sh"
,(local-file "config-files/sway-status.sh"
"status.sh"))))
)))
#+END_SRC
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Early feedback on Guix Home
2021-06-24 16:50 ` jbranso
@ 2021-06-24 17:42 ` Andrew Tropin
2021-06-24 18:42 ` Leo Prikler
2021-06-25 4:13 ` Joshua Branson
0 siblings, 2 replies; 18+ messages in thread
From: Andrew Tropin @ 2021-06-24 17:42 UTC (permalink / raw)
To: jbranso, Xinglu Chen, Ludovic Courtès; +Cc: guix-devel
jbranso@dismail.de writes:
> June 24, 2021 8:14 AM, "Xinglu Chen" <public@yoctocell.xyz> wrote:
>
>> On Wed, Jun 23 2021, Ludovic Courtès wrote:
>>
>> Alternatively, one can also use it as a channel:
>>
>> (channel
>> (name 'rde)
>> (url "https://git.sr.ht/~abcdw/rde"))
>> (introduction
>> (make-channel-introduction
>> "257cebd587b66e4d865b3537a9a88cccd7107c95"
>> (openpgp-fingerprint
>> "2841 9AC6 5038 7440 C7E9 2FFA 2208 D209 58C1 DEB0"))))
>
> Maybe I'm doing it wrong...my ~/.config/guix/channels.scm
>
> ;; Add variant packages to those Guix provides.
> (append
> (list
> (channel
> (name 'guix-packages)
> (url "https://notabug.org/jbranso/guix-packages"))
> (channel
> (name 'rde)
> (url "https://git.sr.ht/~abcdw/rde")
> (introduction
> (make-channel-introduction
> "257cebd587b66e4d865b3537a9a88cccd7107c95"
> (openpgp-fingerprint
> "2841 9AC6 5038 7440 C7E9 2FFA 2208 D209 58C1 DEB0")))))
> %default-channels)
>
> $ guix pull
> Updating channel 'guix-packages' from Git repository at
> 'https://notabug.org/jbranso/guix-packages'...
> Updating channel 'rde' from Git repository at 'https://git.sr.ht/~abcdw/rde'...
> Updating channel 'guix' from Git repository at 'https://git.savannah.gnu.org/git/guix.git'...
> Authenticating channel 'guix', commits 9edb3f6 to 8553f00 (3 new commits)...
> Building from these channels:
> guix https://git.savannah.gnu.org/git/guix.git 8553f00
> rde https://git.sr.ht/~abcdw/rde 6d32c23
> guix-packageshttps://notabug.org/jbranso/guix-packages d4b6f35
>
> $ guix build home.scm
It should be `guix home build ./path/to/file.scm`. Also, make sure that
before first run you've set proper GUILE_LOAD_PATH. (See
https://sr.ht/~abcdw/rde/ Guix Home section, Option 2).
It won't be needed, when Guix Home will be upstreamed, but for now it is
necessary, if you want to use it from rde channel.
> $ guix pull
>
> I suppose for now I will use Ludo's suggestion:
>
> git clone https://git.sr.ht/~abcdw/rde
> guix git authenticate \
> "257cebd587b66e4d865b3537a9a88cccd7107c95" \
> "2841 9AC6 5038 7440 C7E9 2FFA 2208 D209 58C1 DEB0" \
> -k origin/keyring
> ./pre-inst-env guix home reconfigure /path/to/home-config.scm
>
> Failed to execute process './pre-inst-env'. Reason:
> exec: Exec format error
> The file './pre-inst-env' is marked as an executable but could not be run by the operating system.
It should work if you have a POSIX-compatible shell, but I also added
shebang to be sure that /bin/sh used. Do git pull inside repository dir
and try again. `./pre-inst-env guix home --help`
Let me know if it still fails.
>
> Eventually I'll be able to get it to work! But I do like the concept!
>
> #+BEGIN_SRC scheme
> (use-modules (gnu home)
> (gnu home-services)
> (gnu home-services ssh)
> (gnu home-services shells)
> (gnu home-services files)
> (gnu services)
> (gnu packages admin)
> (guix gexp)
> (my-home packages) ;; %defines %my-packages
> )
>
>
> (home-environment
> (home-directory "/home/joshua")
home-directory, as well as symlink-name and symlink-path are now
depricated, I'll update the manual soon.
> ;; (symlink-name ".guix-home-env")
> (packages %my-packages)
> (services
> (list
> (service home-bash-service-type
> (home-bash-configuration
> (guix-defaults? #t)
> (bash-profile '("\ export HISTFILE=$XDG_CACHE_HOME/.bash_history;\n"
> "if [[ -z $DISPLAY ]] && [[ $(tty) = /dev/tty3 ]]; then\n"
> "# this may fix a bug that I have with termite confusing backspace as space in guix environment\n"
> "# export TERM=linux\n"
> "# shepherd -c /home/joshua/.config/shepherd/init.scm &\n"
> "export MOZ_ENABLE_WAYLAND=1;\n"
> "export GUIX_PACKAGE_PATH=/home/joshua/prog/gnu/guix/guix-packages/;\n"
> "export XDG_DATA_DIRS=/var/lib/flatpak/exports/share:/home/joshua/.local/share/flatpak/exports/share:$XDG_DATA_DIRS;\n"
> "exec dbus-run-session sway;\n"
> "fi"
> ))
> (bashrc
> '("alias lamora='ssh -p 63355 lamora'"))))
>
> (simple-service 'termite-config
> home-files-service-type
> (list `("config/termite/config"
> ,(local-file "config-files/termite-config"
> "config"))))
>
> (simple-service 'sway-config
> home-files-service-type
> (list `("config/sway/config"
> ,(local-file "config-files/sway-config"
> "config"))))
>
> (simple-service 'sway-config
> home-files-service-type
> (list `("config/sway/status.sh"
> ,(local-file "config-files/sway-status.sh"
> "status.sh"))))
home-files-service-type accepts a list, so you do not need to create so
many service)
>
> )))
>
> #+END_SRC
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Early feedback on Guix Home
2021-06-24 17:42 ` Andrew Tropin
@ 2021-06-24 18:42 ` Leo Prikler
2021-06-25 7:03 ` Andrew Tropin
2021-06-25 4:13 ` Joshua Branson
1 sibling, 1 reply; 18+ messages in thread
From: Leo Prikler @ 2021-06-24 18:42 UTC (permalink / raw)
To: Andrew Tropin, jbranso, Xinglu Chen, Ludovic Courtès; +Cc: guix-devel
Am Donnerstag, den 24.06.2021, 20:42 +0300 schrieb Andrew Tropin:
> It should be `guix home build ./path/to/file.scm`. Also, make sure
> that
> before first run you've set proper GUILE_LOAD_PATH. (See
> https://sr.ht/~abcdw/rde/ Guix Home section, Option 2).
>
> It won't be needed, when Guix Home will be upstreamed, but for now it
> is
> necessary, if you want to use it from rde channel.
This probably comes a little late, but have you considered writing a
small wrapper module, that sets up %load-path and calls guix-home
proper? The Guix package is set up to locate extensions from
share/guix/extensions. I haven't checked if that works for channels,
but you ought to give it a try.
Regards,
Leo
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Early feedback on Guix Home
2021-06-24 17:42 ` Andrew Tropin
2021-06-24 18:42 ` Leo Prikler
@ 2021-06-25 4:13 ` Joshua Branson
2021-06-25 7:17 ` Andrew Tropin
1 sibling, 1 reply; 18+ messages in thread
From: Joshua Branson @ 2021-06-25 4:13 UTC (permalink / raw)
To: Andrew Tropin; +Cc: Xinglu Chen, Ludovic Courtès, guix-devel
Andrew Tropin <andrew@trop.in> writes:
> jbranso@dismail.de writes:
>> $ guix pull
>>
>> I suppose for now I will use Ludo's suggestion:
>>
>> git clone https://git.sr.ht/~abcdw/rde
>> guix git authenticate \
>> "257cebd587b66e4d865b3537a9a88cccd7107c95" \
>> "2841 9AC6 5038 7440 C7E9 2FFA 2208 D209 58C1 DEB0" \
>> -k origin/keyring
>> ./pre-inst-env guix home reconfigure /path/to/home-config.scm
>>
>> Failed to execute process './pre-inst-env'. Reason:
>> exec: Exec format error
>> The file './pre-inst-env' is marked as an executable but could not be run by the operating system.
>
> It should work if you have a POSIX-compatible shell, but I also added
> shebang to be sure that /bin/sh used. Do git pull inside repository dir
> and try again. `./pre-inst-env guix home --help`
>
> Let me know if it still fails.
Totally works now. I was using the fish shell...and I don't believe
the fish shell is a POSIX compatible shell. :) Works fine in bash.
Also thanks for the tips in my initial config!
And I really like the home-keyboard-service-type,
home-files-service-type, and home-state-service-type! I've got a lot of
git repos. It takes me forever to clone those. Do you know if
home-state-service type will help me to automate something like
Git repo "programming" goes here: /home/joshua/prog/
and git repo "cheatsheets" goes here: /home/joshua/prog/cheatsheets/
and git repo "guix-config" goes here: /home/joshua/prog/gnu/guix/guix-config/
and git repo "guix-src" goes here: /home/joshua/prog/gnu/guix/guix-src/
and git repo "guile" goes here: /home/joshua/prog/guile/
and git repr "gnucode.me" goes here: /home/joshua/prog/guile/gnucode.me
I don't that you are curious, but if you are my git repos are on
notabug.org/jbranso.
Thanks! And thanks so much for working on this! And thanks to Ludo for
testing it!
--
Joshua Branson (joshuaBPMan in #guix)
Sent from Emacs and Gnus
https://gnucode.me
https://video.hardlimit.com/accounts/joshua_branson/video-channels
https://propernaming.org
"You can have whatever you want, as long as you help
enough other people get what they want." - Zig Ziglar
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Early feedback on Guix Home
2021-06-24 18:42 ` Leo Prikler
@ 2021-06-25 7:03 ` Andrew Tropin
0 siblings, 0 replies; 18+ messages in thread
From: Andrew Tropin @ 2021-06-25 7:03 UTC (permalink / raw)
To: Leo Prikler, jbranso, Xinglu Chen, Ludovic Courtès; +Cc: guix-devel
Leo Prikler <leo.prikler@student.tugraz.at> writes:
> Am Donnerstag, den 24.06.2021, 20:42 +0300 schrieb Andrew Tropin:
>> It should be `guix home build ./path/to/file.scm`. Also, make sure
>> that
>> before first run you've set proper GUILE_LOAD_PATH. (See
>> https://sr.ht/~abcdw/rde/ Guix Home section, Option 2).
>>
>> It won't be needed, when Guix Home will be upstreamed, but for now it
>> is
>> necessary, if you want to use it from rde channel.
> This probably comes a little late, but have you considered writing a
> small wrapper module, that sets up %load-path and calls guix-home
> proper? The Guix package is set up to locate extensions from
> share/guix/extensions. I haven't checked if that works for channels,
> but you ought to give it a try.
IIRC, Jelle Licht proposed the usage of guix extensions some time ago,
but I decided not to provide such capability.
https://lists.sr.ht/~abcdw/rde-devel/patches/22245
But thank you for reminding, maybe I'll revisit guix extensions in the
future!)
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Early feedback on Guix Home
2021-06-25 4:13 ` Joshua Branson
@ 2021-06-25 7:17 ` Andrew Tropin
2021-06-25 18:08 ` Early feedback on Guix Home and a basic almost complete sway service Joshua Branson
0 siblings, 1 reply; 18+ messages in thread
From: Andrew Tropin @ 2021-06-25 7:17 UTC (permalink / raw)
To: Joshua Branson; +Cc: guix-devel, Xinglu Chen
Joshua Branson <jbranso@dismail.de> writes:
> Andrew Tropin <andrew@trop.in> writes:
>
>> jbranso@dismail.de writes:
>>> $ guix pull
>>>
>>> I suppose for now I will use Ludo's suggestion:
>>>
>>> git clone https://git.sr.ht/~abcdw/rde
>>> guix git authenticate \
>>> "257cebd587b66e4d865b3537a9a88cccd7107c95" \
>>> "2841 9AC6 5038 7440 C7E9 2FFA 2208 D209 58C1 DEB0" \
>>> -k origin/keyring
>>> ./pre-inst-env guix home reconfigure /path/to/home-config.scm
>>>
>>> Failed to execute process './pre-inst-env'. Reason:
>>> exec: Exec format error
>>> The file './pre-inst-env' is marked as an executable but could not be run by the operating system.
>>
>> It should work if you have a POSIX-compatible shell, but I also added
>> shebang to be sure that /bin/sh used. Do git pull inside repository dir
>> and try again. `./pre-inst-env guix home --help`
>>
>> Let me know if it still fails.
>
> Totally works now. I was using the fish shell...and I don't believe
> the fish shell is a POSIX compatible shell. :) Works fine in bash.
>
> Also thanks for the tips in my initial config!
>
> And I really like the home-keyboard-service-type,
> home-files-service-type, and home-state-service-type!
I do care about multi-input-method setups, so it is one of the earliest
home services, also in rde features I provide emacs-input-method
feature, which I find quite useful too:
https://git.sr.ht/~abcdw/rde/tree/262c7fb2db7454fdf4f67bbc53ec0c0306a8fbaf/item/rde/features/emacs.scm#L238
> I've got a lot of
> git repos. It takes me forever to clone those. Do you know if
> home-state-service type will help me to automate something like
>
> Git repo "programming" goes here: /home/joshua/prog/
>
> and git repo "cheatsheets" goes here: /home/joshua/prog/cheatsheets/
>
> and git repo "guix-config" goes here: /home/joshua/prog/gnu/guix/guix-config/
>
> and git repo "guix-src" goes here: /home/joshua/prog/gnu/guix/guix-src/
>
> and git repo "guile" goes here: /home/joshua/prog/guile/
>
> and git repr "gnucode.me" goes here: /home/joshua/prog/guile/gnucode.me
Yes, home-state-service perfectly covers this use case, however I do not
recommend to use it, because probably I'll refactor it quite hard sooner
or later. For now you can consider it to be in alpha state. Usage
example is here:
https://git.sr.ht/~abcdw/rde/tree/262c7fb2db7454fdf4f67bbc53ec0c0306a8fbaf/item/rde/config.scm#L436
>
> I don't that you are curious, but if you are my git repos are on
> notabug.org/jbranso.
Probably I need to add Guix Home configs collection section to rde repo
README to make it easier for people to explore other's configurations)
> Thanks! And thanks so much for working on this! And thanks to Ludo for
> testing it!
>
> --
> Joshua Branson (joshuaBPMan in #guix)
> Sent from Emacs and Gnus
> https://gnucode.me
> https://video.hardlimit.com/accounts/joshua_branson/video-channels
> https://propernaming.org
> "You can have whatever you want, as long as you help
> enough other people get what they want." - Zig Ziglar
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Early feedback on Guix Home and a basic almost complete sway service
2021-06-25 7:17 ` Andrew Tropin
@ 2021-06-25 18:08 ` Joshua Branson
2021-06-30 6:03 ` Andrew Tropin
0 siblings, 1 reply; 18+ messages in thread
From: Joshua Branson @ 2021-06-25 18:08 UTC (permalink / raw)
To: Andrew Tropin; +Cc: Xinglu Chen, guix-devel
Thanks for the help in my home.scm file by the way! I figured since you
guys are writing a sway service, I'd share with you my current code for
a sway service. I think I've got the records type flushed out enough to
build the default sway config file, but I have not finished turning it
into a proper service. Anyway, here's the code if you are interested:
https://notabug.org/jbranso/guix-config/src/master/sway-service.scm
--
Joshua Branson (joshuaBPMan in #guix)
Sent from Emacs and Gnus
https://gnucode.me
https://video.hardlimit.com/accounts/joshua_branson/video-channels
https://propernaming.org
"You can have whatever you want, as long as you help
enough other people get what they want." - Zig Ziglar
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Early feedback on Guix Home
2021-06-24 5:40 ` Andrew Tropin
@ 2021-06-29 10:25 ` Ludovic Courtès
0 siblings, 0 replies; 18+ messages in thread
From: Ludovic Courtès @ 2021-06-29 10:25 UTC (permalink / raw)
To: Andrew Tropin; +Cc: guix-devel, Xinglu Chen
Hi,
Andrew Tropin <andrew@trop.in> skribis:
> Ludovic Courtès <ludo@gnu.org> writes:
[...]
>> I found ‘symlink-manager.scm’, which is what I was looking for, but
>> that code is fairly complex.
>
> Yep, perhaps it a little monstous) Maybe cleaning it up is a good idea
> before sending the patch to guix.
That’d be great.
>> Possible actions:
>>
>> 1. Provide a ‘guix home init’ command (or similar) that creates an
>> initial Home config based on existing config.
>
> Xinglu implemented `guix home import`, which creates a simple
> home-environment configuration, which contains the same packages as ~/.guix-profile
Oh nice. Currently it’s roughly equivalent to ‘guix package
--export-manifest’, which is a good start but it’d be interesting to see
if it can go beyond that.
>> 2. In some cases, such as OpenSSH, provide converters from the native
>> format to its Scheme equivalent (maybe?).
>
> It's a good idea and Xinglu also mentioned it, but I find it to be a lot
> of extra work, so I propose to postpone it until next time, IMO it's
> better to focus on moving Guix Home from rde repo first in the current
> state and add new functionality after that step is done, otherwise we
> can stuck with wip-guix-home for months.
Agreed, I’m not saying this should be done before the merge.
>> 3. For each service, provide an escape hatch: a way for users to
>> provide a raw config file. We do that for all or most of the Guix
>> System services, and it helps a lot when people are starting from
>> an existing config.
>
> We do it as well, the only difference is that we try to utilize target
> program capabilities or slurp-file-gexp helper for that.
>
> The first one means that target configuration format allows to use some
> directive to load the content of another file:
> https://git.sr.ht/~abcdw/rde/tree/master/gnu/home-services/ssh.scm#L190
> https://git.sr.ht/~abcdw/rde/tree/master/gnu/home-services/emacs.scm#L200
Oh great. Somehow I had overlooked these.
IWBN to have prominent examples of these in the manual—e.g., SSH
configuration that includes a hand-written .ssh/config file.
>> In terms of API, I noticed that in places such as
>> ‘home-bash-configuration’, config snippets are represented as a list of
>> strings (internally passed to ‘mixed-text-file’). That forces users to
>> mix different languages in their .scm file—e.g., half of my Home config
>> is .bash{rc,_profile} snippets embedded in Scheme strings. That’s
>> inconvenient.
>
> Can you elaborate on that please, ideally with some examples.
Currently I have this:
--8<---------------cut here---------------start------------->8---
(service home-bash-service-type
(home-bash-configuration
(guix-defaults? #t)
(bash-profile '("\
[...]
"))
(bashrc '("
[...]
"))))
--8<---------------cut here---------------end--------------->8---
where I omitted ~30 lines of shell snippets embedded in Scheme strings.
It’d be more convenient if I could instead write:
(home-bash-configuration
(bash-profile (local-file "./bash_profile"))
(bashrc (local-file "./bashrc")))
Thanks,
Ludo’.
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Early feedback on Guix Home
2021-06-24 8:14 ` Xinglu Chen
2021-06-24 15:18 ` Andrew Tropin
@ 2021-06-29 10:33 ` Ludovic Courtès
2021-06-30 6:10 ` Andrew Tropin
2021-07-04 13:21 ` Xinglu Chen
1 sibling, 2 replies; 18+ messages in thread
From: Ludovic Courtès @ 2021-06-29 10:33 UTC (permalink / raw)
To: Xinglu Chen; +Cc: guix-devel, Andrew Tropin
Hi,
Xinglu Chen <public@yoctocell.xyz> skribis:
> On Wed, Jun 23 2021, Ludovic Courtès wrote:
[...]
>> Anyway, I backed up a bunch of files :-) and eventually gave it a try,
>> just to notice that ‘guix home reconfigure’ was very careful about
>> creating backups of any files it was going to overwrite, and it was also
>> explicitly saying what it’s doing. Perfect.
>
> Yeah, the output is pretty verbose, which is good if someone is just
> getting started with it, but there should probably also be an option to
> make it less verbose.
Yes. Also, we’ll have to make sure it’s internationalized.
>> I see two possible improvements:
>>
>> 1. Make the manual very upfront about that: don’t be afraid, config
>> files are backed up at that location, etc.
>
> Yeah, the manual needs some more work, maybe we should add an ‘migrating
> to Guix Home’ section?
That’s a good idea.
>> 2. Review ‘symlink-manager.scm’ and work on simplifying it to make it
>> easier to understand what’s going on.
>>
>> Second, the other thing that stopped me from getting started is the
>> initial config. How could I move from all my undisciplined dotfiles to
>> the single explicit config? Eventually, I found that starting with
>> nothing but packages, ‘home-bash-service-type’, and
>> ‘home-ssh-service-type’ was the most reasonable option to begin with.
>>
>> Unfortunately, even ‘home-ssh-service-type’ was difficult to handle: I
>> have a long ‘.ssh/config’ file and I wasn’t going to turn that into
>> ‘ssh-host’ lines by hand.
>
> There is a ‘home-generic-service’ procedure that allows one to install
> packages in dump a file somewhere in their home directory.
>
> (home-generic-service
> 'ssh-config
> #:packages (list openssh)
> #:files `(("ssh/config"
> ,(local-file "/path/to/some/ssh/config"))))
Neat.
>> Possible actions:
>>
>> 1. Provide a ‘guix home init’ command (or similar) that creates an
>> initial Home config based on existing config.
>
> As Andrew mentioned, I recently added a ‘guix home import’ command, but
> in only imports the installed user packages. Creating configurations
> for the packages would require a lot more work, unless we just read the
> contents of ~/.bashrc and ~/.config/git/config and use
> ‘home-generic-service’ and ‘plain-file’, instead of using
> ‘home-bash-configuration’ and ‘home-git-configuration’.
For SSH, generating something like:
(service home-ssh-service-type
(home-ssh-configuration
(toplevel-options
`((include . ,(local-file "ssh.conf"))))))
should be doable. But yeah, we’ll have to see on a case-by-case basis
what can be achieved.
>> 2. In some cases, such as OpenSSH, provide converters from the native
>> format to its Scheme equivalent (maybe?).
>
> That would require a lot of work; we would have to parse all sorts of
> weird configuration formats, not to mention that the upstream
> configuration format can change in the future. It would be nice to
> have, but I don’t think it should be a blocker for merging Guix Home.
Agreed.
>> 3. For each service, provide an escape hatch: a way for users to
>> provide a raw config file. We do that for all or most of the Guix
>> System services, and it helps a lot when people are starting from
>> an existing config.
>
> Since we already have the ‘home-generic-service’ helper, I am not sure
> if explicitly providing an escape hatch for every single service is
> worth it. I feel like the point is to use Scheme to configure things,
> and not to just concatenate big opaque strings. People who haven’t
> re-written their configs in Scheme can always use
> ‘home-generic-service’. ‘home-generic-service’ is also useful if say
> the user wants to configure Mpv, but there is no Mpv service in Guix
> Home.
Yeah, ‘home-generic-service’ helps a lot, I didn’t know about it.
Overall, I think what I’m saying is that we should offer a smooth and
gradual transition for enthusiasts (like me!) who’re willing to switch
but can’t just be expected to rewrite all their config at once.
>> Possible action:
>>
>> 1. Change config records to accept file-like objects instead of
>> strings. That way, users can choose to have snippets inlined (in a
>> ‘plain-file’ object) or separate (via ‘local-file’). See for
>> example how ‘tor-configuration->torrc’ does it.
>
> Yeah, there is a ‘slurp-file-gexp’ procedure that let’s one read an
> extenal file, but using existing APIs like ‘local-file’ is probably a
> better idea.
Yes, it feels more natural. Also, ‘slurp-file-gexp’ returns a gexp (a
code snippet), but as a user you don’t know where that snippet is going
to be inserted; it may not work in some contexts.
Thanks!
Ludo’.
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Early feedback on Guix Home and a basic almost complete sway service
2021-06-25 18:08 ` Early feedback on Guix Home and a basic almost complete sway service Joshua Branson
@ 2021-06-30 6:03 ` Andrew Tropin
0 siblings, 0 replies; 18+ messages in thread
From: Andrew Tropin @ 2021-06-30 6:03 UTC (permalink / raw)
To: Joshua Branson; +Cc: guix-devel, Xinglu Chen
Joshua Branson <jbranso@dismail.de> writes:
> Thanks for the help in my home.scm file by the way! I figured since you
> guys are writing a sway service, I'd share with you my current code for
> a sway service. I think I've got the records type flushed out enough to
> build the default sway config file, but I have not finished turning it
> into a proper service. Anyway, here's the code if you are interested:
>
> https://notabug.org/jbranso/guix-config/src/master/sway-service.scm
Very cool! Checked the source code briefly, I'll add the link to your
implementation to the Guix Home's source code and will revisit it before
sending sway home-service patch to guix.
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Early feedback on Guix Home
2021-06-29 10:33 ` Ludovic Courtès
@ 2021-06-30 6:10 ` Andrew Tropin
2021-07-10 14:18 ` Ludovic Courtès
2021-07-04 13:21 ` Xinglu Chen
1 sibling, 1 reply; 18+ messages in thread
From: Andrew Tropin @ 2021-06-30 6:10 UTC (permalink / raw)
To: Ludovic Courtès, Xinglu Chen; +Cc: guix-devel
Ludovic Courtès <ludo@gnu.org> writes:
> Hi,
>
> Xinglu Chen <public@yoctocell.xyz> skribis:
>
>> On Wed, Jun 23 2021, Ludovic Courtès wrote:
>
> [...]
>
>>> Anyway, I backed up a bunch of files :-) and eventually gave it a try,
>>> just to notice that ‘guix home reconfigure’ was very careful about
>>> creating backups of any files it was going to overwrite, and it was also
>>> explicitly saying what it’s doing. Perfect.
>>
>> Yeah, the output is pretty verbose, which is good if someone is just
>> getting started with it, but there should probably also be an option to
>> make it less verbose.
>
> Yes. Also, we’ll have to make sure it’s internationalized.
>
>>> I see two possible improvements:
>>>
>>> 1. Make the manual very upfront about that: don’t be afraid, config
>>> files are backed up at that location, etc.
>>
>> Yeah, the manual needs some more work, maybe we should add an ‘migrating
>> to Guix Home’ section?
>
> That’s a good idea.
>
>>> 2. Review ‘symlink-manager.scm’ and work on simplifying it to make it
>>> easier to understand what’s going on.
>>>
>>> Second, the other thing that stopped me from getting started is the
>>> initial config. How could I move from all my undisciplined dotfiles to
>>> the single explicit config? Eventually, I found that starting with
>>> nothing but packages, ‘home-bash-service-type’, and
>>> ‘home-ssh-service-type’ was the most reasonable option to begin with.
>>>
>>> Unfortunately, even ‘home-ssh-service-type’ was difficult to handle: I
>>> have a long ‘.ssh/config’ file and I wasn’t going to turn that into
>>> ‘ssh-host’ lines by hand.
>>
>> There is a ‘home-generic-service’ procedure that allows one to install
>> packages in dump a file somewhere in their home directory.
>>
>> (home-generic-service
>> 'ssh-config
>> #:packages (list openssh)
>> #:files `(("ssh/config"
>> ,(local-file "/path/to/some/ssh/config"))))
>
> Neat.
>
>>> Possible actions:
>>>
>>> 1. Provide a ‘guix home init’ command (or similar) that creates an
>>> initial Home config based on existing config.
>>
>> As Andrew mentioned, I recently added a ‘guix home import’ command, but
>> in only imports the installed user packages. Creating configurations
>> for the packages would require a lot more work, unless we just read the
>> contents of ~/.bashrc and ~/.config/git/config and use
>> ‘home-generic-service’ and ‘plain-file’, instead of using
>> ‘home-bash-configuration’ and ‘home-git-configuration’.
>
> For SSH, generating something like:
>
> (service home-ssh-service-type
> (home-ssh-configuration
> (toplevel-options
> `((include . ,(local-file "ssh.conf"))))))
>
> should be doable. But yeah, we’ll have to see on a case-by-case basis
> what can be achieved.
>
>>> 2. In some cases, such as OpenSSH, provide converters from the native
>>> format to its Scheme equivalent (maybe?).
>>
>> That would require a lot of work; we would have to parse all sorts of
>> weird configuration formats, not to mention that the upstream
>> configuration format can change in the future. It would be nice to
>> have, but I don’t think it should be a blocker for merging Guix Home.
>
> Agreed.
>
>>> 3. For each service, provide an escape hatch: a way for users to
>>> provide a raw config file. We do that for all or most of the Guix
>>> System services, and it helps a lot when people are starting from
>>> an existing config.
>>
>> Since we already have the ‘home-generic-service’ helper, I am not sure
>> if explicitly providing an escape hatch for every single service is
>> worth it. I feel like the point is to use Scheme to configure things,
>> and not to just concatenate big opaque strings. People who haven’t
>> re-written their configs in Scheme can always use
>> ‘home-generic-service’. ‘home-generic-service’ is also useful if say
>> the user wants to configure Mpv, but there is no Mpv service in Guix
>> Home.
>
> Yeah, ‘home-generic-service’ helps a lot, I didn’t know about it.
Will mention it in the manual.
> Overall, I think what I’m saying is that we should offer a smooth and
> gradual transition for enthusiasts (like me!) who’re willing to switch
> but can’t just be expected to rewrite all their config at once.
>
>>> Possible action:
>>>
>>> 1. Change config records to accept file-like objects instead of
>>> strings. That way, users can choose to have snippets inlined (in a
>>> ‘plain-file’ object) or separate (via ‘local-file’). See for
>>> example how ‘tor-configuration->torrc’ does it.
>>
>> Yeah, there is a ‘slurp-file-gexp’ procedure that let’s one read an
>> extenal file, but using existing APIs like ‘local-file’ is probably a
>> better idea.
>
> Yes, it feels more natural. Also, ‘slurp-file-gexp’ returns a gexp (a
> code snippet), but as a user you don’t know where that snippet is going
> to be inserted; it may not work in some contexts.
Acually, the idea behind `slurp-file-gexp` is that you always know where
it will be inserted, because it will be inside the specific section of
the configuration. Take a look at emacs home-service example:
https://git.sr.ht/~abcdw/rde/tree/master/item/gnu/home-services/emacs.scm#L91
I'll explain it in more details in the manual.
Correct me, if I missunderstood your point.
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Early feedback on Guix Home
2021-06-29 10:33 ` Ludovic Courtès
2021-06-30 6:10 ` Andrew Tropin
@ 2021-07-04 13:21 ` Xinglu Chen
1 sibling, 0 replies; 18+ messages in thread
From: Xinglu Chen @ 2021-07-04 13:21 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: guix-devel, Andrew Tropin
[-- Attachment #1: Type: text/plain, Size: 1738 bytes --]
On Tue, Jun 29 2021, Ludovic Courtès wrote:
> Hi,
>
> Xinglu Chen <public@yoctocell.xyz> skribis:
>
>> On Wed, Jun 23 2021, Ludovic Courtès wrote:
>
> [...]
>
>>> Anyway, I backed up a bunch of files :-) and eventually gave it a try,
>>> just to notice that ‘guix home reconfigure’ was very careful about
>>> creating backups of any files it was going to overwrite, and it was also
>>> explicitly saying what it’s doing. Perfect.
>>
>> Yeah, the output is pretty verbose, which is good if someone is just
>> getting started with it, but there should probably also be an option to
>> make it less verbose.
>
> Yes. Also, we’ll have to make sure it’s internationalized.
How would we do that? Would we use (G_ ...) or something?
>>> Possible actions:
>>>
>>> 1. Provide a ‘guix home init’ command (or similar) that creates an
>>> initial Home config based on existing config.
>>
>> As Andrew mentioned, I recently added a ‘guix home import’ command, but
>> in only imports the installed user packages. Creating configurations
>> for the packages would require a lot more work, unless we just read the
>> contents of ~/.bashrc and ~/.config/git/config and use
>> ‘home-generic-service’ and ‘plain-file’, instead of using
>> ‘home-bash-configuration’ and ‘home-git-configuration’.
>
> For SSH, generating something like:
>
> (service home-ssh-service-type
> (home-ssh-configuration
> (toplevel-options
> `((include . ,(local-file "ssh.conf"))))))
>
> should be doable. But yeah, we’ll have to see on a case-by-case basis
> what can be achieved.
Yeah, I will look more into adding something like this.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 861 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Early feedback on Guix Home
2021-06-30 6:10 ` Andrew Tropin
@ 2021-07-10 14:18 ` Ludovic Courtès
2021-07-20 11:01 ` Andrew Tropin
0 siblings, 1 reply; 18+ messages in thread
From: Ludovic Courtès @ 2021-07-10 14:18 UTC (permalink / raw)
To: Andrew Tropin; +Cc: guix-devel, Xinglu Chen
Hi,
(Sorry for the late reply…)
Andrew Tropin <andrew@trop.in> skribis:
> Ludovic Courtès <ludo@gnu.org> writes:
[...]
>>>> Possible action:
>>>>
>>>> 1. Change config records to accept file-like objects instead of
>>>> strings. That way, users can choose to have snippets inlined (in a
>>>> ‘plain-file’ object) or separate (via ‘local-file’). See for
>>>> example how ‘tor-configuration->torrc’ does it.
>>>
>>> Yeah, there is a ‘slurp-file-gexp’ procedure that let’s one read an
>>> extenal file, but using existing APIs like ‘local-file’ is probably a
>>> better idea.
>>
>> Yes, it feels more natural. Also, ‘slurp-file-gexp’ returns a gexp (a
>> code snippet), but as a user you don’t know where that snippet is going
>> to be inserted; it may not work in some contexts.
>
> Acually, the idea behind `slurp-file-gexp` is that you always know where
> it will be inserted, because it will be inside the specific section of
> the configuration. Take a look at emacs home-service example:
> https://git.sr.ht/~abcdw/rde/tree/master/item/gnu/home-services/emacs.scm#L91
What I mean is that, in a general sense, one cannot know whether the
gexp will be inserted in a place where it’s “valid”. Consider the
following examples, where the gexp is meant to be inserted in lieu of
“PLACEHOLDER”:
#~(list '(#$PLACEHOLDER)) ;it’s quoted
#~(let ((call-with-input-file (const #f)))
#$PLACEHOLDER)
These are “hygiene” problems discussed in the “Code Staging in GNU Guix”
paper.
All this to say that, from an API viewpoint, I think it’s (1) more
robust, as I wrote, and (2) clearer to expect file-like objects in such
places. It’s clearer because users can be expected to have an
understanding of what ‘local-file’ does, whereas ‘slurp-file-gexp’ is
more involved.
I hope this clarifies what I had in mind!
Ludo’.
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Early feedback on Guix Home
2021-07-10 14:18 ` Ludovic Courtès
@ 2021-07-20 11:01 ` Andrew Tropin
0 siblings, 0 replies; 18+ messages in thread
From: Andrew Tropin @ 2021-07-20 11:01 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: guix-devel, Xinglu Chen
[-- Attachment #1: Type: text/plain, Size: 2351 bytes --]
Ludovic Courtès <ludo@gnu.org> writes:
> Hi,
>
> (Sorry for the late reply…)
>
> Andrew Tropin <andrew@trop.in> skribis:
>
>> Ludovic Courtès <ludo@gnu.org> writes:
>
> [...]
>
>>>>> Possible action:
>>>>>
>>>>> 1. Change config records to accept file-like objects instead of
>>>>> strings. That way, users can choose to have snippets inlined (in a
>>>>> ‘plain-file’ object) or separate (via ‘local-file’). See for
>>>>> example how ‘tor-configuration->torrc’ does it.
>>>>
>>>> Yeah, there is a ‘slurp-file-gexp’ procedure that let’s one read an
>>>> extenal file, but using existing APIs like ‘local-file’ is probably a
>>>> better idea.
>>>
>>> Yes, it feels more natural. Also, ‘slurp-file-gexp’ returns a gexp (a
>>> code snippet), but as a user you don’t know where that snippet is going
>>> to be inserted; it may not work in some contexts.
>>
>> Acually, the idea behind `slurp-file-gexp` is that you always know where
>> it will be inserted, because it will be inside the specific section of
>> the configuration. Take a look at emacs home-service example:
>> https://git.sr.ht/~abcdw/rde/tree/master/item/gnu/home-services/emacs.scm#L91
>
> What I mean is that, in a general sense, one cannot know whether the
> gexp will be inserted in a place where it’s “valid”. Consider the
> following examples, where the gexp is meant to be inserted in lieu of
> “PLACEHOLDER”:
>
> #~(list '(#$PLACEHOLDER)) ;it’s quoted
>
> #~(let ((call-with-input-file (const #f)))
> #$PLACEHOLDER)
>
> These are “hygiene” problems discussed in the “Code Staging in GNU Guix”
> paper.
>
> All this to say that, from an API viewpoint, I think it’s (1) more
> robust, as I wrote, and (2) clearer to expect file-like objects in such
> places. It’s clearer because users can be expected to have an
> understanding of what ‘local-file’ does, whereas ‘slurp-file-gexp’ is
> more involved.
>
> I hope this clarifies what I had in mind!
>
> Ludo’.
Got the problem. Will take a closer look, when will be preparing this
code for upstreaming and maybe will reconsider the approach or will rise
another discussion on that. Also, need to schedule a reading of your
paper on gexps)
Thank you for clarification!)
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 853 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2021-07-20 19:06 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-06-23 13:15 Early feedback on Guix Home Ludovic Courtès
2021-06-24 5:40 ` Andrew Tropin
2021-06-29 10:25 ` Ludovic Courtès
2021-06-24 8:14 ` Xinglu Chen
2021-06-24 15:18 ` Andrew Tropin
2021-06-29 10:33 ` Ludovic Courtès
2021-06-30 6:10 ` Andrew Tropin
2021-07-10 14:18 ` Ludovic Courtès
2021-07-20 11:01 ` Andrew Tropin
2021-07-04 13:21 ` Xinglu Chen
2021-06-24 16:50 ` jbranso
2021-06-24 17:42 ` Andrew Tropin
2021-06-24 18:42 ` Leo Prikler
2021-06-25 7:03 ` Andrew Tropin
2021-06-25 4:13 ` Joshua Branson
2021-06-25 7:17 ` Andrew Tropin
2021-06-25 18:08 ` Early feedback on Guix Home and a basic almost complete sway service Joshua Branson
2021-06-30 6:03 ` Andrew Tropin
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).