쉘이 "vi" 모드 또는 "emacs" 모드에 있다는 것은 무엇을 의미합니까?

쉘이 "vi" 모드 또는 "emacs" 모드에 있다는 것은 무엇을 의미합니까?

이 질문은답변. 이 경우 특히 다음 부분을 이해할 수 없습니다.

Ctrl-W이러한 점에서 그 동작은 bash(readline)/ksh/zsh emacs 모드보다 emacs에 더 가깝지만 이전 단어(werase, vi에서도)) 가 있는 터미널 드라이버 내장 라인 편집기(정규 모드)에서 벗어납니다 .

여기서 우리는 완전히 다른 두 프로그램인 편집기가 아닌 쉘에 대해 이야기하고 있습니다. 쉘이 일부 편집기 모드에 있다는 것은 무엇을 의미합니까?

추신: 제가 쉘이 무엇인지, 그리고 기본 편집에 vim을 사용하는 방법을 이해하고 있다는 전제하에 답변하실 수 있습니다.

답변1

"vi" 모드에서는 vi 편집기의 행처럼 현재 쉘 프롬프트에서 편집/탐색할 수 있습니다. 한 줄의 텍스트 파일로 생각하면 됩니다. 마찬가지로 "emacs" 모드에서는 (특정) Emacs 단축키를 사용하여 현재 명령줄을 편집/탐색할 수 있습니다.

예를 들어 vi 모드에서는 bash에서 다음과 같은 작업을 수행할 수 있습니다.

$ set -o vi
$ ls hello world
<ESC>
bbdw # results in
$ ls world

