diff options
Diffstat (limited to 'lisp/with-editor.el')
| -rw-r--r-- | lisp/with-editor.el | 43 |
1 files changed, 35 insertions, 8 deletions
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)) |
