From 90d53b15df1206bb0c2739e525c2ba89c557882c Mon Sep 17 00:00:00 2001 From: David Maus Date: Sun, 16 Jan 2011 17:28:19 +0100 Subject: [PATCH 01/13] Don't try to merge abbrev tables if `php-mode-abbrev-table' is unbound * php-repl.el: Don't try to merge abbrev tables if `php-mode-abbrev-table' is unbound. --- data/php-repl.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/data/php-repl.el b/data/php-repl.el index 08d6ad4..ebc0b20 100644 --- a/data/php-repl.el +++ b/data/php-repl.el @@ -81,8 +81,9 @@ (define-derived-mode inferior-php-mode comint-mode "Inferior PHP") (defvar inferior-php-mode-abbrev-table (make-abbrev-table)) -(derived-mode-merge-abbrev-tables php-mode-abbrev-table - inferior-php-mode-abbrev-table) +(if (boundp php-mode-abbrev-table) + (derived-mode-merge-abbrev-tables php-mode-abbrev-table + inferior-php-mode-abbrev-table)) (derived-mode-set-abbrev-table 'inferior-php-mode) (defvar eval-php-mode-map From 1bb8763c6e8eda0b07d11c39a866855f1ca262b1 Mon Sep 17 00:00:00 2001 From: David Maus Date: Sun, 16 Jan 2011 17:31:42 +0100 Subject: [PATCH 02/13] Move point to inferior php buffer * php-repl.el (run-php): Move point to inferior php buffer. Otherwise major mode of current buffer is set to `inferior-php-mode'. --- data/php-repl.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/php-repl.el b/data/php-repl.el index ebc0b20..d8d77c6 100644 --- a/data/php-repl.el +++ b/data/php-repl.el @@ -75,7 +75,7 @@ (mapconcat 'identity php-repl-program-arguments " ")) (setq inferior-php-buffer buf) (display-buffer buf t) - ;; (pop-to-buffer buf t) + (pop-to-buffer buf t) (inferior-php-mode))) (define-derived-mode inferior-php-mode comint-mode "Inferior PHP") From 9e57494b3d2bda5e37321713c99119384190521e Mon Sep 17 00:00:00 2001 From: David Maus Date: Sun, 16 Jan 2011 18:15:39 +0100 Subject: [PATCH 03/13] Fix missing quote * php-repl.el: Fix missing quote. --- data/php-repl.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/php-repl.el b/data/php-repl.el index d8d77c6..c1d1968 100644 --- a/data/php-repl.el +++ b/data/php-repl.el @@ -81,7 +81,7 @@ (define-derived-mode inferior-php-mode comint-mode "Inferior PHP") (defvar inferior-php-mode-abbrev-table (make-abbrev-table)) -(if (boundp php-mode-abbrev-table) +(if (boundp 'php-mode-abbrev-table) (derived-mode-merge-abbrev-tables php-mode-abbrev-table inferior-php-mode-abbrev-table)) (derived-mode-set-abbrev-table 'inferior-php-mode) From 7bd5ecf7601358aab2fd9c396074aa3ff2bfd13b Mon Sep 17 00:00:00 2001 From: David Maus Date: Sun, 16 Jan 2011 18:26:49 +0100 Subject: [PATCH 04/13] Use `apply' to pass php repl program arguments * php-repl.el (run-php): Use `apply' to pass php repl program arguments. Otherwise if `php-repl-program-arguments' is the empty, the empty string is passed as argument for `php-repl-program' which causes the process to terminate. --- data/php-repl.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/data/php-repl.el b/data/php-repl.el index c1d1968..43798de 100644 --- a/data/php-repl.el +++ b/data/php-repl.el @@ -70,9 +70,7 @@ (interactive "p") (let ((buf (cond ((buffer-live-p inferior-php-buffer) inferior-php-buffer) (t (generate-new-buffer "*inferior-php*"))))) - (make-comint-in-buffer - "PHP" buf php-repl-program nil - (mapconcat 'identity php-repl-program-arguments " ")) + (apply 'make-comint-in-buffer "PHP" buf php-repl-program nil php-repl-program-arguments) (setq inferior-php-buffer buf) (display-buffer buf t) (pop-to-buffer buf t) From 6a501ad8d0c3efdd14a3e5b1ea7ff122baaddbb6 Mon Sep 17 00:00:00 2001 From: Justin Hileman Date: Wed, 17 Mar 2010 04:50:35 +0800 Subject: [PATCH 05/13] Removed need to explicitly end lines with backslashes inside matched parens or curlies. --- PHP/Repl.php | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/PHP/Repl.php b/PHP/Repl.php index fe5faaf..76c93a4 100755 --- a/PHP/Repl.php +++ b/PHP/Repl.php @@ -154,9 +154,11 @@ public function run(array $scope = array()) */ private function read() { - $code = ''; - $done = false; - $lines = 0; + $code = ''; + $done = false; + $lines = 0; + $curleys = 0; + $parens = 0; static $shifted; if (!$shifted) { // throw away argv[0] @@ -179,13 +181,37 @@ private function read() return false; } + $done = true; $line = trim($line); // If the last char is a backslash, remove it and // accumulate more lines. if (substr($line, -1) == '\\') { - $line = substr($line, 0, strlen($line) - 1); - } else { - $done = true; + $line = trim(substr($line, 0, strlen($line) - 1)); + $done = false; + } + + // check for curleys and parens, keep accumulating lines. + $tokens = token_get_all(" 0) { + $done = false; + } else if ($parens > 0) { + $done = false; } $code .= $line; $lines++; From 0c9ab045dc7c8a1ae23aa68988dd3e94f048da1e Mon Sep 17 00:00:00 2001 From: Justin Hileman Date: Wed, 17 Mar 2010 05:38:33 +0800 Subject: [PATCH 06/13] Combined curleys and parens logic into a token stack, allows matching token pairs instead of naive counters. > If an unmatched token is incountered, in input, the read function will throw a generic exception. > Semicolons are only implicitly added inside curlies, not inside parens. --- PHP/Repl.php | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/PHP/Repl.php b/PHP/Repl.php index 76c93a4..4c80d90 100755 --- a/PHP/Repl.php +++ b/PHP/Repl.php @@ -154,11 +154,10 @@ public function run(array $scope = array()) */ private function read() { - $code = ''; - $done = false; - $lines = 0; - $curleys = 0; - $parens = 0; + $code = ''; + $done = false; + $lines = 0; + $stack = array(); static $shifted; if (!$shifted) { // throw away argv[0] @@ -195,22 +194,30 @@ private function read() foreach ($tokens as $t) { switch ($t) { case '{': - ++$curleys; + case '(': + array_push($stack, $t); break; + case '}': - --$curleys; - break; - case '(': - ++$parens; + if ('{' !== array_pop($stack)) { + throw new Exception('Unmatched closing brace.'); + } break; case ')': - --$parens; + if ('(' !== array_pop($stack)) { + throw new Exception('Unmatched closing paren.'); + } break; } } - if ($curleys > 0) { - $done = false; - } else if ($parens > 0) { + if (count($stack) > 0) { + $last_t = array_pop($tokens); + if (is_array($last_t) && $last_t[0] == T_OPEN_TAG) { + // if the last token was an open tag, this is nothing. + } else if ($stack[count($stack) - 1] === '{' && !in_array($last_t, array('{', '}', ';'))) { + // allow implied semicolons inside curlies + $line .= ';'; + } $done = false; } $code .= $line; From 251080355c511ce70ce0995988df041764a6f5cd Mon Sep 17 00:00:00 2001 From: Justin Hileman Date: Wed, 17 Mar 2010 06:47:39 +0800 Subject: [PATCH 07/13] Continue when user enters a blank line (rather than exiting). User may still exit by typing Ctrl+X, 'die' or 'exit' --- PHP/Repl.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PHP/Repl.php b/PHP/Repl.php index 4c80d90..9af9f62 100755 --- a/PHP/Repl.php +++ b/PHP/Repl.php @@ -124,13 +124,13 @@ public function run(array $scope = array()) while (true) { // inner loop is to escape from stacked output buffers while ($__ob__ = ob_get_clean() ) { - echo $__ob__; + echo $this->ob_cleanup($__ob__); unset($__ob__); } try { if (((boolean) $__code__ = $this->read()) === false) { - break; + continue; } ob_start(array($this, 'ob_cleanup')); ob_implicit_flush(true); From 73d0d12ed84459eff2cdd991816b0a24683ce021 Mon Sep 17 00:00:00 2001 From: David Maus Date: Fri, 29 Apr 2011 06:10:39 +0200 Subject: [PATCH 08/13] Restart PHP process after abnormal exit * php-repl.el (run-php-process-sentinel): New function. Process sentinel, restart PHP process after abnormal exit. (run-php): Use process sentinel. --- data/php-repl.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/data/php-repl.el b/data/php-repl.el index 43798de..cf4f858 100644 --- a/data/php-repl.el +++ b/data/php-repl.el @@ -71,11 +71,19 @@ (let ((buf (cond ((buffer-live-p inferior-php-buffer) inferior-php-buffer) (t (generate-new-buffer "*inferior-php*"))))) (apply 'make-comint-in-buffer "PHP" buf php-repl-program nil php-repl-program-arguments) + (set-process-sentinel + (get-buffer-process inferior-php-buffer) 'run-php-process-sentinel) (setq inferior-php-buffer buf) (display-buffer buf t) (pop-to-buffer buf t) (inferior-php-mode))) +(defun run-php-process-sentinel (process event) + "*Restart PHP process after abnormal exit." + (when (string-match-p "^exited abnormally with code" event) + (message "Restarting PHP process") + (run-php))) + (define-derived-mode inferior-php-mode comint-mode "Inferior PHP") (defvar inferior-php-mode-abbrev-table (make-abbrev-table)) From b9fc57a272ac5da3f4c21ccb69049698f3783960 Mon Sep 17 00:00:00 2001 From: David Maus Date: Fri, 29 Apr 2011 06:17:39 +0200 Subject: [PATCH 09/13] Setq symbol before using it * php-repl.el (run-php): Setq symbol before using it. --- data/php-repl.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/php-repl.el b/data/php-repl.el index cf4f858..1c625da 100644 --- a/data/php-repl.el +++ b/data/php-repl.el @@ -71,9 +71,9 @@ (let ((buf (cond ((buffer-live-p inferior-php-buffer) inferior-php-buffer) (t (generate-new-buffer "*inferior-php*"))))) (apply 'make-comint-in-buffer "PHP" buf php-repl-program nil php-repl-program-arguments) + (setq inferior-php-buffer buf) (set-process-sentinel (get-buffer-process inferior-php-buffer) 'run-php-process-sentinel) - (setq inferior-php-buffer buf) (display-buffer buf t) (pop-to-buffer buf t) (inferior-php-mode))) From ebbb46c51be228ce51184562bc9443e14a65c0fc Mon Sep 17 00:00:00 2001 From: David Maus Date: Fri, 29 Apr 2011 06:19:24 +0200 Subject: [PATCH 10/13] Don't change buffer and window when visiting inferior-php-buffer * php-repl.el (run-php): Don't change buffer and window when already visiting inferior-php-buffer. --- data/php-repl.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/data/php-repl.el b/data/php-repl.el index 1c625da..6aa84db 100644 --- a/data/php-repl.el +++ b/data/php-repl.el @@ -74,8 +74,9 @@ (setq inferior-php-buffer buf) (set-process-sentinel (get-buffer-process inferior-php-buffer) 'run-php-process-sentinel) - (display-buffer buf t) - (pop-to-buffer buf t) + (unless (eq (current-buffer) inferior-php-buffer) + (display-buffer buf t) + (pop-to-buffer buf t)) (inferior-php-mode))) (defun run-php-process-sentinel (process event) From 95a9dfeb8a42eaeb338953d8863142b5eed73345 Mon Sep 17 00:00:00 2001 From: David Maus Date: Sun, 10 Jul 2011 06:25:23 +0200 Subject: [PATCH 11/13] Fix typo in defgroup prefix * php-repl.el (php-repl): Fix typo in defgroup prefix. --- data/php-repl.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/php-repl.el b/data/php-repl.el index 6aa84db..531918d 100644 --- a/data/php-repl.el +++ b/data/php-repl.el @@ -43,7 +43,7 @@ (defgroup php-repl nil "Major mode for interacting with an inferior PHP interpreter." - :prefix "ph-repl-" + :prefix "php-repl-" :group 'php) (defcustom php-repl-program From b2cb9361a099a944ae5278a0030415361fbaec5c Mon Sep 17 00:00:00 2001 From: David Maus Date: Sun, 10 Jul 2011 06:32:33 +0200 Subject: [PATCH 12/13] Use inferior php buffer, not sql buffer * php-repl.el (php-send-region): Use inferior php buffer, not sql buffer. --- data/php-repl.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/php-repl.el b/data/php-repl.el index 531918d..3939d2f 100644 --- a/data/php-repl.el +++ b/data/php-repl.el @@ -120,7 +120,7 @@ (save-excursion (comint-send-region inferior-php-buffer start end) (if (not (string-match "\n$" (buffer-substring start end))) - (comint-send-string sql-buffer "\n")) + (comint-send-string inferior-php-buffer "\n")) (display-buffer inferior-php-buffer)))) (defun php-eval-sexp ()) From ce52384e033af0793290981882dc1cc66f4a150d Mon Sep 17 00:00:00 2001 From: Niclas Hoyer Date: Mon, 5 Mar 2012 20:14:03 +0100 Subject: [PATCH 13/13] Added check for PHP_INCLUDE_PATH environment variable. The binary wrapper /scripts/php-repl will now if the environment variable PHP_INCLUDE_PATH is set and add it to the include_path php.ini directive. --- scripts/php-repl | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scripts/php-repl b/scripts/php-repl index 909effc..8ef4d6a 100755 --- a/scripts/php-repl +++ b/scripts/php-repl @@ -16,6 +16,12 @@ * @filesource */ +// Add environment variable PHP_INCLUDE_PATH to include_path if it exists. +$includePath = getenv('PHP_INCLUDE_PATH'); +if ($includePath !== false) { + set_include_path(get_include_path().':'.getenv('PHP_INCLUDE_PATH')); +} + require_once 'PHP/Repl.php'; $__repl__ = new PHP_Repl(); $__repl__->run();