Làm cách nào để ánh xạ Ctrl + A và Ctrl + Shift + A?


92

Trong một thiết bị đầu cuối, người ta không thể phân biệt Ctrl+ ACtrl+ Shift+ Avì cả hai đều phát ra cùng một mã khóa, vì vậy tôi có thể hiểu tại sao Vim không thể làm điều đó. Nhưng gVim, là một ứng dụng X, có thể phân biệt Ctrl+ ACtrl+ Shift+ A. Có cách nào để ánh xạ hai thứ đó khác nhau không?

Để bắt đầu, tôi muốn làm điều gì đó như sau: Làm cho "dán từ khay nhớ tạm" hoạt động giống như thiết bị đầu cuối Gnome, trong khi vẫn giữ Ctrl+ Vở chế độ trực quan.

:nmap <C-S-V> "+gP


3
@vivoconunxino Liên kết đó không đề cập đến việc thêm công cụ sửa đổi dịch chuyển vào ctrl-a.
greywh

Câu trả lời:


46

Gvim không làm điều đó vì vim không thể làm điều đó (trong trường hợp bình thường). Xin lỗi, nhưng đó chỉ là cách nó được.


Tuy nhiên...

Một số thiết bị đầu cuối (ví dụ: xterm và iterm2) có thể được cấu hình để gửi một chuỗi thoát tùy ý cho bất kỳ tổ hợp phím nào.

