vscode code server 配置 golang 和 php 开发环境(2)

去年更新了两篇blog,记录了怎么搭建 vscode code server,以及配置golang和php环境的。 一年过去了,我对它们又做了一些更新,完善了golang debug、k8s源码开发、配置同步、ide增量build、docker等方面的支持。

一、为什么不用本地ide

Q:为什么不用本地ide,毕竟本地ide功能要强大很多。

A:客观原因是设备太多了。我有1台办公Win,4台开发机Linux,1台个人Mac,1台家庭Win,1个iPad。如此多的设备和平台,我不希望只给1-2台配置开发环境,太受束缚了。

以前的我在所有设备上都配置了开发环境,用的是IntelliJ IDEA。公司的主要用go,个人主要用php和vue,有时也做一些Android的。配环境总是让人苦恼的一件事,如果遇上重装系统,那就更痛苦了。

当然还有一个问题,就是运行ide其实是个挺费系统性能的事情,我目前还在使用 2012版的 Macbook Air,这样的配置跑个ide就烫手了。

image-20220128104827591

Q:为什么不用JetBrains的Fleet?

A:因为Fleet出来太晚了,目前用vscode还是很好的。

二、dockerfile

另外特别要注意的是我是在x86_64的机器上使用的,所有的镜像均为intel的cpu。

镜像编译主要的难点还是区分在国内还是国外。先假定我们的环境到大部分地区都是可达的,我直接在dockerfile中下载go、php和docker_cli,所以有如下的dockerfile。

FROM kelvinblood/code-server:base-20210903

LABEL org.kelu.image.version.go=1.16.7
LABEL org.kelu.image.version.php=7.1.5
LABEL org.kelu.image.version.code-server=3.11.1
LABEL org.kelu.image.version.vscode=1.57.1
LABEL org.kelu.image.version.dockercli=19.03.14

ARG DOCKER_CLI_VERSION=19.03.14
ARG GOLANG_VERSION=1.16.7
ARG PHP_VERSION=7.1.5
ENV GOROOT /usr/local/go
ENV GOPATH /var/local/go
ENV PATH $PATH:$GOROOT/bin:$GOPATH/bin
ENV GO111MODULE on
ENV GOPROXY https://goproxy.cn

