您尚未登录。

#31 2021-09-21 15:38:41

守約
会员
注册时间: 2021-08-21
帖子: 22

Re: 關於從Windows全面轉向ArchLinux可行性方案的嘗試

SamLukeYes 说:
守約 说:
SamLukeYes 说:
守約 说:

啊?是什麽問題呀?我暫時還沒察覺有什麽問題,你說的是哪方面的呀,安裝不成功還是什麽,我還是之前看不知道哪個帖子裡這樣說的,就記下了。

-Sy 后面一定要接 u,不然就会只更新了软件包数据库而没有更新已安装的软件包,再获取新的软件包就可能导致部分更新。

是這樣的,-sy我看說是同步軟件倉庫,所以每次我安裝包的時候用-sy,然後-syu我看的說是更新的,我就每次開機或關機的時候用一次-syu,請問我這樣用能不能避免你說的那個部分更新的情況啊?

不更新的时候不要同步软件仓库,只要定期滚就行

你的意思是說裝東西就衹用-S,然後更新就-Syu,是這樣子嗎?


無論何時何地,也要遵守約定。

离线

#32 2021-09-21 17:54:56

SamLukeYes
会员
所在地: Canton, China
注册时间: 2020-07-19
帖子: 171
个人网站

Re: 關於從Windows全面轉向ArchLinux可行性方案的嘗試

守約 说:

你的意思是說裝東西就衹用-S,然後更新就-Syu,是這樣子嗎?

是的。可以设想一下这样一种情况:假如你的 Arch 有几个小时或者几天没滚了,有些软件包已经过期,但落后得还不是太多。这时,如果你需要安装一个新的软件包,只用 -S 的话,pacman 就会根据本地的数据库试图取回和系统上次更新的时间点相匹配的软件包版本。由于软件仓库通常会保留若干个历史版本(没记错的话惯例是 3 个),即使要装的这个包有更新了,pacman 仍然大概率能取回正确的版本(如果找不到的话就说明远程仓库已经把这个历史版本删了,该滚一滚了)。但如果用了 -Sy,就会造成数据库已经更新,而实际安装的软件包还没更新的情况。这时再安装新的软件包,就有可能造成“部分更新”。为了保证软件包数据库和实际安装的软件包版本的一致性,-S 的选项 y 一定要和 u 一起使用。


Using Arch Linux on Surface Pro 6

离线

#33 2021-09-21 23:00:31

守約
会员
注册时间: 2021-08-21
帖子: 22

Re: 關於從Windows全面轉向ArchLinux可行性方案的嘗試

SamLukeYes 说:
守約 说:

你的意思是說裝東西就衹用-S,然後更新就-Syu,是這樣子嗎?

是的。可以设想一下这样一种情况:假如你的 Arch 有几个小时或者几天没滚了,有些软件包已经过期,但落后得还不是太多。这时,如果你需要安装一个新的软件包,只用 -S 的话,pacman 就会根据本地的数据库试图取回和系统上次更新的时间点相匹配的软件包版本。由于软件仓库通常会保留若干个历史版本(没记错的话惯例是 3 个),即使要装的这个包有更新了,pacman 仍然大概率能取回正确的版本(如果找不到的话就说明远程仓库已经把这个历史版本删了,该滚一滚了)。但如果用了 -Sy,就会造成数据库已经更新,而实际安装的软件包还没更新的情况。这时再安装新的软件包,就有可能造成“部分更新”。为了保证软件包数据库和实际安装的软件包版本的一致性,-S 的选项 y 一定要和 u 一起使用。

啊,原來是這樣,非常感謝你的耐心回答,這樣我以後就記住了,非常感謝!


無論何時何地,也要遵守約定。

离线

#34 2021-09-25 01:04:30

tanloong
会员
注册时间: 2021-08-15
帖子: 8

Re: 關於從Windows全面轉向ArchLinux可行性方案的嘗試

恰好我用的就是 slstatus,我整理了一下它的配置方法,希望能有用。

下载

使用 git 下载 slstatus 的源代码,这里我下载到家目录下的 software 目录。

git clone https://git.suckless.org/slstatus ~/software/slstatus # 下载源代码
配置

编辑 config.h 来自定义您的状态栏,拿我的为例,以供参考。

const unsigned int interval = 2000; 
// 每隔 2s 更新一次
static const char unknown_str[] = "n/a";
// 如果某个值不存在,就显示 n/a(默认),比如断网时 IP 地址就会显示成 n/a
#define MAXLEN 2048
// 状态栏最大字符数量 MAXLEN,如果超过了它,第 MAXLEN 个字符及其右边的字符会被丢弃。
// 下面的注释介绍了 slstatus 的各种函数,每个函数负责显示一项信息。

