내가 이해한 바로는, Linux 디렉토리에서 대부분은 특별한 처리가 있는 일반 파일입니다(예: "rm" 파일은 괜찮습니다. "rm" 디렉토리는 -r이 없으면 문제가 발생합니다).
다음 bash 명령을 실행할 때:
mkdir foo; touch foo/f1.txt; touch foo/f2.txt; vim foo
Vim은 foo 디렉터리 파일의 내용을 다음과 같이 표시합니다:
" ============================================================================
" Netrw Directory Listing (netrw v136)
" /home/capdigi/foo
" Sorted by name
" Sort sequence: [\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$
" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec
" ============================================================================
../
f1.txt
f2.txt
내 질문은 다음과 같습니다
1) 이 예의 맥락에서 netrw를 사용하는 이유는 무엇입니까? ~에 따르면http://www.vim.org/scripts/script.php?script_id=1075, netrw는 "네트워크를 통한 파일 읽기 및 쓰기를 지원합니다". 이것은 로컬/네트워크 디렉토리 액세스를 통합하는 데 사용되는 vim의 구성 요소입니까?
2) netrw가 필요한 이유는 무엇입니까? 디렉토리는 "대부분" 일반 파일이므로 중간 계층 없이 일반 파일로 열 수는 없습니까? 일명 왜 모든 종소리와 휘파람을 불고 있습니까?
답변1
역사 속유닉스시스템에서 디렉터리는 일반 파일로 구현되며 디렉터리임을 나타내는 특수 모드가 있습니다. 많은 최신 파일 시스템과 운영 체제에서는 더 이상 그렇지 않습니다. 디스크 구조와 관련하여 디렉터리는 파일 시스템에 따라 파일과 같은 저장소 Blob으로 표시될 수도 있고 그렇지 않을 수도 있습니다. 운영 체제 인터페이스의 경우 디렉터리와 일반 파일에 액세스하기 위한 별도의 시스템 호출이 있습니다.opendir
,readdir
,rewinddir
,closedir
에 해당open
,read
,rewind
,close
각기.
디렉터리를 읽는 소프트웨어는 디렉터리별 인터페이스를 사용해야 합니다. Vim에서 디렉터리를 열면 해당 내용이 파일처럼 로드되지 않습니다. Vim은 디렉터리를 기본적으로 처리하지 않습니다. vim --noplugin
디렉터리에서 실행하면 Vim은 불평을 하고 "foo" is a directory
같은 이유로 버퍼를 저장하지 않습니다.
netrw의 주요 목표는 (다양한 네트워크 프로토콜을 통해) 원격 파일에 액세스하는 것입니다. 이러한 원격 파일이 포함된 디렉터리에서는 ls
및 같은 명령을 쉽게 실행할 수 없기 때문에 cp
netrw에는 디렉터리를 검색하고 조작하는 코드가 포함되어 있습니다. 이는 파일 관리자이자 원격 파일 브라우저입니다. 이러한 파일 관리자 기능은 로컬 및 원격 모두에 적합하므로 netrw는 원격 파일 및 디렉터리뿐만 아니라 로컬 디렉터리에 대한 처리기로 자신을 등록합니다.
답변2
원본 디렉터리 데이터에 액세스할 수 없습니다. 파일 시스템 불일치가 발생할 수 있으므로 쓰기 액세스는 허용되지 않습니다. 형식은 파일 시스템에 따라 다르므로 읽기 액세스가 제공되지 않습니다. (따라서 일정 수준의 추상화를 시행하는 것이 더 좋습니다) 또한 다음을 참조하십시오:Unix 파일 시스템에서 디렉토리는 어떻게 구현됩니까?
유닉스에서는 원본 데이터에 액세스하지 않고 디렉토리 항목을 하나씩 읽는 데 , , 인터페이스(맨 페이지 참조) 가 vim
사용됩니다 . 나는 이것이 다양한 "비-UNIX" 파일 시스템으로 확장되는 이 인터페이스의 더 높은 수준의 추상화라고 생각합니다.opendir
readdir
closedir
Netrw