标签 编辑器 下的文章

有时候,除你自己外,没有人能制作你所梦想的工具。以下是如何开始构建你自己的文本编辑器。

 title=

有很多文本编辑器。有运行在终端中、运行在 GUI 中、运行在浏览器和浏览器引擎中的。有很多是还不错,有一些则是极好的。但是有时候,毫无疑问,最令人满意的就是你自己构建的编辑器。

毫无疑问:构建一个真正优秀的文本编辑器比表面上看上去要困难得多。但话说回来,建立一个基本的文本编辑器也不像你担心的那样难。事实上,大多数编程工具包已经为你准备好了文本编辑器的大部分组件。围绕文本编辑的组件,例如菜单条,文件选择对话框等等,是很容易落到实处。因此,虽然是中级的编程课程,但构建一个基本的文本编辑器是出乎意料的有趣和简明。你可能会发现自己渴望使用一个自己构造的工具,而且你使用得越多,你可能会有更多的灵感来增加它的功能,从而更多地学习你正在使用的编程语言。

为了使这个练习切合实际,最好选择一种具有令人满意的 GUI 工具箱的语言。有很多种选择,包括 Qt 、FLTK 或 GTK ,但是一定要先评审一下它的文档,以确保它有你所期待的功能。对于这篇文章来说,我使用 Java 以及其内置的 Swing 小部件集。如果你想使用一种不同的语言或者一种不同的工具集,这篇文章在如何帮你处理这种问题的方面也仍然是有用的。

不管你选择哪一种,在任何主要的工具箱中编写一个文本编辑器都是惊人的相似。如果你是 Java 新手,需要更多关于开始的信息,请先阅读我的 猜谜游戏文章

工程设置

通常,我使用并推荐像 Netbeans 或 Eclipse 这样的 IDE,但我发现,当学习一种新的语言时,手工做一些工作是很有帮助的,这样你就能更好地理解使用 IDE 时被隐藏起来的东西。在这篇文章中,我假设你正在使用文本编辑器和终端进行编程。

在开始前,为你自己的工程创建一个工程目录。在工程文件夹中,创建一个名称为 src 的目录来容纳你的源文件。

$ mkdir -p myTextEditor/src
$ cd myTextEditor

在你的 src 目录中创建一个名称为 TextEdit.java 的空白的文件:

$ touch src/TextEditor.java

在你最喜欢的文本编辑器中打开这个空白的文件(我的意思是除你自己编写之外的最喜欢的一款文本编辑器),然后准备好编码吧!

包和导入

为确保你的 Java 应用程序有一个唯一的标识符,你必须声明一个 package 名称。典型的格式是使用一个反向的域名,如果你真的有一个域名的话,这就特别容易了。如果你没有域名的话,你可以使用 local 作为最顶层。像 Java 和很多语言一样,行以分号结尾。

在命名你的 Java 的 package 后,你必须告诉 Java 编译器(javac)使用哪些库来构建你的代码。事实上,这通常是你边编写代码边添加的内容,因为你很少事先知道你自己所需要的库。然而,这里有一些库是显而易见的。例如,你知道这个文本编辑器是基于 Swing GUI 工具箱的,因此,导入 javax.swing.JFramejavax.swing.UIManager 和其它相关的特定库。

package com.example.textedit;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.filechooser.FileSystemView;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

对于这个练习的目标,你可以提前预知你所需要的所有的库。在真实的生活中,不管你喜欢哪一种语言,你都将在研究如何解决一些问题的时候发现库,然后,你将它导入到你的代码中,并使用它。不需要担心 —— 如果你忘记包含一个库,你的编译器或解释器将警告你!

主窗口

这是一个单窗口应用程序,因此这个应用程序的主类是一个 JFrame ,其附带有一个捕捉菜单事件的 ActionListener 。在 Java 中,当你使用一个现有的小部件元素时,你可以使用你的代码“扩展”它。这个主窗口需要三个字段:窗口本身(一个 JFrame 的实例)、一个用于文件选择器返回值的标识符和文本编辑器本身(JTextArea)。

