Macのクリスタでテキスト入力の時にCtrl+FとCtrl+Bが使えないのを何とかする

Macでは、テキストを入力する時だいたいどこでも
Ctrl+F (←)
Ctrl+B (→)
Ctrl+P (↑)
Ctrl+N (↓)
でカーソルを上下左右に動かすことができます。使わない人は全然使わないらしいのですが、一度慣れてしまうとこれが便利でなかなか手放せません。

しかしクリスタでは動かないのです。
まったく動かないなら諦めもつくんだけど、上下はなぜか動く。左右だけ動かないのが納得いきません。まあ……縦書きなので方向キーと違って90度傾いてしまう(Ctrl+NとCtrl+Pで左右に動く)のが中途半端なのですが。

HammerspoonというキーバインドとかいろいろいじれるツールがMacにはあるので、以下はこれを使って何とかしようという話です。

Hammerspoonの設定

Hammerspoon自体のインストールはまあ引っかかるところないと思うのですが、GUIがないので、やりたいことは全部スクリプトで書かないといけません。メニューの「Open Config」から設定ファイル(init.lua)を開いて、以下のようなスクリプトを貼り付けて保存してから「Reload Config」します。

-- init.lua
local function keyRepeat(direction)
  hs.timer.doAfter(0.01, function()
    hs.eventtap.keyStroke({}, direction)
  end)
end

local function createHotkey(key, direction)
  return hs.hotkey.new({'ctrl'}, key, function() keyRepeat(direction) end, nil, function() keyRepeat(direction) end)
end

local bindings = {
  createHotkey('F', 'down'),
  createHotkey('B', 'up')
}

local function processBindings(action)
  for _, binding in pairs(bindings) do
    action(binding)
  end
end

hs.window.filter.new('CLIP STUDIO PAINT')
  :subscribe(hs.window.filter.windowFocused, function() processBindings(function(binding) binding:enable() end) end)
  :subscribe(hs.window.filter.windowUnfocused, function() processBindings(function(binding) binding:disable() end) end)

問題点

  • 設定ファイルが反映されるまで時間がかかることがあります。
    2〜3分したら何もしてないのに動くようになる。
    何が起こっているのか正直サッパリわからない。

  • 縦書きのテキストにしか効きません!
    スクリプトの途中の
    「'down' を 'right' 」「'up' を 'left'」に書き換えれば
    横書きに効くようになる(ダイアログやメニューのTextboxにも効くようになる)のですが、縦横両方に対応させる方法はたぶん無いのではないかと。
     ChatGPTさんに相談してみました。詳細は追記にて。

  • Ctrl+AとかCtrl+Eとかは諦めましょう

HammerSpoon自体は他にもいろいろ機能豊富なので、アイデア次第で作業の効率化に使えるかもしれません。

「これで困ってる」という人に今まで会ったことがないので、もしかしたら僕の環境だけ異常で、他では普通に動いているのかもしれません。
あるいは、簡単に直せる方法があるのに気づいていないだけなのか。
詳しい人いたら教えてください!

セルシスの人にも届け!困ってます!

追記:
横書きのテキストでもCtrl+FとCtrl+Bを
使えるようにする方法

入力中のテキストが縦書きなのか横書きなのかクリスタの外から知る方法はありません。縦横両方に対応することは原理的に不可能なのですが……
ChatGPTさんに相談して、Ctrl+Tを押すたびに縦書きモードと横書きモードが切り替わるようにしてみました。ChatGPT万歳。

init.luaを開いて、上で紹介したスクリプトの代わりに以下のスクリプトをコピペすると、ctrl+Tを押すたびに縦書き用と横書き用が切り替わるようになります。「現在どちらのモードか」をメニューバーに表示する機能も追加しました。

-- init.lua 
-- 改良版
local menubar = hs.menubar.new()

local function keyRepeat(direction)
  hs.timer.doAfter(0.01, function()
    hs.eventtap.keyStroke({}, direction)
  end)
end

local function createHotkey(key, direction)
  return hs.hotkey.new({'ctrl'}, key, function() keyRepeat(direction) end, nil, function() keyRepeat(direction) end)
end

local verticalBindings = {
  createHotkey('F', 'down'),
  createHotkey('B', 'up')
}

local horizontalBindings = {
  createHotkey('F', 'right'),
  createHotkey('B', 'left')
}

-- 初期状態は縦書きモード
local activeBindings = verticalBindings

local function disableBindings(bindings)
  for _, binding in pairs(bindings) do
    binding:disable()
  end
end

local function enableBindings(bindings)
  for _, binding in pairs(bindings) do
    binding:enable()
  end
end

local function updateMenubar()
  if hs.window.focusedWindow():application():name() == 'CLIP STUDIO PAINT' then
    if activeBindings == verticalBindings then
      menubar:setTitle("縦↕︎")
    else
      menubar:setTitle("横↔︎")
    end
  else
    menubar:setTitle("")
  end
end

-- バインディングの切り替え
local switchBinding = hs.hotkey.new({"ctrl"}, "T", function()
  -- 現在のバインディングを無効化
  disableBindings(activeBindings)
  -- バインディングを切り替え
  if activeBindings == verticalBindings then
    activeBindings = horizontalBindings
  else
    activeBindings = verticalBindings
  end
  -- 新しいバインディングを有効化
  enableBindings(activeBindings)
  -- メニューバーの更新
  updateMenubar()
end)

hs.window.filter.new('CLIP STUDIO PAINT')
  :subscribe(hs.window.filter.windowFocused, function()
    enableBindings(activeBindings)
    switchBinding:enable()
    updateMenubar()
  end)
  :subscribe(hs.window.filter.windowUnfocused, function() 
    disableBindings(activeBindings)
    switchBinding:disable()
    updateMenubar()
  end)

updateMenubar()  -- 初期状態の表示を更新

これでクリスタでもCtrl+FとCtrl+Bを使ってカーソルを上下に(横書きモードの時は左右に)動かせるようになります。

どうもまだバグが残ってる気がするのですが……自分以外に誰か使う人がいるようなら直しますね。気軽に声かけてください!

この記事が気に入ったらサポートをしてみませんか?