Pergunta

Eu quero abrir um caminho para vim a partir do modo de cópia da tela por

Ctrl-A f

Da mesma forma como eu posso abrir arquivos externos no Vim por

Ctrl-W f

Como você pode abrir um caminho no vim em modo de cópia da tela?


--- Obrigado por Samuil para obter o movimento crux

Vamos supor rato está no caminho / arquivo no seguinte código que representa tela quando a tela está no

text[space]PATH/file[space]text

Eu imprensa ^ A f no caminho / arquivo. Deve guardar o caminho do arquivo para / tmp / screenCopyFile de tal forma que podemos usar cat no comando a seguir, que o ^A f deve começar:

^A: exec vim `cat PATH/file`

Eu executar o comando manualmente, sem sucesso. Não expandir o comando cat, mas abre um arquivo chamado gato.

Em outras palavras, queremos fazer a letra f significa

exec vim `cat /tmp/screenCopyFile`

por obrigatório em .screenrc.

Obrigado Rampion pela sua resposta!

Foi útil?

Solução

Ok, aqui está uma solução:

Coloque o seguinte em /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

Em seguida, adicione esta linha ao seu .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

(mudando a /path/to/ apropriadamente)

Então, para usar, certifique-se de reiniciar screen (ou recarregar o .screenrc). Entre no modo de cópia com ^A[, o cursor para o primeiro caractere de um nome de arquivo, em seguida, bateu CTRL-f.

Eu testei isso, e ele funciona para mim, então me diga se você tiver quaisquer problemas.

Se você quiser ver como eu sabia como fazer isso, verifique man screen para ver como todos os vários comandos de trabalho.

Uma melhoria que poderia ser feito é para ser capaz de encontrar o início de um caminho, mas eu não podia fazer isso de forma confiável com os comandos de movimento do modo de cópia somente da tela (por exemplo, qualquer coisa que mudou-se para o primeiro / de "/a/path" movido ao | de "|/a/path")

Isto é devido às limitações dos comandos de movimento do screen no modo de cópia:

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.

Então, se nós mudamos a linha stuff acima para

stuff "Bw Ebe "

que iria mover-se para o início de um caminho, mas também incluiria qualquer lixo não-branco que veio antes do caminho. Então, enquanto todos os seus caminhos são espaços delimitados (em ambos os lados) isso deve funcionar.

Na verdade

stuff "B//^M E?/^Me "

parece funcionar razoavelmente bem, desde que os usos pesquisar para encontrar o primeiro eo último / (digite o ^M no vim pressionando CTRL-v, em seguida, entrar). Eu não testei todos os casos de ponta, mas parece trabalho para:

 /a/path
 #/a/path
 /a/path#

No entanto, ele vai falhar por

 a/relative/path

Outras dicas

Eu não sei vim muito bom, mas com alguns comandos que deve ser feito facilmente. Quando você já tem nome de arquivo na sua pastebuffer, você pode usar esses comandos úteis:

^A : writebuf /tmp/.screenpomfile
^A : exec vim parameters

Eu não sei como fazer vim ler nome de arquivo (eu acho que é possível), mas você poderia :exec seu próprio script escrito em um escudo capaz de `expr parse `expressões:

#!/bin/sh
vim `cat /tmp/.screenpomfile`

Mais tarde, você pode vincular suas próprias chaves para essas ações, e usá-los de forma bastante eficaz.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top