是否有一个命令可以让我快速关闭并重新打开不同位置的多个文件,类似于 Pushd Popd 的工作方式?

是否有一个命令可以让我快速关闭并重新打开不同位置的多个文件,类似于 Pushd Popd 的工作方式?

我希望能够快速编辑多个文件。如果有一个工具可以让我以类似的方式堆叠文件,那就太好pushdpopd。存在这样的工具吗?如果没有,你有什么建议?

在我看来,我应该能够用这样的方式列出堆栈中的文件。

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 以便执行另一个操作,例如测试更改。这并不能真正让我摆脱依赖history 命令重新打开文件或多个tty 来测试更改的情况。

答案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

请注意,文件列表将基于每个 shell。例如,如果您打开了多个终端,它们将具有独立的文件列表。

相关内容