sebastiencs / company-box

A company front-end with icons
563 stars 64 forks source link

company-box clips off to the edge of the screen #165

Closed SreenivasVRao closed 1 year ago

SreenivasVRao commented 3 years ago

https://i.imgur.com/cF1DBCD.png

As you can see - the doc string shows up in a childframe which doesn't wrap at the edge of the screen. On dual monitors, the problem is that the doc string shows up in a childframe spanning multiple monitors:

https://media.discordapp.net/attachments/406554085794381833/825157364344029274/Screen_Shot_2021-03-26_at_7.55.13_PM.png?width=2160&height=375

Any advice on how to overcome this? I'm using doom emacs.

HawkinsT commented 2 years ago

I have the same issue. I'm very new to emacs and don't know elisp so a 'proper' solution that could form a pull request is beyond me, however you can manually set the documentation frame size here. I've changed mine to ((width . height) (window-text-pixel-size window nil nil 800 10000)), for instance. The quickest way to implement this is to modify this file under ~/.emacs.d/elpa/ and then M-x emacs-lisp-byte-compile-and-load.

Edit: I just looked at this again and wrote a better solution:

((width . height) (window-text-pixel-size window nil nil (- (frame-outer-width) (+ 20 (+ box-width (nth 0 box-position)))) (- (frame-outer-height) 20)))

This will ensure that the documentation box can at most expand to the right and bottom edges of the frame but not beyond it and will rescale with the frame. For a pull request this should perhaps take into account the total area of the current monitor such that the doc box can expand beyond the edges of the emacs frame (e.g. using display-pixel-width); I'll consider which might be more desirable behaviour and submit a pull request accordingly (edit2: although come to think of it I'm not sure that this box can ever expand outside of the emacs frame anyway, unless it's OS-dependent).

NightMachinery commented 2 years ago

I also have this problem on a single-monitor laptop: image

NightMachinery commented 2 years ago

Patching the mentioned line, the problem is that the frame is not soft-wrapping at all: image

NightMachinery commented 2 years ago

To fix this, I needed to add (toggle-truncate-lines -1) to the end of the function company-box-doc--make-buffer.

(defun company-box-doc--make-buffer (object)
  (let* ((buffer-list-update-hook nil)
         (inhibit-modification-hooks t)
         (string (cond ((stringp object) object)
                       ((bufferp object) (with-current-buffer object (buffer-string))))))
    (when (and string (> (length (string-trim string)) 0))
      (with-current-buffer (company-box--get-buffer "doc")
        (erase-buffer)
        (insert string)
        (setq mode-line-format nil
              display-line-numbers nil
              header-line-format nil
              show-trailing-whitespace nil
              cursor-in-non-selected-windows nil)

        (toggle-truncate-lines -1) ;; PATCHED HERE

        (current-buffer)))))

BTW, you do not need to edit the original files. You can copy the functions to your own personal config and edit them there; The new definitions would override the old ones (if you load company-box before them).

I hope these two patches are merged into the master, as the current behavior is only suitable if you have a huge monitor.

image

HawkinsT commented 2 years ago

Thanks, I've just proposed a commit that makes the above the default behaviour. I've also added the company-box-doc-no-wrap option in case anyone wishes to keep the existing behaviour.

SreenivasVRao commented 2 years ago

I haven't had a chance to investigate - but thanks @HawkinsT for your efforts! This bug has been bothering me a lot over the past few months.

SreenivasVRao commented 2 years ago

@sebastiencs any chance you can review this soon? :)