Monthly Archives: 12月 2018

2018-12-21

Emacs Helmの色を修正する

anythingからhelmへ移行しましたがどうにも違和感が残っています。うーん、配色が悪い。全体的に色がガチャガチャしすぎなんですよね。背景色を指定しすぎている気がします。

プロンプトのカーソル色が黒くなってしまう問題があったのですが、それはこちらのIMEの設定のせいでした。IMEをONにしたら色を変えてOFFにしたら戻すようにしていたのですが、戻すときに黒にしていました。なぜか普段は白に戻ってくれるのですが、背景が黒なので自動的に白にしてくれているのでしょうか……。

それはともかく、気に入らないところをM-x describe-faceやM-x customize-faceで修正。

  • ディレクトリの色(helm-ff-directory)がなんで白背景に赤文字?? フレームの背景色が白であることが前提なのでしょうか? とにかくこれでは見づらいのでdired-directoryと同じ色にしました。一貫性があってすぐにディレクトリと分かります。
  • .や..の色(helm-ff-dotted-directory)が灰色背景に黒文字。み、見づらすぎ……。dotted directoryって.emacs.dとかには適用されていませんね。 . と .. だけみたいです。diredだと . と .. 以外のドットファイルはグレーにしているのですが、helmにはそういうfaceは無いようです。.と..だけを別の色にする必要性を感じなかったのでhelm-ff-directoryと同じ色にしてしまいました。
  • マークの色(helm-visible-mark)がド派手な緑……。これもdiredのマーク色で……と思ったけれどしっくりきません。regionと同じ単純な青色で。文字をboldにすればカーソルと被ってもマークされていると分かります。
  • カーソルの色(helm-selection)も濃い緑……。白じゃダメなの? うーん、さすがに明るすぎますか。文字も見づらい。regionより少し明るい青で。
  • バッファリストにも白背景に赤文字のディレクトリ色(helm-buffer-directory)がありました。ディレクトリのfaceいくつあるの? ff bookmark bufferとありますね。

これだけで少しは落ち着いた色になった気がします。

2018-12-21

Windows上のEmacsでhelm-locateを使う(Windows Searchで)

helm-locateはWindowsではes.exe(Everything)を使うようになっています。

しかしWindowsでは標準でWindows Searchという検索エンジンが入っています。これが使えればわざわざ機能が被る別アプリ(サービス)を入れる必要は無くなります。Windows Searchは重いというのでOFFにしている人もいると思いますが一応標準で入っているものですし一時的にインデックスを停止することも出来るのでそれほど嫌がるものでもないと思います。

先日、helmからWindows Searchでファイル検索できるhelm-windows-searchを作成したのですが、helm-locateはhelm-find-filesから呼び出せるようになっている(C-x C-fで開いた後もう一回C-x C-fで開く)のでhelm-locate自体もEverythingではなくWindows Searchで動くようになっていれば便利そうだなと思いました。

方針としては、Emacs Lispとadoquery.exeで可能な限りlocateコマンドをエミュレートすることにします。

helm-locateでlocateコマンド(またはes.exe)を起動しているのはhelm-locate-init関数です。 この関数はコマンドラインの作成とプロセスの起動をまとめて行っています。 コマンドラインの作成部分だけ差し替えることは出来ないので、関数を丸丸置き換えることにします。

というわけで、先日のHelm Windows Searchhelm-locate-windows-search.elを追加しました。これをロードパスの通ったところに置き、adoquery.exeを同じディレクトリかまたはパスが通ったところに置き、次の設定をするとhelm-locate-initが置き換わります。

