コマンドライン入力中にショートカットキーを叩いたとき、それまで入力してた文字列を取得する
(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
だのの謎機能を駆使しないとできなかったわけである。面倒すぐる!! もっと良い方法ないですか!?