Ví dụ, thêm những điều sau đây để .Xresourcescho xterm để gửi <Esc>[65;5ucho CtrlShiftA. Sau đó, bạn có thể ánh xạ nó trong Vim tới <C-S-a>. (65 là giá trị Unicode thập phân cho shift-a và 5 là bit cho công cụ sửa đổi ctrl. U trong trường hợp này là viết tắt của "unicode".)

! .Xresources
XTerm*vt100.translations: #override Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u")

iTerm và [u] rxvt cũng có thể được định cấu hình để thực hiện việc này (ví dụ không được cung cấp).

Thông tin thêm: http://www.leonerd.org.uk/hacks/fixterms/


Để ánh xạ lại nhiều khóa, hãy xem tài liệu này : Tách các mục nhập khóa với \n. Sử dụng dấu gạch chéo ngược để chia dòng. Ví dụ: để cũng lập bản đồ <kbd> CSB </kbd> và <kbd> CSF </kbd>, hãy sử dụng cái này:XTerm*vt100.translations: #override Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u") \n Ctrl ~Meta Shift <Key>b: string(0x1b) string("[66;5u") \n Ctrl ~Meta Shift <Key>f: string(0x1b) string("[70;5u")
cfi 22/09/15

Vì lợi ích hoàn chỉnh, có thể thêm vào câu trả lời cũng làm thế nào để lập bản đồ này trong vi? Ví dụ: map <ESC>[66;5u :echo "ctrl-shift-b received"<CR>ánh xạ ctrl-shift-b để in thông báo trong dòng trạng thái. Trên AskUbuntu cũng có một Q tương tự và tôi đã tóm tắt điều này.
cfi

Những gì chúng ta cần là một đặc điểm kỹ thuật đầu cuối mới! xterm-256color(gần đây nhất) bị rất nhiều hạn chế.
Jérôme Pouiller

@Jezz Các hạn chế là với bản thân termcap, không phải với tệp termcap xterm-256color.
greywh

@graywh Chắc chắn, các tính năng mới cho termcap là cần thiết
Jérôme Pouiller

9

Như đã chỉ ra, không có cách nào để lập bản đồ <C-S-A>khác với <C-A>.

Tuy nhiên, bằng cách sử dụng các công cụ như autokey(cho linux & windows) hoặc autohotkey(cho windows), bạn có thể bản đồ lại <C-S-A>để gửi (các) phím bấm khác nhau cho các ứng dụng cụ thể.

Ví dụ: Trên hệ thống của tôi, tôi có cài đặt này trong autokey:

$ cat ~/.config/autokey/data/gnome-terminal/ctrlshifta-gnome-terminal.py
#ctrl+shift+a sends '<S-F1>a'
keyboard.send_keys("<shift>+<f1>a") # Note that `f` in `f1` needs to be in lower case.

Gán cho nó các thuộc tính sau:

  1. phím tắt dưới dạng ctrl+shift+a
  2. lớp cửa sổ: gnome-terminal-server.Gnome-terminal

Sau đó, bạn ~/.vimrccó thể tạo ánh xạ <S-F1>ađể làm bất cứ điều gì bạn muốn.


Ghi chú:

  1. Tôi đã sử dụng <S-F1>như một loại chìa khóa lãnh đạo để phát hiện <C-S>. Điều này là do thiết bị đầu cuối của tôi không chấp nhận các khóa <F13>- <F37>vv. Nếu ứng dụng của bạn hỗ trợ nó, ( gvimtôi nghĩ vậy) sử dụng các phím đó được khuyến khích.
  2. Tôi chủ yếu vimvào gnome-terminal. Vì vậy, tôi đã sử dụng window class = gnome-terminal-server.Gnome-terminallàm bộ lọc. Sửa đổi nó để sử dụng gvimnếu bạn muốn. autokeyhỗ trợ một nút để nắm bắt bất kỳ thuộc tính nào khác của cửa sổ như lớp / tiêu đề.

Cảm ơn đống. Có rất nhiều thứ về việc sử dụng Autokey để ánh xạ lại khóa nhưng không có hướng dẫn thực tế về cách thực hiện. Cuối cùng câu trả lời của bạn làm được điều đó. Tôi không thể tin rằng không ai khác đã ủng hộ bạn.
pickle323

1
Chết tiệt! Tôi đã làm mọi thứ có thể nhưng tôi không thể cài đặt nó trên ubuntu 16.04 của mình.
yukashima huksay

apt install autokey-gtk?
anishsane

1
Trước khi cài đặt phần mềm bổ sung, bạn có thể kiểm tra xem trình quản lý cửa sổ của bạn có xử lý trực tiếp việc này hay không. Ví dụ, trong .config i3 tôi có này: bindsym --release Control+Shift+h exec --no-startup-id xdotool key --clearmodifiers comma w m h, mà ép ,wmhkhi tôi bấm <C-S-h>, và sau đó vim biết làm thế nào để xử lý,wmh
MatrixManAtYrService

^^ Điều này cũng tốt. Tuy nhiên, tôi muốn giới hạn dịch khóa chỉ với gnome-terminal hoặc gvim. Không phải các ứng dụng khác. Các ứng dụng khác sẽ tiếp tục nhận được <C-S-H>khi tôi nhấn nút đó.
anishsane

5

Nếu điều gì làm phiền bạn đang mất chức năng CV hiện có, bạn có thể sử dụng CQ thay thế. Xem,: trợ giúp CTRL-V-thay thế.


3

NeoVim hiện cung cấp chức năng này cho cả máy khách thiết bị đầu cuối và máy khách gui. Xem : h nvim-features-new


3
Không hoàn toàn, trừ khi bạn bật mã CSI trong thiết bị đầu cuối của mình. Các tổ hợp phím CTRL-SHIFT biến thể mà Neovim không hỗ trợ ra khỏi hộp chủ yếu là các ký tự không in được (ví dụ liệt kê ở neovim.org/doc/user/vim_diff.html#nvim-features-new ). Tuy nhiên, meta hợp âm (bao gồm cả <m-s-...>các biến thể) làm chủ yếu là làm việc hoàn toàn ra khỏi hộp.
Justin M. Keyes

Tài liệu đó cho biết ALT (|META|) chords always work (even in the |TUI|). Map |<M-| with any key: <M-1>, <M-BS>, <M-Del>, <M-Ins>, <M-/>, <M-\>, <M-Space>, <M-Enter>, etc. Case-sensitive: <M-a> and <M-A> are two different keycodes.Có một dấu ngắt dòng trước phần "Phân biệt chữ hoa chữ thường:", khiến điều này trở nên không rõ ràng. Cảm ơn vì sự chỉnh sửa, @ JustinM.Keyes. Ngoài ra, vim 8.1 dường như cũng phân biệt giữa <M-a><M-A>.
Adam Katz

@ justin-m-keyes <c-s-l>được phân biệt hoàn hảo với bên <c-l>trong Konsolemà không gặp bất kỳ rắc rối nào
Slava

3

Do cách thức nhập liệu bàn phím được xử lý nội bộ, điều này rất tiếc ngày nay thường không thể thực hiện được, ngay cả trong GVIM. CtrlKhông thể ánh xạ một số tổ hợp phím, chẳng hạn như + không phải chữ cái và không thể phân biệt Ctrl+ chữ cái so với Ctrl+ Shift+ chữ cái. (Trừ khi thiết bị đầu cuối của bạn gửi mã cụm từ riêng biệt cho nó, mã này hầu hết không gửi.) Ở chế độ chèn hoặc dòng lệnh, hãy thử nhập tổ hợp phím. Nếu không có gì xảy ra / được chèn, bạn không thể sử dụng tổ hợp phím đó. Điều này cũng áp dụng cho <Tab>/ <C-I>, <CR>/ <C-M>/ <Esc>/ <C-[>v.v. (Chỉ có ngoại lệ là <BS>/ <C-H>.) Đây là một điểm khó khăn đã biết và là chủ đề của các cuộc thảo luận khác nhau trên vim_dev và kênh #vim IRC.

Một số người (trước hết là Paul LeoNerd Evans) muốn khắc phục điều đó (ngay cả đối với giao diện điều khiển Vim trong các thiết bị đầu cuối hỗ trợ điều này) và đã đưa ra nhiều đề xuất khác nhau, cp. http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

Nhưng cho đến hôm nay, vẫn chưa có bản vá hoặc tình nguyện viên nào đưa ra, mặc dù nhiều người đã bày tỏ mong muốn có được điều này trong một bản phát hành Vim trong tương lai.


1

Như bạn đã lưu ý, bạn nhận được cùng một mã khóa. Vì vậy, cách duy nhất để phân biệt chúng là kiểm tra trạng thái của Shiftkhóa trong chức năng xử lý sự kiện của bạn. Tất nhiên, nếu bạn có độ trễ hơn 0,5 giây giữa quá trình nhấn phím và xử lý, bạn sẽ bỏ lỡ một số lần truy cập.


1
Tôi đoán điểm của câu hỏi của tôi là do gvim có khả năng tạo ra sự khác biệt như vậy (mặc dù vim đơn giản không thể), có bất kỳ phần mở rộng dành riêng cho gvim nào mà tôi có thể dựa vào để phân biệt Ctrl + Shift + V với Ctrl + V không .
Kohsuke Kawaguchi

9
làm thế nào để kiểm tra trạng thái của phím Shit? Tôi đã tìm kiếm, nhưng không tìm thấy bất cứ điều gì thậm chí hữu ích từ xa.
bolov
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.