X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/3bf5f17a187f06908852543b43ae9037a2985294..b86c1cd8d355d766f567350a874d137e74ecc765:/lisp/flow-ctrl.el diff --git a/lisp/flow-ctrl.el b/lisp/flow-ctrl.el index 3e271510ff..2890f0be43 100644 --- a/lisp/flow-ctrl.el +++ b/lisp/flow-ctrl.el @@ -1,46 +1,45 @@ ;;; flow-ctrl.el --- help for lusers on cu(1) or ttys with wired-in ^S/^Q flow control -;;; Copyright (C) 1990, 1991 Free Software Foundation, Inc. +;; Copyright (C) 1990, 1991, 1994, 2001, 2002, 2003, 2004, 2005, 2006, +;; 2007, 2008, 2009 Free Software Foundation, Inc. -;; Author Kevin Gallagher +;; Author: Kevin Gallagher ;; Maintainer: FSF ;; Adapted-By: ESR ;; Keywords: hardware -;;; This file is part of GNU Emacs. -;;; -;;; GNU Emacs is distributed in the hope that it will be useful, but -;;; WITHOUT ANY WARRANTY. No author or distributor accepts -;;; RESPONSIBILITY TO anyone for the consequences of using it or for -;;; whether it serves any particular purpose or works at all, unless -;;; he says so in writing. Refer to the GNU Emacs General Public -;;; License for full details. -;;; -;;; Everyone is granted permission to copy, modify and redistribute -;;; GNU Emacs, but only under the conditions described in the GNU -;;; Emacs General Public License. A copy of this license is supposed -;;; to have been given to you along with GNU Emacs so you can know -;;; your rights and responsibilities. It should be in a file named -;;; COPYING. Among other things, the Copyright notice and this notice -;;; must be preserved on all copies. +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . ;;; Commentary: -;;;; Terminals that use XON/XOFF flow control can cause problems with -;;;; GNU Emacs users. This file contains Emacs Lisp code that makes it -;;;; easy for a user to deal with this problem, when using such a -;;;; terminal. -;;;; -;;;; To invoke these adjustments, a user need only invoke the function -;;;; enable-flow-control-on with a list of terminal types in his/her own -;;;; .emacs file. As arguments, give it the names of one or more terminal -;;;; types in use by that user which require flow control adjustments. -;;;; Here's an example: -;;;; -;;;; (enable-flow-control-on "vt200" "vt300" "vt101" "vt131") - -;;; Portability note: This uses (getenv "TERM"), and therefore probably -;;; won't work outside of UNIX-like environments. +;; Terminals that use XON/XOFF flow control can cause problems with +;; GNU Emacs users. This file contains Emacs Lisp code that makes it +;; easy for a user to deal with this problem, when using such a +;; terminal. +;; +;; To invoke these adjustments, a user need only invoke the function +;; enable-flow-control-on with a list of terminal types in his/her own +;; .emacs file. As arguments, give it the names of one or more terminal +;; types in use by that user which require flow control adjustments. +;; Here's an example: +;; +;; (enable-flow-control-on "vt200" "vt300" "vt101" "vt131") + +;; Portability note: This uses (getenv "TERM"), and therefore probably +;; won't work outside of UNIX-like environments. ;;; Code: @@ -49,6 +48,8 @@ (defvar flow-control-c-q-replacement ?\036 "Character that replaces C-q, when flow control handling is enabled.") +(put 'keyboard-translate-table 'char-table-extra-slots 0) + ;;;###autoload (defun enable-flow-control (&optional argument) "Toggle flow control handling. @@ -63,34 +64,40 @@ With arg, enable flow control mode if arg is positive, otherwise disable." (progn ;; Turn flow control off, and stop exchanging chars. (set-input-mode t nil (nth 2 (current-input-mode))) - (aset keyboard-translate-table flow-control-c-s-replacement nil) - (aset keyboard-translate-table ?\^s nil) - (aset keyboard-translate-table flow-control-c-q-replacement nil) - (aset keyboard-translate-table ?\^q nil)) + (if keyboard-translate-table + (progn + (aset keyboard-translate-table flow-control-c-s-replacement nil) + (aset keyboard-translate-table ?\^s nil) + (aset keyboard-translate-table flow-control-c-q-replacement nil) + (aset keyboard-translate-table ?\^q nil)))) ;; Turn flow control on. ;; Tell emacs to pass C-s and C-q to OS. (set-input-mode nil t (nth 2 (current-input-mode))) ;; Initialize translate table, saving previous mappings, if any. - (let ((the-table (make-string 128 0))) - (let ((i 0) - (j (length keyboard-translate-table))) - (while (< i j) - (aset the-table i (elt keyboard-translate-table i)) - (setq i (1+ i))) - (while (< i 128) - (aset the-table i i) - (setq i (1+ i)))) - (setq keyboard-translate-table the-table)) + (cond ((null keyboard-translate-table) + (setq keyboard-translate-table + (make-char-table 'keyboard-translate-table nil))) + ((char-table-p keyboard-translate-table) + (setq keyboard-translate-table + (copy-sequence keyboard-translate-table))) + (t + (let ((the-table (make-char-table 'keyboard-translate-table nil))) + (let ((i 0) + (j (length keyboard-translate-table))) + (while (< i j) + (aset the-table i (elt keyboard-translate-table i)) + (setq i (1+ i)))) + (setq keyboard-translate-table the-table)))) ;; Swap C-s and C-\ (aset keyboard-translate-table flow-control-c-s-replacement ?\^s) (aset keyboard-translate-table ?\^s flow-control-c-s-replacement) ;; Swap C-q and C-^ (aset keyboard-translate-table flow-control-c-q-replacement ?\^q) (aset keyboard-translate-table ?\^q flow-control-c-q-replacement) - (message (concat - "XON/XOFF adjustment for " - (getenv "TERM") - ": use C-\\ for C-s and use C-^ for C-q.")) + (message "XON/XOFF adjustment for %s: use %s for C-s, and use %s for C-q" + (getenv "TERM") + (single-key-description flow-control-c-s-replacement) + (single-key-description flow-control-c-q-replacement)) (sleep-for 2))) ; Give user a chance to see message. ;;;###autoload @@ -102,14 +109,18 @@ you must type C-\\ to get the effect of a C-s, and type C-^ to get the effect of a C-q." (let ((term (getenv "TERM")) hyphend) + ;; Look for TERM in LOSING-TERMINAL-TYPES. + ;; If we don't find it literally, try stripping off words + ;; from the end, one by one. + (while (and term (not (member term losing-terminal-types))) + ;; Strip off last hyphen and what follows, then try again. + (if (setq hyphend (string-match "[-_][^-_]+$" term)) + (setq term (substring term 0 hyphend)) + (setq term nil))) (if term - (progn - ;; Strip off hyphen and what follows - (while (setq hyphend (string-match "[-_][^-_]+$" term)) - (setq term (substring term 0 hyphend))) - (and (member term losing-terminal-types) - (enable-flow-control)))))) + (enable-flow-control)))) (provide 'flow-ctrl) +;; arch-tag: 0eb7b19e-0d93-4e0b-9ea2-72b574076a56 ;;; flow-ctrl.el ends here