RUN \
  GO_TGZ=go$(echo "$GOLANG_VERSION").linux-amd64.tar.gz && \
  PHP_TGZ=php-${PHP_VERSION}.tar.gz && \
  DOCKER_TGZ=docker-ce-cli_${DOCKER_CLI_VERSION}~3-0~debian-stretch_amd64.deb && \
  echo "**** install tools ****" && \
  apt-get update && \
  apt-get install -y \
    wget \
    iputils-ping \
    build-essential \
    xinetd \
    telnetd \ 
    rsync \
    jq \
    python-pip && \
  pip install pyyaml && \
  cd /tmp && wget https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/${DOCKER_TGZ} && \
  dpkg -i *.deb && \
  echo "**** install golang ****" && \
  cd /tmp && wget https://golang.org/dl/${GO_TGZ} && \
  tar zxvf ${GO_TGZ} >/dev/null 2>&1 && \
  mv go ${GOROOT} && \
  echo "**** go get for vscode ****" && \
  go get golang.org/x/tools/gopls && \
  go get golang.org/x/lint/golint && \
  go get github.com/rogpeppe/godef && \
  go get github.com/ramya-rao-a/go-outline && \
  go get github.com/uudashr/gopkgs/v2/cmd/gopkgs && \
  go get github.com/cweill/gotests/gotests && \
  go get github.com/fatih/gomodifytags && \
  go get github.com/josharian/impl && \
  go get github.com/haya14busa/goplay/cmd/goplay && \
  go get github.com/go-delve/delve/cmd/dlv && \
  go get honnef.co/go/tools/cmd/staticcheck && \
  go get github.com/spf13/cobra/cobra && \
  cp /var/local/go/bin/dlv /var/local/go/bin/dlv-dap && \
  echo "**** install php ****" && \
  apt-get -y install libssl-dev libcurl4-openssl-dev libbz2-dev libjpeg-dev libpng-dev libgmp-dev libicu-dev libmcrypt-dev freetds-dev libxslt-dev libcurl3-dev autoconf dpkg-dev file g++ gcc libc-dev make pkg-config re2c && \
  ln -s /usr/lib/x86_64-linux-gnu/libsybdb.a /usr/lib/libsybdb.a && \
  ln -s /usr/lib/x86_64-linux-gnu/libsybdb.so /usr/lib/libsybdb.so && \
  ln -s /usr/lib/x86_64-linux-gnu/libct.a /usr/lib/libct.a && \
  ln -s /usr/lib/x86_64-linux-gnu/libct.so /usr/lib/libct.so && \
  ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h && \
  ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl && \
  cd /tmp && wget http://am1.php.net/distributions/${PHP_TGZ} && \
  tar -xzvf ${PHP_TGZ} && \
  cd php-${PHP_VERSION} && \
  ./configure --prefix /usr/share/php7 --enable-fpm --enable-mbstring --enable-zip --enable-calendar --enable-bcmath --enable-exif --enable-intl --enable-opcache --enable-shmop --enable-soap --enable-sockets --with-fpm-user=www-data --with-fpm-group=www-data --with-pcre-regex --with-kerberos --with-openssl --with-mcrypt --with-zlib --with-bz2 --with-curl --with-gd --with-jpeg-dir=/usr/include/jpeg8 --with-png-dir=/usr/include/libpng12 --with-gettext --with-gmp --with-mhash --with-xsl && \
  make clean && make && make install && make test && make clean && \
  ln -s /usr/share/php7/sbin/php-fpm /usr/local/bin/php-fpm && \
  ln -s /usr/share/php7/bin/php /usr/local/bin/php && \
  cd .. && \
  curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer && \
  echo "**** vscdoe tools ****" && \
  /usr/local/bin/code-server --install-extension ms-ceintl.vscode-language-pack-zh-hans && \
  /usr/local/bin/code-server --install-extension vscodevim.vim && \
  /usr/local/bin/code-server --install-extension golang.Go && \
  mkdir -p /config/extensions && \
  mv /config/.local/share/code-server/extensions/* /config/extensions && \
  echo "**** clean up ****" && \
  apt-get clean && \
  rm -rf \
    /tmp/* \
    /var/lib/apt/lists/* \
    /var/tmp/*

主要做了几件工作:

  1. 配置常用的软件。有些是k8s编译必须的一些软件。
  2. go和相关go库的安装。有些是vscode支持和k8s编译必须的或者优化的库。
  3. php编译安装。
  4. vscode的插件安装。

如果你不想安装php或者go,或是想编译其他语言的,可以根据这份dockerfile做调整。

三、dockerfile(国内)

按以上的dockerfile,在国外的机器上是可以编译通过的。在国内build遇到了这几个问题,非常影响编译时候的心情💢:

  1. go/php/docker下载慢
  2. apt源update慢
  3. pip install pyyaml直接timeout了,(吐血

于是针对这几个问题,都做了相应的工作:

  1. 先在国外下好传到本地
  2. 换成国内163源
  3. 配置一个http proxy提供给pip使用

1. 下好go/php/docker文件

2个文件:一个负责下载,一个负责启动本地http服务器,方便dockerfile下载。

# download.sh
#!/bin/bash

DOCKER_CLI_VERSION=19.03.14
GOLANG_VERSION=1.16.7
PHP_VERSION=7.1.5

GO_TGZ=go$(echo "$GOLANG_VERSION").linux-amd64.tar.gz
PHP_TGZ=php-${PHP_VERSION}.tar.gz
DOCKER_TGZ=docker-ce-cli_${DOCKER_CLI_VERSION}~3-0~debian-stretch_amd64.deb

wget https://golang.org/dl/${GO_TGZ}
wget http://am1.php.net/distributions/${PHP_TGZ}
wget https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/${DOCKER_TGZ}
# web.sh

#!/bin/bash
python -m SimpleHTTPServer 31415

image-20220128102636735

2. 更换apt源

大致如下,详情我贴在文后

image-20220128102831433

3. 创建一个http proxy 提供给pip使用

使用privoxy创建的,具体内容就不展示了,可以参考我这篇文章《linux 配置 privoxy 实现系统全局/自动代理》.

完成这三个步骤后的dockerfile如下,主要区别的地方就是增加了本地服务器地址和代理地址两个变量。

FROM kelvinblood/code-server:base-20210903

LABEL org.kelu.image.version.go=1.16.7
LABEL org.kelu.image.version.php=7.1.5
LABEL org.kelu.image.version.code-server=3.11.1
LABEL org.kelu.image.version.vscode=1.57.1
LABEL org.kelu.image.version.dockercli=19.03.14

ARG DOCKER_CLI_VERSION=19.03.14
ARG GOLANG_VERSION=1.16.7
ARG PHP_VERSION=7.1.5
ENV GOROOT /usr/local/go
ENV GOPATH /var/local/go
ENV PATH $PATH:$GOROOT/bin:$GOPATH/bin
ENV GO111MODULE on
ENV GOPROXY https://goproxy.cn

RUN \
  LOCAL_WEB_SERVER=172.16.0.2:31415 && \
  PROXY=172.16.0.2:8118 && \
  GO_TGZ=go$(echo "$GOLANG_VERSION").linux-amd64.tar.gz && \
  PHP_TGZ=php-${PHP_VERSION}.tar.gz && \
  DOCKER_TGZ=docker-ce-cli_${DOCKER_CLI_VERSION}~3-0~debian-stretch_amd64.deb && \
  echo "**** download from china ****" && \
  echo "deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse" >/etc/apt/sources.list && \
  echo "deb http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse" >>/etc/apt/sources.list && \
  echo "deb http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse" >>/etc/apt/sources.list && \
  echo "deb http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse" >>/etc/apt/sources.list && \
  echo "deb http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse" >>/etc/apt/sources.list && \
  echo "deb-src http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse" >>/etc/apt/sources.list && \
  echo "deb-src http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse" >>/etc/apt/sources.list && \
  echo "deb-src http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse" >>/etc/apt/sources.list && \
  echo "deb-src http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse" >>/etc/apt/sources.list && \
  echo "deb-src http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse"  >>/etc/apt/sources.list && \
  echo "**** install tools ****" && \
  apt-get update && \
  apt-get install -y \
    wget \
    iputils-ping \
    build-essential \
    xinetd \
    telnetd \ 
    rsync \
    jq \
    python-pip && \
#  pip install pyyaml && \
  pip install --proxy http://${PROXY} pyyaml && \
  cd /tmp && wget http://${LOCAL_WEB_SERVER}/${DOCKER_TGZ} && \
  dpkg -i *.deb && \
  echo "**** install golang ****" && \
  cd /tmp && wget http://${LOCAL_WEB_SERVER}/${GO_TGZ} && \
  tar zxvf ${GO_TGZ} >/dev/null 2>&1 && \
  mv go ${GOROOT} && \
  echo "**** go get for vscode ****" && \
  go get golang.org/x/tools/gopls && \
  go get golang.org/x/lint/golint && \
  go get github.com/rogpeppe/godef && \
  go get github.com/ramya-rao-a/go-outline && \
  go get github.com/uudashr/gopkgs/v2/cmd/gopkgs && \
  go get github.com/cweill/gotests/gotests && \
  go get github.com/fatih/gomodifytags && \
  go get github.com/josharian/impl && \
  go get github.com/haya14busa/goplay/cmd/goplay && \
  go get github.com/go-delve/delve/cmd/dlv && \
  go get honnef.co/go/tools/cmd/staticcheck && \
  go get github.com/spf13/cobra/cobra && \
  cp /var/local/go/bin/dlv /var/local/go/bin/dlv-dap && \
  echo "**** install php ****" && \
  apt-get -y install libssl-dev libcurl4-openssl-dev libbz2-dev libjpeg-dev libpng-dev libgmp-dev libicu-dev libmcrypt-dev freetds-dev libxslt-dev libcurl3-dev autoconf dpkg-dev file g++ gcc libc-dev make pkg-config re2c && \
  ln -s /usr/lib/x86_64-linux-gnu/libsybdb.a /usr/lib/libsybdb.a && \
  ln -s /usr/lib/x86_64-linux-gnu/libsybdb.so /usr/lib/libsybdb.so && \
  ln -s /usr/lib/x86_64-linux-gnu/libct.a /usr/lib/libct.a && \
  ln -s /usr/lib/x86_64-linux-gnu/libct.so /usr/lib/libct.so && \
  ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h && \
  ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl && \
  cd /tmp && wget http://${LOCAL_WEB_SERVER}/${PHP_TGZ} && \
  tar -xzvf ${PHP_TGZ} && \
  cd php-${PHP_VERSION} && \
  ./configure --prefix /usr/share/php7 --enable-fpm --enable-mbstring --enable-zip --enable-calendar --enable-bcmath --enable-exif --enable-intl --enable-opcache --enable-shmop --enable-soap --enable-sockets --with-fpm-user=www-data --with-fpm-group=www-data --with-pcre-regex --with-kerberos --with-openssl --with-mcrypt --with-zlib --with-bz2 --with-curl --with-gd --with-jpeg-dir=/usr/include/jpeg8 --with-png-dir=/usr/include/libpng12 --with-gettext --with-gmp --with-mhash --with-xsl && \
  make clean && make && make install && make test && make clean && \
  ln -s /usr/share/php7/sbin/php-fpm /usr/local/bin/php-fpm && \
  ln -s /usr/share/php7/bin/php /usr/local/bin/php && \
  cd .. && \
  curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer && \
  echo "**** vscdoe tools ****" && \
  /usr/local/bin/code-server --install-extension ms-ceintl.vscode-language-pack-zh-hans && \
  /usr/local/bin/code-server --install-extension vscodevim.vim && \
  /usr/local/bin/code-server --install-extension golang.Go && \
  mkdir -p /config/extensions && \
  mv /config/.local/share/code-server/extensions/* /config/extensions && \
  echo "**** clean up ****" && \
  apt-get clean && \
  rm -rf \
    /tmp/* \
    /var/lib/apt/lists/* \
    /var/tmp/*

四、运行

整个ide镜像弄好了,对于开发者来说还有一个需要解决的,我平时使用肯定是需要增加插件、一些自定义的配置,还有golang开发时go mod需要下载库之类的,不能镜像一挂就什么都没了吧。。。

所以这里需要将它们提取出来,我分成了两个步骤,一个是build images时提取,另一个是docker-compose拉起镜像。

1. build.sh

image-20220128103852344

#!/bin/bash

rm -rf  ./config ./go
tag=$(date +%Y%m%d)
docker build -t kelvinblood/code-server:release-$tag .

id=$(docker create kelvinblood/code-server:release-$tag)
docker cp $id:/config .
docker cp $id:/var/local/go .
docker rm -v $id

touch settings.json

另外,我个人使用的个人配置文件如下:

# settings.json

{
    "workbench.colorTheme": "Solarized Dark",
    "editor.fontSize": 18,
    "go.testTimeout": "60s",
    "go.toolsManagement.autoUpdate": true
}

2. docker-compose.yml

version: "2.1"
services:
  code-server:
    image: kelvinblood/code-server:release-20220127
    container_name: code-server
    hostname: vscode
    network_mode: bridge
    environment:
      - PUID=0
      - PGID=0
      - TZ=Asia/Shanghai
      - PASSWORD=  #optional
#      - HASHED_PASSWORD= #optional
#      - SUDO_PASSWORD= #optional
#      - SUDO_PASSWORD_HASH= #optional
      - PROXY_DOMAIN=kelu.org #optional
    volumes:
      - ./gophp/config:/config
      - ./gophp/go:/var/local/go
      - ./gophp/settings.json:/config/data/User/settings.json:rw
      - /var/run/docker.sock:/var/run/docker.sock:rw
      - /root/Workspace:/root/Workspace
    restart: unless-stopped

image-20220128104310205

运行后界面如下:

image-20220128104534765


linux chrome 无法同步密码

最近切到awesome wm 桌面之后,chrome的密码就一直没办法使用,非常不方便。使用命令行启动的时候发现了这样的错误:

password_sync_bridge.cc Passwords datatype error...

谷歌了一番,可能是配置文件的问题,把它配置文件清空后重新配置就好了

rm -rf ~/.config/google-chrome

启动后重新配置。

另外在国内本机首次使用谷歌还是比较麻烦的,在命令行强制使用代理即可:

google-chrome-stable --proxy="http://xxx"

502


nmcli 使用命令行连接wifi

nmcli 的具体命令可以参考redhat的相关文档。这篇文章简单记录如何使用命令行连接wifi。

简单来看如下:

nmcli dev wifi list/show
nmcli dev wifi connect <SSID>  password <password>
nmcli conn up <Name> 
  1. 查看可用 Wi-Fi 访问点

    nmcli dev wifi list
    

    image-20220104093644673

  2. 输入密码连接wifi

    nmcli dev wifi connect bakemonogatari password xxxxxx
    

    image-20220104101559167

    每次命令执行后,会在 /etc/NetworkManager/system-connections/ 目录下创建一个新文件来保存配置,重复执行则创建多个这样的文件。删除wifi连接,在 /etc/NetworkManager/system-connections/ 目录下的对应文件也会被删除。

    nmcli conn show # 查看
    nmcli con del bakemonogatari # 删除
    

    image-20220104102320594

  3. 主动连接某配置的wifi

    nmcli connection up bakemonogatari # 开启
    nmcli connection down  # 关闭
    
  4. 设置该wifi自动连接

    nmcli connection modify bakemonogatari connection.autoconnect yes
    
  5. 其他操作

    • 检查可用设备,查看设备链接状态

       nmcli dev status # 
      

      wlp3s0 是我们的wifi设备。

      image-20220104091538547

    • 以下命令更改 Wi-Fi 状态:

       nmcli radio wifi [on | off ]
      

      image-20220104091721278

参考资料


linux awesome 窗口管理器使用备忘

最近将窗口管理器从 gnome3 换到了 awesome,一个平铺式的窗口管理器。已经使用了5天了,感觉还可以。中途还研究了其他东西,最后回归到 awesome + nautilus 的方式使用。 这篇文章做一些记录。

我使用的环境是 Debian 9 x86_64,由 gnome3 登录界面切换为 awesome 窗口管理器。

目前安装的awesome信息为:

awesome v4.0 (Harder, Better, Faster, Stronger)
 • Compiled against Lua 5.1.5 (running with Lua 5.1)
 • D-Bus support: ✔
 • execinfo support: ✔
 • RandR 1.5 support: ✔
 • LGI version: 0.9.1

一、Awesome 介绍与WM概念

窗口管理器 vs 桌面环境

  • 窗口管理器(Windows Manager),负责绘制窗口的边框,处理窗口运行比如移动、最小化之类的行为。

  • 桌面环境(Desktop Environment),窗口管理器的超集,它使用窗口管理器及其其他软件提供一个完整的工作环境。

例如:gnome就是一个桌面环境,默认使用Metacity作为窗口管理器。

平铺式窗口管理器

平铺就是之所有的窗口都不会相互重叠,而是 自动的 被调整大小使得它们能够刚好占满整个屏幕。

相对的,我们平时使用的是浮动式窗口管理器,由于屏幕空间有限,当前激活的窗口会浮在最上面,而遮住下面的窗口。

常见的窗口管理相关的工具如下:(来自alim0x - Awesome-Linux-Software-zh_CN)

合成器
  • Compton - Compton 是一款独立的合成管理器,适合同没有原生提供合成功能的窗口管理器一同使用。
  • Gamescope - Gamescope 是一款微合成器,提供一个带有独立输入,分辨率和刷新率的沙盒 Xwayland 桌面。
  • Sway - Sway 是平铺 Wayland 合成器和 X11 下 i3 窗口管理器的新替代。
  • Xcompmgr - Xcompmgr 是一个简单的合成管理器,能够渲染下拉阴影,使用 transset 工具的话,还可以实现简单的窗口透明。
叠加式窗口管理器
  • 2bwm - 快速的浮动窗口管理,有两个特殊边界,基于 XCB 库,由 mcwm 衍生。
  • Blackbox - 快速,轻量化的 X 窗口系统窗口管理器,没有那些烦人的库依赖。
  • Fluxbox - 基于 Blackbox 0.61.1 代码的 X 窗口管理器。
  • Openbox - 高度可配置,带有可扩展标准支持的下一代窗口管理器。
平铺式窗口管理器
  • Bspwm - bspwm 是一个平铺式窗口管理器,将窗口以二叉树的叶结点的方式展现。
  • Herbstluftwm - 使用 Xlib 和 Glib 的手工平铺式窗口管理器。
  • i3 WM - 更好的平铺及动态窗口管理器。完全重写。目标平台是 GNU/Linux 和 BSD 操作系统。
  • i3-gaps - i3-gaps 是拥有更多功能的 i3。
  • Pop!_OS Shell - Pop Shell 是基于 GNOME shell 的窗口管理器,键盘驱动,自动平铺。
  • Qtile - qtile 是一款全功能,可 hack 的平铺窗口管理器,使用 Python 编写和配置。
动态窗口管理器
  • awesome - 高度可配置,下一代 X 框架窗口管理器。
  • dwm - X 动态窗口管理器。它以平铺,单片镜以及浮动布局的方式管理窗口。
  • spectrwm - 小型动态平铺 X11 窗口管理器。主要受 xmonad 和 dwm 启发。
  • xmonad - 动态平铺 X11 窗口管理器,用 Haskell 编写和配置。

为什么选择Awesome

朋友推荐且已经正常使用很久了,所以稳定性是没有问题的。有如下优点:

  • 体积小,运行迅速,占用资源少。
  • 支持多种窗口布局。
  • 使用Lua脚本的配置文件,灵活性高。
  • 持续更新。
  • 良好的鼠标支持。
  • 多显示器支持。本文开头的图片就是awesome官网上挂着的图。

当然我也短暂尝试过 bspwmi3 ,感觉不是很舒服就没有往下继续了。

二、Awesome 安装与基本概念

除了安装了 awesome,我还安装了相应的compton,用于透明美化等功能。

安装了插件 vicious 用于在状态栏显示cpu内存等信息。

同时文件管理器沿用 gnome 默认的 nautilus,减少对日常使用的冲击。

对于截图,我使用了 shutter,可以参考这篇文章

实际上我尝试了 ranger 这个命令行文件管理器,并作了不小的配置改动。后续因为一些无法深入的问题放弃了。这部分我开新的文章做个记录。

$ sudo apt-get install awesome awesome-extra compton 

Awesome提供了一个设置文件 rc.lua ,把它拷贝到~/.config/Awesome/里。

$ sudo cp /etc/xdg/awesome/rc.lua ~/.config/awesome

安装完Awesome后,注销当前用户回到用户选择界面,然后选择使用Awesome桌面环境。

对于Debian/Gnome 用户,在用户密码框的右侧有个按钮,点击之后会展示桌面环境选择菜单,选择“Awesome”即可。

登录后顶部有一条类似Windows任务栏的东西,叫做状态栏(Status Bar)

状态栏的最左侧是Awesome的图标,点击它将会打开一个小菜单,这就是Awesome的主菜单

Awesome 图标的右侧可以看到阿拉伯数字1-9,这些叫做标签(Tag),类似GNome或者KDE下的虚拟桌面。

在状态栏最右侧是布局切换器,布局(Layout)是根据屏幕上的可用空间来调整窗口位置、尺寸的方式。Awesome支持多种布局:

  • 平铺

    Tiled平铺模式下屏幕被分为master和stacking两个区域。master中的窗口包含了需要最多关注的窗口(通常这表示master中的窗口会占据更大的屏幕空间),而stacking区域中包含了其它窗口。如果你想的话master区域可以被划分为多行和多列。

  • 最大化 Max

    每个窗口都是全屏显示。

  • 放大 Magnifier

    当前窗口(也就是被鼠标点选中,正在操作的窗口)会显示在屏幕中间,占据大部分屏幕空间。剩下的窗口都处在stacking区域,并放到当前窗口的后面。

  • 浮动 Floating

    每个窗口都可以自由的移动和调整大小,就好像普通的窗口管理器一样。无论当前是什么布局,对话框窗口总是处在浮

三、使用感想

我是比较懒得折腾的人,就做了一点点事情,大多保持原样:

  • 使用默认主题
  • 布局layout只留下一个awful.layout.suit.tile, 把其他都禁用掉了
  • 默认右上角的layout样式图表删掉

image-20211231165628264

我目前仍然懒得修改tag,等过一阵子如果使用了,我再来更新这一篇文章把。

四、默认快捷键

以下是默认的快捷键,如果没有做修改,则 mod4 是 Win 键的意思。

一般命令 快捷键
打开菜单 mod4 + w
打开程序选择器(需修改配置文件) alt + esc
打开程序或命令 mod4 + r
执行lua代码 mod4 + x
打开终端 mod4 + enter
重启awesome mod4 + ctrl + r
退出awesome mod4 + shift + q

桌面操作 快捷键
切换桌面 mod4 + num
在桌面间移动 mod4 + left/right
切换至上一个桌面 mod4 + esc
将另一桌面的内容显示至当前桌面 mod4 + ctrl + num
更改桌面布局 mod4 + space
反向更改桌面布局 mod4 + shift + space

窗口操作 快捷键
切换至下一窗口 Mod4 + j
切换至上一窗口 Mod4 + k
在两个窗口间切换 Mod4 + Tab
将当前窗口与下一窗口互换位置 Mod4 + Shift + j
将当前窗口与上一窗口互换位置 Mod4 + Shift + k
增加窗口大小 Mod4 + l
减小窗口大小 Mod4 + h
增加主窗口个数 Mod4 + Shift + l
减少主窗口个数 Mod4 + Shift + h
切换窗口的浮动状态 Mod4 + Ctrl + Space
窗口最大化与还原 Mod4 + m
全屏与还原 Mod4 + f
窗口最小化 Mod4 + n
窗口最小化还原 Mod4 + Ctrl + n
移动至另一桌面 Mod4 + Shift + num
关闭窗口 Mod4 + Shift + c
移动浮动窗口位置-鼠标 Mod4 + mouse-left-click
更改浮动窗口大小-鼠标 Mod4 + mouse-right-click
移动浮动窗口位置-键盘 Mod4 + Ctrl + Arrow-keys
更改浮动窗口大小-键盘 Mod4 + PgUp/DN

我最常用的快捷键:

默认的快捷键并不太符合我的操作习惯,我使用tmux已经很多年了,所以也按照tmux的快捷键给修改掉了。

  • Mod4 + 数字: 到达到某个桌面。

  • Mod4+Shift + 数字: 移动当前窗口到某个桌面。
  • Mod4+W: 打开nautilus文件浏览器
  • Mod+Q:关闭当前窗口。
  • Mod+U:提升当前窗口向前,一般用来挪到master的视角。相当于默认的Mod4 + Shift + k

五、自定义配置

awesome的配置文件位于~/.config/awesome/rc.lua,先前我已经从/etc/xdg/awesome/rc.lua里拷贝过来了。如果不小心弄坏的话,可以继续从老地方拷贝过来。

每次修改完使用 Mod4 + ctrl + R 重新加载配置。

1. 布局

layouts =
 {
     awful.layout.suit.floating,
     awful.layout.suit.tile,
     awful.layout.suit.tile.left,
     awful.layout.suit.tile.bottom,
     awful.layout.suit.tile.top,
     awful.layout.suit.fair,
     awful.layout.suit.fair.horizontal,
     awful.layout.suit.spiral,
     awful.layout.suit.spiral.dwindle,
     awful.layout.suit.max,
     awful.layout.suit.max.fullscreen,
     awful.layout.suit.magnifier
 }

注释你不需要的内容。

2. 主题/背景

主题:

rc.lua 配置文件,找到这一行内容:

beautiful.init("/usr/share/awesome/themes/default/theme.lua")

改成你想要的主题名。

背景排列方式:

我希望背景图片最大化但不要拉伸,所以我将原本的

gears.wallpaper.maximized(wallpaper, s, true)

改成了

gears.wallpaper.maximized(wallpaper, s, false)

image-20211231172316850

同时背景设置还有其他的方法:

  • centered (surf, s, background, scale)
  • tiled (surf, s, offset)
  • fit (surf, s, background)

可以参考官方文档 或者 源码

背景:

修改主题的theme.lua文件,改一下图片路径:

theme.wallpaper = { "awsetbg /usr/share/awesome/themes/default/background.png" }

比如我:

theme.wallpaper = "/home/kelu/Pictures/shenhe.JPG"

3. 取消标题栏

参考资料:awesome (简体中文) - archlinux

标题栏太碍眼了,取消掉。搜索 titlebars_enabled ,设置为 false 来取消标题栏。

   { rule_any = {type = { "normal", "dialog" }
     }, properties = { titlebars_enabled = false }
   },

4. 自动登录

由于我是多主机工作的模式,所以其他机器必须要自动登录,我才可以直接操作它们。

一些关于登录管理器的概念可以参考:

我是 gnome 环境,gnome 使用的是 GDM 登录管理器,修改文件 /etc/gdm/daemon.conf 文件即可:

[daemon]
AutomaticLoginEnable=True
AutomaticLogin=username 

5. 状态栏插件

Awesome 里的插件指的是你可以在 wibox 上添加的小插件,通过使用插件(Widget),我们可以在状态栏上添加一些有用的信息,例如内存使用、CPU温度、电池状态,等等。官方wiki上有很详细的介绍:http://awesome.naquadah.org/wiki/Widgets_in_awesome

对于新手,可以使用其他用户创建的插件库,这些插件库集成了功能齐全的插件,因此免去了自己编写插件的工作。这类的插件库有很多,常用的有ViciousObvious 等。

– 来自平铺式窗口管理器-Awesome - hahack.com

我没有折腾太多,显示了cpu/内存/电量就不做更多工作了。也许以后还会增加,到时候再说了。

  • rc.lua 头部增加声明信息:

    local vicious = require("vicious")
    

    image-20211231175612138

  • 新增信息

    -- kelu custom widget
    cpuwidget = wibox.widget.textbox()
    vicious.cache(vicious.widgets.cpu)
    vicious.register(cpuwidget, vicious.widgets.cpu, "CPU: <span foreground='#20B2AA'> $1% </span>", 13)
      
    memwidget = wibox.widget.textbox()
    vicious.cache(vicious.widgets.mem)
    vicious.register(memwidget, vicious.widgets.mem, "内存: <span foreground='#20B2AA'> $1% </span>", 13)
      
    batwidget = wibox.widget.textbox()
    vicious.register(batwidget, vicious.widgets.bat, "电量: <span foreground='#20B2AA'> $2% </span>", 61, "BAT1")
    -- kelu custom widget end
    

    同时在稍微下面一些 wful.screen.connect_for_each_screen 的方法里增加widget信息。

    ba

6. 开机自启动应用

以下是我的例子:

--  "by kelu",
local function run_once(cmd_arr)
    for _, cmd in ipairs(cmd_arr) do
      awful.spawn.with_shell(string.format("pgrep -u $USER -fx '%s' > /dev/null || (%s)", cmd, cmd))
    end
end

run_once({ "synergy" })
run_once({ "ibus-daemon -d -x -r -n awesome" })
run_once({ "compton --conf /home/kelu/.config/compton.conf" })
run_once({ "/home/kelu/桌面/WeChat.desktop" })

7. 自定义快捷键

编辑 rc.lua,在文件中查找文本

-- {{{ Key bindings
globalkeys = awful.util.table.join(

在此之下,可以添加您的自定义命令,例如:

-- {{{ Key bindings
globalkeys = awful.util.table.join(
     -- My Bindings
     awful.key({ }, "F1", function () awful.util.spawn_with_shell("terminator") end),

以下是我的一些例子,注意不要和原有的快捷键冲突噢:

    -- Custom
    awful.key({ "Control" ,           }, "3", function () awful.util.spawn_with_shell("shutter -f") end,
              {description = "screenshot", group = "custom"}),
    awful.key({ "Control" ,           }, "4", function () awful.util.spawn_with_shell("shutter -a") end,
              {description = "screenshot", group = "custom"}),
    awful.key({ "Control" ,           }, "5", function () awful.util.spawn_with_shell("shutter -s") end,
              {description = "screenshot", group = "custom"}),
    awful.key({ modkey,           }, "e", function () awful.util.spawn_with_shell("nautilus --no-desktop .") end,
              {description = "nautilus", group = "custom"}),
    awful.key({ modkey,           }, "w", function () awful.util.spawn_with_shell("/usr/share/typora/Typora /home/kelu/Workspace/document/todo.md") end,
              {description = "Typora", group = "custom"}),
--    awful.key({ modkey,           }, "w", function () awful.util.spawn_with_shell("nautilus --no-desktop .") end,
--              {description = "nautilus", group = "custom"}),
    awful.key({ modkey,           }, "b", function () awful.util.spawn_with_shell("google-chrome-stable") end,
              {description = "chrome", group = "custom"}),

我配置了自己的group叫custom,所有快捷键的信息可以使用 Mod4+S 快捷键查询。

image-20211229091449649配置信息基本都能看懂

image-20211231180420061

image-20211231180448581

8.管理网络连接

Gnome Shell 有自己的网络连接管理面板,但实际上还是调用了 NetworkManager 的 接口,而 NetworkManager 又很贴心地提供了命令行控制程序 nmcli . 我的网络环 境一般比较稳定,没必要特地在 GUI 上显示网络状态,一般的网络操作在命令行下就 能完成。

参考redhat有相关文档。我这篇 blog 记录如何操作 nmcli

nmcli dev wifi
nmcli dev wifi connect <SSID> 
nmcli conn up <Name or UUID> 

9. 自定义关闭窗口快捷键

在方法 clientkeys = awful.util.table.join 内部添加:

    awful.key({ modkey,           }, "q",       function (c) c:kill()  end,
              {description = "close", group = "custom"}),
    awful.key({ altkey,           }, "q",       function (c) c:kill()  end,
              {description = "close", group = "custom"}),

10. 透明设置

compton是窗口透明化的工具,如果你当前使用的软件支持窗口透明的功能,那么compton可以帮你设置透明度,阴影效果,窗口切换效果等。

$ sudo apt-get install compton
$ compton & #启动

安装后配置文件在

~/.config/compton.conf

这是我的配置:compton.conf 。配置里做了一些系统阴影和透明度的处理。透明度是这个配置。

inactive-opacity = 0.8;

不活动的窗口设置0.8的透明度。

修改之后要记得重启 compton

# 先查找compton的pid
ps aux | grep comption
kill -9 <pid>

compton --conf /home/kelu/.config/compton.conf

待完成

  • 多显示器
  • 设置tags
  • 设置浮动窗口
  • 音量
  • 屏保
  • 微信

参考资料