ラベル launcher の投稿を表示しています。 すべての投稿を表示
ラベル launcher の投稿を表示しています。 すべての投稿を表示

☆GmrunのキーバインドをBashに少しだけ近づける

私はGmrunが大好きです。
Mihai Bazonさん、すばらしいソフトウェアを作ってくれてありがとうございます。
さて、前回の「☆gmrun で Ctrl+PをUp、Ctrl+NをDownキーと同じように動作させる」に引き続き、
2つだけBashのキーバインドを付け加えてみました。
Ctrl+K、Ctrl+Uです。文字列を選択した状態はBashではありえない状態なので、
どういう仕様にするか迷ったのですがコーディングが楽な使用にしました。
パッチはこれです。
適用の手順は下記の通りです。
/usr/bin/gmrunだけ圧縮したアーカイブも用意しました。gmrun_0.9.1-4_i386.msll-patched.20100505.tar.gz
開発環境を入れたくない方はapt-getでgmrunを導入した後、/usr/bin/gmrunだけ入れ替えればOKです。
(ビルドしたパッケージをdpkgで導入すると更新がなくてもupdate-managerで
更新対象としてリストされるので、自分でビルドした場合でも一旦apt-getでgmrunを導入してから、
/usr/bin/gmrunだけ入れ替える方が良いかもしれません。
ちゃんとパッケージした方法で作れば良いのでしょうが、方法がわからず...)

ソース、パッチの取得とビルド
$ mkdir gmrun
$ apt-get source gmrun
$ sudo apt-get build-dep gmrun
$ wget http://sites.google.com/site/midspeclowload/files/gmrun-0.9.1-4.msll-20100505.patch?attredirects=0&d=1
$ patch -p1 < gmrun-0.9.1-4.msll-20100505.patch
$ cd gmrun-0.9.1/
$ debuild -r
gmrun-0.9.1-4.msll-20100505.patch
--- a/gmrun-0.9.1/src/gtkcompletionline.cc	2003-06-22 08:14:34.000000000 +0900
+++ b/gmrun-0.9.1/src/gtkcompletionline.cc	2010-05-05 22:14:05.296882925 +0900
@@ -975,6 +975,34 @@
       STOP_PRESS;
       return TRUE;
 
+     case GDK_K:
+     case GDK_k:
+      if (event->state & GDK_CONTROL_MASK) {
+        int pos = gtk_editable_get_position(GTK_EDITABLE(cl));
+        int len = gtk_entry_get_text_length(GTK_ENTRY(cl));
+        gtk_editable_delete_text(GTK_EDITABLE(cl), pos, len);
+        gtk_editable_select_region(GTK_EDITABLE(cl), pos, pos);
+        if (MODE_SRC)
+          search_off(cl);
+        return TRUE;
+      } else goto ordinary;
+
+     case GDK_U:
+     case GDK_u:
+      if (event->state & GDK_CONTROL_MASK) {
+        int pos = gtk_editable_get_position(GTK_EDITABLE(cl));
+        gtk_editable_delete_text(GTK_EDITABLE(cl), 0, pos);
+        gtk_editable_select_region(GTK_EDITABLE(cl), 0, 0);
+        if (MODE_SRC)
+          search_off(cl);
+        return TRUE;
+      } else goto ordinary;
+
+     case GDK_P:
+     case GDK_p:
+      if (event->state & GDK_CONTROL_MASK) {
+		;/* fall to 'case GDK_Up:'*/
+      } else goto ordinary;
      case GDK_Up:
       if (cl->win_compl != NULL) {
         int &item = cl->list_compl_items_where;
@@ -1010,6 +1038,11 @@
      }
      return FALSE;
 
