본문 바로가기
리눅스

vi

by 다움위키 2023. 12. 23.

vi (구별되는 문자로 발음, /ˌvˈ/)는 원래 유닉스 운영 시스템에 대해 만들어진 화면-지향된 텍스트 편집기입니다. vi와 그것에 기반된 프로그램의 동작의 이식 가능한 부분집합과 이들 프로그램 내에서 지원되는 ex 편집기 언어는 단일 유닉스 사양POSIX에 의해 설명됩니다 (그리고 따라서 표준화되었습니다).

vi의 원래 코드는 1976년 Bill Joy에 의해, Chuck Haley와 함께 작성했었던 ex라는 줄 편집기의 시각적 모드로 작성되었습니다. Bill Joy의 ex 1.1은 1978년 3월 첫 번째 Berkeley Software Distribution (BSD) 유닉스 출시의 일부로 출시되었습니다. 그것은 1979년 5월 두 번째 BSD의 일부로 릴리스된 ex 버전 2.0이 되어서야 편집기가 "vi" (사용자를 ex의 비주얼 모드로 바로 전환함)라는 이름으로 설치되고, 오늘 그 이름으로 알려져 있습니다. 현재 vi의 일부 구현은 소스 코드 조상을 Bill Joy로 추적할 수 있습니다; 다른 것들은 완전히 새롭고, 대체로 호환되는 재구현입니다.

이름 "vi"는 ex 줄 편집기시각적 모드로 전환하는 ex 명령 visual에 대한 가장 짧은 모호하지 않은 약어에서 파생됩니다. 이름은 /ˌvˈ/ (영어 문자 vi)로 발음됩니다.

유닉스의 독점 구현과 함께 배포된 vi의 다양한 비-자유 소프트웨어 변종 외에도, vi는 OpenSolaris로 오픈 소스되었고, 여러 자유와 오픈-소스 소프트웨어 vi 복제품이 존재합니다. Linux Journal 독자를 대상으로 한 2009년 설문 조사에 따르면 vi는 응답자 중 가장 널리 사용되는 텍스트 편집기로 두 번째로 널리 사용되는 편집기인 gedit를 거의 2배 (36% 대 19%)로 앞섰습니다.

History

Creation

vi는 디스플레이 터미널이 아닌 텔레프린터에서 잘 작동하도록 설계된 줄 편집기였던, ed로 시작하는 일련의 유닉스 명령줄 편집기에서 파생되었습니다. ed가 기원된 AT&T Corporation 내에서, 사람들은 ed만큼 기본적이고 비우호적인 편집기에 만족하는 듯 보였다고, George Coulouris는 회상합니다:

[...] 수년 동안, 그들은 적절한 터미널이 없었습니다. 그들은 오랫동안 TTY 및 기타 인쇄 단말기를 사용했고, 그들이 모두를 위해 화면을 구입했을 때, 그들은 Tektronix 4014를 얻었습니다. 이것들은 대형 저장 튜브 디스플레이였습니다. 여러분은 사진을 업데이트할 수 없는 것처럼 저장 튜브 디스플레이에서 화면 편집기를 실행할 수 없습니다. 따라서 유닉스에 대해 화면 편집을 개척하는 것은 다른 사람에게 맡겨야 했고, 그것이 처음에는 우리였었고, 우리는 수년 동안 계속 그 일을 했습니다.

Coulouris는 ed의 신비한 명령을 오직 "immortals"에 적합한 것으로 생각했고, 따라서 1976년 2월에, 그는 Queen Mary College에서 강사로 활동하는 동안 (Ken Thompson의 ed 소스를 시작점으로 사용하여) ed를 향상시켜 em ("mortals를 위한 편집기"[9])을 만들었습니다. em 편집기는 디스플레이 터미널에 대해 설계되었고 한-번에-한-줄씩-표시되는 시각적 편집기였습니다. 그것은 터미널 장치 드라이버가 아닌 실행 중인 프로그램이 모든 키 입력을 처리하는 "원시 터미널 입력 모드"를 많이 사용한 유닉스의 첫 번째 프로그램 중 하나였습니다. Coulouris가 1976년 여름 UC 버클리를 방문했을 때, 그는 em을 포함하는 DECtape를 가져왔고, 다양한 사람들에게 편집기를 보여주었습니다. 일부 사람들은 이 새로운 종류의 편집자를 잠재적인 자원 돼지로 생각했지만, Bill Joy를 비롯한 다른 사람들은 깊은 인상을 받았습니다.

