diff --git a/docs/man-home-manager.xml b/docs/man-home-manager.xml index 49c8ac61..71c34b0f 100644 --- a/docs/man-home-manager.xml +++ b/docs/man-home-manager.xml @@ -17,6 +17,10 @@ build + + init --switch dir + + instantiate @@ -218,6 +222,35 @@ + + + [] [dir] + + + + Generates an initial home.nix file for the + current user. If Nix flakes are enabled, then this command also + generates a flake.nix file. + + + If a path dir is given then the + configuration will be generated in that directory. Otherwise, the + configuration will be generated in + ~/.config/home-manager. The output directory will + be created if it does not exist. + + + If the option is given, then the generated + configuration is activated. + + + Note, this command will not overwrite any existing files. It is + therefore safe to initialize a configuration, edit it, and then re-run + the command with + enabled to activate the configuration. + + + diff --git a/docs/nix-flakes.adoc b/docs/nix-flakes.adoc index 73556d93..ded9e750 100644 --- a/docs/nix-flakes.adoc +++ b/docs/nix-flakes.adoc @@ -70,6 +70,71 @@ writing a Home Manager configuration. [[sec-flakes-standalone]] === Standalone setup +The installation procedure for the standalone version of Home Manager +is currently different for the unstable and stable branch. +Therefore, if you are tracking the Nixpkgs or NixOS unstable please go to +<>, +and if you track Nixpkgs or NixOS version 22.11 please go to +<>. + +[[sec-flakes-standalone-unstable]] +==== Unstable Version + +To prepare an initial Home Manager configuration for your logged in user, +you can run the Home Manager `init` command directly from its flake. + +For example, to generate and activate a basic configuration run the command + +[source,console] +$ nix run home-manager/master -- init --switch + +This will generate a `flake.nix` and a `home.nix` file in +`~/.config/home-manager`, creating the directory if it does not exist. + +If you omit the `--switch` option then the activation will not happen. +This is useful if you want to inspect and edit the configuration before activating it. + +[source,console] +---- +$ nix run home-manager/master -- init +$ # Edit files in ~/.config/home-manager +$ nix run home-manager/master -- init --switch +---- + +After the initial activation has completed successfully then building +and activating your flake-based configuration is as simple as + +[source,console] +$ home-manager switch + +It is possible to override the default configuration directory, if you want. +For example, + +[source,console] +---- +$ nix run home-manager/master -- init --switch ~/hmconf +$ # And after the initial activation. +$ home-manager switch --flake ~/hmconf +---- + +[NOTE] +==== +The flake inputs are not automatically updated by Home Manager. +You need to use the standard `nix flake update` command for that. + +If you only want to update a single flake input, +then the command `nix flake lock --update-input ` can be used. + +You can also pass flake-related options +such as `--recreate-lock-file` or `--update-input ` +to `home-manager` when building or switching, +and these options will be forwarded to `nix build`. +See the {nixos-wiki-flakes}[NixOS Wiki page] for details. +==== + +[[sec-flakes-standalone-stable]] +==== Version 22.11 + 1. Set up a flake with a `flake.nix` as follows: + [source,nix] @@ -79,9 +144,9 @@ writing a Home Manager configuration. inputs = { # Specify the source of Home Manager and Nixpkgs. - nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-22.11"; home-manager = { - url = "github:nix-community/home-manager"; + url = "github:nix-community/home-manager/release-22.11"; inputs.nixpkgs.follows = "nixpkgs"; }; }; @@ -109,16 +174,10 @@ writing a Home Manager configuration. + [NOTE] ==== -* The above example tracks the master branch of Home Manager -and nixos-unstable branch of Nixpkgs. -If you would like to use the `release-22.11` branch, -change the `home-manager` input url to `github:nix-community/home-manager/release-22.11` -and `nixpkgs` url to `github:NixOS/nixpkgs/nixos-22.11`. - -* The Home Manager library is exported by the flake under -`lib.hm`. +* The Home Manager library is exported by the flake under `lib.hm`. * You can use the above `flake.nix` as a template in `~/.config/home-manager` by ++ [source,console] $ nix flake new ~/.config/home-manager -t github:nix-community/home-manager ==== diff --git a/docs/release-notes/rl-2305.adoc b/docs/release-notes/rl-2305.adoc index b2156e9c..5df99d17 100644 --- a/docs/release-notes/rl-2305.adoc +++ b/docs/release-notes/rl-2305.adoc @@ -30,6 +30,14 @@ The old location will continue to work but using it will trigger a warning messa We changed the default configuration location to avoid confusion about which files belong to Home Manager and which belong to Nixpkgs. +* The `home-manager` tool now offers an `init` command. +This command can be used to generate an initial Home Manager configuration, +and optionally also activate it. +The recommended installation method for a standalone Home Manager setup +with Nix flakes uses this new command. +The standard installation method remains the same but uses the new command internally. +See <> for more. + [[sec-release-23.05-state-version-changes]] === State Version Changes @@ -45,5 +53,5 @@ These changes are only active if the `home.stateVersion` option is set to "23.05 - <> -- + -now default to `true` which is consistent with the default values -for those options used by `i3` and `sway`. +now default to `true` which is consistent with the default values for +those options used by `i3` and `sway`. diff --git a/home-manager/completion.bash b/home-manager/completion.bash index 152f8c32..de780451 100644 --- a/home-manager/completion.bash +++ b/home-manager/completion.bash @@ -276,19 +276,26 @@ _home-manager_xdg-get-cache-home () { ################################################## +_hm_subcommands=( "help" "edit" "option" "build" "init" "instantiate" "switch" "generations" "remove-generations" "expire-generations" "packages" "news" "uninstall" ) +declare -ra _hm_subcommands + +# Finds the active sub-command, if any. +_home-manager_subcommand() { + local subcommand='' i= + for ((i = 1; i < ${#COMP_WORDS[@]}; i++)); do + local word="${COMP_WORDS[i]}" + if [[ " ${_hm_subcommands[*]} " == *" ${word} "* ]]; then + subcommand="$word" + break + fi + done + + echo "$subcommand" +} + # shellcheck disable=SC2207 _home-manager_completions () { - - #--------------------------# - - local Subcommands - Subcommands=( "help" "edit" "option" "build" "instantiate" "switch" "generations" "remove-generations" "expire-generations" "packages" "news" "uninstall" ) - - # ^ « home-manager »'s subcommands. - - #--------------------------# - local Options Options=( "-f" "--file" "-b" "-A" "-I" "-h" "--help" "-n" "--dry-run" "-v" \ "--verbose" "--cores" "--debug" "--impure" "--keep-failed" \ @@ -322,39 +329,53 @@ _home-manager_completions () # PreviousWord="-f" # CurrentWord="./" + local CurrentCommand + CurrentCommand="$(_home-manager_subcommand)" + #--------------------------# COMPREPLY=() - case "$PreviousWord" in - - "-f"|"--file") - - COMPREPLY+=( $( compgen -A file -- "$CurrentWord") ) - ;; - - "-I") + case "$CurrentCommand" in + "init") + COMPREPLY+=( $( compgen -W "--switch" -- "$CurrentWord" ) ) COMPREPLY+=( $( compgen -A directory -- "$CurrentWord") ) ;; - "-A") - - # shellcheck disable=SC2119 - COMPREPLY+=( $( compgen -W "$(_home-manager_list-nix-attributes)" -- "$CurrentWord") ) - ;; - "remove-generations") COMPREPLY+=( $( compgen -W "$(_home-manager_list-generation-identifiers)" -- "$CurrentWord" ) ) ;; *) + case "$PreviousWord" in - COMPREPLY+=( $( compgen -W "${Subcommands[*]}" -- "$CurrentWord" ) ) - COMPREPLY+=( $( compgen -W "${Options[*]}" -- "$CurrentWord" ) ) + "-f"|"--file") + + COMPREPLY+=( $( compgen -A file -- "$CurrentWord") ) + ;; + + "-I") + + COMPREPLY+=( $( compgen -A directory -- "$CurrentWord") ) + ;; + + "-A") + + # shellcheck disable=SC2119 + COMPREPLY+=( $( compgen -W "$(_home-manager_list-nix-attributes)" -- "$CurrentWord") ) + ;; + *) + + if [[ ! $CurrentCommand ]]; then + COMPREPLY+=( $( compgen -W "${_hm_subcommands[*]}" -- "$CurrentWord" ) ) + fi + COMPREPLY+=( $( compgen -W "${Options[*]}" -- "$CurrentWord" ) ) + ;; + + esac ;; - esac #--------------------------# diff --git a/home-manager/completion.zsh b/home-manager/completion.zsh index c5d3b493..52bcce90 100644 --- a/home-manager/completion.zsh +++ b/home-manager/completion.zsh @@ -35,6 +35,7 @@ case "$state" in 'edit[edit]' \ 'option[inspect option]' \ 'build[build]' \ + 'init[init]' \ 'switch[switch]' \ 'generations[list generations]' \ 'remove-generations[remove generations]' \ @@ -69,6 +70,11 @@ case "$state" in '--experimental-features[set experimental Nix features]:VALUE:()' \ '--extra-experimental-features:[append to experimental Nix features]:VALUE:()' ;; + init) + _arguments \ + '--switch[switch]' \ + ':PATH:_files -/' + ;; esac esac diff --git a/home-manager/home-manager b/home-manager/home-manager index eaa1287d..fd8ae718 100644 --- a/home-manager/home-manager +++ b/home-manager/home-manager @@ -50,6 +50,15 @@ function setWorkDir() { fi } +# Checks whether the 'flakes' and 'nix-command' Nix options are enabled. +function hasFlakeSupport() { + type -p nix > /dev/null \ + && nix show-config \ + | grep experimental-features \ + | grep flakes \ + | grep -q nix-command +} + # Attempts to set the HOME_MANAGER_CONFIG global variable. # # If no configuration file can be found then this function will print @@ -207,6 +216,174 @@ function doInspectOption() { "${PASSTHROUGH_OPTS[@]}" } +function doInit() { + # The directory where we should place the initial configuration. + local confDir + + # Whether we should immediate activate the configuration. + local switch + + # Whether we should create a flake file. + local withFlake + + if hasFlakeSupport; then + withFlake=1 + fi + + while (( $# > 0 )); do + local opt="$1" + shift + + case $opt in + --no-flake) + unset withFlake + ;; + --switch) + switch=1 + ;; + -*) + _iError "%s: unknown option '%s'" "$0" "$opt" >&2 + exit 1 + ;; + *) + if [[ -v confDir ]]; then + _i "Run '%s --help' for usage help" "$0" >&2 + exit 1 + else + confDir="$opt" + fi + ;; + esac + done + + if [[ ! -v confDir ]]; then + confDir="${XDG_CONFIG_HOME:-$HOME/.config}/home-manager" + fi + + if [[ ! -e $confDir ]]; then + mkdir -p "$confDir" + fi + + if [[ ! -d $confDir ]]; then + _iError "%s: unknown option '%s'" "$0" "$opt" >&2 + exit 1 + fi + + local confFile="$confDir/home.nix" + local flakeFile="$confDir/flake.nix" + + if [[ -e $confFile ]]; then + _i 'The file %s already exists, leaving it unchanged...' "$confFile" + else + _i 'Creating %s...' "$confFile" + local nl=$'\n' + local xdgVars="" + if [[ -v XDG_CACHE_HOME && $XDG_CACHE_HOME != "$HOME/.cache" ]]; then + xdgVars="$xdgVars xdg.cacheHome = \"$XDG_CACHE_HOME\";$nl" + fi + if [[ -v XDG_CONFIG_HOME && $XDG_CONFIG_HOME != "$HOME/.config" ]]; then + xdgVars="$xdgVars xdg.configHome = \"$XDG_CONFIG_HOME\";$nl" + fi + if [[ -v XDG_DATA_HOME && $XDG_DATA_HOME != "$HOME/.local/share" ]]; then + xdgVars="$xdgVars xdg.dataHome = \"$XDG_DATA_HOME\";$nl" + fi + if [[ -v XDG_STATE_HOME && $XDG_STATE_HOME != "$HOME/.local/state" ]]; then + xdgVars="$xdgVars xdg.stateHome = \"$XDG_STATE_HOME\";$nl" + fi + + mkdir -p "$confDir" + cat > "$confFile" < "$flakeFile" < $confFile <\n" "Language-Team: LANGUAGE \n" @@ -18,128 +18,50 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: home-manager/home-manager:62 +#: home-manager/home-manager:71 msgid "No configuration file found at %s" msgstr "" #. translators: The first '%s' specifier will be replaced by either #. 'home.nix' or 'flake.nix'. -#: home-manager/home-manager:79 home-manager/home-manager:83 -#: home-manager/home-manager:138 +#: home-manager/home-manager:88 home-manager/home-manager:92 +#: home-manager/home-manager:147 msgid "" "Keeping your Home Manager %s in %s is deprecated,\n" "please move it to %s" msgstr "" -#: home-manager/home-manager:90 +#: home-manager/home-manager:99 msgid "No configuration file found. Please create one at %s" msgstr "" -#: home-manager/home-manager:174 +#: home-manager/home-manager:183 msgid "Can't inspect options of a flake configuration" msgstr "" -#: home-manager/home-manager:213 -msgid "Can't instantiate a flake configuration" -msgstr "" - -#: home-manager/home-manager:286 -msgid "" -"There is %d unread and relevant news item.\n" -"Read it by running the command \"%s news\"." -msgid_plural "" -"There are %d unread and relevant news items.\n" -"Read them by running the command \"%s news\"." -msgstr[0] "" -msgstr[1] "" - -#: home-manager/home-manager:300 -msgid "Unknown \"news.display\" setting \"%s\"." -msgstr "" - -#: home-manager/home-manager:307 -#, sh-format -msgid "Please set the $EDITOR environment variable" -msgstr "" - -#: home-manager/home-manager:322 -msgid "Cannot run build in read-only directory" -msgstr "" - -#: home-manager/home-manager:406 -msgid "No generation with ID %s" -msgstr "" - -#: home-manager/home-manager:408 -msgid "Cannot remove the current generation %s" -msgstr "" - -#: home-manager/home-manager:410 -msgid "Removing generation %s" -msgstr "" - -#: home-manager/home-manager:429 -msgid "No generations to expire" -msgstr "" - -#: home-manager/home-manager:440 -msgid "No home-manager packages seem to be installed." -msgstr "" - -#: home-manager/home-manager:497 -msgid "Unknown argument %s" -msgstr "" - -#: home-manager/home-manager:513 -msgid "This will remove Home Manager from your system." -msgstr "" - -#: home-manager/home-manager:516 -msgid "This is a dry run, nothing will actually be uninstalled." -msgstr "" - -#: home-manager/home-manager:520 -msgid "Really uninstall Home Manager?" -msgstr "" - -#: home-manager/home-manager:526 -msgid "Switching to empty Home Manager configuration..." -msgstr "" - -#: home-manager/home-manager:553 -msgid "Yay!" -msgstr "" - -#: home-manager/home-manager:558 -msgid "Home Manager is uninstalled but your home.nix is left untouched." -msgstr "" - -#: home-manager/home-manager:723 +#: home-manager/home-manager:245 home-manager/home-manager:268 +#: home-manager/home-manager:907 msgid "%s: unknown option '%s'" msgstr "" -#: home-manager/home-manager:724 +#: home-manager/home-manager:250 home-manager/home-manager:908 msgid "Run '%s --help' for usage help" msgstr "" -#: home-manager/home-manager:758 -msgid "expire-generations expects one argument, got %d." +#: home-manager/home-manager:276 home-manager/home-manager:326 +msgid "The file %s already exists, leaving it unchanged..." msgstr "" -#: home-manager/home-manager:780 -msgid "Unknown command: %s" +#: home-manager/home-manager:278 home-manager/home-manager:328 +msgid "Creating %s..." msgstr "" -#: home-manager/install.nix:22 -msgid "Creating initial Home Manager configuration..." -msgstr "" - -#: home-manager/install.nix:66 +#: home-manager/home-manager:370 msgid "Creating initial Home Manager generation..." msgstr "" #. translators: The "%s" specifier will be replaced by a file path. -#: home-manager/install.nix:71 +#: home-manager/home-manager:375 msgid "" "All done! The home-manager tool should now be installed and you can edit\n" "\n" @@ -150,7 +72,7 @@ msgid "" msgstr "" #. translators: The "%s" specifier will be replaced by a URL. -#: home-manager/install.nix:76 +#: home-manager/home-manager:380 msgid "" "Uh oh, the installation failed! Please create an issue at\n" "\n" @@ -159,6 +81,89 @@ msgid "" "if the error seems to be the fault of Home Manager." msgstr "" -#: home-manager/install.nix:83 +#: home-manager/home-manager:390 +msgid "Can't instantiate a flake configuration" +msgstr "" + +#: home-manager/home-manager:463 +msgid "" +"There is %d unread and relevant news item.\n" +"Read it by running the command \"%s news\"." +msgid_plural "" +"There are %d unread and relevant news items.\n" +"Read them by running the command \"%s news\"." +msgstr[0] "" +msgstr[1] "" + +#: home-manager/home-manager:477 +msgid "Unknown \"news.display\" setting \"%s\"." +msgstr "" + +#: home-manager/home-manager:484 +#, sh-format +msgid "Please set the $EDITOR environment variable" +msgstr "" + +#: home-manager/home-manager:499 +msgid "Cannot run build in read-only directory" +msgstr "" + +#: home-manager/home-manager:583 +msgid "No generation with ID %s" +msgstr "" + +#: home-manager/home-manager:585 +msgid "Cannot remove the current generation %s" +msgstr "" + +#: home-manager/home-manager:587 +msgid "Removing generation %s" +msgstr "" + +#: home-manager/home-manager:606 +msgid "No generations to expire" +msgstr "" + +#: home-manager/home-manager:617 +msgid "No home-manager packages seem to be installed." +msgstr "" + +#: home-manager/home-manager:674 +msgid "Unknown argument %s" +msgstr "" + +#: home-manager/home-manager:690 +msgid "This will remove Home Manager from your system." +msgstr "" + +#: home-manager/home-manager:693 +msgid "This is a dry run, nothing will actually be uninstalled." +msgstr "" + +#: home-manager/home-manager:697 +msgid "Really uninstall Home Manager?" +msgstr "" + +#: home-manager/home-manager:703 +msgid "Switching to empty Home Manager configuration..." +msgstr "" + +#: home-manager/home-manager:730 +msgid "Yay!" +msgstr "" + +#: home-manager/home-manager:735 +msgid "Home Manager is uninstalled but your home.nix is left untouched." +msgstr "" + +#: home-manager/home-manager:945 +msgid "expire-generations expects one argument, got %d." +msgstr "" + +#: home-manager/home-manager:967 +msgid "Unknown command: %s" +msgstr "" + +#: home-manager/install.nix:18 msgid "This derivation is not buildable, please run it using nix-shell." msgstr "" diff --git a/modules/po/hm-modules.pot b/modules/po/hm-modules.pot index 5c9a7078..79687ded 100644 --- a/modules/po/hm-modules.pot +++ b/modules/po/hm-modules.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Home Manager Modules\n" "Report-Msgid-Bugs-To: https://github.com/nix-community/home-manager/issues\n" -"POT-Creation-Date: 2023-03-14 23:10+0100\n" +"POT-Creation-Date: 2023-03-15 20:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n"