Cara memindahkan kata kursor per kata di OS X Terminal

762

Saya tahu kombinasi Ctrl+ Auntuk melompat ke awal perintah saat ini, dan Ctrl+ Euntuk melompat ke akhir.

Tetapi apakah ada cara untuk melompati kata demi kata, seperti Alt+ / dalam aplikasi Kakao?

Manusia Timah
sumber
2
Shell apa yang Anda gunakan? Pesta?
Sargun Dhillon
4
iTerm2 jauh lebih bagus daripada terminal bawaan. Saya memposting instruksi di bawah ini tentang cara menyesuaikan keyboard :)
cwd
21
The ALTpintas telah ditambahkan ke Terminal dalam versi OS X terbaru.
Mosty Mostacho
7
Menurut saya ini bukan topik, Bash shell adalah lingkungan pemrograman yang relevan, dan binding readline meresap di sebagian besar aplikasi Linux CLI yang populer. Juga, lihat jumlah upvotes, komunitas telah berbicara.
GL2014
11
Buka kembali suara, OS X Terminal sangat penting sebagai alat pemrograman.
djechlin

Jawaban:

567

Di luar kotak Anda dapat menggunakan Esc+ cukup aneh Funtuk pindah ke awal kata berikutnya dan Esc+ Buntuk pindah ke awal kata saat ini.

Kristian J.
sumber
47
Tidak nyaman untuk menekan kembali kedua tombol untuk menjalankan kembali perintah. Saya merasa lumpuh untuk melakukan ini di Terminal Mac OSX, dibandingkan dengan Terminal GNOME.
Phương Nguyễn
245
Anda dapat mengaktifkan "Gunakan Opsi sebagai kunci meta" di Terminal> Preferensi> Pengaturan> [profil]> Keyboard . Maka Anda tidak perlu mengetikkan Esc secara terpisah.
Chris Halaman
7
Juga jika Anda menekan Esc+ Fketika di akhir baris atau kombo tombol lain di awal baris, itu hanya memasukkan huruf saja. Mengganggu!
Noldorin
10
Re “aneh”: “F” dan “B” berarti “Maju” dan “Kembali”. Control-F memindahkan kursor ke depan satu karakter, dan Control-B memindahkan kursor ke belakang satu karakter. Menggunakan Meta modifier (atau ESC) berarti "bergerak dengan kata-kata". Ini adalah binding yang kompatibel dengan emacs. Jika Anda menggunakan bash, ada opsi untuk menggunakan binding yang kompatibel vi, atau Anda dapat menyesuaikan sepenuhnya dengan bash ~/.inputrc.
Chris Page
5
Sayangnya, menggunakan opsi sebagai meta bukan pilihan bagi kita yang membutuhkan kunci opsi untuk mengetikkan simbol shell penting seperti ~ dan | (seperti pada keyboard Prancis).
Eric O Lebigot
417

Di Mac OS X - pintasan keyboard berikut berfungsi secara default. Perhatikan bahwa Anda harus membuat tombol Opsi berfungsi seperti Meta di Terminal preferensi (di bawah tab keyboard)

  • alt (⌥)+ Funtuk melompat F orward dengan satu kata
  • alt (⌥)+ Buntuk melompat B ackward dengan satu kata

Saya telah mengamati bahwa binding kunci emacs default untuk navigasi teks sederhana tampaknya berfungsi pada shell bash. Kamu bisa menggunakan

  • alt (⌥)+ Duntuk menghapus kata yang dimulai dari posisi kursor saat ini
  • ctrl+ Auntuk melompat ke awal baris
  • ctrl+ Euntuk melompat ke ujung garis
  • ctrl+ Kuntuk membunuh garis mulai dari posisi kursor
  • ctrl+ Yuntuk menempelkan teks dari buffer kill
  • ctrl+ Runtuk membalikkan pencarian untuk perintah yang Anda ketik di masa lalu dari riwayat Anda
  • ctrl+ Suntuk meneruskan pencarian (berfungsi di zsh untuk saya tetapi tidak dengan bash)
  • ctrl+ Funtuk bergerak maju dengan char
  • ctrl+ Buntuk bergerak mundur menggunakan arang
  • ctrl+ Wuntuk menghapus kata mundur dari posisi kursor
