[lttng-dev] [PATCH] Provide tcsh completion

Marc Khouzam marc.khouzam at gmail.com
Fri Apr 24 10:14:31 EDT 2015


The new script 'lttng-tcsh_completion' is provided to allow
command-completion for the tcsh shell.

The approach taken by this script is to to re-use the advanced bash
completion script and use its result for tcsh completion.  This is
achieved by running the bash script and outputting the completion
result for tcsh consumption.

This approach is based on a similar script used in the git project.

To use this completion script:

   0) You need tcsh 6.16.00 or newer.
   1) Copy both this file and the bash completion script to ${HOME}.
      You _must_ use the name ${HOME}/.lttng-bash_completion for the
      bash script.
      (e.g. ~/.lttng-tcsh_completion and ~/.lttng-bash_completion).
   2) Add the following line to your .tcshrc/.cshrc:
       source ~/.lttng-tcsh_completion
   3) For completion similar to bash, it is recommended to also
      add the following line to your .tcshrc/.cshrc:
       set autolist=ambiguous
      It will tell tcsh to list the possible completion choices.

Signed-off-by: Marc Khouzam <marc.khouzam at gmail.com>
---
 extras/lttng-tcsh_completion |  163 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 163 insertions(+)
 create mode 100755 extras/lttng-tcsh_completion

