首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关联数组,文件名引用路径,用于dmenu。

关联数组,文件名引用路径,用于dmenu。
EN

Stack Overflow用户
提问于 2019-01-24 16:37:25
回答 3查看 406关注 0票数 2

我开始玩dmenu,它似乎对几乎每件事都是一种自动化。不幸的是,我不熟悉bash,它应该在我的名单上。

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

如果文件的路径是

代码语言:javascript
复制
/home/user/docs/markdown/practice01/rmd/network.rmd

我想要

代码语言:javascript
复制
network

作为我的菜单上的选项。所以当我选择

代码语言:javascript
复制
network -----> /home/user/docs/markdown/practice01/rmd/network.rmd

这是我破碎的剧本。我错过了几件事。

  1. 这样我就可以在我的菜单上找到我不需要的完整路径。我试着阅读有关关联数组的内容,但我无法在bash中找到它。
  2. 这个脚本可以工作,但是如果我决定选择ESC并退出,它仍然会在我的目录中打开一个空的vim。因此,我应该知道,如果声明,嗯!
代码语言:javascript
复制
#!/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"

我举了个小例子。但问题是,添加每个文件是一项手工工作,我们肯定不想做正确的工作!

代码语言:javascript
复制
#!/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"]}"

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-14 03:17:35

关联数组可能很奇怪..。但是,将输出返回到变量使作为bash中任何其他字符串的操作变得更容易,如下面的示例所示:

代码语言:javascript
复制
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管理传递和减价注释:

另外,下面列出了几篇可能对你有帮助的文章:

票数 1
EN

Stack Overflow用户

发布于 2019-01-24 16:56:20

不要将一些代码放入数组中,而是使用一个函数!

代码语言:javascript
复制
my_dmenu() {
    dmenu -l 10 -i -nb "#eaeaea" -sb "#e53935" -nf "#474747"
}

如果您的标记文件都在同一个文件夹中(而不是在子文件夹中),那么您当然不需要find:使用一个glob!如果您的文件位于子文件夹中,则使用glob代替(使用globstar shell选项)。

总而言之:

代码语言:javascript
复制
#!/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文件,请使用:

代码语言:javascript
复制
shopt -s nullglob globstar

files=( **/*.rmd )

编辑以解决您的评论中的要求(以及编辑您的问题):

如果要删除dmenu中显示的.rmd后缀,请使用:

代码语言:javascript
复制
chosen_file=$(printf '%s\n' "${files[@]%.rmd}" | my_dmenu)

# ...

st vim "$chosen_file.rmd"

展开${files[@]%.rmd}将从数组files的每个字段中删除后缀.rmd。在编辑文件时不要忘记添加这个后缀(如最后一行所示)。

票数 1
EN

Stack Overflow用户

发布于 2019-01-24 16:42:26

代码语言:javascript
复制
dmenuoptions="-l 10 -i -nb '#eaeaea' -sb '#E53935' -nf '#474747'"
st -e vim $(find ~/docs/markdown -type f -name '*.rmd' | dmenu $dmenuoptions)
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54351412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档