如何使用 vim 打开目录下的每个.txt文件(使用 Bash)



我正在尝试以下方法,以使用vim打开当前目录下的每个txt文件。

find . -name "*.txt" -print | while read aline; do
  read -p "start spellchecking fine: $aline" sth
  vim $aline
done

运行它bash抱怨

Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.

谁能解释可能出现什么问题?另外,我打算在使用 vim 之前使用 read -p 作为提示,但没有成功。

尝试:

vim $( find . -name "*.txt" )

要修复您的解决方案,您可以(可能)执行以下操作:

find . -name "*.txt" -print | while read aline; do
      read -p "start spellchecking fine: $aline" sth < /dev/tty
      vim $aline < /dev/tty
done

问题是整个 while 循环从 find 获取其输入,而 vim 继承了该管道作为其标准。 这是从终端获取 vim 输入的一种技术。 (不过,并非所有系统都支持/dev/tty

使用 shopt -s globstar 您可以清除 find,从而使 bash 不在从 find 接收输出的子 shell 中执行 vim:

shopt -s globstar
shopt -s failglob
for file in **/*.txt ; do
    read -p "Start spellchecking fine: $file" sth
    vim "$file"
done

.另一个想法是使用

for file in $(find . -name "*.txt") ; do

(如果没有带空格或换行符的文件名。

通常最简单的解决方案是最好的,我相信就是这样:

vim -o `find . -name *.txt -type f`

-type f 是为了确保只打开以 .txt 结尾的文件,因为您不会忽视可能存在名称以".txt"结尾的子目录的可能性。

这将在 vim 中的单独窗口/bufer 中打开每个文件,如果您不需要这样做并且对使用 :next 和 :p refix 来浏览文件感到满意,请从上面建议的 comand-line 中删除"-o"。

在一个

vim实例中打开所有文件的正确方法是(前提是文件数不超过最大参数数):

find . -name '*.txt' -type f -exec vim {} +

另一种完全回答OP的可能性,但好处是对于包含空格或有趣符号的文件名是安全的。

find . -name '*.txt' -type f -exec bash -c 'read -p "start spellchecking $0"; vim "$0"' {} ;

相关内容

  • 没有找到相关文章

最新更新