em에서 영감을 얻어, ed를 자체로 수정에 의해, Bill Joy와 Chuck Haley는, 모두 UC Berkeley의 대학원생이며, en을 만들기 위해 em에서 코드를 가져오고 그런-다음 en을 "확장"하여 ex 버전 0.1을 생성했습니다. Haley가 떠난 후, Bruce Englar는 Joy에게 편집기를 재설계하도록 권장했으며, 그는 1977년 6월부터 10월까지 ex에 전체-화면 비주얼 모드를 추가했습니다.

ex의 시각적 모드 (일명 vi)에 있는 많은 아이디어는 당시에 존재했던 다른 소프트웨어에서 가져왔습니다. Bill Joy에 따르면, vi의 시각적 모드에 대한 영감은 바이모달 편집기였던 Bravo 편집기에서 나왔습니다. vi의 기원에 대한 인터뷰에서 Joy는 다음과 같이 말했습니다:

화면 편집 모드에 대한 많은 아이디어는 내가 몰래보고 복사했던 Bravo 설명서에서 도용되었습니다. Dot은 실제로 Bravo에서 이중-탈출, 다시 실행 명령입니다. 대부분의 물건은 훔쳐온 것입니다. ed에서 훔쳐온 몇 가지가 있었습니다–우리는 토론토 버전의 ed에 대한 매뉴얼 페이지를 얻었으며, 내 생각에는 Rob Pike가 그것과 관련이 있었다고 생각합니다. 우리는 그 중 일부 정규식 확장을 가져왔습니다.

Joy는 Lear Siegler ADM-3A 터미널을 사용했습니다. 이 터미널에서, Escape 키는 현재 널리 사용되는 IBM PC 키보드Tab 키에 의해 차지진 위치 (키보드의 알파벳 부분 왼쪽, 중간 행 위 한 행)에 있었습니다. 이것은 vi 모드를 전환하기 위한 편리한 선택이 되었습니다. 역시, h,j,k,l는 커서 이동 키로 이중 역할을 하고 화살표가 새겨져 있으며, 이것이 vi가 그런 방식으로 그것들을 사용하는 이유입니다. ADM-3A에는 다른 커서 키가 없었습니다. Joy는 간결하고 단일 문자 명령과 디스플레이 앞에 입력하는 기능은 소프트웨어를 개발할 때 사용했던 느린 300 비우 모뎀의 결과이고 화면이 생각보다 느리게 칠할 때 생산성을 원했다고 설명했습니다.

Distribution

Joy는 1978년 3월에 첫 번째 BSD 유닉스 출시를 만드는 책임이 있었고, 배포판에 ex 1.1 (1978년 2월 1일자)을 포함하여, 그것에 따라서 UC Berkeley 이외의 청중에게 그의 편집자를 노출시켰습니다. BSD 유닉스 출시 이후로, 유닉스 시스템과 함께 제공되는 유일한 편집기는 ed 및 ex였습니다. 1984년 인터뷰에서, Joy는 vi의 성공의 대부분을 무료로 번들로 제공하지만, Emacs와 같은 다른 편집기는 수백 달러의 비용을 들일 수 있었다고 말했습니다.

결국 대부분의 ex 사용자가 시각적 모드에서 모든 시간을 보내고 있다는 것이 관찰되었고, 따라서 ex 2.0에서 (1979년 5월 Second Berkeley Software Distribution의 일부로 출시됨), Joy는 vi로 호출될 때, ex가 자동으로 시각적 모드에서 시작되도록 ex에 대한 하드 링크로 vi를 만들었습니다. 따라서 vi는 ex의 진화가 아니고, vi는 ex입니다.

