「毎回止まる…」
「処理が重い…」
「起動できない…」
文章を一瞬で入力できる「PhraseExpress」を使っていました。
しかし、なかなか起動が安定せず…。
そこで、自作ツール(AutoHotkey)に乗り換えたので、その経緯をまとめました。

※自作したツールの呼び出し画面(若干手作り感はありますが)
PhraseExpressへの不満
PhraseExpressを使えば、メルマガやメール、YouTube説明欄などの定型文を「決めたキー」で一瞬で呼び出せるので便利でした。
しかし、次のような不満がありました。
(私の使い方が悪いのかもしれませんが。)
- 毎回、アプリを起動しないとツールが動かない
- 起動に時間がかかる・途中で止まる
- 動作が安定しない
当初はそこまで感じていなかった違和感も、毎日積み重なると徐々にストレスを感じるように。
「このままでは良くないなぁ」
と思い、自作する選択をしました。
他のツールに移行することも一瞬考えましたが、ひとりで使う分なら自作で十分だろうということで。
AutoHotkeyでの実装方法(自作スニペット)
具体的には「AutoHotkey」を使います。
導入の仕方については、以下の記事やYouTube動画をご覧いただければ。
◇ブログ記事

フォルダの構成
まず、全体像です。
- SnippetsTrigger.ahk
- snippetsフォルダ
- 呼び出したい文章.txt
という2階層に分けて運用します。
コードの内容
SnippetsTrigger.ahkには、呼び出し用のコードを書いていきます。
コードの詳細はこちらを。
#Requires AutoHotkey v2.0
#SingleInstance Force
SendMode "Input"
; ============================================
; 設定
; ============================================
SNIP_DIR := EnvGet("USERPROFILE") "●●(snippetsフォルダのパスを記載)"
; ここに追加して管理
SNIPS := [
["●●(呼び出しキーを記載)", "●●(タイトルを記載)", "●●.txt"],
]
; ============================================
; 長文用・安定貼り付け
; ============================================
PasteText(text) {
A_Clipboard := ""
Sleep 30
A_Clipboard := text
if !ClipWait(2.0)
return false
; Web入力欄向け猶予
Sleep 80
SendEvent "^v"
Sleep 120
return true
}
ExpandByFile(file) {
global SNIP_DIR
try {
PasteText(FileRead(SNIP_DIR . file, "UTF-8"))
}
}
ExpandByHotstring(hs) {
global SNIPS
for item in SNIPS {
if (item[1] = hs) {
ExpandByFile(item[3])
return
}
}
}
; ============================================
; Hotstring 自動登録(安全版)
; ============================================
HotCb(hs, *) {
ExpandByHotstring(hs)
}
for item in SNIPS {
hs := item[1]
Hotstring(":?:" hs, HotCb.Bind(hs))
}
; ============================================
; Alt + S → 一覧 → 選択 → 展開
; ============================================
!s::
{
global SNIPS
list := ""
i := 1
for item in SNIPS {
list .= i ": " item[2] " [" item[3] "] <" item[1] ">`n"
i++
}
ib := InputBox(
"番号 or キーワードを入力してください`n"
. "(例: 1 / メルマガ / YouTube / 校閲 / mail / 1mmm)`n`n"
. list,
"スニペット選択(Alt+S)"
)
if (ib.Result != "OK")
return
q := Trim(ib.Value)
if (q = "")
return
; ① 番号
if RegExMatch(q, "^\d+$") {
idx := Integer(q)
if (idx >= 1 && idx <= SNIPS.Length)
ExpandByFile(SNIPS[idx][3])
return
}
; ② Hotstring一致
for item in SNIPS {
if (q = item[1]) {
ExpandByFile(item[3])
return
}
}
; ③ 表示名 / ファイル名 部分一致
for item in SNIPS {
if InStr(item[2], q) || InStr(item[3], q) {
ExpandByFile(item[3])
return
}
}
}
5行目周辺の以下を更新すれば、コピペで使えます。
他の箇所は触れる必要はありません。
; ============================================
; 設定
; ============================================
SNIP_DIR := EnvGet("USERPROFILE") "●●(snippetsフォルダのパスを記載)"
; ここに追加して管理
SNIPS := [
["●●(呼び出しキーを記載)", "●●(タイトルを記載)", "●●.txt"],
]“●●(snippetsフォルダのパスを記載)”
は、該当フォルダを右クリックして「パスのコピー」を選択すれば取得できます。
(もしくはフォルダを選択して「Ctrl+Shift+C」でも)

そして、.txtファイルは呼び出したい文章を記載すればOKです。
使い方
「●●(呼び出しキーを記載)」に記載した文字を入力すれば呼び出せます。
環境によってはEnterを押さないと起動しないこともあるため、その場合はEnterを押せばOKです。
もしくは、「Alt +S」で一覧を表示して入力することも可能です。
(冒頭の写真のように)
自作後に感じたメリット
メリット①:動作が軽い
まず、大きなメリットとしては
「動作が軽い」
ということが挙げられます。
PhraseExpressの動作は割と重くて、カクつくことも多かったので。
メリット②:カスタマイズ性が高い
2つ目は、カスタマイズ性が高いということです。
.txtファイルを追加すれば、いくらでも入力種類を増やせますし、その更新も簡単です。
またUIが気に入らなければ、「SnippetsTrigger.ahk」ファイルを編集して改善することも可能です。
メリット③:無料で使える
PhraseExpressも無料版がありますが、AutoHotkeyは完全に無料です。
(ひとりならPhraseExpressの無料版で十分かもしれませんが)
そして、少しだけコードの知識があれば、他の使い方も数多くあります。
「実現したいこと」が明確であれば、AIを活用してコードを組んでもいいでしょう。
以上、ひとりで使う分には、
世の中のツールより自作した方が使いやすいケースもある、という話でした。
もし響くところがあれば、一度試してみてください。
では、また次回。
編集後記
◇日記
昨日は、早朝にラン・メルマガ・YouTube・ブログから。
日中は三男と過ごしつつ、執筆作業を中心に。
次男が発熱して、途中で幼稚園から帰宅。
三男を抱っこ紐しつつ、長男の習い事の送り迎えを。
妻と分担しながら対応し、合間に執筆も。
◇ブログネタ経緯
とても快適になった事例だったので紹介したく。
◇1日1新
PhraseExpressをAutoHotkeyに乗り換え