Emacs 모드에서는 Ctrl+ 및 기타 키를 눌러 A줄의 시작 부분으로 이동할 수 있습니다(vi: Ctrl+ [, 0또는 ESC, 0). set -o emacsEmacs 모드(bash, ksh, zsh 등)를 켤 수 있습니다 .

독서선

많은 대화형 명령줄 프로그램(예:세게 때리다) 사용독서선도서관. 따라서 한 곳에서 vi 또는 emacs를 사용하도록 입력 모드와 기타 옵션을 구성할 수 있으므로 readline을 사용하는 모든 프로그램은 정확히 동일한 편집/탐색 인터페이스를 갖게 됩니다.

예를 들어 내 readline 구성은 다음과 같습니다.

$ cat ~/.inputrc 
set editing-mode vi
set blink-matching-paren on

예를 들어다루기 힘든/변화 많은내가 아는 한, readline은 사용되지 않지만 vi/emacs 모드도 지원되는데 이는 bash/readline 모드와 매우 유사합니다.

물론, 명령줄 셸의 vi/emacs 모드는 전체 편집기 기능 세트의 하위 집합일 뿐입니다. 모든 기능이 명령줄 셸에 적합한 것은 아니며 일부 기능에 대한 지원은 다른 기능보다 더 복잡합니다.

정식 모드

대화형 명령줄 셸을 위한 vi/emacs 모드가 "발명"되기 전에는 셸에서 다음을 사용했습니다.정식 모드터미널에서는 제한된 편집 명령 세트만 제공합니다(예: Ctrl+ W마지막 단어 삭제).

답변2

cat터미널의 쉘 프롬프트에서 실행할 때 catstdin에서 읽은 내용이 stdout에 기록되어야 한다는 것을 알 수 있습니다 . 그런 다음 를 누르면 터미널 드라이버 에코가 a표시되지만 내용은 쓰지 않습니다 ( 터미널 드라이버가 에코한 하나만 참조하세요 .acataa

그러나 을 입력하면 출력이 a Backspace b Enter표시되지 않고 ( 및 개행 문자)가 표시됩니다 .cata\010b\015b\012b

이는 터미널 드라이버(우리는 터미널 에뮬레이터와 달리 커널의 소프트웨어에 대해 이야기하고 있음)가 xterm매우 기본적인 기능을 구현하기 때문입니다.라인 편집기당자이모델모델. 터미널 드라이버는 명령 ioctl()과 마찬가지로 시스템 호출을 사용하여 구성 할 수 있습니다 stty. 예를 들어, 표준 모드를 ​​종료하려면 다음을 수행할 수 있습니다 stty -icanon. 이렇게 하면:

stty -icanon; cat

echo그러면 (disable을 사용할 수 있음 stty -echo) 출력과 출력이 모두 표시됩니다 .cat

이 편집기는 라인 편집기입니다. 즉, 사용자는 누르는 즉시 독서 단말 장치의 애플리케이션으로 전송될 때까지 텍스트 줄을 편집할 수 있습니다 Enter.

편집 기능편집하다매우 제한적입니다. 대부분의 구현에는 구성 가능한 편집 키(실제로는 문자)가 4개만 있습니다 stty.

  • 지우기( ^H또는 ^?보통): 이전 문자를 지웁니다.
  • Kill( ^U노멀) : 지금까지 입력한 라인을 클리어(킬)합니다.
  • werase ( ^W) : 이전 단어 삭제
  • lnext( ^V): 다음 문자를 문자 그대로 입력합니다(위의 특수 의미는 모두 취소).

예전에는 터미널 드라이버 라인 편집기에 더 고급 기능이 있을 것이라고 생각되었습니다. 이것이 초기 쉘에 명령줄 편집 기능이 없는 이유입니다(쉘 프롬프트에서 얻을 수 있는 줄 편집 기능은 cat위에서 실행할 때 얻은 것과 동일합니다).

그러나 이것은 실제로 발생하지 않았습니다. 아마도 특정 키를 눌렀을 때 동일한 문자를 보내지 않는 다른 터미널에 대한 혼란으로 인해 부분적으로 커널 공간에서 구현되어서는 안 된다는 것을 암시합니다.

그래서 몇몇 포탄이 떨어지기 시작했어요모델터미널 드라이버 모드를 사용하고 자신만의 라인 편집기를 구현하세요. 키 바인딩과 작동 방법이 완전히 다른 당시 가장 인기 있는 시각적 텍스트 편집기 emacs였습니다 . vi에는 vi텍스트 입력 모드와 편집 모드가 있습니다. 응 emacs, 넌 항상 여기 있어텍스트를 입력하세요모드이지만 편집은 키 조합을 눌러 수행됩니다(예: ^b문자를 뒤로 이동).

그 당시에는 쉘이 자체적으로 다른 키 바인딩을 제공할 필요가 없었습니다. 사람들은 다른 방법을 배워야 하기 때문에 좌절감을 느낄 수 있습니다. 그러나 다른 스타일보다 하나의 ( emacs또는 vi) 스타일을 선택하면 확실히 사용자가 멀어지게 됩니다.다른편집하다.

~에 따르면https://www.usenix.org/legacy/publications/library/proceedings/vhll/full_papers/korn.ksh.a:

ksh의 인기 있는 인라인 편집 기능(vi 및 emacs 모드)은 Bell Labs의 소프트웨어 개발자에 의해 만들어졌습니다. Pat Sullivan의 vi 라인 편집 모드와 Mike Veach의 emacs 라인 편집 모드. 이러한 기능을 추가하기 위해 각각 독립적으로 Bourne 쉘을 수정했으며, 두 남성 조직 모두 ksh에 자체 인라인 편집기가 있는 경우에만 ksh를 사용하기를 원했습니다. 처음에는 ksh에 명령줄 편집을 추가하려는 아이디어가 줄 편집을 터미널 드라이버로 옮기려는 바람 때문에 거부되었습니다. 그러나 이것이 곧 일어날 가능성이 없다는 것이 인식되었을 때 두 줄 편집 모드는 모두 ksh에 통합되어 선택 사항으로 지정되어 터미널 인터페이스의 일부로 편집을 제공하는 시스템에서 비활성화될 수 있었습니다.

그래서 그들은 두 가지를 모두 구현하고 사용자가 둘 중 하나를 선택할 수 있는 인터페이스를 제공했습니다. ksh첫 번째는 1980년대 초반(위에 표시된 것처럼 별도로 작성된 코드를 재사용하여 Bourne 셸에 vi 모드와 emacs 모드를 추가함), 그 다음 tcsh( tcsh원래는 키 바인딩만 emacs, vi모드는 나중에 추가됨), 1990년대 초반 bash이었습니다 zsh.

bashzsh또는 에서 또는 ksh사용 및 또는 에서 또는 사용하여 두 모드 간에 전환 할 수 있습니다 .set -o viset -o emacsbindkey -ebindkey -vtcshzsh

POSIX는 실제로 vi스키마를 지정하는 것이 아니라 emacs스키마를 지정합니다 sh(이야기에 그런 내용이 있습니다).Richard Stallman은 POSIX 사양 emacs모델에 반대합니다.sh).

(pdksh, mksh, oksh) bash의 공개 도메인 변형 )의 기본 모드는 emacs 모드(그렇다면 자유롭게 사용하십시오) kshtcshzshzshvi$EDITORviksh인 반면 AT&T에서는무음$EDITOR또는 $VISUAL언급 하지 않는 한 패턴 vi또는 emacs.

kshgmacs나중에 Gosling 사용자의 다양한 emacs처리 스타일을 수용하기 위해 모드가 추가되었습니다 Ctrl+T.

^W이제 emacsEmacs 모드 내부 또는 외부 처리가 터미널 라인 편집기의 문자 tcsh보다 빠를 수 있으므로 werase이것과 내 진술에 대해 그들을 비난할 수 없습니다."출발……."오해의 소지가 있는 것으로 간주될 수 있습니다. 단지 를 입력할 때 또는 같은 것이 다르게 동작하면 짜증 emacs난다는 것뿐입니다 . 상상할 수 있듯이 일부 앱이 입력할 때 창을 닫기 시작하면 훨씬 더 짜증납니다 .tcshinfoCtrl-WCtrl-W

관련 정보