zsh: let opc take NAME=VALUE and prompt when the value is missing

`opc NAME=VALUE` sets a field directly; `opc NAME` or `opc NAME=` prompts
with hidden input, and an empty answer changes nothing. The old
`opc NAME VALUE` form still works.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-29 16:43:27 +00:00
co-authored by Claude Opus 5.5
parent fe8b9a3ec0
commit 5f0dec5270
+12 -6
View File
@@ -69,9 +69,10 @@ _DOTFILES_CONF="$HOME/.config/dotfiles"
[ -f "$_DOTFILES_CONF/secrets.env" ] && source "$_DOTFILES_CONF/secrets.env" [ -f "$_DOTFILES_CONF/secrets.env" ] && source "$_DOTFILES_CONF/secrets.env"
# opr NAME read one field straight from the vault # opr NAME read one field straight from the vault
# opc NAME [VALUE] create or update a field (prompts, hidden, when VALUE is # opc NAME=VALUE create or update a field, then refresh and reload this
# omitted, which keeps the secret out of shell history), # opc NAME shell; with no VALUE (NAME or NAME=) it prompts, hidden,
# then refresh and reload this shell # which keeps the secret out of shell history.
# `opc NAME VALUE` also still works.
# opd NAME delete a field, refresh, and unset it in this shell # opd NAME delete a field, refresh, and unset it in this shell
# opl [VAULT [ITEM]] show every field and its current value (default: your # opl [VAULT [ITEM]] show every field and its current value (default: your
# vault and item from op.env) # vault and item from op.env)
@@ -94,11 +95,16 @@ opr() {
opc() { opc() {
emulate -L zsh emulate -L zsh
local name=$1 value local name=$1 value
_dotfiles_env_name "$name" opc || return if [[ $1 == *=* ]]; then
if (( $# >= 2 )); then # NAME=VALUE: split on the first '=' so values may contain '='
name=${1%%=*} value=${1#*=}
elif (( $# >= 2 )); then
value=$2 value=$2
else fi
_dotfiles_env_name "$name" opc || return
if [[ -z $value ]]; then
read -rs "value?$name: " && print read -rs "value?$name: " && print
[[ -n $value ]] || { print -u2 "opc: empty value for $name; nothing changed"; return 1; }
fi fi
# [concealed] makes it a password field; an existing field of that name is updated. # [concealed] makes it a password field; an existing field of that name is updated.
_dotfiles_op sh -c 'op item edit "$OP_ITEM" --vault "$OP_VAULT" "$1[concealed]=$2" >/dev/null' \ _dotfiles_op sh -c 'op item edit "$OP_ITEM" --vault "$OP_VAULT" "$1[concealed]=$2" >/dev/null' \