Ctrl + A와 Ctrl + Shift + A를 다르게 매핑하는 방법은 무엇입니까?


92

터미널에서는 Ctrl+ ACtrl+ Shift+ A를 구분할 수 없습니다. 둘 다 동일한 키 코드를 내 보냅니다. 그래서 Vim이 할 수없는 이유를 알 수 있습니다. 그러나 X 애플리케이션 인 gVim은 Ctrl+ ACtrl+ Shift+를 구별 할 수 있습니다 A. 이 두 가지를 다르게 매핑 할 수있는 방법이 있습니까?

우선, 다음과 같은 작업을하고 싶습니다. "클립 보드에서 붙여 넣기"가 Gnome 터미널처럼 작동하도록하고 Ctrl+ V를 시각적 모드로 유지 합니다.

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


3
@vivoconunxino이 링크는 ctrl-a에 시프트 수정자를 추가하는 것에 대해 언급하지 않습니다.
graywh

답변:


46

Gvim은 Vim이 할 수 없기 때문에하지 않습니다 (일반적인 상황에서). 미안하지만 그게 바로 그거야.


하나...

일부 터미널 (예 : xterm 및 iterm2)은 모든 키 조합에 대해 임의의 이스케이프 시퀀스를 보내도록 구성 할 수 있습니다.

