Fish-shell: поддержка расширения истории (например, bash's !!, bang bang и! $, bang dollar, токены)

Созданный на 20 авг. 2012  ·  98Комментарии  ·  Источник: fish-shell/fish-shell

Похоже, что двойной удар не работает и каким-то образом интерпретируется как программа, которую sudo безуспешно пытается найти. Это происходит в Ubuntu 12.04 LTS с рыбьей оболочкой, скомпилированной из исходников.

Шаги к воспроизведению:

  1. Выполните любую команду:

    $ ls

  2. Выполните предыдущую команду как root:

    $ sudo !!
    sudo: !!: команда не найдена

    Ожидаемое поведение:

Команда sudo !! выполняет ранее выполненную команду ( ls ) от имени пользователя root.

Я также проверил, что проблема не вызвана sudo , выполнив шаги воспроизведения в bash, которые работали должным образом.

Также обратите внимание, что в более ранней версии fish-shell в Mac OS X 10.7 этой проблемы не было, и sudo !! работал должным образом.

duplicate

Самый полезный комментарий

function sudo
    if test "$argv" = !!
        eval command sudo $history[1]
    else
        command sudo $argv
    end
end

sudo !! для людей, которые по какой-то причине все еще используют !! .

Все 98 Комментарий

Это обсуждается в часто задаваемых вопросах документации: http://fishshell.com/docs/current/faq.html#faq -history

Спасибо за разъяснения.

Я понимаю причину удаления персонажей истории. Однако, хотя я понимаю обоснование этого и то, что можно использовать Ce и Ca вместо End и Home, для многих пользователей, особенно тех, которые привыкли !! а тем, у кого на ноутбуке нет клавиш Home и End, по-прежнему намного проще набрать sudo !! чем Up + C-a + sudo.

Вы все еще рассматривали бы возможность восстановления функциональности токенов подстановки истории?

Так как это редкий случай, когда !! удобнее использовать, попробуйте следующую функцию:

function sudo!!
    eval sudo $history[1]
end

который вызывается просто "sudo !!".

Или другой вариант, который я использую:

function .runsudo --description 'Run current command line as root'
    commandline -C 0
    commandline -i 'sudo '
    commandline -f execute
end
bind \es .runsudo

Затем, нажав MS, я запускаю текущую командную строку с sudo перед ней.
Или, изменив этот пример, вы можете создать функцию, которая поместит предыдущую командную строку в текущую и привяжет ее, например, к '\ e!'. Этот подход лучше, чем простое использование "!!" потому что это дает вам возможность увидеть и обновить командную строку перед выполнением.

Я немного изменил последнюю команду:

  function .runsudo --description 'Run current command line as root'
    set cursor_pos (echo (commandline -C) + 5 | bc)
    commandline -C 0
    commandline -i 'sudo '
    commandline -C "$cursor_pos"
  end
  bind \es ".runsudo"

Он сохраняет позицию курсора вместо того, чтобы сразу выполнять его.

! $ тоже неплохо было бы иметь

function sudo
    if test "$argv" = !!
        eval command sudo $history[1]
    else
        command sudo $argv
    end
end

sudo !! для людей, которые по какой-то причине все еще используют !! .

Спасибо. Есть очень большая часть людей, которые используют sudo !! учтите, что этот синтаксис поддерживается многими другими оболочками, включая bash и zsh. sudo !! легче вводить, чем использовать клавиши Home и End, поскольку эти клавиши находятся дальше.

Я бы посоветовал включить указанную выше функцию в fish-shell по умолчанию.

!! - хороший кандидат на сокращение (# 731)

Выражая поддержку !! и связанные ярлыки. Не помешает добавить это, и кажется, что рыба просто навязывает своим пользователям личную философию.

Мое текущее представление об идеальном решении таково !! должно быть сокращением (# 731), и мы реализуем сигнатуры функций (# 478) для поддержки подкоманд (команда, которая принимает команду, например sudo). Затем аббревиатуры расширяются в позициях подкоманд, так что «sudo !!» будет расширяться.

Добавляю себя

Несмотря на то, что он старый, это функция, которая действительно должна быть в Fish по умолчанию. Нет причин не использовать его - если вы не хотите использовать его лично, это нормально, но наличие дополнительной команды никому не повредит - людям нравится делать что-то по-разному.

Путь !! реализовано в большинстве оболочек, действительно вредит людям. Например, рассмотрим эту команду:

echo fish is great!!

в bash / zsh / tcsh это сделает что-то неожиданное и ужасное, потому что !! это магический синтаксис. Это из тех странных взаимодействий, которых рыба очень старается избежать.

Мое предложение было реализовать !! не как магический синтаксис, а как псевдоним. Это означает, что он будет делать только что-то особенное в «позиции команды» - он не будет расширяться в аргументах. Это также снижает набор функций рыбы, что желательно.

Чтобы сделать это полезным, нам нужно научить fish подкомандам, причем sudo является наиболее распространенным примером, но также time , strace и т. Д. Fish затем будет расширять псевдонимы. в "позиции подкоманды", что само по себе крутая и полезная функция.

Предлагаемое вами решение разваливается, когда вы рассматриваете sudo echo fish is great!! . Один и тот же аргумент можно привести в отношении любого синтаксиса: не сбивает ли еще echo I really like fish (the shell)! ? Я также беспокоюсь, что список «подкоманд» будет невозможно поддерживать, и это снизит гибкость.

С псевдонимами раскрываются только команды, и fish будет знать, какие аргументы являются (под) командами, а какие нет. Таким образом, sudo echo fish is great!! не будет выполнять раскрытие последней команды, а вместо этого передаст буквальное значение "отлично !!" в sudo (и тем самым на эхо). Я утверждаю, что это то, чего ожидал пользователь. См. Обсуждение аббревиатур (# 731) и сигнатур функций (# 478) для разработки и обоснования.

SirCmpwn прав в том, что требование исчерпывающих сигнатур функций является недостатком подхода псевдонимов, а также сбивает с толку другие синтаксические элементы. Примеры из реальной жизни включают раздражение при расширении фигурных скобок с помощью git (# 434) или подстановочных знаков (среди прочего, # 967). Синтаксис имеет высокую стоимость, и мы стараемся исключить синтаксис, когда он избыточен с другими функциями (например, # 354).

В любом случае, это мой аргумент в пользу поддержки !! как элементарный синтаксический элемент не годится. Однако я готов представить его способами, не требующими изменения синтаксиса рыбы.

Я думаю, что сравнение с {} плохое. У рыб подтяжки работают иначе, чем другие снаряды. Люди спотыкаются о нем только тогда, когда ожидают, что он будет работать, как bash и друзья. !! синтаксис должен работать так же, как и в других распространенных оболочках. Также, !! не то, что я ожидал бы видеть в командах достаточно часто, чтобы вызвать проблемы. На самом деле, я ожидаю, сколько раз люди пытались и не могли использовать !! с рыбой намного превосходит количество раз, когда кто-то использовал буквальный !! в команде.

Я утверждаю, что ! сбивает с толку в других оболочках, и было бы лучше, если бы это не было реализовано таким образом. Например, на http://codegolf.stackexchange.com/a/17776/3103 я поставил простое «Привет, мир!» программа, написанная в оболочке UNIX, которая дает сбой из-за ! (в вопросе о Ridiculous Runtime Errors). Он даже получил семь голосов, поэтому я могу представить, что эта функция может удивить, когда вы не хотите ее использовать.

Однако !! само по себе должно быть нормально, потому что как часто пользователь будет записывать !! в качестве токена? С другой стороны, добавление !! будет стимулировать добавление других шаблонов подстановки истории, некоторые из которых могут раздражать.

Добавляю себя - только что наткнулся на этот мой первый уик-энд с рыбой. Определенно следует поддержать.

Добавляю себя - это нужно.

Для тех, кто этого хочет, функция и привязки, упомянутые ранее в обсуждении, дали мне более простой рабочий процесс для добавления sudo или выполнения последней команды sudo по сравнению с типичным sudo !! one.

Вы должны дать им шанс. Это заставило меня пересмотреть мои конфигурации readline и zsh, чтобы иметь аналогичные привязки.

Он превращает семь нажатий клавиш (два из которых сдвинуты) в одну привязку.

Независимо от того, что тебе нравится - действительно ли для этого есть какая-то причина !! не поддерживаться? У всех разные вещи, которые работают для них, и хотя некоторым людям нравится использовать стрелку вверх, многим нравится использовать !!, и, честно говоря, почему это может быть плохо? Тем, кто этого не хочет, не нужно его использовать.

Неужто не так уж сложно реализовать? ...

Да, я знаю, что вы можете взломать его вместе со сценарием Fish, но он _не_ работает так же, как в bash или подобных оболочках, что в большинстве случаев было довольно удобно.

См. Мой комментарий выше, чтобы понять, почему я не хочу представлять это так, как это делают bash и zsh (как новый синтаксический элемент), и мое предложение о том, как это можно сделать, что соответствует философии рыбы.

Аргумент "эхо-рыба великолепна !!" быть лучше, чем использовать "!!" по истории немного слабоват, но суть я понимаю. Похоже на простой «set shell_history advanced» или что-то еще может позволить это для людей, готовых рискнуть «эхо-рыба великолепна !!» получение сообщения об ошибке.

Тем не менее, мой вариант использования "!!" похожа, но ее можно было бы избежать, возможно, добавив некоторые улучшения.

Например, на моем Mac с bash:
$ brew update
$ brew устарело
$ brew fetch !!

Поэтому я несколько регулярно использую вывод предыдущей команды для новой команды.
С рыбой я могу сделать следующее:
$ brew fetch (напиток устарел)
Возможно, в какой-то момент это будет предложение, которое я смогу использовать, но что мне действительно нужно, так это иметь возможность искать в истории в блоке ().
например:
$ brew fetch (bre)

К сожалению, хотя fish довольно гордится тем, что использует () для подкоманд вместо «сбивающих с толку» обратных кавычек и тому подобного, на самом деле он не обрабатывает их как таковые, пока вы не нажмете Enter. По крайней мере, это то, что я вижу.

Если бы Fish разрешил поиск в истории после первого '(' (также известного как подкоманда), я думаю, было бы легче справиться без манипуляций с! Историей.

Если я понимаю предложение, то когда вы нажимаете стрелку вверх, он должен выполнять замену истории только внутри самой внутренней подкоманды, а не всей командной строки.

: -1:

Я по-прежнему поддерживаю простую реализацию !! стиле bash.

Я бы предпочел: up_arrow :, Ctrl + p и поиск в истории команд работать в позициях подкоманд, а не вводить !!

Вся история API других оболочек настолько запутана, что люди обычно только помнят !! от него.

Правильный. Это было бы удобно и довольно легко заменить "!!" Или! Используйте ключевое слово.

Очень нравится идея о том, что !! является сокращением.

Похоже, что сокращения в самых последних ночных сборках допускают только сокращения в позиции команды, надеюсь, она будет обновлена, чтобы ее можно было использовать в качестве аргументов для случаев, подобных этому.

Эта функция переоценена, просто используйте sudo cmd или eval sudo $cmd .

@bucaran Я не совсем !! предназначен для скорости, как мне сопоставить скорость !! с cmd ?

Вы имеете в виду сделать переменную с именем $cmd последней командой? Это не собственная переменная.

Спасибо

@mdsib Да, думаю, я помню, что в другом выпуске была дискуссия о запрете сокращений в позиции аргумента. В то время этого предпочитали не реализовывать. Это определенно изменит ситуацию.

Я думаю, что вывод из этой темы заключается в том, что в ближайшее время этого не произойдет, и я должен отказаться от подписки на эту проблему Github и переключиться на zsh. Прощай!

Не потому, что !! здесь нет, а потому, что проблема Github для довольно простой функции была открыта в течение 3 лет, но не была реализована из-за философского BS.

Забавно видеть, как люди пытаются убедить других, что функция не имеет большого значения. Конечно, вы этого не хотите, поэтому вам все равно ... Это похоже на то, что вы пытаетесь убедить людей не любить зеленый цвет, потому что думаете, что синий лучше.
Тем не менее, поскольку кажется, что «простая» функция не работает, возможно, кому-то стоит просто вилки рыбы, если им нравятся существующие функции, но он хотел бы добавить еще несколько. Похоже, что это могло бы быть быстрее.

Я сделал ~ / bin / !! это выглядит так:

#!/bin/fish
eval $history[1]

На короткое время это помогает мне обойти отсутствующую функцию и мою склонность печатать !!.
Я также сделал ~ / bin /! Vi:

#!/bin/fish
for f in $history
    echo $f | grep '^vi'
    if test "$status" = "0"
        eval $f
        exit $status
    end
end

Не идеально, но достаточно, чтобы моя оболочка теперь чаще делала то, что я ожидал.

@SirCmpwn Мне не очевидно, что !! - это простая функция. Например, bash поддерживает это:

ls some_long_file.txt
!!:s/ls -l/cat/

Следует это использовать !! поддерживаться или нет? Пользователи, которые говорят "рыба должна поддерживать !!" могут иметь разные представления о том, что это значит.

Вы серьезно относитесь к этому, поэтому я призываю вас (или кого-либо) написать предложение о том, как !! будет работать с рыбой (семантика, а не реализация). Какой именно синтаксис будет поддерживаться? Как это расширение соотносится с другими типами расширения, такими как расширение переменных или процессов? Как могло бы происходить разделение аргументов в развернутой строке? Могли бы вы использовать побеги, чтобы предотвратить это?

Это искренняя просьба. Функция не определяется одним вариантом использования; нам нужно конкретное предложение для обсуждения.

Если вы скажете: «Я хочу, чтобы это дело сработало, и мне все равно как», тогда это нормально и справедливо. Но кто-то должен проработать детали, прежде чем что-либо будет реализовано.

В ближайшем будущем есть один конкретный план: внедрить глобальные псевдонимы, а затем создать !! в один. Альтернативой является объединение работы docopt, предоставление сигнатуры функции для sudo, а затем make !! в обычный псевдоним. В каком направлении мы пойдем, зависит от того, думаем ли мы! должен расширяться повсюду или только на командном посту.

@ridiculousfish Вы совершенно правы, что это '!!' запрос функции должен быть достаточно подробным. Я никогда не использовал конкретный пример, который вы привели, потому что всегда делаю что-то вроде этого:
$ ls -l some_long_file.txt
$ ^ ls-l ^ кошка

Очевидно, это тоже не работает. Для меня это будет отдельный запрос функции, который меня не беспокоил, так как я только недавно начал тестировать рыбу.

«fish: обнаружено перенаправление при ожидании имени команды. Fish не разрешает операцию перенаправления перед командой».

Похоже, можно было бы легко рассматривать '^' в позиции команды как замену, поскольку это не противоречит существующим функциям. Но это отдельная тема, просто упомяну об этом, поскольку вы правы в том, что должно быть четкое определение того, что «!!» (или просто подмена истории вообще) значит.

Вот несколько примеров, которые я использую:

$ !!
$ some command `!!`
$ !keyword 
$ !123

Спасибо @gillham ,

Я также отмечаю, что у @nyarly есть умный обходной путь для !! и !$ здесь: https://github.com/fish-shell/fish-shell/wiki/Bash-Refugees

Лучшее исправление №5:
Fish настолько управляется историей, что, если вы забыли sudo или иным образом испортили свою историю нерабочей командой, на самом деле может стоить вашего времени (в долгосрочной перспективе), чтобы вручную стереть ее из истории. Да, откройте новый терминал, выполните команду bash и отредактируйте ~ / .config / fish / fish_history. Фиш снова и снова приводил меня к неправильной команде, когда я экономил на этом.

Что касается привычки @nyarly mkdir …; cd !$ , я делаю mkcd … :

function mkcd --description 'mkdir and cd'
        mkdir $argv[1]
        and cd $argv[1]
end

Обратите внимание, что удаление из истории не требует махинаций с bash:

history --delete --prefix some_command

fish_config history также позволяет делать это с помощью point-n-click.

Эту функциональность можно довольно хорошо воспроизвести в Fish, используя https://github.com/fish-shell/fish-shell/wiki/Bash-Style-History-Substitution- (!! - и -! $) - возможно, проблема должен быть закрыт?

: -1:: -1: Если не реализован режим полной совместимости с bash.

Я считаю, что это скользкая дорожка. Если это реализовано в fish, как насчет single! S, а как насчет функций истории ksh? А что насчет $ ()? Fish - это оболочка в стиле csh. Если люди не могут / не хотят адаптироваться, есть зш ...

То, что я извлек из этого обсуждения, как подсказка для людей, которые это находят. (более 3 лет в)

  1. Команда не хочет разрабатывать эту функцию, потому что они ее не используют.
  2. Многим людям нужна эта функция, потому что они ее используют.
  3. Команда, похоже, не желает реализовывать эту функцию в том виде, в котором она существует, но готова что-то сделать.
    это работает аналогично, если мы дадим им достаточно данных.
  4. Люди либо соглашаются с отсутствием этой функции, либо реализуют обходной путь, который в основном работает, либо перемещаются
    перейдем к другому проекту.

Я один из последних, хотя я надеюсь, что это решено, я не могу разумно использовать рыбу и добавить это обходное решение с количеством машин, которые я использую, без значительных усилий (мне нужны разные настройки конфигурации на разных машинах), и я использую! ! достаточно там, где это требуется для меня. Так что я буду следить за этим обсуждением в надежде, что однажды рыба будет соответствовать моему варианту использования.

@ tetra-archos Пока никто не выдвинул конкретного предложения, поэтому у нас нет четкого представления о том, что такое «особенность». Поскольку вы, очевидно, сильно относитесь к этому, если бы вы были так склонны, было бы большим подспорьем, если бы вы предложили, каким должно быть поведение в качестве отправной точки. В противном случае было бы полезно хотя бы перечислить используемые вами формы подстановки истории.

Обратите внимание, что поведение подстановки в полной истории bash очень сложно, а также настраивается, поэтому «просто делайте то, что делает bash» - не запускать.

Никто еще не выдвинул конкретного предложения, поэтому у нас нет четкого представления о том, что такое «особенность».

@ tetra-archos: Это абсолютно необходимо. До сих пор в основном это было «Мы хотим" !! "!! и, возможно, «! $» (что означает «вставить последний аргумент последней команды»). Но есть много деталей, которые необходимо уточнить, если он (или его заменитель) будет реализован.

Например:

  • Какую часть подстановок в истории вы хотите - просто «вставить сюда последнюю команду» («!!») и «вставить сюда последний аргумент последней команды» («! $») Или все остальное, например, !!: s / string1 / string2 "(я бы предпочел добавить общий режим" replace ", такой как emacs" query-replace "или vim": s / ", чтобы вы также могли сделать это _ перед_ выполнением неправильной команды)? Как насчет «вставить пятую команду в мою историю» («! 5») - чего я так и не понял - или «вставить пятую последнюю команду» («! -5»)? Как насчет « указателей слов » и « модификаторов »?
  • Вы хотите, чтобы команда выполнялась сразу (т.е. вы вводите sudo !! , нажимаете Enter, и все сразу запускается) или было бы нормально, если бы она была вставлена ​​первой, чтобы вы могли дважды проверить - это похоже на bash с опцией "histverify" (я бы предпочел второй вариант)?
  • Это должно быть "!!" и "! $" или его можно использовать по-другому, т.е. ваша проблема с мышечной памятью? Но если это так, мы никогда не достигнем 100%, и подстановка истории - это довольно небольшая часть bash.

Если это просто мышечная память, вы также можете добавить в свой fish_user_key_bindings следующее:

bind '!!' 'commandline -i "$history[1]"'
bind '!$' 'history-token-search-backward'

(проблема, почему мы, вероятно, не должны использовать его в привязках по умолчанию, заключается в том, что он затем ждет после того, как вы ввели "!", чтобы проверить наличие второго символа)

Я считаю, что !! - плохая практика

Команда sudo !! никому не сообщает, что на самом деле будет выполнять оболочка.
если я хочу выполнить команду p revious с sudo в строке ' a nfang', я набираю

^p ^a sudo

Я предлагаю добавить сообщение, чтобы люди использовали команды редактирования строки ^ p и ^ a вместо использования функции истории.

!!: command not found, try 'Ctrl-p Ctrl-a' to prefix the previous command with 'sudo' or any other  prefix

Я тоже ненавижу !! . Более простой способ для fish_vi_mode в качестве альтернативы ^p ^a :

^v k I

То, что вам не нравится способ что-то делать, не делает его менее действенным.
10 ноября 2015 г. в 8:14 "Иван Там" [email protected] написал:

Я ненавижу !! слишком. Более простой метод для fish_vi_mode в качестве альтернативы ^ p
^ а:

^ vk я

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -155416048
.

Верно и обратное.

У обеих сторон этого вопроса есть законные потребности и опасения. Я думаю, что основная задержка - это найти _ правильный_ способ сделать это вместо быстрого и грязного пути

Я согласен и не имею ничего против других способов сделать это, они просто не
соответствовать моим (и, очевидно, другим) потребностям.
10 ноября 2015 г., 12:19, «Эрик Мрак» [email protected] написал:

Верно и обратное.

У обеих сторон этого вопроса есть законные потребности и опасения. я думаю
основная задержка - найти _правильный_ способ сделать это вместо быстрых и
грязный путь

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -155494929
.

Чтобы повторить подходы, упомянутые в предыдущем обсуждении, и немного расширить их: я обнаружил, что сочетания клавиш работают для меня лучше, чем "!!".

Я написал эту функцию, которая может быть привязана к некоторому ключу (^ S для меня, bind \cs 'prepend_command sudo' ). Если в командной строке есть содержимое, она добавляет sudo. Если содержимого нет, он добавляет sudo к последнему элементу в истории. Итак, sudo !!<Enter> теперь становится ^S<Enter> .

function prepend_command
  set -l prepend $argv[1]
  if test -z "$prepend"
    echo "prepend_command needs one argument."
    return 1
  end

  set -l cmd (commandline)
  if test -z "$cmd"
    commandline -r $history[1]
  end

  set -l old_cursor (commandline -C)
  commandline -C 0
  commandline -i "$prepend "
  commandline -C (math $old_cursor + (echo $prepend | wc -c))
end

Некоторые люди говорят, что настраивать что-то подобное слишком сложно. Возможным решением может быть включение чего-то функционально похожего на мою функцию в fish, чтобы настройка этого стала по крайней мере однострочным.

Конечно, это не отвечает другим требованиям, таким как some_command --with-subshell-param (!!) .

@Ahti Это на самом деле круто, только что он заработал, похоже, будет приятно использовать, через некоторое время

Да, пока что это лучше sudo !! . Я часто бываю на полпути к команде и понимаю, что она должна быть sudo . ^s , мгновенный префикс sudo !

Лично я никогда не использовал !! ни в каком контексте, кроме sudo !! так что меня это не беспокоит.

Так совпало, что я только что попробовал fish_vi_mode, и он мне очень понравился. Однако в режиме Vi ^s больше не связывается. Предложения?

Хорошо, у меня была привязка ключа в config.fish. Я нашел # 2254, а затем нашел https://github.com/faho/fish-shell/commit/f7e8ad632a388d5f1c5eb4cfc33f3cdb1f7fd831, а затем нашел http://stackoverflow.com/a/16675092/292408, который подтвердил, что я должен разместить свои привязки в fish_binduings функция, которой еще не было.

Это сработало, и теперь, когда я нахожусь в командном режиме Vi [N] префикс работает, как ожидалось.

У нас уже есть Alt-P для запуска текущего конвейера в пейджере; Интересно, стоит ли добавить еще и Alt-S?

Я думаю, что @Ahti - довольно элегантное решение того, что все искали. Прямо к привязке клавиш, не беспокоясь о случайном расширении или странных краевых случаях. Он просто помещает текст для использования или отмены по вашему желанию.

Мне нравится как @nyarly «ы замены и @Ahti» ы ключа связывания раствора.
Лично я использую !! только в контексте sudo !!

Ой! Этой теме уже почти четыре года. Я недавно купил ǃǃ.com и ǃǃ.net (по-видимому, Github не позволяет мне делать гиперссылки, поэтому копируйте и вставляйте), если они кому-то нужны.

Привет! Это классно! @ geoff -code Как ты это сделал?)

Недавно они начали разрешать "интернационализированные" доменные имена .com и .net.
screen shot 2016-05-11 at 4 53 48 am

Тем не менее, в настоящее время поддержка для него по-прежнему работает с ошибками. Например, мне разрешили зарегистрировать ⵌⵑ. Com, но не ⵌ ǃ.com.

Я не знал, что ты можешь зарегистрироваться !! .com, это безумие.

Урок, извлеченный из этой проблемы: если вы когда-нибудь напишете оболочку Unix, единственная функция, которую вы должны реализовать, - это sudo !!, потому что кажется, что люди не могут жить без нее.

А если серьезно, я получил известие от людей, что это отлично работает:

@bucaran Да, похоже, именно так.

Интернационализированные доменные имена - IDN:

https://en.wikipedia.org/wiki/Internationalized_domain_name

edit: слишком медленно с этим сообщением, а также с такими регистрациями, как те @ geoff-code! Это должно быть разумное вложение. Двухсимвольный (вроде) .com!

#!.com взял бы торт. Есть ли правило, запрещающее это для ДВУ com, или что-то, что они должны решить?

В презентации bash для Windows парень что-то напечатал
нравится:

$> эхо привет Windows !!

И я надеюсь, что вы все догадаетесь, что произошло.
11 мая 2016 г. в 13:57 «Аарон Гьес» [email protected] написал:

Международные доменные имена - IDN

11 мая 2016 г. в 4:44:58 Тимофей ([email protected]) написал:

Привет! Это классно! @ geoff -code https://github.com/geoff-codes Как получилось
ты
сделай это?)

-
Вы получаете это, потому что подписаны на эту беседу.
Ответьте на это письмо напрямую или просмотрите его на GitHub
<
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -218435761

-
Вы получили это, потому что прокомментировали.
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -218438118

Итак, мне следует перейти на bash?

@ base698 - Я выпустил плагин fisherman для поддержки двух наиболее распространенных вариантов использования подстановки истории: !! для всей последней команды и! $ для последнего аргумента. Честно говоря, я по большей части сломал свои собственные привычки, потому что редактирование командной строки в Fish настолько хорошо. Тем не менее, мне очень нравится иметь возможность

> which tool
> cat (!!)

например, чтобы изучить сценарий

Вы можете установить плагин с помощью fisher install nyarly/fish-bang-bang после того, как у вас будет установлен fisherman.

для полноты (и правильного примера)
вот скриншот видео YouTube, о котором я упоминал, это одна из замечательных особенностей '!!' шаблон, который теперь доступен и в Windows.
bangpatternbash

https://www.youtube.com/watch?v=2dB0igTfhfg&feature=youtu.be&t=760

Он хочет выполнить git commit -a -m "Rawr!!"

приводит к git commit -a -m "Rawrclear"

Насколько я люблю рыбу !! просто слишком полезно. Не уверен, что sudo !! но также как способ передать предыдущую информацию новым командам. Например:

find . -name something | grep "pattern" тогда я играл бы с выкройкой, пока не получал то, что хочу.
Затем я передал бы это примерно так (someCommand !! ). В настоящее время в рыбах для этого требуется слишком много шагов. Мне не подходят обходные пути.

zsh расширяется !! чтобы вы могли его отредактировать. Так что придется вернуться к zsh.

Если вы используете fisherman (которым вы, скорее всего, должны быть), вы можете установить nyarly/fish-bang-bang и получить любое расширение команды !! и !$

@nyarly Да, я пробовал. Но мне не нравится, как он расширяется сразу после того, как набирается второй ! . Было неловко. zsh чувствует себя лучше, потому что он расширяется после того, как вы введете пробел или нажмете Enter.

РЕДАКТИРОВАТЬ: Да ладно, я не мог этого сделать. Я забыл, насколько раздражает установка ZSH таким, каким я хочу его видеть. Подойдет плагин nyarly.

Я так рад, что этого не произошло! Это нарушает закон ортогональности Фиша и закон внимания пользователя. Замена истории в Bash требует слишком много размышлений, помимо !! и !$ и, возможно, s^ . Вот почему люди используют только их. Решение Фиша более интерактивное, что позволяет заменять аргументы более общими. Он достаточно эффективен с точки зрения количества ударов и одинаково эффективен с !! .

Некоторые пользователи пропускают !! и !$ и не хотят учиться по-другому. Должен ли Fish реализовывать только эти функции в качестве граничных случаев (см. Закон ортогональности)? Или замена всей истории Bash? Или все функции из других оболочек? Все функции, которые могут придумать пользователи?

Вот исправление для тех, кто хочет что-то скопировать и вставить:

поместите это в ~ / .config / fish / functions / fish_user_key_bindings.fish

function bind_bang
  switch (commandline -t)
  case "!"
    commandline -t $history[1]; commandline -f repaint
  case "*"
    commandline -i !
  end
end

function bind_dollar
  switch (commandline -t)
  case "!"
    commandline -t ""
    commandline -f history-token-search-backward
  case "*"
    commandline -i '$'
  end
end

function fish_user_key_bindings
  bind ! bind_bang
  bind '$' bind_dollar
end

URL-адрес @siteshwar, связанный с https://github.com/fish-shell/fish-shell/issues/288#issuecomment -7869918, не работает. Не могли бы вы отредактировать свой комментарий, чтобы исправить это для людей, читающих этот все еще нерешенный вопрос?

Я отредактировал его комментарий, чтобы указать, где мы сейчас размещаем FAQ.

Теперь у рыбы есть && и || (https://github.com/fish-shell/fish-shell/issues/4620) Это так близко к полной замене bash!

Я действительно смущен --

Итак, оболочка, которая декларирует свою цель дизайна номер 1, такова:

1. Everything that can be done in other shell languages should be possible to do in fish

... не позволяет мне выполнять одно из наиболее часто используемых действий в любой другой оболочке?

В часто задаваемых вопросах о рыбах говорится, что пользователям следует

First press Up, then Home, then type "sudo ".

Боже, какая натяжка. Сколько пользователей нажали кнопку «Домой» за последние шесть месяцев по какой-либо причине? Таким образом, я мог бы возразить, что автоматический синтаксический анализ команд со страницы руководства не является достаточно ортогональным , если просто открыть этот проклятый файл и найти его самостоятельно.

@andysalerno
действие, которое вы хотите сделать, - выполнить предыдущую команду с добавлением sudo
и рыба предоставляет эту функциональность
хотя вместо того, чтобы войти
First type "sudo ", then press shift+1, then press shift+1
я делаю
ctrl+p, ctrl+a, type "sudo "
это работает так же в bash
Теперь, когда вы упомянули часто задаваемые вопросы, я снова проверил его, и кто-то удалил часть, касающуюся этого ярлыка, теперь отсутствует. (я создал https://github.com/fish-shell/fish-shell/pull/3879, чтобы исправить это)
Причина, по которой этот ярлык работает, заключается в том, что он следует за библиотекой readline которая широко применяется или имитируется для редактирования строк.
Если я найду время, я создам пул-реквест, чтобы добавить это в часто задаваемые вопросы.
Я могу понять ваше разочарование, использование клавиши Home самом деле не вариант, так как эта клавиша находится в другом месте на многих клавиатурах (например, на всех моих трех клавиатурах).

спасибо за то, что снова подняли этот вопрос. Я думаю, что важно иметь простой (только модификаторы и буквенные клавиши, без клавиши «Домой», без клавиш со стрелками), быстрый (не слишком много нажатий клавиш) и _документированный_ способ сделать это.

круто, я понятия не имел о ctrl + p! Мне это нравится даже больше, чем !!.

редактировать:
есть ли другой способ повторно оценить последнюю выполненную команду? Я часто делаю что-то подобное в bash:

> man -w fish  # prints location of man file for fish
/usr/share/fish/man/man1/fish.1

> less $(!!)

Это не так лаконично, но вы можете сделать это с помощью eval и переменной истории:

> man -w fish
/usr/share/fish/man/man1/fish.1

> less (eval $history[1])

Но лучший способ сделать это - использовать alt-p. Fish будет направлять выходные данные команды в less, если вы нажмете alt-p после ввода команды:

> man fish alt-p > man fish ^&1 |less;

я не понимаю всех людей, которые борются против взрыва ... есть так много случаев, когда взрывы до смешного быстрее и удобнее, чем такие "обходные пути", как:
First press Up, then Home, then type "sudo ".

Команды взрыва - это чертовски волшебство, если к ним привыкнуть ... Я действительно надеюсь, что рыбаки передумают и добавят их обратно. По крайней мере, несколько хороших, например:

!!
!WORD
!WORD:p
!:n
!$
!^
!n:n
!:gs/MISTAKE/FIX
!#
!#^

Хотя рыба довольно хороша, продолжайте в том же духе

Есть ли поддерживаемый способ выполнить последнюю команду в истории? Я не против напечатать его, потому что я просто использую макрос для вызова команды в другом моем окне tmux. Но мой вариант использования заключается в том, что я просто хочу иметь возможность делать что-то вроде этого:

$ echo "hi"
hi
$ x
hi
$ x
hi

Я пробовал eval $history[1] , но второй вызов взрывается. Это полезная вещь в команде !! . Единственное, что на самом деле неприемлемо - это использование клавиш со стрелками. Есть ли в fish какая-либо команда, поддерживающая этот вариант использования?

Лучшее, что я могу сейчас придумать, - это использовать ведущий пробел, который не позволяет добавить его в историю:

$ function x ; eval $history[1] ; end
$ echo "hi"
hi
$  x    # note leading space
hi
$  x
hi

это конечно не здорово, я знаю. Однако в этом простом случае привязка history-search-backward кажется достаточной? По умолчанию это клавиши со стрелками, но вы можете их добавить или изменить.

Ой! Это хорошая идея, я не думал об использовании ведущего места. Я должен попробовать это.

Обновление :
Это отлично сработало для моего варианта использования. $ eval $history[1] #note extra leading space

Вероятно, это причина того, что я не могу оставаться с Фишем. Несмотря на то, что он элегантен и прост, отсутствие стандартных ярлыков для многих вещей делает его непродуктивным:

Первый пункт. Я хочу повторить предыдущую команду с помощью sudo:

sudo !!

1) Нажмите кнопку "Вверх"
Проблема, мне нужно дотянуться до кнопки «Вверх» на клавиатуре. Примерно в четверти случаев я скучаю по нему, а затем вынужден смотреть на клавиатуру, чтобы точно увидеть, где она находится, и, вероятно, исправить то, что было испорчено. Потом...
2) Нажмите Home или Ctrl-A
Дом - это еще один участок, и он расположен во многих разных местах на разных клавиатурах, что мне придется его искать. Ctrl-A более естественен, так что я думаю, это работает.
3) Введите sudo и нажмите return.
Хорошо, это всего семь нажатий клавиш, но одно из них подвержено ошибкам и приводит к прерыванию моего рабочего процесса в большинстве случаев.

Следующий элемент, я хочу указать предыдущий последний аргумент:

ls -l /etc/network/iptables
cat !$

Или с рыбой:
1) Введите "кот".
2) Alt-Up
Хорошо, это опять же не очень естественно. Я редко нажимаю клавишу Alt и чаще всего нажимаю клавишу Super (Cmd / Windows / что-то еще) рядом с ней, что полностью меняет контекст, в котором я нахожусь.

