This document applies to the Windows NT (including Windows 2000, XP, Server 2003 etc.) native versions of tcsh. Note that the shell probably does work on Windows NT 4.0 or Windows 95, 98, and Me. However, making fixes solely for those operating systems is lowest on my priority list. "Windows NT" from here on refers to Windows 2000, XP etc. "Win 9x" means Windows 95,98 etc. I will attempt to describe the various differences between the Unix and the native Windows versions of tcsh. I assume at least a passing familiarity with Unix, Windows and tcsh. How to tell if you're running the native version (versus cygwin) ---------------------------------------------------------------- If, - You built the binary from the tcsh distribution, using Visual C++. Or, you downloaded it from www.blarg.net/~amol/~tcsh.exe.gz. Or, you downloaded it from ftp.blarg.net:users/amol/tcsh. Or, you type echo $version and see something like: tcsh 6.12.01 (Astron) 2003-02-08 (i686-Microsoft-WindowsXP) options 8b,nls,dl,hb,color,nt-rev-7.03 (The string "nt-rev-N.NN" only exists on native binaries of tcsh. The actual revision may be different, as it is a minor revision of the tcsh major version (6.12.01 in this case).) If none of the above is true, this document is not for you. Who do I bug about bugs ? ------------------------- If the bug is on the lines of "cmd.exe does this, but tcsh doesn't", you have a very slim chance of having me look at it. If you feel strongly enough, grab the source and hack away. Isn't that the joy of Open Source (TM) ? Also, try running the latest version if you can. Your bug may already be fixed. If you still want to report a bug: First, verify if applicable/possible on a Unix system that the behaviour is actually different. Secondly, setenv CYGWIN noglob if it's not already set. If that still doesn't work, then Third, set NTslowexec setenv TCSHONLYSTARTEXES 1 and try to reproduce the problem. Even if the 3rd step seems to fix the behaviour, you should still report the bug to email@example.com with the following information: - The output of echo $version - The version of the operating system ("Windows" is not good enough.) - The output from "set" and "setenv" - The exact steps to reproduce the problem. Be prepared to be quizzed on the contents of this file. How do I compile the source ? ----------------------------- - Download and extract the source from ftp.astron.com. Say it creates a directory called tcsh-6.12.01 - Open a cmd.exe prompt and cd into this directory. Run "vcvars32.bat" from your Visual C++ installation. - type "copy config\win32 config.h" - type "nmake -f win32\makefile.win32" You will need sed to generate some headers. Known bugs ---------- The "time" builtin does not work. Startup Files: -------------- tcsh will create a HOME variable, if none is set, based on the OS. For Win 9x: <windows_directory>/.tcshrc For Example, C:\WINDOWS\.tcshrc For Windows NT: version 3.51: <getenv(HOMEDRIVE)/getenv(HOMEPATH)/.tcshrc> Usually something like C:\USERS\DEFAULT\.tcshrc version 4.00 and above: <getenv(USERPROFILE)/.tcshrc) This can vary from something like C:\WINNT\USERS\amol\profile\.tcshrc on NT 4.0 to C:\Documents And Settings\amol\.tcshrc on Windows 2000 and higher. These can all be overridden by setting HOME in the user's environment before the shell is launched. To create a .tcshrc on Windows, you just need a real editor like Vim. o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o Various differences from Unix, FAQs, etc. o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o This document is correct as of 6.12.01 New Builtins ------------ * start : Works like cmd.exe's "start". Use to launch an application or launch a filetype association. Can also be used to launch Windows Explorer on a directory by typing "start c:/foo", for example. Also "start http://www.tcsh.org" will launch Internet explorer with that URL. ("Associations" here means Explorer file-type associations, that cause, for example, Microsoft Word to be launched when you type "foo.doc" at a cmd.exe prompt. That can have unexpected side-effects like batch files and perl scripts launching in another window when run from tcsh. ) * title: Sets the title of the shell. Stores the current title in $oldtitle before changing it. * cls: Clear the entire console screen buffer instead of the visible window. * ps : List processes. With -w, list titles as well. * shutdown [-r | -l | -f] now : Windows NT only. Reboot or log off. -f forces open applications to close. "now" must be specified for reboots. Builtins that behave differently ------------------------------------ This section documents the builtins that present on Unix as well as windows, but function slightly differently on Windows. Also mentioned is behaviour that is different from what you are used to on Windows. * Backgrounding (launching commands with '&'). While this is possible, be aware that Windows does not have any job control. Thus you cannot attempt to bring a backgrounded job into the foreground with '%<job number>' as on Unix. Also note that a background job will most likely be killed if you exit the command prompt that launched it. To prevent this from happening, use the "nohup" builtin. For example: nohup foo & This will print "foo Done" quickly, as if the job actually completed. However, if you type "ps", you will see that foo is still running. The shell does not know after nohup whether the child process is running or not. * Case insenstivity of environment variable names. To maintain consistency with Windows, and avoid conflicts, the following are equivalent on Windows: setenv FOO bar setenv foo bar Note that setenv foo BAR and setenv foo bar ARE NOT the same. Thus if some application is sensitive to the case of an environment variable's VALUE, you should set it exactly as required. * No termcap set/unset with settc/echotc/telltc. The only capabilities controllable are lines and columns. For example, settc co 80 settc li 50 similarly, echotc cols or echotc lines will echo the number of columns and lines respectively. echotc buffer will echo the size of the console screen buffer. Note that settc has an interesting side effect, which was left in because it can be useful. Consider the following: If your original line size was 50, with a console screen buffer of 50 as well (no scrollback), then typing settc li 300 followed by settc li 50 has the effect of setting your console screen buffer to 300, so you now have a scrollback, without having to set the properties of the tcsh.exe window. This is particularly useful on Win9x, where getting a console scrollback buffer seems to be practically impossible in a reasonable fashion otherwise. * No execution of .bat or .cmd files by name alone. That is, you have to type foo.bat or foo.cmd to execute a batch file, even if it is in your path. This is by design. No file types other than 32-bit executables are recognized by the shell. Unless you type the full name, the shell attempt to execute either the name as typed ("foo" for example) or the name with .exe appended to it ("foo.exe"). * The "watch" variable and the "log" builtin. To attempt to duplicate the functionality of the log/watch combination on Unix, the Windows version of shell uses NETBIOS and the semantics are slightly different. Whereas in Unix you might type set watch=(amol tty0 root any) in Windows you would type set watch=(AMOL AMOLSCOMPUTER THEBOSS any) Thus, instead of tty, the computer name of the user may be specified. In this case, you will be notified if the user AMOL is logged on AMOLSCOMPUTER or THEBOSS is logged on any computer. Note that the names must be uppercase. * The "nice" builtin. Functionally, pretty much the same as Unix, with the range being from -6 to +7, and +4 by default. These niceness numbers map to absolutes priorities based on the assumption that the process started at the typical Foreground Normal Priority Class. That means, if your shell is somehow started at a higher than normal priority, even a nice +1 will lower the priority to below normal, much more than just a relative lowering by one level. * The "kill" builtin. You can try to kill a process 4 ways: kill -1 <pid> (which will send a sigint) kill -2 <pid> (which will send a sigbreak) 1 and 2 are only good for processes started in the same console. The signals cannot be sent to other process groups (other consoles/GUI apps). kill -3 <pid> (sends a WM_QUIT message to each window of the child> Useful for closing GUI apps. kill -7 <pid> , which will call TerminateProcess() on the process. This is dangerous and should be a last resort. Special Variables ----------------- o Environment Variables: *-*-*-*-*-*-*-*-*-*-*-*-* This version of tcsh uses the following environment variables - TCSHSUBSTHB (Short for "tcsh substitute hashbang"): Supplies mappings for the shell's hashbang emulation. For example, setenv TCSHSUBSTHB "/usr/local/bin/perl c:/bin/perl.exe;" If the variable is thus set, any script that has "#!/usr/local/bin/perl" on the first line will be run as if "#!c:/bin/perl.exe" was the first line. The terminating ";" is a must.There is a limit of 20 such pairs. - TCSHONLYSTARTEXES Controls whether Explorer Associations will be tried for non-executables. For example, "setenv TCSHONLYSTARTEXES 1" , tells tcsh to not try to execute a non-exe or non-script. The value must be EXACTLY one character long. (a zero-length setting will not work. A length greater than 1 will be assumed to be a list of extensions as below.) You can also supply a semi-colon-separated list of extensions for which to NOT try associations. For example, if the variable is set to "cmd;bat", .cmd/.bat files will be executed in the same window because the default association is not used, instead an internal hack feeds them to the DOS command processor. If the file extension does not match the list, the shell will try to launch an association. Any changes to this variable will NOT affect the the "start" builtin. That builtin ALWAYS launches associations, since the whole point of using "start" is to launch an application. - TCSH_NOASYNCGUI: By default, a Windows GUI application is launched asynchronously. That is, the shell does not wait for the application to terminate but immediately returns you to the prompt. If this variable is set, the shell will wait for the GUI application to exit before going on. - TCSHLANG: NLS support You can get messages in a specific language by doing: setenv TCSHLANG <dll>, where <dll> is the name of the NLS dll. tcsh comes with: tcshde.dll -> German tcshfr.dll -> French tcshsp.dll -> Spanish tcsh-it.dll -> Italian tcshc.dll => Default "C" locale You can change the dll at runtime by setting/unsetting this variable. You can specify the DLL name, or the complete path, if it is not in your standard search path. (Using tcshc.dll is useless and adds unnecessary overhead. If you are using English versions, do not install the dlls) o Shell Variables: *-*-*-*-*-*-*-* This version of tcsh recognizes the following shell variables: - oldtitle : Stores the previous value of the title, when the "title" builtin is used to change it. So, "title $oldtitle", will restore the previous title. - NTlamepathfix: Normally, tcsh sets the PATH variable to be delimited by "/". However, some applications may have trouble with this, so you can force the shell to convert "/" to "\" before executing an external (not builtin) command. - NTslowexec: The shell will usually try to avoid forking if a command can be executed directly (using the CreateProcess() API instead of fork()). This only applies to "simple" commands. These are commands that do not have their output piped, redirected or are not niced or nohupped. If you see any strange behaviour from the shell in terms of wildcard expansion or quote substitution, try setting this variable (AFTER setting CYGWIN noglob!!!). - NTnoquoteprotect: Ordinarily , if you pass a double quote to a command string, tcsh will protect the quotes by adding backslashes. For example, find . -name '"*.c"' would get executed as find . -name \"*.c\" Some applications (MKS find, for example) do not like the '\'. To prevent tcsh from quoting such arguments, set this variable. Of course, it may cause other applications to break, so use at your own risk. - NTcaseifypwd: If set, corrects case of current directory when cd'ing into it. Some "filesystems" can't handle the default behaviour. Only works on Windows NT. Key bindings, clipboard support and edit functions -------------------------------------------------- To use keys like function keys, arrows, insert, etc., the following form of bindkey must be used: bindkey -b N-xxx <command> where xxx is either: a) A number from 1 through 24, representing the fucntion keys. For example, bindkey -b N-1 run-help b) The strings "pgup","pgdown","end","home", "left","up","right","down", "ins","del" For example, bindkey -b N-del delete-char Here are the bindings I use in my .tcshrc: # NT specific bindkey extensions bindkey -b N-up up-history bindkey -b N-down down-history bindkey -b N-right forward-char bindkey -b N-left backward-char bindkey -b N-del delete-char bindkey -b N-ins overwrite-mode bindkey -b N-1 which-command bindkey -b N-2 expand-history bindkey -b N-3 complete-word-raw bindkey -b N-home beginning-of-line bindkey -b N-end end-of-line bindkey -b N-pgup e_page_up bindkey -b N-pgdown e_page_down (Note that on Win9x, you must set your console window to NOT be Auto sized, and you must use the "settc" builtin to increase and then reduce back the number of lines, in order to get a scrollbar. pgup and pgdown will not work without a scroll bar) To bind ctrl or alt combinations, use the following as examples. (Alt on PC keyboards is treated as the Meta on Unix keyboards ) bindkey -b N-C-left backward-word bindkey -b N-M-right forward-word For Shift combinations: bindkey -b N-S-1 backward-word Clipboard support o-o-o-o-o-o-o-o-o You can also cut and paste to and from the clipboard directly from the shell. To do this, use bindings like the following: bindkey -b M-x e_copy_to_clipboard bindkey -b M-y e_paste_from_clipboard Then, to paste text from the clipboard into the current input line, you can type: M-y And to copy the current shell's kill buffer to the clipboard, M-x (The kill buffer contains the last deletion from an editing command. Sort of like an 'undo' buffer). You can also use the clipboard to redirect I/O, with /dev/clipboard as the destination/source file. Editor Functions o-o-o-o-o-o-o-o-o e_dosify_next ------------- A key bound to this editor function can be used to convert unix-style paths to DOS-style paths. For example, bindkey -b M-/ e_dosify_next Then, if I had line like so: xcopy /e /u c:/nt40/system32 I would move the cursor to the C: and hit alt-/. magically, the command line changes to xcopy /e /u c:\\nt40\\system32 This function converts every '/' to '\\' until the first space. If the space is escaped by a '\', the function looks for the next space. e_dosify_prev ------------- Works like above, but on the previous word. e_page_up --------- Editor function to move console window up one page. Can be bound to PageUp key, for example. e_page_down ---------- Ditto for page down. e_copy_to_clipboard ------------------- See Clipboard Support above. e_paste_from_clipboard ----------------------- See Clipboard Support above.