예를 들어,에 다음을 추가 .Xresourcesxterm을 전송하기 <Esc>[65;5u위해 CtrlShiftA. 그런 다음 Vim에서 <C-S-a>. (65는 shift-a의 십진 유니 코드 값이고 5는 ctrl 수정 자에 대한 비트입니다.이 경우 u는 "유니 코드"를 나타냅니다.)

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

iTerm 및 [u] rxvt도이를 수행하도록 구성 할 수 있습니다 (예는 제공되지 않음).

더 많은 정보 : http://www.leonerd.org.uk/hacks/fixterms/


여러 키를 다시 매핑하려면 이 문서를 참조하십시오 . 키 항목을 \n. 라인을 분할하려면 백 슬래시를 사용하십시오. 예를 들어 <kbd> CSB </ kbd> 및 <kbd> CSF </ kbd>를 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")
매핑

완전성을 위해 vi에서 이것을 매핑하는 방법도 대답에 추가 할 수 있습니까? 예 map <ESC>[66;5u :echo "ctrl-shift-b received"<CR>를 들어 ctrl-shift-b를 매핑하여 상태 표시 줄에 메시지를 인쇄합니다. AskUbuntu에는 비슷한 Q가 있었고 이것을 요약 했습니다.
cfi

우리에게 필요한 것은 새로운 터미널 사양입니다! xterm-256color(가장 최근의) 제한이 너무 많습니다.
Jérôme Pouiller

@Jezz 제한 사항은 xterm-256color.
graywh

물론 @graywh, termcap을 새로운 기능이 필요하다
제롬 Pouiller

9

이미 지적한 바와 같이, 매핑 할 방법이 없다 <C-S-A>다르게 <C-A>.

그러나 autokey(Linux 및 Windows 용) 또는 autohotkey( Windows 용) 과 같은 도구를 사용하여 <C-S-A>특정 응용 프로그램에 대해 다른 키 입력을 보내도록 다시 매핑 할 수 있습니다 .

예를 들어 내 시스템에서이 설정이 있습니다 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.

다음 속성을 할당합니다.

  1. 키보드 단축키 ctrl+shift+a
  2. 창 클래스 : gnome-terminal-server.Gnome-terminal

그런 다음 원하는대로 ~/.vimrc매핑을 만들 수 있습니다 <S-F1>a.


메모:

  1. 나는 <S-F1>탐지를 위해 일종의 리더 키로 사용 했습니다 <C-S>. 내 단말기가 수락하지 않았습니다 때문이었다 <F13>- <F37>등 키. 응용 프로그램에서 지원하는 경우 gvim해당 키를 사용하는 것이 좋습니다.
  2. 나는 주로 vim에서 gnome-terminal. 그래서 window class = gnome-terminal-server.Gnome-terminal필터로 사용 했습니다. gvim원하는 경우 사용하도록 수정하십시오 . autokey클래스 / 제목과 같은 다른 창의 속성을 캡처하기위한 버튼을 지원합니다.

감사합니다. 키 리 맵핑을 위해 Autokey를 사용하는 것에 대한 많은 것들이 있지만 그것을 수행하는 방법에 대한 실제 지침은 없습니다. 마지막으로 당신의 대답은 그렇게합니다. 아무도 당신을 찬성하지 않았다 니 믿을 수 없습니다.
pickle323 dec.

1
젠장 오토 키! 할 수있는 모든 것을 다했지만 우분투 16.04에 설치할 수 없었습니다.
huksay yukashima

apt install autokey-gtk?
anishsane

1
추가 소프트웨어를 설치하기 전에 창 관리자가이를 직접 처리하는지 확인할 수 있습니다. 예를 들어, I3 제의 .config이 있습니다 bindsym --release Control+Shift+h exec --no-startup-id xdotool key --clearmodifiers comma w m h, 어떤 프레스 ,wmh나는 누르면 <C-S-h>다음 정력이 처리하는 방법을 알고있다,wmh
MatrixManAtYrService

^^ 이것도 좋습니다. 그러나 키 번역을 gnome-terminal 또는 gvim으로 만 제한하고 싶었습니다. 다른 앱이 아닙니다. 이 버튼을 <C-S-H>누르면 다른 응용 프로그램이 계속 수신 됩니다.
anishsane

5

기존 CV 기능을 잃어 버리는 것이 귀찮다면 대신 CQ를 사용할 수 있습니다. : help CTRL-V-alternative를 참조하십시오.


3

NeoVim은 이제 터미널과 GUI 클라이언트 모두에이 기능을 제공합니다. : h nvim-features-new를 참조하십시오 .


3
터미널에서 CSI 코드를 활성화하지 않는 한 정답은 아닙니다. Neovim 기본적으로 지원 하는 CTRL-SHIFT 변형 은 대부분 인쇄 할 수없는 문자입니다 (예 : neovim.org/doc/user/vim_diff.html#nvim-features-new ). 그러나 메타 코드 ( <m-s-...>변형 포함 ) 대부분 상자에서 완전히 작동합니다.
Justin M. Keyes 2015

이 문서는 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."대소 문자 구분 :"부분 앞에 줄 바꿈이있어 모호하게 만듭니다. 정정 해 주셔서 감사합니다, @ JustinM.Keyes. 또한, 구별하기 위해 8.1 나타납니다 정력 <M-a><M-A>도합니다.
Adam Katz

@ justin-m-keyes <c-s-l>는 추가 번거 로움없이 <c-l>in 과 완벽하게 구별됩니다Konsole
Slava

3

키보드 입력이 내부적으로 처리되는 방식으로 인해 안타깝게도 오늘날 GVIM에서도 일반적으로 불가능합니다. Ctrl+ 비 알파벳 과 같은 일부 키 조합 은 매핑 할 수 없으며 Ctrl+ 문자 대 Ctrl+ Shift+ 문자는 구분할 수 없습니다. (단말기가 고유 한 termcap 코드를 보내지 않는 한 대부분은 그렇지 않습니다.) 삽입 또는 명령 줄 모드에서 키 조합을 입력 해보십시오. 아무 일도 일어나지 않거나 삽입되면 해당 키 조합을 사용할 수 없습니다. 이것은 또한 <Tab>/ <C-I>, <CR>/ <C-M>/ <Esc>/ <C-[>등에 적용됩니다 . (예외는 <BS>/ <C-H>입니다.) 이것은 알려진 문제점이며 vim_dev 및 #vim IRC 채널에 대한 다양한 논의의 주제입니다.

일부 사람들 (이전 Paul LeoNerd Evans)은 (이를 지원하는 터미널의 콘솔 Vim에 대해서도)이를 수정하고 다양한 제안 인 cp를 떠올 렸습니다. http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

그러나 현재로서는 아직 패치 나 자원 봉사자가 나오지 않았지만, 많은 사람들이 향후 Vim 릴리스에서이 기능을 사용하고 싶다고 표현했습니다.


1

언급했듯이 동일한 키 코드를 얻습니다. 따라서 이들을 구별하는 유일한 방법은 Shift이벤트 처리 기능에서 키 의 상태를 확인하는 것입니다 . 물론 키 누르기와 처리 사이에 0.5 초 이상의 지연이 있으면 일부 히트를 놓칠 수 있습니다.


1
내 질문의 요점은 gvim이 그러한 구별을 할 수 있다는 점을 감안할 때 (일반 vim은 할 수 없지만) Ctrl + Shift + V와 Ctrl + V를 구별하기 위해 사용할 수있는 gvim 특정 확장이 있다는 것입니다. .
Kohsuke Kawaguchi

9
Shit 키의 상태를 확인하는 방법? 나는 검색했지만 원격으로 유용한 것을 찾지 못했습니다.
bolov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.