蚊章汇 - Sachin Patil
type: channel
link: https://linuxcn.bwsl.wang/author/967/
description: Sachin Patil
items: setV：一个管理 Python 虚拟环境的 Bash 函数
items: 如何在 Emacs 中使用 Magit 管理 Git 项目
items: 如何使用 Emacs 创建 LaTeX 文档
items: Makefile 及其工作原理
items: 如何在 Linux 系统中结束进程或是中止程序

setV：一个管理 Python 虚拟环境的 Bash 函数
type: item
date: 2020-01-20T07:43:19+08:00
description: 了解一下 setV，它是一个轻量级的 Python 虚拟环境管理器，是 virtualenvwrapper 的替代产品。这一年多来，我的 bash\_scripts 项目中悄悄隐藏这 setV，但现在是时候该公开了。setV 是一个 Bash 函数，我可以用它代替 virtualenvwrapper。它提供了使你能够执行以下操作的基本功能：默认使用 Python 3创建一个新的虚拟环境使用带有 -p（或 --python）的自定义 Python 路径来创建新的虚拟环境删除现有的虚拟环境列出所有现有的虚拟环境使用制表符补全（以防你忘记虚拟环境名称）安装要安装 setV，请下载该脚本：curl https://gitlab.com/psachin/setV/raw/master/install.sh审核一下脚本，然后运行它：sh ./install.sh当安装 setV 时，安装脚本会要求你引入（source）一下 ~/.bashrc 或 ~/.bash_profile 的配置，根据你的喜好选择一个。用法基本的命令格式是 setv。创建虚拟环境setv --new rango # setv -n rango # 或使用定制的 Python 路径 setv --new --python /opt/python/python3 rango # setv -n -p /opt/python/python3 rango激活已有的虚拟环境setv VIRTUAL_ENVIRONMENT_NAME# 示例 setv rango列出所有的虚拟环境setv --list # 或 setv [TAB] [TAB]删除虚拟环境setv --delete rango切换到另外一个虚拟环境# 假设你现在在 'rango'，切换到 'tango' setv tango制表符补完如果你不完全记得虚拟环境的名称，则 Bash 式的制表符补全也可以适用于虚拟环境名称。参与其中setV 在 GNU GPLv3下开源，欢迎贡献。要了解更多信息，请访问它的 GitLab 存储库中的 setV 的 README 的贡献部分。setV 脚本#!/usr/bin/env bash # setV - A Lightweight Python virtual environment manager. # Author: Sachin (psachin) <iclcoolster@gmail.com> # Author's URL: https://psachin.gitlab.io/about # # License: GNU GPL v3, See LICENSE file # # Configure(Optional): # Set `SETV_VIRTUAL_DIR_PATH` value to your virtual environments # directory-path. By default it is set to '~/virtualenvs/' # # Usage: # Manual install: Added below line to your .bashrc or any local rc script(): # --- # source /path/to/virtual.sh # --- # # Now you can 'activate' the virtual environment by typing # $ setv <YOUR VIRTUAL ENVIRONMENT NAME> # # For example: # $ setv rango # # or type: # setv [TAB] [TAB] (to list all virtual envs) # # To list all your virtual environments: # $ setv --list # # To create new virtual environment: # $ setv --new new_virtualenv_name # # To delete existing virtual environment: # $ setv --delete existing_virtualenv_name # # To deactivate, type: # $ deactivate # Path to virtual environment directory SETV_VIRTUAL_DIR_PATH="$HOME/virtualenvs/" # Default python version to use. This decides whether…

