Вопрос Как скопировать путь к текущему открытому файлу в gedit в буфер обмена?


Я пытаюсь написать пользовательскую команду в Gedit, которая копирует текущий и активный путь документа (как до родительского dir и до файла) в буфер обмена, так как я не мог найти никаких gedit-плагинов или инструментов, которые могут это сделать.

Я еще не знаю, с чего начать, и не имеет хороших ссылок, но я знаю, что мне приходится писать сценарии в сценарии bash.

Я искал внешнюю команду для копирования любой строки в буфер обмена с терминала (так как он также запускает скрипт bash), но в ответах предлагается использовать инструмент «xclip», который я пробовал и разочарован, поскольку любая строка при копировании с xclip может быть вставлена с командой "xclip -o". Мне нужна скопированная строка для вставки с помощью Ctrl-V, поэтому я могу открыть путь в диспетчере файлов (nautilus).

Любая помощь / предложение приветствуются.


3
2017-08-13 18:08


происхождения


использование xclip -selection CLIPBOARD для установки буфера обмена, вставленного ctrl-v. - meuh
Написал мой ответ. Пожалуйста, дайте мне знать, если вы справитесь. - Jacob Vlijm
Привет Вивек, полностью переписал ответ и объединил два сценария. - Jacob Vlijm
Вы пробовали это? github.com/gfxmonk/gedit-plugins - A.B.


ответы:


Сценарий для копирования пути файла, открытого в gedit

С окном gedit впереди, маленький скрипт ниже выводит путь из (gedit), и копирует его в буфер обмена.

Сценарий имеет два варианта:

  1. Только скопируйте дорожка в каталог файла, запустив скрипт с опцией

    -path
    

    или

  2. Скопируйте путь в том числе имя файла, запуск скрипта с опцией

    -file
    

Сценарий

#!/usr/bin/env python3
import subprocess
import sys

name = subprocess.check_output(["xdotool", "getactivewindow", "getwindowname"]).decode("utf-8").strip()
if all(["(" in name, ")" in name]):
    path = name[name.find("(")+1:name.find(")")]
    if sys.argv[1] == "-file":
        fname = name[:name.find("(")]
    elif sys.argv[1] == "-path":
        fname = ""
    command = "echo "+'"'+path+"/"+fname+'"'+" | xclip -selection clipboard"
    subprocess.Popen(["/bin/bash", "-c", command])

Как использовать

  1. Установите оба xdotool а также xclip:

    sudo apt-get install xdotool xclip
    
  2. Скопируйте сценарий в пустой файл, сохраните его как get_path.py

  3. Тест запустить сценарий:

    • открыть существующий gedit файл
    • откройте окно терминала, запустите команду:

      sleep 5 && python3 /path/to/get_path.py -file
      

      немедленно переключитесь на gedit окна, чтобы последняя команда команды была запущена с помощью gedit окно впереди.

    • Нажмите Ctrl+В где-то вставить только что скопированный путь.
  4. Если все работает нормально, вы можете сделать варианты доступными двумя способами:

    1. Создайте две сочетания клавиш для обеих опций: выберите: «Системные настройки»> «Клавиатура»> «Ярлыки»> «Пользовательские ярлыки». Нажмите «+» и добавьте обе команды к двум разным ярлыкам.
    2. Сделайте оба варианта доступными в gedit Ракета-носитель:

      enter image description here

      Скопируйте содержимое ниже в пустой файл, сохраните его как gedit.desktop в ~/.local/share/applications

      [Desktop Entry]
      Name=gedit
      GenericName=Text Editor
      Comment=Edit text files
      Exec=gedit %U
      Terminal=false
      Type=Application
      StartupNotify=true
      MimeType=text/plain;
      Icon=accessories-text-editor
      Categories=GNOME;GTK;Utility;TextEditor;
      X-GNOME-DocPath=gedit/gedit.xml
      X-GNOME-FullName=Text Editor
      X-GNOME-Bugzilla-Bugzilla=GNOME
      X-GNOME-Bugzilla-Product=gedit
      X-GNOME-Bugzilla-Component=general
      X-GNOME-Bugzilla-Version=3.10.4
      X-GNOME-Bugzilla-ExtraInfoScript=/usr/share/gedit/gedit-bugreport
      Actions=Window;Document;divider1;Copy current file's directory;Copy path+file name;
      
      Keywords=Text;Editor;Plaintext;Write;
      X-Ubuntu-Gettext-Domain=gedit
      
      [Desktop Action Window]
      Name=Open a New Window
      Exec=gedit --new-window
      OnlyShowIn=Unity;
      
      [Desktop Action Document]
      Name=Open a New Document
      Exec=gedit --new-document
      OnlyShowIn=Unity;
      
      [Desktop Action Copy current file's directory]
      Name=Copy current directory
      Exec=python3 /path/to/get_path.py -path
      OnlyShowIn=Unity;
      
      [Desktop Action divider1]
      Name=.....................................
      OnlyShowIn=Unity;
      
      [Desktop Action Copy path+file name]
      Name=Copy current directory, include file name
      Exec=python3 /path/to/get_path.py -file
      OnlyShowIn=Unity;
      

    В обеих строках:

    Exec=python3 /path/to/get_path.py -path
    

    а также

    Exec=python3 /path/to/get_path.py -file
    

    замещать /path/to/get_path.py по реальному пути к скрипту.

    Выйдите из системы и вернитесь, чтобы сделать Unity «переключением» на новый, локальный .desktop файл.

объяснение

В имени окна gedit путь отображается между ( а также ), Сценарий просто видит самое ближайшее окно с помощью xdotool, затем читает путь между этими двумя символами.

Заметки

Поскольку путь читается текстовым способом, сценарий будет терпеть неудачу, если имя файла включает другие () персонажи.

Примеры

Со следующим окном впереди:

enter image description here

первый вариант скопирует в буфер обмена путь к файлу:

~/Bureaublad

в то время как второй вариант включает сам файл:

~/Bureaublad/some test file.txt

Как вы можете видеть, пробелы позаботятся :).


