Gnome-Terminal 또는 새 탭을 여는 탭 가능한 쉘에 명령이 있습니까?


11

키보드 단축키를 찾지 않고 다음 명령을 원합니다.

  • 새창
  • 새로운 탭
  • 현재 탭 또는 창 닫기
  • 쉘 창 최대화
  • 쉘 윈도우 최소화
  • 쉘을 다른 작업 공간으로 이동
  • 스위치 탭

그리고 기본적으로 이와 같은 것. 생각해 내다; 나는 지름길을 원하지 않고 실제 명령을 원한다. 그 이유는 별칭 기능을 활용할 수 있기 때문입니다.


1
파이썬은 괜찮습니까?
Sergiy Kolodyazhnyy

4
"현재 탭 닫기"–이 명령의 이름은 "exit"입니다. : D
egmont

"바로 가기를 원하지 않습니다 ...] 별칭 기능을 사용할 수 있습니다"– 이에 대해 자세히 설명해 주시겠습니까? 잘 알려진 바로 가기 대신 원하는 장점은 무엇입니까? 바로 가기의 문제점 또는 누락 된 기능은 무엇입니까? 나는 그들이 당신이 찾고있는 것에 대한 올바른 접근법이라고 생각합니다.
egmont

@egmont 나는 Vim Addict입니다.
Akiva