/*
 * 函数                 描述                                 参数 (示例)
 *
 * battery_perc        电量(百分比形式)                  电池名称 (BAT0)
 *                                                         在 OpenBSD/FreeBSD 上无需参数
 * battery_state       电池的状态:是不是正在充电          电池名称 (BAT0)
 *                                                         在 OpenBSD/FreeBSD 上无需参数
 * battery_remaining   剩下的电量还能撑多久                电池名称 (BAT0)
 *                                                         在 OpenBSD/FreeBSD 上无需参数
 * cpu_perc            CPU 的利用率(百分比形式)          无
 * cpu_freq            CPU 的频率(单位是 MHz)            无
 * datetime            日期和时间                          格式化字符串 (%F %T)
 * disk_free           硬盘还剩多少(单位是 GB)           硬盘的挂载点 (/)
 * disk_perc           硬盘已经使用了多少 (百分比形式)   硬盘的挂载点 (/)
 * disk_total          硬盘总量(单位是 GB)               硬盘的挂载点 (/)
 * disk_used           硬盘已经使用了多少(单位是 GB)     硬盘的挂载点 (/)
 * entropy             系统的可用熵值,该值越大系统越安全  无
 * gid                 当前用户的 GID                      无
 * hostname            主机名                              无
 * ipv4                IPv4 的地址                         网卡名字 (eth0)
 * ipv6                IPv6 的地址                         网卡名字 (eth0)
 * kernel_release      内核版本号                          无
 * keyboard_indicators 显示大写锁定和数字键盘是否开启      格式化字符串 (c?n?)

 * 参数由字母 c 和字母 n 构成,大小写都可以。c 表示大写锁定,n 表示数字键盘。
 * c 和 n 后面都可以附加一个问号"?"。
 * 如果加了问号 "?",只有锁定开启时才显示字母。比如开启大写锁定时显示 c,关闭时不显示。
 * 如果没加问号"?",锁定开启时显示大写字母,关闭时显示小写字母。

 * keymap              键盘布局                            无
 * load_avg            系统负载(共 3 个值,分别是 1 分钟、5 分钟和 15 分钟的平均负载)无
 * netspeed_rx         下行网速                            网卡名字 (wlan0)
 * netspeed_tx         上传网速                            网卡名字 (wlan0)
 * num_files           指定文件夹的文件数量                该文件夹的路径 (/home/foo/Inbox/cur)
 * ram_free            内存还剩多少(单位是 GB)           无
 * ram_perc            内存已经使用了多少(百分比形式)    无
 * ram_total           内存总量(单位是 GB)                无
 * ram_used            内存已经使用了多少(单位是 GB)     无
 * run_command         执行一个自定义的 shell 命令         具体的 shell 命令 (echo foo)
 * separator           各信息之间的分隔符                  无
 * swap_free           交换空间还剩多少(单位是 GB)       无
 * swap_perc           交换空间已经使用了多少(百分比形式)无
 * swap_total          交换空间总量(单位是 GB)           无
 * swap_used           交换空间已经使用了多少(单位是 GB) 无
 * temp                温度(单位是摄氏度)                传感器文件的路径 (/sys/class/thermal/...)
 *                                                         在 OpenBSD 上无需参数
 *                                                         在 FreeBSD 上需要热区 (thermal zone) 作参数 (tz0, tz1, etc.)
 * uid                 当前用户的 UID                      无
 * uptime              系统已经开机运行了多久              无
 * username            当前用户的用户名                    无
 * vol_perc            OSS/ALSA 音量(百分比形式)         mixer 文件的路径 (/dev/mixer)
 *                                                         在 OpenBSD 上无需参数
 * wifi_perc           WiFi 信号强度(百分比形式)         网卡名字 (wlan0)
 * wifi_essid          WiFi 的 ESSID                       网卡名字 (wlan0)
 */
static const struct arg args[] = {// 选择上面的函数,在下面添加您想让状态栏显示的信息
    // 函数          格式           参数 
    { ipv4,         " %s",         "wlan0" }, 
    // %s 代表 ipv4 的值;参数需要用双引号引起来,不能是单引号,
    // 因为 C 语言里单引号内的是字符常量,双引号内的是字符串常量,两者不一样。
    { separator,    "|",           NULL },
    // 用 "|" 间隔两项信息;参数 NULL 表示空,就是没有参数
    { battery_perc, "Battery %s%%","BAT0" },
    // 在 C 语言里 "%" 需要转义,用 "%%" 来表示
    { battery_state,"%s",          "BAT0" },
    { separator,    "|",           NULL },
    { disk_free,    "Disk %s",     "/" },
    { separator,    "|",           NULL },
    { vol_perc,     "Volume %s",   "/dev/mixer" },
    { separator,    "|",           NULL },
    { ram_free,     "Memory %s",   NULL },
    { separator,    "|",           NULL },
    { cpu_perc,     "CPU %s%%",    NULL },
    { separator,    "|",           NULL },
    { datetime,     "%s",          "%m月%d日周%u %H:%M" },
};
安装

