Странные символы отправляются на ssh-терминал, когда Alt+Tab между приложениями

Вам необходимо захватить имя хоста с помощью второй группы захвата.

напр. используя ваш образец ввода:

$ cat test.log 
2016-05-07T09:07:04.933343+00:00 heroku[router]: status=301 bytes=680 service=2698ms connect=1ms dyno=web.2 fwd="10.29.10.29" at=info host="jamaican.com" request_id=32fc8d88-99f8-4cc2-89f9-284d059eebf8 method=GET path="/blog"

Этот лайнер Perl One -извлекает как метку времени, так и поле имени хоста. Я также немного улучшил регулярное выражение, используя \dдля цифр со счетчиком совпадений для каждой.

$ perl -lne 'print "$1 $2" if (m/(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d+\+\d{2}:\d{2}) ([^ ]+) /)' test.log
2016-05-07T09:07:04.933343+00:00 heroku[router]:

Другой вариант:

$ perl -lne 'print "$1 $2 $3" if (m/(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d+\+\d{2}:\d{2}) ([^[]+)\[([^]]+)\]/)' test.log
2016-05-07T09:07:04.933343+00:00 heroku router

Я предположил, что вам нужно имя хоста локальной машины (Я даже не заметил host="jamaican.com"часть записи журнала ). Вероятно, это не то, что вам нужно, поэтому, если вам нужно имя хоста, заключенное в двойные кавычки -после host=, тогда:

$ perl -lne 'print "$1 $2" if (m/(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d+\+\d{2}:\d{2}).*host="([^"]+)"/)' test.log
2016-05-07T09:07:04.933343+00:00 jamaican.com 

или (намного проще):

$ perl -lne 'print "$1 $2" if (m/(^\S+).*host="([^"]+)"/)' test.log
2016-05-07T09:07:04.933343+00:00 jamaican.com

Или извлеките метку времени, проанализируйте ее с помощью Date::Parseи переформатируйте с помощью Date::Format.

$ perl -MDate::Parse -MDate::Format -lne \
  'if (m/(^\S+).*host="([^"]+)"/) {
     print join(" ", time2str("%Y-%m-%d %R %z",str2time($1)), $2)
   }' test.log
2016-05-07 19:07 +1000 jamaican.com

Обратите внимание, :метка времени была преобразована в местный часовой пояс (для меня, это +1000 или австралийское восточное стандартное время ). time2str()по умолчанию использует местный часовой пояс, но вы можете задать ему третий аргумент (time2str(TEMPLATE, TIME [, ZONE])), чтобы он выдавал время в любом другом поясе.

$ perl -MDate::Parse -MDate::Format -lne   'if (m/(^\S+).*host="([^"]+)"/) {
     print join(" ", time2str("%Y-%m-%d %R %z",str2time($1),"+0"), $2)
   }' test.log
2016-05-07 09:07 +0000 jamaican.com
1
13.01.2020, 01:10
1 ответ

Это терминал, который отправляет экраны focus -in/focus -out xterm. vim устанавливает терминал в режим, который позволяет ему узнать, когда курсор покидает окно (, что он и делает, когда alt -вкладка ).

Вы могли бы предотвратить это, изменив режим, используемый в vim для управления мышью. Проверяя документацию xterm, vim должен был бы отправить определенную управляющую последовательность с 1004параметром (, чтобы указать xterm отправить эти escape-последовательности ), но я не вижу этого в исходном коде vim -. ]. Какой-то другой терминал может делать это как побочный -эффект режима движения мыши -1003(, который vim отправляет):

    if (xterm_mouse_vers > 0)
    {
        if (on) // enable mouse events, use mouse tracking if available
            out_str_nf((char_u *)
               (xterm_mouse_vers > 1
            ? (
#ifdef FEAT_BEVAL_TERM
                bevalterm_ison
                   ? IF_EB("\033[?1003h", ESC_STR "[?1003h") :
#endif
                  IF_EB("\033[?1002h", ESC_STR "[?1002h"))
            : IF_EB("\033[?1000h", ESC_STR "[?1000h")));
        else    // disable mouse events, could probably always send the same
            out_str_nf((char_u *)
                   (xterm_mouse_vers > 1
                ? IF_EB("\033[?1002l", ESC_STR "[?1002l")
                : IF_EB("\033[?1000l", ESC_STR "[?1000l")));
        mouse_ison = on;
    }

Вероятно, вам следует обратиться к руководству пользователя используемого вами терминала, чтобы узнать, какое ожидаемое поведение будет с vim.

2
28.04.2021, 23:25

Теги

Похожие вопросы