Geany: открывать новый экземпляр для каждой рабочей области при открытии файла в этой рабочей области

Мой метод для bash :

# Reset BASH time counter
SECONDS=0
    # 
    # do stuff
    # 
ELAPSED="Elapsed: $(($SECONDS / 3600))hrs $((($SECONDS / 60) % 60))min $(($SECONDS % 60))sec"
6
02.12.2015, 12:40
5 ответов

Используйте этот пакет, чтобы открыть Geany. Это откроет отдельный сокет, специфичный для каждой рабочей области.

Например, в Thunar используйте «открыть в другом приложении» и укажите на этот командный файл.

#!/bin/sh

socket=`xprop -root _NET_CURRENT_DESKTOP`
socket=${socket##* }

if [ "$socket" ]
then
    if [ "$DISPLAY" ]
    then
        socket="${DISPLAY%.*}-$socket"
        socket=${socket#*:}
    else
        socket="NODISPLAY-$socket"
    fi
    exec geany --socket-file "/tmp/geany_socket_$socket" "$@"
else
    exec geany "$@"
fi
6
27.01.2020, 20:25

Перейдите в терминал и введите geany -h, он покажет вам все доступные опции. Среди них -i, --new-instance Не открывайте файлы в запущенном экземпляре, принудительное открытие нового экземпляра - именно то, что вам нужно.

HOW-TO

  1. Найдите то, на что вы нажимаете.

  2. Откройте его в любом текстовом редакторе или найдите способ изменить команду, которую он выполняет. (это может быть сложно, если это, например, пусковая установка в трее).

  3. Измените команду с geany -some_options на geany -some_options -i

--

done.

3
27.01.2020, 20:25

Если вы используете 'File' и 'Open', Geany откроет файл в текущем "основном" экземпляре, т.е. в том экземпляре Geany, который вы используете в данный момент, а не в первом.

0
27.01.2020, 20:25

Комментарий стал слишком длинным, поэтому я публикую его как ответ. У меня возникли проблемы с тем, чтобы ответ Оливье работал, поэтому я подумал, что добавлю более подробные инструкции к его ответу на случай, если у других тоже возникнут проблемы (вся заслуга принадлежит ему, проголосуйте за него вместо/а также за меня ).

Создайте пакетный файл, содержащий

#!/bin/sh

socket=`xprop -root _NET_CURRENT_DESKTOP`
socket=${socket##* }

if [ "$socket" ]
then
    if [ "$DISPLAY" ]
    then
        socket="${DISPLAY%.*}-$socket"
        socket=${socket#*:}
    else
        socket="NODISPLAY-$socket"
    fi
    exec geany --socket-file "/tmp/geany_socket_$socket" "$@"
else
    exec geany "$@"
fi

Поместите пакетный файл в каталог, включенный в PATH (см.https://stackoverflow.com/questions/14650070/how-to-execute-bash-script-from-any-location). Я предполагаю, что вы называете командный файл wgeany, в противном случае замените его в следующих инструкциях на то, что вы назвали.

Теперь мы хотим установить это как нашу программу по умолчанию для открытия текстовых файлов. К сожалению, его нет в списке, и, по крайней мере, в моей версии вы, к сожалению, не можете сделать собственный выбор.

Мы можем решить эту проблему, перейдя к ~/.local/share/applicationsили /usr/share/applications(, если один из них не существует/не работает/у вас нет разрешения для него, попробуйте другой )и создайте текстовый файл с именем wgeany.desktop, содержащий:

[Desktop Entry]
Name=wgeany
Comment=wgeany
Exec=wgeany %f
Type=Application
StartupNotify=false
Terminal=false
Categories=TextTools;
Name[en_US]=wgeany

Также вы можете включить строку, указывающую на правильный значок geany (Icon=path/icon.png), но я не удосужился найти ее. Сохраните файл, и теперь ваш командный файл должен появиться в диалоговом окне открытия с помощью. (Вы можете установить его в качестве приложения по умолчанию для типа файла, например.txt, перейдя в свойства файла (этого типа ), затем на вкладку «Открыть с помощью» и установите wgeany в качестве приложения по умолчанию. там.


Спасибо также MaxWilliams, который помог мне решить эту проблему.

1
27.01.2020, 20:25

Я хотел бы поделиться более полным -полноценным скриптом, который я составил для запуска всех моих процессов Geany, вдохновленный всеми этими ответами. Оказывается, есть много «подводных камней», пытающихся правильно обрабатывать все случаи/параметры.

https://gist.github.com/gkatev/f477f7f4bb0cfb2151cbfb7d6de0a511

Основные характеристики:

  • Открыть в окне в той же рабочей области или открыть новое окно
  • Открыть в последнем открытом окне Geany, если открыто несколько

Конфигурация:

  • Установить как.local/bin/geany или аналогичный.
  • Возможно, вам придется изменить $GEANY _PATH.
  • Проверить скрипт на наличие зависимостей (wmctrl, xprop, ps, ss, GNU getopt)

Вот текущая версия скрипта, но обязательно проверяйте суть выше на наличие обновлений.

#!/bin/bash

GEANY_PATH="/usr/bin/geany"

if [ -z "$XDG_RUNTIME_DIR" ]; then
    [ -z "$XDG_CACHE_HOME" ] &&
        XDG_CACHE_HOME="$HOME/.cache"

    XDG_RUNTIME_DIR="$XDG_CACHE_HOME"
fi

main() {
    OPTS=$(getopt -o hc:gPil:mnprstvV -l help,help-all,help-gtk,column:,config:,ft-names,generate-tags,no-preprocessing,new-instance,socket-file:,list-documents,line:,no-msgwin,no-ctags,no-plugins,print-prefix,read-only,no-session,no-terminal,vte-lib:,verbose,version,display: -n geanywl -- "$@")
    
    eval set -- "$OPTS"
    
    SKIP=
    NEW_INSTANCE=
    PARAMS=()
    
    # https://gist.github.com/cosimo/3760587
    while true; do
        ARG1="$1"
        ARG2=
        
        case "$1" in
            -h | --help | --help-all | --help-gtk) SKIP=true; shift ;;
            --column ) ARG2="$2"; shift 2 ;;
            -c | --config ) ARG2="$2"; shift 2 ;;
            --ft-names ) SKIP=true; shift ;;
            -g | --generates-tags ) SKIP=true; shift ;;
            -P | --no-preprocessing ) shift ;;
            -i | --new-instance ) NEW_INSTANCE=true; ARG1=""; shift ;;
            --socket-file ) SKIP=true; ARG2="$2"; shift 2 ;;
            --list-documents ) SKIP=true; shift ;;
            -l | --line ) ARG2="$2"; shift 2 ;;
            -m | --no-msgwin ) shift ;;
            -n | --no-ctags ) shift ;;
            -p | --no-plugins ) shift ;;
            --print-prefix ) SKIP=true; shift ;;
            -r | --read-only ) shift ;;
            -s | --no-session ) shift ;;
            -t | --no-terminal ) shift ;;
            --vte-lib ) ARG2="$2"; shift 2 ;;
            -v | --verbose ) shift ;;
            -V | --version ) SKIP=true; shift ;;
            --display ) ARG2="$2"; shift 2 ;;
            -- ) shift; break ;;
            * ) break ;;
        esac
        
        [ "$ARG1" ] && PARAMS+=("$ARG1")
        [ "$ARG2" ] && PARAMS+=("$ARG2")
    done
    
    FILES="$@"
    
    [ "$FILES" ] && PARAMS+=("$FILES")
    
    if [ "$SKIP" = true ]; then
        exec_geany
    fi
    
    if [ ! "$FILES" ]; then
        NEW_INSTANCE=true
    fi
    
    # If a new instance is not requested, look for existing instances
    if [ ! "$NEW_INSTANCE" = true ]; then
        
        # Check for instances in the current workspace, keep the pids
        # And iterate the resulting pids. This list may contain some
        #  false positives. The windows are also sorted according to
        #  which of them was focused more recently
        
        while read -r pid; do
            
            # Verify the process user is the same as the current one
            # Verify the pid corresponds to a process named 'geany'
            [ "$(ps -o uid="" $pid)" -ne "$UID" ] && continue
            [ $(ps -q $pid -o comm="") != "geany" ] && continue
            
            # Get listening unix domain sockets from the PID
            pinfo=$(ss -lpxH | grep "pid=$pid" | grep geany_socket)
            
            # If sockets were found, launch Geany
            if [ -n "$pinfo" ]; then
                socket=$(echo "$pinfo" | head -n 1 |
                    grep -Po "$XDG_RUNTIME_DIR/geany/geany_socket\.[0-9a-fA-F]+")
                
                exec_geany "$socket"
            fi
        done < <(wmctrl -lp | grep '0x[0-9a-fA-F]\+ \+'$(wmctrl -d | grep '*' \
            | sed -r 's/([0-9]+).*/\1/g') | grep Geany \
            | sort_recently_focused \
            | sed -r 's/0x[0-9a-fA-F]+ +[0-9]+ +([0-9]+).*/\1/g')
    fi
    
    for (( i=0; ; i++ )); do
        socket="$HOME/.config/geany/geany_socket_${HOSTNAME}__$i"
        
        # Get UID of owner
        owner=$(stat -c "%u" "$socket" 2>/dev/null)
        
        # If the owner var is empty, the file does not exist
        if [ -z "$owner" ]; then
            exec_geany "$socket"
        fi
        
        # If the user does not own the file, we cannot examine it
        # If the -e check fails, while the stat  earlier succeeded,
        #  it means the the file is broken symbolic link
        if [[ "$owner" -eq "$UID" ]] && [ ! -e "$socket" ]; then
            exec_geany "$socket"
        fi
    done
}

exec_geany() {
    if [ "$1" ]; then
        exec "$GEANY_PATH" --socket-file "$1" "${PARAMS[@]}"
    else
        exec "$GEANY_PATH" "${PARAMS[@]}"
    fi
}

sort_recently_focused() {
    recent=$(xprop -root | grep "^_NET_CLIENT_LIST_STACKING" | tr "," " ")
    recent=(${recent##*#})
    
    wins=()
    ids=()
    
    while read -r line; do
        wins+=("$line")
        ids+=($(grep -o '0x[0-9a-fA-F]\+' <<< "$line"))
    done
    
    for (( i=${#recent[@]}-1 ; i>=0 ; i-- )); do
        for (( j=0; j<${#ids[@]}; j++ )); do
            if [ $((ids[j])) = $((recent[i])) ]; then
                echo "${wins[j]}"
            fi
        done
    done
}

main "$@"
1
02.02.2021, 09:18

Теги

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