Gnome-Terminal'de yeni bir sekme açmak için bir komut veya herhangi bir sekmeli kabuk var mı?


11

Bir klavye kısayolu aramıyorum, bunun yerine bir komut istiyorum:

  • Yeni Pencere
  • Yeni sekme
  • Geçerli sekmeyi veya pencereyi kapat
  • Kabuk Penceresini Büyüt
  • Kabuk Penceresini Küçült
  • Kabuğu farklı bir çalışma alanına taşıma
  • Anahtar Sekmesi

Ve temelde böyle bir şey. Hatırlamak; Kısayollar değil, gerçek komutlar istiyorum. Bunun nedeni, takma ad işlevini kullanabilmem.


1
Python seninle iyi mi?
Sergiy Kolodyazhnyy

4
"Geçerli sekmeyi kapat" - bu komut "çıkış" olarak adlandırılır: D
egmont

"Kısayollar istemiyorum [...] bu yüzden takma ad işlevini kullanabilirsiniz" - lütfen bu konuda ayrıntılı bilgi verebilir misiniz? İyi bilinen kısayollar yerine tam olarak umduğunuz avantaj nedir? Kısayollarda sorun veya eksik işlevsellik nedir? Sanırım aradığınız şey için doğru yaklaşım onlar.
egmont

@egmont Ben bir Vim Bağımlısıyım, eğer mantıklıysa.
Akiva