slstatus 的默认安装目录是 /usr/local/,如果您想安装到别的地方,可以在执行下面的安装命令之前编辑 config.mk 文件,把第 7 行左右的 PREFIX 的值改成您想要的目录。这里我选择默认的安装目录。

执行下面的命令来安装 slstatus

cd ~/software/slstatus # 切换到 slstatus 目录
sudo make clean install # 安装

执行完后,slstatus 可执行程序和 slstatus.1 手册都已经被保存在安装目录 (默认 /usr/local/)下。

现在您可以把配置好的显示内容打印到终端上,来查看 slstatus 的效果

slstatus -1 # 只打印一次
slstatus -s # 连续打印,间隔时间是您在 config.h 里设置的时间,按 Ctrl+c 结束打印

把这些信息显示到状态栏上

slstatus &
设置进入图形界面时自动运行 slstatus

在 ~/.xinitrc 中添加

slstatus &

,注意一定要添加到 exec 命令的前面,否则 slstatus 不会被执行。

修改 slstatus 配置

安装并启动 slstatus 后,如果您又修改了 config.h 里的配置,可以用下面的命令启动新的 slstatus:

sudo make clean install # 重新编译
killall slstatus # 结束旧的 slstatus 进程
slstatus &
调整音量时及时更新状态栏

状态栏每隔固定时间才会更新,但我们希望调整音量时状态栏能立刻进行一次更新,来显示新的音量。我的解决办法是用下面的三个脚本来控制音量。

您需要先安装 pamixer (调整音量) 和 xorg-xsetroot (设置状态栏的内容)

sudo pacman -S pamixer xorg-xsetroot

~/.local/bin/vol-up

#!/usr/bin/env bash

# 音量增加 %5
pamixer -i 5

# 更新状态栏
status=$(slstatus -1)
xsetroot -name "$status" 

~/.local/bin/vol-down

#!/usr/bin/env bash

# 音量减少 %5
pamixer -d 5

# 更新状态栏
status=$(slstatus -1)
xsetroot -name "$status"

~/.local/bin/vol-toggle

#!/usr/bin/env bash

# 静音和取消静音
pamixer -t 

# 更新状态栏
status=$(slstatus -1)
xsetroot -name "$status"

给这三个脚本添加可执行权限:

chmod u+x ~/.local/bin/vol-*

将这三个脚本绑定到快捷键上。可以在 dwm 的 config.h 里进行绑定:

static const char *voltoggle[] = { "~/.local/bin/vol-toggle",  NULL };
static const char *voldown[] = { "~/.local/bin/vol-down",  NULL };
static const char *volup[]   = { "~/.local/bin/vol-up",  NULL };
...
static Key keys[] = {
/* modifier       key                          function       argument */
{ 0,              XF86XK_AudioMute,            spawn,         {.v = voltoggle } },
{ 0,              XF86XK_AudioLowerVolume,     spawn,         {.v = voldown } },
{ 0,              XF86XK_AudioRaiseVolume,     spawn,         {.v = volup   } },
};

您可以执行

xmodmap -pke | less 

来查看 XF86XK_AudioMute、XF86XK_AudioLowerVolume 和  XF86XK_AudioRaiseVolume 对应的按键,在我电脑上分别是 F1、F2 和 F3。

重新编译并重启 dwm 后,按 F1、F2 和 F3 键来调整音量,就能看到状态栏的音量信息会及时更新。

卸载

如果您想卸载 slstatus,执行下面的命令:

sudo make uninstall

执行完后,安装目录 (默认 /usr/local/) 下的 slstatus 可执行程序和 slstatus.1 手册都已经被删除。

排错

    (1) 音量显示 n/a

您可能没有 /dev/mixer 设备,您需要执行

sudo modprobe snd-pcm-oss

加载 snd-pcm-oss 模块。开机自动加载该模块

su
echo 'snd-pcm-oss' > /etc/modules-load.d/snd-pcm-oss.conf

最近编辑记录 tanloong (2021-09-27 18:55:34)

离线

#35 2021-09-25 01:38:15

守約
会员
注册时间: 2021-08-21
帖子: 22

Re: 關於從Windows全面轉向ArchLinux可行性方案的嘗試

tanloong 说:

恰好我用的就是 slstatus,我整理了一下它的配置方法,希望能有用。

下载

使用 git 下载 slstatus 的源代码,这里我下载到家目录下的 software 目录。

git clone https://git.suckless.org/slstatus ~/software/slstatus # 下载源代码
配置

编辑 config.h 来自定义您的状态栏,拿我的为例,以供参考。

const unsigned int interval = 2000; 
// 每隔 2s 更新一次
static const char unknown_str[] = "n/a";
// 如果某个值不存在,就显示 n/a(默认),比如断网时 IP 地址就会显示成 n/a
#define MAXLEN 2048
// 状态栏最大字符数量 MAXLEN,如果超过了它,第 MAXLEN 个字符及其右边的字符会被丢弃。
// 下面的注释介绍了 slstatus 的各种函数,每个函数负责显示一项信息。

/*
 * 函数                 描述                                 参数 (示例)
 *
 * battery_perc        电量(百分比形式)                  电池名称 (BAT0)
 *                                                         在 OpenBSD/FreeBSD 上无需参数
 * battery_state       电池的状态:是不是正在充电          电池名称 (BAT0)
 *                                                         在 OpenBSD/FreeBSD 上无需参数
 * battery_remaining   剩下的电量还能撑多久                电池名称 (BAT0)
 *                                                         在 OpenBSD/FreeBSD 上无需参数
 * cpu_perc            CPU 的利用率(百分比形式)          无
 * cpu_freq            CPU 的频率(单位是 MHz)            无
 * datetime            日期和时间                          格式化字符串 (%F %T)
 * disk_free           硬盘还剩多少(单位是 GB)           硬盘的挂载点 (/)
 * disk_perc           硬盘已经使用了多少 (百分比形式)   硬盘的挂载点 (/)
 * disk_total          硬盘总量(单位是 GB)               硬盘的挂载点 (/)
 * disk_used           硬盘已经使用了多少(单位是 GB)     硬盘的挂载点 (/)
 * entropy             系统的可用熵值,该值越大系统越安全  无
 * gid                 当前用户的 GID                      无
 * hostname            主机名                              无
 * ipv4                IPv4 的地址                         网卡名字 (eth0)
 * ipv6                IPv6 的地址                         网卡名字 (eth0)
 * kernel_release      内核版本号                          无
 * keyboard_indicators 显示大写锁定和数字键盘是否开启      格式化字符串 (c?n?)

 * 参数由字母 c 和字母 n 构成,大小写都可以。c 表示大写锁定,n 表示数字键盘。
 * c 和 n 后面都可以附加一个问号"?"。
 * 如果加了问号 "?",只有锁定开启时才显示字母。比如开启大写锁定时显示 c,关闭时不显示。
 * 如果没加问号"?",锁定开启时显示大写字母,关闭时显示小写字母。

 * keymap              键盘布局                            无
 * load_avg            系统负载(共 3 个值,分别是 1 分钟、5 分钟和 15 分钟的平均负载)无
 * netspeed_rx         下行网速                            网卡名字 (wlan0)
 * netspeed_tx         上传网速                            网卡名字 (wlan0)
 * num_files           指定文件夹的文件数量                该文件夹的路径 (/home/foo/Inbox/cur)
 * ram_free            内存还剩多少(单位是 GB)           无
 * ram_perc            内存已经使用了多少(百分比形式)    无
 * ram_total           内存总量(单位是 GB)                无
 * ram_used            内存已经使用了多少(单位是 GB)     无
 * run_command         执行一个自定义的 shell 命令         具体的 shell 命令 (echo foo)
 * separator           各信息之间的分隔符                  无
 * swap_free           交换空间还剩多少(单位是 GB)       无
 * swap_perc           交换空间已经使用了多少(百分比形式)无
 * swap_total          交换空间总量(单位是 GB)           无
 * swap_used           交换空间已经使用了多少(单位是 GB) 无
 * temp                温度(单位是摄氏度)                传感器文件的路径 (/sys/class/thermal/...)
 *                                                         在 OpenBSD 上无需参数
 *                                                         在 FreeBSD 上需要热区 (thermal zone) 作参数 (tz0, tz1, etc.)
 * uid                 当前用户的 UID                      无
 * uptime              系统已经开机运行了多久              无
 * username            当前用户的用户名                    无
 * vol_perc            OSS/ALSA 音量(百分比形式)         mixer 文件的路径 (/dev/mixer)
 *                                                         在 OpenBSD 上无需参数
 * wifi_perc           WiFi 信号强度(百分比形式)         网卡名字 (wlan0)
 * wifi_essid          WiFi 的 ESSID                       网卡名字 (wlan0)
 */
static const struct arg args[] = {// 选择上面的函数,在下面添加您想让状态栏显示的信息
    // 函数          格式           参数 
    { ipv4,         " %s",         "wlan0" }, 
    // %s 代表 ipv4 的值;参数需要用双引号引起来,不能是单引号,
    // 因为 C 语言里单引号内的是字符常量,双引号内的是字符串常量,两者不一样。
    { separator,    "|",           NULL },
    // 用 "|" 间隔两项信息;参数 NULL 表示空,就是没有参数
    { battery_perc, "Battery %s%%","BAT0" },
    // 在 C 语言里 "%" 需要转义,用 "%%" 来表示
    { battery_state,"%s",          "BAT0" },
    { separator,    "|",           NULL },
    { disk_free,    "Disk %s",     "/" },
    { separator,    "|",           NULL },
    { vol_perc,     "Volume %s",   "/dev/mixer" },
    { separator,    "|",           NULL },
    { ram_free,     "Memory %s",   NULL },
    { separator,    "|",           NULL },
    { cpu_perc,     "CPU %s%%",    NULL },
    { separator,    "|",           NULL },
    { datetime,     "%s",          "%m月%d日周%u %H:%M" },
};
安装

