Izinkan Terminal.app untuk meneruskan penekanan tombol berbasis perintah ke program terminal

3

Saya ingin memungkinkan program yang berjalan di terminal kemampuan untuk menafsirkan jalan pintas keyboard Cmd + S

Saya telah Memetakan kembali ikatan standar Terminal ' Cmd + S untuk Ctrl + S melalui Preferensi Sistem Papan Ketik di OS X Lion, jadi ini telah menghentikan Aplikasi Terminal itu sendiri untuk mengartikan penekanan tombol itu, mis. dialog simpan tidak lagi muncul saat menekan Cmd + S . Namun ada sesuatu yang masih mengambil input kunci sebelum program terminal dapat.

Misalnya saat menjalankan bash typing Cmd + S di terminal X11.app menghasilkan:

$s

sedang dicetak ke layar.

Ketika saya melakukan hal yang sama Cmd + S di Terminal.app tidak ada yang dicetak dan OS memainkan Suara Kesalahan. Saya tidak begitu yakin mengapa keystroke tidak sampai ke terminal seperti yang diharapkan, bagaimana saya mengizinkannya Cmd + S untuk melewati

Untuk informasi lebih lanjut tentang apa / mengapa saya mencoba melakukan ini lihat pertanyaan Bind & lt; Cmd-S & gt; di Vim

MrDaniel
sumber

Jawaban:

2

Saya memiliki keinginan yang serupa dengan keinginan Anda. Saya menyelesaikannya dengan menggunakan pengikat-kunci pengubah tingkat sistem.

(Tentu saja, ini berantakan; tapi saya merasa layak untuk mempertahankan hibrida kontrol OS-terlatih MacVim saya (simpan, baru, salin, tempel) dalam baris perintah vim s.)

Begini cara saya melakukannya:

  1. Memasang Karabiner , yang mana sangat , program yang sangat kuat (dan bagian penting dari instalasi OS X setiap poweruser / programmer, IMHO)
  2. Memungkinkan “Command_L to Control_L (hanya di Terminal)” :

  3. Peta Kontrol -prefixed cocok dengan perintah MacVim mana pun yang paling sering Anda gunakan di baris perintah vim. Misalnya, untuk mendukung ⌘S ,

    noremap  <silent> <C-S>    :update<CR>
    vnoremap <silent> <C-S>    <C-C>:update<CR>
    inoremap <silent> <C-S>    <C-O>:update<CR>
    
  4. Kembalikan yang diharapkan -Alamat untuk Terminal.app sendiri, dengan casing khusus di System Preferences. Misalnya, jika Anda mau ⌘N untuk tetap mengontrol tab Terminal, alih-alih memetakannya ke vim file, coba:

    Sekarang, apapun kamu jangan tambahkan dalam daftar ini, akan melewati kata demi kata ke baris perintah vim (dan, tentu saja, program baris perintah apa pun yang Anda gunakan.)


Peringatan

Pendekatan ini ada beberapa lebih lanjut kerugian halus, yang ingin saya sorot bagi siapa pun yang mempertimbangkan untuk mengambilnya (seperti yang saya lakukan):

  • ⌘␣ tidak akan lagi memetakan ke Spotlight seluruh sistem. (Saya punya masalah terbuka pada Karabiner, dan akan kembali ke sini setelah saya memiliki solusi sementara.)
  • Untuk alasan saya tidak dapat memastikan, bahkan dengan ⌃W pengecualian yang diatur dalam System Preferences, perilaku penutupan terminal Terminal.app berubah dengan pengaturan ini: ⌘W akan menutup masing-masing tab di jendela; tetapi jika tab saat ini adalah terakhir tab, itu akan tidak menutup jendela. Sebaliknya, itu tidak berpengaruh. Saya harus melatih diri untuk menggunakannya ⇧⌘W untuk menutup jendela jika hanya ada satu tab yang tersisa.
  • Jika Anda sudah melatih diri untuk menggunakannya ⌃V di MacVim untuk melakukan pemilihan blok-bijaksana, maka Anda harus melatih diri sendiri untuk menggunakan alternatifnya , ⌃Q (atau sekarang, ⌘Q ). Selain itu, Anda harus menambahkan stty -ixon di skrip startup shell Anda, sebagai ⌃Q dikonsumsi secara default untuk melakukan fungsi kontrol shell kuno (yang tanpa penggunaan modern).

Alternatif ⌘W tingkah laku

Selain hal di atas, saya memutuskan untuk menimpanya lebih jauh ⌘W sebagai kunci universal ‘tutup ini’, berlaku untuk beberapa aplikasi.

Alih-alih pemetaan ⌘W ke ‘Tutup Tab,’ seperti di atas; Saya pribadi memetakannya untuk ⇧⌘W (untuk mempertahankan semantik "segera tutup tab ini".) Kemudian, dalam program apa pun, saya memetakan ⌃W untuk semacam fungsi tutup-simpan-keluar.

Misalnya, di .vimrc:

noremap  <C-W>    :confirm quit<CR>
vnoremap <C-W>    <C-C>:confirm quit<CR>
inoremap <C-W>    <C-O>:confirm quit<CR>

… Atau saya .zshrc:

function close_tab { exit }
zle -N close_tab_widget close_tab
bindkey           '' close_tab_widget
bindkey -M vicmd  '' close_tab_widget

Dengan dua potongan itu di tempatnya, dan Terminal Anda dikonfigurasi untuk to Tutup jika shell keluar dengan bersih, 'serangkaian ⌘W s pertama-tama akan keluar dari vim, dan kemudian menutup shell seluruhnya.

Selain itu, sekarang fungsionalitas tambahan saat keluar dari program dapat dipertahankan: misalnya, vim akan bertanya sebelum berhenti jika file tidak disimpan (seperti MacVim); dan zsh akan bertanya sebelum berhenti jika ada pekerjaan latar belakang.


Nota bene: Tidak langsung terkait dengan pertanyaan Anda; tetapi Anda juga harus memeriksa Mode Mode Vim Ubiquitous ’di Karabiner. Ini “sedikit banyak” bagi saya untuk digunakan setiap hari, tetapi itu adalah ide yang sangat keren, dan secara mengejutkan diterapkan dengan baik.

ELLIOTTCABLE
sumber
Ini Karabiner private.xml untuk mengecualikan ⌘␣: github.com/tekezo/Files/blob/master/Karabiner/…
ELLIOTTCABLE
0

tidak yakin apakah ini berlaku, tetapi stty menggunakan ctrl-s untuk menghentikan terminal sampai dimulai kembali dengan ctrl-q. Saya akan sedikit curiga tentang mengirim ctrl-s ke terminal.

glenn jackman
sumber
Saya mencoba ini dan tampaknya tidak berpengaruh ketika saya menambahkannya ke mt .bashrc, versi yang sedikit dimodifikasi dari apa yang ditunjukkan di sini vim.wikia.com/wiki/Map_Ctrl-S_to_save_current_or_new_files
MrDaniel