关联数组,文件名指向dmenu的路径

时间:2019-01-24 16:37:25

标签: bash

然后我开始使用dmenu,似乎几乎所有东西都具有这种自动化。不幸的是,我对bash不熟悉,应该放在我的清单上。

我有一个Markdown文件夹,其中包含包含文件的子文件夹。我正在尝试使用脚本在使用别名时在dmenu中显示它们。

如果文件路径是

/home/user/docs/markdown/practice01/rmd/network.rmd

我想拥有

network

作为我菜单中的一个选项。所以当我选择

network -----> /home/user/docs/markdown/practice01/rmd/network.rmd

这是我破碎的剧本。我缺少一些东西。

  1. 这样,我就可以在dmenu上获得不需要的完整路径。我试图阅读有关关联数组的信息,但无法在bash中弄清楚。

  2. 该脚本有效,但是如果我决定退出并退出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"]}"

谢谢

3 个答案:

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