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.
-
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.– ak2Commented 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-StormCommented Apr 17, 2012 at 16:27
2 Answers
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.
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
.