public final class TextEdit extends JFrame implements ActionListener {
private static JTextArea area;
private static JFrame frame;
private static int returnValue = 0;

令人惊奇的是,这数行代码完成了实现一个基本文本编辑器的 80% 的工作,因为 JtextArea 是 Java 的文本输入字段。剩下的 80 行代码大部分用于处理辅助功能,比如保存和打开文件。

构建一个菜单

JMenuBar 小部件被设计到 JFrame 的顶部,它为你提供你想要的很多菜单项。Java 不是一种 拖放式的编程语言,因此,对于你所添加的每一个菜单,你都还必须编写一个函数。为保持这个工程的可控性,我提供了四个函数:创建一个新的文件,打开一个现有的文件,保存文本到一个文件,和关闭应用程序。

在大多数流行的工具箱中,创建一个菜单的过程基本相同。首先,你创建菜单条本身,然后创建一个顶级菜单(例如 “File” ),再然后创建子菜单项(例如,“New”、“Save” 等)。

public TextEdit() { run(); }

public void run() {
    frame = new JFrame("Text Edit");

    // Set the look-and-feel (LNF) of the application
    // Try to default to whatever the host system prefers
    try {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
      Logger.getLogger(TextEdit.class.getName()).log(Level.SEVERE, null, ex);
    }

    // Set attributes of the app window
    area = new JTextArea();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(area);
    frame.setSize(640, 480);
    frame.setVisible(true);

    // Build the menu
    JMenuBar menu_main = new JMenuBar();

    JMenu menu_file = new JMenu("File");

    JMenuItem menuitem_new = new JMenuItem("New");
    JMenuItem menuitem_open = new JMenuItem("Open");
    JMenuItem menuitem_save = new JMenuItem("Save");
    JMenuItem menuitem_quit = new JMenuItem("Quit");

    menuitem_new.addActionListener(this);
    menuitem_open.addActionListener(this);
    menuitem_save.addActionListener(this);
    menuitem_quit.addActionListener(this);

    menu_main.add(menu_file);

    menu_file.add(menuitem_new);
    menu_file.add(menuitem_open);
    menu_file.add(menuitem_save);
    menu_file.add(menuitem_quit);

    frame.setJMenuBar(menu_main);
    }

现在,所有剩余的工作是实施菜单项所描述的功能。

编程菜单动作

你的应用程序响应菜单选择,是因为你的 JFrame 有一个附属于它的 ActionListener 。在 Java 中,当你实施一个事件处理程序时,你必须“重写”其内建的函数。这只是听起来可怕。你不是在重写 Java;你只是在实现已经被定义但尚未实施事件处理程序的函数。

在这种情况下,你必须重写 actionPerformed方法。因为在 “File” 菜单中的所有条目都与处理文件有关,所以在我的代码中很早就定义了一个 JFileChooser 。代码其它部分被划分到一个 if 语句的子语句中,这起来像接收到什么事件就相应地执行什么动作。每个子语句都与其它的子语句完全不同,因为每个项目都标示着一些完全唯一的东西。最相似的是 “Open” 和 “Save”,因为它们都使用 JFileChooser 选择文件系统中的一个位置来获取或放置数据。

“New” 菜单会在没有警告的情况下清理 JTextArea ,“Quit” 菜单会在没有警告的情况下关闭应用程序。这两个 “功能” 都是不安全的,因此你应该想对这段代码进行一点改善,这是一个很好的开始。在内容还没有被保存前,一个友好的警告是任何一个好的文本编辑器都必不可少的一个功能,但是在这里为了简单,这是未来的一个功能。

@Override
public void actionPerformed(ActionEvent e) {
    String ingest = null;
    JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
    jfc.setDialogTitle("Choose destination.");
    jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);

    String ae = e.getActionCommand();
    if (ae.equals("Open")) {
        returnValue = jfc.showOpenDialog(null);
        if (returnValue == JFileChooser.APPROVE_OPTION) {
        File f = new File(jfc.getSelectedFile().getAbsolutePath());
        try{
            FileReader read = new FileReader(f);
            Scanner scan = new Scanner(read);
            while(scan.hasNextLine()){
                String line = scan.nextLine() + "\n";
                ingest = ingest + line;
        }
            area.setText(ingest);
        }
    catch ( FileNotFoundException ex) { ex.printStackTrace(); }
}
    // 保存
    } else if (ae.equals("Save")) {
        returnValue = jfc.showSaveDialog(null);
        try {
            File f = new File(jfc.getSelectedFile().getAbsolutePath());
            FileWriter out = new FileWriter(f);
            out.write(area.getText());
            out.close();
        } catch (FileNotFoundException ex) {
            Component f = null;
            JOptionPane.showMessageDialog(f,"File not found.");
        } catch (IOException ex) {
            Component f = null;
            JOptionPane.showMessageDialog(f,"Error.");
        }
    } else if (ae.equals("New")) {
        area.setText("");
    } else if (ae.equals("Quit")) { System.exit(0); }
  }
}