slstatus 的默认安装目录是 /usr/local/,如果您想安装到别的地方,可以在执行下面的安装命令之前编辑 config.mk 文件,把第 7 行左右的 PREFIX 的值改成您想要的目录。这里我选择默认的安装目录。

执行下面的命令来安装 slstatus

cd ~/software/slstatus # 切换到 slstatus 目录
sudo make clean install # 安装

执行完后,slstatus 可执行程序和 slstatus.1 手册都已经被保存在安装目录 (默认 /usr/local/)下。

现在您可以把配置好的显示内容打印到终端上,来查看 slstatus 的效果

slstatus -1 # 只打印一次
slstatus -s # 连续打印,间隔时间是您在 config.h 里设置的时间,按 Ctrl+c 结束打印

把这些信息显示到状态栏上

slstatus &
设置进入图形界面时自动运行 slstatus

在 ~/.xinitrc 中添加

slstatus &

,注意一定要添加到 exec 命令的前面,否则 slstatus 不会被执行。

修改 slstatus 配置

安装并启动 slstatus 后,如果您又修改了 config.h 里的配置,可以用下面的命令启动新的 slstatus:

sudo make clean install # 重新编译
killall slstatus # 结束旧的 slstatus 进程
slstatus &
调整音量时及时更新状态栏

状态栏每隔固定时间才会更新,但我们希望调整音量时状态栏能立刻进行一次更新,来显示新的音量。我的解决办法是用下面的三个脚本来控制音量。

您需要先安装 pamixer (调整音量) 和 xorg-xsetroot (设置状态栏的内容)

sudo pacman -S pamixer xorg-xsetroot

~/.local/bin/vol-up

#!/usr/bin/env bash

# 音量增加 %5
pamixer -i 5

# 更新状态栏
status=$(slstatus -1)
xsetroot -name "$status" 

~/.local/bin/vol-down

#!/usr/bin/env bash

# 音量减少 %5
pamixer -d 5

# 更新状态栏
status=$(slstatus -1)
xsetroot -name "$status"

~/.local/bin/vol-toggle

#!/usr/bin/env bash

# 静音和取消静音
pamixer -t 

# 更新状态栏
status=$(slstatus -1)
xsetroot -name "$status"

将这三个脚本绑定到快捷键上。可以在 dwm 的 config.h 里进行绑定:

static const char *voltoggle[] = { "~/.local/bin/vol-toggle",  NULL };
static const char *voldown[] = { "~/.local/bin/vol-down",  NULL };
static const char *volup[]   = { "~/.local/bin/vol-up",  NULL };
...
static Key keys[] = {
/* modifier       key                          function       argument */
{ 0,              XF86XK_AudioMute,            spawn,         {.v = voltoggle } },
{ 0,              XF86XK_AudioLowerVolume,     spawn,         {.v = voldown } },
{ 0,              XF86XK_AudioRaiseVolume,     spawn,         {.v = volup   } },
};

您可以执行

xmodmap -pke | less 

来查看 XF86XK_AudioMute、XF86XK_AudioLowerVolume 和  XF86XK_AudioRaiseVolume 对应的按键,在我电脑上分别是 F1、F2 和 F3。

重新编译并重启 dwm 后,按 F1、F2 和 F3 键来调整音量,就能看到状态栏的音量信息会及时更新。

卸载

如果您想卸载 slstatus,执行下面的命令:

sudo make uninstall

执行完后,安装目录 (默认 /usr/local/) 下的 slstatus 可执行程序和 slstatus.1 手册都已经被删除。

排错

    (1) 音量显示 n/a

您可能没有 /dev/mixer 设备,您需要执行

sudo modprobe snd-pcm-oss

加载 snd-pcm-oss 模块。开机自动加载该模块

su
echo 'snd-pcm-oss' > /etc/modules-load.d/snd-pcm-oss.conf

我天!恩人啊!萬分感謝!!!這麼晚沒睡幫我解惑,實在是……不知道說什麼好了,有點長太晚了我明天白天了再細細看,話說我遇到了另外兩個問題一直找不到答案就很煩,一個是我不能在模擬終端中使用中文輸入法,我用的是kitty,我看好幾個帖子說kitty對中文支持不好,但也有人說沒問題的,可是我用別的如st或者Alacritty也不能使用輸入法,另一個問題是我在網頁中看視頻的時候畫面什麼都正常但是沒聲音,我以爲是火狐瀏覽器的問題,但是搜了一下又感覺不是,因爲我的网易云音乐也會播放的時候沒聲音,然後連續點幾次播放/暫停之後就好了,但是看B站視頻就不行,重啓幾次之後有時候會正常,但大多數情況下是沒聲音的祇有畫面,我找不到答案,我記得剛開始的時候是沒這個問題的,我感覺可能是聲音的問題和瀏覽器沒關係,請問你有遇到這兩個問題麼,如果你知道的話可不可以給我講一下呀,再次感謝!!!