Joy는 ex 2.0 (vi)을 PDP-11/70의 메모리에 겨우 들어갈 수 있는 매우 큰 프로그램으로 설명했으며, 따라서 비록 vi가 오늘날 작고 가벼운 프로그램으로 여겨질 수 있지만, 그것의 역사 초기에는 그렇게 볼 수는 없었습니다. 1979년 12월 3BSD와 함께 출시된 버전 3.1에서, vi의 전체 버전이 더 이상 PDP-11의 메모리에 들어갈 수 없었습니다; 그 편집기는 역시 1984년 IBM PC에 대해 PC/IX에서 실행하기에는 너무 컸습니다.

Joy는 1979년 6월 버전 2.7까지 계속해서 vi의 수석 개발자였었고, 1980년 8월에는 적어도 버전 3.5까지 vi 개발에 이따금 기여했습니다. vi의 기원과 그가 개발을 중단한 이유에 대해, Joy는 다음과 같이 말했습니다:

나는 키보드의 모든 키를 사용하지 않았으면 합니다. 내 생각에 흥미로운 점 중 하나는 vi가 실제로 모드-기반 편집기라는 것입니다. 나는 모드-기반 편집기로 가는 것을 생각했고, 꽤 좋다고 생각합니다. EMACS의 좋은 점 중 하나는, 어쨌든, 프로그래밍-가능성과 모드없음입니다. 그것들 나에게 결코 일어나지 않았던 두 가지 아이디어입니다. 나는 역시 vi를 작성할 때 코드 최적화를 잘하지 못했습니다. 나는 편집기의 다시-표시 모듈은 거의 다루기 힘들다고 생각합니다. 그것은 그것이 하는 일에 대해 정말 좋은 일을 하지만, 당신이 배우면서 프로그램을 작성할 때... 그것이 내가 작업을 중단한 이유입니다.

실제로 일어난 일은 1978년 12월에 있었던 우리가 VAX를 설치할 때 vi에 멀티윈도우를 추가하는 과정에 이었습니다. 우리는 어떤 백업을 가지지 않았었고 테이프 드라이브는 고장났습니다. 나는 심지어 백업하려는 능력없이 작업을 계속했습니다. 그리고 나서 소스 코드가 엉망이 되었고 나는 완전한 목록을 가지지 않았습니다. 나는 윈도우에 대해 디스플레이 코드의 모두를 거의 재작성했고. 그때가 내가 포기했을 때였습니다. 그 후에, 나는 이전 버전으로 돌아가서 단지 코드를 문서화하고 매뉴얼을 완성하고 그것을 닫았습니다. 만약 그 스크런치가 발생하지 않았다면, vi는 멀티윈도우를 갖게 되었을 것이고, 나는 약간의 프로그래밍 가능성을 넣었을 것입니다–그러나 나도 모르겠습니다.

vi의 근본적인 문제는 그것이 마우스를 가지지 않고 따라서 모든 이들 명령을 사용할 수 있다는 것입니다. 어떤 의미에서, 그것은 당신이 마우스-지향적인 것에서 얻을 수 있는 것과는 반대입니다. 나는 여러 수준의 실행 취소도 훌륭할 것이라고 생각합니다. 그러나 근본적으로, vi는 여전히 ed 내부에 있습니다. 여러분은 정말 그것을 속일 수 없습니다.

그것은 그 피나타 중 하나와 같습니다–안에 사탕이 있지만 맨 위에는 종이 가루가 겹겹이 쌓여 있습니다. 그것은 실제로 통일된 개념을 가지고 있지 않습니다. 내 생각에 다시 그 때로 돌아간다면–돌아갈 수는 없지만, 다시 시작하겠습니다.

1979년, Mary Ann Horton이 vi의 책임을 맡았습니다. Horton은 화살표 및 기능 키, 매크로에 대한 지원을 추가했고, termcapterminfo로 대체함으로써 성능을 개선했습니다.

Ports and clones

