이 질문은답변. 이 경우 특히 다음 부분을 이해할 수 없습니다.
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 emacs
Emacs 모드(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
터미널의 쉘 프롬프트에서 실행할 때 cat
stdin에서 읽은 내용이 stdout에 기록되어야 한다는 것을 알 수 있습니다 . 그런 다음 를 누르면 터미널 드라이버 에코가 a표시되지만 내용은 쓰지 않습니다 ( 터미널 드라이버가 에코한 하나만 참조하세요 .a
cat
a
a
그러나 을 입력하면 출력이 a Backspace b Enter표시되지 않고 ( 및 개행 문자)가 표시됩니다 .cat
a\010b\015
b\012
b
이는 터미널 드라이버(우리는 터미널 에뮬레이터와 달리 커널의 소프트웨어에 대해 이야기하고 있음)가 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
.
bash
zsh
또는 에서 또는 ksh
사용 및 또는 에서 또는 사용하여 두 모드 간에 전환 할 수 있습니다 .set -o vi
set -o emacs
bindkey -e
bindkey -v
tcsh
zsh
POSIX는 실제로 vi
스키마를 지정하는 것이 아니라 emacs
스키마를 지정합니다 sh
(이야기에 그런 내용이 있습니다).Richard Stallman은 POSIX 사양 emacs
모델에 반대합니다.sh
).
(pdksh, mksh, oksh) bash
의 공개 도메인 변형 )의 기본 모드는 emacs 모드(그렇다면 자유롭게 사용하십시오) ksh
tcsh
zsh
zsh
vi
$EDITOR
vi
ksh
인 반면 AT&T에서는무음$EDITOR
또는 $VISUAL
언급 하지 않는 한 패턴 vi
또는 emacs
.
ksh
gmacs
나중에 Gosling 사용자의 다양한 emacs
처리 스타일을 수용하기 위해 모드가 추가되었습니다 Ctrl+T.
^W
이제 emacs
Emacs 모드 내부 또는 외부 처리가 터미널 라인 편집기의 문자 tcsh
보다 빠를 수 있으므로 werase
이것과 내 진술에 대해 그들을 비난할 수 없습니다."출발……."오해의 소지가 있는 것으로 간주될 수 있습니다. 단지 를 입력할 때 또는 같은 것이 다르게 동작하면 짜증 emacs
난다는 것뿐입니다 . 상상할 수 있듯이 일부 앱이 입력할 때 창을 닫기 시작하면 훨씬 더 짜증납니다 .tcsh
info
Ctrl-WCtrl-W