Skip to main content
deleted 1 character in body
Source Link
Tobias
  • 33.7k
  • 1
  • 38
  • 78

The following lisp code advices ffap-string-at-point such that it returns the string text at point if point is inside a string.

That modification lets find-file-at-point propose the full string text as initial input for the file name.

ThatMS-Windows file names with drive letters are wrongly detected as url's if the value of the variable ffap-lax-url is non-nil. In that case find-file-at-point gives c:/Program as initial input if point is within Program of the string "c:/Program Files". So it may be that you need to set ffap-lax-url to nil.

The advice relies on the syntax parser (syntax-ppss) of emacs. That works on all major modes with syntactic fontification.

(require 'subr-x) ;; for `when-let'

;; You can also use `thingatpt+.el' instead.
(defun bounds-of-string-at-point ()
  "String at point including the string delimiters."
  (when-let ((ppss (syntax-ppss))
             (in-string (nth 3 ppss))
             (b (nth 8 ppss))
             (e-ppss (save-excursion (parse-partial-sexp (1+ b) (point-max) nil nil nil 'syntax-table)))
             (e (1+ (nth 8 e-ppss))))
    (cons b e)))

(put 'string 'bounds-of-thing-at-point #'bounds-of-string-at-point)

(defun around-ad-ffap-string-at-point (oldfun &optional mode)
  "Use the string at point for `ffap-string-at-point'
or the original function if we are not within a string."
  (let ((str-bounds (bounds-of-thing-at-point 'string)))
    (if str-bounds
        (setq ffap-string-at-point
              (buffer-substring-no-properties
               (setcar ffap-string-at-point-region (1+ (car str-bounds)))
               (setcar (cdr ffap-string-at-point-region) (1- (cdr str-bounds)))))
      (funcall oldfun mode))))

(advice-add 'ffap-string-at-point :around #'around-ad-ffap-string-at-point)

The following lisp code advices ffap-string-at-point such that it returns the string text at point if point is inside a string.

That modification lets find-file-at-point propose the full string text as initial input for the file name.

That advice relies on the syntax parser (syntax-ppss) of emacs. That works on all major modes with syntactic fontification.

(require 'subr-x) ;; for `when-let'

;; You can also use `thingatpt+.el' instead.
(defun bounds-of-string-at-point ()
  "String at point including the string delimiters."
  (when-let ((ppss (syntax-ppss))
             (in-string (nth 3 ppss))
             (b (nth 8 ppss))
             (e-ppss (save-excursion (parse-partial-sexp (1+ b) (point-max) nil nil nil 'syntax-table)))
             (e (1+ (nth 8 e-ppss))))
    (cons b e)))

(put 'string 'bounds-of-thing-at-point #'bounds-of-string-at-point)

(defun around-ad-ffap-string-at-point (oldfun &optional mode)
  "Use the string at point for `ffap-string-at-point'
or the original function if we are not within a string."
  (let ((str-bounds (bounds-of-thing-at-point 'string)))
    (if str-bounds
        (setq ffap-string-at-point
              (buffer-substring-no-properties
               (setcar ffap-string-at-point-region (1+ (car str-bounds)))
               (setcar (cdr ffap-string-at-point-region) (1- (cdr str-bounds)))))
      (funcall oldfun mode))))

(advice-add 'ffap-string-at-point :around #'around-ad-ffap-string-at-point)

The following lisp code advices ffap-string-at-point such that it returns the string text at point if point is inside a string.

That modification lets find-file-at-point propose the full string text as initial input for the file name.

MS-Windows file names with drive letters are wrongly detected as url's if the value of the variable ffap-lax-url is non-nil. In that case find-file-at-point gives c:/Program as initial input if point is within Program of the string "c:/Program Files". So it may be that you need to set ffap-lax-url to nil.

The advice relies on the syntax parser (syntax-ppss) of emacs. That works on all major modes with syntactic fontification.

(require 'subr-x) ;; for `when-let'

;; You can also use `thingatpt+.el' instead.
(defun bounds-of-string-at-point ()
  "String at point including the string delimiters."
  (when-let ((ppss (syntax-ppss))
             (in-string (nth 3 ppss))
             (b (nth 8 ppss))
             (e-ppss (save-excursion (parse-partial-sexp (1+ b) (point-max) nil nil nil 'syntax-table)))
             (e (1+ (nth 8 e-ppss))))
    (cons b e)))

(put 'string 'bounds-of-thing-at-point #'bounds-of-string-at-point)

(defun around-ad-ffap-string-at-point (oldfun &optional mode)
  "Use the string at point for `ffap-string-at-point'
or the original function if we are not within a string."
  (let ((str-bounds (bounds-of-thing-at-point 'string)))
    (if str-bounds
        (setq ffap-string-at-point
              (buffer-substring-no-properties
               (setcar ffap-string-at-point-region (1+ (car str-bounds)))
               (setcar (cdr ffap-string-at-point-region) (1- (cdr str-bounds)))))
      (funcall oldfun mode))))

(advice-add 'ffap-string-at-point :around #'around-ad-ffap-string-at-point)
Source Link
Tobias
  • 33.7k
  • 1
  • 38
  • 78

The following lisp code advices ffap-string-at-point such that it returns the string text at point if point is inside a string.

That modification lets find-file-at-point propose the full string text as initial input for the file name.

That advice relies on the syntax parser (syntax-ppss) of emacs. That works on all major modes with syntactic fontification.

(require 'subr-x) ;; for `when-let'

;; You can also use `thingatpt+.el' instead.
(defun bounds-of-string-at-point ()
  "String at point including the string delimiters."
  (when-let ((ppss (syntax-ppss))
             (in-string (nth 3 ppss))
             (b (nth 8 ppss))
             (e-ppss (save-excursion (parse-partial-sexp (1+ b) (point-max) nil nil nil 'syntax-table)))
             (e (1+ (nth 8 e-ppss))))
    (cons b e)))

(put 'string 'bounds-of-thing-at-point #'bounds-of-string-at-point)

(defun around-ad-ffap-string-at-point (oldfun &optional mode)
  "Use the string at point for `ffap-string-at-point'
or the original function if we are not within a string."
  (let ((str-bounds (bounds-of-thing-at-point 'string)))
    (if str-bounds
        (setq ffap-string-at-point
              (buffer-substring-no-properties
               (setcar ffap-string-at-point-region (1+ (car str-bounds)))
               (setcar (cdr ffap-string-at-point-region) (1- (cdr str-bounds)))))
      (funcall oldfun mode))))

(advice-add 'ffap-string-at-point :around #'around-ad-ffap-string-at-point)