Pushd Popdの仕組みと同様に、さまざまな場所にある複数のファイルをすばやく閉じて再開できるコマンドはありますか?

Pushd Popdの仕組みと同様に、さまざまな場所にある複数のファイルをすばやく閉じて再開できるコマンドはありますか?

複数のファイルをすばやく編集したいです。同様にファイルを積み重ねることができるツールがあれば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

ファイルのリストはシェルごとに作成されます。たとえば、複数の端末が開いている場合は、別々のファイルのリストが表示されます。

関連情報