예를 들어 Maximize의 경우 모든 상태 (예 : 브라우저, 이미지 편집기, 워드 프로세서 등)에서 모든 종류의 창 (브라우저, 이미지 편집기, 워드 프로세서 등)에서 작동하는 창 관리자 단축키를 사용하는 대신 d 터미널에서 작동하고 다른 앱에서는 작동하지 않는 명령을 선호하며 내부에서 명령을 실행하지 않는 경우 (기본 쉘 제외). 아뇨, 죄송합니다,이 아이디어는 여전히 제게 이해가되지 않습니다 :(
egmont

답변:


14

최소한 기본 명령으로는 Gnome-Terminal에서 기본적으로이 작업을 수행 할 수 없습니다.

그러나이를 수행 할 수있는 바로 가기 키를 호출하는 스크립트를 작성할 수 있습니다. 다음이 필요 xdotool합니다.sudo apt install xdotool

  • 새 창은 다음과 함께 새로운 터미널 창을 실행 nw
    우리는 단지이 작업을 수행 할 수 있습니다 gnome-terminal.
    추가.bashrc :

    echo "alias nw=gnome-terminal" >> ~/.bashrc
  • 새 탭은 다음과 함께 새 탭을 실행 nt
    우리는이 작업을 수행 할 수 있습니다 xdotool getactivewindow $(xdotool key ctrl+shift+t)
    에 추가.bashrc :

    echo "alias nt='xdotool getactivewindow $(xdotool key ctrl+shift+t)'" >> .bashrc
  • 탭 닫기 : 현재 탭 또는 창을 ct
    xdotool다시 한 번 xdotool getactivewindow $(xdotool key ctrl+shift+w)
    클릭하여.bashrc 닫 습니다. 추가 :

    echo "alias ct='xdotool getactivewindow $(xdotool key ctrl+shift+w)'" >> .bashrc
  • 최대화 : 다음을maw
    사용 하여 전체 창을 최대화하십시오 .wmctrlwmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz
    .bashrc

    echo "alias maw='wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz'" >> .bashrc
  • 창 최소화 : miw
    를 사용 하여 전체 창을 최소화합니다 . xdotool다시 사용할 수 있습니다 : xdotool windowminimize $(xdotool getactivewindow)
    추가.bashrc :

    echo "alias miw='xdotool windowminimize $(xdotool getactivewindow)'" >> .bashrc
  • 작업 공간으로 이동 :을 사용하여 창을 다른 작업 공간으로 이동 mtw <id>
    이것은 쉘 스크립팅에서 거의 가능 하지 않으며 개인적인 경험을 넘어서는 것입니다. 실제로 현재 작동하기 때문에 Serg의 스크립트를이 목적으로 사용하는 것이 좋습니다. 아, Compiz의 장점.


7

소개

이 답변에 제시된 스크립트를 통해 사용자는 하나의 명령과 옵션 목록을 통해 터미널 창을 제어 할 수 있습니다. 사용이 간편하고 키 바인딩이 비슷한 터미널 에뮬레이터와 호환됩니다 gnome-terminal. 다른 터미널에서도 이동 옵션을 사용할 수 있지만 해당 터미널에서는 탭 열기가 보장되지 않습니다.

이 스크립트는 탭 열기, 창 열기, 작업 공간 아래로 이동, 오른쪽 작업 공간, 정수로 참조되는 특정 작업 공간, 창 최소화, 최대화 및 최대화 해제를 다룹니다. 스크립트가 다루지 않는 유일한 것은 각 쉘 / 터미널 에뮬레이터에 이미 명령이 exit있거나 CtrlD단축키 를 통해 탭 / 창을 닫는 것 입니다.

!!! 참고 : xdotool작업 공간 전환 및 탭 열기 가 필요 합니다. 를 통해 설치하십시오 sudo apt-get install xdotool. 추가 패키지를 설치하지 않으려면 작업 영역과 탭 전환 이 작동하지 않지만 다른 옵션은 작동 한다는 점에 유의하십시오 .

용법:

모든 인수 windowctrl.py는 선택 사항이므로 별도로 또는 잠재적으로 함께 사용할 수 있습니다. -h옵션으로 표시됩니다 .

$ ./windowctrl.py -h                                                                               
usage: windowctrl.py [-h] [-w] [-t] [-m] [-M] [-u] [-v VIEWPORT] [-r] [-d]

Copyright 2016. Sergiy Kolodyazhnyy.

    Window control for terminal emulators. Originally written
    for gnome-terminal under Ubuntu with Unity desktop but can 
    be used with any other terminal emulator that conforms to 
    gnome-terminal keybindings. It can potentially be used for 
    controlling other windows as well via binding this script
    to a keyboard shortcut.

    Note that --viewport and --tab options require xdotool to be
    installed on the system. If you don't have it installed, you 
    can still use the other options. xdotool can be installed via
    sudo apt-get install xdotool.


optional arguments:
  -h, --help            show this help message and exit
  -w, --window          spawns new window
  -t, --tab             spawns new tab
  -m, --minimize        minimizes current window
  -M, --maximize        maximizes window
  -u, --unmaximize      unmaximizes window
  -v VIEWPORT, --viewport VIEWPORT
                        send window to workspace number
  -r, --right           send window to workspace right
  -d, --down            send window to workspace down

스크립트 소스 코드 :

스크립트 소스 코드는 여기뿐만 아니라 GitHub에서도 사용할 수 있습니다. 최신 변경 사항은 여기가 아닌 GitHub에 포함될 수 있으므로 최신 버전을 확인하는 것이 좋습니다. 버그 리포트도 게시하는 것이 좋습니다.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Program name: windowctrl.py
Author: Sergiy Kolodyazhnyy
Date:  Sept 18, 2016
Written for: http://askubuntu.com/q/826310/295286
Tested on Ubuntu 16.04 LTS
"""
from __future__ import print_function
import gi
gi.require_version('Gdk', '3.0')
from gi.repository import Gio,Gdk
import sys
import dbus
import subprocess
import argparse

def gsettings_get(schema,path,key):
    """Get value of gsettings schema"""
    if path is None:
        gsettings = Gio.Settings.new(schema)
    else:
        gsettings = Gio.Settings.new_with_path(schema,path)
    return gsettings.get_value(key)

def run_cmd(cmdlist):
    """ Reusable function for running shell commands"""
    try:
        stdout = subprocess.check_output(cmdlist)
    except subprocess.CalledProcessError:
        print(">>> subprocess:",cmdlist)
        sys.exit(1)
    else:
        if stdout:
            return stdout

def get_dbus(bus_type,obj,path,interface,method,arg):
    # Reusable function for accessing dbus
    # This basically works the same as 
    # dbus-send or qdbus. Just give it
    # all the info, and it will spit out output
    if bus_type == "session":
        bus = dbus.SessionBus() 
    if bus_type == "system":
        bus = dbus.SystemBus()
    proxy = bus.get_object(obj,path)
    method = proxy.get_dbus_method(method,interface)
    if arg:
        return method(arg)
    else:
        return method() 

def new_window():
    screen = Gdk.Screen.get_default()
    active_xid = int(screen.get_active_window().get_xid())
    app_path = get_dbus( 'session',
                         'org.ayatana.bamf',
                         '/org/ayatana/bamf/matcher',
                         'org.ayatana.bamf.matcher',
                         'ApplicationForXid',
                         active_xid
                         )

    desk_file  = get_dbus('session',
                          'org.ayatana.bamf',
                          str(app_path),
                          'org.ayatana.bamf.application',
                          'DesktopFile',
                          None
                          )

    # Big credit to Six: http://askubuntu.com/a/664272/295286
    Gio.DesktopAppInfo.new_from_filename(desk_file).launch_uris(None)



def enumerate_viewports():
    """ generates enumerated dictionary of viewports and their
        indexes, counting left to right """
    schema="org.compiz.core"
    path="/org/compiz/profiles/unity/plugins/core/"
    keys=['hsize','vsize']
    screen = Gdk.Screen.get_default()
    screen_size=[ screen.get_width(),screen.get_height()]
    grid=[ int(str(gsettings_get(schema,path,key))) for key in keys]
    x_vals=[ screen_size[0]*x for x in range(0,grid[0]) ]
    y_vals=[screen_size[1]*x for x in range(0,grid[1]) ]

    viewports=[(x,y)  for y in y_vals for x in x_vals ]

    return {vp:ix for ix,vp in enumerate(viewports,1)}


def get_current_viewport():
    """returns tuple representing current viewport, 
       in format (width,height)"""
    vp_string = run_cmd(['xprop', '-root', 
                         '-notype', '_NET_DESKTOP_VIEWPORT'])
    vp_list=vp_string.decode().strip().split('=')[1].split(',')
    return tuple( int(i)  for i in vp_list )

def maximize():

    screen = Gdk.Screen.get_default()
    window = screen.get_active_window()
    window.maximize()
    screen.get_active_window()
    window.process_all_updates()

def unmaximize():

    screen = Gdk.Screen.get_default()
    window = screen.get_active_window()
    window.unmaximize()
    screen.get_active_window()
    window.process_all_updates()

def minimize():

    screen = Gdk.Screen.get_default()
    window = screen.get_active_window()
    window.iconify()
    window.process_all_updates()

def window_move(viewport):

    # 1. grab window object
    # 2. jump viewport 0 0 so we can move only
    #    in positive plane
    # 3. move the window.
    # 4. set viewport back to what it was

    # Step 1
    screen = Gdk.Screen.get_default()
    screen_size=[ screen.get_width(),screen.get_height()]
    window = screen.get_active_window()

    viewports = enumerate_viewports()
    current = get_current_viewport()
    current_num = viewports[current]
    destination = [ 
                   key for  key,val in viewports.items() 
                   if val == int(viewport)
                   ][0]
    # Step 2.
    run_cmd([
            'xdotool',
            'set_desktop_viewport',
            '0','0'
            ]) 
    # Step 3.
    window.move(destination[0],destination[1])
    window.process_all_updates()

    run_cmd([
            'xdotool',
            'set_desktop_viewport',
            str(current[0]),
            str(current[1])
            ]) 

def move_right():
    sc = Gdk.Screen.get_default()
    width = sc.get_width()
    win = sc.get_active_window()
    pos = win.get_origin()
    win.move(width,pos.y)
    win.process_all_updates()

def move_down():
    sc = Gdk.Screen.get_default()
    height = sc.get_height()
    win = sc.get_active_window()
    pos = win.get_origin()
    win.move(pos.x,height)
    win.process_all_updates()

def new_tab():
    run_cmd(['xdotool','key','ctrl+shift+t'])

def parse_args():
    """ Parse command line arguments"""

    info="""Copyright 2016. Sergiy Kolodyazhnyy.

    Window control for terminal emulators. Originally written
    for gnome-terminal under Ubuntu with Unity desktop but can 
    be used with any other terminal emulator that conforms to 
    gnome-terminal keybindings. It can potentially be used for 
    controlling other windows as well via binding this script
    to a keyboard shortcut.

    Note that --viewport and --tab options require xdotool to be
    installed on the system. If you don't have it installed, you 
    can still use the other options. xdotool can be installed via
    sudo apt-get install xdotool.
    """
    arg_parser = argparse.ArgumentParser(
                 description=info,
                 formatter_class=argparse.RawTextHelpFormatter)
    arg_parser.add_argument(
                '-w','--window', action='store_true',
                help='spawns new window',
                required=False)
    arg_parser.add_argument(
                '-t','--tab',action='store_true',
                help='spawns new tab',
                required=False)
    arg_parser.add_argument(
                '-m','--minimize',action='store_true',
                help='minimizes current window',
                required=False)
    arg_parser.add_argument(
                '-M','--maximize',action='store_true',
                help='maximizes window',
                required=False)
    arg_parser.add_argument(
                '-u','--unmaximize',action='store_true',
                help='unmaximizes window',
                required=False)
    arg_parser.add_argument(
               '-v','--viewport',action='store',
               type=int, help='send window to workspace number',
               required=False)
    arg_parser.add_argument(
               '-r','--right',action='store_true',
               help='send window to workspace right',
               required=False)
    arg_parser.add_argument(
               '-d','--down',action='store_true',
               help='send window to workspace down',
               required=False)
    return arg_parser.parse_args()

def main():

    args = parse_args()

    if args.window:
       new_window()
    if args.tab:
       new_tab()
    if args.down:
       move_down()
    if args.right:
       move_right()       
    if args.viewport:
       window_move(args.viewport)
    if args.minimize:
       minimize()
    if args.maximize:
       maximize()
    if args.unmaximize:
       unmaximize()

if __name__ == '__main__':
    main()

사이드 노트

  • "Gnome-Terminal에 새 탭을 열 수있는 명령이 있습니까?" 그놈 터미널 매뉴얼에는 그러한 옵션이 없습니다. 셸은 명령 줄 유틸리티입니다. 탭은 GUI 응용 프로그램의 기능입니다. 같은 터미널 멀티플렉서가 있습니다 screen또는 tmux어떤 종류의는 "tabbable 쉘"에 가깝게 그러나 이것은 당신이 물어 행동의 동일한 유형 아니다 "탭"또는 분할 창을 가질 수 있습니다. 기본적으로 귀하의 질문에 대한 답변은 "아니오"입니다. 항상 대안이 있으며 내 대답은 그중 하나를 제공합니다. X11 GUI 창-특성에 따라 터미널 창을 처리합니다.

  • 이 답변은 별칭과 어떤 관련이 있습니까? 글쎄, 우선 모든 별칭은 여러 명령에서 여러 출력을 인용하고 파싱 할 때 약간 지저분 할 수 있습니다. 이 스크립트는 창에서 개별 작업을 수행하는 플래그 / 스위치와 함께 하나의 중앙 집중식 명령을 제공합니다. 또한 별칭을 더 간단하게 만듭니다. 당신은 할 수 있습니다 alias nw='windowctrl.py --window'. 훨씬 짧고 깔끔합니다.


분할 터미널에 만족합니다
Akiva

1
@Akiva 분리 터미널과 관련된 질문을 연결 하시겠습니까? 그런데이 스크립트를 사용해 보셨습니까? 어떻게 생각해 ?
Sergiy Kolodyazhnyy

위의 답변으로 인해 문제가 발생하기 때문에 스크립트를 시험해 볼 것입니다. 그러나 xdotool의 문제로 인해 운이 좋지 않을 수도 있습니다.
Akiva

@ Akiva의 문제는 xdotool무엇입니까? 어쩌면 내가 고칠 수 있을까?
Sergiy Kolodyazhnyy

나는 당신에게 다시 연락해야합니다. 내 사용자 정의 키보드 레이아웃 또는 16.10에 있거나 구에 시도하고 있다는 사실과 관련이있을 수 있습니다.
Akiva
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.