無論何時何地,也要遵守約定。

离线

#36 2021-09-25 01:59:47

守約
会员
注册时间: 2021-08-21
帖子: 22

Re: 關於從Windows全面轉向ArchLinux可行性方案的嘗試

tanloong 说:

恰好我用的就是 slstatus,我整理了一下它的配置方法,希望能有用。

下载

使用 git 下载 slstatus 的源代码,这里我下载到家目录下的 software 目录。

git clone https://git.suckless.org/slstatus ~/software/slstatus # 下载源代码
配置

编辑 config.h 来自定义您的状态栏,拿我的为例,以供参考。

const unsigned int interval = 2000; 
// 每隔 2s 更新一次
static const char unknown_str[] = "n/a";
// 如果某个值不存在,就显示 n/a(默认),比如断网时 IP 地址就会显示成 n/a
#define MAXLEN 2048
// 状态栏最大字符数量 MAXLEN,如果超过了它,第 MAXLEN 个字符及其右边的字符会被丢弃。
// 下面的注释介绍了 slstatus 的各种函数,每个函数负责显示一项信息。

/*
 * 函数                 描述                                 参数 (示例)
 *
 * battery_perc        电量(百分比形式)                  电池名称 (BAT0)
 *                                                         在 OpenBSD/FreeBSD 上无需参数
 * battery_state       电池的状态:是不是正在充电          电池名称 (BAT0)
 *                                                         在 OpenBSD/FreeBSD 上无需参数
 * battery_remaining   剩下的电量还能撑多久                电池名称 (BAT0)
 *                                                         在 OpenBSD/FreeBSD 上无需参数
 * cpu_perc            CPU 的利用率(百分比形式)          无
 * cpu_freq            CPU 的频率(单位是 MHz)            无
 * datetime            日期和时间                          格式化字符串 (%F %T)
 * disk_free           硬盘还剩多少(单位是 GB)           硬盘的挂载点 (/)
 * disk_perc           硬盘已经使用了多少 (百分比形式)   硬盘的挂载点 (/)
 * disk_total          硬盘总量(单位是 GB)               硬盘的挂载点 (/)
 * disk_used           硬盘已经使用了多少(单位是 GB)     硬盘的挂载点 (/)
 * entropy             系统的可用熵值,该值越大系统越安全  无
 * gid                 当前用户的 GID                      无
 * hostname            主机名                              无
 * ipv4                IPv4 的地址                         网卡名字 (eth0)
 * ipv6                IPv6 的地址                         网卡名字 (eth0)
 * kernel_release      内核版本号                          无
 * keyboard_indicators 显示大写锁定和数字键盘是否开启      格式化字符串 (c?n?)

 * 参数由字母 c 和字母 n 构成,大小写都可以。c 表示大写锁定,n 表示数字键盘。
 * c 和 n 后面都可以附加一个问号"?"。
 * 如果加了问号 "?",只有锁定开启时才显示字母。比如开启大写锁定时显示 c,关闭时不显示。
 * 如果没加问号"?",锁定开启时显示大写字母,关闭时显示小写字母。

 * keymap              键盘布局                            无
 * load_avg            系统负载(共 3 个值,分别是 1 分钟、5 分钟和 15 分钟的平均负载)无
 * netspeed_rx         下行网速                            网卡名字 (wlan0)
 * netspeed_tx         上传网速                            网卡名字 (wlan0)
 * num_files           指定文件夹的文件数量                该文件夹的路径 (/home/foo/Inbox/cur)
 * ram_free            内存还剩多少(单位是 GB)           无
 * ram_perc            内存已经使用了多少(百分比形式)    无
 * ram_total           内存总量(单位是 GB)                无
 * ram_used            内存已经使用了多少(单位是 GB)     无
 * run_command         执行一个自定义的 shell 命令         具体的 shell 命令 (echo foo)
 * separator           各信息之间的分隔符                  无
 * swap_free           交换空间还剩多少(单位是 GB)       无
 * swap_perc           交换空间已经使用了多少(百分比形式)无
 * swap_total          交换空间总量(单位是 GB)           无
 * swap_used           交换空间已经使用了多少(单位是 GB) 无
 * temp                温度(单位是摄氏度)                传感器文件的路径 (/sys/class/thermal/...)
 *                                                         在 OpenBSD 上无需参数
 *                                                         在 FreeBSD 上需要热区 (thermal zone) 作参数 (tz0, tz1, etc.)
 * uid                 当前用户的 UID                      无
 * uptime              系统已经开机运行了多久              无
 * username            当前用户的用户名                    无
 * vol_perc            OSS/ALSA 音量(百分比形式)         mixer 文件的路径 (/dev/mixer)
 *                                                         在 OpenBSD 上无需参数
 * wifi_perc           WiFi 信号强度(百分比形式)         网卡名字 (wlan0)
 * wifi_essid          WiFi 的 ESSID                       网卡名字 (wlan0)
 */
