5

I'm using putty (on windows 7) to connect to shell and Vim as editor. I also have mouse=a option enabled in Vim, but I get some strange behavior (such as random insertions of characters and/or linebreaks) when I click to the right side of the Vim window (let's say it's like 70%+ of the screen width area where it gets weird). I'm slowly getting used to such behavior, but I'd really like to know if I could somehow fix this.

2
  • How big is your window, in terms of character cells? The original xterm mouse protocol as implemented by PuTTY only supports mouse coordinates up to 223.
    – ak2
    Commented Apr 17, 2012 at 7:52
  • Thank you, I wasn't aware of such limitations. Window size is measured in rows and columns in PuTTY, so after few tries I figured out 95 columns is perfect match for xterm mouse protocol. Do you mind leaving your solution as answer so I could mark it as best one? :)
    – kK-Storm
    Commented Apr 17, 2012 at 16:27

2 Answers 2

7

PuTTY sends mouse events using an xterm protocol that dates back all the way to X10 in the mid-eighties. This encodes the mouse coordinates with a single byte each for row and column, whereby 32 (the ASCII code for a space character) is added. This allows for coordinates up to 223 (which is 255 - 32).

Unfortunately that encoding does not adhere to the applicable standards for terminal control sequences, and the range can effectively be further restricted to 95 (i.e. 127 - 32) if applications don't make special allowances for it. In particular, if an application performs UTF-8 decoding before control sequence parsing, mouse coordinates beyond 95 just end up being treated as invalid UTF-8.

During the past year, several attempts have been made to address this issue in xterm. The best one of those is the so-called SGR 1006 mode added in patch #277, which uses a standard-compliant control sequence with unlimited coordinates. Support for this will slowly permeate to other terminal emulators and applications.

1

This has been fixed in Vim 7.3.632. See :h sgr-mouse. Or just put this in your ~/.vimrc:

set ttymouse=sgr

If you want to be compatible with versions that don't have mouse_sgr compiled in, use:

if has("mouse_sgr")
    set ttymouse=sgr
else
    set ttymouse=xterm2
end

To see if your version of Vim has mouse_sgr, run vim --version from the command-line, or in Vim, enter :version, and look for +mouse_sgr.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .