然后我开始使用dmenu,似乎几乎所有东西都具有这种自动化。不幸的是,我对bash不熟悉,应该放在我的清单上。
我有一个Markdown文件夹,其中包含包含文件的子文件夹。我正在尝试使用脚本在使用别名时在dmenu中显示它们。
如果文件路径是
/home/user/docs/markdown/practice01/rmd/network.rmd
我想拥有
network
作为我菜单中的一个选项。所以当我选择
network -----> /home/user/docs/markdown/practice01/rmd/network.rmd
这是我破碎的剧本。我缺少一些东西。
这样,我就可以在dmenu上获得不需要的完整路径。我试图阅读有关关联数组的信息,但无法在bash中弄清楚。
该脚本有效,但是如果我决定退出并退出ESC,它仍然会在我的目录中打开一个空的vim。因此,我应该知道语句是不是!
#!/bin/bash
DMenu=("dmenu -l 10 -i -nb "#eaeaea" -sb "#E53935" -nf "#474747"")
cd ~/docs/markdown/
target=$(find -type f -name '*.rmd' | $DMenu)
st vim "$target"
我举了一个小例子。但是问题在于,添加每个文件是手动操作,我们绝对不想这么做!
#!/bin/bash
declare -A dotfiles
dotfiles[i3]="/home/user/dotfiles/i3/.config/i3/config"
dotfiles[vimrc]="/home/user/dotfiles/vim/.vimrc"
list=("i3\nvimrc")
target=$(echo -e $list | dmenu -i -nb "#eaeaea" -sb "#E53935" -nf "#474747")
st vim "${dotfiles["$target"]}"
谢谢
答案 0 :(得分:1)
使用函数代替将一些代码放入数组中!
my_dmenu() {
dmenu -l 10 -i -nb "#eaeaea" -sb "#e53935" -nf "#474747"
}
如果您的markdown文件都在同一个文件夹中(而不是子文件夹中),那么您当然不需要find
:而是使用glob!并且如果文件位于子文件夹中,请改用glob(使用globstar
shell选项)。
总共:
#!/bin/bash
my_dmenu() {
dmenu -l 10 -i -nb "#eaeaea" -sb "#e53935" -nf "#474747"
}
base_dir=~/docs/markdown
# Also, check the return code of cd!
cd "$base_dir" || { echo >&2 "Can't cd to $base_dir. Exiting"; exit 1; }
# Using a glob: use the shell option nullglob
shopt -s nullglob
files=( *.rmd )
# Check that there are some files found:
if (( ${#files[@]} == 0 )); then
echo "No files found. Exiting."
exit 1
fi
# Now we're ready to send the files to dmenu:
chosen_file=$(printf '%s\n' "${files[@]}" | my_dmenu)
# If dmenu returns nothing: don't launch vim!
if [[ ! $chosen_file ]]; then
echo "No files selected. Exiting."
exit 1
fi
# Now you can launch vim!
st vim "$chosen_file"
如果您还想在子文件夹中找到*.rmd
文件:请改用:
shopt -s nullglob globstar
files=( **/*.rmd )
编辑以解决评论中的要求(以及问题的编辑):
如果要删除.rmd
后缀以显示在菜单中,请使用:
chosen_file=$(printf '%s\n' "${files[@]%.rmd}" | my_dmenu)
# ...
st vim "$chosen_file.rmd"
扩展${files[@]%.rmd}
将从数组.rmd
的每个字段中删除后缀files
。编辑文件时,请不要忘记添加此后缀(如最后一行所示)。
答案 1 :(得分:1)
关联数组可能很奇怪...但是将输出返回到变量可以使它像bash中的任何其他字符串一样易于操作,如下例所示:
prefix="$HOME/git/notes"
suffix=".md"
shopt -s nullglob globstar
item=( "$prefix"/**/*${suffix}) # Search *.md in all dirs/subdirs
item=( "${item[@]#"$prefix"/}" )
item=( "${item[@]%${suffix}}" ) # Removes '.md' string from item name
result=$(printf '%s\n' "${item[@]}" | dmenu)
[[ -n $result ]] || exit # exit if nothing is found
gedit "${prefix}/${result}.md" # Open file by adding again '.md'
在模式${variable%substring}
中使用百分号(%)时,它将返回该变量的内容,该子字符串出现的次数最少,该子字符串从该变量的后面删除。
下面列出的两个示例供我参考,一个是在Bash中编写的,另一个是在Python中编写的示例,这些示例用于使用dmenu管理通过和降价注释:
此外,以下列出的几篇不错的文章可能会对您有所帮助:
答案 2 :(得分:-2)
dmenuoptions="-l 10 -i -nb '#eaeaea' -sb '#E53935' -nf '#474747'"
st -e vim $(find ~/docs/markdown -type f -name '*.rmd' | dmenu $dmenuoptions)