static const struct arg args[] = {// 选择上面的函数,在下面添加您想让状态栏显示的信息
    // 函数          格式           参数 
    { ipv4,         " %s",         "wlan0" }, 
    // %s 代表 ipv4 的值;参数需要用双引号引起来,不能是单引号,
    // 因为 C 语言里单引号内的是字符常量,双引号内的是字符串常量,两者不一样。
    { separator,    "|",           NULL },
    // 用 "|" 间隔两项信息;参数 NULL 表示空,就是没有参数
    { battery_perc, "Battery %s%%","BAT0" },
    // 在 C 语言里 "%" 需要转义,用 "%%" 来表示
    { battery_state,"%s",          "BAT0" },
    { separator,    "|",           NULL },
    { disk_free,    "Disk %s",     "/" },
    { separator,    "|",           NULL },
    { vol_perc,     "Volume %s",   "/dev/mixer" },
    { separator,    "|",           NULL },
    { ram_free,     "Memory %s",   NULL },
    { separator,    "|",           NULL },
    { cpu_perc,     "CPU %s%%",    NULL },
    { separator,    "|",           NULL },
    { datetime,     "%s",          "%m月%d日周%u %H:%M" },
};
安装

slstatus 的默认安装目录是 /usr/local/,如果您想安装到别的地方,可以在执行下面的安装命令之前编辑 config.mk 文件,把第 7 行左右的 PREFIX 的值改成您想要的目录。这里我选择默认的安装目录。

执行下面的命令来安装 slstatus

cd ~/software/slstatus # 切换到 slstatus 目录
sudo make clean install # 安装

执行完后,slstatus 可执行程序和 slstatus.1 手册都已经被保存在安装目录 (默认 /usr/local/)下。

现在您可以把配置好的显示内容打印到终端上,来查看 slstatus 的效果

slstatus -1 # 只打印一次
slstatus -s # 连续打印,间隔时间是您在 config.h 里设置的时间,按 Ctrl+c 结束打印

把这些信息显示到状态栏上

slstatus &
设置进入图形界面时自动运行 slstatus

在 ~/.xinitrc 中添加

slstatus &

,注意一定要添加到 exec 命令的前面,否则 slstatus 不会被执行。

修改 slstatus 配置

安装并启动 slstatus 后,如果您又修改了 config.h 里的配置,可以用下面的命令启动新的 slstatus:

sudo make clean install # 重新编译
killall slstatus # 结束旧的 slstatus 进程
slstatus &
调整音量时及时更新状态栏

状态栏每隔固定时间才会更新,但我们希望调整音量时状态栏能立刻进行一次更新,来显示新的音量。我的解决办法是用下面的三个脚本来控制音量。

您需要先安装 pamixer (调整音量) 和 xorg-xsetroot (设置状态栏的内容)

sudo pacman -S pamixer xorg-xsetroot

~/.local/bin/vol-up

#!/usr/bin/env bash

# 音量增加 %5
pamixer -i 5

# 更新状态栏
status=$(slstatus -1)
xsetroot -name "$status" 

~/.local/bin/vol-down

#!/usr/bin/env bash

# 音量减少 %5
pamixer -d 5

# 更新状态栏
status=$(slstatus -1)
xsetroot -name "$status"

~/.local/bin/vol-toggle

#!/usr/bin/env bash

# 静音和取消静音
pamixer -t 

# 更新状态栏
status=$(slstatus -1)
xsetroot -name "$status"

将这三个脚本绑定到快捷键上。可以在 dwm 的 config.h 里进行绑定:

static const char *voltoggle[] = { "~/.local/bin/vol-toggle",  NULL };
static const char *voldown[] = { "~/.local/bin/vol-down",  NULL };
static const char *volup[]   = { "~/.local/bin/vol-up",  NULL };
...
static Key keys[] = {
/* modifier       key                          function       argument */
{ 0,              XF86XK_AudioMute,            spawn,         {.v = voltoggle } },
{ 0,              XF86XK_AudioLowerVolume,     spawn,         {.v = voldown } },
{ 0,              XF86XK_AudioRaiseVolume,     spawn,         {.v = volup   } },
};

您可以执行

xmodmap -pke | less 

来查看 XF86XK_AudioMute、XF86XK_AudioLowerVolume 和  XF86XK_AudioRaiseVolume 对应的按键,在我电脑上分别是 F1、F2 和 F3。

重新编译并重启 dwm 后,按 F1、F2 和 F3 键来调整音量,就能看到状态栏的音量信息会及时更新。

卸载

如果您想卸载 slstatus,执行下面的命令:

sudo make uninstall

执行完后,安装目录 (默认 /usr/local/) 下的 slstatus 可执行程序和 slstatus.1 手册都已经被删除。

