Невозможно понять код в .screenrc - PullRequest
1 голос
/ 13 июля 2009

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

# 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

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

альтернативный текст http://files.getdropbox.com/u/175564/screen-rampion.png

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

1 Ответ

2 голосов
/ 13 июля 2009

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

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

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' :: запускать данную строку как скрипт, а не открывать в интерактивном режиме
    • cat | :: ждать пользовательского ввода (заканчивающегося новой строкой и CTRL-D), затем передать его как ввод пользователя следующей команде
    • xargs man :: call man, используя все, что читается из стандартного ввода, в качестве аргументов командной строки для man
    • || read :: если предыдущие команды возвращают ненулевое значение, подождите, пока пользователь нажмет Enter

По вашему выводу это выглядит как

  1. Часть команды -c не запускается, поскольку выглядит как новая оболочка ($ - подсказка).
  2. Часть 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 во всех режимах.
...