Nano에 더 일반적인 단축키(예: 검색을 위한 Ctrl-F, 교체를 위한 Ctrl-H 등)를 만들고 싶었고 파일을 편집하여 nanorc
다음을 추가했습니다.
bind ^F whereis all
bind ^H replace all
bind ^M mark all
...
놀랍게도 백스페이스 키를 누르면 바꾸기 기능이 활성화되고 Enter를 누르면 마크업이 활성화됩니다.
그런 다음 가상 키코드가 Backspace 0x08, H 0x48, Enter 0x0D, M 0x4D라는 것을 깨달았습니다.
Ctrl 키 바인딩이 실제로 0x40에서 비트 마스크되어 있습니까?
답변1
Nano와 함께 사용하는 가상 터미널은 지난 수십 년 동안의 물리적 직렬 터미널을 모델로 한 것입니다. 관례적으로 이러한 터미널은 알파벳 키 또는 @
, [
, \
, ]
, 라벨이 붙은 ^
키 중 하나를 키 누르기와 동시에 누르면 ASCII 제어 코드를 생성합니다 . 전송되는 제어 코드는 알파벳 코드에서 64를 뺀 ASCII 코드입니다. 따라서 를 누르면 캐리지 리턴 코드인 M(0x53) 빼기 0x40 = 0x13의 ASCII 코드가 생성됩니다. Return 키는 캐리지 리턴 문자도 생성합니다. 왜냐하면 그것이 키의 기능이기 때문입니다._
Ctrl
Ctrl-M
답변2
이는 가상 키코드가 아닙니다.
터미널을 사용하고 있습니다.
터미널은 간단한 8비트(경우에 따라 7비트) 문자 스트림을 사용하여 작동합니다. TUI 애플리케이션이 아는 한 nano
, 사용자와 TUI 사이에는 직렬 포트, 모뎀 2개, PSTN, 그리고 믿을 수 있는 DEC VT525가 있습니다. 모두보는 것은 문자 스트림, 터미널 장치 파일 설명자, TERM
환경 변수 및 terminfo 데이터베이스의 레코드입니다.
이 문자 스트림에는 알파벳 키에 대한 제어 키 수정자와 같은 것이 없습니다. bind ^M
소프트웨어를 작성할 때실제로구속력이 있는 것으로 이해됨문자 수 13. 이는 소프트웨어가 사용해야 하는 실제 터미널 I/O 모델이기 때문에 소프트웨어가 내부적으로 작동해야 하는 방식입니다. 이것은 ^M
소프트웨어 명령 파서의 제품이며 방법입니다표현하다입력한 구성 명령의 문자 기호 13입니다.
FreeBSD와 같은 일부 운영 체제는 응용 프로그램 소프트웨어가 파서에서 사용할 수 있는 공통 라이브러리 기능을 제공하여 응용 프로그램 전체에 걸쳐 이러한 표현에 대한 통일된 의미를 생성합니다.
% printf '\x08\x0d' | % printf '\x08\x0d' | \^H\^M %
또한 여기에는 가상 키코드가 없습니다. ⎈ Control수정자 키로 인한 모든 변환은 문자가 (가상 또는 실제) 와이어를 따라 전송되기 전에 터미널이나 터미널 에뮬레이터에서 발생합니다.
⎈ Control터미널에서는 +(␈)에 문자 #8을 생성하고 + 및 에 H문자 ⌫ Backspace#13(␍)을 생성합니다 . 그것은 모두 터미널/터미널 에뮬레이터에 따라 다릅니다. 많은 에뮬레이터에는 사람들이 변경할 수 있는 일종의 키맵이 있습니다. 실제 DEC VT의 경우 실제로 문자 #8 전송과 문자 #127(DEL) 전송 사이를 전환하는 출력 제어 시퀀스 DECBKM이 있습니다.⎈ ControlMEnter⌫ Backspace
추가 읽기
- https://unix.stackexchange.com/a/382814/5132
- Enter 키가 EOL을 보내지 않는 이유는 무엇입니까?
- 탭 문자를 "^I"로 표시
vis()
,strvis()
, 기다리다.. FreeBSD 라이브러리 함수 매뉴얼. 2017년 4월 22일.unvis
. FreeBSD 공통 명령 매뉴얼. 2010년 11월 7일.