web-dev-qa-db-ja.com

vimを使用してディレクトリファイルの内容を表示する

私が理解しているように、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が必要なのですか?ディレクトリは「ほとんど」通常のファイルであるため、仲介なしで通常のファイルとして開くことはできません。層?別名、なぜすべての空想?

5
capdigi

歴史的な nix システムでは、ディレクトリは通常のファイルとして実装され、ディレクトリであることを示す特別なモードがありました。これは、多くの最新のファイルシステムやオペレーティングシステムには当てはまりません。ディスク上の構造に関しては、ファイルシステムに応じて、ディレクトリがファイルのようなストレージのブロブとして表される場合と表されない場合があります。オペレーティングシステムのインターフェイスに関しては、ディレクトリと通常のファイルにアクセスするための個別のシステムコールがあります: opendirreaddir 、- rewinddirclosedir 対応 openreadrewindclose それぞれ。

ディレクトリを読み取るソフトウェアは、ディレクトリ固有のインターフェイスを使用する必要があります。 Vimでディレクトリを開くと、ファイルの場合とは異なり、その内容は読み込まれません。 Vimにはディレクトリのネイティブ処理はありません。ディレクトリでvim --nopluginを実行すると、Vimは"foo" is a directoryと文句を言い、同じ理由でバッファを保存しません。

Netrwの主な目的は、(さまざまなネットワークプロトコルを介して)リモートファイルにアクセスすることです。これらのリモートファイルを含むディレクトリでlscpのようなコマンドを簡単に実行することはできないため、netrwには、ディレクトリを参照して操作するためのコードが含まれています。リモートファイルブラウザ。これらのファイルマネージャの機能は、ローカルでもリモートでも意味があるため、netrwは、リモートのファイルやディレクトリに加えて、ローカルディレクトリのハンドラとして自身を登録します。

生のディレクトリデータにアクセスすることはできません。ファイルシステムの不整合につながる可能性があるため、書き込みアクセスは許可されていません。形式はファイルシステムに依存するため、読み取りアクセスは提供されません。 (したがって、ある程度の抽象化を実施することをお勧めします)参照: nixファイルシステムでディレクトリはどのように実装されますか?

UNIXでは、vimopendirreaddirclosedirインターフェイス(マンページを参照)を使用して、アクセスできずにディレクトリエントリを1つずつ読み取ります。生データ。 Netrwは、このインターフェイスの高レベルの抽象化であり、さまざまな「非UNIX」ファイルシステムに拡張されていると思います。

0