mhayashi1120/Emacs-langtool

Checking a narrowed org subtree confuses langtool

brandelune opened this issue · 3 comments

Open a narrowed org subtree in a separate window or frame and launch langtool-check.

The highlighted areas will be shifted to a position that counts from the beginning of the original buffer, not of that narrowed buffer.

So all the highlighted areas will not correspond to the area that has a problem and the correction will be applied to the wrong area.

Open a narrowed org subtree in a separate window or frame and launch langtool-check.

The highlighted areas will be shifted to a position that counts from the beginning of the original buffer, not of that narrowed buffer.

So all the highlighted areas will not correspond to the area that has a problem and the correction will be applied to the wrong area.

Having the same problem. I thought it was an issue with my setup, but being able to check on only one section of an org file would be great. Not a deal breaker since you can widen out, but when you have a large org file and want to focus in a narrowed tree it would be nice to have langtool available as well.

This could probably be easily patched by rewriting the way langtool-check-buffer checks for
begin and end as follows:

@@ -1676,8 +1676,12 @@
   (langtool--check-command)
   ;; probablly ok...
   (let* ((region-p (langtool-region-active-p))
-         (begin (and region-p (region-beginning)))
-         (finish (and region-p (region-end))))
+	 (begin (cond 
+		 (region-p (region-beginning))
+		 (buffer-narrowed-p) (point-min)))
+	 (finish (cond
+		  (region-p (region-end))
+		  (buffer-narrowed-p) (point-max))))

This way, if the buffer is narrowed, a tmpfile is created
similarly to how langtool.el handles an active region,
but begin and finish will be nil if the buffer is not narrowed (and no region is active)
thus bypassing tmpfile creation as was originally the case.

another workaround is to define an advice that will simply mark whole buffer:

(define-advice langtool-check-buffer (:around (fn &optional lang) fix-narrowing)
  (save-mark-and-excursion
    (unless (use-region-p)
      (let ((inhibit-message t))
        (mark-whole-buffer)))
    (funcall fn lang)))