Fish, как и все основные соперники, нуждается в лучшем историческом расширении. Его недостаток - снижение производительности для высокопроизводительных пользователей.

@wrecklass Поскольку я не мог вытащить sudo !! из пальцев, я написал https://github.com/nyarly/fish-bang-bang , который я вам предложу.

Кроме того, IIRC, рыба поставляется с Alt-S для "prepend sudo", который будет работать для последней записи в истории, если ваша команда в настоящее время пуста, точно так же, как Alt-P добавит | less .

И только потому, что он продолжает появляться («т.е. почему !! не работает в fish так же, как и в bash»), я хочу рассказать: особая обработка символа ! была одной из тех вещей, которые выгнал меня с баш. Как давний пользователь рыбы, я был бы очень разочарован, если бы такое поведение было изменено, чтобы успокоить вокальное меньшинство.

sudo !! такая стандартная вещь. Я понимаю, что Fish очень старается уйти от древнего синтаксиса bash, но, отталкивая законно полезные функции в пользу личной философии, я думаю, что мы останавливаем прогресс.

@ClickSentinel , именно по этой причине я перестал использовать fish и придерживался bash . : смайлик:

Наш текущий план состоит в том, чтобы ввести глобальные сокращения, которые также могут поддерживать "!!" и другие. См. # 5003 для этого.

