5

Often, the git repos I work in have a similar layout (for example every python project has a setup.py with an install_requires line in it).

Is it possible to add a bookmark that points to a similar line in a file relative to (projectile-project-root)? Is it possible to have this only appear in the bookmark list if I am visiting a file in the right sort of repository?

Example:

We might have directories

  • /home/user/node-project1
  • /home/user/node-project2
  • /home/user/c-project1
  • /home/user/c-project2
  • /home/user/python-project1
  • /home/user/python-project1

In the c projects I might want to jump to (projectile-project-root)/Makefile but not in python or node projects. You might want to jump to the all: target.

In python projects I might want to jump (projectile-project-root)/setup.py but not in c or node projects. I might want to jump to the install_requires line.

In node projects I might want to jump to (projectile-project-root)/package.json, but not in c or python projects. I might want to jump to the "dependencies": { line.

Att Righ
  • 725
  • 4
  • 14

2 Answers2

1

Not quite sure what you're asking. Yes, you can have a bookmark that points to any position in any line in any file. But what do you mean by "have this only show up"?

If you are asking about whether a given bookmark is present in your displayed bookmark list (what you see with C-x r l) then yes, you can control that. One simple way to do that is to have multiple bookmark files.

If you use Bookmark+ then this kind of thing becomes easier. You can more easily have multiple bookmark files. You can more easily switch among them - including by bookmarking those files themselves (bookmark-file bookmarks), so you just jump to a bookmark to switch bookmark files.

You can also bookmark different bookmark-list display views. So you can, for example, hide some bookmarks from the display and then bookmark the resulting view, so that jumping to that bookmark-list bookmark gives you that view that hides particular bookmarks.

There are lots of possibilities. But you might want to try to make your question a bit clearer (more specific), to help you get better answers.

Drew
  • 75,699
  • 9
  • 109
  • 225
  • Thanks. I've updated the question taking your comments into account. I guess the conditional display of bookmarks could be achieved by having bookmark files be loaded depending upon the project type. I would prefer not to have a bookmark file for each separate repo, so this means I need some sort of "relative" bookmark. I guess what I'm really after is arbitrary control over what a bookmark does. – Att Righ Jan 11 '18 at 18:12
  • 1
    A bookmark itself can be any Lisp function (it is a function bookmark), which can use any conditional logic you want. – Drew Jan 11 '18 at 22:48
  • That looks like what I'm after. I'm using [bmkp-make-function-bookmark](https://github.com/emacsmirror/bookmark-plus/blob/954d48092247e9fd461d310fd9fc3c0d545362d5/bookmark%2B-1.el#L4621). The following creates a bookmark that jumps to `install_requires` in `setup.py` relative to the project root `(bmkp-make-function-bookmark "setup.py" (lambda () (find-file (expand-file-name "setup.py" (projectile-project-root))) (search-forward-regexp "install_requires")))` – Att Righ Jan 12 '18 at 00:46
  • See also [sequence](https://www.emacswiki.org/emacs/BookmarkPlus#FunctionSequenceVarlistBookmarks) bookmarks. – Drew Jan 12 '18 at 00:59
1

By default Emacs bookmarks are global, there is a package: bookmark-in-project that provides exposes project level functionality.

  • Switching bookmarks is limited to the project directory of the current buffer.
  • Jumping to the next/previous bookmark is supported.
  • Toggling bookmarks is supported with automatic naming based on the surrounding context.

This is done:

  • Using Emacs built-in bookmarks (so if you stop using this package your bookmarks won't be lost).
  • By adding project-relative commands (behavior of default bookmarking functions remains unmodified).

(note that I'm the author of this package, it seems I ran into similar issues that you did).

ideasman42
  • 8,375
  • 1
  • 28
  • 105