
這個「重音符號選單」在英文輸入法的狀態下是預設開啟的,而且系統偏好設定中,完全沒有圖形界面開關可以把它關掉。(我覺得這是一個蠢設計)
mac 在英打模式下,長按某個英文字母,就會跳出一個「重音符號」選單。對於需要輸入特殊重音字母的人很方便,但如果要用鍵盤來操作遊戲或進行持續性的快速輸入時,這個奇怪的設計就會變得非常干擾。
舉例來說,我偶爾會在 Mac 上玩 OpenEmu 或 PPSSPP,常用 W、S、A、D 當作遊戲操作鍵。偏偏這時候只要長按,就會一直彈出「重音符號」清單,讓遊戲體驗大打折扣。
由於 vocus 的程式碼區塊並沒有 Bash 或是 Shell 這種語法的選項,所以以下我會把程式碼區塊的 Syntax 指定成 Python,這樣會顯示比較正常。
修改 accent menu 彈出選項(全域設定)
這個「重音符號」功能的正式名稱叫 accent menu,是從 OS X Lion(10.7) 開始引入的。它沒有內建的快速關閉方式,唯一能調整的方法就是透過終端機指令。
要關閉它,只需要輸入:
defaults write -g ApplePressAndHoldEnabled -bool false
重新登入後,「accent menu」就會停用。
如果想恢復,只要改成:
defaults write -g ApplePressAndHoldEnabled -bool true
這個設定是 全域生效,所以必須重新登入電腦才會套用。
可以針對特定 App 關掉嗎?
如果只是少數 App 需要關閉,那就沒必要全域停用,可以針對 App 單獨設定:
defaults write [app-bundle-id] ApplePressAndHoldEnabled -bool false
例如只想關掉 OpenEmu 的 accent menu,OpenEmu 的 bundle id 是 org.openemu.OpenEmu,所以輸入:
defaults write org.openemu.OpenEmu ApplePressAndHoldEnabled -bool false
重新啟動 App 後,設定就會生效。以後在 OpenEmu 裡玩遊戲,就不會再跳出這個選單。
如何查詢 app-bundle-id
假設要查詢 Safari 的 bundle id,可以用 AppleScript:
osascript -e 'id of app "Safari"'
輸出結果會顯示:
com.apple.Safari
自製 accent menu 管理指令

