
Apple Scriptをもう一度〜 今回は苦労しました: CotEditor用のショートカット
CotEditorをインストールしたら、CotEditorにアップルスクリプトをショートカットで実行できる機能があるのを知りました。
なので、またPythonの勉強のために、CotEditorでコードを書いた後、terminalへコードを送り出すapple scriptをGPT4と相談してつくりました。
前回との違いは、カーソルが置かれている行全体を選択して、その行を送り出すという点です。
スクリプト本体はこちらです。
property linefeed : ASCII character 10 -- LFを定義
-- ユーザーにコマンドキーを離すように指示
display dialog "Commandキーを離してください。" buttons {"OK"} default button "OK"
delay 0.5
tell application "CotEditor"
activate
tell front document
-- 現在のカーソル位置の行を選択
tell application "System Events"
keystroke "a" using {command down, shift down}
end tell
delay 0.1 -- キーストロークの実行に時間を与えるための遅延
-- 選択された行の内容を取得
set selectedText to contents of selection
delay 0.1 -- 行の内容の取得実行に時間を与えるための遅延
end tell
end tell
tell application "Terminal"
activate
-- 既存のウィンドウがあるかどうかを確認し、なければ新しいウィンドウを開く
if not (exists window 1) then
do script "" -- 新しいウィンドウを開く
end if
-- 末尾の改行コードを取り除いたテキストをペーストして実行する
if selectedText ends with linefeed then
set selectedText to paragraph 1 of selectedText
end if
do script selectedText in front window
end tell
-- CotEditorにフォーカスを戻す
tell application "CotEditor"
activate
-- システムイベントを使って、カーソルを次の行に移動するキーストロークを実行
tell application "System Events"
key code 125 -- 下矢印のキーコード
end tell
end tell
なぜか改行されてないですね。
読みやすいように引用で表示するとこう。
property linefeed : ASCII character 10 -- LFを定義
-- ユーザーにコマンドキーを離すように指示
display dialog "Commandキーを離してください。" buttons {"OK"} default button "OK"
delay 0.5
tell application "CotEditor"
activate
tell front document
-- 現在のカーソル位置の行を選択
tell application "System Events"
keystroke "a" using {command down, shift down}
end tell
delay 0.1 -- キーストロークの実行に時間を与えるための遅延
-- 選択された行の内容を取得
set selectedText to contents of selection
delay 0.1 -- 行の内容の取得実行に時間を与えるための遅延
end tell
end tell
tell application "Terminal"
activate
-- 既存のウィンドウがあるかどうかを確認し、なければ新しいウィンドウを開く
if not (exists window 1) then
do script "" -- 新しいウィンドウを開く
end if
-- 末尾の改行コードを取り除いたテキストをペーストして実行する
if selectedText ends with linefeed then
set selectedText to paragraph 1 of selectedText
end if
do script selectedText in front window
end tell
-- CotEditorにフォーカスを戻す
tell application "CotEditor"
activate
-- システムイベントを使って、カーソルを次の行に移動するキーストロークを実行
tell application "System Events"
key code 125 -- 下矢印のキーコード
end tell
end tell
アップルのScript Editorに貼り付けて動作確認してから、CotEditorのスクリプトホルダーに保存です。保存場所は、隠しフォルダーのlibrary > application > com.coteditor.CotEditor です。command + shift + . で隠しフォルダーが見えるようになります。
スクリプトの名前は下記にしました。コマンド+ r で実行となります。
CotEditorの機能で、スクリプト名でショートカットを割り当てられています。
それで、上のスクリプトで一番苦労したのは下の部分。
-- 末尾の改行コードを取り除いたテキストをペーストして実行する if set selectedText to paragraph 1 of selectedText
GPT4の言う通りにいろいろ試しましたが、うまくいかず。Googleで検索しまくったら結構みなさん困っているようで、回答をみつけれました。
そのなかで一番シンプルそうな paragraph 1 と言うフレーズを採用しました。
あとコマンドキーを押したままだと、Editorにもどった時に一気に一番下までカーソルが移動してしまうので、スクリプトの最初の部分が加わっています。ショートカットキーをコマンドを割り当てなければ要らない部分です。
これで、CotEditorでPythonのコードを書いて、Command + r を押したら、terminalへその行が送られて、terminalで実行されて、またカーソルがEditorにもどって、次の行にカーソルが移動するという挙動になりました。
これでがんばってpythonのインターラクティブモードでの学習していきたいと思います。
おまけ
インターラクティブモードでメモリー上に展開されている変数や関数を気軽に簡潔に表示してもらう関数 ls() をGPTにつくってもらいました。
def ls():
return [name for name in globals() if not name.startswith('_')]
実行して確かに動くのですが、なぜ顔文字で動くのか最初わからず笑
ChatGPTに質問して、ようやく アンダーラインを引用符で囲っているだけだということを教えてもらいました汗
#AI #AIとやってみた #やってみた #Python #Applescript #CotEditor
いいなと思ったら応援しよう!