Я закрываю этот вопрос в пользу того, что он исчерпал себя.

@tukusejssirs и @ClickSentinel , пробовали ли вы добавить код по адресу https://github.com/fish-shell/fish-shell/issues/288#issuecomment -306212011 в свою конфигурацию?

У меня был вариант этого в течение нескольких лет (измененный из-за проблемы (возможно, этой проблемы?) В моей конфигурации, и это одна из частей эргономики оболочки, на которую я больше всего полагаюсь (также, особенно с дополнительным корпусом). В моем варианте у меня есть поиск по восходящему токену, используя строку перед !$ , это одна из вещей, которые меня больше всего раздражает, когда я работаю в bash.)

Мой вариант (а может я украл вариант ... не помню: man_shrugging :):

function bind_bang
    switch (commandline --current-token)[-1]
    case "!"
        # Without the `--`, the functionality can break when completing
        # flags used in the history (since, in certain edge cases
        # `commandline` will assume that *it* should try to interpret
        # the flag)
        commandline --current-token -- $history[1]
        commandline --function repaint
    case "*"
        commandline --insert !
    end
end

function bind_dollar
    switch (commandline --current-token)[-1]
    # This case lets us still type a literal `!$` if we need to (by
    # typing `!\$`). Probably overkill.
    case "*!\\"
        # Without the `--`, the functionality can break when completing
        # flags used in the history (since, in certain edge cases
        # `commandline` will assume that *it* should try to interpret
        # the flag)
        commandline --current-token -- (echo -ns (commandline --current-token)[-1] | head -c '-1')
        commandline --insert '$'
    case "!"
        commandline --current-token ""
        commandline --function history-token-search-backward


    # Main difference from referenced version is this `*!` case
    # =========================================================
    #
    # If the `!$` is preceded by any text, search backward for tokens
    # that contain that text as a substring. E.g., if we'd previously
    # run
    #
    #   git checkout -b a_feature_branch
    #   git checkout master
    #
    # then the `fea!$` in the following would be replaced with
    # `a_feature_branch`
    #
    #   git branch -d fea!$
    #
    # and our command line would look like
    #
    #   git branch -d a_feature_branch
    #
    case "*!"
        # Without the `--`, the functionality can break when completing
        # flags used in the history (since, in certain edge cases
        # `commandline` will assume that *it* should try to interpret
        # the flag)
        commandline --current-token -- (echo -ns (commandline --current-token)[-1] | head -c '-1')
        commandline --function history-token-search-backward
    case "*"
        commandline --insert '$'
    end
