Cho phép Terminal.app chuyển tổ hợp phím dựa trên phím lệnh cho các chương trình đầu cuối


4

Tôi muốn cho phép các chương trình chạy trong thiết bị đầu cuối khả năng diễn giải phím tắt Cmd+ S

Tôi đã ánh xạ lại ràng buộc mặc định của Thiết bị đầu cuối từ Cmd+ Sđến Ctrl+ Sthông qua Tùy chọn hệ thống bàn phím trong OS X Lion, do đó, điều này đã ngăn chính Ứng dụng Terminal giải thích việc nhấn phím đó, ví dụ như hộp thoại lưu không còn xuất hiện khi nhấn Cmd+ S. Tuy nhiên, một cái gì đó vẫn đang lấy đầu vào chính trước khi bất kỳ chương trình thiết bị đầu cuối nào có thể.

Ví dụ: khi chạy bash gõ Cmd+ Strong thiết bị đầu cuối X11.app dẫn đến:

$s

được in ra màn hình.

Khi tôi thực hiện tương tự Cmd+ Strong Terminal.app, không có gì được in và HĐH phát ra Âm thanh Lỗi. Tôi không thực sự chắc chắn lý do tại sao tổ hợp phím không chuyển đến thiết bị đầu cuối như mong đợi, làm cách nào để tôi cho phép Cmd+ Svượt qua.

Để biết thêm thông tin về những gì / tại sao tôi đang cố gắng làm điều này, hãy xem câu hỏi Bind <Cmd-S> trong Vim

Câu trả lời:


2

Tôi có mong muốn tương tự như của bạn. Tôi đã giải quyết nó bằng cách sử dụng liên kết lại khóa sửa đổi cấp hệ thống.

(Tất nhiên, đây là một mớ hỗn độn; nhưng tôi thấy nó đáng để duy trì sự điều khiển lai MacVim do tôi điều khiển (lưu, mới, sao chép, dán) trong dòng lệnh vim.)

Đây là cách tôi đã làm:

  1. Cài đặt Karabiner , đây là một chương trình rất , rất mạnh mẽ (và là một phần thiết yếu của bất kỳ cài đặt OS X nào của nhà lập trình / nhà lập trình, IMHO)
  2. Kích hoạt tính năng “Command_L để Control_L (chỉ trong Terminal)” :

  3. Các điều khiển được ánh xạ kết hợp phù hợp với bất kỳ lệnh MacVim nào bạn sử dụng nhiều nhất trong dòng lệnh vim. Ví dụ, để hỗ trợ ⌘S,

    noremap  <silent> <C-S>    :update<CR>
    vnoremap <silent> <C-S>    <C-C>:update<CR>
    inoremap <silent> <C-S>    <C-O>:update<CR>
    
  4. Khôi phục hậu quả mong đợi cho chính Terminal.app, bằng cách đặt chúng đặc biệt vào Tùy chọn hệ thống. Ví dụ: nếu bạn muốn ⌘Nvẫn kiểm soát các tab Terminal, thay vì ánh xạ nó vào vimtệp, hãy thử:

    Bây giờ, bất cứ điều gì bạn không thêm vào danh sách này, sẽ được chuyển qua nguyên văn cho dòng lệnh vim(và tất nhiên, bất kỳ chương trình dòng lệnh nào khác mà bạn sử dụng.)


Hãy cẩn thận

Cách tiếp cận này có một số nhược điểm tinh tế hơn nữa , mà tôi muốn làm mờ mắt cho bất cứ ai xem xét việc sử dụng nó (như tôi làm):

  • ⌘␣sẽ không còn ánh xạ tới Spotlight trên toàn hệ thống. (Tôi có một vấn đề mở về Karabiner và sẽ quay lại đây sau khi tôi có giải pháp ngăn chặn.)
  • Vì những lý do tôi không thể xác định được, ngay cả với các ⌃Wloại trừ được thiết lập trong Tùy chọn hệ thống, hành vi đóng tab của Terminal.app thay đổi với thiết lập này: ⌘Wsẽ đóng các tab riêng lẻ trong một cửa sổ; nhưng nếu tab hiện tại là tab cuối cùng , nó sẽ không đóng cửa sổ. Thay vào đó, nó không có tác dụng. Tôi đã phải tự đào tạo lại để sử dụng ⇧⌘Wđể đóng cửa sổ nếu chỉ còn một tab.
  • Nếu bạn đã tự đào tạo để sử dụng ⌃Vtrong MacVim để thực hiện lựa chọn theo khối, thì bạn sẽ phải tự đào tạo lại để sử dụng giải pháp thay thế , ⌃Q(hoặc, ngay bây giờ, ⌘Q). Ngoài ra, bạn sẽ phải thêm stty -ixon vào tập lệnh khởi động của shell của mình, như ⌃Qđược sử dụng theo mặc định để tạo thành một chức năng kiểm soát shell cổ xưa (một chức năng không sử dụng hiện đại.)

⌘WHành vi thay thế

Ngoài những điều trên, tôi quyết định ghi đè thêm ⌘Wdưới dạng khóa 'đóng cái này' phổ quát, áp dụng cho nhiều ứng dụng.

Thay vì ánh xạ ⌘Wtới 'Đóng Tab,' như trên; Cá nhân tôi ánh xạ tới ⇧⌘W(để giữ lại ngay lập tức đóng tab ngữ nghĩa này.) Sau đó, trong bất kỳ chương trình cụ thể nào, tôi ánh xạ ⌃Wtới một số chức năng gần như tiết kiệm.

Chẳng hạn, trong .vimrc:

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

Cẩu hay của tôi .zshrc:

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

Với hai đoạn mã đó, và Terminal của bạn được định cấu hình thành 'Đóng nếu shell thoát ra một cách sạch sẽ', một loạt ⌘Ws trước tiên sẽ thoát vim và sau đó đóng hoàn toàn vỏ.

Ngoài ra, giờ đây, chức năng xuất cảnh bổ sung của các chương trình có thể được giữ nguyên: ví dụ, vimsẽ hỏi trước khi thoát nếu các tệp không được lưu (giống như MacVim); và zshsẽ hỏi trước khi bỏ việc nếu có công việc nền.


Postcript: Không liên quan trực tiếp đến câu hỏi của bạn; nhưng bạn cũng nên kiểm tra 'Chế độ Vim Ubiquitous' trong Karabiner. Đó là một chút nhiều cho tôi sử dụng hàng ngày, nhưng đó là một ý tưởng rất hay và được thực hiện tốt.


Đây là một Karabiner private.xmlđể loại trừ: github.com/tekezo/Files/blob/master/Karabiner/ợi
ELLIOTTCABLE 19/2/2015

0

không chắc chắn nếu điều này áp dụng, nhưng sttysử dụng ctrl-s để dừng thiết bị đầu cuối cho đến khi được khởi động lại với ctrl-q. Tôi sẽ hơi lúng túng về việc gửi ctrl-s đến một thiết bị đầu cuối.


Tôi đã thử điều này và dường như nó không có tác dụng gì khi tôi thêm nó vào mt .bashrc, một phiên bản sửa đổi một chút của những gì được chỉ ra ở đây vim.wikia.com/wiki/Map_Ctrl-S_to_save_cản_or_new_files
MrDaniel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.