如何在 Emacs 中使用 Magit 管理 Git 项目
type: item
date: 2019-02-24T06:58:04+08:00
description: Emacs 的 Magit 扩展插件使得使用 Git 进行版本控制变得简单起来。Git 是一个很棒的用于项目管理的 版本控制 工具，就是新人学习起来太难。Git 的命令行工具很难用，你不仅需要熟悉它的标志和选项，还需要知道什么环境下使用它们。这使人望而生畏，因此不少人只会非常有限的几个用法。好在，现今大多数的集成开发环境 (IDE) 都包含了 Git 扩展，大大地简化了使用使用的难度。Emacs 中就有这么一款 Git 扩展名叫 Magit。Magit 项目成立有差不多 10 年了，它将自己定义为 “一件 Emacs 内的 Git 瓷器”。也就是说，它是一个操作界面，每个操作都能一键完成。本文会带你领略一下 Magit 的操作界面并告诉你如何使用它来管理 Git 项目。若你还没有做，请在开始本教程之前先 安装 Emacs，再 安装 Magit。Magit 的界面首先用 Emacs 的 Dired 模式 访问一个项目的目录。比如我所有的 Emacs 配置存储在 ~/.emacs.d/ 目录中，就是用 Git 来进行管理的。若你在命令行下工作，则你需要输入 git status 来查看项目的当前状态。Magit 也有类似的功能：magit-status。你可以通过 M-x magit-status （快捷方式是 Alt+x magit-status ）来调用该功能。结果看起来像下面这样：Magit 显示的信息比 git status 命令的要多得多。它分别列出了未追踪文件列表、未暂存文件列表以及已暂存文件列表。它还列出了 储藏 stash 列表以及最近几次的提交 —— 所有这些信息都在一个窗口中展示。如果你想查看修改了哪些内容，按下 Tab 键。比如，我移动光标到未暂存的文件 custom_functions.org 上，然后按下 Tab 键，Magit 会显示修改了哪些内容：这跟运行命令 git diff custom_functions.org 类似。储藏文件更简单。只需要移动光标到文件上然后按下 s 键。该文件就会迅速移动到已储藏文件列表中：要 反储藏 unstage 某个文件，使用 u 键。按下 s 和 u 键要比在命令行输入 git add -u <file> 和 git reset HEAD <file> 快的多也更有趣的多。提交更改在同一个 Magit 窗口中，按下 c 键会显示一个提交窗口，其中提供了许多标志，比如 --all 用来暂存所有文件或者 --signoff 来往提交信息中添加签名行。将光标移动到想要启用签名标志的行，然后按下回车。--signoff 文本会变成高亮，这说明该标志已经被启用。再次按下 c 键会显示一个窗口供你输入提交信息。最后，使用 C-c C-c(按键 Ctrl+cc 的缩写形式) 来提交更改。推送更改更改提交后，提交行将会显示在 Recent commits 区域中显示。将光标放到该提交处然后按下 p 来推送该变更。若你想感受一下使用 Magit 的感觉，我已经在 YouTube 上传了一段 演示。本文只涉及到 Magit 的一点皮毛。它有许多超酷的功能可以帮你使用 Git 分支、变基等功能。你可以在 Magit 的主页上找到 文档、支持，以及更多 的链接。via: https://opensource.com/article/19/1/how-use-magit作者：Sachin Patil 选题：lujun9972 译者：lujun9972 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

如何使用 Emacs 创建 LaTeX 文档
type: item
date: 2018-11-24T18:52:00+08:00
description: 这篇教程将带你遍历在 Emacs 使用强大的开源排版系统 LaTex 来创建文档的全过程。一篇由 Aaron Cocker 写的很棒的文章 “在 LaTeX 中创建文件的介绍” 中，介绍了 LaTeX 排版系统 并描述了如何使用 TeXstudio 来创建 LaTeX 文档。同时，他也列举了一些很多用户觉得创建 LaTeX 文档很方便的编辑器。Greg Pittman 对这篇文章的评论吸引了我：“当你第一次开始使用 LaTeX 时，他似乎是个很差劲的排版……” 事实也确实如此。LaTeX 包含了多种排版字体和调试，如果你漏了一个特殊的字符比如说感叹号，这会让很多用户感到沮丧，尤其是新手。在本文中，我将介绍如何使用 GNU Emacs 来创建 LaTeX 文档。创建你的第一个文档启动 Emacs：emacs -q --no-splash helloworld.org参数 -q 确保 Emacs 不会加载其他的初始化配置。参数 --no-splash-screen 防止 Emacs 打开多个窗口，确保只打开一个窗口，最后的参数 helloworld.org 表示你要创建的文件名为 helloworld.org 。GNU Emacs 打开文件名为 helloworld.org 的窗口时的样子。现在让我们用 Emacs 添加一些 LaTeX 的标题吧：在菜单栏找到 “Org” 选项并选择 “Export/Publish”。导入一个默认的模板在下一个窗口中，Emacs 同时提供了导入和导出一个模板。输入 #（“[#] Insert template”）来导入一个模板。这将会使光标跳转到一个带有 “Options category:” 提示的 mini-buffer 中。第一次你可能不知道这个类型的名字，但是你可以使用 Tab 键来查看所有的补全。输入 “default” 然后按回车，之后你就能看到如下的内容被插入了：#+TITLE: helloworld #+DATE: <2018-03-12 Mon> #+AUTHOR: #+EMAIL: makerpm@nubia #+OPTIONS: ':nil *:t -:t ::t <:t H:3 \n:nil ^:t arch:headline #+OPTIONS: author:t c:nil creator:comment d:(not "LOGBOOK") date:t #+OPTIONS: e:t email:nil f:t inline:t num:t p:nil pri:nil stat:t #+OPTIONS: tags:t tasks:t tex:t timestamp:t toc:t todo:t |:t #+CREATOR: Emacs 25.3.1 (Org mode 8.2.10) #+DESCRIPTION: #+EXCLUDE_TAGS: noexport #+KEYWORDS: #+LANGUAGE: en #+SELECT_TAGS: export根据自己的需求修改标题、日期、作者和 email。我自己的话是下面这样的：#+TITLE: Hello World! My first LaTeX document #+DATE: \today #+AUTHOR: Sachin Patil #+EMAIL: psachin@redhat.com我们目前还不想创建一个目录，所以要将 toc 的值由 t 改为 nil，具体如下：#+OPTIONS: tags:t tasks:t tex:t timestamp:t toc:nil todo:t |:t现在让我们添加一个章节和段落吧。章节是由一个星号（*）开头。我们从 Aaron 的贴子（来自 Lipsum Lorem Ipsum 生成器）复制一些文本过来：* Introduction \paragraph{} Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras lorem nisi, tincidunt tempus sem nec, elementum feugiat ipsum. Nulla in diam libero. Nunc tristique ex a nibh egestas sollicitudin. \paragraph{} Mauris efficitur vitae ex id egestas. Vestibulum ligula felis, pulvinar a posuere id, luctus vitae leo. Sed ac imperdiet orci, non elementum leo. Nullam mo…

