mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-12-21 07:03:41 +08:00
35b689335a
We ignore typed control characters33a7172ee
(Revert to not inserting control characters from keyboard input, 2024-03-02). We used to do the same for bracketed paste but that changed in8bf8b10f6
(Extended & human-friendly keys, 2024-03-30) which made bracketed paste behave like fish_clipboard_paste; it inserts the exact input (minus leading whitespace etc). At that time it wasn't clear to me which behavior was the right one (because of the inconsistency between terminal and bracketed paste). As reported in https://matrix.to/#/!YLTeaulxSDauOOxBoR:matrix.org/$PEEOAoyJY-644amIio0CWmq1TkpEDdSy2QnfJdK-dco trailing tabs in pasted text can be confusing. There seems to be not real need to insert raw control characters into the command line, so let's strip them when pasting. Now the only way to insert a raw control character into the command line is to recall it from command history. Not sure what the behavior should be for that case, we can revisit that later. If we get rid of raw control characters entirely, then we can also delete the new "control pictures" rendering :)
49 lines
1.8 KiB
Fish
49 lines
1.8 KiB
Fish
function __fish_paste
|
|
# Also split on \r, otherwise it looks confusing
|
|
set -l data (string split \r -- $argv[1] | string split \n)
|
|
set data (string replace -ra [[:cntrl:]] '' -- $data)
|
|
|
|
if commandline --search-field >/dev/null
|
|
commandline --search-field -i -- $data
|
|
return
|
|
end
|
|
|
|
# If the current token has an unmatched single-quote,
|
|
# escape all single-quotes (and backslashes) in the paste,
|
|
# in order to turn it into a single literal token.
|
|
#
|
|
# This eases pasting non-code (e.g. markdown or git commitishes).
|
|
set -l quote_state (__fish_tokenizer_state -- (commandline -ct | string collect))
|
|
if contains -- $quote_state single single-escaped
|
|
if status test-feature regex-easyesc
|
|
set data (string replace -ra "(['\\\])" '\\\\$1' -- $data)
|
|
else
|
|
set data (string replace -ra "(['\\\])" '\\\\\\\$1' -- $data)
|
|
end
|
|
else if not contains -- $quote_state double double-escaped
|
|
and set -q data[2]
|
|
# Leading whitespace in subsequent lines is unneded, since fish
|
|
# already indents. Also gets rid of tabs (issue #5274).
|
|
set -l tmp
|
|
for line in $data
|
|
switch $quote_state
|
|
case normal
|
|
set -a tmp (string trim -l -- $line)
|
|
case single single-escaped double double-escaped escaped
|
|
set -a tmp $line
|
|
end
|
|
set quote_state (__fish_tokenizer_state -i $quote_state -- $line)
|
|
end
|
|
set data $data[1] $tmp[2..]
|
|
end
|
|
if not string length -q -- (commandline -c)
|
|
# If we're at the beginning of the first line, trim whitespace from the start,
|
|
# so we don't trigger ignoring history.
|
|
set data[1] (string trim -l -- $data[1])
|
|
end
|
|
|
|
if test -n "$data"
|
|
commandline -i -- $data
|
|
end
|
|
end
|