(autoload 'helm-locate-windows-search-setup "helm-locate-windows-search")
(with-eval-after-load "helm-locate" (helm-locate-windows-search-setup))

<helm prefix> l やC-x C-f C-x C-f でhelm-locateが開き、そこでWindows Searchを使った検索が出来ます。ただしlocateをエミュレートしているため、Windows Searchの複雑なクエリは書けません。 -bオプションでファイル名だけのマッチが出来るくらいでしょうか。

別にlocateコマンドにこだわる必要も無さそうなのでhelm-locate全体をhelm-windows-searchで置き換えてしまっても良いかもしれません。その場合は次のようにしてhelm-locate-1関数をhelm-windows-search-1関数へ置き換えてしまえばOKです。

(with-eval-after-load "helm-locate"
  (fset 'helm-locate-1
        (lambda (&optional localdb init from-ff default)
          (require 'helm-windows-search)
          (helm-windows-search-1 init default)))

locateコマンドではローカルDBが使えますがWindows Search(やEverything)ではできません。その代わりWindows Searchでは検索するディレクトリを限定する機能(SCOPEやDIRECTORY)があるのでうまく使いたいところですがどうにもうまくハマらなかったので実現出来ていません。

2018-12-20

Emacs Helm から Windows Search を使う

HelmからWindows Search(Windowsデスクトップサーチ)を利用するelisp helm-windows-search.elを作りました。

(日本語が通らない場合はfakecygptyなどstart-processをフックしている設定が無いか確認してください)

最近ようやくAnything.elからHelmへ移行したのですが、設定を見直しているときにWindows Searchするコードを見つけてそういえばそんなものを作ったなぁと思い出したのでした。

要するに使っていなかったのですが、色々調べていくうちにもう少し使いやすく出来そうだなと思ったので手を加えてみました。

exe部分は汎用的なADOアクセスラッパーになっていて、elispの方からSQLクエリを作成するので後から色々融通が利きます。

とりあえず次のようなクエリを書けるようにしてみました。

  • apple banana orange
  • "you're looking for"
  • author:misohena
  • title:hello\ world
  • size:>1000000000
  • date:2017-10-20..2018-3
  • kind:folder hogeprojectdir
  • kind:music hogehoge
  • ext:mp3
  • filename:happy.txt
  • contents:brabrabra
2018-12-18 ,

コマンドラインから Windows Search で全文検索

以前 anything.elでファイル検索(Windowsの場合) という記事でADO経由で検索するプログラム(20100701_winsearch.cpp)を作ったのですが、もう少し汎用的なものを作ってみました。

misohena/adoquery: Windows ADO Query Command

これ(adoquery.exe)を使うとSQLベースクエリを直接書けます。

例えば

  • ファイル名にhelloを含む
  • テキストカラム(タイトルや内容)にhelloを含む

ファイルを検索するには次のようにします。

adoquery /conn "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';" /query "SELECT TOP 10 System.ItemFolderPathDisplay, System.FileName FROM SystemIndex WHERE (System.FileName Like '%hello%') or Contains('hello')" /format "%1%\\%2%" /header ""

SQLの詳しい書き方は次のページに書いてあります。

Querying the Index with Windows Search SQL Syntax - Windows applications | Microsoft Docs

Using SQL and AQS Approaches to Query the Index にも書いてありますが、クエリを投げられれば言語は何でも良いです。今回はC++&ADOでやりましたが、VBScriptの例なんかも載ってます。

2018-12-11 ,

Node.jsで書いたプログラムをタスクトレイに入れる

Node.jsで書いたものをWindows上で起動させっぱなしにする方法は色々あるみたいなんですがどれも今ひとつよく分からなかったのでやりたいことは単にコンソールウィンドウが鬱陶しいからタスクトレイに押し込んで欲しいというだけだったのでそういうことをするプログラムを作りました。

misohena/trayrun: Execute windows application under task tray

Visual Studioでビルドしてtrayrun.exeを作成。

trayrun.exeへのショートカットを作成して、ショートカットのプロパティから色々変更。

リンク先
c:/hogehoge/trayrun.exe /c "node.cmd start" /title "my node app"
作業フォルダー
Node.jsで書いたもののディレクトリ

みたいにすればOKです。

ショートカットをスタートアップに入れておけば起動時に開始されます。

後はタスクトレイのメニューからコンソールウィンドウを表示したり隠したり出来ます。

で、絶対同じようなものは既にあるんだろうなぁと検索したら同じ名前のものが見つかりました。まぁ、そうですよねw