Makefile 及其工作原理
type: item
date: 2018-09-11T18:06:00+08:00
description: 用这个方便的工具来更有效的运行和编译你的程序。当你需要在一些源文件改变后运行或更新一个任务时，通常会用到 make 工具。make 工具需要读取一个 Makefile（或 makefile）文件，在该文件中定义了一系列需要执行的任务。你可以使用 make 来将源代码编译为可执行程序。大部分开源项目会使用 make 来实现最终的二进制文件的编译，然后使用 make install 命令来执行安装。本文将通过一些基础和进阶的示例来展示 make 和 Makefile 的使用方法。在开始前，请确保你的系统中安装了 make。基础示例依然从打印 “Hello World” 开始。首先创建一个名字为 myproject 的目录，目录下新建 Makefile 文件，文件内容为：say_hello: echo "Hello World"在 myproject 目录下执行 make，会有如下输出：$ make echo "Hello World" Hello World在上面的例子中，“say\_hello” 类似于其他编程语言中的函数名。这被称之为 目标 target 。在该目标之后的是预置条件或依赖。为了简单起见，我们在这个示例中没有定义预置条件。echo ‘Hello World' 命令被称为 步骤 recipe 。这些步骤基于预置条件来实现目标。目标、预置条件和步骤共同构成一个规则。总结一下，一个典型的规则的语法为：目标: 预置条件 <TAB> 步骤作为示例，目标可以是一个基于预置条件（源代码）的二进制文件。另一方面，预置条件也可以是依赖其他预置条件的目标。final_target: sub_target final_target.c Recipe_to_create_final_target sub_target: sub_target.c Recipe_to_create_sub_target目标并不要求是一个文件，也可以只是步骤的名字，就如我们的例子中一样。我们称之为“伪目标”。再回到上面的示例中，当 make 被执行时，整条指令 echo "Hello World" 都被显示出来，之后才是真正的执行结果。如果不希望指令本身被打印处理，需要在 echo 前添加 @。say_hello: @echo "Hello World"重新运行 make，将会只有如下输出：$ make Hello World接下来在 Makefile 中添加如下伪目标：generate 和 clean：say_hello: @echo "Hello World" generate: @echo "Creating empty text files..." touch file-{1..10}.txt clean: @echo "Cleaning up..." rm *.txt随后当我们运行 make 时，只有 say_hello 这个目标被执行。这是因为Makefile 中的第一个目标为默认目标。通常情况下会调用默认目标，这就是你在大多数项目中看到 all 作为第一个目标而出现。all 负责来调用它他的目标。我们可以通过 .DEFAULT_GOAL 这个特殊的伪目标来覆盖掉默认的行为。在 Makefile 文件开头增加 .DEFAULT_GOAL：.DEFAULT_GOAL := generatemake 会将 generate 作为默认目标：$ make Creating empty text files... touch file-{1..10}.txt顾名思义，.DEFAULT_GOAL 伪目标仅能定义一个目标。这就是为什么很多 Makefile 会包括 all 这个目标，这样可以调用多个目标。下面删除掉 .DEFAULT_GOAL，增加 all 目标：all: say_hello generate say_hello: @echo "Hello World" generate: @echo "Creating empty text files..." touch file-{1..10}.txt clean: @echo "Cleaning up..." rm *.txt运行之前，我们再增加一些特殊的伪目标。.PHONY 用来定义这些不是文件的目标。make 会默认调用这些伪目标下的步骤，而不去检查文件名是否存在或最后修改日期。完整的 Makefile 如下：.PHONY: all say_hello generate clean all: say_hello generate say_hello: @echo "Hello World" generate: @echo "Creating empty text files..." touch fi…

