Невозможно использовать Vim-подобный CW f для режима копирования Screen.

StackOverflow https://stackoverflow.com/questions/895608

  •  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`

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top