0

I just discovered narrowing in Emacs, and it's great to be able to focus on a single function or block of code.

However, after I narrow with C-x n n, make some changes and then save manually with C-x C-s the buffer widens again while I am in Ruby mode.

How do I prevent save from triggering widening? (I can see how it's handy, but I'd like to turn it off for now.)

Thank you StackExchange!

Nick
  • 125
  • 7

2 Answers2

2

I also tried [ (remove-hook 'after-save-hook 'ruby-mode-set-encoding) ], but it didn't work since, I think, the hook is buffer local?

Both add-hook and remove-hook have a LOCAL argument for modifying the buffer-local hook value. If that's how it's added, that's also how you can remove it (most likely via ruby-mode-hook).

And indeed if we look at ruby-mode itself this is exactly the case:

(define-derived-mode ruby-mode prog-mode "Ruby"
[...]
  (add-hook 'after-save-hook #'ruby-mode-set-encoding nil 'local)
  (add-hook 'electric-indent-functions #'ruby--electric-indent-p nil 'local)
  (add-hook 'flymake-diagnostic-functions #'ruby-flymake-auto nil 'local)

So you would then do this:

(add-hook 'ruby-mode-hook #'my-ruby-mode-hook)

(defun my-ruby-mode-hook ()
  "Custom `ruby-mode' behaviours."
  (remove-hook 'after-save-hook #'ruby-mode-set-encoding 'local))

That said, I imagine ruby-mode-set-encoding is doing something useful, and you probably don't actually want to inhibit that.

This looks to me like a bug in ruby-mode-set-encoding. You should M-x report-emacs-bug to suggest that save-restriction is used in that function. Maybe there's something else going on which needs the widening to happen, but if not then it seems like an easy fix.

phils
  • 48,657
  • 3
  • 76
  • 115
  • Works brilliantly. Thanks you @phils. I think they do use save-restriction in that code, but the issue persists so I'll report it. Thanks for teaching me how to report it. – Nick Jan 31 '22 at 20:48
1

I eventually traced this to ruby-mode-set-encoding in ruby-mode.el.

I worked around it with the following in my .emacs:

(with-eval-after-load 'ruby-mode 
  (defun ruby-mode-set-encoding () "override the default" ()))

It's a terrible hack, but it allows me to move on with my daily work and I can disable it occasionally to make sure magic comments are still present.

I also tried this, but it didn't work since, I think, the hook is buffer local?

(with-eval-after-load 'ruby-mode
  (remove-hook 'after-save-hook 'ruby-mode-set-encoding))    

Open to ideas on how to fix this right, but thought I'd leave something for anyone who stumbles across this issue.

Nick
  • 125
  • 7
  • Both `add-hook` and `remove-hook` have a LOCAL argument for modifying the buffer-local hook value. If that's how it's added, that's also how you can remove it (most likely via `ruby-mode-hook`). – phils Jan 29 '22 at 02:01