![是否有一个命令可以让我快速关闭并重新打开不同位置的多个文件,类似于 Pushd Popd 的工作方式?](https://linux22.com/image/172625/%E6%98%AF%E5%90%A6%E6%9C%89%E4%B8%80%E4%B8%AA%E5%91%BD%E4%BB%A4%E5%8F%AF%E4%BB%A5%E8%AE%A9%E6%88%91%E5%BF%AB%E9%80%9F%E5%85%B3%E9%97%AD%E5%B9%B6%E9%87%8D%E6%96%B0%E6%89%93%E5%BC%80%E4%B8%8D%E5%90%8C%E4%BD%8D%E7%BD%AE%E7%9A%84%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%EF%BC%8C%E7%B1%BB%E4%BC%BC%E4%BA%8E%20Pushd%20Popd%20%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%96%B9%E5%BC%8F%EF%BC%9F.png)
我希望能够快速编辑多个文件。如果有一个工具可以让我以类似的方式堆叠文件,那就太好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 以便执行另一个操作,例如测试更改。这并不能真正让我摆脱依赖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。例如,如果您打开了多个终端,它们将具有独立的文件列表。