1981년 10월에 만들어진 vi의 버전 3.7까지, UC Berkeley는 vi를 위한 개발 기지이었지만, 1982년 초 Bill Joy가 Sun Microsystems에 합류하기 위해 떠나고, AT&T의 UNIX System V (1983년 1월)가 vi를 채택하면서, vi 코드베이스에 대한 변경은 더 느리고 더 분산되고 상호 호환되지 않는 방식으로 발생했습니다. UC Berkeley에서, 변경 사항이 있었지만 버전 번호는 3.7 이상으로 업데이트되지 않았습니다. Sun, HP, DEC, 및 IBM과 같은 상용 유닉스 공급업체는 각각 vi 소스의 사본을 받았고, 그들의 운영 체제, Solaris, HP-UX, Tru64 UNIX, 및 AIX는 3.7 출시에서 직접 유래된 vi의 버전이지만 조정 가능한 키 매핑, 암호화 및 와이드 문자 지원과 같은 추가된 기능을 포함하여 오늘날 계속해서 유지 관리되고 있습니다.

상업 공급업체는 Bill Joy의 코드베이스로 작업할 수 있지만 (및 오늘날에도 계속 사용할 수 있지만), 많은 사람들은 그렇게 할 수 없습니다. Joy는 Ken Thompsoned 편집자로 시작했기 때문에, ex와 vi는 파생된 작업이었고 AT&T 소스 라이선스를 가진 사람을 제외하고는 배포할 수 없었습니다. 자유 유닉스-스타일 편집기를 찾는 사람들은 다른 곳을 찾아야 합니다. 1985년까지 Emacs의 하나의 버전 (MicroEMACS)이 다양한 플랫폼에서 사용할 수 있었지만, vi는 제한된 vi 클론, STEVIE (ST Editor for VI Enthusiasts)가 등장했었던 1987년 6월까지 그렇지 못했습니다. 1990년 1월 초에, Steve Kirkendall은 STEVIE보다 더 완전하고 충실한 vi 복제본을 목표로, 유즈넷 뉴스그룹 comp.os.minix에 Elvis라는 새로운 복제본을 게시했습니다. 그것은 많은 열성 커뮤니티에서 빠르게 상당한 관심을 끌었습니다. Andrew Tanenbaum은 커뮤니티에 이 두 편집기 중 하나를 Minix의 vi 클론으로 결정하도록 요청했습니다; Elvis가 선택되었고, 현재 Minix에 대해 vi 클론으로 남아 있습니다.

1989년에 Lynne JolitzWilliam Jolitz386 클래스 프로세서에서 실행되지만, Joy의 vi를 포함하여 AT&T-오염된 코드를 피해야 하는 자유 배포판을 만들기 위해 BSD 유닉스를 이식하기 시작했습니다. vi를 제거하여 남겨진 공백을 채우기 위해, 그들의 1992년 386BSD 배포판은 Vi 대체품으로 Elvis를 채택했습니다. 386BSD의 후손, FreeBSDNetBSD가 그 뒤를 이었습니다. 그러나 UC Berkeley에서, Keith Bostic은 BSD 4.4 Lite에 대해 Joy의 vi를 "버그 호환에 대한 버그"로 대체하기를 원했습니다. Kirkendall의 Elvis (버전 1.8)를 시작점으로 사용하여, Bostic는 nvi를 만들었으며, 1994년 북부의 봄에 그것을 출시했습니다. FreeBSD와 NetBSD가 4.4-Lite2 코드베이스를 재동기화했을 때, 그들은 역시 오늘날 계속 사용하고 있는 Bostic의 nvi로 전환했습니다.

때때로 2000년 6월 이전에, 강화된 기능집합을 가진 vi 클론이 있음에도 불구하고, Gunnar Ritter는 Joy의 vi 코드베이스 (1992년 2월 2.11BSD에서 가져옴)를 리눅스와 FreeBSD와 같은 최신 유닉스-기반 운영 시스템으로 이식했습니다. 처음에, 그의 작업은 AT&T 소스 라이선스없이 배포하기 위해 기술적으로 불법이었지만, 2002년 1월에, 그것들의 라이선스 규칙이 완화되었고, 합법적인 배포를 오픈-소스 프로젝트에게 허용합니다. Ritter는 vi에 대해 POSIX.2 표준에 의해 요구된 변경 사항을 포함하여 여전히 Joy의 코드베이스를 사용하는 상용 유닉스 공급업체에 대해 행해진 것과 유사한 vi 코드베이스에 대한 작은 개선을 계속해서 만들었습니다. 그의 작업은 Traditional Vi로 사용할 수 있고, 오늘날 다양한 시스템에서 실행됩니다.

