Using Vim built with GUI support in a terminal, and ttymouse set to
xterm2, mouse clicks (as well as dragging events) in column 123
consistently register as being in column 96. E.g., if a line of text
contains 123 characters, clicking on the last character will position
the text cursor on the 96th character instead of the 123rd.

This seems to be caused by an inconsistency in how CSI (0x9b) is encoded
in the input buffer. In getchar.c, fix_input_buffer() encodes CSI as a
sequence of three bytes: K_SPECIAL, KS_EXTRA, and KE_CSI. (This only
happens when GUI support is compiled in, but the GUI is not in use.)

However in term.c, get_bytes_from_buf assumes that K_SPECIAL can only be
followed by KS_ZERO or KS_SPECIAL. If it's not KS_ZERO, the result is
treated as KS_SPECIAL.

The result looks something like this:

- When the user clicks in column 123, the terminal sends the column as
  123+32=155=CSI.
- fix_input_buffer gets a CSI character, and replaces it with K_SPECIAL,
  KS_EXTRA, KE_CSI.
- get_bytes_from_buf reads a K_SPECIAL character. It checks the next
  character and finds it is not KS_ZERO. It assumes the character must
  therefore be KS_SPECIAL, and produces the byte K_SPECIAL.
- K_SPECIAL is 128. Interpreted as a terminal column, that is 128-32=96,
  so Vim sees the reported mouse column as 96.

I see at least three contradictory ways for CSI to be encoded:

1) In get_bytes_from_buf, the code appears to be looking for the
   sequence CSI, KS_EXTRA, KE_CSI.
2) In get_bytes_from_buf, the comment says that CSI is encoded using the
   sequence CSI, KS_SPECIAL, KE_CSI.
3) The actual sequence get_bytes_from_buf receives, and fix_input_buffer
   writes, is K_SPECIAL, KS_EXTRA, KE_CSI.

I tested this on few different versions of Vim 7.2 and 7.3, including a
new build of 7.3 patch 1278 from Mercurial, on Debian Squeeze and
Jessie and Fedora 17, using xterm, Gnome terminal, Xfce terminal, and
rxvt.

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Raspunde prin e-mail lui