我自己還寫了一支小工具 presshold_manager_v0.1b.sh,方便管理這個功能。
要如何使用?把程式拷貝下來之後,請存成 .sh 的文件格式(例如:presshold_manager_v0.1b.sh),並用 chmod +x presshold_manager_v0.1b.sh
來為該程式賦予執行權即可。
程式碼如下
#!/usr/bin/env bash
# presshold_manager_v0.1b.sh
# Copyright (C) 2022 alrin
# 用法:
# 全域設定「./presshold-cli.sh」
# 用 App 設定「./presshold-cli.sh /Applications/Safari.app」
# 用 bundle id 設定「./presshold-cli.sh org.openemu.OpenEmu」
set -euo pipefail
TARGET="${1:-}"
# 取得 bundle id(傳 .app 路徑就用 mdls;否則視為已是 bundle id)
get_bundle_id() {
local t="$1"
if [[ -d "$t" && "$t" == *.app ]]; then
mdls -name kMDItemCFBundleIdentifier -r "$t"
else
echo "$t"
fi
}
# 將 defaults 讀出結果正規化為 "1"/"0"/""(空字串=未設定)
normalize_bool() {
case "${1:-}" in
1|true|TRUE|YES|yes) echo 1;;
0|false|FALSE|NO|no) echo 0;;
*) echo "";;
esac
}
# 把 global 的值轉成可讀字串(開啟 / 關閉 / 系統預設=開啟)
label_global_state() {
local gv="$1"
if [[ "$gv" == "1" ]]; then
echo "開啟"
elif [[ "$gv" == "0" ]]; then
echo "關閉"
else
echo "系統預設=開啟"
fi
}
# 顯示全域狀態
show_global_status() {
local raw val
raw=$(defaults read -g ApplePressAndHoldEnabled 2>/dev/null || true)
val=$(normalize_bool "$raw")
echo "全域:accent menu = $(label_global_state "$val")"
}
# 顯示 App 狀態(含全域)
show_app_status() {
local bid="$1"
local app_raw app_val global_raw global_val
app_raw=$(defaults read "$bid" ApplePressAndHoldEnabled 2>/dev/null || true)
app_val=$(normalize_bool "$app_raw")
global_raw=$(defaults read -g ApplePressAndHoldEnabled 2>/dev/null || true)
global_val=$(normalize_bool "$global_raw")
if [[ -n "$app_val" ]]; then
# App 有自訂
if [[ "$app_val" == "1" ]]; then
echo "這個 App:accent menu = 開啟(自訂),全域 = $(label_global_state "$global_val")"
else
echo "這個 App:accent menu = 關閉(自訂),全域 = $(label_global_state "$global_val")"
fi
else
# App 沒自訂 → 看全域
if [[ -n "$global_val" ]]; then
if [[ "$global_val" == "1" ]]; then
echo "這個 App:沒有自訂 → 使用全域 = 開啟"
else
echo "這個 App:沒有自訂 → 使用全域 = 關閉"
fi
else
echo "這個 App:沒有自訂 → 使用系統預設 = 開啟"
fi
fi
}
# 取得顯示名稱
get_app_name() {
local t="$1"
if [[ -d "$t" && "$t" == *.app ]]; then
basename "$t" .app
else
echo "$t"
fi
}
# -------------------- 主流程 --------------------
if [[ -z "$TARGET" ]]; then
# ===== 全域模式 =====
echo "=== 目標:全域設定 ==="
show_global_status
echo
read -r -p "要把 accent menu 設為 [e=開啟 / d=關閉 / r=移除設定 / c=不變更] ? " ans
case "$ans" in
e|E)
if defaults write -g ApplePressAndHoldEnabled -bool true; then
echo "✅ 已設定全域:accent menu = 開啟"
else
echo "❌ 設定失敗(全域:開啟)"
fi
;;
d|D)
if defaults write -g ApplePressAndHoldEnabled -bool false; then
echo "✅ 已設定全域:accent menu = 關閉"
else
echo "❌ 設定失敗(全域:關閉)"
fi
;;
r|R)
if defaults delete -g ApplePressAndHoldEnabled 2>/dev/null; then
echo "✅ 已移除全域設定,回到系統預設:accent menu = 開啟"
else
echo "ℹ️ 沒有可移除的全域設定"
fi
;;
c|C)
echo "(不變更)"
;;
*)
echo "❓ 無效選項,未變更"
;;
esac
else
# ===== App 模式 =====
BID="$(get_bundle_id "$TARGET")"
if [[ -z "$BID" ]]; then
echo "❌ 無法取得 bundle id;請確認參數是 .app 路徑或正確的 bundle id"
exit 1
fi
APP_NAME="$(get_app_name "$TARGET")"
echo "=== 目標 App:$APP_NAME ==="
echo "Bundle ID:$BID"
show_app_status "$BID"
echo
read -r -p "要把 accent menu 設為 [e=開啟 / d=關閉 / r=移除自訂 / c=不變更] ? " ans
case "$ans" in
e|E)
if defaults write "$BID" ApplePressAndHoldEnabled -bool true; then
echo "✅ 已設定:accent menu = 開啟(自訂)"
else
echo "❌ 設定失敗(開啟)"
fi
;;
d|D)
if defaults write "$BID" ApplePressAndHoldEnabled -bool false; then
echo "✅ 已設定:accent menu = 關閉(自訂)"
else
echo "❌ 設定失敗(關閉)"
fi
;;
r|R)
if defaults delete "$BID" ApplePressAndHoldEnabled 2>/dev/null; then
echo "✅ 已移除自訂值,將跟隨全域/系統預設"
else
echo "ℹ️ 沒有可移除的自訂值"
fi
;;
c|C)
echo "(不變更)"
;;
*)
echo "❓ 無效選項,未變更"
;;
esac
fi
指令特別說明
這支指令的特性如下:
- 雙響執行:直接套用到全域設定
- 指定 App:就是用終端機去執行它,例如 ./presshold_manager_v0.1b.sh <App名稱>,這時候就只會影響該 App
- 優先權:如果同時設定過全域與 App,則以 App 為優先
- 執行時顯示目前狀態
- 鍵盤代號操作:輸入選項即可快速切換
- e = 開啟
- d = 關閉
- r = 移除設定
- c = 不變更
各別設定和全域設定的使用時機
像我平常很少需要重音符號,所以我在全域設定上選擇關閉,但在一些文字編輯、排版軟體裡,則會針對 App 單獨開啟。這樣就能兼顧日常使用與文字工作,避免一直被干擾。
像是需要編輯工作的 InDesign、Sublime、VSCode、Word、Typora……這些文書工具就可以單獨指定開啟,這樣設定一次之後,以後就一勞永逸了~玩著模擬器的格鬥遊戲畫面就不會一直跳出重音符號的選單。
關於我寫的程式
我沒有對程式有任何的版權註記(以後也許會做),這邊是無償提供的,你們可以散播出去分享給別人,但是希望大家在拷貝走的時候不要把我上面著作者的資訊移除,請尊重我的創作,這樣的正向循環也讓我可以繼續為大家寫一些方便的小程式。
如果這個程式真的有幫到你,歡迎你直接贊助我(贊助設定很快會設定好,你願意請我喝一杯咖啡我也會很感激!)