UNIX에서 VI 키를 사용하여 쉘 명령 편집


28

저는 유닉스에 능통 한 동료를 가졌습니다.

그는 Vi 키 바인딩을 사용하여 쉘 명령을 편집하는 방법을 보여주었습니다.

그는 내가 로그인 할 때마다 실행되는 파일에 명령을 넣었습니다.

그 이후로 다른 프로젝트로 옮겼습니다.

불행히도 이것을 설정하는 방법을 기억하지 못합니다.

Vi 키 바인딩을 사용하여 터미널에서 명령을 편집하는 방법을 알고있는 사람이 있습니까?

해당 설정을 어떻게 영구적으로 만들 수 있습니까?

답변:


31

지금까지 최고의 기능에 대해 이야기하고 있습니다!

vi 명령을 사용하여 쉘 명령 (및 명령 기록)을 .bashrc파일 에 추가하여 편집 할 수 있습니다.

set -o vi

명령 행에서 해당 명령을 실행하여 현재 세션에만 영향을 줄 수도 있습니다.

bash를 사용하지 않는다면, 쉘에 적절한 rc 파일을 대체하십시오.


이것은 당신이 명령을 편집하기 위해 vi 명령을 사용할 수 있습니다 ...

jk을 사용 하여 기록을 이동할 수도 있습니다 (을 누른 후 ESC).

/을 누른 후을 사용 ESC하여 이전 명령을 검색 할 수도 있습니다 .

다시 말해 cp10 분 전에 수행 한 매우 긴 명령 을 찾으려면 다음과 같이하십시오.

ESC/cpENTER

그런 다음 n및로 기록에서 일치하는 모든 명령을 순환 할 수 있습니다 N.

이 모든 것이 명령 줄에서 10 조 배나 더 생산성을 높입니다!


4
실제로 vi를 사용하지 않고 라인 편집을 위해 vi 스타일 키보드 명령을 사용하고 있습니다.

4
물론 ... 적절한 용어가 vi bindings in the shell발명 된 것 중 가장 큰 특징이라고 생각합니다 !
jahroy

모드를 표시하는 방법이 있다면 emacs 바인딩에서 vi 바인딩으로 전환 할 것입니다. 그렇게하는 방법을 알고 있습니까?
iconoclast

그들은 우리가 일반적으로 vim에서 jj하는 ESC것처럼 묶을 수있는 방법이 있습니까?
steveyang

@yangchenyun - 어쩌면이 질문은 그와 함께 도움이 될 것입니다 stackoverflow.com/questions/844862/... 나는 꽤 있는지 무엇을있는 거 부탁 해요, 그래서 나는 개인적으로 바인드 /이 명령 중 하나를 변경하지 않습니다.
jahroy

12

bash를 사용하고 있다면 jahroy와 evil otto가 이미 대답했듯이

set -o vi

bash가 vi 스타일 편집 명령을 사용하도록합니다.

이 작업을 완료 Esc v하면 현재 명령 행의 사본이 포함 된 임시 파일로 vi 편집기를 시작하도록 입력 할 수 있습니다 . 여러 줄로 바꾸어도 명령을 편집 할 수 있습니다. 파일 ( :wq) 을 저장하면 셸은 편집 된 명령을 실행합니다.

너가 선호한다면

set -o emacs

당신은 Ctl-XCtl-E같은 일을 할 수 있습니다 . $EDITOR반드시 emacs가 아닌 선호하는 편집기를 사용합니다 .

(개인적으로는 대부분의 편집에 vi (실제로 vim)를 사용하지만 set -o emacs쉘에서는 선호 합니다. 삽입 모드를 전환하거나 파일을 편집하는 것은 좋지만 대화 형 명령은 어색합니다 .YMMV.)


vi 스타일을 피하면서 일반 편집 모드로 돌아가는 방법을 알고 있습니까? 나는 Bl Num의 성공을 기억하지만 더 이상은 아닙니다. 내가 뭘 놓치고 있니?
piertoni

@ piertoni : set -o emacs당신이 원하는 것을하지 않습니까?
Keith Thompson