从技术上来说,这就是这个文本编辑器的全部。当然,并没有真正做什么,除此之外,在这里仍然有测试和打包步骤,因此仍然有很多时间来发现缺少的必需品。假设你没有注意到提示:在这段代码中 肯定 缺少一些东西。你现在知道缺少的是什么吗?(在 猜谜游戏文章 中被大量的提到。)

测试

你现在可以测试你的应用程序。从终端中启动你所编写的文本编辑器:

$ java ./src/TextEdit.java
error: can’t find main(String[]) method in class: com.example.textedit.TextEdit

它看起来像在代码中没有获得 main 方法。这里有一些方法来修复这个问题:你可以在 TextEdit.java 中创建一个 main 方法,并让它运行一个 TextEdit 类实例,或者你可以创建一个单独的包含 main 方法的文件。两种方法都可以工作,但从大型工程的预期来看,使用后者更为明智,因此,使用单独的文件与其一起工作使之成为一个完整的应用程序的方法是值得使用的。

src 中创建一个 Main.java 文件,并在最喜欢的编辑器中打开:

package com.example.textedit;

public class Main {
  public static void main(String[] args) {
  TextEdit runner = new TextEdit();
  }
}

你可以再次尝试,但是现在有两个相互依赖的文件要运行,因此你必须编译代码。Java 使用 javac 编译器,并且你可以使用 -d 选项来设置目标目录:

