diff options
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/ChangeLog | 8 | ||||
-rw-r--r-- | lisp/net/tramp-sh.el | 61 | ||||
-rw-r--r-- | lisp/progmodes/compile.el | 6 | ||||
-rw-r--r-- | lisp/progmodes/grep.el | 8 |
4 files changed, 52 insertions, 31 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 8e68eb40768..4bad667aa50 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,11 @@ +2013-12-06 Michael Albinus <michael.albinus@gmx.de> + + * progmodes/compile.el (compilation-start): + * progmodes/grep.el (rgrep): Revert change 2012-12-20T11:15:38Z!michael.albinus@gmx.de. + + * net/tramp-sh.el (tramp-sh-handle-start-file-process): + Handle long command lines, lasting from "sh -c ...". (Bug#16045) + 2013-12-06 Dmitry Gutov <dgutov@yandex.ru> * progmodes/ruby-mode.el (ruby-syntax-propertize-function): Touch diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index 6beece526ff..314c1a6f8e7 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -2686,27 +2686,46 @@ the result will be a local, non-Tramp, filename." (defun tramp-sh-handle-start-file-process (name buffer program &rest args) "Like `start-file-process' for Tramp files." (with-parsed-tramp-file-name default-directory nil - ;; When PROGRAM is nil, we just provide a tty. - (let ((command - (when (stringp program) - (format "cd %s; exec env PS1=%s %s" - (tramp-shell-quote-argument localname) - ;; Use a human-friendly prompt, for example for `shell'. - (tramp-shell-quote-argument - (format "%s %s" - (file-remote-p default-directory) - tramp-initial-end-of-output)) - (mapconcat 'tramp-shell-quote-argument - (cons program args) " ")))) - (tramp-process-connection-type - (or (null program) tramp-process-connection-type)) - (bmp (and (buffer-live-p buffer) (buffer-modified-p buffer))) - (name1 name) - (i 0) - ;; We do not want to raise an error when - ;; `start-file-process' has been started several time in - ;; `eshell' and friends. - (tramp-current-connection nil)) + (let* (;; When PROGRAM matches "*sh", and the first arg is "-c", + ;; it might be that the arguments exceed the command line + ;; length. Therefore, we modify the command. + (heredoc (and (stringp program) + (string-match "sh$" program) + (string-equal "-c" (car args)) + (= (length args) 2))) + ;; When PROGRAM is nil, we just provide a tty. + (args (if (not heredoc) args + (let ((i 250)) + (while (and (< i (length (cadr args))) + (string-match " " (cadr args) i)) + (setcdr + args + (list (replace-match " \\\\\n" nil nil (cadr args)))) + (setq i (+ i 250)))) + (cdr args))) + (command + (when (stringp program) + (format "cd %s; exec %s env PS1=%s %s" + (tramp-shell-quote-argument localname) + (if heredoc "<<EOF" "") + ;; Use a human-friendly prompt, for example for `shell'. + (tramp-shell-quote-argument + (format "%s %s" + (file-remote-p default-directory) + tramp-initial-end-of-output)) + (if heredoc + (format "%s\n%s\nEOF" program (car args)) + (mapconcat 'tramp-shell-quote-argument + (cons program args) " "))))) + (tramp-process-connection-type + (or (null program) tramp-process-connection-type)) + (bmp (and (buffer-live-p buffer) (buffer-modified-p buffer))) + (name1 name) + (i 0) + ;; We do not want to raise an error when + ;; `start-file-process' has been started several time in + ;; `eshell' and friends. + (tramp-current-connection nil)) (unless buffer ;; BUFFER can be nil. We use a temporary buffer. diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el index 58325b26634..5689be49f61 100644 --- a/lisp/progmodes/compile.el +++ b/lisp/progmodes/compile.el @@ -1623,11 +1623,7 @@ Returns the compilation buffer created." (format "%s started at %s\n\n" mode-name (substring (current-time-string) 0 19)) - ;; The command could be split into several lines, see - ;; `rgrep' for example. We want to display it as one - ;; line. - (apply 'concat (split-string command (regexp-quote "\\\n") t)) - "\n") + command "\n") (setq thisdir default-directory)) (set-buffer-modified-p nil)) ;; Pop up the compilation buffer. diff --git a/lisp/progmodes/grep.el b/lisp/progmodes/grep.el index 46af51e1f97..e63e29df37d 100644 --- a/lisp/progmodes/grep.el +++ b/lisp/progmodes/grep.el @@ -995,8 +995,6 @@ to specify a command to run." (compilation-start regexp 'grep-mode)) (setq dir (file-name-as-directory (expand-file-name dir))) (require 'find-dired) ; for `find-name-arg' - ;; In Tramp, there could be problems if the command line is too - ;; long. We escape it, therefore. (let ((command (grep-expand-template grep-find-template regexp @@ -1005,7 +1003,7 @@ to specify a command to run." (mapconcat #'shell-quote-argument (split-string files) - (concat "\\\n" " -o " find-name-arg " ")) + (concat " -o " find-name-arg " ")) " " (shell-quote-argument ")")) dir @@ -1026,7 +1024,7 @@ to specify a command to run." (concat "*/" (cdr ignore))))))) grep-find-ignored-directories - "\\\n -o -path ") + " -o -path ") " " (shell-quote-argument ")") " -prune -o ")) @@ -1044,7 +1042,7 @@ to specify a command to run." (shell-quote-argument (cdr ignore)))))) grep-find-ignored-files - "\\\n -o -name ") + " -o -name ") " " (shell-quote-argument ")") " -prune -o ")))))) |