2009-07-13 6 views
1

Я не уверен насчет точной цели следующих Rampion's code. Он должен, очевидно, выполнять команды (ы) в позиции курсора.Невозможно понять код в .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

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

ответ

2

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

Из вашего выхода, похоже,

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

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

Если у вас downloaded the file, а не расшифрована, вы не можете иметь эти вопросы.

Также bindkey -m ^f - это не то же самое, что и bind f. И ни одна из них не связывает команду с ^g.

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

@rampion: Благодарим вас за ответ! –

+0

Вы имеете в виду, что если вы всегда используете команду в режиме копирования экрана, вам не нужна команда 'copy'? --- Я всегда использовал такие команды только в режиме копирования экрана. * Каково основное преимущество использования таких команд за пределами режима копирования экрана? * --- * Как вы можете это сделать? * –

+0

Ну, курсор не всегда находится в конце txt вне режима копирования. В vim при использовании readline и т. Д. Курсор может указывать на различные тексты. Поэтому я решил, чтобы мои команды могли работать напрямую в этих случаях, без необходимости сначала переключиться в режим копирования. – rampion