我开始玩dmenu,它似乎对几乎每件事都是一种自动化。不幸的是,我不熟悉bash,它应该在我的名单上。
我有一个文件夹用于我的减价,子文件夹包含我的文件。我正在尝试有一个脚本,以便在使用别名时在dmenu中显示它们。
如果文件的路径是
/home/user/docs/markdown/practice01/rmd/network.rmd我想要
network作为我的菜单上的选项。所以当我选择
network -----> /home/user/docs/markdown/practice01/rmd/network.rmd这是我破碎的剧本。我错过了几件事。
#!/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"]}"谢谢
发布于 2020-01-14 03:17:35
关联数组可能很奇怪..。但是,将输出返回到变量使作为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管理传递和减价注释:
另外,下面列出了几篇可能对你有帮助的文章:
发布于 2019-01-24 16:56:20
不要将一些代码放入数组中,而是使用一个函数!
my_dmenu() {
dmenu -l 10 -i -nb "#eaeaea" -sb "#e53935" -nf "#474747"
}如果您的标记文件都在同一个文件夹中(而不是在子文件夹中),那么您当然不需要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 )编辑以解决您的评论中的要求(以及编辑您的问题):
如果要删除dmenu中显示的.rmd后缀,请使用:
chosen_file=$(printf '%s\n' "${files[@]%.rmd}" | my_dmenu)
# ...
st vim "$chosen_file.rmd"展开${files[@]%.rmd}将从数组files的每个字段中删除后缀.rmd。在编辑文件时不要忘记添加这个后缀(如最后一行所示)。
发布于 2019-01-24 16:42:26
dmenuoptions="-l 10 -i -nb '#eaeaea' -sb '#E53935' -nf '#474747'"
st -e vim $(find ~/docs/markdown -type f -name '*.rmd' | dmenu $dmenuoptions)https://stackoverflow.com/questions/54351412
复制相似问题