Setup Terminal Claude Code: Shift+Enter, Bel, dan Tema

Dukungannya berbeda per terminal. Ghostty, Kitty, iTerm2, WezTerm, Warp, Apple Terminal, dan Windows Terminal bekerja tanpa setup. VS Code, Cursor, Devin Desktop, Alacritty, dan Zed butuh perintah /terminal-setup dijalankan sekali. gnome-terminal dan IDE JetBrains tidak mendukungnya — pakai Ctrl+J atau backslash diikuti Enter, yang bekerja di mana saja.
Secara default Claude Code mengirim notifikasi desktop hanya di Ghostty, Kitty, dan iTerm2, dan iTerm2 butuh alert serta alert dari escape sequence diaktifkan di setelannya sendiri. Di terminal lain mana pun, setel preferredNotifChannel ke terminal_bell, atau konfigurasikan sebuah Notification hook untuk suara maupun perintah kustom.
Tiga baris di ~/.tmux.conf: allow-passthrough on, extended-keys on, dan fitur terminal extkeys. Baris passthrough membuat notifikasi dan pembaruan progres sampai ke terminal luar alih-alih ditelan tmux, dan baris extended-keys membuat tmux bisa membedakan Shift+Enter dari Enter biasa.
Terminal Anda mengirim kode kontrol yang dibaca Claude Code sebagai tombol hapus kata. Setel CLAUDE_CODE_BS_AS_CTRL_BACKSPACE ke 0 dan baik Backspace maupun Ctrl+H menghapus satu karakter saja. Kalau Anda punya masalah sebaliknya di macOS atau Linux, setel variabel yang sama ke 1.
Simpan sebuah file JSON di ~/.claude/themes/ dengan name opsional, preset base seperti dark atau dark-daltonized, dan peta overrides berisi token warna. Nama file tanpa .json menjadi slug-nya. Token tak dikenal dan nilai tidak valid diabaikan, jadi salah ketik tidak bisa merusak tampilan, dan foldernya diawasi sehingga pengeditan berlaku tanpa restart.