$ javac src/*java -d .

这会在你的软件包名称 com/example/textedit 后创建一个准确地模型化的新的目录结构。这个新的类路径包含文件 Main.classTextEdit.class ,这两个文件构成了你的应用程序。你可以使用 java 并通过引用你的 Main 类的位置和 名称(非文件名称)来运行它们:

$ java info/slackermedia/textedit/Main`

你的文本编辑器打开了,你可以在其中输入文字,打开文件,甚至保存你的工作。

 title=

以 Java 软件包的形式分享你的工作

虽然一些程序员似乎看起来认可以各种各样的源文件的形式分发软件包,并鼓励其他人来学习如何运行它,但是,Java 让打包应用程序变得真地很容易,以至其他人可以很容易的运行它。你已经有了必备的大部分结构体,但是你仍然需要一些元数据到一个 Manifest.txt 文件中:

$ echo "Manifest-Version: 1.0" > Manifest.txt

用于打包的 jar 命令,与 tar 命令非常相似,因此很多选项对你来说可能会很熟悉。要创建一个 JAR 文件:

$ jar cvfme TextEdit.jar
Manifest.txt
com.example.textedit.Main
com/example/textedit/*.class

根据命令的语法,你可以推测出它会创建一个新的名称为 TextEdit.jar 的 JAR 文件,它所需要的清单数据位于 Manifest.txt 中。它的主类被定义为软件包名称的一个扩展,并且类自身是 com/example/textedit/Main.class

你可以查看 JAR 文件的内容:

$ jar tvf TextEdit.jar
0 Wed Nov 25 META-INF/
105 Wed Nov 25 META-INF/MANIFEST.MF
338 Wed Nov 25 com/example/textedit/textedit/Main.class
4373 Wed Nov 25 com/example/textedit/textedit/TextEdit.class

如果你想看看你的元数据是如何被集成到 MANIFEST.MF 文件中的,你甚至可以使用 xvf 选项来提取它。

使用 java 命令来运行你的 JAR 文件:

$ java -jar TextEdit.jar

你甚至可以 创建一个桌面文件 ,这样,在单击应用程序菜单中的图标时,应用程序就会启动。

改进它

在当前状态下,这是一个非常基本的文本编辑器,最适合做快速笔记或简短自述文档。一些改进(比如添加垂直滚动条)只要稍加研究就能快速简单地完成,而另一些改进(比如实现一个广泛的偏好系统)则需要真正的工作。

但如果你一直在想学一种新的语言,这可能是一个完美的自我学习实用工程。创建一个文本编辑器,如你所见,它在代码方面并不难对付,它在一定范围是可控的。如果你经常使用文本编辑器,那么编写你自己的文本编辑器可能会使你满意和乐趣。因此打开你最喜欢的文本编辑器(你写的那个),开始添加功能吧!


via: https://opensource.com/article/20/12/write-your-own-text-editor

作者:Seth Kenlon 选题:lujun9972 译者:robsean 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

FED 编辑器让我可以轻松有效地对我的 FreeDOS 项目进行编码。学习如何充分利用这个灵活的 Linux、Windows 和 DOS 编辑器。

 title=

当我不在我的 Linux 桌面上工作的时候,我通常是在为一个旧版的 16 位系统写代码。FreeDOS 是一个开源的 DOS 兼容操作系统,你可以用它来玩经典的 DOS 游戏,运行旧版的商业软件,或者开发嵌入式系统。任何在 MS-DOS 上运行的程序在 FreeDOS 上也应该可以运行。

我是和 DOS 一起长大的。我家的第一台个人电脑是一台 Apple II 兼容机,但我们最终升级到了一台运行 DOS 的 IBM PC。从 1980 年代早期到 1993 年我发现 Linux 这段时间,我做了十多年的 DOS 用户。

Linux 和开源软件所提供的自由度给我留下了深刻的印象。所以当微软在 1994 年宣布 DOS 的终结,以及即将推出的 Windows 95 时,我决定编写自己的开源 DOS。这就是 FreeDOS 的开始

这么多年过去了,我还在继续研究 FreeDOS。它是一个很好的业余兴趣系统,在这里我可以运行我最喜欢的 DOS 应用和游戏。是的,我仍然在为 FreeDOS 写代码。

我最喜欢的 DOS 编程编辑器是 FED 编辑器。FED 是一个极简的文本编辑器,没有太多的视觉效果。这种精简的方法帮助我充分利用了 DOS 中标准的 80x25 屏幕。当编辑一个文件时,FED 会在屏幕底部显示一行状态行,让你在剩下的 24 行来编写你的代码。FED 还支持彩色语法高亮显示,以不同的颜色显示代码的不同部分,使你更容易发现错别字,以免它们变成错误。

Writing a Solitaire game with FED

用 FED 写一个纸牌游戏

当你需要菜单时,按下键盘上的 Alt 键,FED 就会在最上面一行显示一个菜单。FED 也支持键盘快捷键,但要注意默认值。例如,Ctrl-C 会关闭文件,Ctrl-V 会改变视图。如果你不喜欢这些默认键,你可以在 Config 菜单中更改键位映射。

Tap the Alt key to bring up the menu

按下 Alt 键弹出菜单

如果你不喜欢默认的白底黑字显示,你可以在 Config 菜单下更改颜色。我更喜欢蓝底白字的正文,关键词用亮白色,注释用亮蓝色,特殊字符用青色,数字用绿色。FED 可以很容易地设置你想要的颜色。

My preferred colors when programming on DOS

我在 DOS 上编程时喜欢的颜色

FED 也是一个折叠式文本编辑器,这意味着它可以折叠或展开我的部分代码,以便我可以看到更多的文件。在函数名上按下 Ctrl-F,FED 会折叠整个函数。折叠在其他代码上也可以使用。我也使用折叠来隐藏 forwhile 循环或其他流程控制,如 ifswitch 块。

Folding a function lets you see more of the file

折叠函数可以让你看到更多的文件

Shawn Hargreaves 从 1994 年至 2004 年编写并维护 FED。Robert Riebisch 从那时起就开始维护 FED。FED 在 GNU GPL 许可下发布,支持 DOS、Linux 和 Windows。

你可以在 https://www.bttr-software.de/products/fed/ 下载 FED。


via: https://opensource.com/article/21/1/fed-editor

作者:Jim Hall 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Atom 是一个全面的环境,可以完成从基本到复杂的任务,适合从初学者到老用户。

 title=

现在漂亮的开源文本编辑器很常见,有 Adobe 的 Brackets、微软的 VSCode 和 GitHub 的 Atom。这些似乎都提供了类似的体验:现代化的界面、易于安装的插件,以及背后的一个大厂商支持。而且它们其实都很不错。那么 Atom 与其他超现代的文本编辑器有什么不同呢?与经典的老式编辑器如 VimEmacs 有何区别呢?

 title=

我用过很多文本编辑器,并且经过反思,我不得不承认,所有的文本编辑器基本上都差不多。在判断一个编辑器的功效时,只要它能做一件事:编辑文字,就能满足 80% 的要求。另外的 20% 则是额外的便利、额外的小玩意和花哨的功能。它们是很好的东西,但几乎不是必不可少的。

不过我经常回到 Atom,因为作为一个开源的用户,只要我愿意,我就可以奢侈地有很多应用使用。以下是我喜欢 Atom 的原因。

新手友好

我最喜欢 Atom 的一点是,它让人感觉很“正常”。我可以把 Atom 安装在任何人的电脑上,他们很快就可以开始输入了。没有新的键盘快捷键需要学习,没有严重偏离用户界面的惯例。如果我花几分钟时间向他们展示一些应用的强大功能,那么他们很快就会有能力安装新的插件,发现他们喜欢的有用功能。

它的独特之处在于让人感到与众不同,但又足够“安全”,足以让人相信(也确实如此)他们可以使用它。这是一条很难走的路线,但 Atom 做到了,我很欣赏它。

强大的扩展

当你启动应用就已经满足了大多数需求时,开源文本编辑器的一个主要“卖点”就是它的扩展。我习惯使用的编辑器是 GNU Emacs,它的扩展功能多到令人瞠目结舌,可以提供从电子邮件客户端到视频游戏的所有功能。要做到这一点很难,老实说,我还没有看到其它能做到的编辑器。不过这说明了扩展是多么重要,而 Atom 有一套不错的插件。

有一些扩展可以为语言和格式添加语法高亮、添加动态格式检查、以及集成调试器、运行时环境、视频和音乐播放器控件等等。实际上,你可以让 Atom 成为你桌面的控制中心,你很少需要离开它。

语言和语法支持

我是 Docbook 的忠实粉丝。顺便说一下,也是它的简化前端 Asciidoc 的粉丝。当我评估一个编辑器时,Docbook 模式和 Asciidoc 支持是我的两个主要指标。虽然对 XML 的支持比较常见,但与特定模式的集成可能是一个高难度的任务,而且 Asciidoc 相对小众。Atom 的社区为我最喜欢的格式提供了很好的支持。

当然,我已经提到了 Atom 一般来说有很好的扩展,但无论你在输入什么语言,语法高亮都是一个重要的功能。再次感谢充满活力的社区,在 Atom 的软件包仓库中,丰富的语法高亮选项的是它的优点之一。

简单定制主题

Atom 让你制作自己的风格就像设计网站的风格一样简单,所以如果你会使用 CSS,你可以制作你自己的 Atom 主题。要创建你自己的主题,找到 软件包 Package 菜单。如果你没有看到 软件包 Package 菜单,先按 Alt 键,露出顶部菜单栏。在 软件包 Package 菜单中,将鼠标悬停在 软件包生成器 Package Generator 上,然后选择 Generate Atom Syntax Theme 生成 Atom 语法主题 。这将打开一个新的项目,默认名为 “my-theme-syntax”。你可以把它命名为任何你想要的名字,但根据 Atom 惯例,它应该以 -syntax 结尾。

在你的新主题项目中,找到这些文件:base.lesscolors.lesssyntax-variables.less。这些文件定义了当语法激活时,特殊的关键字,甚至是背景和前景的颜色是如何显示的。因为它们都是从一个通用模板中继承的值,所以很容易修改。比如说:

// Syntax styles

.syntax--comment {
  color: @light-gray;
}

.syntax--keyword {
  color: @purple;

  &.syntax--control {
    color: @purple;
  }

  &.syntax--operator {
    color: @syntax-text-color;
  }

  &.syntax--other.syntax--special-method {
    color: @blue;
  }

  &.syntax--other.syntax--unit {
    color: @orange;
  }
}

以两个破折号结尾的值,如 .syntax--keyword,是语法高亮引擎识别的对象。当然,如果你想进一步开发你的自定义设置,你甚至可以创建你自己的语法定义(尽管这比 CSS 主题更费劲)。在 flight-manual.atom.io 上可以阅读所有关于修改 Atom 的方法。

灵活的工作流

Atom 有很多功能,默认情况下仅激活其中一部分。这意味着你可以决定你喜欢的工作方式,是否激活新的扩展并使用它们从根本上改变 Atom,还是只打开 Atom 的偏好并进行小的调整。你可以用 Atom 来写一本小说,也可以用它来写 Python 代码或技术文档或其他任何东西。

即使是它的 Git 集成也没有坚持让你使用可能会想到的显而易见的仓库(Github 赞助了 Atom)。它没有任何限制,而且它对每个人都同样有用,不管受众是谁。

安装

在 Linux、Windows 和 macOS 上,你可以 从它的网站安装 Atom

另外,在 Linux 上,你可以从 Flathub 中,以 Flatpak 安装 Atom。

如果你想自己构建 Atom,你也可以 从 Github 上的源码编译它

尝试 Atom

Atom 可以成为你的下一个文本编辑器、记事本和 IDE。它易于使用、易于配置、易于扩展,并提供了良好的用户体验。今天就下载 Atom,试试吧。


via: https://opensource.com/article/20/12/atom

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

这款全屏编辑器可以帮助你设定写作目标,并将干扰降到最低,从而实现你的目标。

计算机的好处是,它们真的很擅长一心多用。

计算机的坏处是,它们实在太擅长一心多用。

无论你认为自己作为一个人,在多任务处理方面是好是坏,有时你需要一点帮助来集中注意力,尤其是当你试图撰写清晰和简明的交流信息时。而这正是开发 Focuswriter 的原因。

安装

在 Linux 上,你可以从 Flathub 以 Flatpak 包安装 Focuswriter。

在 Windows 或 Linux 上(如果你不使用 Flatpak),你可以从它的网站安装 Focuswriter。你也可以从源代码安装,它也可以从 Focuswriter 网站上获得。

使用 Focuswriter

不可否认,Focuswriter 实际上处于文本编辑器和文字处理器的重叠的地带。它的默认格式是 开放文档文本 Open Document Text (.odt)格式,所以它允许你设置文本样式和对齐文本、标记页眉,以及开启和关闭智能引号。但它的文字处理器功能也就到此为止,因为 Focuswriter 确实主要专注于\_写作\_,而不是对你所写的东西进行样式设计。

Focuswriter 以几种不同的方式鼓励专注力:

吸引力

Focuswriter 看起来并不像你平常的电脑应用程序,更不像你平常的文本编辑器。当它启动时,它会在你的文档后面加载一个主题。主题一般是良性的 —— 默认是写字台,但也有星空、远方的风景等等。当然,你并不是要全神贯注于此主题,但它确实可以帮助你避免被徘徊于你的编辑器后面的其他应用窗口或电脑桌面分散注意力。因为它很容易定制,所以你几乎不大可能找不到你喜欢的主题。

 title=

音效

Focuswriter 使用起来其实很有趣。除了视觉主题外,它还有一个\_可选的\_打字机音频主题。启用后,每按一次键都会发出机械打字机按键的声音。当你按下回车键时,回车的声音令人满意,这是对你完成一段文字(或一行文字,如果你为了改善版本控制而每行写一句话)的奖励。

这个音频主题完全是可选的,默认情况下是不开启的。你可能会怀疑它的效果,但你不应该低估发出这些生产力声音而有具有现代文本编辑能力所带来的满足感。

全屏显示

Focuswriter 不仅在默认情况下启动全屏,而且还从视图中隐藏了其菜单和其他部件。要访问主菜单栏,你要将光标放在屏幕顶部,直到它出现。右边隐藏了一个滚动条,左边隐藏了一个文档切换器小部件,底部则隐藏着一个状态栏。

极简主义

Focuswriter 的编辑功能并不多。它没有高级搜索选项,也没有代码格式化或语法高亮的专门选项。它的设计是让你在文档中写入文本,而不是其他的什么。即使是上下文右键菜单也只提供基本的编辑功能(复制、剪切、粘贴等)或拼写检查选项。

聚焦一行

Focuswriter 的另一个可选功能是它能够“灰化”除了你的当前文本行之外的所有文本行。这可以帮助你的眼睛懒洋洋地定位你当前的文字行,如果你不是一个盲打打字员,或者如果你正在抄写一些你手写在纸张上的东西,眼睛必须经常远离屏幕,这可能特别有用。

目标追踪

你可以在 Focuswriter 的首选项中为自己设置一个每日字数目标或定时目标。当你工作时,你的进度会被跟踪,并显示在屏幕底部的状态栏中。除非你将光标悬停在它上面,否则它是隐藏在你的视野中的,所以你不会被迫沉迷于它,但它足够方便,可以帮助你保持进度。

即使你认为它很傻,也请尝试一下 Focuswriter

以前也听说过全屏文本编辑器,但我一直不觉得全屏文本编辑器对我来说有什么重要意义。毕竟,几乎所有的应用程序都可以全屏显示,而我个人也没有任何关注力问题。

不过在尝试过 Focuswriter 之后,我明白了一个好的全屏“关注力优先”文本编辑器的魅力所在。也许没有必要,但话又说回来,开源是如此的兴盛,我们有大量的冗余应用,这些应用功能略有差异,但实现上差异很大。Focuswriter 让写作变得有趣,它让工作变得愉快。下载它,设定一个目标,然后开始写作吧!


via: https://opensource.com/article/20/12/focuswriter

作者:Seth Kenlon 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Joe's Own Editor (JOE)是一款简单易学和使用的通用文本编辑器。

我很喜欢那些能让你轻松学会如何使用的文本编辑器。GNU nano 是我最喜欢的例子:你启动 nano,你会在整个会话的窗口底部看到一个最常用的命令列表。Joe's Own Editor(简称 joe)是另一个很好的例子。

joe 编辑器使用了一个基于终端的界面,提供了简单的文本编辑功能和一个易于访问的帮助屏幕。它用 C 语言编写,体积小,只对 libc 有硬性依赖(ncurses 是可选的),并且采用 GPL 许可证。

安装

在 Linux 上,你也许能在你的发行版软件仓库中找到 JOE。虽然它有点小众,并不是所有的发行版都打包了它。如果是这样的话,你可以从 SourceForge 下载源码,然后自己编译。这是个简单的过程:

$ ./configure
$ make
$ sudo make install

使用 JOE

据其作者介绍,JOE 的灵感来自于一个叫 WordStar 的应用和 GNU Emacs。它的大部分基本编辑键都与 WordStar 的快捷键相同,编辑器本身也在努力向 WordStar 靠拢。JOE 也有 GNU Emacs 的一些键绑定和功能。这种两种灵感来源的混合有时会让人迷惑,但话又说回来,在任何情况下,让自己离开 Emacs(或你通常选择的文本编辑器)都会让人迷惑。重要的是,JOE 提供了帮助,而且很容易访问。

在 JOE 界面右上角,有一个持续的提示,你可以按 Ctrl+K,紧接着按 H 来查看帮助界面。这是一个切换键,所以一旦你激活它,帮助屏幕就会一直显示在你的编辑器窗口顶部,直到用同样的组合键(JOE 中的键盘符号为 ^KH)解除。

键盘快捷键

尽管 JOE 的作者在模拟 WordStar 用户体验方面非常自豪,但我不得不承认,这对我来说是失落的。我从来没有听说过 WordStar,直到我在 JOE 的文档中读到了它,在我看来,它的键盘快捷键方案完全是任意的。有的用 Ctrl+K 作为转义序列的前缀,有的用 Esc 作为前缀,还有的完全不需要转义序列。我无法确定其中的逻辑。编辑操作和应用选项一样,都有可能需要或不需要转义序列,而且字母关联对我来说是没有什么意义(例如,Ctrl+K D 代表另存为)。

幸运的是,JOE 可以让你在键盘快捷键上作弊。安装后,JOE 会悄悄为 joe 可执行文件创建一些符号链接。包括:

  • jmacs JOE 使用 Emacs 键绑定
  • jpico JOE 使用 Pico (或 GNU nano) 键绑定
  • rjoe JOE 的编辑只限于启动时传递给 JOE 的文件
  • jstar JOE 使用 WordStar 键绑定

 title=

持久保留的帮助菜单仍然存在,所以如果你不清楚有哪些功能可以使用,可以通过屏幕右上方的帮助提示来参考。当然,在 Pico/nano 模式下,主要命令总是可见的。

尝试 JOE

JOE 并不是一个你永远不会离开的文本编辑器,它不会成为你的 IDE、电子邮件客户端、网络浏览器和文件管理器。事实上,它甚至可能不是你所有任务的主要文本编辑器。它专注于做好一件事,那就是成为一般的文本编辑。

JOE 拥有你所需要的所有基本功能,比如能够快速浏览你的文本、能够选择文本、复制和粘贴等等。试试 JOE 吧,使用你喜欢的符号链接。


via: https://opensource.com/article/20/12/joe

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

这个不起眼的终端功能在紧要关头提供一个文本编辑器。

在 Linux 和 Unix 的 shell 中有一个不为人知的功能,它能让你用 cat 命令打开一个 do-while 循环。它被称为 heredoc,无论你使用什么 shell,它都能让你或多或少地拥有一个文本编辑器。它的语法是:

$ cat << EOF >> example.txt

中间的字符串(EOF),本质上是一个停止循环的条件。也就是说,如果你在一行中单独输入它,循环就会结束。在循环过程中,无论你在终端中输入什么,都会被管道传送到目标文件中(在本例中)。

安装

只要你有一个终端,你就能够启动 heredoc。我在 Bashtsh 和 Korn shell 中使用过这个语法技巧。

使用 heredoc

要打开一个 heredoc “会话”,你可以使用带重定向的 cat 命令。首先用终止字符串(常见约定是 EOF,代表 “End Of File”,但它实际上可以是任何字符串)指向 cat 命令。在终止字符串之后,将输出重定向到一个目标文件。然后,你就可以直接在终端中输入了,可以使用最常见的 shell 键盘快捷键来处理你的工作。当你在一行上输入你指定的终止字符串时,你的会话就结束了。你可以通过唯一的提示符(通常是 >)知道你是在一个 heredoc 循环中。

$ cat << EOF >> example.txt
> Everything you type here will be placed into example.txt when I type EOF on a line by itself. Until then, you can type...
>
> whatever...
>
> you want to type.
>
> EOF
$  

在终端等待 EOF 时,你输入的所有内容都会被放入目标文件中,提示符被忽略,EOF 本身也不是文件的一部分。

Everything you type here will be placed into example.txt when I type EOF on a line by itself. Until then, you can type...

whatever...

you want to type.

在现实中,你可能不会用 heredoc 语法来代替一个正常的文本编辑器。它是一个很好的快速处理方式,可以输入多行,但超过 10 行左右就开始限制它的作用了。例如,如果不触发你 shell 的 history 功能,你就不能编辑以前的行。根据你的 shell 和配置,你可能需要先按向上键,然后按向下键来找回你的文本,然后用 Ctrl+B 来后退。

你的 shell 的大部分功能都能正常工作,但可能没有撤销功能,也没有什么错误恢复功能。

此外,即使是最简安装的系统,可能也至少安装了 Vied

然而 heredoc 还是很有用的!它比 echo 更灵活,当你在编写 shell 脚本时,它是不可缺少的。例如,想象一下你正在编写一个安装脚本,以便你可以自动安装一组自定义应用。其中一个应用没有生成 .dekstop 文件,所以它不会出现在你的应用菜单中。为了解决这个问题,你决定在安装时生成一个 .desktop 文件。

与其编写一个 .desktop 文件,然后作为安装脚本的外部依赖,不如在安装脚本中使用 heredoc:

#!/bin/sh

VERSION=${VERSION:-x.y.z}
PKGNAM=${VERSION:-example}
PKG="${PKGNAM}"-"${VERSION}"-`arch`.tgz

# download package
wget "${PKG}"
tar txvf "${PKG}"

# use here doc to create missing .desktop file
cat << EOF >> $HOME/.local/share/applications/example.desktop
[Desktop Entry]
Version=1.0
Type=Application
Name="${PKGNAM}"
Comment="${PKGNAM}"
Exec="${PKGNAM}" %F
EOF

# insert the rest of an install script...

你自动地将文本输入到了一个文件中,而不需要文本编辑器(当然,除了你用来写脚本的那个)。下面是生成的 .desktop 文件的样子:

[Desktop Entry]
Version=1.0
Type=Application
Name=example
Comment=example
Exec=example %F

正如你所看到的,你可以在 heredoc 中使用变量,而且它们得到了正确的解析。EOF 字符串并没有出现在文件中,它只是标志着 heredoc 的结束。

比 echo 更好

heredoc 技术通常被认为比 echoprintf 更容易,因为一旦你“进入”了文档,你就可以自由地做任何你想做的事情。从这个意义上说,它是自由的,但与合适的文本编辑器相比,它是有限的。

使用 heredoc 来做快速笔记和 shell 脚本,再也不用为如何动态生成配置文件而烦恼了。


via: https://opensource.com/article/20/12/heredoc

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出