예, 그것은 효과가 있습니다. 요점을 놓쳤습니다.
piertoni

10

set -o vi@jahroy가 게시 한대로 줄 편집 명령을 변경 하는 데 사용할 수 있지만 fc명령을 생각하고있을 수 있습니다 (bash에서 사용 가능하고 ksh는 생각하지만 tcsh는 아닐 것입니다). 이전 명령을 편집기 (FCEDIT 또는 EDITOR)에 넣습니다. (vi)로 설정 한 다음 편집기를 종료 할 때 명령을 실행합니다. 맨 페이지 또는 help fc자세한 내용을 참조하거나 사용해보십시오.


5
alias r='fc -e -'이전 명령을 다시 실행하는 데 유용한 별명입니다. fc그 자체로는 Korn shell에서 유래 한 것 같습니다. 번호로 명령을 지정할 수 있습니다 ( fc 123 129히스토리에서 명령 번호 123-129를 편집하기 위해). 상대 번호를 지정할 수 있습니다 ( fc -10 -1마지막으로 입력 한 10 개의 명령을 편집하기 위해). 로 이전 명령을 나열 할 수 있습니다 fc -l. r별명 을 앞에 접두어로 명령을 지정할 수 있습니다 ( r make마지막 호출 실행 make; 마지막 실행 이후 명령을 r m실행 하지 않은 경우 등). mvmake
Jonathan Leffler

6

vim에서 가장 최근에 사용한 명령을 편집하고 편집기 저장 후 종료 한 후 편집 된 버전을 호출하려면 fc쉘 내장을 사용하십시오 . 인수가 없으면 다음을 수행합니다.

  1. 임시 파일을 작성 /tmp하고 가장 최근에 입력 한 명령 으로 파일을 채 웁니다.
  2. 편집기가 정상적으로 종료되면 (종료 코드 0으로) 해당 임시 파일에서 찾은 명령을 실행하고이 파일을 제거합니다. 편집 된 버전은 일반적인 명령 (최소한 zsh)으로 기록에 저장됩니다. 편집기가 0이 아닌 다른 코드로 종료되면 아무것도 실행되지 않습니다 (vim에서는 kill 또는을 사용하여 수행 할 수 있음 :cquit).

명령은 bash와 zsh에서 모두 작동합니다.


5

실제로 이것은 실제로 가장 큰 특징입니다. 그래도 더 있습니다 :

라는 파일을 만듭니다

.editrc

라인을 포함

bind -v

Editline 은 BSD 라이센스 버전 라이브러리로, readline-like 서비스를 제공합니다. .editrc는 MySQL의 명령 줄 셸 또는 readline을 사용하지 않는 응용 프로그램에서 키 바인딩을 vi 모드로 설정합니다.

몇 년이지나면서 다소 잊어 버렸습니다. 따라서 .zshrc 는 vi 모드의 일부 래퍼소스 로 사용하여 명령 줄에서 어떤 모드인지 보여줍니다. 좋네요

zsh에서 입력 할 수 있음을 알고 있습니다.

bindkey -L

키 바인딩 목록을 얻습니다. bash는 비슷한 것이 있어야한다고 확신합니다. 모든 vi 키가 기본적으로 바인딩 된 것은 아닙니다. 자신에게 맞는 모습을 보여주고 레이스에서 벗어납니다.


MySQL에서 vi 바인딩에 대해이 5 번 투표 할 수 있기를 바랍니다!
jahroy

1

터미널에을 입력하십시오 export EDITOR=vi.

이 설정을 저장하려면 이 줄을 ~ / .profile 파일에 넣으십시오.


5
기본 편집기 (에주의를 기울이는 명령의 경우 $EDITOR)를로 설정 vi합니다. 쉘 명령을 vi(적어도 직접적으로는) 사용하여 편집 할 수는 없습니다 .
키이스 톰슨

2
@KeithThompson Zsh는를 $EDITOR포함하는 경우 기본적으로 vi 편집 모드로 설정됩니다 vi. 나는 이것이 유일한 쉘이라고 생각합니다.
Gilles 'SO- 악한 중지'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.