如何在 VisualStudio 代码中的所有文件中创建类似 Unix 的所有行结尾(EOL) ?

我使用 Windows10主页并且通常使用 Visual Studio Code (VS Code)来编辑 Linux Bash 脚本以及 PHP 和 JavaScript。

我不会为 Windows 开发任何专门的东西,我也不介意我所编辑的所有文件的默认 EOL 都是 Unix (nix)。

我如何确保所有的 EOL,在所有的文件(从任何文件扩展名) ,都是 nix,在 VisualStudio 代码?


在我用 Visual Studio Code 在 Windows 中编写了一些 Bash 脚本,并将它们作为项目的一部分上传到 GitHub 之后,我问了这个问题。一位审查过这个项目的高级程序员告诉我,我在那里有 Windows EOL,还有一个 < a href = “ https://en.wikipedia.org/wiki/Byte _ order _ mark”rel = “ norefrer”> BOM 问题,如果我把那里的 EOL 改成 nix (至少我是这么理解的) ,我就可以解决这个问题。


因为我所有的开发都是面向 Linux 的,所以我希望在默认情况下,我编辑的 any文件具有 nix EOL,即使它是 Windows 唯一的。

118958 次浏览

在项目首选项中,添加/编辑以下配置选项:

"files.eol": "\n"

这是在提交 639a3cb时添加的,因此在提交之后显然需要使用一个版本。

注意: 即使文件中只有一个 CRLF,上述设置也将被忽略,整个文件将被转换为 CRLF。首先需要将所有 CRLF转换为 LF,然后才能在 VisualStudio 代码中打开它。

See also: https://github.com/Microsoft/vscode/issues/2957

接受的答案解释了如何对所有文件执行此操作(在设置中使用 files.eol) ,但是如果您需要覆盖该设置,在右下角有一个指示器,您可以单击并更改这个文件。我花了点时间才注意到这个是可点击的。

See CRLF in the message bar at the bottom right

现有的两个答案都有帮助,但不是我需要的。我想批量转换所有换行字符在我的工作空间从 CRLF 到 LF。

我做了个简单的延期

Https://marketplace.visualstudio.com/items?itemname=vs-publisher-1448185.keyoti-changeallendoflinesequence

实际上,下面是供参考的扩展代码

'use strict';


import * as vscode from 'vscode';
import { posix } from 'path';




export function activate(context: vscode.ExtensionContext) {


// Runs 'Change All End Of Line Sequence' on all files of specified type.
vscode.commands.registerCommand('keyoti/changealleol', async function () {


async function convertLineEndingsInFilesInFolder(folder: vscode.Uri, fileTypeArray: Array<string>, newEnding: string): Promise<{ count: number }> {
let count = 0;
for (const [name, type] of await vscode.workspace.fs.readDirectory(folder)) {


if (type === vscode.FileType.File && fileTypeArray.filter( (el)=>{return name.endsWith(el);} ).length>0){
const filePath = posix.join(folder.path, name);


var doc = await vscode.workspace.openTextDocument(filePath);


await vscode.window.showTextDocument(doc);
if(vscode.window.activeTextEditor!==null){
await vscode.window.activeTextEditor!.edit(builder => {
if(newEnding==="LF"){
builder.setEndOfLine(vscode.EndOfLine.LF);
} else {
builder.setEndOfLine(vscode.EndOfLine.CRLF);
}
count ++;
});


} else {
vscode.window.showInformationMessage(doc.uri.toString());
}
}


if (type === vscode.FileType.Directory && !name.startsWith(".")){
count += (await convertLineEndingsInFilesInFolder(vscode.Uri.file(posix.join(folder.path, name)), fileTypeArray, newEnding)).count;
}
}
return { count };
}


let options: vscode.InputBoxOptions = {prompt: "File types to convert", placeHolder: ".cs, .txt", ignoreFocusOut: true};
let fileTypes = await vscode.window.showInputBox(options);
fileTypes = fileTypes!.replace(' ', '');
let fileTypeArray: Array<string> = [];


let newEnding = await vscode.window.showQuickPick(["LF", "CRLF"]);


if(fileTypes!==null && newEnding!=null){
fileTypeArray = fileTypes!.split(',');


if(vscode.workspace.workspaceFolders!==null && vscode.workspace.workspaceFolders!.length>0){
const folderUri = vscode.workspace.workspaceFolders![0].uri;
const info = await convertLineEndingsInFilesInFolder(folderUri, fileTypeArray, newEnding);
vscode.window.showInformationMessage(info.count+" files converted");


}
}


});


}

转换现有文件的行结尾

We can use dos2unix in WSL or in your Shell terminal.

安装工具:

sudo apt install dos2unix

转换工作目录中的行结尾:

find -type f -print0 | xargs -0 dos2unix

如果有一些文件夹需要从转换中排除,请使用:

find -type f \
-not -path "./<dir_to_exclude>/*" \
-not -path "./<other_dir_to_exclude>/*" \
-print0 | xargs -0 dos2unix

For other people asking you can use the “ Files.eol”设置是 Visual Studio Code,用于更改每个文件的行结尾。

"Files.eol": "\n"   // Unix
"Files.eol": "\r\n" // Windows

您可以在 VisualStudio 代码设置中找到该选项。 在“文本编辑器”→“文件”→“ Eol”下面。 在这里您可以选择是否要 n 或 r n 或自动。

Enter image description here

我花了好几天寻找一个简单的解决方案,直到 我发现一些 Git 命令 发生了变化 从 CRLFLF的所有文件。

作为 被马茨指出,请确保在执行之前提交更改 the following commands.

在根文件夹中键入以下内容。

git config core.autocrlf false


git rm --cached -r .         # Don’t forget the dot at the end


git reset --hard

我刚刚在我的 Windows 机器上遇到了同样的问题。每次我打开一个文件,它都会将 EOL 设置为 CRLF(尽管我按照人们的建议显式地为 lf设置了配置)。看起来,问题是我用 错误的 Git 配置克隆了我的存储库。默认是 CRLF。不管怎样,我这么做了,效果很好。我的工作区里再也没有 CRLF了。

  1. 使用命令 git config --global core.autocrlf false将 Git 配置设置为 lf
  2. 现在再次克隆您的项目: git clone ...
  3. Set up your Visual Studio Code instance, menu File偏好设定文件: Eol to "\n".
  4. 打开项目,一切都应该如预期的那样

卸载打印脚本

run

npm install -g typescript
git config --global core.autocrlf false

检查完毕

git config --global core.autocrlf

如果显示为 false,则尝试克隆并重新运行该项目