複数のファイルをすばやく編集したいです。同様にファイルを積み重ねることができるツールがあればpushd
良いと思いますpopd
。そのようなツールがありますか?そうでない場合、どのような提案がありますか?
このようにスタック内のファイルを一覧表示できるはずです。
files -v
0 /etc/bind/named.conf.options
1 /etc/default/bind9
2 /etc/bind/named.conf.local
次に、次のように編集するファイルを開きます。
nano ~2
同時に複数のファイルを編集できますが、同じではないことがわかりました。複数のファイルが開いている場合、nano ./test.txt /etc/another_test.txt
変更のテストなどの他の操作を実行するには、開いている各ファイルを閉じて保存してNanoを終了する必要があります。だからといって、変更をテストするためにファイルを再開したり、複数のttyを開くときにHistoryコマンドを使用することから、実際には逸脱しません。
答え1
Bashでは、次のようなものが役に立ちます。
#!/bin/bash
filelist=()
function fadd() {
filelist+=("${@}")
}
function fdel() {
local -r index="${1}"
newstack=()
for ((i = 0; i < ${#filelist[@]}; ++i)); do
if [[ "${i}" != "${index}" ]]; then
newstack+=( "${filelist[${i}]}" )
fi
done
filelist=( "${newstack[@]}" )
}
function flist() {
for ((i = 0; i < ${#filelist[@]}; ++i)); do
printf "%2d %s\n" "${i}" "${filelist[${i}]}"
done
}
function fedit() {
local -r index="${1:-0}"
${EDITOR} "${filelist[${index}]}"
}
function fget() {
local -r index="${1:-0}"
echo "${filelist[${index}]}"
}
これは、最初に空の配列filelist
とその配列で機能する一連の関数を定義します。
- この
fadd()
関数は配列の末尾に名前を追加します。 - この
fdel()
関数は、インデックスに基づいて配列から要素を削除します。 - この
flist()
関数は配列の内容とそのインデックスをリストします。 - この関数は、指定されたインデックスに対応するファイルを含む
fedit()
エディタ(として定義)を開きます。${EDITOR}
filelist
- この
fget()
関数は、指定されたインデックスにあるファイルのファイル名を印刷します。
これにはエラーチェックは含まれません(たとえば、無効なインデックスを提供する可能性があります)。また、ファイル名にスペースを使用してこれをテストしなかったことに注意してください。これはまったく正しく機能しない可能性があります。
上記の内容を含むファイルを入手したら、次のことができます。
$ source file_mgmt
# Add some files of interest
$ fadd ~/src/foo.[ch]
$ fadd /tmp/bar.txt
$ fadd ~/.bashrc
# View the file list
$ flist
0 /home/user/src/foo.c
1 /home/user/src/foo.h
2 /tmp/bar.txt
3 /home/user/.bashrc
# Open a file from the list by index
$ fedit 0
[ my ${EDITOR} opened with /home/user/src/foo.c ]
# Remove a file from the list
$ fdel 2
$ flist
0 /home/user/src/foo.c
1 /home/user/src/foo.h
2 /home/user/.bashrc
# Copy ~/.bashrc to tmp
$ cp $(fget 2) /tmp
ファイルのリストはシェルごとに作成されます。たとえば、複数の端末が開いている場合は、別々のファイルのリストが表示されます。