如何在 Linux 系统中结束进程或是中止程序
type: item
date: 2018-06-05T06:14:00+08:00
description: 在 Linux 中有几种使用命令行或图形界面终止一个程序的方式。进程出错的时候，您可能会想要中止或是杀掉这个进程。在本文中，我们将探索在命令行和图形界面中终止进程或是应用程序，这里我们使用 gedit 作为样例程序。使用命令行或字符终端界面Ctrl + C在命令行中调用 gedit （如果您没有使用 gedit & 命令）程序的一个问题是 shell 会话被阻塞，没法释放命令行提示符。在这种情况下，Ctrl + C （Ctrl 和 C 的组合键） 会很管用。这会终止 gedit ，并且所有的工作都将丢失（除非文件已经被保存）。Ctrl + C 会给 gedit 发送了 SIGINT 信号。这是一个默认终止进程的停止信号，它将指示 shell 停止 gedit 的运行，并返回到主函数的循环中，您将返回到提示符。$ gedit ^C Ctrl + Z它被称为挂起字符。它会发送 SIGTSTP 信号给进程。它也是一个停止信号，但是默认行为不是杀死进程，而是挂起进程。下面的命令将会停止（杀死/中断） gedit 的运行，并返回到 shell 提示符。$ gedit ^Z [1]+ Stopped gedit $ 一旦进程被挂起（以 gedit 为例），将不能在 gedit 中写入或做任何事情。而在后台，该进程变成了一个作业，可以使用 jobs 命令验证。$ jobs [1]+ Stopped gedit jobs 允许您在单个 shell 会话中控制多个进程。您可以终止，恢复作业，或是根据需要将作业移动到前台或是后台。让我们在后台恢复 gedit，释放提示符以运行其它命令。您可以通过 bg 命令来做到，后跟作业 ID（注意上面的 jobs 命令显示出来的 [1]，这就是作业 ID）。$ bg 1 [1]+ gedit & 这和直接使用 gedit & 启动程序效果差不多：$ gedit & 使用 killkill 命令提供信号的精确控制，允许您通过指定信号名或是信号数字为进程发送信号，后跟进程 ID 或是 PID。我喜欢 kill 命令的一点是它也能够根据作业 ID 控制进程。让我们使用 gedit & 命令在后台开启 gedit 服务。假设通过 jobs 命令我得到了一个 gedit 的作业 ID，让我们为 gedit 发送 SIGINT 信号：$ kill -s SIGINT %1 作业 ID 需要使用 % 前缀，不然 kill 会将其视作 PID。不明确指定信号，kill 仍然可以工作。此时，默认会发送能中断进程的 SIGTERM 信号。执行 kill -l 可以查看信号名列表，使用 man kill 命令阅读手册。使用 killall如果您不想使用特定的工作 ID 或者 PID，killall 允许您使用特定的进程名。中断 gedit 最简单的 killall 使用方式是：$ killall gedit 它将终止所有名为 gedit 的进程。和 kill 相似，默认发送的信号是 SIGTERM。使用 -I 选项忽略进程名的大小写。$ gedit & [1] 14852 $ killall -I GEDIT [1]+ Terminated gedit 查看手册学习更多 killall 命令选项（如 -u）。使用 xkill您是否遇见过播放器崩溃，比如 VLC 灰屏或挂起？现在你可以像上面一样获得进程的 PID 来杀掉它，或者使用 xkill 命令终止应用程序。xkill 允许您使用鼠标关闭窗口。仅需在终端执行 xkill 命令，它将会改变鼠标光标为一个 X 或是一个小骷髅图标。在你想关闭的进程窗口上点击 x。小心使用 xkill，如手册描述的一致，它很危险。我已经提醒过您了！参阅手册，了解上述命令更多信息。您还可以接续探索 pkill 和 pgrep 命令。via: https://opensource.com/article/18/5/how-kill-process-stop-program-linux作者：Sachin Patil 选题：lujun9972 译者：CYLeft 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出