summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2000-04-11 20:25:30 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2000-04-11 20:25:30 +0000
commit5a69fda2a1f047208888b58edb9dbc3f8ae08440 (patch)
treed3355b31138404eecdbd353af8adbd1c64cde614
parent6888f6c3a7af7dd728131e92fd6893baaf21aa89 (diff)
downloadzsh-5a69fda2a1f047208888b58edb9dbc3f8ae08440.tar.gz
zsh-5a69fda2a1f047208888b58edb9dbc3f8ae08440.zip
10669: compinstall more flexible with input and output files
-rw-r--r--ChangeLog5
-rw-r--r--Completion/Core/compinstall55
2 files changed, 55 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 20541f361..666c05ff8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2000-04-11 Peter Stephenson <pws@pwstephenson.fsnet.co.uk>
+
+ * 10669: Completion/Core/compinstall: will now ask for
+ alternative files both for input and output.
+
2000-04-11 Bart Schaefer <schaefer@zsh.org>
* 10657: One change missed in 10635.
diff --git a/Completion/Core/compinstall b/Completion/Core/compinstall
index ab5479b2e..28b28d79f 100644
--- a/Completion/Core/compinstall
+++ b/Completion/Core/compinstall
@@ -24,7 +24,7 @@ __ci_newline() {
typeset startline='# The following lines were added by compinstall'
typeset endline='# End of lines added by compinstall'
-typeset ifile=${ZDOTDIR:-~}/.zshrc line fpath_line
+typeset ifile line fpath_line
typeset -A styles
typeset match mbegin mend matchers warn_unknown warn_old warn_comment
integer lines_found
@@ -42,7 +42,38 @@ matchers=()
# day I may even do that.
#
-if [[ -f $ifile ]]; then
+__ci_test_ifile() {
+ [[ -f $1 ]] && grep "$endline" $1 >/dev/null 2>&1
+}
+
+local foundold=false
+ifile=${ZDOTDIR:-~}/.zshrc
+if __ci_test_ifile ${ZDOTDIR:-~}/.compinstall; then
+ ifile=${ZDOTDIR:-~}/.compinstall
+ foundold=true
+elif __ci_test_ifile $ifile; then
+ foundold=true
+fi
+
+local newifile=$ifile
+if [[ $foundold = true ]]; then
+ print "I have found completion definitions in $ifile.
+If you want me to read these, just hit return. Otherwise, edit the file
+name to look for definitions somewhere else, or delete the whole line
+in order not to use existing definitions."
+ vared -ch -p 'file> ' newifile
+ [[ -z $newifile ]] && foundold=false
+else
+ print "I haven't found any existing completion definitions.
+If you have some already defined by compinstall, edit the name of the
+file where these can be found. Note that this will only work if they
+are exactly the form in which compinstall inserted them. If you leave
+the line as it is, or empty, I won't search."
+ vared -ch -p 'file> ' newifile
+ [[ -z $newifile || $ifile = $newifile ]] && foundold=false
+fi
+
+if [[ $foundold = true ]]; then
sed -n "/^[ ]*$startline/,/^[ ]*$endline/p" $ifile |
# Use the default read behaviour to handle any continuation lines.
while read line; do
@@ -63,6 +94,8 @@ $line"
${match[3]}"
elif [[ $line = [[:blank:]]#compconf* ]]; then
warn_old=1
+ elif [[ $line == $startline || $line == $endline ]]; then
+ # no-op
elif [[ $line = [[:blank:]]#\#* ]]; then
warn_comment=1
elif [[ $line != [[:blank:]]# &&
@@ -109,6 +142,9 @@ that these lines are actually executed. They will not be if your .zshrc
usually returns before the end."
fi
fi
+print "Note that you will be given a chance to save the new setup
+somewhere else at the end."
+
__ci_newline || return 1
@@ -1546,7 +1582,14 @@ compinit"
print -r "$output
$endline" } >$tmpout
-if read -q key"?Save new settings to $ifile? "; then
+if ! read -q key"?Save new settings to $ifile? "; then
+ print "Enter a different filename (~ will be expanded), or return to abort:"
+ ifile=
+ vared -ch -p 'file> ' ifile
+ ifile=${~ifile}
+fi
+
+if [[ -n $ifile ]]; then
#
# Now use sed to update the file.
#
@@ -1556,8 +1599,10 @@ if read -q key"?Save new settings to $ifile? "; then
else
touch $ifile
fi
- if sed -e "/^[ ]*$endline/r $tmpout
-/^[ ]*$startline/,/^[ ]*$endline/d" $ifile >${tmpout}2 &&
+ if { { grep "$endline" $ifile >/dev/null 2>&1 &&
+ sed -e "/^[ ]*$endline/r $tmpout
+/^[ ]*$startline/,/^[ ]*$endline/d" $ifile >${tmpout}2 } ||
+ cat $tmpout >>${tmpout}2 } &&
mv ${tmpout}2 $ifile; then
print "\nSuccessfully added compinstall lines to $ifile."
rm -f $tmpout