git-completion.tcsh 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. # tcsh completion support for core Git.
  2. #
  3. # Copyright (C) 2012 Marc Khouzam <marc.khouzam@gmail.com>
  4. # Distributed under the GNU General Public License, version 2.0.
  5. #
  6. # When sourced, this script will generate a new script that uses
  7. # the git-completion.bash script provided by core Git. This new
  8. # script can be used by tcsh to perform git completion.
  9. # The current script also issues the necessary tcsh 'complete'
  10. # commands.
  11. #
  12. # To use this completion script:
  13. #
  14. # 0) You need tcsh 6.16.00 or newer.
  15. # 1) Copy both this file and the bash completion script to ${HOME}.
  16. # You _must_ use the name ${HOME}/.git-completion.bash for the
  17. # bash script.
  18. # (e.g. ~/.git-completion.tcsh and ~/.git-completion.bash).
  19. # 2) Add the following line to your .tcshrc/.cshrc:
  20. # source ~/.git-completion.tcsh
  21. # 3) For completion similar to bash, it is recommended to also
  22. # add the following line to your .tcshrc/.cshrc:
  23. # set autolist=ambiguous
  24. # It will tell tcsh to list the possible completion choices.
  25. set __git_tcsh_completion_version = `\echo ${tcsh} | \sed 's/\./ /g'`
  26. if ( ${__git_tcsh_completion_version[1]} < 6 || \
  27. ( ${__git_tcsh_completion_version[1]} == 6 && \
  28. ${__git_tcsh_completion_version[2]} < 16 ) ) then
  29. echo "git-completion.tcsh: Your version of tcsh is too old, you need version 6.16.00 or newer. Git completion will not work."
  30. exit
  31. endif
  32. unset __git_tcsh_completion_version
  33. set __git_tcsh_completion_original_script = ${HOME}/.git-completion.bash
  34. set __git_tcsh_completion_script = ${HOME}/.git-completion.tcsh.bash
  35. # Check that the user put the script in the right place
  36. if ( ! -e ${__git_tcsh_completion_original_script} ) then
  37. echo "git-completion.tcsh: Cannot find: ${__git_tcsh_completion_original_script}. Git completion will not work."
  38. exit
  39. endif
  40. cat << EOF >! ${__git_tcsh_completion_script}
  41. #!bash
  42. #
  43. # This script is GENERATED and will be overwritten automatically.
  44. # Do not modify it directly. Instead, modify git-completion.tcsh
  45. # and source it again.
  46. source ${__git_tcsh_completion_original_script}
  47. # Remove the colon as a completion separator because tcsh cannot handle it
  48. COMP_WORDBREAKS=\${COMP_WORDBREAKS//:}
  49. # For file completion, tcsh needs the '/' to be appended to directories.
  50. # By default, the bash script does not do that.
  51. # We can achieve this by using the below compatibility
  52. # method of the git-completion.bash script.
  53. __git_index_file_list_filter ()
  54. {
  55. __git_index_file_list_filter_compat
  56. }
  57. # Set COMP_WORDS in a way that can be handled by the bash script.
  58. COMP_WORDS=(\$2)
  59. # The cursor is at the end of parameter #1.
  60. # We must check for a space as the last character which will
  61. # tell us that the previous word is complete and the cursor
  62. # is on the next word.
  63. if [ "\${2: -1}" == " " ]; then
  64. # The last character is a space, so our location is at the end
  65. # of the command-line array
  66. COMP_CWORD=\${#COMP_WORDS[@]}
  67. else
  68. # The last character is not a space, so our location is on the
  69. # last word of the command-line array, so we must decrement the
  70. # count by 1
  71. COMP_CWORD=\$((\${#COMP_WORDS[@]}-1))
  72. fi
  73. # Call _git() or _gitk() of the bash script, based on the first argument
  74. _\${1}
  75. IFS=\$'\n'
  76. if [ \${#COMPREPLY[*]} -eq 0 ]; then
  77. # No completions suggested. In this case, we want tcsh to perform
  78. # standard file completion. However, there does not seem to be way
  79. # to tell tcsh to do that. To help the user, we try to simulate
  80. # file completion directly in this script.
  81. #
  82. # Known issues:
  83. # - Possible completions are shown with their directory prefix.
  84. # - Completions containing shell variables are not handled.
  85. # - Completions with ~ as the first character are not handled.
  86. # No file completion should be done unless we are completing beyond
  87. # the git sub-command. An improvement on the bash completion :)
  88. if [ \${COMP_CWORD} -gt 1 ]; then
  89. TO_COMPLETE="\${COMP_WORDS[\${COMP_CWORD}]}"
  90. # We don't support ~ expansion: too tricky.
  91. if [ "\${TO_COMPLETE:0:1}" != "~" ]; then
  92. # Use ls so as to add the '/' at the end of directories.
  93. COMPREPLY=(\`ls -dp \${TO_COMPLETE}* 2> /dev/null\`)
  94. fi
  95. fi
  96. fi
  97. # tcsh does not automatically remove duplicates, so we do it ourselves
  98. echo "\${COMPREPLY[*]}" | sort | uniq
  99. # If there is a single completion and it is a directory, we output it
  100. # a second time to trick tcsh into not adding a space after it.
  101. if [ \${#COMPREPLY[*]} -eq 1 ] && [ "\${COMPREPLY[0]: -1}" == "/" ]; then
  102. echo "\${COMPREPLY[*]}"
  103. fi
  104. EOF
  105. # Don't need this variable anymore, so don't pollute the users environment
  106. unset __git_tcsh_completion_original_script
  107. complete git 'p,*,`bash ${__git_tcsh_completion_script} git "${COMMAND_LINE}"`,'
  108. complete gitk 'p,*,`bash ${__git_tcsh_completion_script} gitk "${COMMAND_LINE}"`,'