私が理解したのは、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
歴史の中Unixシステムでは、ディレクトリは通常のファイルとして実装され、ディレクトリであることを示す特別なモードがあります。多くの最新のファイルシステムやオペレーティングシステムでは、もはやそうではありません。ディスク構造に関しては、ディレクトリはファイルシステムによってはファイルなどのストレージブロブとして表示される場合もあれば、そうでない場合もあります。オペレーティングシステムインターフェイスの場合、ディレクトリと通常のファイルにアクセスするための別々のシステムコールがあります。opendir
、readdir
、rewinddir
、closedir
に該当open
、read
、rewind
、close
それぞれ。
ディレクトリを読み取るソフトウェアは、ディレクトリ固有のインターフェイスを使用する必要があります。 Vimでディレクトリを開くと、その内容はファイルのようにロードされません。 Vimはディレクトリをデフォルトで処理しません。vim --noplugin
ディレクトリで実行すると、Vimは文句を言い、"foo" is a directory
同じ理由でバッファを保存しません。
netrwの主な目的は、(さまざまなネットワークプロトコルを介して)リモートファイルにアクセスすることです。これらのリモートファイルを含むディレクトリでは、ls
同じコマンドを簡単に実行できないため、cp
netrwにはディレクトリを検索して操作するコードが含まれています。これはファイルマネージャとリモートファイルブラウザです。これらのファイルマネージャ機能はローカルとリモートの両方に適しているため、netrwはリモートファイルとディレクトリだけでなく、ローカルディレクトリのハンドラとして自分自身を登録します。
答え2
ソースディレクトリデータにアクセスできません。ファイルシステムの不一致が発生する可能性があるため、書き込みアクセスは許可されません。フォーマットはファイルシステムによって異なるため、読み取りアクセスは提供されません。 (したがって、あるレベルの抽象化を実施する方が良いです)また、以下を参照してください。Unixファイルシステムでは、ディレクトリはどのように実装されますか?
Unixでは、ソースデータにアクセスせずにディレクトリエントリを1つずつ読み込むために、インタフェース(マンページ参照)がvim
使用されます。私はこれがさまざまな「非UNIX」ファイルシステムに拡張されるこのインタフェースのより高いレベルの抽象化だと思います。opendir
readdir
closedir
Netrw