Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Rewrite of zsh-newuser-install



I viewed the latest file from git and am commenting on that directly.

> # Use `exec zsh` to apply changes after editing this file.

Not sure I'd recommend that because if you mistype "zsh", your shell+terminal
disappears. And if they've broken .zshrc, that can leave them unable to log
back in.

> bindkey -e  # Use `emacs` as the main keymap.

I don't argue with the direct emacs binding. But would be tempted to add
a commented-out line suggesting what vi users may want to try, either
bindkey -v or:
  bindkey '\e' vi-cmd-mode

That's closer to what many vi users actually want and to what vi mode on bash does.

> HISTFILE=${ZDOTDIR:-${XDG_DATA_HOME:-$HOME/.local/share}/zsh}/history

> # Create parent dir, if necessary.
> if [[ ! -d $HISTFILE:h ]]; then
>   zmodload -F zsh/files b:zf_mkdir
>   zf_mkdir -pm 0700 - $HISTFILE:h
> fi

I'm not sure it helps new users to understand their new setup file if it needs
this stuff. Should we just keep it simple at the expense of ignoring the XDG stuff.

> # Primary prompt, left side

> # %x<y<z%<<: if z is wider than x characters, then trim z from the left & insert y

The trunction adds complexity that I'm not sure is needed. Many people want to
know how to enable vcs_info. I'm not saying it should be included by
default but perhaps in a comment.

> PS2='%S%_%s '                           # Left side
> RPS2='Press %SAlt-Q%s to return to PS1' # Right side
> bindkey '^[q' push-line-or-edit # Alt-Q

It can be quite helpful to leave PS2 empty and put <%^ in the [transient] right
- allows for copy and paste without intervening prompts. And that doesn't mean
it can't include the hint too.

> # Spelling correction prompt
> # %R: word to correct;  %r: suggested correction
> SPROMPT='Correct %B%F{w}%K{r}%R%b%f%k to %F{g}%r%f? [%Sy%ses/%Sn%so/%Se%sdit/%Sa%sbort] '

Is it perhaps better to spell out white, red and green just to make this a
little more readable. This is also elsewhere (apart from the first case).

> ZLE_REMOVE_SUFFIX_CHARS=$' \t\n;' # Characters that remove completion suffixes.
> ZLE_SPACE_SUFFIX_CHARS=$'&|'      # Characters that instead replace them with a space.

The first of these assignments is actually redundant because the latter takes
precedence.

> zmodload -F zsh/zutil b:zstyle    # Load `zstyle` builtin.

Is that really needed? I've never bothered.

> # These are tried in order until one of them succeeds:
> # _expand: expansion substitutions (See http://zsh.sourceforge.net/Doc/Release/Expansion.html)
> # _complete: regular completions
> # _history: words from history
> # _correct: spelling corrections
> # _ignored: any completions that have been ignored so far
> zstyle ':completion:*' completer _expand _complete _history _correct _ignored

These seem reasonable choices. _extensions wouldn't cause any unpleasant
surprises for a new user but it does need to come first.

I'm not fond of _expand in unconfigured form - would consider some of
keep-prefix true, accept-exact continue and tag-order all-expansions.

> # m:{[:lower:]-}={[:upper:]_} does foo-bar -> FOO_BAR
but not vice versa.

> # r:|?=** does fbr -> foo-bar and bar -> foo-bar
> zstyle ':completion:*:complete:*' matcher-list \
>   'r:|[.]=** r:?|[-_]=** l:?|=[-_] m:{[:lower:]-}={[:upper:]_}' \
>   'r:|?=** m:{[:lower:]}={[:upper:]}'

I'd be significantly more conservative on these. They really can cause
surprises for new users and break some things completely like trying to force
the type of listed matches with punctuation prefixes.

I mostly use generous matchers with more specific contexts.
To give one example, the following helps when suspended jobs are all
man, less or vim and I want to select on the argument:
zstyle ':completion:*:(-command-|[fb]g):*:jobs' matcher 'l:%|=*'

> # For options only, add - -> + for each item in the list above.
> zstyle ':completion:*:options' matcher 'm:{-}={+}'

Isn't the more limited 'b:-=+' sufficient here? 

> # Show and insert `man` sections.
> zstyle ':completion:*' insert-sections yes

I wouldn't bother for section 1:
  zstyle ':completion:*:manuals.(^1*)' insert-sections true

Not only because it is mostly redundant but it is easier to simplify that to
all sections than to do the reverse.

> zstyle ':completion:*' separate-sections yes

That also applies elsewhere, e.g. words for dict.

> # Press Alt-Shift-Hyphen to redo (after undo).
> bindkey '^[_' redo

I'd be inclined to bind Ctrl-Z to undo. Forget Emacs and Vi - Ctrl-Z is what
the rest of the world uses for undo. That doesn't disable anything else and too
few people know the shell has an undo. It's invaluable with completion,
especially with approximate completion or the fuzzier matching controls such as
r:|?=**.

> setopt GLOB_STAR_SHORT      # Use `**` for recursive globbing; `***` to include symlinks, too.

Need to say 'without a trailing "/"' **/ is already recursive globbing
and you don't need this option to enable it.

The comment confused me but like Bart I don't use the option but found
myself wondering whether I should.

> typeset -gU PATH path FPATH fpath CDPATH cdpath MANPATH manpath

These are tied, no need to list both forms. The -g adds nothing either
outside of a function.

Oliver




Messages sorted by: Reverse Date, Date, Thread, Author