Есть ли плагин для терминала, который позволяет обнаруживать и открывать файлы?

3

Я ищу терминальный плагин / расширение, которое позволит мне обнаруживать путь к файлам в терминальном выводе и открывать их в текстовом редакторе, нажимая на них. Идеальное решение откроет файл в данной строке.

/home/dell/pcl/2d/include/pcl/2d/impl/keypoint.hpp:233: warning: no uniquely matching class member found for void pcl::keypoint::imageElementMultiply(ImageType &output, ImageType &input1, ImageType &input2)

В приведенном выше примере я мог бы нажать /home/dell/pcl/2d/include/pcl/2d/impl/keypoint.hpp:233 , и я бы открыл файл с Gedit (или что-то еще) в строке 233.

    
задан Victor Lamoine 15.04.2014 в 10:22
источник

2 ответа

3

Хотя мне, возможно, нужен такой вариант сам. AFAIK, gnome-terminal не поддерживает плагины.

Я использую Ubuntu 14.04, gnome-terminal 3.6.2. Я не тестировал достаточно времени, ожидал ошибок.

  1. Загрузить источник & amp; строить зависимости

    sudo apt-get build-dep gnome-terminal
    apt-get source gnome-terminal
    
  2. Добавить поддержку путей

    src/terminal-screen.h , добавить FLAVOR_DEFAULT_TO_FILE тип перечисления для путей к файлу

    typedef enum {
      FLAVOR_AS_IS,
      FLAVOR_DEFAULT_TO_HTTP,
      FLAVOR_VOIP_CALL,
      FLAVOR_EMAIL,
      FLAVOR_LP,
      FLAVOR_DEFAULT_TO_FILE
    } TerminalURLFlavour;
    

    src/terminal-screen.c , добавьте регулярное выражение пути (это не идеально, может потребоваться некоторая настройка)

    static const TerminalRegexPattern url_regex_patterns[] = {
      { SCHEME "//(?:" USERPASS "\@)?" HOST PORT URLPATH, FLAVOR_AS_IS, G_REGEX_CASELESS },
      { "(?:www|ftp)" HOSTCHARS_CLASS "*\." HOST PORT URLPATH , FLAVOR_DEFAULT_TO_HTTP, G_REGEX_CASELESS  },
      { "(?:callto:|h323:|sip:)" USERCHARS_CLASS "[" USERCHARS ".]*(?:" PORT "/[a-z0-9]+)?\@" HOST, FLAVOR_VOIP_CALL, G_REGEX_CASELESS  },
      { "(?:mailto:)?" USERCHARS_CLASS "[" USERCHARS ".]*\@" HOSTCHARS_CLASS "+\." HOST, FLAVOR_EMAIL, G_REGEX_CASELESS  },
      { "(?:news:|man:|info:)[[:alnum:]\Q^_{|}~!\"#$%&'()*+,./;:=?'\E]+", FLAVOR_AS_IS, G_REGEX_CASELESS  },
      { "(?:lp: #)[[:digit:]]+", FLAVOR_LP, G_REGEX_CASELESS  },
      { "((~/)|(\.\./)|(\./)|(/))+[^\n\t\r\v\0 !$'&*()+:]+[^\n\t\r\v\0 !$'&*()+:?.,;\"'\]\[<>#{}(]", FLAVOR_DEFAULT_TO_FILE, G_REGEX_CASELESS },
    };
    

    src/terminal-util.c , составьте правильный URL, добавив префикс file://

      switch (flavor)
        {
        case FLAVOR_DEFAULT_TO_HTTP:
          uri = g_strdup_printf ("http://%s", orig_url);
          break;
        case FLAVOR_EMAIL:
          if (g_ascii_strncasecmp ("mailto:", orig_url, 7) != 0)
        uri = g_strdup_printf ("mailto:%s", orig_url);
          else
        uri = g_strdup (orig_url);
          break;
        case FLAVOR_VOIP_CALL:
        case FLAVOR_AS_IS:
          uri = g_strdup (orig_url);
          break;
        case FLAVOR_LP:
          uri = terminal_util_get_lp_url (orig_url);
          break;
        case FLAVOR_DEFAULT_TO_FILE:
          uri = g_strdup_printf ("file://%s", orig_url);
          break;    
        default:
          uri = NULL;
          g_assert_not_reached ();
        }
    

    src/terminal-window.c , разрешить ~ и относительные пути ( ./ & amp; ../ )

    static void
    popup_open_url_callback (GtkAction *action,
                             TerminalWindow *window)
    {
      TerminalWindowPrivate *priv = window->priv;
      TerminalScreenPopupInfo *info = priv->popup_info;
    
      if (info == NULL)
        return;
    
      if (info->flavour==FLAVOR_DEFAULT_TO_FILE){
        if (info->string[0]=='~') {
          char* current_dir_full=terminal_util_resolve_relative_path (g_get_home_dir(), &(info->string)[2]);
          terminal_util_open_url (GTK_WIDGET (window), current_dir_full, info->flavour,
                                gtk_get_current_event_time ());
        } else {
          char* current_dir=terminal_screen_get_current_dir_with_fallback (info->screen);
          char* current_dir_full=terminal_util_resolve_relative_path (current_dir, info->string);
          terminal_util_open_url (GTK_WIDGET (window), current_dir_full, info->flavour,
                                gtk_get_current_event_time ());
        }
      }
      else {
        terminal_util_open_url (GTK_WIDGET (window), info->string, info->flavour,
                              gtk_get_current_event_time ());
      }
    }
    

    ...

      show_link = info->string != NULL && (info->flavour == FLAVOR_AS_IS ||
                                           info->flavour == FLAVOR_DEFAULT_TO_HTTP ||
                                           info->flavour == FLAVOR_LP ||
                                           info->flavour == FLAVOR_DEFAULT_TO_FILE );
    

    ...

    static gboolean
    screen_match_clicked_cb (TerminalScreen *screen,
                             const char *match,
                             int flavour,
                             guint state,
                             TerminalWindow *window)
    {
      TerminalWindowPrivate *priv = window->priv;
    
      if (screen != priv->active_screen)
        return FALSE;
    
      gtk_widget_grab_focus (GTK_WIDGET (screen));
    
      if (flavour==FLAVOR_DEFAULT_TO_FILE){
        if (match[0]=='~') {
          char* current_dir_full=terminal_util_resolve_relative_path (g_get_home_dir(), &(match)[2]);
          terminal_util_open_url (GTK_WIDGET (window), current_dir_full, flavour,
                                gtk_get_current_event_time ());
        } else {
          char* current_dir=terminal_screen_get_current_dir_with_fallback (screen);
          char* current_dir_full=terminal_util_resolve_relative_path (current_dir, match);
          terminal_util_open_url (GTK_WIDGET (window), current_dir_full, flavour,
                                gtk_get_current_event_time ());
        }
      }
      else {
        terminal_util_open_url (GTK_WIDGET (window), match, flavour,
                                gtk_get_current_event_time ());
      }
    
      return TRUE;
    }
    
  3. Build & amp; установить

    cd gnome-terminal-3.6.2/
    ./configure
    make
    make install
    
ответ дан user.dz 25.10.2014 в 02:32
источник
2

Только ссылки могут быть открыты с терминала (щелкните правой кнопкой мыши - > Open Link), в основном вам нужно будет префикс пути к файлу с полным URI:

/home/dell/pcl/2d/include/pcl/2d/impl/keypoint.hpp

(просто добавьте префикс file:// ):

file:///home/dell/pcl/2d/include/pcl/2d/impl/keypoint.hpp

Примечание. Эта команда даст вам абсолютный путь URI к файлу:

echo file://$(readlink -f <your file>)

Лично gedit /home/dell/pcl/2d/include/pcl/2d/impl/keypoint.hpp , вероятно, лучший вариант.

    
ответ дан Sylvain Pineau 15.04.2014 в 11:15