@@ -945,8 +945,9 @@ channel_set_options(channel_T *channel, jobopt_T *opt)
945945
946946 if ((opt -> jo_set & JO_OUT_IO ) && opt -> jo_io [PART_OUT ] == JIO_BUFFER )
947947 {
948- /* writing output to a buffer. Force mode to NL. */
949- channel -> ch_part [PART_OUT ].ch_mode = MODE_NL ;
948+ /* writing output to a buffer. Default mode is NL. */
949+ if (!(opt -> jo_set & JO_OUT_MODE ))
950+ channel -> ch_part [PART_OUT ].ch_mode = MODE_NL ;
950951 channel -> ch_part [PART_OUT ].ch_buffer =
951952 find_buffer (opt -> jo_io_name [PART_OUT ]);
952953 ch_logs (channel , "writing to buffer '%s'" ,
@@ -1579,32 +1580,38 @@ may_invoke_callback(channel_T *channel, int part)
15791580 u_sync (TRUE);
15801581 u_save (lnum , lnum + 1 );
15811582
1582- ml_append (lnum , msg , 0 , FALSE);
1583- appended_lines_mark (lnum , 1L );
1584- curbuf = save_curbuf ;
1585-
1586- if (buffer -> b_nwindows > 0 )
1583+ if (msg == NULL )
1584+ /* JSON or JS mode: re-encode the message. */
1585+ msg = json_encode (listtv , ch_mode );
1586+ if (msg != NULL )
15871587 {
1588- win_T * wp ;
1589- win_T * save_curwin ;
1588+ ml_append (lnum , msg , 0 , FALSE);
1589+ appended_lines_mark (lnum , 1L );
1590+ curbuf = save_curbuf ;
15901591
1591- FOR_ALL_WINDOWS ( wp )
1592+ if ( buffer -> b_nwindows > 0 )
15921593 {
1593- if (wp -> w_buffer == buffer
1594- && wp -> w_cursor .lnum == lnum
1595- && wp -> w_cursor .col == 0 )
1594+ win_T * wp ;
1595+ win_T * save_curwin ;
1596+
1597+ FOR_ALL_WINDOWS (wp )
15961598 {
1597- ++ wp -> w_cursor .lnum ;
1598- save_curwin = curwin ;
1599- curwin = wp ;
1600- curbuf = curwin -> w_buffer ;
1601- scroll_cursor_bot (0 , FALSE);
1602- curwin = save_curwin ;
1603- curbuf = curwin -> w_buffer ;
1599+ if (wp -> w_buffer == buffer
1600+ && wp -> w_cursor .lnum == lnum
1601+ && wp -> w_cursor .col == 0 )
1602+ {
1603+ ++ wp -> w_cursor .lnum ;
1604+ save_curwin = curwin ;
1605+ curwin = wp ;
1606+ curbuf = curwin -> w_buffer ;
1607+ scroll_cursor_bot (0 , FALSE);
1608+ curwin = save_curwin ;
1609+ curbuf = curwin -> w_buffer ;
1610+ }
16041611 }
1612+ redraw_buf_later (buffer , VALID );
1613+ channel_need_redraw = TRUE;
16051614 }
1606- redraw_buf_later (buffer , VALID );
1607- channel_need_redraw = TRUE;
16081615 }
16091616 }
16101617 if (callback != NULL )
@@ -1614,8 +1621,6 @@ may_invoke_callback(channel_T *channel, int part)
16141621 invoke_callback (channel , callback , argv );
16151622 }
16161623 }
1617- else if (msg != NULL )
1618- ch_logs (channel , "Dropping message '%s'" , (char * )msg );
16191624 else
16201625 ch_log (channel , "Dropping message" );
16211626
0 commit comments