Impossibile avere Vim-come C-W F per la copia in modalità di schermo
-
23-08-2019 - |
Domanda
Voglio aprire un percorso per vim da copia-modalità di schermo da
Ctrl-A f
allo stesso modo come posso aprire file esterni a Vim da
Ctrl-W f
Come si può aprire un percorso in Vim in copia-modalità di schermo?
--- Grazie per Samuil per ottenere il passaggio cruciale
Supponiamo mouse è nel percorso / file nel seguente codice che rappresenta display quando schermo è il
text[space]PATH/file[space]text
premo ^ A f al percorso / file. Deve salvare il percorso del file in / tmp / screenCopyFile tale che possiamo usare cat
il seguente comando che il ^A f
dovrebbe iniziare:
^A: exec vim `cat PATH/file`
faccio funzionare l'ordine manualmente senza successo. Non ha espandere il comando cat, ma si apre un file chiamato cat.
In altre parole, vogliamo rendere la lettera f
sta per
exec vim `cat /tmp/screenCopyFile`
legandosi in .screenrc.
Grazie Rampion per la risposta!
Soluzione
Ok, ecco una soluzione:
Inserire il seguente in /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
Quindi aggiungere questa riga al vostro .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
(cambiando il /path/to/
opportunamente)
Quindi, per utilizzarlo, assicurarsi che si riavvia screen
(o ricaricare la .screenrc
).
Entra modalità di copia con ^A[
, cursore sul primo carattere di un nome di file,
poi ha colpito CTRL-f
.
Ho provato questo, e funziona per me, così mi dica se avete problemi.
Se volete vedere come sapevo come fare questo, controllare man screen
a
vedere come funzionano tutti i vari comandi.
Un miglioramento che potrebbe essere fatto è quello di essere in grado di trovare l'inizio di un percorso, ma non potevo farlo in modo affidabile con i comandi di movimento in modalità copia unica di schermo (ad esempio, tutto ciò che si muoveva al primo /
di "/a/path
" mosso al |
di "|/a/path
")
Questo è dovuto alle limitazioni del movimento di screen
comandi in modalità di copia:
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.
Quindi, se abbiamo cambiato la linea stuff
sopra per
stuff "Bw Ebe "
sarebbe spostarsi all'inizio di un percorso, ma sarebbe anche includere qualsiasi spazzatura non spazio bianco che è venuto prima il percorso. Quindi, fintanto che tutti i percorsi sono spazi delimitati (su entrambi i lati) questo dovrebbe funzionare.
In realtà
stuff "B//^M E?/^Me "
sembra funzionare abbastanza bene, dal momento che utilizza la ricerca per trovare il primo e l'ultimo /
(digitare il ^M
in vim premendo CTRL-v, quindi immettere). Non ho ancora testato tutti i casi limite, ma sembra di lavorare per:
/a/path #/a/path /a/path#
Tuttavia, sta andando a fallire per
a/relative/path
Altri suggerimenti
Non so vim troppo buono, ma con pochi comandi Dovrebbe essere fatto facilmente. Quando hai già il nome del file nel vostro pastebuffer, è possibile utilizzare questi comandi più utili:
^A : writebuf /tmp/.screenpomfile
^A : exec vim parameters
Non so come fare vim
leggere il nome del file da file (penso che sia possibile), ma si potrebbe :exec
il proprio script scritto in un guscio in grado di analizzare `expr
`espressioni:
#!/bin/sh
vim `cat /tmp/.screenpomfile`
In seguito è possibile associare le proprie chiavi a queste azioni, e li usa in maniera abbastanza efficace.