5
2017-08-13 18:49



Спасибо за ваши усилия и предложение Джейкоба, я попробую в своем gedit (в офисной системе) и дам вам знать :) - Vicky Dev
Привет Джейкоб, я попробовал свой код и создал ярлык после установки xdotool (xclip уже установлен), но он не скопировал местоположение документа в основной буфер обмена :(. Могу ли я запустить этот код, создав внешний инструмент (команду) в Gedit ? Пожалуйста, объясните, как это сделать. - Vicky Dev
@VIVEKSHAH вы могли бы открыть документ в gedit (сохраняется на диске) и открыть терминал. Затем запустите команду: sleep 5 && python3 /path/to/get_path.py, немедленно переключаясь в окно gedit (так что gedit окно впереди, как только скрипт запускается)? Затем, минуя пять секунд, нажмите Ctrl + V где-нибудь (не в терминале :)). Возможно, в выбранной комбинации клавиш есть ошибка. Скрипт (оба из них) запускаются без единой ошибки. - Jacob Vlijm
Да о клавише быстрого доступа Я думаю, что я создал конфликтную комбинацию клавиш. И я запустил ваш файл python в терминале, но можете ли вы рассказать мне, как я могу сделать этот запуск как элемент меню Gedit, например Edit> «Copy document path» или в меню «external tool»? - Vicky Dev
Включение в структуру меню gedit это совершенно другой вид спорта, который я не могу играть :). Тем не менее, вы можете сделать его доступным как shorcut в gedit launcher. Это будет вариант? Кстати, вы получили его на работу? - Jacob Vlijm


После некоторого поиска документации я смог найти решение, чтобы ответить на мой вопрос.

Откройте Gedit и перейдите в «Инструменты» >> «Управление внешними инструментами» и создайте новый инструмент.

Добавьте следующую команду, как показано ниже:

echo -n $GEDIT_CURRENT_DOCUMENT_URI | xclip -sel clip;exit;

Закройте его, а затем перезапустите Gedit (только для подтверждения).

Откройте любой документ, а затем откройте «Инструменты >> Внешние инструменты» и затем щелкните только что созданную метку команды. Путь будет в вашем буфере обмена.


3
2017-08-24 08:00



+1, Очень аккуратно! Вам все еще нужно мое обновление? - Jacob Vlijm
Да, я также хотел бы изучить python. Я также изучаю его у себя дома, поэтому немного понимания сложного кодирования было бы хорошо, только если вы не возражаете. - Vicky Dev


сравнить с $GEDIT_CURRENT_DOCUMENT_URI
переменная $GEDIT_CURRENT_DOCUMENT_PATH  кажется мне лучше:

  • без file:// префикс
  • отображать многобайтовые символы (не urlencode)

ссылка:
https://wiki.gnome.org/Apps/Gedit/Plugins/ExternalTools#Available_Environment_Variables https://wiki.gnome.org/Apps/Gedit/ExternalToolsPluginCommands


0
2017-09-26 18:36