Varun Katta
sumber
1
Terima kasih! Saya bertanya-tanya mengapa itu tidak berhasil, itulah yang saya butuhkan.
Flov
11
Anda dapat mengubah meta di iterm2 sebagai berikut: Preferensi -> Profil -> Tombol -> Tombol opsi kiri bertindak sebagai +ESC, maka Anda dapat menggunakan OPSI f / b untuk memindahkan kata maju dan mundur sesuai. Lebih banyak
Alan Dong
5
[ Ctrl + W ] - untuk menghapus kata mundur dari posisi kursor
YemSalat
[ctrl + u] - untuk menghapus seluruh entri
Cornelius
286

Begini caranya

Secara default, Terminal memiliki pintasan ini untuk memindahkan (kiri dan kanan) kata demi kata:

  • esc+ B(kiri)
  • esc+ F(kanan)

Anda dapat mengonfigurasi alt+ dan membuat urutan itu untuk Anda:

  • Buka preferensi Terminal ( cmd+ ,);
  • Pada tab Pengaturan, pilih Keyboard dan klik dua kali ⌥ ←jika ada, atau tambahkan jika tidak.
  • Atur pengubah seperti yang diinginkan, dan ketik tombol pintas di dalam kotak: esc+ B, menghasilkan teks \033b(Anda tidak dapat mengetik teks ini secara manual).
  • Ulangi untuk kata-kanan ( esc+ Fmenjadi \033f)

Atau, Anda dapat merujuk ke posting blog ini di textmate:

http://blog.macromates.com/2006/word-movement-in-terminal/

Fil
sumber
7
Untuk pengguna MacOSX 10+ dan iTerm: Anda menetapkan pintasan tombol pada preferensi global atau sebagai kombinasi tombol profil. Pastikan Anda memilih: "Kirim Escape Sequence" pada dropdown pilih dan masukan hanya Buntuk kembali atau Funtuk meneruskan ke Esc+lapangan
Gus
+1 untuk mnemonik hebat yang tidak saya pikirkan sebelumnya. Saya pasti / sayangnya tidak akan mengingat ini sekarang karena saya mengkonfigurasi alt leftdan alt rightuntuk menghasilkan urutan
Arc676
Jika saya menambahkan Pemetaan Kunci ke Terminal itu mengikatnya ke '^ [B' bukan Esc-B.
Andrea Bergonzo
164

Beralih ke iTerm2 . Ini gratis dan jauh lebih bagus daripada terminal tua biasa. Juga memiliki lebih banyak opsi untuk penyesuaian, seperti pintasan keyboard.

Saya juga suka bahwa Anda dapat menggunakan cmddan 1-9 untuk beralih antar tab. Cobalah dan Anda tidak akan pernah kembali ke terminal reguler :)

Cara mengatur preferensi papan ketik khusus di iterm2

  • Instal iTerm2
  • Luncurkan dan kemudian pergi ke panel preferensi.
  • Pilih tab profil keyboard
  • Anda harus menyalin profil ke sesuatu yang baru dan kemudian menghapus cara pintas tombol panah seperti ^+ Right/ Leftatau jika Anda tidak peduli tentang cadangan cukup hapus mereka dari profil default.
  • Selanjutnya pastikan profil Anda yang dimodifikasi dipilih (berbintang)

Gambar 1.png

  • Sekarang pilih tab keyboard (baris paling atas)

Ini 2

  • Klik tombol plus untuk menambahkan pintasan keyboard baru
  • Di kotak pertama ketik CMD+Left arrow
  • Di kotak kedua pilih "kirim kode pelarian"
  • Pada kotak ketiga ketikkan hurufnya B

Gambar 2.png

  • Ulangi dengan kombinasi tombol yang diinginkan. escape+ Bmemindahkan satu kata ke kiri, escape+ fmemindahkan satu kata ke kanan.
  • Anda mungkin juga ingin mengatur cmd+ duntuk menghapus kata di depan kursor dengan escape+d

Saya sering menekan tombol yang salah ( cmd/ control/ alt) dengan tombol panah dan jadi saya memiliki kombinasi tombol panah saya dengan tombol-tombol itu semua diatur untuk melompat maju dan mundur kata-kata, tapi tolong lakukan yang paling cocok untuk Anda.

