четверг, 30 июня 2011 г.

Мой вариант yakurun

Yakuake — это такой весьма удобный терминал для KDE, прячущийся подобно консоли Quake. Задача — запустить в нем некую программу в отдельной вкладке и в конкретном каталоге. В целом решение взято из поста на Gentoo.ru, однако я убрал проверку существования вкладки (всегда открывается новая), добавил переход в нужный каталог, ну и использовал более понятные параметры командной строки, для чего вместо bash-скрипта написал короткую программу на Ruby. Код можно найти под именем yakurun в моей свалке скриптов на GitHub, или далее в этом посте.

#!/usr/bin/ruby -Ku

require 'optparse'

name = nil
path = nil
program = nil
opts = OptionParser.new

if $stdout.stat.chardev?
  opts.banner = "\e[1mUsage:\e[0m yakurun [options] [program with args]"
  opts.separator ''
  opts.separator "\e[1mOptions:\e[0m"
else
  opts.banner = 'Usage: yakurun [options] [program with args]'
  opts.separator ''
  opts.separator 'Options:'
end

opts.on '-n', '--name', '-t', '--tab', '=NAME', String,
    'Name of tab or session.' do |value|
  name = value
end
opts.on '-p', '--path', '-d', '--directory', '=PATH', String,
    'Working path for started program.' do |value|
  path = value
end
opts.on '-?', '-h', '--help', 'Show short help and exit.' do
  puts opts.to_s
  exit
end
args = opts.parse ARGV
program = args.join ' ' if args.length > 0

if name == nil && path == nil && program == nil
  puts opts.to_s
  exit
end

name ||= args[0] || path

`qdbus org.kde.yakuake /yakuake/sessions addSession`
session = `qdbus org.kde.yakuake /yakuake/sessions activeSessionId`.chomp
terminal = `qdbus org.kde.yakuake /yakuake/sessions \
    terminalIdsForSessionId #{session}`.chomp
`qdbus org.kde.yakuake /yakuake/tabs setTabTitle #{session} "#{name}"`
if path
  `qdbus org.kde.yakuake /yakuake/sessions runCommandInTerminal \
      #{terminal} "cd #{path}"`
end
if program
  `qdbus org.kde.yakuake /yakuake/sessions runCommandInTerminal \
      #{terminal} '#{program}'`
end

active = `qdbus org.kde.yakuake /yakuake/MainWindow_1 \
    com.trolltech.Qt.QWidget.isActiveWindow`.chomp
if active == 'false'
  `qdbus org.kde.yakuake /yakuake/window toggleWindowState`
end

Комментариев нет:

Отправить комментарий