Невозможно использовать Vim-подобный CW f для режима копирования Screen.
-
23-08-2019 - |
Вопрос
Я хочу открыть путь к vim из режима копирования Screen с помощью
Ctrl-A f
точно так же, как я могу открывать внешние файлы в Vim с помощью
Ctrl-W f
Как открыть путь в Vim в режиме копирования Screen?
--- Спасибо за то, что Сэмюил помог мне понять суть дела.
Предположим, что мышь находится в PATH/file в следующем коде, который представляет отображение при включенном экране.
text[space]PATH/file[space]text
Я нажимаю ^A f в PATH/file.Он должен сохранить PATH файла в /tmp/screenCopyFile, чтобы мы могли использовать cat
в следующей команде, которая ^A f
должно начаться:
^A: exec vim `cat PATH/file`
Я запускаю команду вручную, но безуспешно.Команда cat не расширяется, но открывается файл с именем cat.
Другими словами, мы хотим сделать букву f
означает
exec vim `cat /tmp/screenCopyFile`
путем привязки в .screenrc.
Спасибо, Рэмпион, за ваш ответ!
Решение
Хорошо, вот решение:
Вставьте следующее /path/to/edit-file-under-cursor.screen
:
# edit-file-under-cursor.screen
# prevent messages from slowing this down
msgminwait 0
# copy path starting at cursor
stuff " Ebe "
# write the path to a file
writebuf /tmp/screen-copied-path
# open that file in vim in a new screen window
screen /bin/sh -c 'vim `cat /tmp/screen-copied-path`'
# turn message waiting back on
msgminwait 1
# vi: ft=screen
Затем добавьте эту строку в свой .screenrc
:
# bind CTRL-f to open the file starting at the cursor
# when in copy mode
bindkey -m ^f source /path/to/edit-file-under-cursor.screen
(меняя /path/to/
соответственно)
Затем, чтобы использовать, обязательно перезапустите screen
(или перезагрузите .screenrc
).Войдите в режим копирования с помощью ^A[
, курсор первого персонажа имени файла, затем ударил CTRL-f
.
Я проверил это, и у меня это работает, поэтому сообщите мне, если у вас возникнут какие-либо проблемы.
Если вы хотите узнать, как я это сделал, проверьте man screen
Чтобы увидеть, как работают все различные команды.
Одно из улучшений, которое можно было бы сделать, — это найти начало пути, но я не смог сделать это надежно, используя только команды перемещения в режиме копирования экрана (например,все, что переместилось на первое место /
из "/a/path
"переехал в |
из "|/a/path
")
Это связано с ограничениями screen
команды перемещения в режиме копирования:
Movement keys: h, j, k, l move the cursor line by line or column by column. 0, ^ and $ move to the leftmost column, to the first or last non-whitespace character on the line. H, M and L move the cursor to the leftmost column of the top, center or bottom line of the window. + and - positions one line up and down. G moves to the specified absolute line (default: end of buffer). | moves to the specified absolute column. w, b, e move the cursor word by word. B, E move the cursor WORD by WORD (as in vi). C-u and C-d scroll the display up/down by the specified amount of lines while preserving the cursor position. (Default: half screen-full). C-b and C-f scroll the display up/down a full screen. g moves to the beginning of the buffer. % jumps to the specified percentage of the buffer. ... Searching: / Vi-like search forward. ? Vi-like search backward. C-a s Emacs style incremental search forward. C-r Emacs style reverse i-search.
Итак, если бы мы изменили stuff
строка выше, чтобы
stuff "Bw Ebe "
он переместится в начало пути, но также будет включать в себя любой мусор без пробелов, который стоит перед путем.Итак, пока все ваши пути разделены пробелами (с обеих сторон), это должно работать.
На самом деле
stuff "B//^M E?/^Me "
кажется, работает довольно хорошо, поскольку для поиска первого и последнего используется поиск /
(введите ^M
в vim, нажав CTRL-v, затем введите).Я не тестировал все крайние случаи, но, похоже, это работает для:
/a/path #/a/path /a/path#
Однако это потерпит неудачу
a/relative/path
Другие советы
Я не слишком хорошо знаю vim, но с помощью нескольких команд это легко сделать.Если у вас уже есть имя файла в буфере пасты, вы можете использовать эти полезные команды:
^A : writebuf /tmp/.screenpomfile
^A : exec vim parameters
Я не знаю, как сделать vim
прочитать имя файла из файла (я думаю, это возможно), но вы могли бы :exec
ваш собственный скрипт, написанный в оболочке, способной анализировать `expr
`выражения:
#!/bin/sh
vim `cat /tmp/.screenpomfile`
Позже вы сможете привязать к этим действиям свои собственные клавиши и использовать их достаточно эффективно.