diff options
| -rw-r--r-- | docs/with-editor.org | 4 | ||||
| -rw-r--r-- | lisp/with-editor.el | 43 |
2 files changed, 37 insertions, 10 deletions
diff --git a/docs/with-editor.org b/docs/with-editor.org index d1c1a32..3e7032f 100644 --- a/docs/with-editor.org +++ b/docs/with-editor.org @@ -120,14 +120,14 @@ it receives a signal. #+BEGIN_SRC emacs-lisp "sh -c '\ - echo \"WITH-EDITOR: $$ OPEN $0 IN $(pwd)\"; \ + echo \"WITH-EDITOR: $$ OPEN $0$1 IN $(pwd)\"; \ trap \"exit 0\" USR1; \ trap \"exit 1\" USR2; \ while true; do sleep 1; done'" #+END_SRC Note that the unit separator character () right after the file - name ($0) is required. + name ($0) is required. TODO Also note that using this alternative implementation leads to a delay of up to a second. The delay can be shortened by replacing diff --git a/lisp/with-editor.el b/lisp/with-editor.el index 02b8f2d..990aae6 100644 --- a/lisp/with-editor.el +++ b/lisp/with-editor.el @@ -168,7 +168,7 @@ please see https://github.com/magit/magit/wiki/Emacsclient.")))) (defcustom with-editor-sleeping-editor "\ sh -c '\ -printf \"\\nWITH-EDITOR: $$ OPEN $0\\037 IN $(pwd)\\n\"; \ +printf \"\\nWITH-EDITOR: $$ OPEN $0\\037$1\\037 IN $(pwd)\\n\"; \ sleep 604800 & sleep=$!; \ trap \"kill $sleep; exit 0\" USR1; \ trap \"kill $sleep; exit 1\" USR2; \ @@ -197,13 +197,16 @@ with \"bash\" (and install that), or you can use the older, less performant implementation: \"sh -c '\\ - echo -e \\\"\\nWITH-EDITOR: $$ OPEN $0 IN $(pwd)\\n\\\"; \\ + echo -e \\\"\\nWITH-EDITOR: $$ OPEN $0$1 IN $(pwd)\\n\\\"; \\ trap \\\"exit 0\\\" USR1; \\ trap \\\"exit 1\" USR2; \\ while true; do sleep 1; done'\" -Note that the unit separator character () right after the file -name ($0) is required. +Note that the two unit separator characters () right after $0 +and $1 are required. Normally $0 is the file name and $1 is +missing or else gets ignored. But if $0 has the form \"+N[:N]\", +then it is treated as a position in the file and $1 is expected +to be the file. Also note that using this alternative implementation leads to a delay of up to a second. The delay can be shortened by replacing @@ -634,8 +637,11 @@ may not insert the text into the PROCESS's buffer. Then it calls (defvar with-editor-filter-visit-hook nil) -(defconst with-editor-sleeping-editor-regexp - "^WITH-EDITOR: \\([0-9]+\\) OPEN \\([^]+?\\)\\(?: IN \\([^\r]+?\\)\\)?\r?$") +(defconst with-editor-sleeping-editor-regexp "^\ +WITH-EDITOR: \\([0-9]+\\) \ +OPEN \\([^]+?\\)\ +\\(?:\\([^]*\\)\\)?\ +\\(?: IN \\([^\r]+?\\)\\)?\r?$") (defvar with-editor--max-incomplete-length 1000) @@ -656,8 +662,16 @@ may not insert the text into the PROCESS's buffer. Then it calls (when process (process-put process 'incomplete nil)) (let ((pid (match-string 1 string)) - (file (match-string 2 string)) - (dir (match-string 3 string))) + (arg0 (match-string 2 string)) + (arg1 (match-string 3 string)) + (dir (match-string 4 string)) + file line column) + (cond ((string-match "\\`\\+\\([0-9]+\\)\\(?::\\([0-9]+\\)\\)?\\'" arg0) + (setq file arg1) + (setq line (string-to-number (match-string 1 arg0))) + (setq column (match-string 2 arg0)) + (setq column (and column (string-to-number column)))) + ((setq file arg0))) (unless (file-name-absolute-p file) (setq file (expand-file-name file dir))) (when default-directory @@ -667,6 +681,19 @@ may not insert the text into the PROCESS's buffer. Then it calls (setq with-editor--pid pid) (setq with-editor-previous-winconf (current-window-configuration)) + (when line + (let ((pos (save-excursion + (save-restriction + (goto-char (point-min)) + (forward-line (1- line)) + (when column + (move-to-column column)) + (point))))) + (when (and (buffer-narrowed-p) + widen-automatically + (not (<= (point-min) pos (point-max)))) + (widen)) + (goto-char pos))) (run-hooks 'with-editor-filter-visit-hook) (funcall (or (with-editor-server-window) #'switch-to-buffer) (current-buffer)) |
