отправка команды из истории терминала bash в $EDITOR

#vim #terminal #command #edit

#vim #терминал #команда #Редактировать

Вопрос:

Какой был бы самый простой способ отправить ранее использованную команду из истории bash в предпочтительный редактор, скажем, VIM.

Прямо сейчас я использую fc -l , чтобы увидеть, какая команда меня интересует, затем я выделяю ее по этой строке, fc -l lineno lineno | vim - указав два раза lineno , чтобы выбрать только эту строку, и отправить ее в VIM.

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

Причина этого не в том, что я хочу повторно отредактировать команду, чтобы выполнить ее снова, потому что я знаю, как это сделать, нажатие CTRL X E немедленно отправит ее в vim и повторно выполнит ее :wq .

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

Ответ №1:

Как насчет переноса большей части работы в Vim? Допустим, вас интересуют последние 50 команд и запустите следующую команду:

 fc -nl -50 | sed 's/^t //' | vim -
  

Теперь вы видите все элементы истории и можете выполнять поиск по ним с помощью / или отфильтровывать с помощью :g/bad-line-pattern/d и :v/good-line-pattern/d . Если вы привыкли к Vim, это вопрос нескольких нажатий клавиш.

После того, как вы перешли к нужной вам строке и хотите оставить только ее в буфере, вы можете использовать ярлык, подобный этому:

 nnoremap <leader>f VyggVGp
  

В буфере должна остаться только текущая строка.

Комментарии:

1. это довольно полезно, я бы только добавил fc -nl -50 | sed 's/^t //' | vim - , чтобы переопределить количество строк истории, отправленных в vim для обработки, поскольку по умолчанию, я думаю, оно равно 16.

2. @branquito, я согласен, 16 — странное число в этом контексте, изменил его. Мне было интересно, почему он выводит такое большое количество строк, думал, что это как-то связано с командами, выполняемыми в сеансе. Теперь я вижу, что man bash говорит -16 по умолчанию без объяснения причин, хотя в help fc этом нет информации.

Ответ №2:

просто сделайте это, чтобы поместить предыдущую команду в vim, не выполняя ее повторно после сохранения буфера:

 fc -ln -1|vim -
  

или

 history -n -1|vim -
  

Комментарии:

1. извините, это ничем не отличается от того, что я уже делал. fc -l line line чтобы указать именно ту строку, которую я хочу.

2. However this is very time consuming, @branquito это другое. Вам не нужно проверять номера строк, просто запустите команду, или вы можете создать псевдоним. Это решило вашу time consuming проблему или нет? или чего вы ожидаете?

3. Это относится только к последней используемой команде.. Что, если бы это было где-то в середине истории?

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

5. @branquito с zsh, после выхода из vim (c-x c-e), отредактированный cmd заполняется там, ожидая вашего Enter 🙂