cwd
sumber
4
Apa pun yang saya lakukan, saya tidak bisa masuk Ctrl + Arrow Leftatau Right- Updan Downberfungsi: Saya sudah mencoba dengan dan tanpa profil baru yang ditetapkan sebagai standar
Tobi
4
Solusi: Saya harus menonaktifkan pintasan kontrol misi di bawah Preferensi Sistem MacOS -> Keyboard :)
Tobi
Instruksi di atas tidak lagi berfungsi dengan iTerm2. Silakan lihat jawaban saya di bawah ini untuk iTerm2 Build 3.3.4.
Tunggu
150

Sebenarnya ada pendekatan yang jauh lebih baik. Tahan option( altpada beberapa keyboard) dan tekan tombol panah kiri atau kanan untuk berpindah kata. Sederhana seperti itu.

option
option

Juga ctrleakan membawa Anda ke akhir baris dan ctrlaakan membawa Anda ke awal.

mdubez
sumber
2
Terkadang ini tidak berhasil dalam kasus-kasus tertentu. Bagi saya, ketika saya membuka Terminal.app, itu baik-baik saja, tetapi untuk IntelliJ, hanya dicetak [Ddan [C. Untuk memperbaikinya, tambahkan bind '"[D": backward-word'dan bind '"[C": forward-word'ke .bashrc.
Jamie Counsell
@JamieCounsell saya menambahkan mengikat ke saya .bashrctetapi tidak berhasil, ada yang salah dengan saya? (Saya menggunakan RubyMine)
张艳军
@ 张艳军 Saya tidak yakin apakah RubyMine membaca .bashrcketika terminal melakukan booting. Coba echo "here"dan lihat apakah pesan itu ditampilkan ketika Anda membuka terminal baru. Anda juga harus menutup dan membuka kembali terminal atau menjalankannya source ~/.bashrcagar dapat membaca file baru.
Jamie Counsell
79

Saya telah Alt+ / berfungsi: buka Preferensi »Pengaturan» Keyboard , atur entri untuk kursor opsi ke kiri untuk mengirim string ke shell: \ 033b , dan atur kursor opsi ke kanan untuk mengirim string ke shell: \ 033f . Anda juga dapat menggunakan ini untuk kombinasi tombol Kontrol lainnya.

Peter Hilton
sumber
20
Untuk mendapatkan \ 033b, Anda harus menekan Esc, lalu b.
Matthew Schinckel
7
Saya menggunakan Snow Leopard dan menemukan bahwa itu hanya berfungsi ketika Anda mengaktifkan Enable option as meta key. Omong-omong, ini sangat keren. Kuncinya pasti jauh lebih nyaman untuk dicapai dibandingkan dengan Esc + B atau Esc + F
Phuyơng Nguyễn
2
Karena penasaran, apa sebenarnya yang terjadi di sini? Mengapa kode ini berbeda dengan OSX? Bagaimana saya bisa menemukan kode lain seperti itu?
Koobz
di mac saya Preferensi> Profil> Tombol tombol pilihan kiri ditetapkan sebagai + Ecs
Arun
38

Sebenarnya itu tergantung pada shell apa yang Anda gunakan, namun sebagian besar shell memiliki binding yang serupa. Binding yang Anda maksud (mis. Ctrl+ ADan Ctrl+ E) adalah bindings yang akan Anda temukan di banyak program lain dan mereka digunakan untuk waktu yang lama, BTW juga berfungsi di sebagian besar aplikasi UI.

Berikut tampilan binding standar untuk Bash:

Shortcut Bash Keyboard Paling Penting

Harap perhatikan juga bahwa Anda dapat menyesuaikannya. Anda perlu membuat file, beri nama sesuai keinginan, saya menamai milik saya .bash_key_bindings dan memasukkannya ke direktori home saya. Di sana Anda dapat mengatur beberapa opsi bash umum dan Anda juga dapat mengatur binding utama. Untuk memastikan mereka diterapkan, Anda perlu memodifikasi file bernama ".bashrc" yang dibaca bash saat start-up (Anda harus membuatnya, jika tidak ada) dan membuat panggilan berikut di sana:

bind -f ~/.bash_key_bindings

~ berarti direktori home dalam bash, seperti yang dinyatakan di atas, Anda dapat memberi nama file sesuai keinginan dan juga menempatkannya di tempat yang Anda suka selama Anda memberi makan jalur + nama yang tepat untuk diikat.

Izinkan saya menunjukkan beberapa cuplikan file .bash_key_bindings saya:

set meta-flag on
set input-meta on
set output-meta on
set convert-meta off
set show-all-if-ambiguous on
set bell-style none
set print-completions-horizontally off

Ini hanya mengatur beberapa opsi (mis. Nonaktifkan bel; ini semua bisa dilihat di halaman web bash).

"A": self-insert
"B": self-insert
"C": self-insert
"D": self-insert
"E": self-insert
"F": self-insert
"G": self-insert
"H": self-insert
"I": self-insert
"J": self-insert

Ini memastikan bahwa karakter saja tidak melakukan apa-apa selain memastikan karakter "diketik" (mereka memasukkan diri ke shell).

"\C-dW": kill-word
"\C-dL": kill-line
"\C-dw": backward-kill-word
"\C-dl": backward-kill-line
"\C-da": kill-line

Ini cukup menarik. Jika saya menekan Ctrl+ Dsendiri (saya memilih d untuk menghapus), tidak ada yang terjadi. Tetapi jika saya kemudian mengetikkan huruf kecil w, kata di sebelah kiri kursor dihapus. Namun, jika saya mengetikkan huruf besar, kata di sebelah kanan kursor terbunuh. Hal yang sama berlaku untuk l dan L mengenai seluruh baris mulai dari kursor. Jika saya mengetikkan "a", seluruh baris sebenarnya dihapus (semuanya sebelum dan sesudah kursor).

Saya menempatkan melompat satu kata ke depan di Ctrl+ Fdan satu kata mundur di Ctrl+B

"\C-f": forward-word
"\C-b": backward-word

Seperti yang Anda lihat, Anda bisa membuat jalan pintas, yang mengarah ke tindakan segera, atau Anda bisa membuat, yang hanya init urutan karakter dan kemudian Anda harus mengetikkan satu (atau lebih) karakter untuk menyebabkan tindakan berlangsung sebagai ditunjukkan dalam contoh lebih lanjut di atas.

Jadi, jika Anda tidak puas dengan binding default, jangan ragu untuk menyesuaikannya sesuka Anda. Berikut tautan ke manual bash untuk informasi lebih lanjut.

Mecki
sumber
bagaimana commandkode kuncinya? Dalam contoh Anda, controlapakah \C, tetapi bagaimana command?
Paschalis
Pada dasarnya saya ingin memetakan Ctrl + A ke cmd + kiri (pergi ke awal baris)
Paschalis
1
@Paschalis Pada MacOS X, tombol perintah memetakan ke Metadalam bash ( \M), cmd + kiri adalah \M-\e[D. Namun, Anda tidak dapat memetakan cmd + ... untuk apa pun, semua pintasan perintah ditangani (dan dengan demikian ditelan) oleh aplikasi Terminal itu sendiri (yang tidak pernah diteruskan ke shell) dan cmd + meninggalkan peta ke "jendela sebelumnya" jika Anda memiliki banyak jendela terminal terbuka. Maaf, itu tidak mungkin dengan aplikasi Terminal.
Mecki
18

Gunakan preset Penyuntingan Teks Alami !

masukkan deskripsi gambar di sini

Pada dasarnya ia mengikat, di antara urutan kunci lainnya, Opsi + LeftArrow ke ^[burutan dan Opsi + RightArrow ke^[f

Ini bekerja di ikan dan bash, serta di terminal psql.

Dziamid
sumber
Ini adalah cara paling efisien untuk menetapkan pemetaan lama yang baik untuk kunci. Terima kasih!
fedesismo
Jika ada orang lain yang bingung seperti saya, perhatikan bahwa prasetel ini hanya tersedia di bawah sub-tab Tombol profil , bukan tab Tombol tingkat atas .
ben-albrecht
15

Jika Anda kebetulan pengguna Vim, Anda bisa mencoba mode vim bash. Jalankan ini atau taruh di ~/.bashrcfile Anda :

set -o vi

Secara default Anda berada dalam mode memasukkan; tekan escape dan Anda dapat bergerak seperti yang Anda bisa dalam mode normal Vim, jadi gerakan demi kata watau b, dan tombol gerakan yang biasa juga berfungsi .

Jches
sumber
15

Jika Anda memeriksa Use option as meta keydi tab keyboard preferensi, maka perintah gaya emacs default untuk kata maju dan mundur dan ⌥F( Alt+ F) dan ⌥B( Alt+ B).

Saya akan merekomendasikan membaca Dari Bash ke Z-Shell . Jika Anda ingin meningkatkan kecakapan bash / zsh Anda!

Mat
sumber
1
Ya, itu berhasil. Tapi masalahnya adalah ketika saya ingin mengetikkan kurung kurawal ([] {} |) yang ada di Opsi-7, Opsi-8 dan Opsi-9. Opsi sekarang adalah meta sehingga berakhir dengan Meta-7, Meta-8 ... Ada ide?
Martin Wickman
12

Pada Mac OS X Lion 10.7, peta Terminal Option- Left/Right Arrowuntuk Esc- b/fsecara default, jadi ini sekarang built-in untuk bash dan lain program yang menggunakan keybindings ini emacs-kompatibel.

Chris Page
sumber
12

Tahan tombol Option dan klik di mana Anda ingin kursor bergerak

Dan Alboteanu
sumber
1
Bukan solusi yang buruk.
duyn9uyen
8

Di Bash, ini terikat ke Esc- Bdan Esc- F. Bash memiliki banyak, lebih banyak pintasan keyboard; lihat output bind -puntuk melihat apa itu.

Andy Lynch
sumber
4

Di bawah iterm2's Preferences> Profil> Keys , Anda klik +di bawah ini Key pemetaan dan merekam shortcut baru. Untuk Aksi , pilih Send Escape Sequencedan ketik batau funtuk belakang dan ke depan masing-masing.

Ketika saya mencoba merekam satu untuk ( Ctrl+ ), saya perhatikan di bidang Shortcut Keyboard bahwa panah tidak pernah muncul. Ternyata saya harus menonaktifkan System Preferences mac default > Keyboard> Shortcuts> Mission Control shorcuts terlebih dahulu untuk mendapatkan sesuatu untuk bekerja, karena mereka akan menimpa pintasan default iterm2 ini. Seharusnya berlaku untuk aplikasi terminal standar juga.

Preferensi sistem keyboard

qix
sumber
1

Jawaban baru untuk pengguna iTerm2 Build 3.3.4:

Langkah 1: (macOS X) System Preferences> Keyboard> tab Shortcuts> Pilih Mission Control (panel kiri)> Hapus centang shortcut yang berlabel "Pindahkan ruang kiri" dan "Pindahkan kanan ruang"

Langkah 2: (iTerm2 Build 3.3.4) Preferensi> Profil> Pilih * Default (panel kiri)> tab Tombol> Hapus entri "⌥->" dan "⌥ <-"> Atur keduanya "Opsi Kiri (⌥) Kunci: "dan" Kunci Opsi Kanan (⌥): "ke Esc +

Tidak main-main dengan profil shell, tidak ada main-main dengan masOS inferior (default) Terminal, tidak canggung Esc + F / B, bilas & ulangi tidak masuk akal.

Kesepakatan selesai !!!

Nikmati tip ini, rekan-rekan PROGRAM saya!

Menggantung
sumber
0

Seperti yang dijawab sebelumnya, Anda dapat menambahkan set -o viAnda ~/.bashrcuntuk menggunakan vi/ vimbinding kunci, atau Anda dapat menambahkan bagian berikut .bashrcuntuk bergerak dengan Ctrldan tombol panah:

# bindings to move 1 word left/right with ctrl+left/right in terminal, just some apple stuff!
bind '"\e[5C": forward-word'
bind '"\e[5D": backward-word'
# bindings to move 1 word left/right with ctrl+left/right in iTerm2, just some apple stuff!
bind '"\e[1;5C": forward-word'
bind '"\e[1;5D": backward-word'

Untuk memulai efek dari baris kode ini, baik source ~/.bashrcatau memulai sesi terminal baru.

Chinmay
sumber