Ringkasan Utama
Claude Code bekerja di terminal mana pun tanpa konfigurasi. Setting di halaman ini ada untuk gejala spesifik: Shift+Enter yang mengirim alih-alih menyisipkan baris baru, shortcut tombol Option yang diam di macOS, tidak adanya peringatan saat Claude selesai, dan Backspace yang menghapus satu kata utuh di Windows. Masing-masing punya perbaikan satu baris.
Saya menghabiskan sepekan menekan Ctrl+J untuk baris baru karena Shift+Enter mengirimkan prompt saya yang masih setengah jadi pada percobaan pertama, dan saya mencatatnya sebagai cara kerja perkakas ini. Bukan begitu. Terminal saya termasuk segelintir yang butuh satu perintah dijalankan sekali, dan perintah itu sejak awal memang tersedia.
Konfigurasi terminal untuk Claude Code bukan tutorial yang Anda kerjakan berurutan, melainkan indeks yang Anda buka ketika ada sesuatu yang berulah. Tulisan ini disusun demikian: masalah baris baru dan terminal mana yang mengalaminya, modifier macOS yang diam-diam mematikan satu set shortcut, notifikasi dan kenapa sebagian besar terminal tidak mendapatnya secara default, tiga baris tmux, tema kustom, dan apa yang terjadi pada paste besar yang Anda panggil dari riwayat berminggu-minggu kemudian.
Enter mengirim. Dua cara menyisipkan baris baru bekerja di mana saja tanpa setup apa pun, dan lebih baik menguasai salah satunya ketimbang bertarung dengan yang ketiga — tetapi yang ketiga itulah yang selalu diraih semua orang, jadi inilah posisinya.
# Enter submits. For a line break WITHOUT submitting:
# Ctrl+J works in every terminal, no setup
# \ then Enter same
# Shift+Enter depends on the terminal
/terminal-setup # writes the Shift+Enter binding into the
# terminal's own config file
# Run it in the HOST terminal, not inside tmux or screen — it
# needs to write to the host terminal's configuration.
#
# In VS Code, Cursor and Devin Desktop it also sets
# terminal.integrated.gpuAcceleration to "off", which prevents
# garbled text in the integrated terminal, and adjusts the
# mouse wheel sensitivity for fullscreen mode.
#
# To swap the behaviour entirely — Enter inserts a newline and
# Shift+Enter submits — map chat:newline and chat:submit in
# your keybindings file instead.Dukungan Shift+Enter per terminal:
| Terminal | Shift+Enter untuk baris baru |
|---|---|
| Ghostty, Kitty, iTerm2, WezTerm, Warp, Apple Terminal, Windows Terminal | Bekerja tanpa setup |
| VS Code, Cursor, Devin Desktop, Alacritty, Zed | Jalankan perintah terminal-setup sekali |
| gnome-terminal, IDE JetBrains seperti PyCharm | Tidak tersedia — pakai Ctrl+J atau backslash lalu Enter |
Beberapa shortcut Claude Code memakai tombol Option — baris baru, model picker, toggle fast mode. Di macOS sebagian besar terminal tidak mengirim Option sebagai modifier secara default, jadi semuanya diam tanpa suara. Settingnya biasanya berlabel gunakan Option sebagai tombol Meta, dengan meta sebagai nama historis Unix untuk tombol yang kini berlabel Option atau Alt.
Apple Terminal menaruhnya di setelan keyboard, iTerm2 menginginkan kedua tombol Option disetel ke mode escape-plus, dan VS Code punya setting editornya sendiri. Kalau Anda menerima prompt setup terminal saat pertama menjalankan Claude Code di Apple Terminal, ini sudah beres — prompt itu menjalankan perintah setup untuk Anda.
Setup pertama di Apple Terminal itu juga mematikan bel audio, yang biasanya memang yang Anda inginkan dan justru keliru kalau Anda memakai screen reader. Claude Code kini membiarkan belnya di screen reader mode, tetapi run dari sebelum v2.1.211 mematikannya tanpa pandang bulu. Kalau bel Anda mendadak senyap dan Anda tidak pernah memilihnya, letaknya di setelan profil lanjutan terminal, bukan di sesuatu yang bisa dikembalikan Claude Code.
Ketika Claude selesai atau berhenti untuk sebuah permission prompt dan Anda tampak sedang pergi, ia memicu event notifikasi. Apa yang terjadi pada event itu sepenuhnya bergantung pada terminal Anda:
Dua hal rusak di bawah tmux secara default, dan keduanya diperbaiki blok pendek yang sama. Layak ditambahkan bahkan kalau Anda hanya sesekali memakai tmux, karena mode gagalnya terlihat seperti bug Claude Code alih-alih konfigurasi multiplexer.
# ~/.tmux.conf — two things break by default under tmux:
# Shift+Enter submits instead of inserting a newline, and
# desktop notifications never reach the outer terminal.
set -g allow-passthrough on
set -s extended-keys on
set -as terminal-features 'xterm*:extkeys'
# Then apply to the running server without restarting it:
# tmux source-file ~/.tmux.conf
# allow-passthrough lets notifications and progress updates
# through instead of being swallowed by tmux.
# The extended-keys lines let tmux tell Shift+Enter apart from
# plain Enter, which is the whole reason the newline shortcut
# does not work under tmux otherwise.Di luar preset bawaan, file JSON apa pun di folder tema menjadi sebuah tema. Isinya sebuah preset dasar dan peta override token warna, dan token yang tidak Anda sebut jatuh kembali ke preset dasarnya. Editor interaktif pada perintah tema menampilkan token yang sama dengan pratinjau langsung, dan itu cara lebih cepat menemukan yang Anda cari ketimbang membaca referensinya.
// ~/.claude/themes/midnight.json
// The filename without .json is the slug; selecting it stores
// custom:<slug> as your theme preference.
{
"name": "Midnight",
"base": "dark",
"overrides": {
"claude": "#a78bfa",
"planMode": "#38bdf8",
"diffAdded": "#14532d",
"diffRemoved": "#7f1d1d",
"userMessageBackground": "#1e1b4b"
}
}
// base: dark | light | dark-daltonized | light-daltonized
// dark-ansi | light-ansi
// Colours: #rrggbb, #rgb, rgb(r,g,b), ansi256(n), or
// ansi:<name> for the 16 standard names.
//
// Unknown tokens and invalid values are IGNORED, so a typo
// cannot break rendering. Claude Code watches the folder and
// reloads on change — but restart once if the folder did not
// exist when the session started.Dua dari presetnya ramah buta warna — satu daltonized gelap dan satu daltonized terang — dan keduanya tersedia sebagai dasar bagi tema Anda sendiri, bukan cuma sebagai preset jadi. Ada juga delapan warna subagent bernama yang bisa Anda timpa, dan begitulah cara membuat agent paralel bisa dibedakan pada palet yang jika tidak akan menyatukan mereka.
Tempel lebih dari 800 karakter atau lebih dari dua baris dan Claude Code melipat inputnya menjadi placeholder supaya kotaknya tetap bisa dipakai. Isi lengkapnya tetap dikirim ketika Anda submit, dan disimpan di paste cache sehingga memanggil ulang prompt itu dari riwayat — bahkan di sesi berikutnya — mengirim isi lengkapnya lagi alih-alih teks placeholder-nya.
Cache itu disapu pada jadwal retensi yang sama seperti isi direktori konfigurasi lainnya, jadi prompt yang dipanggil ulang bisa merujuk teks tempelan yang sudah tidak ada. Claude Code tidak pernah mengirim string placeholder secara harfiah: pada prompt biasa yang masih punya teks lain, ia membuang placeholder-nya dan mengirim sisanya, dan pada perintah shell mode atau slash command, di mana membuangnya akan mengubah apa yang dijalankan, ia membatalkan pengiriman dan meninggalkan teks Anda di input untuk diperbaiki.
Terminal bawaan VS Code bisa menjatuhkan karakter dari paste yang sangat besar bahkan sebelum sampai ke Claude Code, dan itu menghasilkan prompt terpotong yang terlihat seperti masalah Claude Code padahal bukan. Untuk file utuh atau log panjang, tulis isinya ke sebuah file lalu minta Claude membacanya — itu menjaga transkrip tetap terbaca dan membiarkan Claude merujuk path-nya di giliran berikutnya alih-alih membaca ulang dinding teks tempelan.
Ini cukup sering muncul sehingga layak dinyatakan terus terang:
Tidak satu pun dari ini wajib dan semuanya berupa pencarian, dan justru itulah alasan membacanya sekali lebih baik daripada membacanya saat Anda sedang jengkel. Dua perubahan yang akan saya lakukan di mesin baru mana pun adalah perintah terminal-setup, karena ia memperbaiki beberapa hal sekaligus, dan kanal notifikasi, karena bekerja bersama agent jauh lebih enak ketika Anda bisa pergi lalu dipanggil kembali. Selebihnya bisa menunggu sampai benar-benar mengganggu.
Sumber & bacaan lanjutan