+     case GDK_N:
+     case GDK_n:
+      if (event->state & GDK_CONTROL_MASK) {
+		;/* fall to 'case GDK_Down:'*/
+      } else goto ordinary;
      case GDK_Down:
       if (cl->win_compl != NULL) {
         int &item = cl->list_compl_items_where;

☆gmrunで Ctrl+PをUp、Ctrl+NをDownキーと同じように動作させる

gmrunの履歴操作を行う際、カーソルキーのUp/Downを押そうとするとどうしてもホームポジションから右手が離れてしまい不便です。

そこでソースをいじって、キーバインドをなるべくbashに近づけないか試してみました。
今のところ私の知識ですぐに修正できたのは、表題のとおりCtrl+PとCtrl+Nだけです。

例によって環境はubuntu 910 karmic koalaです。
なぜかVersion:0.9.1-2.4ではコンパイルが通らず(引数の型に互換性がない)、0.9.1-4をしています。

今回は手抜きで作業方法は省きます。

修正対象はgtkcompletionline.ccのon_key_press関数です。
修正した後のgtkcompletionline.ccとコンパイルしたgmrunを
https://sites.google.com/site/midspeclowload/files/gmrun_0.9.1-4.mod.tar.gz?attredirects=0&d=1
に置きました。

ちなみに修正内容は下記のとおりです。

--- gmrun-0.9.1.org/src/gtkcompletionline.cc    2010-01-26 23:33:54.783042744 +0900
+++ gmrun-0.9.1/src/gtkcompletionline.cc    2010-01-26 23:58:11.000000000 +0900
@@ -970,6 +970,11 @@
       STOP_PRESS;
       return TRUE;

+     case GDK_P:
+     case GDK_p:
+      if (event->state & GDK_CONTROL_MASK) {
+        ;/* fall to 'case GDK_Up:'*/
+      } else goto ordinary;
      case GDK_Up:
       if (cl->win_compl != NULL) {
         int &item = cl->list_compl_items_where;
@@ -1005,6 +1010,11 @@
      }
      return FALSE;

+     case GDK_N:
+     case GDK_n:
+      if (event->state & GDK_CONTROL_MASK) {
+        ;/* fall to 'case GDK_Down:'*/
+      } else goto ordinary;
      case GDK_Down:
       if (cl->win_compl != NULL) {
         int &item = cl->list_compl_items_where;

☆これはお勧め gmrun

gmrunは http://directory.fsf.org/project/gmrun/ の冒頭で

'Gmrun' is a run-program utility that provides bash-like TAB completion and history, the ability to run commands in a terminal using CTRL-Enter. CTRL-R/CTRL-S may be used for history searches, similar to 'bash'.
'Gmrun'はプログラムを実行するユーティリティで、bashのようなTAB補完と履歴を提供し、CTRL-Enterを使ってターミナルでコマンドを実行できます。CTRL-R/CTRL-Sは'bash'と同じで履歴の検索に使えます。

と紹介されています。(日本語訳が間違っていたらごめんなさい)

上記には記述されてませんが、矢印キーのUp/Downで履歴を行き来することも出ます。
'http:'や'mailto:'で始まる文字列を処理するアプリケーションを指定することも可能です。
(詳しくはgmrunrcの設定で記述します。)
拡張子による処理アプリケーションの指定も可能です。

gnome,xfce,LXDEいずれもAlt+F2でコマンドラインのラウンチャーが起動しますが、
補完と履歴の両方を備えているのはgnomeのものだけ。

補完と履歴のを備えたコマンドラインベースのラウンチャーを探している方にお勧めです。
gnomeのコマンドラインのラウンチャーのような補完動作もできるのでgnomeユーザも
試してみてはいかがでしょうか。

以下、ubuntu 9.10 karmic koala を前提にして導入方法、使い方を紹介します。
(ちなみに依存するライブラリは少なく、Version: 0.9.1-2.4のバイナリをコピーしただけでmoblin2.1でも動作しました。しかし、別の投稿で記述する0.9.1-4はmoblin2.1で動作しませんでした。)

●導入

リポジトリに入っているので(Section: universe/x11)、apt-getで導入できます。
これを書いている時点では Version: 0.9.1-2.4 です。

sudo apt-get install gmrun

●設定

gmrunの設定ファイルは $HOME/.gmrunrcと /etc/gmrunrc です。$HOMEの方が優先されます。

これはちょっと長くなるので先に xfceとLXDEでデフォルトのラウンチャーと置き換える方法を先に記述します。

■xfceでデフォルトのラウンチャを置き換える場合

$HOME/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml
の内容を書き換えます。(設定用のGUIもあります。)
ここではF2はそのままにして、Windows+Rにgmrunを割り当てます。
書き換え前

<property name="<Alt>F2" type="string" value="xfrun4"/>

書き換え後(上記の下に一行追加)
<property name="<Alt>F2" type="string" value="xfrun4"/>
<property name="<Super>r" type="string" value="gmrun"/>

■LXDEでデフォルトのラウンチャを置き換える場合

$HOME/.config/openbox/lxde-rc.xml
   の内容を書き換えます。(設定用のGUIは見つけられませんでした。)

書き換え前

<keybind key="W-r">
      <action name="Execute">
        <command>lxpanelctl run</command>
        <command>gmrun</command>
      </action>
  </keybind>

書き換え後
<keybind key="W-r">
      <action name="Execute">
        <command>gmrun</command>
      </action>
  </keybind>

■$HOME/.gmrunrcと /etc/gmrunrcの設定

なぜかVersion: 0.9.1-2.4のパッケージにはgmrunrcのサンプルが入っていません。
manpageは内容が古いようです。READMEは設定ファイルについての記述がほとんどありません。
(ほかにも0.9.1-2.4はapt-get source、debuildでコンパイルエラーがでるなど不備が多そうです。)
仕方がないので Version: 0.9.1-4の/etc/gmrunrcを参考にします。


# Set terminal
Terminal = gnome-terminal --start-factory-server --use-factory
TermExec = ${Terminal} -e
AlwaysInTerm = ssh telnet ftp lynx mc vi vim pine centericq perldoc man

Terminalはgmrunに何も入力されていない状態でCTRL-Enterを押した場合に起動する
ターミナルのコマンドラインを指定します。
TermExecはコマンドを入力してCTRL-Enterした場合に入力した場合の指定です。
(これはあまりいじる必要ななさそうです。)
AlwaysInTermは説明が見当たらなかったのですが、名前から推測するとENTERだけを
押下しても CTRL-Enterを押したように動作するコマンドの指定をしているようです。


# Set window geometry (except height)
Width = 400
Top = 100
Left = 200

ウィンドウの表示位置を設定します。画面のピクセル単位です。


# History size
History = 256

コマンド履歴のサイズ


# Shows last history line selected when invoked
ShowLast = 1

起動されたときに最後のヒストリを表示するかどうかを設定するようですが、
うまく動作しないようです。


# Show files starting with '.'
# Default is 0 (off), set it to 1 if you want "hidden" files to show up
# in the completion window
ShowDotFiles = 0

先頭がドットで始まるファイルを補完ウィンドウに表示する/しないを設定します。
これは1にしておいたほうがいいと思います。
(ドットで始まるコマンドはありませんが、引数に与えるファイル名としてはあるので)


# Timeout (in milliseconds) after which gmrun will simulate a TAB press
# Set this to NULL if don't like this feature.
TabTimeout = 0

何かキー入力した後に TabTimeout ミリ秒たつとタブが押下されたように補完を行います。
"0"にしておくとタブを押さない限り補完が葉たらなくなります。
"10"くらいにしておくとgnomeのラウンチャのように入力された文字列に前方一致するコマンドが
補完されて表示されます。


# URL handlers
# If the entered text is "http://www.google.com" then:
#   - %u gets replaced with the whole URL ("http://www.google.com")
#   - %s gets replaced with "//www.google.com".  This is useful for URL-s
#     like "man:printf" --> %s will get replaced with "printf"
URL_http = mozilla -remote "openURL(%u, new-window)"
URL_mailto = mozilla -remote "mailto(%s)"
URL_man = ${TermExec} 'man %s'
URL_info = ${TermExec} 'info %s'
URL_pd = ${TermExec} 'perldoc %s'
URL_file = nautilus %s
URL_readme = ${TermExec} 'less /usr/doc/%s/README'
URL_info = ${TermExec} 'info %s'
URL_sh = sh -c '%s'

URLハンドラの指定です。入力テキストが"http://www.google.com"のばあい
%uは "http://www.google.com" に置き換えられます。
%sは "//www.google.com"に置き換えられます。

私の環境では
URL_http =/usr/bin/firefox %u
URL_mailto = /usr/bin/sylpheed --compose %s
のようにしています。


# extension handlers
EXT:doc,rtf = AbiWord %s
EXT:txt,cc,cpp,h,java,html,htm,epl,tex,latex,js,css,xml,xsl,am = emacs %s
EXT:ps = gv %s
EXT:pdf = xpdf %s

拡張子による処理アプリケーションの指定です。