Diyelim ki, örneğin Maximize için, her durumda (tarayıcı, görüntü düzenleyici, kelime işlemci vb.) Her durumda (yani bunların içinde ne yaparsanız yapın) çalışan bir pencere yöneticisi kısayol tuşuna sahip olmak yerine, d yalnızca terminal için çalışan ve başka bir uygulama olmayan bir komut kullanmayı tercih eder ve yalnızca içeride herhangi bir komut çalıştırmıyorsa (varsayılan kabuk dışında). Hayır, üzgünüm, bu fikir hala benim için çok anlamlı değil :(
egmont

Yanıtlar:


14

Bunu Gnome-Terminal'de varsayılan olarak, en azından ham komutlarla yapamazsınız.

Ancak, bunu yapabilen klavye kısayollarını çağıran komut dosyaları yazabilirsiniz. Bunun için ihtiyacınız olduğunu unutmayın xdotool:sudo apt install xdotool

  • Yeni Pencere : İle yeni bir terminal penceresi başlatın nw
    Bunu sadece ile yapabiliriz gnome-terminal.
    Şuraya ekle.bashrc :

    echo "alias nw=gnome-terminal" >> ~/.bashrc
  • Yeni Sekme : ile yeni bir sekme başlatın nt
    Biz ile yapabilirsiniz xdotool getactivewindow $(xdotool key ctrl+shift+t)
    için Ekle.bashrc :

    echo "alias nt='xdotool getactivewindow $(xdotool key ctrl+shift+t)'" >> .bashrc
  • Sekmeyi Kapat : Geçerli sekmeyi veya pencereyi ct
    xdotooltekrar ihtarlarla kapat : xdotool getactivewindow $(xdotool key ctrl+shift+w)
    Ekle.bashrc :

    echo "alias ct='xdotool getactivewindow $(xdotool key ctrl+shift+w)'" >> .bashrc
  • Pencereyi Büyüt : Burada maw
    kullanabileceğimiz pencerenin tamamını büyütün wmctrl: wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz
    Ekle.bashrc :

    echo "alias maw='wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz'" >> .bashrc
  • Pencereyi Simge Durumuna Küçült : Tekrar miw
    kullanabileceğimiz pencerenin tamamını simge durumuna küçültün xdotool: xdotool windowminimize $(xdotool getactivewindow)
    Ekle.bashrc :

    echo "alias miw='xdotool windowminimize $(xdotool getactivewindow)'" >> .bashrc
  • Workspace taşı : başka bir çalışma alanına bir pencere Taşı mtw <id>
    sadece olurdu Bu zorlukla kabuk komut dosyası mümkün ve benim kişisel deneyim ötesinde. Bu amaçla Serg'in senaryosunu kullanmanızı tavsiye ederim, çünkü aslında şu an çalışıyor. Ah, Compiz'in faydaları.


7

Giriş

Bu yanıtta sunulan komut dosyası, kullanıcının terminal pencerelerini tek bir komut ve seçenek listesi aracılığıyla denetlemesine olanak tanır. Kullanımı basittir ve tuş takımlarına benzer herhangi bir terminal emülatörüyle uyumludur gnome-terminal. Taşıma seçenekleri diğer terminallerle de kullanılabilir, ancak bu terminaller için sekme açıklığı garanti edilmez.

Komut dosyası sekme açma, pencere açma, çalışma alanına inme, çalışma alanı sağ, tamsayı numarasına hakemlik edilen belirli çalışma alanını, pencereyi simge durumuna küçültme, büyütme ve büyütme işlemlerini kapsar. Komut dosyasının kapsamadığı tek şey sekme / pencereyi kapatmaktır, çünkü her kabuk / terminal öykünücüsünün zaten bir komutu vardır - exitveya alternatif olarak CtrlDkısayol aracılığıyla .

!!! NOT: xdotoolçalışma alanı değiştirme ve sekme açma gerekir. Yoluyla yükleyin sudo apt-get install xdotool. Fazladan paket yüklememeyi tercih ederseniz, çalışma alanının ve sekme geçişinin çalışmadığını , ancak diğer seçeneklerin çalışacağını unutmayın.

Kullanımı:

Tüm argümanlar windowctrl.pyisteğe bağlıdır, bu nedenle ayrı ayrı veya potansiyel olarak birlikte kullanılabilirler. -hSeçenek ile gösterildiği gibi .

$ ./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

Komut Dosyası Kaynak kodu:

Komut dosyası kaynak kodu GitHub'da olduğu gibi burada da mevcuttur. En son değişikliklerin burada değil GitHub'a girmesi muhtemeldir, bu yüzden orada en son sürümü kontrol etmenizi şiddetle tavsiye ederim. Ayrıca hata raporları da yayınlamanız önerilir.

#!/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()

Yan notlar

  • "Gnome Terminalinde yeni bir sekme açmak için bir komut veya herhangi bir sekmeli kabuk var mı?" Gnome Terminal kılavuzu bu seçeneği listelemiyor. Kabuklar komut satırı yardımcı programlarıdır. Sekmeler GUI uygulamalarının bir özelliğidir. "Sekmeler" ya da bölünmüş pencerelere sahip olabilen screenya tmuxda bunlara sahip olabilen terminal çoklayıcıları vardır . Temel olarak, sorunuzun cevabı "Hayır" dır. Her zaman alternatifler vardır ve cevabım bunlardan birini sağlar. Terminal penceresini doğasına göre işler - X11 GUI penceresi.

  • Bu cevap takma adlarla nasıl ilişkilidir? Her şeyden önce, özellikle birden çok komuttan birden fazla çıktıyı alıntılamak ve ayrıştırmak söz konusu olduğunda, diğer adlar biraz dağınık olabilir. Bu komut dosyası, pencereye ayrık bir görev yapmak için bayraklar / anahtarlar içeren tek bir merkezi komut verir. Ayrıca takma adları basitleştirir. Yapabilirsin alias nw='windowctrl.py --window'. Çok daha kısa, çok daha temiz.


Bölünmüş terminallerden memnunum
Akiva

1
@Akiva, bölme terminali ile ilgili bir soruyu bağlamamı ister misiniz? Bu senaryoyu bu arada denedin mi? ne düşünüyorsun ?
Sergiy Kolodyazhnyy

Senaryonuzu deneyeceğim, çünkü yukarıdaki cevap bana sorun veriyor. Ancak sorunun başlıca xdotool olması nedeniyle çok şansım olmayabilir.
Akiva

@Akiva ve sorun xdotoolnedir? Belki düzeltebilirim?
Sergiy Kolodyazhnyy

Bu konuda sana geri dönmem gerekecek. Özel klavye düzenimle veya 16.10'da olduğum ya da guake üzerinde denediğim gerçeğiyle ilgili olabilirim.
Akiva
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.