1

I'm very new to customizing Emacs, and haven't written Elisp commands before. I'm struggling to find a command and key binding that combines find-file-at-point and find-file-in-project (or similar), perhaps a:

M-x find-file-in-project-at-point

such that given a file/folder structure:

├── main.txt
├── file1.txt
└── somepath
    └── file2.txt

where I'm editing main.txt

% cat main.txt
line 1 file1.txt
line 2 file2.txt

and a shortcut will find file2.txt when my cursor is somewhere on the text of file2.txt - despite it being located in ./somepath/file2.txt. It would be safe to assume to start the search relative to main.txt. Ideally, open the file if only 1 match is found, otherwise list possible choices in minibuffer.

I have had success opening file1.txt from main.txt OK, even w/o confirmation with this pretty neat command.

I'm typically not dealing with a "project" (.git) folder structures, & folder/file structure isn't that large where an overly complex package is needed (where it might to run/index in background).

My apologies if I missed an obvious solution.

Other commands & packages functions that appear useful, but I don't have the expertise to combine them in the way I want:

Any advice?

Drew
  • 75,699
  • 9
  • 109
  • 225
bscipio
  • 181
  • 5

1 Answers1

0

Interesting idea, I never thought I need find file at point. I usually just use expand-region.el to select file name or partial of file path. Then M-x find-file-in-project-by-selected.

Any way, here is my implementation of find file at point:

(defun find-file-in-project-at-point (&optional open-another-window)
  "Find file whose name is guessed around point.
If OPEN-ANOTHER-WINDOW is not nil, the file will be opened in new window."
  (interactive "P")
  (let* ((filename (or (ffap-file-at-point)
                       (thing-at-point 'filename)
                       (thing-at-point 'symbol)
                       (read-string "No file name at point. Please provide file name:")))
         ;; filename could be a path
         (ffip-match-path-instead-of-filename t))
    (cond
     (filename
      ;; strip prefix "../../" or "././" from file name
      (setq filename (replace-regexp-in-string "^\\(\\.\\.*/\\)*" "" filename))
      (ffip-find-files filename open-another-window))
     (t
      (message "No file name is provided.")))))

Either copy this function into your .emacs or just upgrade find-file-in-project to v5.5.0

chen bin
  • 4,781
  • 18
  • 36
  • Perfect! This is an excellent feature. Thank you! – bscipio Feb 19 '18 at 22:53
  • So this is perfect for the example in original post. However, when the text (`main.txt`) contains a full path: `line 3 /fullpath/file3.txt` and I select `file3.txt` it appears to search the `/fullpath/` or somewhere for awhile and then the function still didn't find the file. This seems very close to being super @chenbin – bscipio Feb 19 '18 at 23:26
  • Just double check. So you expect only the "file3.txt" is used as search keyword if "file.txt" is selected text, right? If you got any other requirements, raise issue at https://github.com/technomancy/find-file-in-project – chen bin Feb 19 '18 at 23:43
  • Hopefully this helps: If the cursor was on a `file.txt` - but where it is a full-path (ex. `/fullpath/file3.txt`), then I would desire the function to use that full-path first to open it. Otherwise (if not found, or in general not a full-path), search for file.txt based on location of `main.txt` path. I can also add a github issue later with more detailed example. Thanks so much for responding! – bscipio Feb 20 '18 at 02:24
  • Yes, please raise an issue on github, thanks. – chen bin Feb 20 '18 at 04:19
  • Done: https://github.com/technomancy/find-file-in-project/issues/97 Thank you! – bscipio Feb 21 '18 at 00:56