小编jin*_*123的帖子

使用 C++ std::visit 时如何改进编译器错误消息?

我在具有std::visit()许多替代方案的变体上使用 C++17 的函数,每当我忘记访问者中的一个或多个替代方案时,编译器生成的错误消息都非常难以理解。

例如

template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;

using Foo = std::variant<A, B, /* ... many more alternatives ... */>;

Foo foo;

std::visit(overloaded{
    [](A const& a) { /* ... */ },
    [](B const& b) { /* ... */ },
    /* ... forgot 1+ alternatives ... */
    }, foo
);
Run Code Online (Sandbox Code Playgroud)

在上面的代码示例中,编译器可以生成长度为数千个字符的错误消息,具体取决于替代方案的数量。有没有办法改进这些错误消息,以便编译器输出类似以下内容?

example.cc:8-13: error: Non-exhaustive visitor -- missing alternative of type 'X'
Run Code Online (Sandbox Code Playgroud)

c++ compiler-errors std-variant

10
推荐指数
1
解决办法
1101
查看次数

如何根据Bash中的VI模式更改光标形状?

我的.bashrc中有以下行:

set -o vi
Run Code Online (Sandbox Code Playgroud)

当我处于插入模式时,我希望我的光标具有管道形状,当我处于命令模式时,我希望我的光标具有块形状,就像我在Vim中将以下内容放在我的.vimrc中一样:

let &t_SI = "\e[6 q"
let &t_SR = "\e[4 q"
let &t_EI = "\e[2 q"
Run Code Online (Sandbox Code Playgroud)

除非在这种情况下,我希望在命令行上具有等效行为.

我在这里找到了我的问题的部分答案 - https://unix.stackexchange.com/questions/22527/change-cursor-shape-or-color-to-indicate-vi-mode-in-bash - 由@gogolb撰写.

这是答案,复制:

#!/bin/bash
# Script "kmtest.sh"

TEST=`bind -v | awk '/keymap/ {print $NF}'`
if [ "$TEST" = 'vi-insert' ]; then
    echo -ne "\033]12;Green\007"
else
    echo -ne "\033]12;Red\007"
fi

export PS1="\u@\h \$(kmtest.sh)> "
Run Code Online (Sandbox Code Playgroud)

不幸的是,正如答案中所解释的那样,示例脚本仅在回车后更改光标形状,而我想要的是当我点击<Esc>时(即当我更改模式时)光标形状会改变.

我在Linux上运行本机终端应用程序,使用Bash 4.4.7和我的$ TERM变量设置为xterm-256color.另外,我不知道tmux对我要求的是否有任何影响,但理想情况下,我希望该解决方案能够在tmux会话内部和外部工作.


我自己最终发现了这个问题的答案,我在另一个问题中描述了这个问题:

如何正确地将修补后的GNU readline库链接到所有现有程序?

别担心,该解决方案不需要任何修补.;)

bash terminal xterm

7
推荐指数
2
解决办法
2011
查看次数

如何使用.htaccess拒绝对当前目录的所有子目录的访问?

假设我有以下目录结构:

/
/opt
/opt/lampp
/opt/lampp/htdocs/
/opt/lampp/htdocs/...
/opt/lampp/htdocs/.../project
Run Code Online (Sandbox Code Playgroud)


然后在project/目录中,我有以下目录结构:

project/
project/.htaccess
project/index.php
project/dashboard.php
project/theme.css
project/...
project/subdir-1
project/subdir-1/...
project/subdir-2
project/subdir-2/...
project/subdir-3
project/subdir-3/...
Run Code Online (Sandbox Code Playgroud)


我应该写什么来project/.htaccess允许访问project/目录中的所有文件,但拒绝访问所有子目录(即subdir-*)以及每个子目录中的所有文件?

这是我到目前为止所拥有的:


.htaccess

# Deny access by default
Order deny,allow
Deny from all

# Allow access to all PHP/CSS files in current directory
<Files ~ "[^/]\{0,}\.(php|css)$">
    Allow from all
</Files>
Run Code Online (Sandbox Code Playgroud)


我基本上试图允许访问所有 PHP/CSS 文件,但'/'文件名中带有 a 的文件除外;但是,结果是我无法访问任何内容。完成此任务的正确方法是什么?

另外,是否有跨平台的方法来做到这一点(即它可以在 UNIX/Linux 和 Windows 服务器上工作)?

apache .htaccess webserver web-services web

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

如何将已修补的 GNU readline 库正确链接到所有现有程序?

我最初的问题是,我想要一种方法来区分在 vi 模式下使用 bash 时是处于 vi 命令模式还是 vi 插入模式。据我所知,从 GNU readline 7.0 开始,有一种方法可以在命令提示符中设置指示器;然而,我想要的是改变光标的形状(即在插入模式下为垂直线,在命令模式下为实心块)。


注意: 我已经尝试将以下内容放入我的 .inputrc 中,这确实起到了作用,但在命令模式下移回行首时引起了一些问题,所以我得出的结论是这不是一个好的选择。

set show-mode-in-prompt on
set vi-cmd-mode-string "\e[2 q"
set vi-ins-mode-string "\e[6 q"
Run Code Online (Sandbox Code Playgroud)


我看到一篇由有同样问题的人写的文章,最终决定自己修补 GNU readline 库,链接如下:

http://blog.mkoskar.com/2010/10/gnu-readline-vi-mode-visualization.html http://blog.mkoskar.com/2010/11/gnu-readline-vi-mode-visualization-2 .html


到目前为止,我已经能够成功应用补丁并编译/安装库(在本地...我更愿意保留安装的未打补丁的版本,以防我想切换回来),但 bash 似乎仍在使用原来的。

以下是重要细节:

