Aliaksei Budavei | 09cc8c9 | 2024-11-04 19:43:22 +0100 | [diff] [blame] | 1 | #!/bin/sh |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 2 | |
| 3 | # Start Vim on a copy of the tutor file. |
| 4 | |
Aliaksei Budavei | 715a58f | 2024-11-06 21:58:53 +0100 | [diff] [blame] | 5 | # Type "man vimtutor" (or "vimtutor --help") to learn more about the supported |
| 6 | # command-line options. |
| 7 | # |
| 8 | # Tutors in several human languages are distributed. Type "vimtutor" to use |
| 9 | # a tutor in the language of the current locale (:help v:lang), if available; |
| 10 | # otherwise fall back to using the English tutor. To request any bundled |
| 11 | # tutor, specify its ISO639 name as an argument, e.g. "vimtutor nl". |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 12 | |
Bram Moolenaar | 2b57078 | 2008-05-07 15:40:33 +0000 | [diff] [blame] | 13 | # Vim could be called "vim" or "vi". Also check for "vimN", for people who |
| 14 | # have Vim installed with its version number. |
Aliaksei Budavei | 09cc8c9 | 2024-11-04 19:43:22 +0100 | [diff] [blame] | 15 | seq="vim vim91 vim90 vim81 vim80 vim8 vim74 vim73 vim72 vim71 vim70 vim7 vim6 vi" |
Bram Moolenaar | 2b57078 | 2008-05-07 15:40:33 +0000 | [diff] [blame] | 16 | |
Paul Desmond Parker | 17c71da | 2024-11-03 20:47:53 +0100 | [diff] [blame] | 17 | usage() |
| 18 | { |
| 19 | echo "==USAGE=========================================================================================" |
Aliaksei Budavei | 715a58f | 2024-11-06 21:58:53 +0100 | [diff] [blame] | 20 | echo "${0##*/} [[-(-l)anguage] ISO639] [-(-c)hapter NUMBER] [-(-g)ui] | [-(-h)elp] | [--list]" |
Paul Desmond Parker | 17c71da | 2024-11-03 20:47:53 +0100 | [diff] [blame] | 21 | printf "\twhere:\n" |
| 22 | printf "\t\tISO639 (default=en) is a 2 or 3 character language code\n" |
Aliaksei Budavei | 715a58f | 2024-11-06 21:58:53 +0100 | [diff] [blame] | 23 | printf "\t\tNUMBER (default=1) is a chapter number (1 or 2)\n" |
Paul Desmond Parker | 17c71da | 2024-11-03 20:47:53 +0100 | [diff] [blame] | 24 | printf "\texamples:\n" |
| 25 | printf "\t\tvimtutor -l es -c 2 -g\n" |
Aliaksei Budavei | 715a58f | 2024-11-06 21:58:53 +0100 | [diff] [blame] | 26 | printf "\t\tvimtutor --language de --chapter 2\n" |
Paul Desmond Parker | 17c71da | 2024-11-03 20:47:53 +0100 | [diff] [blame] | 27 | printf "\t\tvimtutor fr\n" |
| 28 | echo "More information at 'man vimtutor'" |
| 29 | echo "================================================================================================" |
| 30 | } |
| 31 | |
| 32 | listOptions() |
| 33 | { |
Aliaksei Budavei | 09cc8c9 | 2024-11-04 19:43:22 +0100 | [diff] [blame] | 34 | echo "==OPTIONS=======================================================================================" |
| 35 | echo "Chapter: 1" |
| 36 | printf "\tLang: %-3s => %s\n" \ |
| 37 | bar Bavarian \ |
| 38 | bg Bulgarian \ |
| 39 | ca Catalan \ |
| 40 | cs Czech \ |
| 41 | da Danish \ |
| 42 | de German \ |
| 43 | el Greek \ |
| 44 | en English\(default\) \ |
| 45 | eo Esperanto \ |
| 46 | es Spanish \ |
| 47 | fr French \ |
| 48 | hr Croatian \ |
| 49 | hu Hungarian \ |
| 50 | it Italian \ |
| 51 | ja Japanese \ |
| 52 | ko Korean \ |
| 53 | lv Latvian \ |
| 54 | nb Bokmål \ |
| 55 | nl Dutch \ |
| 56 | no Norwegian \ |
| 57 | pl Polish \ |
| 58 | pt Portuguese \ |
| 59 | ru Russian \ |
| 60 | sk Slovak \ |
| 61 | sr Serbian \ |
| 62 | sv Swedish \ |
| 63 | tr Turkish \ |
| 64 | uk English \ |
| 65 | vi Vietnamese \ |
| 66 | zh Chinese |
Paul Desmond Parker | 17c71da | 2024-11-03 20:47:53 +0100 | [diff] [blame] | 67 | |
Aliaksei Budavei | 09cc8c9 | 2024-11-04 19:43:22 +0100 | [diff] [blame] | 68 | echo "Chapter: 2" |
| 69 | printf "\tLang: %-3s => %s\n" \ |
| 70 | en English\(default\) |
| 71 | echo "================================================================================================" |
Paul Desmond Parker | 17c71da | 2024-11-03 20:47:53 +0100 | [diff] [blame] | 72 | } |
| 73 | |
| 74 | validateLang() |
| 75 | { |
Aliaksei Budavei | 715a58f | 2024-11-06 21:58:53 +0100 | [diff] [blame] | 76 | case "$xx" in |
| 77 | '' | *[!a-z]* ) |
| 78 | echo "Error: iso639 code must contain only [a-z]" |
| 79 | exit 1 |
| 80 | esac |
Aliaksei Budavei | 09cc8c9 | 2024-11-04 19:43:22 +0100 | [diff] [blame] | 81 | |
Aliaksei Budavei | 715a58f | 2024-11-06 21:58:53 +0100 | [diff] [blame] | 82 | case "${#xx}" in |
| 83 | [23] ) |
| 84 | ;; |
| 85 | * ) |
| 86 | echo "Error: iso639 code must be 2 or 3 characters only" |
| 87 | exit 1 |
| 88 | esac |
Aliaksei Budavei | 09cc8c9 | 2024-11-04 19:43:22 +0100 | [diff] [blame] | 89 | |
Aliaksei Budavei | 715a58f | 2024-11-06 21:58:53 +0100 | [diff] [blame] | 90 | export xx |
Paul Desmond Parker | 17c71da | 2024-11-03 20:47:53 +0100 | [diff] [blame] | 91 | } |
| 92 | |
| 93 | validateChapter() |
| 94 | { |
Aliaksei Budavei | 715a58f | 2024-11-06 21:58:53 +0100 | [diff] [blame] | 95 | case "$cc" in |
| 96 | '' | *[!0-9]* ) |
| 97 | echo "Error: chapter argument must contain digits only" |
| 98 | exit 1 |
| 99 | ;; |
| 100 | [12] ) |
| 101 | ;; |
| 102 | * ) |
| 103 | echo "Error: invalid chapter number: [12]" |
| 104 | exit 1 |
| 105 | esac |
Aliaksei Budavei | 09cc8c9 | 2024-11-04 19:43:22 +0100 | [diff] [blame] | 106 | |
Aliaksei Budavei | 715a58f | 2024-11-06 21:58:53 +0100 | [diff] [blame] | 107 | export CHAPTER="$cc" |
Paul Desmond Parker | 17c71da | 2024-11-03 20:47:53 +0100 | [diff] [blame] | 108 | } |
| 109 | |
Paul Desmond Parker | 17c71da | 2024-11-03 20:47:53 +0100 | [diff] [blame] | 110 | while [ "$1" != "" ]; do |
Aliaksei Budavei | 715a58f | 2024-11-06 21:58:53 +0100 | [diff] [blame] | 111 | case "$1" in |
| 112 | -g | --gui ) |
| 113 | seq="gvim gvim91 gvim90 gvim81 gvim80 gvim8 gvim74 gvim73 gvim72 gvim71 gvim70 gvim7 gvim6 $seq" |
| 114 | ;; |
| 115 | -l | --language ) |
| 116 | shift |
| 117 | xx="$1" |
| 118 | validateLang |
| 119 | ;; |
| 120 | -l[a-z][a-z][a-z] | -l[a-z][a-z] ) |
| 121 | export xx="${1#*l}" |
| 122 | ;; |
| 123 | --language[a-z][a-z][a-z] | --language[a-z][a-z] ) |
| 124 | export xx="${1#*e}" |
| 125 | ;; |
| 126 | [a-z][a-z][a-z] | [a-z][a-z] ) |
| 127 | export xx="$1" |
| 128 | ;; |
| 129 | -c | --chapter ) |
| 130 | shift |
| 131 | cc="$1" |
| 132 | validateChapter |
| 133 | ;; |
| 134 | -c[12] ) |
| 135 | export CHAPTER="${1#*c}" |
| 136 | ;; |
| 137 | --chapter[12] ) |
| 138 | export CHAPTER="${1#*r}" |
| 139 | ;; |
| 140 | -h | --help ) |
| 141 | usage |
| 142 | exit |
| 143 | ;; |
| 144 | --list ) |
| 145 | listOptions |
| 146 | exit |
| 147 | ;; |
| 148 | "" ) |
| 149 | ;; |
| 150 | * ) |
| 151 | usage |
| 152 | exit 1 |
| 153 | esac |
| 154 | |
| 155 | shift |
Paul Desmond Parker | 17c71da | 2024-11-03 20:47:53 +0100 | [diff] [blame] | 156 | done |
| 157 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 158 | |
| 159 | # We need a temp file for the copy. First try using a standard command. |
| 160 | tmp="${TMPDIR-/tmp}" |
Aliaksei Budavei | 715a58f | 2024-11-06 21:58:53 +0100 | [diff] [blame] | 161 | # shellcheck disable=SC2186 |
| 162 | TUTORCOPY=$(mktemp "$tmp/tutorXXXXXX" || tempfile -p tutor || echo none) |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 163 | |
| 164 | # If the standard commands failed then create a directory to put the copy in. |
| 165 | # That is a secure way to make a temp file. |
| 166 | if test "$TUTORCOPY" = none; then |
Aliaksei Budavei | 715a58f | 2024-11-06 21:58:53 +0100 | [diff] [blame] | 167 | tmpdir="$tmp/vimtutor$$" |
| 168 | OLD_UMASK=$(umask) |
| 169 | umask 077 |
| 170 | getout=no |
| 171 | mkdir "$tmpdir" || getout=yes |
| 172 | umask "$OLD_UMASK" |
| 173 | if test "$getout" = yes; then |
| 174 | echo "Could not create directory for tutor copy, exiting." |
| 175 | exit 1 |
| 176 | fi |
| 177 | TUTORCOPY="$tmpdir/tutorcopy" |
| 178 | touch "$TUTORCOPY" |
| 179 | TODELETE="$tmpdir" |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 180 | else |
Aliaksei Budavei | 715a58f | 2024-11-06 21:58:53 +0100 | [diff] [blame] | 181 | TODELETE="$TUTORCOPY" |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 182 | fi |
| 183 | |
| 184 | export TUTORCOPY |
| 185 | |
| 186 | # remove the copy of the tutor on exit |
Aliaksei Budavei | 715a58f | 2024-11-06 21:58:53 +0100 | [diff] [blame] | 187 | trap 'rm -rf "$TODELETE"' EXIT HUP INT QUIT SEGV PIPE TERM |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 188 | |
Bram Moolenaar | 1315349 | 2007-07-17 12:33:46 +0000 | [diff] [blame] | 189 | for i in $seq; do |
Aliaksei Budavei | 09cc8c9 | 2024-11-04 19:43:22 +0100 | [diff] [blame] | 190 | testvim=$(command -v "$i" 2>/dev/null) |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 191 | if test -f "$testvim"; then |
Aliaksei Budavei | 715a58f | 2024-11-06 21:58:53 +0100 | [diff] [blame] | 192 | VIM="$i" |
| 193 | break |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 194 | fi |
Bram Moolenaar | 1315349 | 2007-07-17 12:33:46 +0000 | [diff] [blame] | 195 | done |
| 196 | |
| 197 | # When no Vim version was found fall back to "vim", you'll get an error message |
| 198 | # below. |
| 199 | if test -z "$VIM"; then |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 200 | VIM=vim |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 201 | fi |
| 202 | |
| 203 | # Use Vim to copy the tutor, it knows the value of $VIMRUNTIME |
| 204 | # The script tutor.vim tells Vim which file to copy |
Paul Desmond Parker | 17c71da | 2024-11-03 20:47:53 +0100 | [diff] [blame] | 205 | |
Aliaksei Budavei | 715a58f | 2024-11-06 21:58:53 +0100 | [diff] [blame] | 206 | $VIM -f -u NONE -c "so \$VIMRUNTIME/tutor/tutor.vim" |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 207 | |
Bram Moolenaar | 527dec3 | 2018-04-12 20:36:43 +0200 | [diff] [blame] | 208 | # Start vim without any .vimrc, set 'nocompatible' and 'showcmd' |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 209 | $VIM -f -u NONE -c "set nocp showcmd" "$TUTORCOPY" |
Aliaksei Budavei | 715a58f | 2024-11-06 21:58:53 +0100 | [diff] [blame] | 210 | |
| 211 | # vim:sw=4:ts=8:noet:nosta: |