end

function fish_user_key_bindings
    bind ! bind_bang
    bind '$' bind_dollar
end

Спасибо @ scooter-dangle, это работает даже лучше, чем # 228

Бывают случаи, когда Fish предоставляет более идиоматический способ выполнения некоторых действий:

LANG=C :
fish: Unsupported use of '='. To run ':' with a modified environment, please use 'env LANG=C :…'

Может быть, !! также может по умолчанию сгенерировать такое сообщение, предлагая альтернативный, более идиоматический способ сделать это?

Однако предложение должно быть столь же эффективным. Сравнивать:

  • sudo !!<enter> , все из базовой позиции рук на клавиатуре
  • <up><home>sudo <enter> , как предложено в FAQ Fish, который, кажется, требует большего или меньшего количества ходов рук в зависимости от того, гдеинаходятся на клавиатуре.
  • <C-p><Ca>sudo <enter> , доступный без движения рук, который также работает со значениями по умолчанию для Bash, ZSH и, возможно, с другими, поэтому пользователи могут принять новую привычку, которую можно переносить, когда им приходится иметь дело с другими оболочками.

Для !$ предложение <alt-.> кажется нормальным, не так ли?

@psychoslave Пожалуйста, перестаньте комментировать все старые вопросы , особенно закрытые.

Также блокирую это. На него ответили около пятидесяти раз.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги