コマンドライン入力中にショートカットキーを叩いたとき、それまで入力してた文字列を取得する

コマンドライン入力中にショートカットキーを叩いたとき、それまで入力してた文字列を取得する

(2018/3)

コマンド入力中にヘルプを表示するためにこのような機能が必要になったのだが実装が激しく難しかった
Macの場合の手順を書いておく
簡単にやる方法があるなら教えてほしい
ソースはこちら

(追記: zsh なら簡単にできることが判明... /Helplineで使っている 2020/7/26)

手順
以下の機能を実装する
カーソルの現在位置を取得するプログラムを作成
カーソルの現在位置にある行の文字列を取得するプログラムを作成
ショートカットキーでプログラムが動くようにする
これらについて解説する

1. カーソルの現在位置を取得する
applescriptなどでできれば良いのだが、方法がみつけられなかった
なのでエスケープシーケンスを利用する😱
酷い方法だが一応動く

2. カーソルの現在位置にある行の文字列を取得する
applescriptでターミナル画面の全テキストを取得することができる
tell application "Terminal" to tell front window to set the clipboard to contents of selected tab as text
これによりテキストがクリップボードに入るので、上で取得したカーソル位置の行を読めばよい

3. ショートカットキーでプログラムが動くようにする
これは割とポピュラーな方法が使える
以下のような方法が使える
QuickSilverというユティリティを使う
Automatorでサービスを作成し、それを起動するショートカットキーをシステム環境設定に登録する
Karabinarを使う

どれもかなり面倒である

これに加え、以下のような工夫も必要だった

カーソルの現在位置を取得するプログラムをNodeのプログラムから呼ぶと動かない
仕方がないのでコマンドを起動するたびに動かしてカーソル位置をセーブしておくことにした
bash には PROMPT_COMMAND という機能があり、ここにプログラムを登録しておくと、 $ のようなプロンプトが表示されるたびにプログラムが起動される
ここに 1. のプログラムを定義しておけばなんとかなる

つまり、エスケープシーケンスだの applescript だの bash だの Automator だのの謎機能を駆使しないとできなかったわけである。面倒すぐる!! もっと良い方法ないですか!?

Powered by Helpfeel