;;; viper-ex.el --- functions implementing the Ex commands for Viper
-;; Copyright (C) 1994-1998, 2000-2013 Free Software Foundation, Inc.
+;; Copyright (C) 1994-1998, 2000-2016 Free Software Foundation, Inc.
;; Author: Michael Kifer <kifer@cs.stonybrook.edu>
;; Package: viper
))
;; Get an ex-token which is either an address or a command.
-;; A token has a type, \(command, address, end-mark\), and a value
+;; A token has a type, (command, address, end-mark), and a value
(defun viper-get-ex-token ()
(save-window-excursion
(setq viper-ex-work-buf (get-buffer-create viper-ex-work-buf-name))
(while (and (not (eolp)) cont)
;;(re-search-forward "[^/]*/")
(re-search-forward "[^/]*\\(/\\|\n\\)")
- (if (not (looking-back "[^\\\\]\\(\\\\\\\\\\)*\\\\/"))
+ (if (not (looking-back "[^\\\\]\\(\\\\\\\\\\)*\\\\/"
+ (line-beginning-position 0)))
(setq cont nil))))
(backward-char 1)
(setq ex-token (buffer-substring (point) (mark t)))
(while (and (not (eolp)) cont)
;;(re-search-forward "[^\\?]*\\?")
(re-search-forward "[^\\?]*\\(\\?\\|\n\\)")
- (if (not (looking-back "[^\\\\]\\(\\\\\\\\\\)*\\\\\\?"))
+ (if (not (looking-back "[^\\\\]\\(\\\\\\\\\\)*\\\\\\?"
+ (line-beginning-position 0)))
(setq cont nil))
(backward-char 1)
(if (not (looking-at "\n")) (forward-char 1))))
(forward-char 1)
(cond ((looking-at "'") (setq ex-token nil))
((looking-at "[a-z]") (setq ex-token (following-char)))
- (t (error "Marks are ' and a-z")))
+ (t (error "%s" "Marks are ' and a-z")))
(forward-char 1))
((looking-at "\n")
(setq ex-token-type 'end-mark)
save-pos (point)))
(if (or (= dist 0)
- (looking-back "\\([ \t]*['`][ \t]*[a-z]*\\)")
+ (looking-back "\\([ \t]*['`][ \t]*[a-z]*\\)"
+ (line-beginning-position))
(looking-back
- "^[ \t]*[a-zA-Z!=>&~][ \t]*[/?]*[ \t]+[a-zA-Z!=>&~]+"))
+ "^[ \t]*[a-zA-Z!=>&~][ \t]*[/?]*[ \t]+[a-zA-Z!=>&~]+"
+ (line-beginning-position)))
;; Preceding characters are not the ones allowed in an Ex command
;; or we have typed past command name.
;; Note: we didn't do parsing, so there can be surprises.
- (if (or (looking-back "[a-zA-Z!=>&~][ \t]*[/?]*[ \t]*")
- (looking-back "\\([ \t]*['`][ \t]*[a-z]*\\)")
+ (if (or (looking-back "[a-zA-Z!=>&~][ \t]*[/?]*[ \t]*"
+ (line-beginning-position))
+ (looking-back "\\([ \t]*['`][ \t]*[a-z]*\\)"
+ (line-beginning-position))
(looking-at "[^ \t\n\C-m]"))
nil
(with-output-to-temp-buffer "*Completions*"
(error "Missing closing delimiter for global regexp")
(goto-char (point-max))))
(if (not (looking-back
- (format "[^\\\\]\\(\\\\\\\\\\)*\\\\%c" c)))
+ (format "[^\\\\]\\(\\\\\\\\\\)*\\\\%c" c)
+ (line-beginning-position 0)))
(setq cont nil)
;; we are at an escaped delimiter: unescape it and continue
(delete-char -2)
(while (re-search-forward "%\\|#" nil t)
(let ((data (match-data))
(char (buffer-substring (match-beginning 0) (match-end 0))))
- (if (looking-back (concat "\\\\" char))
+ (if (looking-back "\\\\." (- (point) 2))
(replace-match char)
(store-match-data data)
(if (string= char "%")
(get-buffer-create viper-ex-work-buf-name))
(skip-chars-forward " \t")
(if (looking-at "!")
- (if (and (not (looking-back "[ \t]"))
+ (if (and (not (looking-back "[ \t]" (1- (point))))
;; read doesn't have a corresponding :r! form, so ! is
;; immediately interpreted as a shell command.
(not (string= ex-token "read")))
(cond ((ex-cmd-accepts-multiple-files-p ex-token) (exit-minibuffer))
;; apparently the argument to an Ex command is
;; supposed to be a shell command
- ((looking-back "^[ \t]*!.*")
+ ((looking-back "^[ \t]*!.*" (line-beginning-position))
(setq ex-cmdfile t)
(insert " "))
(t
(kill-region (point) (mark t))))))
-(declare-function viper-change-state-to-vi "viper-cmd" ())
+(declare-function viper-change-state-to-vi "viper-cmd" (&rest _))
;; Ex edit command
;; In Viper, `e' and `e!' behave identically. In both cases, the user is
(if (and (not (string= ex-file (buffer-file-name)))
(buffer-modified-p)
(not ex-variant))
- (error "No write since last change \(:rec! overrides\)"))
+ (error "No write since last change (:rec! overrides)"))
(recover-file ex-file))
;; Tell that `rewind' is obsolete and to use `:next count' instead
(if (featurep 'xemacs) "X" "")
))))))
-;; Ex source command. Loads the file specified as argument or `~/.viper'
+;; Ex source command.
+;; Loads the file specified as argument or viper-custom-file-name.
(defun ex-source ()
(viper-get-ex-file)
(if (string= ex-file "")
(beginning-of-line)
(if opt-c (message "done"))))
-(declare-function viper-change-state-to-emacs "viper-cmd" ())
+(declare-function viper-change-state-to-emacs "viper-cmd" (&rest _))
;; Ex tag command
(defun ex-tag ()
(defun ex-compile ()
"Reads args from the command line, then runs make with the args.
If no args are given, then it runs the last compile command.
-Type 'mak ' (including the space) to run make with no args."
+Type `mak ' (including the space) to run make with no args."
(let (args)
(with-current-buffer (setq viper-ex-work-buf
(get-buffer-create viper-ex-work-buf-name))