JavaScript:从网络上复制时修剪所有领先的空格以及所有CR

时间:2018-02-24 19:20:23

标签: javascript regex linux bash clipboard

在使用SSH客户端Putty通过SSH连接到远程Ubuntu终端后,我在使用Windows 10和Linux(Ubuntu)进行跨平台工作时遇到了问题。

我基本上想要做的事情:

在我的个人GitHub帐户中,我存储并编辑了一些代码文件(而不是在我的PC上存储和编辑它们)。其中一些文件是Bourne shell文件(.sh文件)。

我希望从我个人GitHub帐户中的文件中复制一些Bash代码,然后将其粘贴到Bash终端中,以便直接执行:

  
      
  1. 从GitHub中的一个文件(非原始版本)复制代码。

  2.   
  3. 将该代码粘贴到终端。

  4.   
  5. 在终端点击 Enter 执行该代码。

  6.   

相关的Bash代码是以下代码(最初取自here),其中包含Bash脚本声明,2个变量导出以及带有cat here-document的Bash函数,缩进带有前导标签缩进,以及函数的调用:

#!/bin/bash
export user="benqzq"
export repo="ulcwe"

preparations() {
    cat <<-EOF >> "$HOME"/.bashrc
        export s_a="/etc/nginx/sites-available"
        export s_e="/etc/nginx/sites-enabled"
        export drt="/var/www/html"
        source "$HOME"/"$repo"/software_internal.sh
    EOF
    source "$HOME"/.bashrc 2>/dev/null
}
preparations

当前状态和问题

使用Windows字符复制代码,例如Windows中常见的回车符(CR)行分隔符,或者可能破坏执行的前导空格(取决于我复制的特定代码,以及此处的情况) -document肯定是因为前导制表符缩进变成了单个点或非制表符空格等,而且当使用here-documents时这是禁止的。)

期望状态

我希望从GitHub复制到Windows 10剪贴板的代码将被复制,不带前导空格和CR。

我尝试过的事情:

  1. 我找不到postprocessing solution in the Linux side(这实际上是在实用程序中管理所有过滤掉Windows字符的Bash代码(例如dos2unixsed "s/^[ \t]//g")。

  2. 我确实找到了AHk TrimClipboard()函数trimmed undesired characters in between copying and sending content to Windows clipboard的解决方案。

  3. 一种可能的JavaScript方法

    鉴于我在Linux(Bash)方面对代码进行后处理失败,并且考虑到我不想依赖于AHk,我希望以纯JavaScript的方式将GitHub内容复制到Windows剪贴板中,当它是免费的时所有领先的空格和Windows字符(特别是CR)。

    有没有办法在vanilla JavaScript中进行这种“过滤复制”?我想到了一个Greasemoneky脚本,它将包含一个脚本来执行此操作,旨在仅在github.com内部工作。

    备注

    1. 我根本不使用Git,只使用GitHub。
    2. 我缩进标签而不是常规空格,因为这是heredocuments所需要的,而且对我来说也更舒服。
    3. Windows剪贴板中的最终结果应该是相同的代码,但没有任何前导空格/空格/制表符,也没有CR。一个原始的,无CR版本的代码/纯代码。
    4. 我遇到的问题不是GitHub独有的,它可能影响其他浏览器程序,因此我寻求一种通用的,激进的JavaScript方法。事实上,在这种情况下,我只会将GitHub与Greasemonkey匹配,但如果我也从那里复制文本,我总能匹配另一个网站,并遇到这个问题。

1 个答案:

答案 0 :(得分:1)

如果您能够运行Greasemonkey脚本,那么您可以尝试下面的代码片段。这在github上的用户benqzq上执行,您可以更改它以扩展其工作域。我之前从未制作过Greasemonkey脚本,我不是JS大师,因此在任何严重的运行之前可能需要进行一些测试。导入此脚本后,您必须选择所需的代码区域,然后将修改后的版本复制到系统剪贴板中:

// ==UserScript==
// @name     CRLFRemover
// @version  1
// @match https://github.com/benqzq/*
// ==/UserScript==

// @https://stackoverflow.com/a/5379408/1020526
function getSelectionText() {
    var text = "";
    if (window.getSelection) {
        text = window.getSelection().toString();
    } else if (document.selection && document.selection.type != "Control") {
        text = document.selection.createRange().text;
    }
    return text;
}

document.onmouseup = function() {
    var text = getSelectionText();
    // It should be of type `textarea` otherwise format will mess up
    var input = document.createElement('textarea');
    document.body.appendChild(input)
    // Here we remove CRs
    input.value = text.replace(/\r/g, '');
    input.select();
    document.execCommand('Copy', false);
    input.remove();
}