그러나 비록 Joy의 vi가 이제 BSD 유닉스에서 다시 사용할 수 있게 되었지만, 그것은 다양한 BSD 계열이 자체에 nvi를 수용한 후에 일어났으며, 이것은 전통적인 vi에 비해 여러 가지 향상된 기능을 제공하고, (한 번에 한 줄씩 편집할 수 있는 열기 모드와 같은) 일부 레거시 기능을 버렸습니다. Joy의 vi 코드베이스가 시작된 BSD Unix가 그것을 더 이상 사용하지 않는 것과 초기에 Joy의 편집기가 없었던 AT&T-파생된 유닉스가 현재 그의 코드의 수정된 버전을 사용하고 유지하는 것은 어떤 의미에서 이상한 반전입니다.

Impact

vi는 만들어진 이후 몇 년 동안, 그것은 de facto 표준 유닉스 편집기가 되었고 1984년경 이후 Emacs가 등장할 때까지 MIT 외부에서 해커가 즐겨 사용했습니다. 단일 유닉스 사양은 vi를 지정하므로, 모든 각 준수하는 시스템은 vi를 가지고 있어야 합니다.

vi는 여전히 유닉스-계열 운영 시스템의 사용자에 의해 널리 사용되고 있습니다. 1991년 USENET 여론 조사에서 응답자의 약 절반이 vi를 선호했습니다. 1999년에, 같은 이름의 컴퓨터 책 출판 회사의 설립자, Tim O'Reilly는 자신의 회사가 emacs 책보다 vi 책을 더 많이 팔았다고 말했습니다.

Interface

vi는 모달 편집기입니다: 그것은 삽입 모드 (입력된 텍스트가 문서의 일부가 됨) 또는 명령 모드 (키 입력이 편집 세션을 제어하는 명령으로 해석됨)에서 작동합니다. 예를 들어, 명령 모드에서 i를 입력하면 편집기가 삽입 모드로 전환되지만, 이 지점에서 다시 i를 입력하면 문서에 "i" 문자가 배치됩니다. 삽입 모드에서, ESC를 누르면 편집기가 다시 명령 모드로 전환됩니다. vi의 텍스트 기입과 명령 모드 분리의 인지된 이점은 홈 로우에서 사용자의 손을 떼지 않고도 텍스트 편집과 명령 작업 둘 다를 수행할 수 있다는 것입니다. 비-모달 편집기는 보통 문자 인쇄를 위해 문자와 기호를 가진 모든 키를 예약해야 하며, 버퍼에 텍스트를 추가하는 것 이외의 동작에 대한 임의의 특수 명령은 기능 키와 같은 문자를 생성하지 않는 키, 또는 정규 키와 함께 Ctrl, 및 Alt와 같은 보조 키의 조합에 할당해야 합니다. Vi는 대부분의 일반 키가 위치 지정, 텍스트 변경, 검색 등을 위한 일종의 명령에 단일 또는 키 조합으로 연결되는 속성을 가집니다. 많은 명령은 Ctrl 또는 Alt의 사용 없이 터치로 입력될 수 있습니다. 다른 유형의 편집기는 일반적으로 터치 입력할 때 사용자에게 홈 로우에서 손을 이동하는 것을 요구합니다:

  • GUI 편집기에서 마우스를 텍스트, 명령 또는 메뉴 항목을 선택하기 위해 사용하기 위해.
  • 화살표 키 또는 편집 기능 (Home / End 또는 기능 키)으로.
  • 표준 타자기 키와 결합에서 수정자 키를 사용하여 명령을 호출하기 위해.

예를 들어, vi에서, 단어를 교체하는 것은 삽입 모드 안팎으로의 전환과 함께 두 개의 독립적인 명령 (변경과 단어-이동)의 조합인 cwreplacement textEscape입니다. 커서 위치와 단어 끝 사이의 텍스트는 대체 텍스트로 덮어씁니다. 작업은 .을 입력함으로써 일부 다른 위치에서 반복될 수 있으며, 해당 위치에서 시작하는 단어가 같은 대체 텍스트로 바뀌는 효과가 있습니다.

