小编use*_*087的帖子

Bash完成:在别名完成中荣获特定于存储库的Git别名

假设bash配置了以下别名:

alias up="git --git-dir /path/to/backup/.git"

而那个特定的存储库 - 只有该存储库 - 具有以下git别名:

[alias]
backup = commit --allow-empty-message
Run Code Online (Sandbox Code Playgroud)

怎么能up自动完成backup?


这自动完成backup但不是up:

cd /a/different/dir
git --git-dir=/path/to/backup/.git ba
Run Code Online (Sandbox Code Playgroud)

这是up使用标准git命令自动完成但不是backup:

complete -o bashdefault -o default -o nospace -F __git_wrap__git_main up


编辑:Etan是对的,完成功能需要查看扩展的别名,所以我创建了以下内容:

CompletableAlias() {
    if (($#<2)); then
        return 1
    fi
    source_c="$1"
    target_c="$2"
    target_a=( "${@:2}" )
    target_s="${target_a[*]}"
    alias "${source_c}=${target_s}"
    completion_modifier="__${source_c}_completion"
    completion_original="$( complete -p "$target_c" 2>/dev/null |
                            sed 's/.*-F\W\+\(\w\+\).*/\1/'
                          )"
    if [[ -n "$completion_original" ]]; then
        read …
Run Code Online (Sandbox Code Playgroud)

git bash bash-completion

29
推荐指数
1
解决办法
650
查看次数

strace一个python函数

是否有可能为打开的文件划分python函数,并区分它们是否由python或子进程打开?

read_python, read_external = [], []

@strace_read(read_python, read_external)
function test():
    file = open("foo.txt", "r")
    subprocess.call(["cat", "bar.txt"])

for file in read_python:
    print("python:      ", file)
for file in read_external:
    print("external:    ", file)
Run Code Online (Sandbox Code Playgroud)

所以输出如下:

>>> python:      foo.txt
>>> external:    bar.txt
Run Code Online (Sandbox Code Playgroud)

我最感兴趣的是使用装饰器.区分不是优先事项.

从概念上讲,我最好的猜测是load_function(open)用包装器替换实例......实际上,我不知道,有太多的方法可以访问open.

python strace

6
推荐指数
1
解决办法
3936
查看次数

libtool 安装保留可执行文件的临时 rpath

我正在修改一个与Automake / libtool文档提供的示例非常相似的项目。摘录:

顶级configure.ac:

LT_INIT
Run Code Online (Sandbox Code Playgroud)

顶级 Makefile.am:

ACLOCAL_AMFLAGS = -I m4
SUBDIRS = src doc
Run Code Online (Sandbox Code Playgroud)

./src 生成文件.am:

lib_LTLIBRARIES = libname.la
libname_la_SOURCES = <my cc file list>
libname_la_LDFLAGS = -no-undefined -version-info $(GENERIC_LIBRARY_VERSION)
include_HEADERS = <my h file list>

bin_PROGRAMS = progname
progname_SOURCES = <my cc file list>
progname_LDADD = libname.la
progname_LDFLAGS = -static
Run Code Online (Sandbox Code Playgroud)

在我的包创建软件提供的fakeroot环境中,我执行以下命令

$ autogen.sh # contains the usual calls to aclocal, libtoolize, automake, autoconf.
$ ./configure --prefix="/usr" --disable-static
$ make
 ...
 /bin/sh ../libtool  --tag=CXX   --mode=link g++ -Wall …
Run Code Online (Sandbox Code Playgroud)

linux automake rpath libtool

5
推荐指数
1
解决办法
1205
查看次数

X11:列出顶级窗口

到目前为止,我发现了两种方法:

  1. 对于每个根窗口(默认屏幕、特定屏幕、所有屏幕等),列出每个直接子窗口。递归地搜索每个直接子节点以查找具有该WM_STATE属性的窗口;该窗口成为直接子级的顶级应用程序窗口,所有递归都可以停止。如果直接子级的层次结构中没有窗口具有该WM_STATE属性,则假定直接子级本身就是顶级应用程序窗口。

    • 使用xcb_get_property, and xcb_query_tree(尽管名称仅列出直系孩子)。

    • 这就是xlsclients使用的,通过 XCB(与上面相同的算法,或多或少)。

    • 要求:需要 ICCCM(窗口管理器)支持WM_STATE.

  2. 对于每个根窗口(默认屏幕、特定屏幕、所有屏幕等),获取“_NET_CLIENT_LIST”属性,该属性列出了窗口管理器管理的所有顶级应用程序窗口。

    • 使用xcb_get_property.

    • 这是wmctrl通过 Xlib 使用的。

    • 需要窗口管理器来维护列表。一些窗口似乎逃脱了列表。

    • 要求:EWMH(窗口管理器)支持_NET_CLIENT_LIST或_WIN_CLIENT_LIST(我不知道第二个是什么;我找不到任何文档)。

问题:

  1. 还有其他方法吗?是否有任何方法不依赖于外部机制,例如 ICCCM 或 EWMH?

  2. 哪种方法最有弹性?

    1. EWMH。我发现一些报告(上面链接)说某些应用程序没有在_NET_CLIENT_LIST. 为什么是这样?
    2. 国际商会。这种方法似乎更灵活,但是如果假设缺少的层次结构的直接子WM_STATE级是顶级应用程序窗口,那么是否会匹配无窗口应用程序?更糟糕的是,它不会在虚拟根窗口下严重崩溃吗?例如,虚拟根窗口成为唯一的直接子窗口,递归将在第一个应用程序窗口上停止WM_STATE;只会匹配一个窗口。针对这种可能性,xlsclients不包括对虚拟根窗口的任何检查……那么为什么它可以与 GNOME(使用虚拟根窗口)一起使用?

x11 window icccm ewmh

5
推荐指数
0
解决办法
1101
查看次数

从常规文件读取:阻止还是返回较少的数据?

是否有可能read以

  • 块
  • 返回的数据少于请求的数据

从常规文件读取时,不包括:

  • 请求的数据多于SSIZE_MAX
  • 超越EOF的阅读
  • 信号中断

read(3)建议除上述条件外,从常规文件中读取数据时,read返回的字节数永远不会少于请求的字节数。

如果文件中剩余的字节数小于nbyte,read()请求被信号中断,或者文件是管道或FIFO或特殊文件且小于,则返回的值可能小于nbyte。 nbyte个字节立即可供读取。

但是,此答案提出了一个假设,即read如果内核希望优先处理其他I / O ,则返回的字节数可能会少于所请求的字节数。尽管是假设的,但要点是,在任何条件下都无法读取预期返回的数据与请求的数据一样多。因此,即使以上三个条件(SSIZE_MAX,EOF,中断)不适用,也不能read在不检查返回值的情况下在常规文件上使用,这是绝对不安全的:

// all blockable signals have been ignored
// 10 is guaranteed less than SSIZE_MAX
// file size is known, access is locked
if (read(fd_of_big_reg_file_with_zero_offset, buf, 10) < 0) {
    // so all we have to do is handle errors
}
Run Code Online (Sandbox Code Playgroud)

此外,我从未经历过对常规文件的读取以进行阻止,但是我假设在发生可恢复的I / O错误(例如需要多次重读的坏块)的情况下,这是有可能的。

c io posix

4
推荐指数
1
解决办法
573
查看次数

python:使用 XResQueryClientIds 将 PID 转换为 X11 窗口 ID

注意:这是对“什么进程创建了这个 X11 窗口?”的回答的延续。来自 unix.stackexchange。该答案提到了XResQueryClientIdsX -Resource v1.2 扩展。我想知道如何使用它。

如何使用python 的 xcfib 模块查找与提供的 PID 关联的所有 X11 窗口 ID(假设没有竞争条件;窗口或进程没有被创建或销毁)。

我对 X11 不太了解,XCB API 文档似乎不完整,自动生成的 xcfib python 绑定也没有文档记录。根据我收集的信息,我需要:

  1. 创建连接:xcb_connect
  2. 获取扩展名:?未记录?
  3. 查询扩展名:? xcb_get_extension_data提到“?QueryExtension 请求”
  4. 获取查询响应:xcb_get_extension_data
  5. 使用扩展文档和协议存根 API来解压响应。

python x11 xcb

4
推荐指数
1
解决办法
1004
查看次数

VIM:确定是否从视觉块模式调用函数

从函数内部,如何确定该函数是否是从可视块模式调用的。这涉及从以下两个方面调用该函数:

  • 正常模式映射
  • 命令行模式

对于精确的功能,幸运的是它在普通/命令模式或视觉模式下的行为相同,并选择了一行。显然有不止一行 - 来自a:firstline/lastline- 该函数不是从正常模式调用的。

现在的问题是我需要知道我是否处于可视块模式,单行与否。

我已经尝试了以下所有方法都无济于事:

function! T() range
    echo [a:firstline, a:lastline]
    echo [getpos("'<")[1:2], getpos("'>")[1:2]]
    echo visualmode()
    echo mode()
endfun
vnoremap TT :call T()<CR>
nnoremap TT :call T()<CR>
Run Code Online (Sandbox Code Playgroud)

视觉线模式的输出(注意疯狂的 max-int 输出):

[3, 4]
[[3, 1], [4, 2147483647]]
V
n
Run Code Online (Sandbox Code Playgroud)

我需要“无法完成”或“循序渐进”的各种答案。没有模糊的做这个然后做那个然后完成这个......我厌倦了跳过晦涩的VIM Goldberg-esque漏洞只是为了完成任何内置功能没有提供的简单任务,老实说我的vim-fu是还年轻。

vim

3
推荐指数
1
解决办法
1104
查看次数

标签 统计

python ×2

x11 ×2

automake ×1

bash ×1

bash-completion ×1

c ×1

ewmh ×1

git ×1

icccm ×1

io ×1

libtool ×1

linux ×1

posix ×1

rpath ×1

strace ×1

vim ×1

window ×1

xcb ×1