排错

    (1) 音量显示 n/a

您可能没有 /dev/mixer 设备,您需要执行

sudo modprobe snd-pcm-oss

加载 snd-pcm-oss 模块。开机自动加载该模块

su
echo 'snd-pcm-oss' > /etc/modules-load.d/snd-pcm-oss.conf

我越來越覺得是聲卡或者系統聲音設置的問題了,因爲換了其它瀏覽器還是一樣的問題,之前都好好的,突然就不對了,讓人摸不着頭腦……


無論何時何地,也要遵守約定。

离线

#37 2021-09-25 02:00:50

tanloong
会员
注册时间: 2021-08-15
帖子: 8

Re: 關於從Windows全面轉向ArchLinux可行性方案的嘗試

不客气,整理它的时候我自己也发现很多没注意过的细节。嗯……关于那两个问题,我还真没遇到过。我可能明天试着查一查,或者您也可以问问其他人。

最近编辑记录 tanloong (2021-09-27 23:49:08)

离线

#38 2021-09-28 17:16:11

守約
会员
注册时间: 2021-08-21
帖子: 22

Re: 關於從Windows全面轉向ArchLinux可行性方案的嘗試

tanloong 说:

不客气,整理它的时候我自己也发现很多没注意过的细节。嗯……关于那两个问题,我还真没遇到过。我可能明天试着查一查,或者您也可以问问其他人。

slstatus的狀態欄我試了一下,除了那個聲音快捷鍵和更新的弄不上以外其它狀態都正常運行了一段時間沒出什麼問題,非常感謝你的幫助,另外我發現我的火狐瀏覽器如果進去以後在幫助裡選那個排障模式就可以使用聲音了,但衹能打開一個窗口,如果是打開同時兩個窗口,那麼所有窗口都沒有聲音,這時候衹能關閉瀏覽器重新進入,然後重新打開排障模式纔行,我感覺可能是什麼沒啓動起來,或者是什麼被佔用了,不過我暫時解決不了,衹能等以後再說了。


無論何時何地,也要遵守約定。

离线

#39 2021-09-30 08:57:10

tanloong
会员
注册时间: 2021-08-15
帖子: 8

Re: 關於從Windows全面轉向ArchLinux可行性方案的嘗試

给那三个控制音量的脚本添加执行权限试试?

离线

#40 2021-10-01 01:38:31

守約
会员
注册时间: 2021-08-21
帖子: 22

Re: 關於從Windows全面轉向ArchLinux可行性方案的嘗試

tanloong 说:

给那三个控制音量的脚本添加执行权限试试?

嗯,好的,我完了試一下看怎麼樣的。
話說可不可以給我講一下你輸入法和模擬終端是怎麼配置的呀,和我的有沒有什麼區別,環境變量又是怎樣的,我想着我不能在模擬終端裡使用輸入法是不是因爲我哪個配置文件沒弄對。


無論何時何地,也要遵守約定。

离线

#41 2021-10-01 01:48:16

tanloong
会员
注册时间: 2021-08-15
帖子: 8

Re: 關於從Windows全面轉向ArchLinux可行性方案的嘗試

我的输入法框架用的也是 fcitx5, 模拟终端用的是 st。
我的环境变量是这样的:

tan:~$ cat .pam_environment
INPUT_METHOD DEFAULT=fcitx
GTK_IM_MODULE DEFAULT=fcitx
QT_IM_MODULE DEFAULT=fcitx
XMODIFIERS DEFAULT="@im=fcitx"

我安装的 fcitx5 软件有这些:

tan:~$ sudo pacman -Qq | grep fcitx5
fcitx5
fcitx5-chinese-addons
fcitx5-configtool
fcitx5-gtk
fcitx5-material-color
fcitx5-pinyin-zhwiki
fcitx5-qt

我之前在 zathura (一个 pdf 阅读器) 上也无法使用中文输入法,我当时运行下面的命令之后就好了

sudo pacman -S fcitx5-qt fcitx5-gtk

最近编辑记录 tanloong (2021-10-01 02:31:03)

离线

#42 2021-10-01 12:57:56

WeepingDogel
狗狗
所在地: 狗窝
注册时间: 2021-07-10
帖子: 7
个人网站

Re: 關於從Windows全面轉向ArchLinux可行性方案的嘗試

支持一下

离线

#43 2021-10-01 13:04:31

WeepingDogel
狗狗
所在地: 狗窝
注册时间: 2021-07-10
帖子: 7
个人网站

Re: 關於從Windows全面轉向ArchLinux可行性方案的嘗試

支持一下

离线

#44 2021-10-01 19:07:52

守約
会员
注册时间: 2021-08-21
帖子: 22

Re: 關於從Windows全面轉向ArchLinux可行性方案的嘗試

WeepingDogel 说:

支持一下

感謝你的支持,祝你好運啊!


無論何時何地,也要遵守約定。

离线

页脚