2009-10-01 54 views
57

Trong một thiết bị đầu cuối, người ta không thể phân biệt Ctrl +MộtCtrl +phím Shift +Một như cả hai đều phát ra mã khóa tương tự, 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 +MộtCtrl +phím Shift +Một. Có cách nào để lập bản đồ hai điều đó một cách khác nhau không?Cách ánh xạ Ctrl + A và Ctrl + Shift + A khác?

Đối với người mới bắt đầu, tôi muốn làm một cái gì đó như sau: Hãy "dán từ clipboard" làm việc như GNOME Terminal, trong khi vẫn giữ Ctrl +V sang chế độ hình ảnh.

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

Tôi không có câu trả lời cho câu hỏi của bạn, nhưng tôi muốn đề cập đến I LOVE the Hudson. –

+0

Cảm ơn bạn đã sử dụng Hudson! –

+1

Có thể: http://vim.wikia.com/wiki/Mapping_fast_keycodes_in_terminal_Vim – vivoconunxino

Trả lời

29

Gvim không làm điều đó bởi 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à nó như thế nào.


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 dãy thoát tùy ý cho bất kỳ tổ hợp phím.

Ví dụ, thêm dòng sau vào .Xresources cho xterm để gửi <Esc>[65;5u cho Ctrlphím ShiftMột. Sau đó, bạn có thể ánh xạ điều đó trong Vim thành <C-S-a>. (65 là giá trị Unicode thập phân cho shift-a và 5 là bit cho modifier ctrl. Các 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 cấu hình để làm điều này (ví dụ không được cung cấp). Thông tin

thêm: http://www.leonerd.org.uk/hacks/fixterms/

+0

Để remap nhiều phím, hãy xem [tài liệu này] (http: //www.in-ulm.de/~ mascheck/X11/xterm/XTerm): Phân tách các mục nhập bằng '\ n'. Sử dụng dấu gạch chéo ngược để phân tách các dòng. Ví dụ. cũng để lập bản đồ CSBCSF sử dụng này: 'XTerm * vt100.translations: #override Ctrl ~ Meta phím Shift a: string (0x1B) chuỗi ("[65; 5U") \ n Ctrl ~ Meta phím Shift b : string (0x1b) string ("[66; 5u") \ n Ctrl ~ Meta Shift f: chuỗi (0x1b) chuỗi ("[70; 5u") ' – cfi

+0

Vì lợi ích đầy đủ, có thể thêm vào câu trả lời cũng như thế nào để bản đồ này trong vi? Ví dụ. 'bản đồ [66; 5u: echo" ctrl-shift-b đã nhận được "' để ánh xạ ctrl-shift-b để in thư trong dòng trạng thái. Trên AskUbuntu có một Q tương tự và tôi đã [tóm tắt] (http://askubuntu.com/a/677070/28323) này. – cfi

+0

Những gì chúng ta cần là một đặc tả thiết bị đầu cuối mới! 'xterm-256color' (mới nhất) bị hạn chế rất nhiều. – Jezz

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 phím Shift trong chức năng xử lý sự kiện của bạn. Tất nhiên, nếu bạn có sự chậm trễ hơn 0,5 giây giữa 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à cho rằng gvim có khả năng tạo ra sự khác biệt (mặc dù đồng bằng vim không thể), có bất kỳ phần mở rộng gvim cụ thể nào mà tôi có thể dựa vào để phân biệt Ctrl + Shift + V và Ctrl + V. –

+6

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 kỳ điều gì hữu ích từ xa. – bolov

4

Nếu những gì phiền bạn đang mất chức năng C-V hiện tại, bạn có thể sử dụng C-Q để thay thế. Hãy xem,: giúp CTRL-V-thay thế.

0

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

+2

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 biến thể CTRL-SHIFT mà Neovim _does_ hỗ trợ ra khỏi hộp chủ yếu là các ký tự không thể in được (ví dụ được liệt kê tại http://neovim.org/doc/user/vim_diff.html#nvim-features-new). Tuy nhiên, * meta * hợp âm (bao gồm cả '' biến thể) * làm * chủ yếu là làm việc hoàn toàn ra khỏi hộp. –

+0

cảm ơn vì đã làm rõ và theo kịp công việc tốt :) – OliverUv

1

Như đã được chỉ ra, không có cách nào để ánh xạ <C-S-A> khác với <C-A>.

Tuy nhiên, sử dụng các công cụ như autokey (đối với Linux & cửa sổ) hoặc autohotkey (cho các cửa sổ), bạn có thể remap <C-S-A> để gửi một key-đột quỵ khác nhau (s) cho các ứng dụng cụ thể.

ví dụ:Trên hệ thống của tôi, tôi có thiết lập 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ó những đặc tính:

  1. bàn phím shortcut như ctrl+shift+a
  2. lớp cửa sổ: gnome-terminal-server.Gnome-terminal

Sau đó ~/.vimrc của bạn có thể tạo ánh xạ cho <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ư loại chủ chốt 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 phím số <F13> - <F37> v.v. Nếu ứng dụng của bạn hỗ trợ nó, (gvim tôi nghĩ) bằng cách sử dụng các phím được khuyến khích.
  2. Tôi chủ yếu là vim trong gnome-terminal. Vì vậy, tôi đã sử dụng window class = gnome-terminal-server.Gnome-terminal làm bộ lọc. Sửa đổi nó để sử dụng gvim nếu bạn muốn. autokey hỗ trợ nút để chụp bất kỳ thuộc tính nào của cửa sổ khác như lớp/tiêu đề.
+0

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

+0

Tự động chết tiệt! Tôi đã làm tất cả mọi thứ tôi có thể nhưng tôi không thể làm cho nó được cài đặt trên ubuntu của tôi 16.04. –

+0

'apt install autokey-gtk'? – anishsane

0

Do cách nhập liệu bàn phím được xử lý nội bộ, tiếc là ngày nay không thể thực hiện được, ngay cả trong GVIM. Một số tổ hợp phím như Ctrl + không thuộc chữ cái không thể được ánh xạ, và Ctrl + thư vs Ctrl +phím Shift + thư không thể phân biệt. (Trừ khi thiết bị đầu cuối của bạn gửi một mã số riêng biệt termcap cho nó, mà hầu hết không.) Ở 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 vào, 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-[> vv (Chỉ có ngoại lệ là <BS>/<C-H>.) Đây là một điểm đau nổi tiếng, và là chủ đề của 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 sửa lỗi đó (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 tính đến hôm nay, không có bản vá hoặc tình nguyện viên nào phát triển, mặc dù nhiều người đã bày tỏ mong muốn có điều này trong bản phát hành Vim trong tương lai.

Các vấn đề liên quan