diff --git a/extras/lttng-tcsh_completion b/extras/lttng-tcsh_completion
new file mode 100755
index 0000000..1ce677a
--- /dev/null
+++ b/extras/lttng-tcsh_completion
@@ -0,0 +1,163 @@
+#!tcsh
+#
+# tcsh completion support for core lttng.
+#
+# Copyright (C) 2015 Marc Khouzam <marc.khouzam at gmail.com>
+# Distributed under the GNU General Public License, version 2.0.
+#
+# When sourced, this script will generate a new script that uses
+# the lttng-bash_completion script provided by core lttng.  This new
+# script can be used by tcsh to perform lttng completion.
+# The current script also issues the necessary tcsh 'complete'
+# commands.
+#
+# To use this completion script:
+#
+#    0) You need tcsh 6.16.00 or newer.
+#    1) Copy both this file and the bash completion script to ${HOME}.
+#       You _must_ use the name ${HOME}/.lttng-bash_completion for the
+#       bash script.
+#       (e.g. ~/.lttng-tcsh_completion and ~/.lttng-bash_completion).
+#    2) Add the following line to your .tcshrc/.cshrc:
+#        source ~/.lttng-tcsh_completion
+#    3) For completion similar to bash, it is recommended to also
+#       add the following line to your .tcshrc/.cshrc:
+#        set autolist=ambiguous
+#       It will tell tcsh to list the possible completion choices.
+#
+# To debug this script one can use the -d flag by running the
+# generated final script directly.  For example, to see the completions
+# generated when pressing <tab> for the command line:
+#     lttng s
+# one should run:
+#     bash ~/.lttng-tcsh_completion.bash -d lttng 'lttng s
+# and will obtain:
+#     =====================================
+#     lttng-bash_completion returned:
+#     start stop set-session snapshot save
+#     =====================================
+#     Completions including tcsh additions:
+#     start stop set-session snapshot save
+#     =====================================
+#     Final completions returned:
+#     save
+#     set-session
+#     snapshot
+#     start
+#     stop
+#
+
+set __lttng_tcsh_completion_version = `\echo ${tcsh} | \sed 's/\./ /g'`
+if ( ${__lttng_tcsh_completion_version[1]} < 6 || \
+     ( ${__lttng_tcsh_completion_version[1]} == 6 && \
+       ${__lttng_tcsh_completion_version[2]} < 16 ) ) then
+       echo "lttng-tcsh_completion: Your version of tcsh is too old,
you need version 6.16.00 or newer.  lttng completion will not work."
+       exit
+endif
+unset __lttng_tcsh_completion_version
+
+set __lttng_tcsh_completion_original_script = ${HOME}/.lttng-bash_completion
+set __lttng_tcsh_completion_script = ${HOME}/.lttng-tcsh_completion.bash
+
+# Check that the user put the script in the right place
+if ( ! -e ${__lttng_tcsh_completion_original_script} ) then
+       echo "lttng-completion.tcsh: Cannot find:
${__lttng_tcsh_completion_original_script}.  lttng completion will not
work."
+       exit
+endif
+
+cat << EOF > ${__lttng_tcsh_completion_script}
+#!bash
+#
+# This script is GENERATED and will be overwritten automatically.
+# Do not modify it directly.  Instead, modify lttng-tcsh_completion
+# and source it again.
+
+# Allow for debug printouts when running the script by hand
+if [ "\$1" == "-d" ] || [ "\$1" == "--debug" ]; then
+       __lttng_tcsh_debug=true
+       shift
+fi
+
+source /etc/bash_completion
+source ${__lttng_tcsh_completion_original_script}
+
+# Remove the colon as a completion separator because tcsh cannot handle it
+COMP_WORDBREAKS=\${COMP_WORDBREAKS//:}
+
+# Set COMP_WORDS in a way that can be handled by the bash script.
+COMP_WORDS=(\$1 \$2)
+COMP_LINE="\$1 \$2"
+COMP_POINT=\${#COMP_LINE}
+
+# The cursor is at the end of parameter #1.
+# We must check for a space as the last character which will
+# tell us that the previous word is complete and the cursor
+# is on the next word.
+if [ "\${2: -1}" == " " ]; then
+       # The last character is a space, so our location is at the end
+       # of the command-line array
+       COMP_CWORD=\${#COMP_WORDS[@]}
+else
+       # The last character is not a space, so our location is on the
+       # last word of the command-line array, so we must decrement the
+       # count by 1
+       COMP_CWORD=\$((\${#COMP_WORDS[@]}-1))
+fi
+
+# Call _lttng() of the bash script, based on the first argument
+_\${1}
+
+if [ "\$__lttng_tcsh_debug" == "true" ]; then
+       echo =====================================
+       echo lttng-bash_completion returned:
+       echo "\${COMPREPLY[@]}"
+fi
+
+IFS=\$'\n'
+if [ \${#COMPREPLY[*]} -eq 0 ]; then
+       # No completions suggested.  In this case, we want tcsh to perform
+       # standard file completion.  However, there does not seem to be way
+       # to tell tcsh to do that.  To help the user, we try to simulate
+       # file completion directly in this script.
+       #
+       # Known issues:
+       #     - Possible completions are shown with their directory prefix.
+       #     - Completions containing shell variables are not handled.
+       #     - Completions with ~ as the first character are not handled.
+
+       # No file completion should be done unless we are completing beyond
+       # the lttng sub-command.  An improvement on the bash completion :)
+       if [ \${COMP_CWORD} -gt 1 ]; then
+               TO_COMPLETE="\${COMP_WORDS[\${COMP_CWORD}]}"
+
+               # We don't support ~ expansion: too tricky.
+               if [ "\${TO_COMPLETE:0:1}" != "~" ]; then
+                       # Use ls so as to add the '/' at the end of directories.
+                       COMPREPLY=(\`ls -dp \${TO_COMPLETE}* 2> /dev/null\`)
+               fi
+       fi
+fi
+
+if [ "\$__lttng_tcsh_debug" == "true" ]; then
+       echo =====================================
+       echo Completions including tcsh additions:
+       echo "\${COMPREPLY[@]}"
+       echo =====================================
+       echo Final completions returned:
+fi
+
+# tcsh does not automatically remove duplicates, so we do it ourselves
+echo "\${COMPREPLY[*]}" | sort | uniq
+
+# If there is a single completion and it is a directory, we output it
+# a second time to trick tcsh into not adding a space after it.
+if [ \${#COMPREPLY[*]} -eq 1 ] && [ "\${COMPREPLY[0]: -1}" == "/" ]; then
+       echo "\${COMPREPLY[*]}"
+fi
+
+EOF
+
+# Don't need this variable anymore, so don't pollute the users environment
+unset __lttng_tcsh_completion_original_script
+
+complete lttng  'p,*,`bash ${__lttng_tcsh_completion_script} lttng
"${COMMAND_LINE}"`,'
-- 
1.7.9.5



More information about the lttng-dev mailing list