Невозможно понять код в .screenrc

Я не уверен насчет точной цели следующего кода чемпиона. Он должен явно выполнять команды в позиции курсора.

# man-word.screen

# prevent messages from slowing this down
msgminwait 0

# copy word starting at cursor
copy                         # I am not sure why we need this
stuff " e "

# open a new window that waits for a word to run man on
# (and uses 'read' to pause on error)
screen -t man /bin/sh -c 'cat | xargs man || read'       # option -c seems to mean execute

# feed that window the copied word
# be sure to enter '^M' as 'CTRL-V ENTER' and '^D' as 'CTRL-V CTRL-D' (in vim)
paste '.'
# should display as 'stuff "^M^D"'
stuff " "

# turn message waiting back on
msgminwait 1

# vi: ft=screen

Код связан в ^g так, что

bindkey -m ^f source /Users/masi/bin/screen/edit-file-under-cursor.screen

что совпадает с

bind f source /Users/masi/bin/screen/edit-file-under-cursor.screen

Я запускаю код, поскольку мой курсор находится в начале следующей строки

vim ~/.zshrc

Я получаю новый буфер таким образом, что

alt text http://files.getdropbox.com/u/175564/screen-rampion.png

Какова цель команды?

Ответ 1

Таким образом, команда не запускает произвольный код. Все, что он делает, запускается man <whatever> в новом окне экрана, если ваш курсор был над словом <whatever>.

Причина, по которой команда copy заключается в том, что вам нужно указать экран, который вы хотите скопировать. Вы не всегда можете быть в режиме копирования экрана, когда по пути - например, вы можете использовать vim и иметь курсор vim над контуром. Если вы уже находитесь в режиме копирования, то это не-op.

screen -t man /bin/sh -c 'cat | xargs man || read'
  • screen:: открыть новое окно
  • -t man:: присвоить ему название man
  • /bin/sh -c 'cat | xargs man || read':: выполнить эту команду в новом окне, а не открывать оболочку по умолчанию в новом окне.
    • /bin/sh:: программа оболочки
    • -c 'cat | xargs man || read':: запустить заданную строку как script, а не открывать в интерактивном режиме
    • cat |:: ожидание ввода пользователя (завершено новой строкой и CTRL-D), затем подайте его как пользовательский ввод следующей команды
    • xargs man:: call man, используя то, что читается со стандартного ввода в качестве аргументов командной строки для man
    • || read:: если предыдущие команды возвращают ненулевое значение, дождитесь, когда пользователь нажмет кнопку ввода

С вашего вывода это выглядит как

  • Часть команды -c не запускается, поскольку она выглядит как новая оболочка (подсказка $).
  • Часть stuff "^M^D" не была правильно расшифрована. Следующая строка без комментария после paste '.' должна быть введена, нажатие клавиши для нажатия клавиши:

    's', 't', 'u', 'f', 'f', ' ', '"', <CTRL-V>, <ENTER>, <CTRL-V>, <CTRL-D>, '"'
    

Если вы загрузили файл, а не расшифровали его, у вас могут не возникнуть проблемы.

Кроме того, bindkey -m ^f не совпадает с bind f. И не связывайте команду с ^g.

  • bindkey -m ^f привязывает команду к <CTRL-f>, но только в режиме копирования.
  • bind f привязывает команду к <CTRL-A> f во всех режимах.