Patch 8.0.1757
Problem:    Unnecessary changes in libvterm.
Solution:   Bring back // comments and trailing comma in enums.
Files:      src/libvterm/bin/unterm.c, src/libvterm/bin/vterm-ctrl.c,
            src/libvterm/bin/vterm-dump.c, src/libvterm/include/vterm.h,
            src/libvterm/include/vterm_keycodes.h,
            src/libvterm/src/encoding.c, src/libvterm/src/keyboard.c,
            src/libvterm/src/parser.c, src/libvterm/src/pen.c,
            src/libvterm/src/screen.c, src/libvterm/src/state.c,
            src/libvterm/src/unicode.c, src/libvterm/src/utf8.h,
            src/libvterm/src/vterm.c, src/libvterm/src/vterm_internal.h


*** ../vim-8.0.1756/src/libvterm/bin/unterm.c   2018-03-25 16:20:18.513264056 
+0200
--- src/libvterm/bin/unterm.c   2018-04-24 17:46:22.203589138 +0200
***************
*** 9,15 ****
  #include "vterm.h"
  
  #define DEFINE_INLINES
! #include "../src/utf8.h" /* fill_utf8 */
  
  #define streq(a,b) (!strcmp(a,b))
  
--- 9,15 ----
  #include "vterm.h"
  
  #define DEFINE_INLINES
! #include "../src/utf8.h" // fill_utf8
  
  #define streq(a,b) (!strcmp(a,b))
  
***************
*** 21,27 ****
  
  static enum {
    FORMAT_PLAIN,
!   FORMAT_SGR
  } format = FORMAT_PLAIN;
  
  static int col2index(VTermColor target)
--- 21,27 ----
  
  static enum {
    FORMAT_PLAIN,
!   FORMAT_SGR,
  } format = FORMAT_PLAIN;
  
  static int col2index(VTermColor target)
***************
*** 44,51 ****
        break;
      case FORMAT_SGR:
        {
!         /* If all 7 attributes change, that means 7 SGRs max */
!         /* Each colour could consume up to 3 */
          int sgr[7 + 2*3]; int sgri = 0;
  
          if(!prevcell->attrs.bold && cell->attrs.bold)
--- 44,51 ----
        break;
      case FORMAT_SGR:
        {
!         // If all 7 attributes change, that means 7 SGRs max
!         // Each colour could consume up to 3
          int sgr[7 + 2*3]; int sgri = 0;
  
          if(!prevcell->attrs.bold && cell->attrs.bold)
*** ../vim-8.0.1756/src/libvterm/bin/vterm-ctrl.c       2018-03-25 
16:20:18.513264056 +0200
--- src/libvterm/bin/vterm-ctrl.c       2018-04-24 17:50:02.690199506 +0200
***************
*** 35,41 ****
  typedef enum {
    OFF,
    ON,
!   QUERY
  } BoolQuery;
  
  static BoolQuery getboolq(int *argip, int argc, char *argv[])
--- 35,41 ----
  typedef enum {
    OFF,
    ON,
!   QUERY,
  } BoolQuery;
  
  static BoolQuery getboolq(int *argip, int argc, char *argv[])
***************
*** 105,111 ****
    unsigned char csi[32];
    int i = 0;
  
!   await_c1(0x9B); /* CSI */
  
    /* TODO: This really should be a more robust CSI parser
     */
--- 105,111 ----
    unsigned char csi[32];
    int i = 0;
  
!   await_c1(0x9B); // CSI
  
    /* TODO: This really should be a more robust CSI parser
     */
***************
*** 116,122 ****
    }
    csi[++i] = 0;
  
!   /* TODO: returns longer than 32? */
  
    return strdup((char *)csi);
  }
--- 116,122 ----
    }
    csi[++i] = 0;
  
!   // TODO: returns longer than 32?
  
    return strdup((char *)csi);
  }
***************
*** 131,137 ****
  
    for(i = 0; i < sizeof(dcs)-1; ) {
      char c = getchar();
!     if(c == 0x9c) /* ST */
        break;
      if(in_esc && c == 0x5c)
        break;
--- 131,137 ----
  
    for(i = 0; i < sizeof(dcs)-1; ) {
      char c = getchar();
!     if(c == 0x9c) // ST
        break;
      if(in_esc && c == 0x5c)
        break;
***************
*** 301,312 ****
        do_dec_mode(12, getboolq(&argi, argc, argv), "curblink");
      }
      else if(streq(arg, "curshape")) {
!       /* TODO: This ought to query the current value of DECSCUSR because it */
!       /*   may need blinking on or off */
        const char *choices[] = {"block", "under", "bar", "query", NULL};
        int shape = getchoice(&argi, argc, argv, choices);
        switch(shape) {
!         case 3: /* query */
            shape = query_rqss_numeric(" q");
            switch(shape) {
              case 1: case 2:
--- 301,312 ----
        do_dec_mode(12, getboolq(&argi, argc, argv), "curblink");
      }
      else if(streq(arg, "curshape")) {
!       // TODO: This ought to query the current value of DECSCUSR because it
!       //   may need blinking on or off
        const char *choices[] = {"block", "under", "bar", "query", NULL};
        int shape = getchoice(&argi, argc, argv, choices);
        switch(shape) {
!         case 3: // query
            shape = query_rqss_numeric(" q");
            switch(shape) {
              case 1: case 2:
*** ../vim-8.0.1756/src/libvterm/bin/vterm-dump.c       2018-03-25 
16:20:18.513264056 +0200
--- src/libvterm/bin/vterm-dump.c       2018-04-24 17:51:44.369514813 +0200
***************
*** 1,4 ****
! /* Require getopt(3) */
  #define _XOPEN_SOURCE
  
  #include <stdio.h>
--- 1,4 ----
! // Require getopt(3)
  #define _XOPEN_SOURCE
  
  #include <stdio.h>
***************
*** 22,49 ****
  
    int i;
    for(i = 0; i < len; /* none */) {
!     if(b[i] < 0x20)        /* C0 */
        break;
!     else if(b[i] < 0x80)   /* ASCII */
        i++;
!     else if(b[i] < 0xa0)   /* C1 */
        break;
!     else if(b[i] < 0xc0)   /* UTF-8 continuation */
        break;
!     else if(b[i] < 0xe0) { /* UTF-8 2-byte */
!       /* 2-byte UTF-8 */
        if(len < i+2) break;
        i += 2;
      }
!     else if(b[i] < 0xf0) { /* UTF-8 3-byte */
        if(len < i+3) break;
        i += 3;
      }
!     else if(b[i] < 0xf8) { /* UTF-8 4-byte */
        if(len < i+4) break;
        i += 4;
      }
!     else                   /* otherwise invalid */
        break;
    }
  
--- 22,49 ----
  
    int i;
    for(i = 0; i < len; /* none */) {
!     if(b[i] < 0x20)        // C0
        break;
!     else if(b[i] < 0x80)   // ASCII
        i++;
!     else if(b[i] < 0xa0)   // C1
        break;
!     else if(b[i] < 0xc0)   // UTF-8 continuation
        break;
!     else if(b[i] < 0xe0) { // UTF-8 2-byte
!       // 2-byte UTF-8
        if(len < i+2) break;
        i += 2;
      }
!     else if(b[i] < 0xf0) { // UTF-8 3-byte
        if(len < i+3) break;
        i += 3;
      }
!     else if(b[i] < 0xf8) { // UTF-8 4-byte
        if(len < i+4) break;
        i += 4;
      }
!     else                   // otherwise invalid
        break;
    }
  
***************
*** 200,206 ****
    file = argv[optind++];
  
    if(!file || streq(file, "-"))
!     fd = 0; /* stdin */
    else {
      fd = open(file, O_RDONLY);
      if(fd == -1) {
--- 200,206 ----
    file = argv[optind++];
  
    if(!file || streq(file, "-"))
!     fd = 0; // stdin
    else {
      fd = open(file, O_RDONLY);
      if(fd == -1) {
*** ../vim-8.0.1756/src/libvterm/include/vterm.h        2018-03-25 
16:20:18.513264056 +0200
--- src/libvterm/include/vterm.h        2018-04-24 17:55:28.072054366 +0200
***************
*** 110,139 ****
  
  typedef enum {
    /* VTERM_ATTR_NONE = 0 */
!   VTERM_ATTR_BOLD = 1,   /* bool:   1, 22 */
!   VTERM_ATTR_UNDERLINE,  /* number: 4, 21, 24 */
!   VTERM_ATTR_ITALIC,     /* bool:   3, 23 */
!   VTERM_ATTR_BLINK,      /* bool:   5, 25 */
!   VTERM_ATTR_REVERSE,    /* bool:   7, 27 */
!   VTERM_ATTR_STRIKE,     /* bool:   9, 29 */
!   VTERM_ATTR_FONT,       /* number: 10-19 */
!   VTERM_ATTR_FOREGROUND, /* color:  30-39 90-97 */
!   VTERM_ATTR_BACKGROUND, /* color:  40-49 100-107 */
  
    VTERM_N_ATTRS
  } VTermAttr;
  
  typedef enum {
    /* VTERM_PROP_NONE = 0 */
!   VTERM_PROP_CURSORVISIBLE = 1, /* bool */
!   VTERM_PROP_CURSORBLINK,       /* bool */
!   VTERM_PROP_ALTSCREEN,         /* bool */
!   VTERM_PROP_TITLE,             /* string */
!   VTERM_PROP_ICONNAME,          /* string */
!   VTERM_PROP_REVERSE,           /* bool */
!   VTERM_PROP_CURSORSHAPE,       /* number */
!   VTERM_PROP_MOUSE,             /* number */
!   VTERM_PROP_CURSORCOLOR,       /* string */
  
    VTERM_N_PROPS
  } VTermProp;
--- 110,139 ----
  
  typedef enum {
    /* VTERM_ATTR_NONE = 0 */
!   VTERM_ATTR_BOLD = 1,   // bool:   1, 22
!   VTERM_ATTR_UNDERLINE,  // number: 4, 21, 24
!   VTERM_ATTR_ITALIC,     // bool:   3, 23
!   VTERM_ATTR_BLINK,      // bool:   5, 25
!   VTERM_ATTR_REVERSE,    // bool:   7, 27
!   VTERM_ATTR_STRIKE,     // bool:   9, 29
!   VTERM_ATTR_FONT,       // number: 10-19
!   VTERM_ATTR_FOREGROUND, // color:  30-39 90-97
!   VTERM_ATTR_BACKGROUND, // color:  40-49 100-107
  
    VTERM_N_ATTRS
  } VTermAttr;
  
  typedef enum {
    /* VTERM_PROP_NONE = 0 */
!   VTERM_PROP_CURSORVISIBLE = 1, // bool
!   VTERM_PROP_CURSORBLINK,       // bool
!   VTERM_PROP_ALTSCREEN,         // bool
!   VTERM_PROP_TITLE,             // string
!   VTERM_PROP_ICONNAME,          // string
!   VTERM_PROP_REVERSE,           // bool
!   VTERM_PROP_CURSORSHAPE,       // number
!   VTERM_PROP_MOUSE,             // number
!   VTERM_PROP_CURSORCOLOR,       // string
  
    VTERM_N_PROPS
  } VTermProp;
***************
*** 211,219 ****
   * Button 4 is scroll wheel down, button 5 is scroll wheel up. */
  void vterm_mouse_button(VTerm *vt, int button, int pressed, VTermModifier 
mod);
  
! /* ------------
!  * Parser layer
!  * ------------ */
  
  /* Flag to indicate non-final subparameters in a single CSI parameter.
   * Consider
--- 211,219 ----
   * Button 4 is scroll wheel down, button 5 is scroll wheel up. */
  void vterm_mouse_button(VTerm *vt, int button, int pressed, VTermModifier 
mod);
  
! // ------------
! // Parser layer
! // ------------
  
  /* Flag to indicate non-final subparameters in a single CSI parameter.
   * Consider
***************
*** 249,257 ****
  void  vterm_parser_set_callbacks(VTerm *vt, const VTermParserCallbacks 
*callbacks, void *user);
  void *vterm_parser_get_cbdata(VTerm *vt);
  
! /* -----------
!  * State layer
!  * ----------- */
  
  typedef struct {
    int (*putglyph)(VTermGlyphInfo *info, VTermPos pos, void *user);
--- 249,257 ----
  void  vterm_parser_set_callbacks(VTerm *vt, const VTermParserCallbacks 
*callbacks, void *user);
  void *vterm_parser_get_cbdata(VTerm *vt);
  
! // -----------
! // State layer
! // -----------
  
  typedef struct {
    int (*putglyph)(VTermGlyphInfo *info, VTermPos pos, void *user);
***************
*** 287,293 ****
  void  vterm_state_set_callbacks(VTermState *state, const VTermStateCallbacks 
*callbacks, void *user);
  void *vterm_state_get_cbdata(VTermState *state);
  
! /* Only invokes control, csi, osc, dcs */
  void  vterm_state_set_unrecognised_fallbacks(VTermState *state, const 
VTermParserCallbacks *fallbacks, void *user);
  void *vterm_state_get_unrecognised_fbdata(VTermState *state);
  
--- 287,293 ----
  void  vterm_state_set_callbacks(VTermState *state, const VTermStateCallbacks 
*callbacks, void *user);
  void *vterm_state_get_cbdata(VTermState *state);
  
! // Only invokes control, csi, osc, dcs
  void  vterm_state_set_unrecognised_fallbacks(VTermState *state, const 
VTermParserCallbacks *fallbacks, void *user);
  void *vterm_state_get_unrecognised_fbdata(VTermState *state);
  
***************
*** 307,315 ****
  void vterm_state_focus_out(VTermState *state);
  const VTermLineInfo *vterm_state_get_lineinfo(const VTermState *state, int 
row);
  
! /* ------------
!  * Screen layer
!  * ------------ */
  
  typedef struct {
      unsigned int bold      : 1;
--- 307,315 ----
  void vterm_state_focus_out(VTermState *state);
  const VTermLineInfo *vterm_state_get_lineinfo(const VTermState *state, int 
row);
  
! // ------------
! // Screen layer
! // ------------
  
  typedef struct {
      unsigned int bold      : 1;
***************
*** 356,362 ****
  void  vterm_screen_set_callbacks(VTermScreen *screen, const 
VTermScreenCallbacks *callbacks, void *user);
  void *vterm_screen_get_cbdata(VTermScreen *screen);
  
! /* Only invokes control, csi, osc, dcs */
  void  vterm_screen_set_unrecognised_fallbacks(VTermScreen *screen, const 
VTermParserCallbacks *fallbacks, void *user);
  void *vterm_screen_get_unrecognised_fbdata(VTermScreen *screen);
  
--- 356,362 ----
  void  vterm_screen_set_callbacks(VTermScreen *screen, const 
VTermScreenCallbacks *callbacks, void *user);
  void *vterm_screen_get_cbdata(VTermScreen *screen);
  
! // Only invokes control, csi, osc, dcs
  void  vterm_screen_set_unrecognised_fallbacks(VTermScreen *screen, const 
VTermParserCallbacks *fallbacks, void *user);
  void *vterm_screen_get_unrecognised_fbdata(VTermScreen *screen);
  
***************
*** 409,417 ****
  
  int vterm_screen_is_eol(const VTermScreen *screen, VTermPos pos);
  
! /* ---------
!  * Utilities
!  * --------- */
  
  VTermValueType vterm_get_attr_type(VTermAttr attr);
  VTermValueType vterm_get_prop_type(VTermProp prop);
--- 409,417 ----
  
  int vterm_screen_is_eol(const VTermScreen *screen, VTermPos pos);
  
! // ---------
! // Utilities
! // ---------
  
  VTermValueType vterm_get_attr_type(VTermAttr attr);
  VTermValueType vterm_get_prop_type(VTermProp prop);
*** ../vim-8.0.1756/src/libvterm/include/vterm_keycodes.h       2018-03-25 
16:20:18.513264056 +0200
--- src/libvterm/include/vterm_keycodes.h       2018-04-24 17:56:28.243669905 
+0200
***************
*** 55,61 ****
    VTERM_KEY_KP_ENTER,
    VTERM_KEY_KP_EQUAL,
  
!   VTERM_KEY_MAX, /* Must be last */
    VTERM_N_KEYS = VTERM_KEY_MAX
  } VTermKey;
  
--- 55,61 ----
    VTERM_KEY_KP_ENTER,
    VTERM_KEY_KP_EQUAL,
  
!   VTERM_KEY_MAX, // Must be last
    VTERM_N_KEYS = VTERM_KEY_MAX
  } VTermKey;
  
*** ../vim-8.0.1756/src/libvterm/src/encoding.c 2018-02-04 14:49:54.019221594 
+0100
--- src/libvterm/src/encoding.c 2018-04-24 17:58:04.107063092 +0200
***************
*** 7,17 ****
  #endif
  
  struct UTF8DecoderData {
!   /* number of bytes remaining in this codepoint */
    int bytes_remaining;
  
!   /* number of bytes total in this codepoint once it's finished
!      (for detecting overlongs) */
    int bytes_total;
  
    int this_cp;
--- 7,17 ----
  #endif
  
  struct UTF8DecoderData {
!   // number of bytes remaining in this codepoint
    int bytes_remaining;
  
!   // number of bytes total in this codepoint once it's finished
!   // (for detecting overlongs)
    int bytes_total;
  
    int this_cp;
***************
*** 42,48 ****
      printf(" pos=%zd c=%02x rem=%d\n", *pos, c, data->bytes_remaining);
  #endif
  
!     if(c < 0x20) /* C0 */
        return;
  
      else if(c >= 0x20 && c < 0x7f) {
--- 42,48 ----
      printf(" pos=%zd c=%02x rem=%d\n", *pos, c, data->bytes_remaining);
  #endif
  
!     if(c < 0x20) // C0
        return;
  
      else if(c >= 0x20 && c < 0x7f) {
***************
*** 58,64 ****
  #endif
      }
  
!     else if(c == 0x7f) /* DEL */
        return;
  
      else if(c >= 0x80 && c < 0xc0) {
--- 58,64 ----
  #endif
      }
  
!     else if(c == 0x7f) // DEL
        return;
  
      else if(c >= 0x80 && c < 0xc0) {
***************
*** 75,81 ****
  #ifdef DEBUG_PRINT_UTF8
          printf(" UTF-8 raw char U+%04x bytelen=%d ", data->this_cp, 
data->bytes_total);
  #endif
!         /* Check for overlong sequences */
          switch(data->bytes_total) {
          case 2:
            if(data->this_cp <  0x0080) data->this_cp = UNICODE_INVALID;
--- 75,81 ----
  #ifdef DEBUG_PRINT_UTF8
          printf(" UTF-8 raw char U+%04x bytelen=%d ", data->this_cp, 
data->bytes_total);
  #endif
!         // Check for overlong sequences
          switch(data->bytes_total) {
          case 2:
            if(data->this_cp <  0x0080) data->this_cp = UNICODE_INVALID;
***************
*** 93,99 ****
            if(data->this_cp < 0x4000000) data->this_cp = UNICODE_INVALID;
            break;
          }
!         /* Now look for plain invalid ones */
          if((data->this_cp >= 0xD800 && data->this_cp <= 0xDFFF) ||
             data->this_cp == 0xFFFE ||
             data->this_cp == 0xFFFF)
--- 93,99 ----
            if(data->this_cp < 0x4000000) data->this_cp = UNICODE_INVALID;
            break;
          }
!         // Now look for plain invalid ones
          if((data->this_cp >= 0xD800 && data->this_cp <= 0xDFFF) ||
             data->this_cp == 0xFFFE ||
             data->this_cp == 0xFFFF)
*** ../vim-8.0.1756/src/libvterm/src/keyboard.c 2017-07-23 22:07:23.041277153 
+0200
--- src/libvterm/src/keyboard.c 2018-04-24 18:01:25.177808418 +0200
***************
*** 15,21 ****
      mod &= ~VTERM_MOD_SHIFT;
  
    if(mod == 0) {
!     /* Normal text - ignore just shift */
      char str[6];
      int seqlen = fill_utf8(c, str);
      vterm_push_output_bytes(vt, str, seqlen);
--- 15,21 ----
      mod &= ~VTERM_MOD_SHIFT;
  
    if(mod == 0) {
!     // Normal text - ignore just shift
      char str[6];
      int seqlen = fill_utf8(c, str);
      vterm_push_output_bytes(vt, str, seqlen);
***************
*** 62,68 ****
      KEYCODE_CSI,
      KEYCODE_CSI_CURSOR,
      KEYCODE_CSINUM,
!     KEYCODE_KEYPAD
    } type;
    char literal;
    int csinum;
--- 62,68 ----
      KEYCODE_CSI,
      KEYCODE_CSI_CURSOR,
      KEYCODE_CSINUM,
!     KEYCODE_KEYPAD,
    } type;
    char literal;
    int csinum;
***************
*** 70,130 ****
  
  /* Order here must be exactly the same as VTermKey enum! */
  static keycodes_s keycodes[] = {
!   { KEYCODE_NONE,       0, 0 }, /* NONE */
  
!   { KEYCODE_ENTER,      '\r', 0 }, /* ENTER */
!   { KEYCODE_TAB,        '\t',  0 }, /* TAB */
!   { KEYCODE_LITERAL,    '\x7f', 0 }, /* BACKSPACE == ASCII DEL */
!   { KEYCODE_LITERAL,    '\x1b', 0 }, /* ESCAPE */
! 
!   { KEYCODE_CSI_CURSOR, 'A', 0 }, /* UP */
!   { KEYCODE_CSI_CURSOR, 'B', 0 }, /* DOWN */
!   { KEYCODE_CSI_CURSOR, 'D', 0 }, /* LEFT */
!   { KEYCODE_CSI_CURSOR, 'C', 0 }, /* RIGHT */
! 
!   { KEYCODE_CSINUM,     '~', 2 },  /* INS */
!   { KEYCODE_CSINUM,     '~', 3 },  /* DEL */
!   { KEYCODE_CSI_CURSOR, 'H', 0 }, /* HOME */
!   { KEYCODE_CSI_CURSOR, 'F', 0 }, /* END */
!   { KEYCODE_CSINUM,     '~', 5 },  /* PAGEUP */
!   { KEYCODE_CSINUM,     '~', 6 },  /* PAGEDOWN */
  };
  
  static keycodes_s keycodes_fn[] = {
!   { KEYCODE_NONE,       0, 0 },   /* F0 - shouldn't happen */
!   { KEYCODE_CSI_CURSOR, 'P', 0 }, /* F1 */
!   { KEYCODE_CSI_CURSOR, 'Q', 0 }, /* F2 */
!   { KEYCODE_CSI_CURSOR, 'R', 0 }, /* F3 */
!   { KEYCODE_CSI_CURSOR, 'S', 0 }, /* F4 */
!   { KEYCODE_CSINUM,     '~', 15 }, /* F5 */
!   { KEYCODE_CSINUM,     '~', 17 }, /* F6 */
!   { KEYCODE_CSINUM,     '~', 18 }, /* F7 */
!   { KEYCODE_CSINUM,     '~', 19 }, /* F8 */
!   { KEYCODE_CSINUM,     '~', 20 }, /* F9 */
!   { KEYCODE_CSINUM,     '~', 21 }, /* F10 */
!   { KEYCODE_CSINUM,     '~', 23 }, /* F11 */
!   { KEYCODE_CSINUM,     '~', 24 }, /* F12 */
  };
  
  static keycodes_s keycodes_kp[] = {
!   { KEYCODE_KEYPAD, '0', 'p' }, /* KP_0 */
!   { KEYCODE_KEYPAD, '1', 'q' }, /* KP_1 */
!   { KEYCODE_KEYPAD, '2', 'r' }, /* KP_2 */
!   { KEYCODE_KEYPAD, '3', 's' }, /* KP_3 */
!   { KEYCODE_KEYPAD, '4', 't' }, /* KP_4 */
!   { KEYCODE_KEYPAD, '5', 'u' }, /* KP_5 */
!   { KEYCODE_KEYPAD, '6', 'v' }, /* KP_6 */
!   { KEYCODE_KEYPAD, '7', 'w' }, /* KP_7 */
!   { KEYCODE_KEYPAD, '8', 'x' }, /* KP_8 */
!   { KEYCODE_KEYPAD, '9', 'y' }, /* KP_9 */
!   { KEYCODE_KEYPAD, '*', 'j' }, /* KP_MULT */
!   { KEYCODE_KEYPAD, '+', 'k' }, /* KP_PLUS */
!   { KEYCODE_KEYPAD, ',', 'l' }, /* KP_COMMA */
!   { KEYCODE_KEYPAD, '-', 'm' }, /* KP_MINUS */
!   { KEYCODE_KEYPAD, '.', 'n' }, /* KP_PERIOD */
!   { KEYCODE_KEYPAD, '/', 'o' }, /* KP_DIVIDE */
!   { KEYCODE_KEYPAD, '\n', 'M' }, /* KP_ENTER */
!   { KEYCODE_KEYPAD, '=', 'X' }, /* KP_EQUAL */
  };
  
  void vterm_keyboard_key(VTerm *vt, VTermKey key, VTermModifier mod)
--- 70,130 ----
  
  /* Order here must be exactly the same as VTermKey enum! */
  static keycodes_s keycodes[] = {
!   { KEYCODE_NONE,       0, 0 }, // NONE
  
!   { KEYCODE_ENTER,      '\r', 0 }, // ENTER
!   { KEYCODE_TAB,        '\t',  0 }, // TAB
!   { KEYCODE_LITERAL,    '\x7f', 0 }, // BACKSPACE == ASCII DEL
!   { KEYCODE_LITERAL,    '\x1b', 0 }, // ESCAPE
! 
!   { KEYCODE_CSI_CURSOR, 'A', 0 }, // UP
!   { KEYCODE_CSI_CURSOR, 'B', 0 }, // DOWN
!   { KEYCODE_CSI_CURSOR, 'D', 0 }, // LEFT
!   { KEYCODE_CSI_CURSOR, 'C', 0 }, // RIGHT
! 
!   { KEYCODE_CSINUM,     '~', 2 }, // INS
!   { KEYCODE_CSINUM,     '~', 3 }, // DEL
!   { KEYCODE_CSI_CURSOR, 'H', 0 }, // HOME
!   { KEYCODE_CSI_CURSOR, 'F', 0 }, // END
!   { KEYCODE_CSINUM,     '~', 5 }, // PAGEUP
!   { KEYCODE_CSINUM,     '~', 6 }, // PAGEDOWN
  };
  
  static keycodes_s keycodes_fn[] = {
!   { KEYCODE_NONE,       0, 0 },   // F0 - shouldn't happen
!   { KEYCODE_CSI_CURSOR, 'P', 0 }, // F1
!   { KEYCODE_CSI_CURSOR, 'Q', 0 }, // F2
!   { KEYCODE_CSI_CURSOR, 'R', 0 }, // F3
!   { KEYCODE_CSI_CURSOR, 'S', 0 }, // F4
!   { KEYCODE_CSINUM,     '~', 15 }, // F5
!   { KEYCODE_CSINUM,     '~', 17 }, // F6
!   { KEYCODE_CSINUM,     '~', 18 }, // F7
!   { KEYCODE_CSINUM,     '~', 19 }, // F8
!   { KEYCODE_CSINUM,     '~', 20 }, // F9
!   { KEYCODE_CSINUM,     '~', 21 }, // F10
!   { KEYCODE_CSINUM,     '~', 23 }, // F11
!   { KEYCODE_CSINUM,     '~', 24 }, // F12
  };
  
  static keycodes_s keycodes_kp[] = {
!   { KEYCODE_KEYPAD, '0', 'p' }, // KP_0
!   { KEYCODE_KEYPAD, '1', 'q' }, // KP_1
!   { KEYCODE_KEYPAD, '2', 'r' }, // KP_2
!   { KEYCODE_KEYPAD, '3', 's' }, // KP_3
!   { KEYCODE_KEYPAD, '4', 't' }, // KP_4
!   { KEYCODE_KEYPAD, '5', 'u' }, // KP_5
!   { KEYCODE_KEYPAD, '6', 'v' }, // KP_6
!   { KEYCODE_KEYPAD, '7', 'w' }, // KP_7
!   { KEYCODE_KEYPAD, '8', 'x' }, // KP_8
!   { KEYCODE_KEYPAD, '9', 'y' }, // KP_9
!   { KEYCODE_KEYPAD, '*', 'j' }, // KP_MULT
!   { KEYCODE_KEYPAD, '+', 'k' }, // KP_PLUS
!   { KEYCODE_KEYPAD, ',', 'l' }, // KP_COMMA
!   { KEYCODE_KEYPAD, '-', 'm' }, // KP_MINUS
!   { KEYCODE_KEYPAD, '.', 'n' }, // KP_PERIOD
!   { KEYCODE_KEYPAD, '/', 'o' }, // KP_DIVIDE
!   { KEYCODE_KEYPAD, '\n', 'M' }, // KP_ENTER
!   { KEYCODE_KEYPAD, '=', 'X' }, // KP_EQUAL
  };
  
  void vterm_keyboard_key(VTerm *vt, VTermKey key, VTermModifier mod)
*** ../vim-8.0.1756/src/libvterm/src/parser.c   2018-04-08 12:17:01.131208574 
+0200
--- src/libvterm/src/parser.c   2018-04-24 18:03:23.569078422 +0200
***************
*** 148,165 ****
    for( ; pos < len; pos++) {
      unsigned char c = bytes[pos];
  
!     if(c == 0x00 || c == 0x7f) { /* NUL, DEL */
        if(vt->parser.state >= STRING) {
          more_string(vt, string_start, bytes + pos - string_start);
          string_start = bytes + pos + 1;
        }
        continue;
      }
!     if(c == 0x18 || c == 0x1a) { /* CAN, SUB */
        ENTER_NORMAL_STATE();
        continue;
      }
!     else if(c == 0x1b) { /* ESC */
        vt->parser.intermedlen = 0;
        if(vt->parser.state == STRING)
          vt->parser.state = ESC_IN_STRING;
--- 148,165 ----
    for( ; pos < len; pos++) {
      unsigned char c = bytes[pos];
  
!     if(c == 0x00 || c == 0x7f) { // NUL, DEL
        if(vt->parser.state >= STRING) {
          more_string(vt, string_start, bytes + pos - string_start);
          string_start = bytes + pos + 1;
        }
        continue;
      }
!     if(c == 0x18 || c == 0x1a) { // CAN, SUB
        ENTER_NORMAL_STATE();
        continue;
      }
!     else if(c == 0x1b) { // ESC
        vt->parser.intermedlen = 0;
        if(vt->parser.state == STRING)
          vt->parser.state = ESC_IN_STRING;
***************
*** 167,177 ****
          ENTER_STATE(ESC);
        continue;
      }
!     else if(c == 0x07 &&  /* BEL, can stand for ST in OSC or DCS state */
              vt->parser.state == STRING) {
!       /* fallthrough */
      }
!     else if(c < 0x20) { /* other C0 */
        if(vt->parser.state >= STRING)
          more_string(vt, string_start, bytes + pos - string_start);
        do_control(vt, c);
--- 167,177 ----
          ENTER_STATE(ESC);
        continue;
      }
!     else if(c == 0x07 &&  // BEL, can stand for ST in OSC or DCS state
              vt->parser.state == STRING) {
!       // fallthrough
      }
!     else if(c < 0x20) { // other C0
        if(vt->parser.state >= STRING)
          more_string(vt, string_start, bytes + pos - string_start);
        do_control(vt, c);
***************
*** 179,208 ****
          string_start = bytes + pos + 1;
        continue;
      }
!     /* else fallthrough */
  
      switch(vt->parser.state) {
      case ESC_IN_STRING:
!       if(c == 0x5c) { /* ST */
          vt->parser.state = STRING;
          done_string(vt, string_start, bytes + pos - string_start - 1);
          ENTER_NORMAL_STATE();
          break;
        }
        vt->parser.state = ESC;
!       /* else fallthrough */
  
      case ESC:
        switch(c) {
!       case 0x50: /* DCS */
          start_string(vt, VTERM_PARSER_DCS);
          ENTER_STRING_STATE();
          break;
!       case 0x5b: /* CSI */
          vt->parser.csi_leaderlen = 0;
          ENTER_STATE(CSI_LEADER);
          break;
!       case 0x5d: /* OSC */
          start_string(vt, VTERM_PARSER_OSC);
          ENTER_STRING_STATE();
          break;
--- 179,208 ----
          string_start = bytes + pos + 1;
        continue;
      }
!     // else fallthrough
  
      switch(vt->parser.state) {
      case ESC_IN_STRING:
!       if(c == 0x5c) { // ST
          vt->parser.state = STRING;
          done_string(vt, string_start, bytes + pos - string_start - 1);
          ENTER_NORMAL_STATE();
          break;
        }
        vt->parser.state = ESC;
!       // else fallthrough
  
      case ESC:
        switch(c) {
!       case 0x50: // DCS
          start_string(vt, VTERM_PARSER_DCS);
          ENTER_STRING_STATE();
          break;
!       case 0x5b: // CSI
          vt->parser.csi_leaderlen = 0;
          ENTER_STATE(CSI_LEADER);
          break;
!       case 0x5d: // OSC
          start_string(vt, VTERM_PARSER_OSC);
          ENTER_STRING_STATE();
          break;
***************
*** 298,311 ****
      case NORMAL:
        if(c >= 0x80 && c < 0xa0 && !vt->mode.utf8) {
          switch(c) {
!         case 0x90: /* DCS */
            start_string(vt, VTERM_PARSER_DCS);
            ENTER_STRING_STATE();
            break;
!         case 0x9b: /* CSI */
            ENTER_STATE(CSI_LEADER);
            break;
!         case 0x9d: /* OSC */
            start_string(vt, VTERM_PARSER_OSC);
            ENTER_STRING_STATE();
            break;
--- 298,311 ----
      case NORMAL:
        if(c >= 0x80 && c < 0xa0 && !vt->mode.utf8) {
          switch(c) {
!         case 0x90: // DCS
            start_string(vt, VTERM_PARSER_DCS);
            ENTER_STRING_STATE();
            break;
!         case 0x9b: // CSI
            ENTER_STATE(CSI_LEADER);
            break;
!         case 0x9d: // OSC
            start_string(vt, VTERM_PARSER_OSC);
            ENTER_STRING_STATE();
            break;
***************
*** 325,331 ****
            eaten = 1;
          }
  
!         pos += (eaten - 1); /* we'll ++ it again in a moment */
        }
        break;
      }
--- 325,331 ----
            eaten = 1;
          }
  
!         pos += (eaten - 1); // we'll ++ it again in a moment
        }
        break;
      }
*** ../vim-8.0.1756/src/libvterm/src/pen.c      2018-03-25 16:20:18.517264034 
+0200
--- src/libvterm/src/pen.c      2018-04-24 18:12:35.253726764 +0200
***************
*** 4,27 ****
  
  static const VTermColor ansi_colors[] = {
    /* R    G    B   index */
!   {   0,   0,   0,  1 }, /* black */
!   { 224,   0,   0,  2 }, /* red */
!   {   0, 224,   0,  3 }, /* green */
!   { 224, 224,   0,  4 }, /* yellow */
!   {   0,   0, 224,  5 }, /* blue */
!   { 224,   0, 224,  6 }, /* magenta */
!   {   0, 224, 224,  7 }, /* cyan */
!   { 224, 224, 224,  8 }, /* white == light grey */
! 
!   /* high intensity */
!   { 128, 128, 128,  9 }, /* black */
!   { 255,  64,  64, 10 }, /* red */
!   {  64, 255,  64, 11 }, /* green */
!   { 255, 255,  64, 12 }, /* yellow */
!   {  64,  64, 255, 13 }, /* blue */
!   { 255,  64, 255, 14 }, /* magenta */
!   {  64, 255, 255, 15 }, /* cyan */
!   { 255, 255, 255, 16 }, /* white for real */
  };
  
  static int ramp6[] = {
--- 4,27 ----
  
  static const VTermColor ansi_colors[] = {
    /* R    G    B   index */
!   {   0,   0,   0,  1 }, // black
!   { 224,   0,   0,  2 }, // red
!   {   0, 224,   0,  3 }, // green
!   { 224, 224,   0,  4 }, // yellow
!   {   0,   0, 224,  5 }, // blue
!   { 224,   0, 224,  6 }, // magenta
!   {   0, 224, 224,  7 }, // cyan
!   { 224, 224, 224,  8 }, // white == light grey
! 
!   // high intensity
!   { 128, 128, 128,  9 }, // black
!   { 255,  64,  64, 10 }, // red
!   {  64, 255,  64, 11 }, // green
!   { 255, 255,  64, 12 }, // yellow
!   {  64,  64, 255, 13 }, // blue
!   { 255,  64, 255, 14 }, // magenta
!   {  64, 255, 255, 15 }, // cyan
!   { 255, 255, 255, 16 }, // white for real
  };
  
  static int ramp6[] = {
***************
*** 47,57 ****
  static int lookup_colour_palette(const VTermState *state, long index, 
VTermColor *col)
  {
    if(index >= 0 && index < 16) {
!     /* Normal 8 colours or high intensity - parse as palette 0 */
      return lookup_colour_ansi(state, index, col);
    }
    else if(index >= 16 && index < 232) {
!     /* 216-colour cube */
      index -= 16;
  
      col->blue  = ramp6[index     % 6];
--- 47,57 ----
  static int lookup_colour_palette(const VTermState *state, long index, 
VTermColor *col)
  {
    if(index >= 0 && index < 16) {
!     // Normal 8 colours or high intensity - parse as palette 0
      return lookup_colour_ansi(state, index, col);
    }
    else if(index >= 16 && index < 232) {
!     // 216-colour cube
      index -= 16;
  
      col->blue  = ramp6[index     % 6];
***************
*** 62,68 ****
      return TRUE;
    }
    else if(index >= 232 && index < 256) {
!     /* 24 greyscales */
      index -= 232;
  
      col->blue  = ramp24[index];
--- 62,68 ----
      return TRUE;
    }
    else if(index >= 232 && index < 256) {
!     // 24 greyscales
      index -= 232;
  
      col->blue  = ramp24[index];
***************
*** 79,85 ****
  static int lookup_colour(const VTermState *state, int palette, const long 
args[], int argcount, VTermColor *col, int *index)
  {
    switch(palette) {
!   case 2: /* RGB mode - 3 args contain colour values directly */
      if(argcount < 3)
        return argcount;
  
--- 79,85 ----
  static int lookup_colour(const VTermState *state, int palette, const long 
args[], int argcount, VTermColor *col, int *index)
  {
    switch(palette) {
!   case 2: // RGB mode - 3 args contain colour values directly
      if(argcount < 3)
        return argcount;
  
***************
*** 90,96 ****
  
      return 3;
  
!   case 5: /* XTerm 256-colour mode */
      if(index)
        *index = CSI_ARG_OR(args[0], -1);
  
--- 90,96 ----
  
      return 3;
  
!   case 5: // XTerm 256-colour mode
      if(index)
        *index = CSI_ARG_OR(args[0], -1);
  
***************
*** 104,110 ****
    }
  }
  
! /* Some conveniences */
  
  static void setpenattr(VTermState *state, VTermAttr attr, VTermValueType type 
UNUSED, VTermValue *val)
  {
--- 104,110 ----
    }
  }
  
! // Some conveniences
  
  static void setpenattr(VTermState *state, VTermAttr attr, VTermValueType type 
UNUSED, VTermValue *val)
  {
***************
*** 153,159 ****
  {
    int col;
  
!   /* 90% grey so that pure white is brighter */
    state->default_fg.red = state->default_fg.green = state->default_fg.blue = 
240;
    state->default_fg.ansi_index = VTERM_ANSI_INDEX_DEFAULT;
    state->default_bg.red = state->default_bg.green = state->default_bg.blue = 
0;
--- 153,159 ----
  {
    int col;
  
!   // 90% grey so that pure white is brighter
    state->default_fg.red = state->default_fg.green = state->default_fg.blue = 
240;
    state->default_fg.ansi_index = VTERM_ANSI_INDEX_DEFAULT;
    state->default_bg.red = state->default_bg.green = state->default_bg.blue = 
0;
***************
*** 232,329 ****
  
  INTERNAL void vterm_state_setpen(VTermState *state, const long args[], int 
argcount)
  {
!   /* SGR - ECMA-48 8.3.117 */
  
    int argi = 0;
    int value;
  
    while(argi < argcount) {
!     /* This logic is easier to do 'done' backwards; set it true, and make it
!        false again in the 'default' case */
      int done = 1;
  
      long arg;
      switch(arg = CSI_ARG(args[argi])) {
      case CSI_ARG_MISSING:
!     case 0: /* Reset */
        vterm_state_resetpen(state);
        break;
  
!     case 1: /* Bold on */
        state->pen.bold = 1;
        setpenattr_bool(state, VTERM_ATTR_BOLD, 1);
        if(state->fg_index > -1 && state->fg_index < 8 && 
state->bold_is_highbright)
          set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, state->fg_index + 
(state->pen.bold ? 8 : 0));
        break;
  
!     case 3: /* Italic on */
        state->pen.italic = 1;
        setpenattr_bool(state, VTERM_ATTR_ITALIC, 1);
        break;
  
!     case 4: /* Underline single */
        state->pen.underline = 1;
        setpenattr_int(state, VTERM_ATTR_UNDERLINE, 1);
        break;
  
!     case 5: /* Blink */
        state->pen.blink = 1;
        setpenattr_bool(state, VTERM_ATTR_BLINK, 1);
        break;
  
!     case 7: /* Reverse on */
        state->pen.reverse = 1;
        setpenattr_bool(state, VTERM_ATTR_REVERSE, 1);
        break;
  
!     case 9: /* Strikethrough on */
        state->pen.strike = 1;
        setpenattr_bool(state, VTERM_ATTR_STRIKE, 1);
        break;
  
      case 10: case 11: case 12: case 13: case 14:
!     case 15: case 16: case 17: case 18: case 19: /* Select font */
        state->pen.font = CSI_ARG(args[argi]) - 10;
        setpenattr_int(state, VTERM_ATTR_FONT, state->pen.font);
        break;
  
!     case 21: /* Underline double */
        state->pen.underline = 2;
        setpenattr_int(state, VTERM_ATTR_UNDERLINE, 2);
        break;
  
!     case 22: /* Bold off */
        state->pen.bold = 0;
        setpenattr_bool(state, VTERM_ATTR_BOLD, 0);
        break;
  
!     case 23: /* Italic and Gothic (currently unsupported) off */
        state->pen.italic = 0;
        setpenattr_bool(state, VTERM_ATTR_ITALIC, 0);
        break;
  
!     case 24: /* Underline off */
        state->pen.underline = 0;
        setpenattr_int(state, VTERM_ATTR_UNDERLINE, 0);
        break;
  
!     case 25: /* Blink off */
        state->pen.blink = 0;
        setpenattr_bool(state, VTERM_ATTR_BLINK, 0);
        break;
  
!     case 27: /* Reverse off */
        state->pen.reverse = 0;
        setpenattr_bool(state, VTERM_ATTR_REVERSE, 0);
        break;
  
!     case 29: /* Strikethrough off */
        state->pen.strike = 0;
        setpenattr_bool(state, VTERM_ATTR_STRIKE, 0);
        break;
  
      case 30: case 31: case 32: case 33:
!     case 34: case 35: case 36: case 37: /* Foreground colour palette */
        value = CSI_ARG(args[argi]) - 30;
        state->fg_index = value;
        if(state->pen.bold && state->bold_is_highbright)
--- 232,329 ----
  
  INTERNAL void vterm_state_setpen(VTermState *state, const long args[], int 
argcount)
  {
!   // SGR - ECMA-48 8.3.117
  
    int argi = 0;
    int value;
  
    while(argi < argcount) {
!     // This logic is easier to do 'done' backwards; set it true, and make it
!     // false again in the 'default' case
      int done = 1;
  
      long arg;
      switch(arg = CSI_ARG(args[argi])) {
      case CSI_ARG_MISSING:
!     case 0: // Reset
        vterm_state_resetpen(state);
        break;
  
!     case 1: // Bold on
        state->pen.bold = 1;
        setpenattr_bool(state, VTERM_ATTR_BOLD, 1);
        if(state->fg_index > -1 && state->fg_index < 8 && 
state->bold_is_highbright)
          set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, state->fg_index + 
(state->pen.bold ? 8 : 0));
        break;
  
!     case 3: // Italic on
        state->pen.italic = 1;
        setpenattr_bool(state, VTERM_ATTR_ITALIC, 1);
        break;
  
!     case 4: // Underline single
        state->pen.underline = 1;
        setpenattr_int(state, VTERM_ATTR_UNDERLINE, 1);
        break;
  
!     case 5: // Blink
        state->pen.blink = 1;
        setpenattr_bool(state, VTERM_ATTR_BLINK, 1);
        break;
  
!     case 7: // Reverse on
        state->pen.reverse = 1;
        setpenattr_bool(state, VTERM_ATTR_REVERSE, 1);
        break;
  
!     case 9: // Strikethrough on
        state->pen.strike = 1;
        setpenattr_bool(state, VTERM_ATTR_STRIKE, 1);
        break;
  
      case 10: case 11: case 12: case 13: case 14:
!     case 15: case 16: case 17: case 18: case 19: // Select font
        state->pen.font = CSI_ARG(args[argi]) - 10;
        setpenattr_int(state, VTERM_ATTR_FONT, state->pen.font);
        break;
  
!     case 21: // Underline double
        state->pen.underline = 2;
        setpenattr_int(state, VTERM_ATTR_UNDERLINE, 2);
        break;
  
!     case 22: // Bold off
        state->pen.bold = 0;
        setpenattr_bool(state, VTERM_ATTR_BOLD, 0);
        break;
  
!     case 23: // Italic and Gothic (currently unsupported) off
        state->pen.italic = 0;
        setpenattr_bool(state, VTERM_ATTR_ITALIC, 0);
        break;
  
!     case 24: // Underline off
        state->pen.underline = 0;
        setpenattr_int(state, VTERM_ATTR_UNDERLINE, 0);
        break;
  
!     case 25: // Blink off
        state->pen.blink = 0;
        setpenattr_bool(state, VTERM_ATTR_BLINK, 0);
        break;
  
!     case 27: // Reverse off
        state->pen.reverse = 0;
        setpenattr_bool(state, VTERM_ATTR_REVERSE, 0);
        break;
  
!     case 29: // Strikethrough off
        state->pen.strike = 0;
        setpenattr_bool(state, VTERM_ATTR_STRIKE, 0);
        break;
  
      case 30: case 31: case 32: case 33:
!     case 34: case 35: case 36: case 37: // Foreground colour palette
        value = CSI_ARG(args[argi]) - 30;
        state->fg_index = value;
        if(state->pen.bold && state->bold_is_highbright)
***************
*** 331,337 ****
        set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, value);
        break;
  
!     case 38: /* Foreground colour alternative palette */
        state->fg_index = -1;
        if(argcount - argi < 1)
          return;
--- 331,337 ----
        set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, value);
        break;
  
!     case 38: // Foreground colour alternative palette
        state->fg_index = -1;
        if(argcount - argi < 1)
          return;
***************
*** 339,358 ****
        setpenattr_col(state, VTERM_ATTR_FOREGROUND, state->pen.fg);
        break;
  
!     case 39: /* Foreground colour default */
        state->fg_index = -1;
        state->pen.fg = state->default_fg;
        setpenattr_col(state, VTERM_ATTR_FOREGROUND, state->pen.fg);
        break;
  
      case 40: case 41: case 42: case 43:
!     case 44: case 45: case 46: case 47: /* Background colour palette */
        value = CSI_ARG(args[argi]) - 40;
        state->bg_index = value;
        set_pen_col_ansi(state, VTERM_ATTR_BACKGROUND, value);
        break;
  
!     case 48: /* Background colour alternative palette */
        state->bg_index = -1;
        if(argcount - argi < 1)
          return;
--- 339,358 ----
        setpenattr_col(state, VTERM_ATTR_FOREGROUND, state->pen.fg);
        break;
  
!     case 39: // Foreground colour default
        state->fg_index = -1;
        state->pen.fg = state->default_fg;
        setpenattr_col(state, VTERM_ATTR_FOREGROUND, state->pen.fg);
        break;
  
      case 40: case 41: case 42: case 43:
!     case 44: case 45: case 46: case 47: // Background colour palette
        value = CSI_ARG(args[argi]) - 40;
        state->bg_index = value;
        set_pen_col_ansi(state, VTERM_ATTR_BACKGROUND, value);
        break;
  
!     case 48: // Background colour alternative palette
        state->bg_index = -1;
        if(argcount - argi < 1)
          return;
***************
*** 360,380 ****
        setpenattr_col(state, VTERM_ATTR_BACKGROUND, state->pen.bg);
        break;
  
!     case 49: /* Default background */
        state->bg_index = -1;
        state->pen.bg = state->default_bg;
        setpenattr_col(state, VTERM_ATTR_BACKGROUND, state->pen.bg);
        break;
  
      case 90: case 91: case 92: case 93:
!     case 94: case 95: case 96: case 97: /* Foreground colour high-intensity 
palette */
        value = CSI_ARG(args[argi]) - 90 + 8;
        state->fg_index = value;
        set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, value);
        break;
  
      case 100: case 101: case 102: case 103:
!     case 104: case 105: case 106: case 107: /* Background colour 
high-intensity palette */
        value = CSI_ARG(args[argi]) - 100 + 8;
        state->bg_index = value;
        set_pen_col_ansi(state, VTERM_ATTR_BACKGROUND, value);
--- 360,380 ----
        setpenattr_col(state, VTERM_ATTR_BACKGROUND, state->pen.bg);
        break;
  
!     case 49: // Default background
        state->bg_index = -1;
        state->pen.bg = state->default_bg;
        setpenattr_col(state, VTERM_ATTR_BACKGROUND, state->pen.bg);
        break;
  
      case 90: case 91: case 92: case 93:
!     case 94: case 95: case 96: case 97: // Foreground colour high-intensity 
palette
        value = CSI_ARG(args[argi]) - 90 + 8;
        state->fg_index = value;
        set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, value);
        break;
  
      case 100: case 101: case 102: case 103:
!     case 104: case 105: case 106: case 107: // Background colour 
high-intensity palette
        value = CSI_ARG(args[argi]) - 100 + 8;
        state->bg_index = value;
        set_pen_col_ansi(state, VTERM_ATTR_BACKGROUND, value);
***************
*** 432,438 ****
      args[argi++] = state->fg_index;
    }
    else if(state->fg_index == -1) {
!     /* Send palette 2 if the actual FG colour is not default */
      if(state->pen.fg.red   != state->default_fg.red   ||
         state->pen.fg.green != state->default_fg.green ||
         state->pen.fg.blue  != state->default_fg.blue  ) {
--- 432,438 ----
      args[argi++] = state->fg_index;
    }
    else if(state->fg_index == -1) {
!     // Send palette 2 if the actual FG colour is not default
      if(state->pen.fg.red   != state->default_fg.red   ||
         state->pen.fg.green != state->default_fg.green ||
         state->pen.fg.blue  != state->default_fg.blue  ) {
***************
*** 454,460 ****
      args[argi++] = state->bg_index;
    }
    else if(state->bg_index == -1) {
!     /* Send palette 2 if the actual BG colour is not default */
      if(state->pen.bg.red   != state->default_bg.red   ||
         state->pen.bg.green != state->default_bg.green ||
         state->pen.bg.blue  != state->default_bg.blue  ) {
--- 454,460 ----
      args[argi++] = state->bg_index;
    }
    else if(state->bg_index == -1) {
!     // Send palette 2 if the actual BG colour is not default
      if(state->pen.bg.red   != state->default_bg.red   ||
         state->pen.bg.green != state->default_bg.green ||
         state->pen.bg.blue  != state->default_bg.blue  ) {
*** ../vim-8.0.1756/src/libvterm/src/screen.c   2018-03-25 16:20:18.517264034 
+0200
--- src/libvterm/src/screen.c   2018-04-24 18:13:56.481237547 +0200
***************
*** 115,131 ****
      /* Emit damage longer than one row. Try to merge with existing damage in
       * the same row */
      if(rect.end_row > rect.start_row + 1) {
!       /* Bigger than 1 line - flush existing, emit this */
        vterm_screen_flush_damage(screen);
        emit = rect;
      }
      else if(screen->damaged.start_row == -1) {
!       /* None stored yet */
        screen->damaged = rect;
        return;
      }
      else if(rect.start_row == screen->damaged.start_row) {
!       /* Merge with the stored line */
        if(screen->damaged.start_col > rect.start_col)
          screen->damaged.start_col = rect.start_col;
        if(screen->damaged.end_col < rect.end_col)
--- 115,131 ----
      /* Emit damage longer than one row. Try to merge with existing damage in
       * the same row */
      if(rect.end_row > rect.start_row + 1) {
!       // Bigger than 1 line - flush existing, emit this
        vterm_screen_flush_damage(screen);
        emit = rect;
      }
      else if(screen->damaged.start_row == -1) {
!       // None stored yet
        screen->damaged = rect;
        return;
      }
      else if(rect.start_row == screen->damaged.start_row) {
!       // Merge with the stored line
        if(screen->damaged.start_col > rect.start_col)
          screen->damaged.start_col = rect.start_col;
        if(screen->damaged.end_col < rect.end_col)
***************
*** 133,139 ****
        return;
      }
      else {
!       /* Emit the currently stored line, store a new one */
        emit = screen->damaged;
        screen->damaged = rect;
      }
--- 133,139 ----
        return;
      }
      else {
!       // Emit the currently stored line, store a new one
        emit = screen->damaged;
        screen->damaged = rect;
      }
***************
*** 208,216 ****
    VTermScreen *screen = user;
  
    if(screen->callbacks && screen->callbacks->sb_pushline &&
!      dest.start_row == 0 && dest.start_col == 0 &&  /* starts top-left corner 
*/
!      dest.end_col == screen->cols &&                /* full width */
!      screen->buffer == screen->buffers[0]) {        /* not altscreen */
      VTermPos pos;
      for(pos.row = 0; pos.row < src.start_row; pos.row++) {
        for(pos.col = 0; pos.col < screen->cols; pos.col++)
--- 208,216 ----
    VTermScreen *screen = user;
  
    if(screen->callbacks && screen->callbacks->sb_pushline &&
!      dest.start_row == 0 && dest.start_col == 0 &&  // starts top-left corner
!      dest.end_col == screen->cols &&                // full width
!      screen->buffer == screen->buffers[0]) {        // not altscreen
      VTermPos pos;
      for(pos.row = 0; pos.row < src.start_row; pos.row++) {
        for(pos.col = 0; pos.col < screen->cols; pos.col++)
***************
*** 252,258 ****
  
    if(screen->callbacks && screen->callbacks->moverect) {
      if(screen->damage_merge != VTERM_DAMAGE_SCROLL)
!       /* Avoid an infinite loop */
        vterm_screen_flush_damage(screen);
  
      if((*screen->callbacks->moverect)(dest, src, screen->cbdata))
--- 252,258 ----
  
    if(screen->callbacks && screen->callbacks->moverect) {
      if(screen->damage_merge != VTERM_DAMAGE_SCROLL)
!       // Avoid an infinite loop
        vterm_screen_flush_damage(screen);
  
      if((*screen->callbacks->moverect)(dest, src, screen->cbdata))
***************
*** 488,498 ****
    int first_blank_row;
  
    if(!is_altscreen && new_rows < old_rows) {
!     /* Fewer rows - determine if we're going to scroll at all, and if so, push
!        those lines to scrollback */
      VTermPos pos = { 0, 0 };
      VTermPos cursor = screen->state->pos;
!     /* Find the first blank row after the cursor. */
      for(pos.row = old_rows - 1; pos.row >= new_rows; pos.row--)
        if(!vterm_screen_is_eol(screen, pos) || cursor.row == pos.row)
          break;
--- 488,498 ----
    int first_blank_row;
  
    if(!is_altscreen && new_rows < old_rows) {
!     // Fewer rows - determine if we're going to scroll at all, and if so, push
!     // those lines to scrollback
      VTermPos pos = { 0, 0 };
      VTermPos cursor = screen->state->pos;
!     // Find the first blank row after the cursor.
      for(pos.row = old_rows - 1; pos.row >= new_rows; pos.row--)
        if(!vterm_screen_is_eol(screen, pos) || cursor.row == pos.row)
          break;
***************
*** 702,711 ****
        int i;
  
        if(cell->chars[0] == 0)
!         /* Erased cell, might need a space */
          padding++;
        else if(cell->chars[0] == (uint32_t)-1)
!         /* Gap behind a double-width char, do nothing */
          ;
        else {
          while(padding) {
--- 702,711 ----
        int i;
  
        if(cell->chars[0] == 0)
!         // Erased cell, might need a space
          padding++;
        else if(cell->chars[0] == (uint32_t)-1)
!         // Gap behind a double-width char, do nothing
          ;
        else {
          while(padding) {
***************
*** 912,918 ****
  
    ScreenCell *target = getcell(screen, pos.row, pos.col);
  
!   /* TODO: bounds check */
    extent->start_row = pos.row;
    extent->end_row   = pos.row + 1;
  
--- 912,918 ----
  
    ScreenCell *target = getcell(screen, pos.row, pos.col);
  
!   // TODO: bounds check
    extent->start_row = pos.row;
    extent->end_row   = pos.row + 1;
  
*** ../vim-8.0.1756/src/libvterm/src/state.c    2018-03-25 16:20:18.517264034 
+0200
--- src/libvterm/src/state.c    2018-04-24 18:21:11.918624160 +0200
***************
*** 101,107 ****
    else if(rightward < -cols)
      rightward = -cols;
  
!   /* Update lineinfo if full line */
    if(rect.start_col == 0 && rect.end_col == state->cols && rightward == 0) {
      int height = rect.end_row - rect.start_row - abs(downward);
  
--- 101,107 ----
    else if(rightward < -cols)
      rightward = -cols;
  
!   // Update lineinfo if full line
    if(rect.start_col == 0 && rect.end_col == state->cols && rightward == 0) {
      int height = rect.end_row - rect.start_row - abs(downward);
  
***************
*** 221,227 ****
      info.doublewidth = DWL_OFF;
    else if(dwl == DWL_ON)
      info.doublewidth = DWL_ON;
!   /* else -1 to ignore */
  
    if(dhl == DHL_OFF)
      info.doubleheight = DHL_OFF;
--- 221,227 ----
      info.doublewidth = DWL_OFF;
    else if(dwl == DWL_ON)
      info.doublewidth = DWL_ON;
!   // else -1 to ignore
  
    if(dhl == DHL_OFF)
      info.doubleheight = DHL_OFF;
***************
*** 248,255 ****
  
    VTermPos oldpos = state->pos;
  
!   /* We'll have at most len codepoints, plus one from a previous incomplete
!    * sequence. */
    codepoints = vterm_allocator_malloc(state->vt, (len + 1) * 
sizeof(uint32_t));
  
    encoding =
--- 248,255 ----
  
    VTermPos oldpos = state->pos;
  
!   // We'll have at most len codepoints, plus one from a previous incomplete
!   // sequence.
    codepoints = vterm_allocator_malloc(state->vt, (len + 1) * 
sizeof(uint32_t));
  
    encoding =
***************
*** 317,323 ****
    }
  
    for(; i < npoints; i++) {
!     /* Try to find combining characters following this */
      int glyph_starts = i;
      int glyph_ends;
      int width = 0;
--- 317,323 ----
    }
  
    for(; i < npoints; i++) {
!     // Try to find combining characters following this
      int glyph_starts = i;
      int glyph_ends;
      int width = 0;
***************
*** 422,475 ****
    VTermPos oldpos = state->pos;
  
    switch(control) {
!   case 0x07: /* BEL - ECMA-48 8.3.3 */
      if(state->callbacks && state->callbacks->bell)
        (*state->callbacks->bell)(state->cbdata);
      break;
  
!   case 0x08: /* BS - ECMA-48 8.3.5 */
      if(state->pos.col > 0)
        state->pos.col--;
      break;
  
!   case 0x09: /* HT - ECMA-48 8.3.60 */
      tab(state, 1, +1);
      break;
  
!   case 0x0a: /* LF - ECMA-48 8.3.74 */
!   case 0x0b: /* VT */
!   case 0x0c: /* FF */
      linefeed(state);
      if(state->mode.newline)
        state->pos.col = 0;
      break;
  
!   case 0x0d: /* CR - ECMA-48 8.3.15 */
      state->pos.col = 0;
      break;
  
!   case 0x0e: /* LS1 - ECMA-48 8.3.76 */
      state->gl_set = 1;
      break;
  
!   case 0x0f: /* LS0 - ECMA-48 8.3.75 */
      state->gl_set = 0;
      break;
  
!   case 0x84: /* IND - DEPRECATED but implemented for completeness */
      linefeed(state);
      break;
  
!   case 0x85: /* NEL - ECMA-48 8.3.86 */
      linefeed(state);
      state->pos.col = 0;
      break;
  
!   case 0x88: /* HTS - ECMA-48 8.3.62 */
      set_col_tabstop(state, state->pos.col);
      break;
  
!   case 0x8d: /* RI - ECMA-48 8.3.104 */
      if(state->pos.row == state->scrollregion_top) {
        VTermRect rect;
        rect.start_row = state->scrollregion_top;
--- 422,475 ----
    VTermPos oldpos = state->pos;
  
    switch(control) {
!   case 0x07: // BEL - ECMA-48 8.3.3
      if(state->callbacks && state->callbacks->bell)
        (*state->callbacks->bell)(state->cbdata);
      break;
  
!   case 0x08: // BS - ECMA-48 8.3.5
      if(state->pos.col > 0)
        state->pos.col--;
      break;
  
!   case 0x09: // HT - ECMA-48 8.3.60
      tab(state, 1, +1);
      break;
  
!   case 0x0a: // LF - ECMA-48 8.3.74
!   case 0x0b: // VT
!   case 0x0c: // FF
      linefeed(state);
      if(state->mode.newline)
        state->pos.col = 0;
      break;
  
!   case 0x0d: // CR - ECMA-48 8.3.15
      state->pos.col = 0;
      break;
  
!   case 0x0e: // LS1 - ECMA-48 8.3.76
      state->gl_set = 1;
      break;
  
!   case 0x0f: // LS0 - ECMA-48 8.3.75
      state->gl_set = 0;
      break;
  
!   case 0x84: // IND - DEPRECATED but implemented for completeness
      linefeed(state);
      break;
  
!   case 0x85: // NEL - ECMA-48 8.3.86
      linefeed(state);
      state->pos.col = 0;
      break;
  
!   case 0x88: // HTS - ECMA-48 8.3.62
      set_col_tabstop(state, state->pos.col);
      break;
  
!   case 0x8d: // RI - ECMA-48 8.3.104
      if(state->pos.row == state->scrollregion_top) {
        VTermRect rect;
        rect.start_row = state->scrollregion_top;
***************
*** 483,493 ****
          state->pos.row--;
      break;
  
!   case 0x8e: /* SS2 - ECMA-48 8.3.141 */
      state->gsingle_set = 2;
      break;
  
!   case 0x8f: /* SS3 - ECMA-48 8.3.142 */
      state->gsingle_set = 3;
      break;
  
--- 483,493 ----
          state->pos.row--;
      break;
  
!   case 0x8e: // SS2 - ECMA-48 8.3.141
      state->gsingle_set = 2;
      break;
  
!   case 0x8f: // SS3 - ECMA-48 8.3.142
      state->gsingle_set = 3;
      break;
  
***************
*** 580,590 ****
        return 0;
  
      switch(bytes[1]) {
!       case 'F': /* S7C1T */
          state->vt->mode.ctrl8bit = 0;
          break;
  
!       case 'G': /* S8C1T */
          state->vt->mode.ctrl8bit = 1;
          break;
  
--- 580,590 ----
        return 0;
  
      switch(bytes[1]) {
!       case 'F': // S7C1T
          state->vt->mode.ctrl8bit = 0;
          break;
  
!       case 'G': // S8C1T
          state->vt->mode.ctrl8bit = 1;
          break;
  
***************
*** 598,628 ****
        return 0;
  
      switch(bytes[1]) {
!       case '3': /* DECDHL top */
          if(state->mode.leftrightmargin)
            break;
          set_lineinfo(state, state->pos.row, NO_FORCE, DWL_ON, DHL_TOP);
          break;
  
!       case '4': /* DECDHL bottom */
          if(state->mode.leftrightmargin)
            break;
          set_lineinfo(state, state->pos.row, NO_FORCE, DWL_ON, DHL_BOTTOM);
          break;
  
!       case '5': /* DECSWL */
          if(state->mode.leftrightmargin)
            break;
          set_lineinfo(state, state->pos.row, NO_FORCE, DWL_OFF, DHL_OFF);
          break;
  
!       case '6': /* DECDWL */
          if(state->mode.leftrightmargin)
            break;
          set_lineinfo(state, state->pos.row, NO_FORCE, DWL_ON, DHL_OFF);
          break;
  
!       case '8': /* DECALN */
        {
          VTermPos pos;
          uint32_t E[] = { 'E', 0 };
--- 598,628 ----
        return 0;
  
      switch(bytes[1]) {
!       case '3': // DECDHL top
          if(state->mode.leftrightmargin)
            break;
          set_lineinfo(state, state->pos.row, NO_FORCE, DWL_ON, DHL_TOP);
          break;
  
!       case '4': // DECDHL bottom
          if(state->mode.leftrightmargin)
            break;
          set_lineinfo(state, state->pos.row, NO_FORCE, DWL_ON, DHL_BOTTOM);
          break;
  
!       case '5': // DECSWL
          if(state->mode.leftrightmargin)
            break;
          set_lineinfo(state, state->pos.row, NO_FORCE, DWL_OFF, DHL_OFF);
          break;
  
!       case '6': // DECDWL
          if(state->mode.leftrightmargin)
            break;
          set_lineinfo(state, state->pos.row, NO_FORCE, DWL_ON, DHL_OFF);
          break;
  
!       case '8': // DECALN
        {
          VTermPos pos;
          uint32_t E[] = { 'E', 0 };
***************
*** 637,643 ****
      }
      return 2;
  
!   case '(': case ')': case '*': case '+': /* SCS */
      if(len != 2)
        return 0;
  
--- 637,643 ----
      }
      return 2;
  
!   case '(': case ')': case '*': case '+': // SCS
      if(len != 2)
        return 0;
  
***************
*** 655,680 ****
  
      return 2;
  
!   case '7': /* DECSC */
      savecursor(state, 1);
      return 1;
  
!   case '8': /* DECRC */
      savecursor(state, 0);
      return 1;
  
!   case '<': /* Ignored by VT100. Used in VT52 mode to switch up to VT100 */
      return 1;
  
!   case '=': /* DECKPAM */
      state->mode.keypad = 1;
      return 1;
  
!   case '>': /* DECKPNM */
      state->mode.keypad = 0;
      return 1;
  
!   case 'c': /* RIS - ECMA-48 8.3.105 */
    {
      VTermPos oldpos = state->pos;
      vterm_state_reset(state, 1);
--- 655,680 ----
  
      return 2;
  
!   case '7': // DECSC
      savecursor(state, 1);
      return 1;
  
!   case '8': // DECRC
      savecursor(state, 0);
      return 1;
  
!   case '<': // Ignored by VT100. Used in VT52 mode to switch up to VT100
      return 1;
  
!   case '=': // DECKPAM
      state->mode.keypad = 1;
      return 1;
  
!   case '>': // DECKPNM
      state->mode.keypad = 0;
      return 1;
  
!   case 'c': // RIS - ECMA-48 8.3.105
    {
      VTermPos oldpos = state->pos;
      vterm_state_reset(state, 1);
***************
*** 683,705 ****
      return 1;
    }
  
!   case 'n': /* LS2 - ECMA-48 8.3.78 */
      state->gl_set = 2;
      return 1;
  
!   case 'o': /* LS3 - ECMA-48 8.3.80 */
      state->gl_set = 3;
      return 1;
  
!   case '~': /* LS1R - ECMA-48 8.3.77 */
      state->gr_set = 1;
      return 1;
  
!   case '}': /* LS2R - ECMA-48 8.3.79 */
      state->gr_set = 2;
      return 1;
  
!   case '|': /* LS3R - ECMA-48 8.3.81 */
      state->gr_set = 3;
      return 1;
  
--- 683,705 ----
      return 1;
    }
  
!   case 'n': // LS2 - ECMA-48 8.3.78
      state->gl_set = 2;
      return 1;
  
!   case 'o': // LS3 - ECMA-48 8.3.80
      state->gl_set = 3;
      return 1;
  
!   case '~': // LS1R - ECMA-48 8.3.77
      state->gr_set = 1;
      return 1;
  
!   case '}': // LS2R - ECMA-48 8.3.79
      state->gr_set = 2;
      return 1;
  
!   case '|': // LS3R - ECMA-48 8.3.81
      state->gr_set = 3;
      return 1;
  
***************
*** 711,721 ****
  static void set_mode(VTermState *state, int num, int val)
  {
    switch(num) {
!   case 4: /* IRM - ECMA-48 7.2.10 */
      state->mode.insert = val;
      break;
  
!   case 20: /* LNM - ANSI X3.4-1977 */
      state->mode.newline = val;
      break;
  
--- 711,721 ----
  static void set_mode(VTermState *state, int num, int val)
  {
    switch(num) {
!   case 4: // IRM - ECMA-48 7.2.10
      state->mode.insert = val;
      break;
  
!   case 20: // LNM - ANSI X3.4-1977
      state->mode.newline = val;
      break;
  
***************
*** 732,742 ****
      state->mode.cursor = val;
      break;
  
!   case 5: /* DECSCNM - screen mode */
      settermprop_bool(state, VTERM_PROP_REVERSE, val);
      break;
  
!   case 6: /* DECOM - origin mode */
      {
        VTermPos oldpos = state->pos;
        state->mode.origin = val;
--- 732,742 ----
      state->mode.cursor = val;
      break;
  
!   case 5: // DECSCNM - screen mode
      settermprop_bool(state, VTERM_PROP_REVERSE, val);
      break;
  
!   case 6: // DECOM - origin mode
      {
        VTermPos oldpos = state->pos;
        state->mode.origin = val;
***************
*** 758,770 ****
      settermprop_bool(state, VTERM_PROP_CURSORVISIBLE, val);
      break;
  
!   case 69: /* DECVSSM - vertical split screen mode */
!            /* DECLRMM - left/right margin mode */
      state->mode.leftrightmargin = val;
      if(val) {
        int row;
  
!       /* Setting DECVSSM must clear doublewidth/doubleheight state of every 
line */
        for(row = 0; row < state->rows; row++)
          set_lineinfo(state, row, FORCE, DWL_OFF, DHL_OFF);
      }
--- 758,770 ----
      settermprop_bool(state, VTERM_PROP_CURSORVISIBLE, val);
      break;
  
!   case 69: // DECVSSM - vertical split screen mode
!            // DECLRMM - left/right margin mode
      state->mode.leftrightmargin = val;
      if(val) {
        int row;
  
!       // Setting DECVSSM must clear doublewidth/doubleheight state of every 
line
        for(row = 0; row < state->rows; row++)
          set_lineinfo(state, row, FORCE, DWL_OFF, DHL_OFF);
      }
***************
*** 911,917 ****
    int selective;
  
    if(leader && leader[0]) {
!     if(leader[1]) /* longer than 1 char */
        return 0;
  
      switch(leader[0]) {
--- 911,917 ----
    int selective;
  
    if(leader && leader[0]) {
!     if(leader[1]) // longer than 1 char
        return 0;
  
      switch(leader[0]) {
***************
*** 925,931 ****
    }
  
    if(intermed && intermed[0]) {
!     if(intermed[1]) /* longer than 1 char */
        return 0;
  
      switch(intermed[0]) {
--- 925,931 ----
    }
  
    if(intermed && intermed[0]) {
!     if(intermed[1]) // longer than 1 char
        return 0;
  
      switch(intermed[0]) {
***************
*** 949,955 ****
  #define INTERMED(i,b) ((i << 16) | b)
  
    switch(intermed_byte << 16 | leader_byte << 8 | command) {
!   case 0x40: /* ICH - ECMA-48 8.3.64 */
      count = CSI_ARG_COUNT(args[0]);
  
      if(!is_cursor_in_scrollregion(state))
--- 949,955 ----
  #define INTERMED(i,b) ((i << 16) | b)
  
    switch(intermed_byte << 16 | leader_byte << 8 | command) {
!   case 0x40: // ICH - ECMA-48 8.3.64
      count = CSI_ARG_COUNT(args[0]);
  
      if(!is_cursor_in_scrollregion(state))
***************
*** 967,1020 ****
  
      break;
  
!   case 0x41: /* CUU - ECMA-48 8.3.22 */
      count = CSI_ARG_COUNT(args[0]);
      state->pos.row -= count;
      state->at_phantom = 0;
      break;
  
!   case 0x42: /* CUD - ECMA-48 8.3.19 */
      count = CSI_ARG_COUNT(args[0]);
      state->pos.row += count;
      state->at_phantom = 0;
      break;
  
!   case 0x43: /* CUF - ECMA-48 8.3.20 */
      count = CSI_ARG_COUNT(args[0]);
      state->pos.col += count;
      state->at_phantom = 0;
      break;
  
!   case 0x44: /* CUB - ECMA-48 8.3.18 */
      count = CSI_ARG_COUNT(args[0]);
      state->pos.col -= count;
      state->at_phantom = 0;
      break;
  
!   case 0x45: /* CNL - ECMA-48 8.3.12 */
      count = CSI_ARG_COUNT(args[0]);
      state->pos.col = 0;
      state->pos.row += count;
      state->at_phantom = 0;
      break;
  
!   case 0x46: /* CPL - ECMA-48 8.3.13 */
      count = CSI_ARG_COUNT(args[0]);
      state->pos.col = 0;
      state->pos.row -= count;
      state->at_phantom = 0;
      break;
  
!   case 0x47: /* CHA - ECMA-48 8.3.9 */
      val = CSI_ARG_OR(args[0], 1);
      state->pos.col = val-1;
      state->at_phantom = 0;
      break;
  
!   case 0x48: /* CUP - ECMA-48 8.3.21 */
      row = CSI_ARG_OR(args[0], 1);
      col = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) ? 1 : CSI_ARG(args[1]);
!     /* zero-based */
      state->pos.row = row-1;
      state->pos.col = col-1;
      if(state->mode.origin) {
--- 967,1020 ----
  
      break;
  
!   case 0x41: // CUU - ECMA-48 8.3.22
      count = CSI_ARG_COUNT(args[0]);
      state->pos.row -= count;
      state->at_phantom = 0;
      break;
  
!   case 0x42: // CUD - ECMA-48 8.3.19
      count = CSI_ARG_COUNT(args[0]);
      state->pos.row += count;
      state->at_phantom = 0;
      break;
  
!   case 0x43: // CUF - ECMA-48 8.3.20
      count = CSI_ARG_COUNT(args[0]);
      state->pos.col += count;
      state->at_phantom = 0;
      break;
  
!   case 0x44: // CUB - ECMA-48 8.3.18
      count = CSI_ARG_COUNT(args[0]);
      state->pos.col -= count;
      state->at_phantom = 0;
      break;
  
!   case 0x45: // CNL - ECMA-48 8.3.12
      count = CSI_ARG_COUNT(args[0]);
      state->pos.col = 0;
      state->pos.row += count;
      state->at_phantom = 0;
      break;
  
!   case 0x46: // CPL - ECMA-48 8.3.13
      count = CSI_ARG_COUNT(args[0]);
      state->pos.col = 0;
      state->pos.row -= count;
      state->at_phantom = 0;
      break;
  
!   case 0x47: // CHA - ECMA-48 8.3.9
      val = CSI_ARG_OR(args[0], 1);
      state->pos.col = val-1;
      state->at_phantom = 0;
      break;
  
!   case 0x48: // CUP - ECMA-48 8.3.21
      row = CSI_ARG_OR(args[0], 1);
      col = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) ? 1 : CSI_ARG(args[1]);
!     // zero-based
      state->pos.row = row-1;
      state->pos.col = col-1;
      if(state->mode.origin) {
***************
*** 1024,1036 ****
      state->at_phantom = 0;
      break;
  
!   case 0x49: /* CHT - ECMA-48 8.3.10 */
      count = CSI_ARG_COUNT(args[0]);
      tab(state, count, +1);
      break;
  
!   case 0x4a: /* ED - ECMA-48 8.3.39 */
!   case LEADER('?', 0x4a): /* DECSED - Selective Erase in Display */
      selective = (leader_byte == '?');
      switch(CSI_ARG(args[0])) {
      case CSI_ARG_MISSING:
--- 1024,1036 ----
      state->at_phantom = 0;
      break;
  
!   case 0x49: // CHT - ECMA-48 8.3.10
      count = CSI_ARG_COUNT(args[0]);
      tab(state, count, +1);
      break;
  
!   case 0x4a: // ED - ECMA-48 8.3.39
!   case LEADER('?', 0x4a): // DECSED - Selective Erase in Display
      selective = (leader_byte == '?');
      switch(CSI_ARG(args[0])) {
      case CSI_ARG_MISSING:
***************
*** 1072,1079 ****
      }
      break;
  
!   case 0x4b: /* EL - ECMA-48 8.3.41 */
!   case LEADER('?', 0x4b): /* DECSEL - Selective Erase in Line */
      selective = (leader_byte == '?');
      rect.start_row = state->pos.row;
      rect.end_row   = state->pos.row + 1;
--- 1072,1079 ----
      }
      break;
  
!   case 0x4b: // EL - ECMA-48 8.3.41
!   case LEADER('?', 0x4b): // DECSEL - Selective Erase in Line
      selective = (leader_byte == '?');
      rect.start_row = state->pos.row;
      rect.end_row   = state->pos.row + 1;
***************
*** 1095,1101 ****
  
      break;
  
!   case 0x4c: /* IL - ECMA-48 8.3.67 */
      count = CSI_ARG_COUNT(args[0]);
  
      if(!is_cursor_in_scrollregion(state))
--- 1095,1101 ----
  
      break;
  
!   case 0x4c: // IL - ECMA-48 8.3.67
      count = CSI_ARG_COUNT(args[0]);
  
      if(!is_cursor_in_scrollregion(state))
***************
*** 1110,1116 ****
  
      break;
  
!   case 0x4d: /* DL - ECMA-48 8.3.32 */
      count = CSI_ARG_COUNT(args[0]);
  
      if(!is_cursor_in_scrollregion(state))
--- 1110,1116 ----
  
      break;
  
!   case 0x4d: // DL - ECMA-48 8.3.32
      count = CSI_ARG_COUNT(args[0]);
  
      if(!is_cursor_in_scrollregion(state))
***************
*** 1125,1131 ****
  
      break;
  
!   case 0x50: /* DCH - ECMA-48 8.3.26 */
      count = CSI_ARG_COUNT(args[0]);
  
      if(!is_cursor_in_scrollregion(state))
--- 1125,1131 ----
  
      break;
  
!   case 0x50: // DCH - ECMA-48 8.3.26
      count = CSI_ARG_COUNT(args[0]);
  
      if(!is_cursor_in_scrollregion(state))
***************
*** 1143,1149 ****
  
      break;
  
!   case 0x53: /* SU - ECMA-48 8.3.147 */
      count = CSI_ARG_COUNT(args[0]);
  
      rect.start_row = state->scrollregion_top;
--- 1143,1149 ----
  
      break;
  
!   case 0x53: // SU - ECMA-48 8.3.147
      count = CSI_ARG_COUNT(args[0]);
  
      rect.start_row = state->scrollregion_top;
***************
*** 1155,1161 ****
  
      break;
  
!   case 0x54: /* SD - ECMA-48 8.3.113 */
      count = CSI_ARG_COUNT(args[0]);
  
      rect.start_row = state->scrollregion_top;
--- 1155,1161 ----
  
      break;
  
!   case 0x54: // SD - ECMA-48 8.3.113
      count = CSI_ARG_COUNT(args[0]);
  
      rect.start_row = state->scrollregion_top;
***************
*** 1167,1173 ****
  
      break;
  
!   case 0x58: /* ECH - ECMA-48 8.3.38 */
      count = CSI_ARG_COUNT(args[0]);
  
      rect.start_row = state->pos.row;
--- 1167,1173 ----
  
      break;
  
!   case 0x58: // ECH - ECMA-48 8.3.38
      count = CSI_ARG_COUNT(args[0]);
  
      rect.start_row = state->pos.row;
***************
*** 1179,1214 ****
      erase(state, rect, 0);
      break;
  
!   case 0x5a: /* CBT - ECMA-48 8.3.7 */
      count = CSI_ARG_COUNT(args[0]);
      tab(state, count, -1);
      break;
  
!   case 0x60: /* HPA - ECMA-48 8.3.57 */
      col = CSI_ARG_OR(args[0], 1);
      state->pos.col = col-1;
      state->at_phantom = 0;
      break;
  
!   case 0x61: /* HPR - ECMA-48 8.3.59 */
      count = CSI_ARG_COUNT(args[0]);
      state->pos.col += count;
      state->at_phantom = 0;
      break;
  
!   case 0x63: /* DA - ECMA-48 8.3.24 */
      val = CSI_ARG_OR(args[0], 0);
      if(val == 0)
!       /* DEC VT100 response */
        vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "?1;2c");
      break;
  
!   case LEADER('>', 0x63): /* DEC secondary Device Attributes */
!     /* This returns xterm version number 100. */
      vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, ">%d;%d;%dc", 0, 100, 
0);
      break;
  
!   case 0x64: /* VPA - ECMA-48 8.3.158 */
      row = CSI_ARG_OR(args[0], 1);
      state->pos.row = row-1;
      if(state->mode.origin)
--- 1179,1214 ----
      erase(state, rect, 0);
      break;
  
!   case 0x5a: // CBT - ECMA-48 8.3.7
      count = CSI_ARG_COUNT(args[0]);
      tab(state, count, -1);
      break;
  
!   case 0x60: // HPA - ECMA-48 8.3.57
      col = CSI_ARG_OR(args[0], 1);
      state->pos.col = col-1;
      state->at_phantom = 0;
      break;
  
!   case 0x61: // HPR - ECMA-48 8.3.59
      count = CSI_ARG_COUNT(args[0]);
      state->pos.col += count;
      state->at_phantom = 0;
      break;
  
!   case 0x63: // DA - ECMA-48 8.3.24
      val = CSI_ARG_OR(args[0], 0);
      if(val == 0)
!       // DEC VT100 response
        vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "?1;2c");
      break;
  
!   case LEADER('>', 0x63): // DEC secondary Device Attributes
!     // This returns xterm version number 100.
      vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, ">%d;%d;%dc", 0, 100, 
0);
      break;
  
!   case 0x64: // VPA - ECMA-48 8.3.158
      row = CSI_ARG_OR(args[0], 1);
      state->pos.row = row-1;
      if(state->mode.origin)
***************
*** 1216,1231 ****
      state->at_phantom = 0;
      break;
  
!   case 0x65: /* VPR - ECMA-48 8.3.160 */
      count = CSI_ARG_COUNT(args[0]);
      state->pos.row += count;
      state->at_phantom = 0;
      break;
  
!   case 0x66: /* HVP - ECMA-48 8.3.63 */
      row = CSI_ARG_OR(args[0], 1);
      col = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) ? 1 : CSI_ARG(args[1]);
!     /* zero-based */
      state->pos.row = row-1;
      state->pos.col = col-1;
      if(state->mode.origin) {
--- 1216,1231 ----
      state->at_phantom = 0;
      break;
  
!   case 0x65: // VPR - ECMA-48 8.3.160
      count = CSI_ARG_COUNT(args[0]);
      state->pos.row += count;
      state->at_phantom = 0;
      break;
  
!   case 0x66: // HVP - ECMA-48 8.3.63
      row = CSI_ARG_OR(args[0], 1);
      col = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) ? 1 : CSI_ARG(args[1]);
!     // zero-based
      state->pos.row = row-1;
      state->pos.col = col-1;
      if(state->mode.origin) {
***************
*** 1235,1241 ****
      state->at_phantom = 0;
      break;
  
!   case 0x67: /* TBC - ECMA-48 8.3.154 */
      val = CSI_ARG_OR(args[0], 0);
  
      switch(val) {
--- 1235,1241 ----
      state->at_phantom = 0;
      break;
  
!   case 0x67: // TBC - ECMA-48 8.3.154
      val = CSI_ARG_OR(args[0], 0);
  
      switch(val) {
***************
*** 1257,1300 ****
      }
      break;
  
!   case 0x68: /* SM - ECMA-48 8.3.125 */
      if(!CSI_ARG_IS_MISSING(args[0]))
        set_mode(state, CSI_ARG(args[0]), 1);
      break;
  
!   case LEADER('?', 0x68): /* DEC private mode set */
      if(!CSI_ARG_IS_MISSING(args[0]))
        set_dec_mode(state, CSI_ARG(args[0]), 1);
      break;
  
!   case 0x6a: /* HPB - ECMA-48 8.3.58 */
      count = CSI_ARG_COUNT(args[0]);
      state->pos.col -= count;
      state->at_phantom = 0;
      break;
  
!   case 0x6b: /* VPB - ECMA-48 8.3.159 */
      count = CSI_ARG_COUNT(args[0]);
      state->pos.row -= count;
      state->at_phantom = 0;
      break;
  
!   case 0x6c: /* RM - ECMA-48 8.3.106 */
      if(!CSI_ARG_IS_MISSING(args[0]))
        set_mode(state, CSI_ARG(args[0]), 0);
      break;
  
!   case LEADER('?', 0x6c): /* DEC private mode reset */
      if(!CSI_ARG_IS_MISSING(args[0]))
        set_dec_mode(state, CSI_ARG(args[0]), 0);
      break;
  
!   case 0x6d: /* SGR - ECMA-48 8.3.117 */
      vterm_state_setpen(state, args, argcount);
      break;
  
!   case 0x6e: /* DSR - ECMA-48 8.3.35 */
!   case LEADER('?', 0x6e): /* DECDSR */
      val = CSI_ARG_OR(args[0], 0);
  
      {
--- 1257,1300 ----
      }
      break;
  
!   case 0x68: // SM - ECMA-48 8.3.125
      if(!CSI_ARG_IS_MISSING(args[0]))
        set_mode(state, CSI_ARG(args[0]), 1);
      break;
  
!   case LEADER('?', 0x68): // DEC private mode set
      if(!CSI_ARG_IS_MISSING(args[0]))
        set_dec_mode(state, CSI_ARG(args[0]), 1);
      break;
  
!   case 0x6a: // HPB - ECMA-48 8.3.58
      count = CSI_ARG_COUNT(args[0]);
      state->pos.col -= count;
      state->at_phantom = 0;
      break;
  
!   case 0x6b: // VPB - ECMA-48 8.3.159
      count = CSI_ARG_COUNT(args[0]);
      state->pos.row -= count;
      state->at_phantom = 0;
      break;
  
!   case 0x6c: // RM - ECMA-48 8.3.106
      if(!CSI_ARG_IS_MISSING(args[0]))
        set_mode(state, CSI_ARG(args[0]), 0);
      break;
  
!   case LEADER('?', 0x6c): // DEC private mode reset
      if(!CSI_ARG_IS_MISSING(args[0]))
        set_dec_mode(state, CSI_ARG(args[0]), 0);
      break;
  
!   case 0x6d: // SGR - ECMA-48 8.3.117
      vterm_state_setpen(state, args, argcount);
      break;
  
!   case 0x6e: // DSR - ECMA-48 8.3.35
!   case LEADER('?', 0x6e): // DECDSR
      val = CSI_ARG_OR(args[0], 0);
  
      {
***************
*** 1302,1313 ****
  
        switch(val) {
        case 0: case 1: case 2: case 3: case 4:
!         /* ignore - these are replies */
          break;
        case 5:
          vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "%s0n", qmark);
          break;
!       case 6: /* CPR - cursor position report */
          vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "%s%d;%dR", qmark, 
state->pos.row + 1, state->pos.col + 1);
          break;
        }
--- 1302,1313 ----
  
        switch(val) {
        case 0: case 1: case 2: case 3: case 4:
!         // ignore - these are replies
          break;
        case 5:
          vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "%s0n", qmark);
          break;
!       case 6: // CPR - cursor position report
          vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "%s%d;%dR", qmark, 
state->pos.row + 1, state->pos.col + 1);
          break;
        }
***************
*** 1315,1321 ****
      break;
  
  
!   case LEADER('!', 0x70): /* DECSTR - DEC soft terminal reset */
      vterm_state_reset(state, 0);
      break;
  
--- 1315,1321 ----
      break;
  
  
!   case LEADER('!', 0x70): // DECSTR - DEC soft terminal reset
      vterm_state_reset(state, 0);
      break;
  
***************
*** 1323,1329 ****
      request_dec_mode(state, CSI_ARG(args[0]));
      break;
  
!   case INTERMED(' ', 0x71): /* DECSCUSR - DEC set cursor shape */
      val = CSI_ARG_OR(args[0], 1);
  
      switch(val) {
--- 1323,1329 ----
      request_dec_mode(state, CSI_ARG(args[0]));
      break;
  
!   case INTERMED(' ', 0x71): // DECSCUSR - DEC set cursor shape
      val = CSI_ARG_OR(args[0], 1);
  
      switch(val) {
***************
*** 1355,1361 ****
  
      break;
  
!   case INTERMED('"', 0x71): /* DECSCA - DEC select character protection 
attribute */
      val = CSI_ARG_OR(args[0], 0);
  
      switch(val) {
--- 1355,1361 ----
  
      break;
  
!   case INTERMED('"', 0x71): // DECSCA - DEC select character protection 
attribute
      val = CSI_ARG_OR(args[0], 0);
  
      switch(val) {
***************
*** 1369,1375 ****
  
      break;
  
!   case 0x72: /* DECSTBM - DEC custom */
      state->scrollregion_top = CSI_ARG_OR(args[0], 1) - 1;
      state->scrollregion_bottom = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) 
? -1 : CSI_ARG(args[1]);
      LBOUND(state->scrollregion_top, 0);
--- 1369,1375 ----
  
      break;
  
!   case 0x72: // DECSTBM - DEC custom
      state->scrollregion_top = CSI_ARG_OR(args[0], 1) - 1;
      state->scrollregion_bottom = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) 
? -1 : CSI_ARG(args[1]);
      LBOUND(state->scrollregion_top, 0);
***************
*** 1381,1395 ****
        UBOUND(state->scrollregion_bottom, state->rows);
  
      if(SCROLLREGION_BOTTOM(state) <= state->scrollregion_top) {
!       /* Invalid */
        state->scrollregion_top    = 0;
        state->scrollregion_bottom = -1;
      }
  
      break;
  
!   case 0x73: /* DECSLRM - DEC custom */
!     /* Always allow setting these margins, just they won't take effect 
without DECVSSM */
      state->scrollregion_left = CSI_ARG_OR(args[0], 1) - 1;
      state->scrollregion_right = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) ? 
-1 : CSI_ARG(args[1]);
      LBOUND(state->scrollregion_left, 0);
--- 1381,1395 ----
        UBOUND(state->scrollregion_bottom, state->rows);
  
      if(SCROLLREGION_BOTTOM(state) <= state->scrollregion_top) {
!       // Invalid
        state->scrollregion_top    = 0;
        state->scrollregion_bottom = -1;
      }
  
      break;
  
!   case 0x73: // DECSLRM - DEC custom
!     // Always allow setting these margins, just they won't take effect 
without DECVSSM
      state->scrollregion_left = CSI_ARG_OR(args[0], 1) - 1;
      state->scrollregion_right = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) ? 
-1 : CSI_ARG(args[1]);
      LBOUND(state->scrollregion_left, 0);
***************
*** 1402,1408 ****
  
      if(state->scrollregion_right > -1 &&
         state->scrollregion_right <= state->scrollregion_left) {
!       /* Invalid */
        state->scrollregion_left  = 0;
        state->scrollregion_right = -1;
      }
--- 1402,1408 ----
  
      if(state->scrollregion_right > -1 &&
         state->scrollregion_right <= state->scrollregion_left) {
!       // Invalid
        state->scrollregion_left  = 0;
        state->scrollregion_right = -1;
      }
***************
*** 1417,1423 ****
      }
      break;
  
!   case INTERMED('\'', 0x7D): /* DECIC */
      count = CSI_ARG_COUNT(args[0]);
  
      if(!is_cursor_in_scrollregion(state))
--- 1417,1423 ----
      }
      break;
  
!   case INTERMED('\'', 0x7D): // DECIC
      count = CSI_ARG_COUNT(args[0]);
  
      if(!is_cursor_in_scrollregion(state))
***************
*** 1432,1438 ****
  
      break;
  
!   case INTERMED('\'', 0x7E): /* DECDC */
      count = CSI_ARG_COUNT(args[0]);
  
      if(!is_cursor_in_scrollregion(state))
--- 1432,1438 ----
  
      break;
  
!   case INTERMED('\'', 0x7E): // DECDC
      count = CSI_ARG_COUNT(args[0]);
  
      if(!is_cursor_in_scrollregion(state))
***************
*** 1545,1551 ****
  {
    if(cmdlen == 1)
      switch(command[0]) {
!       case 'm': /* Query SGR */
          {
            long args[20];
            int argc = vterm_state_getpen(state, args, 
sizeof(args)/sizeof(args[0]));
--- 1545,1551 ----
  {
    if(cmdlen == 1)
      switch(command[0]) {
!       case 'm': // Query SGR
          {
            long args[20];
            int argc = vterm_state_getpen(state, args, 
sizeof(args)/sizeof(args[0]));
***************
*** 1561,1570 ****
            vterm_push_output_sprintf_ctrl(state->vt, C1_ST, "");
          }
          return;
!       case 'r': /* Query DECSTBM */
          vterm_push_output_sprintf_dcs(state->vt, "1$r%d;%dr", 
state->scrollregion_top+1, SCROLLREGION_BOTTOM(state));
          return;
!       case 's': /* Query DECSLRM */
          vterm_push_output_sprintf_dcs(state->vt, "1$r%d;%ds", 
SCROLLREGION_LEFT(state)+1, SCROLLREGION_RIGHT(state));
          return;
      }
--- 1561,1570 ----
            vterm_push_output_sprintf_ctrl(state->vt, C1_ST, "");
          }
          return;
!       case 'r': // Query DECSTBM
          vterm_push_output_sprintf_dcs(state->vt, "1$r%d;%dr", 
state->scrollregion_top+1, SCROLLREGION_BOTTOM(state));
          return;
!       case 's': // Query DECSLRM
          vterm_push_output_sprintf_dcs(state->vt, "1$r%d;%ds", 
SCROLLREGION_LEFT(state)+1, SCROLLREGION_RIGHT(state));
          return;
      }
***************
*** 1779,1785 ****
  
    state->protected_cell = 0;
  
!   /* Initialise the props */
    settermprop_bool(state, VTERM_PROP_CURSORVISIBLE, 1);
    settermprop_bool(state, VTERM_PROP_CURSORBLINK,   1);
    settermprop_int (state, VTERM_PROP_CURSORSHAPE,   
VTERM_PROP_CURSORSHAPE_BLOCK);
--- 1779,1785 ----
  
    state->protected_cell = 0;
  
!   // Initialise the props
    settermprop_bool(state, VTERM_PROP_CURSORVISIBLE, 1);
    settermprop_bool(state, VTERM_PROP_CURSORBLINK,   1);
    settermprop_int (state, VTERM_PROP_CURSORSHAPE,   
VTERM_PROP_CURSORSHAPE_BLOCK);
***************
*** 1859,1865 ****
    case VTERM_PROP_TITLE:
    case VTERM_PROP_ICONNAME:
    case VTERM_PROP_CURSORCOLOR:
!     /* we don't store these, just transparently pass through */
      return 1;
    case VTERM_PROP_CURSORVISIBLE:
      state->mode.cursor_visible = val->boolean;
--- 1859,1865 ----
    case VTERM_PROP_TITLE:
    case VTERM_PROP_ICONNAME:
    case VTERM_PROP_CURSORCOLOR:
!     // we don't store these, just transparently pass through
      return 1;
    case VTERM_PROP_CURSORVISIBLE:
      state->mode.cursor_visible = val->boolean;
*** ../vim-8.0.1756/src/libvterm/src/unicode.c  2017-08-22 22:12:12.936882219 
+0200
--- src/libvterm/src/unicode.c  2018-04-24 18:21:55.382363889 +0200
***************
*** 1,11 ****
  #include "vterm_internal.h"
  
! /* ### The following from http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
!  * With modifications:
!  *   made functions static
!  *   moved 'combining' table to file scope, so other functions can see it
!  * ###################################################################
!  */
  
  /*
   * This is an implementation of wcwidth() and wcswidth() (defined in
--- 1,10 ----
  #include "vterm_internal.h"
  
! // ### The following from http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
! // With modifications:
! //   made functions static
! //   moved 'combining' table to file scope, so other functions can see it
! // ###################################################################
  
  /*
   * This is an implementation of wcwidth() and wcswidth() (defined in
***************
*** 336,344 ****
  }
  #endif
  
! 
! /* ################################
!  * ### The rest added by Paul Evans */
  
  INTERNAL int vterm_unicode_width(uint32_t codepoint)
  {
--- 335,342 ----
  }
  #endif
  
! // ################################
! // ### The rest added by Paul Evans
  
  INTERNAL int vterm_unicode_width(uint32_t codepoint)
  {
*** ../vim-8.0.1756/src/libvterm/src/utf8.h     2017-07-07 11:53:29.523876467 
+0200
--- src/libvterm/src/utf8.h     2018-04-24 18:22:56.317969728 +0200
***************
*** 24,30 ****
  {
    int nbytes = utf8_seqlen(codepoint);
  
!   /* This is easier done backwards */
    int b = nbytes;
    while(b > 1) {
      b--;
--- 24,30 ----
  {
    int nbytes = utf8_seqlen(codepoint);
  
!   // This is easier done backwards
    int b = nbytes;
    while(b > 1) {
      b--;
*** ../vim-8.0.1756/src/libvterm/src/vterm.c    2018-04-07 21:42:50.782097432 
+0200
--- src/libvterm/src/vterm.c    2018-04-24 18:23:45.637603837 +0200
***************
*** 27,34 ****
  }
  
  static VTermAllocatorFunctions default_allocator = {
!   &default_malloc, /* malloc */
!   &default_free /* free */
  };
  
  VTerm *vterm_new(int rows, int cols)
--- 27,34 ----
  }
  
  static VTermAllocatorFunctions default_allocator = {
!   &default_malloc, // malloc
!   &default_free // free
  };
  
  VTerm *vterm_new(int rows, int cols)
*** ../vim-8.0.1756/src/libvterm/src/vterm_internal.h   2018-03-25 
16:20:18.517264034 +0200
--- src/libvterm/src/vterm_internal.h   2018-04-24 18:37:30.240041538 +0200
***************
*** 37,43 ****
  typedef struct {
    VTermEncoding *enc;
  
!   /* This size should be increased if required by other stateful encodings */
    char           data[4*sizeof(uint32_t)];
  } VTermEncodingInstance;
  
--- 37,43 ----
  typedef struct {
    VTermEncoding *enc;
  
!   // This size should be increased if required by other stateful encodings
    char           data[4*sizeof(uint32_t)];
  } VTermEncodingInstance;
  
***************
*** 105,113 ****
  
    /* Last glyph output, for Unicode recombining purposes */
    uint32_t *combine_chars;
!   size_t combine_chars_size; /* Number of ELEMENTS in the above */
!   int combine_width; /* The width of the glyph above */
!   VTermPos combine_pos;   /* Position before movement */
  
    struct {
      unsigned int keypad:1;
--- 105,113 ----
  
    /* Last glyph output, for Unicode recombining purposes */
    uint32_t *combine_chars;
!   size_t combine_chars_size; // Number of ELEMENTS in the above
!   int combine_width; // The width of the glyph above
!   VTermPos combine_pos;   // Position before movement
  
    struct {
      unsigned int keypad:1;
***************
*** 133,139 ****
  
    VTermColor default_fg;
    VTermColor default_bg;
!   VTermColor colors[16]; /* Store the 8 ANSI and the 8 ANSI high-brights only 
*/
  
    int fg_index;
    int bg_index;
--- 133,139 ----
  
    VTermColor default_fg;
    VTermColor default_bg;
!   VTermColor colors[16]; // Store the 8 ANSI and the 8 ANSI high-brights only
  
    int fg_index;
    int bg_index;
***************
*** 183,189 ****
        ESC,
        /* below here are the "string states" */
        STRING,
!       ESC_IN_STRING
      } state;
  
      int intermedlen;
--- 183,189 ----
        ESC,
        /* below here are the "string states" */
        STRING,
!       ESC_IN_STRING,
      } state;
  
      int intermedlen;
***************
*** 248,254 ****
    C1_DCS = 0x90,
    C1_CSI = 0x9b,
    C1_ST  = 0x9c,
!   C1_OSC = 0x9d
  };
  
  void vterm_state_push_output_sprintf_CSI(VTermState *vts, const char *format, 
...);
--- 248,254 ----
    C1_DCS = 0x90,
    C1_CSI = 0x9b,
    C1_ST  = 0x9c,
!   C1_OSC = 0x9d,
  };
  
  void vterm_state_push_output_sprintf_CSI(VTermState *vts, const char *format, 
...);
*** ../vim-8.0.1756/src/version.c       2018-04-24 17:41:52.077176530 +0200
--- src/version.c       2018-04-24 18:38:11.131780879 +0200
***************
*** 763,764 ****
--- 763,766 ----
  {   /* Add new patch number below this line */
+ /**/
+     1757,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
10E. You start counting in hex.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
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/d/optout.

Raspunde prin e-mail lui