Исключения с xdg-open при запуске программ в фоновом режиме

Исключения с xdg-open при запуске программ в фоновом режиме

До сих пор я использовал псевдоним xdg-open.

alias o='xdg-open $@ 2> /dev/null'

Поведение xdg-open по умолчанию — запуск процесса на переднем плане текущего выбранного терминала, поэтому, например, открытие файлов, связанных с vim (через xdg-mime), приведет к открытию редактора в терминале, из которого была введена команда.

Проблема заключалась в том, что хотя открытие программ на основе терминала, таких как Mutt и Vim, работало правильно, файлы .html, например, открывались в браузере по умолчанию, в то время как окно терминала становилось непригодным для использования из-за процесса, работающего на переднем плане и ожидающего закрытия файла.

Я создал функцию ниже, чтобы иметь возможность открывать файлы из текущего терминала и продолжать работать в том же окне.

function o(){ xdg-open $@ 2> /dev/null & }

Это решило мою проблему, но теперь при открытии файлов, например, связанных с vim, отображается PID, и мне приходится вводить $ fg, чтобы получить доступ к редактору.

Я пытался редактировать запись vim.desktop так, чтобы она хотя бы запускалась в новом терминале, но я думаю, что это довольно плохой обходной путь. Может ли кто-нибудь подтолкнуть меня к тому, как правильно решить эту проблему? Заранее спасибо.

решение1

xdg-openпредназначен для запуска программы просмотра и ожидания ее завершения. Он не предназначен для работы в фоновом режиме, и, как вы уже поняли, он вряд ли будет работать очень хорошо. У вас была бы та же проблема со старой системой mailcap, которая также запускает программы в фоновом режиме.

Можно изменить функцию оболочки так, чтобы она всегда открывалась в новом терминале, но это, скорее всего, приведет к тому, что у вас будет много бесполезных терминалов. Что вы можете сделать, чтобы сделать свою функцию более полезной и работать так, как вам нужно, это сделать что-то вроде этого:

o () {
    for i in "$@"
    do
        mimetype=$(xdg-mime query filetype "$i")
        prog=$(xdg-mime query default "$mimetype")
        if grep -qs Terminal=true "/usr/share/applications/$prog"
        then
            xdg-open "$i"
        else
            xdg-open "$i" >/dev/null 2>/dev/null &
        fi
    done
}

Это посмотрит, требуется ли вашей программе терминал, и если да, то вызовет его на переднем плане; в противном случае он вызовет его на заднем плане. Однако в настоящее время это не обрабатывает URL-адреса или пользовательские приложения, и вам нужно будет отредактировать его соответствующим образом, чтобы ваша система могла это обрабатывать. Тем не менее, это отправная точка, на которой вы можете строить.

Связанный контент