mirror of
https://github.com/fish-shell/fish-shell.git
synced 2026-06-21 23:11:17 -03:00
Restore sanity to line continuations
Line continuations (i.e. escaped new lines) now make sense again. With
the smart pipe support (pipes continue on to next line) recently added,
this hack to have continuations ignore comments makes no sense.
This is valid code:
```fish
echo hello |
# comment here
tr -d 'l'
```
this isn't:
```fish
echo hello | \
# comment here
tr -d 'l'
```
Reverts @snnw's 318daaffb2
Closes #2928. Closes #2929.
This commit is contained in:
@@ -416,11 +416,12 @@ maybe_t<tok_t> tokenizer_t::tok_next() {
|
||||
return none();
|
||||
}
|
||||
|
||||
bool line_continued = false;
|
||||
// Consume non-newline whitespace. If we get an escaped newline, mark it and continue past it.
|
||||
for (;;) {
|
||||
if (this->buff[0] == L'\\' && this->buff[1] == L'\n') {
|
||||
line_continued = true;
|
||||
this->buff += 2;
|
||||
this->continue_line_after_comment = true;
|
||||
} else if (iswspace_not_nl(this->buff[0])) {
|
||||
this->buff++;
|
||||
} else {
|
||||
@@ -428,15 +429,12 @@ maybe_t<tok_t> tokenizer_t::tok_next() {
|
||||
}
|
||||
}
|
||||
|
||||
while (*this->buff == L'#') {
|
||||
if (*this->buff == L'#') {
|
||||
// We have a comment, walk over the comment.
|
||||
const wchar_t *comment_start = this->buff;
|
||||
while (this->buff[0] != L'\n' && this->buff[0] != L'\0') this->buff++;
|
||||
size_t comment_len = this->buff - comment_start;
|
||||
|
||||
// If we are going to continue after the comment, skip any trailing newline.
|
||||
if (this->buff[0] == L'\n' && this->continue_line_after_comment) this->buff++;
|
||||
|
||||
// Maybe return the comment.
|
||||
if (this->show_comments) {
|
||||
tok_t result;
|
||||
@@ -445,11 +443,12 @@ maybe_t<tok_t> tokenizer_t::tok_next() {
|
||||
result.length = comment_len;
|
||||
return result;
|
||||
}
|
||||
if (line_continued) {
|
||||
return none();
|
||||
}
|
||||
while (iswspace_not_nl(this->buff[0])) this->buff++;
|
||||
}
|
||||
|
||||
// We made it past the comments and ate any trailing newlines we wanted to ignore.
|
||||
this->continue_line_after_comment = false;
|
||||
size_t start_pos = this->buff - this->start;
|
||||
|
||||
tok_t result;
|
||||
@@ -468,8 +467,7 @@ maybe_t<tok_t> tokenizer_t::tok_next() {
|
||||
// Hack: when we get a newline, swallow as many as we can. This compresses multiple
|
||||
// subsequent newlines into a single one.
|
||||
if (!this->show_blank_lines) {
|
||||
while (*this->buff == L'\n' || *this->buff == 13 /* CR */ || *this->buff == ' ' ||
|
||||
*this->buff == '\t') {
|
||||
while (is_whitespace(*this->buff)) {
|
||||
this->buff++;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user