#!/usr/bin/env perl
use utf8;
# Escape (most of) control characters when pasting, so bracketed-paste becomes
# more reliable. Escaped characters are converted to CTRL-V and three decimal
# digits, as it is recognised by vim.
#
# Note that by default ^V is control character for lnext which escapes the
# meaning of next character, should it also be control character. This is
# mostly turned off by anything that wants to receive CTRL-V keypress though.
sub on_tt_paste {
my ($term, $paste) = @_;
# CTRL-V needs to be first to be escaped
$paste =~ s/\x16/\x16022/g; # SYN (synchronous idle)
$paste =~ s/\x00/\x16000/g; # NUL '\0'
$paste =~ s/\x01/\x16001/g; # SOH (start of heading)
$paste =~ s/\x02/\x16002/g; # STX (start of text)
$paste =~ s/\x03/\x16003/g; # ETX (end of text)
$paste =~ s/\x04/\x16004/g; # EOT (end of transmission)
$paste =~ s/\x05/\x16005/g; # ENQ (enquiry)
$paste =~ s/\x06/\x16006/g; # ACK (acknowledge)
$paste =~ s/\x07/\x16007/g; # BEL '\a' (bell)
$paste =~ s/\x08/\x16008/g; # BS '\b' (backspace)
$paste =~ s/\x0B/\x16011/g; # VT '\v' (vertical tab)
$paste =~ s/\x0C/\x16012/g; # FF '\f' (form feed)
$paste =~ s/\x0E/\x16014/g; # SO (shift out)
$paste =~ s/\x0F/\x16015/g; # SI (shift in)
$paste =~ s/\x10/\x16016/g; # DLE (data link escape)
$paste =~ s/\x11/\x16017/g; # DC1 (device control 1)
$paste =~ s/\x12/\x16018/g; # DC2 (device control 2)
$paste =~ s/\x13/\x16019/g; # DC3 (device control 3)
$paste =~ s/\x14/\x16020/g; # DC4 (device control 4)
$paste =~ s/\x15/\x16021/g; # NAK (negative ack.)
$paste =~ s/\x17/\x16023/g; # ETB (end of trans. blk)
$paste =~ s/\x18/\x16024/g; # CAN (cancel)
$paste =~ s/\x19/\x16025/g; # EM (end of medium)
$paste =~ s/\x1A/\x16026/g; # SUB (substitute)
$paste =~ s/\x1B/\x16027/g; # ESC (escape)
$paste =~ s/\x1C/\x16028/g; # FS (file separator)
$paste =~ s/\x1D/\x16029/g; # GS (group separator)
$paste =~ s/\x1E/\x16030/g; # RS (record separator)
$paste =~ s/\x1F/\x16031/g; # US (unit separator)
# Allowed special characters:
# $paste =~ s/\x09/\x16009/g; # HT '\t' (horizontal tab)
# $paste =~ s/\x0D/\x16013/g; # CR '\r' (carriage ret)
# $paste =~ s/\x0A/\x16010/g; # LF '\n' (new line)
# $paste =~ s/\x20/\x16032/g; # SPACE
$term->tt_paste($paste);
1
}