인간–컴퓨터 상호 작용 교과서는 첫 페이지에서 "전 세계의 HCI 교육자들에 의해 말해진 및 다시-말해진–고전적인 UI 결함 중 하나는 모드 사이를 전환할 때 vi 편집기의 피드백 부족입니다. 많은 사용자가 명령 모드에서 입력을 제공하거나 입력 모드에서 명령을 입력하는 실수를 범했습니다"라고 적었습니다.

Contemporary derivatives and clones

  • Vim "Vi IMproved"는 (스크립트 가능한) 구문 강조 표시, 마우스 지원, 그래픽 버전, 시각적 모드, 많은 새로운 편집 명령 및 ex 명령 영역에서 많은 확장을 포함하여 vi에 비해 많은 추가 기능을 가집니다. Vim은 거의 모든 각 리눅스 배포판에 포함되어 있습니다 (및 역시 모든 각 Apple macOS 복사본과 함께 제공됩니다). Vim은 역시 vi 호환성 모드를 가지며, 이것에서 Vim이 그렇지 않은 것보다 vi와 더 잘 호환되지만, 심지어 호환 모드에서도 개방형 모드와 같은 일부 vi 기능이 Vim에는 없습니다. 이 모드는 :set compatible 옵션에 의해 제어됩니다. 그것은 만약 소프트웨어가 vi와 호환될 것으로 예상되는 상황에서 Vim이 시작될 때 Vim에 의해 자동으로 켜집니다. vi 호환성과 충돌하지 않는 Vim 기능은 설정에 관계없이 항상 사용할 수 있습니다. Vim은 Amiga에 대한 STEVIE의 포트에서 파생되었습니다.
  • Elvis는 Steve Kirkendall에 의해 작성된 유닉스와 기타 운영 시스템에 대해 자유 vi 복제품입니다. Elvis는 커서 키를 입력 모드에서 작동하도록 허용하는 것을 포함하여 현재 다른 vi 복제품에 존재하는 여러 기능을 도입했습니다. 그것은 색상 구문 강조 표시 (및 구문 강조 표시를 여러 파일 형식으로 일반화)를 제공한 최초의 제품입니다. Elvis 1.x는 nvi의 시작점으로 사용되었지만, Elvis 2.0은 다중 버퍼, 창, 표시 모드, 및 파일 접근 체계를 포함한 수많은 기능을 추가했습니다. Elvis는 Slackware Linux, Kate OSMINIX에 탑재된 vi의 표준 버전입니다. Elvis의 최신 버전은 2003년 10월에 릴리스된 2.2입니다.
  • nvi는 원래 최종 공식적인 Berkeley Software Distribution (4.4 BSD-Lite)의 일부로 배포된 ex/vi 텍스트 편집기의 구현입니다. 이것은 모든 BSD-기반 오픈 소스 배포판과 함께 제공되는 vi 버전입니다. 그것은 명령 역사와 편집, 파일이름 완성, 다중 편집 버퍼, 및 다중-창 (같은 편집 버퍼에 있는 다중 창 포함)을 추가합니다. 권장되는 안정 버전인, 1996년 10월부터 1.79 이후에, nvi의 "개발 릴리스"가 있었고, 그 중 가장 최신 버전은 2007년 11월부터 1.81.6입니다.
  • vile은 처음에 Emacs 다중-창/다중-버퍼 편집 패러다임을 vi 사용자에게 제공하기 위해 Microemacs의 초기 버전에서 파생되었고, 1991년 유즈넷의 alt.sources에 처음 게시되었습니다. 그것은 무한 실행-취소, UTF-8 호환성, 다중-창/다중-버퍼 작업, 매크로 확장 언어, 구문 강조 표시, 파일 읽기 및 쓰기 후크, 등을 제공합니다.
  • BusyBox, 단일 실행 파일에 포함된 표준 Linux 유틸리티 집합은 작은 vi 복제품을 포함하고 있습니다.
  • Neovim, Vim의 리팩토링, 이것은 vi를 대체하기 위해 노력하는 것입니다.

Further reading

External links