1)修补后的库文件(静态和动态)位于我的计算机上的$HOME/.local/lib/
2)我确定的原始库文件(仅限动态)位于/lib/x86_64-linux-gnu/
3) 我的 LD_LIBRARY_PATH 环境变量设置$HOME/.local/lib:为我的 .bashrc 中。


即使安装了修补版本并且正确设置了 LD_LIBRARY_PATH 变量,Bash 似乎仍然不使用我修补的 GNU readline 库。我想知道我是否做错了什么?

我希望问题不是 Bash 附带的 readline 库已经静态链接,我想,需要我重新安装 Bash(以及使用该库的任何其他程序,例如 iPython),在修补版本中手动链接阅读线。


解决方案

虽然不是标题中列出的问题的解决方案,但这是我遇到的原始问题的解决方案。浏览 Readline 的手册页后,我发现了以下关于vi-cmd-mode-string和 的描述vi-ins-mode-string

vi-cmd-mode-string ((cmd)) …
Run Code Online (Sandbox Code Playgroud)

bash terminal readline libreadline

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

如何在Python 3中获取当前语言环境的字母表?

在Python 2中,您可以执行以下操作来获取当前区域设置的字符集:

import string
print string.letters
Run Code Online (Sandbox Code Playgroud)

然而,在Python 3字符串模块的区域设置相关的常数(例如string.letters,string.lowercase,string.uppercase等等)除去.


如何使用Python 3获取当前语言环境的字符集?

python locale python-3.x

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

具有空参数的函数式宏的标准行为在##运算符旁边?

请看以下示例:

#define FOO(x) bar x ## baz
FOO( )
Run Code Online (Sandbox Code Playgroud)

在预处理阶段之后,根据ANSI C和C99标准,上述代码的预期输出是多少?

我跑的上面通过gcc -Eclang -E,两者产生的输出等效于以下语句:

bar baz
Run Code Online (Sandbox Code Playgroud)


另外,如果上述预处理输出被认为符合标准,那么这个呢?

#define FOO(x) x ## baz
FOO( )
Run Code Online (Sandbox Code Playgroud)

通过上面的修改,GCC和clang仍然产生相当于以下的输出,而不会发出任何警告或错误(即使有-Wall -Werror标志):

baz
Run Code Online (Sandbox Code Playgroud)


我怀疑上述输出不符合标准的原因是ANSI C 9899:1990标准规定:

6.8.3.3 ##运算符

一个##预处理标记不得在开头或用于宏定义的任一形式的替代列表的末尾出现.

如果在替换列表中,参数紧跟在##预处理标记之前或之后,则该参数将由相应参数的预处理标记序列替换.

好的,从技术上来说,##运算符不是上述两个示例中的替换列表的开头,但x确实扩展到......单个空格?没有?...所以##运算符(至少,据我所知)是将空格pp-token(或无)连接到baz.


此外,标准规定:

对于这两种对象类和函数宏调用,进行复核更多宏名称来替换替换列表之前,一个的每个实例##在替换列表(而不是从一个参数)预处理标记被删除,并且前述预处理标记与以下预处理标记连接.

所以,考虑到我上面给出的第一个例子,为什么不应该正确输出呢?

barbaz
Run Code Online (Sandbox Code Playgroud)


UPDATE

作为旁注,我确实设法让GCC在预处理代码时给出了上面给出的第一个例子的错误,如下所示:

gcc -ansi -pedantic -Wall -Werror -E ex1.c -o -
Run Code Online (Sandbox Code Playgroud)

输出(有错误)是:

foo.c:2:6: error: invoking macro FOO argument 1: …
Run Code Online (Sandbox Code Playgroud)

c preprocessor c-preprocessor

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

如何给CMake生成的文件添加执行权限?

我有一个文件wrapper.sh.in,其内容如下:

#!/bin/bash
DEPENDENCY_VERSION=@dependency_VERSION@
/location/of/installed/dependency/${DEPENDENCY_VERSION}/some_script.sh "$@"
Run Code Online (Sandbox Code Playgroud)

这个wrapper.sh.in脚本具有常规不可执行文件(0644)的通常文件权限,但我需要CMake 生成的文件具有执行权限,因为它是一个脚本,因此意味着要运行。


以下是我当前在 CMakeLists.txt 中执行的操作,以生成包装器脚本:

configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.sh.in
    ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.sh
    @ONLY
    )
Run Code Online (Sandbox Code Playgroud)


这是我尝试更改生成的wrapper.sh脚本的权限的方法。

尝试#1(失败):

file(
    COPY ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.sh
    DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}
    FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
    )
Run Code Online (Sandbox Code Playgroud)

尝试#2(失败):

install(
    FILES ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.sh
    DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}
    PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
    COMPONENT runtime
    )
Run Code Online (Sandbox Code Playgroud)


将生成的wrapper.sh脚本的文件权限更改为普通脚本的文件权限(0755)的 正确方法是什么?

cmake

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

读取 setup.cfg 配置时出现 Python setuptools AttributeError

我有以下setup.py文件:

import setuptools
import setuptools.config

_CONFIG = setuptools.config.read_configuration('setup.cfg')

setuptools.setup(
    **_CONFIG
    )
Run Code Online (Sandbox Code Playgroud)

...和setup.cfg文件:

[metadata]
name = Example
version = 1.0.0
author = First Last
author_email = first.last@example.com
home_page = https://www.github.com/firstlast/example
description = Example is an example project.
long_description = file: README.md
license_file = LICENSE
platform = any
keywords = example
classifiers =
  Programming Language :: Python
  Programming Language :: Python :: 2.7
  Programming Language :: Python :: 3.3
  Programming Language :: Python :: 3.4
  Programming Language :: …
Run Code Online (Sandbox Code Playgroud)

python setuptools

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