Vim: Tubería de texto seleccionado para shell cmd y recibir de salida en vim info/línea de comandos

Quiero tubo el texto seleccionado a un comando de la shell y recibir una línea de salida de este comando de shell en el vim info/línea de comandos?

De lo que realmente estoy tratando de hacer: Tubería el texto seleccionado a un pastebin tipo de comandos de shell y quiero recibir la salida de la shell cmd (que es el enlace http a la pastebin). Es esto posible?

InformationsquelleAutor ikwyl6 | 2010-04-04

6 Kommentare

  1. 17

    Yo lo haría así:

    Lugar esta función en su vimrc:

    function Test() range
      echo system('echo '.shellescape(join(getline(a:firstline, a:lastline), "\n")).'| pbcopy')
    endfunction

    Esto le permitirá llamar a esta función por hacer:

    :'<,'>call Test()

    A continuación, también se puede asignar que como este (justo debajo de la declaración de la función en su vimrc):

    com -range=% -nargs=0 Test :<line1>,<line2>call Test()

    Así que usted puede llamar a la función para hacer esto:

    :'<,'>Test

    Nota: :<','> son la gama de selectores, con el fin de producir ellos simplemente seleccione las líneas pertinentes en el modo visual y, a continuación, vaya al modo de comandos (pulsando la tecla colon)

    • Gran respuesta y funciona. La única cosa es que no se interpretar nuevas líneas en vim en el pastebin. Así que si tengo varias líneas seleccionadas en vim, se muestra como una línea grande de pasta papelera. Hay una forma de arreglar eso?
    • Y para mí que se produce esto: pastebin.com/8XuqTr1K («\» al final de cada línea). Estoy usando pastebin-0.6.1 de Gentoo repositorio y zsh.
    • Estoy usando sprunge.nosotros y un script que hice a mí mismo: <code> mientras que la lectura de datos; hacer pasta=»$pegar datos $» hacer curl-sF «sprunge=$pegar» sprunge.nosotros | xclip && echo xclip -o?sh </código de>
    • Quizás debería utilizar "$paste\n$data"?
    • He solucionado mi problema con la nueva línea: he cambiado el ‘\n’ a ‘\r’ en la función Test() anterior. Ahora se muestra real de nuevas líneas en el pastebin.
    • Ok, para agregar otra pregunta: ¿sabes cómo puedo conseguir el enlace http que se muestra en el vim línea de comandos del sistema por esta secuencia de comandos para ser copiado en el búfer del sistema? (es decir: «*y)
    • He cambiado un poco desde que yo estaba siendo arrastrado ‘\’ caracteres de cada línea: echo system('pbcopy', join(getline(a:firstline, a:lastline), "\n"))

  2. 105

    Para multi versión de línea usted puede hacer esto después de seleccionar el texto:

    :'<,'>:w !command<CR>

    Puede asignar a simple modo visual acceso directo como este:

    xnoremap <leader>c <esc>:'<,'>:w !command<CR>

    Golpe líder clave + c en el modo visual para enviar el texto seleccionado a la entrada estándar del comando. la salida estándar del comando será impreso debajo de vim barra de estado.

    Ejemplo del mundo Real con CoffeeScript:

    https://github.com/epeli/vimconfig/commit/4047839c4e1c294ec7e15682f68563a0dbf0ee6d

    • FYI: la omisión de :w reemplazará a la selección con la salida del comando.
    • No entiendo la sintaxis y el modo de acción de este :w. Es la normal «escribir» comando? ¿Cuál es el segundo : para? Puede usted explicar? Gracias!
    • Una variante de la asignación estoy usando: xnoremap <expr> <Leader>c "\<Esc>:'<,'>:w !" . getbufvar('%', 'run_command', &filetype) . "\<CR>" .. Este utiliza el búfer del fileype como el comando, que funciona bien con muchos idiomas (ruby, python, etc.). Puede anular esta configuración a través de b:run_command que es útil para el código incrustado en las Rebajas de archivos y tal.
    • Me preguntaba la misma cosa! Encuentra debajo :help :w, específicamente :help :w_c.
  3. 31

    Simplemente poner de relieve las líneas utilizando visual de selección de línea shift-v, el golpe :! y escriba el comando que desea enviar los comandos. El resultado será, a continuación, reemplazar el texto seleccionado.

    Cuando escriba el comando aparecerá en la parte inferior como:

    :'<,'>!somecmd

    el ‘<‘> es lo que indica que el rango que han visualmente seleccionados se pasa al comando especificado después de la !

    • Esto simplemente reemplaza el texto seleccionado con la salida desde la consola cmd.
    • Lo siento, lectura errónea de la pregunta. Pensé que eso era lo que quería hacer.
    • Esta versión tiene merrits. Después de hacer esta versión, usted podría copiar/pegar los comandos de salida. (seleccione usando shift-v y pulse y o yy si es una sola línea, etc) deshacer para obtener el original. hit (u), a continuación, pegar hit (p) la copia de la salida del comando. dar a ustedes ambos los datos originales y el pastebin url en su buffer actual, sin ningún extra de configuración de vim, y sin tener que utilizar el ratón para obtener los comandos de salida de la espalda.
    • Hacer somecmd sh va a ejecutar toda la línea como el actual comando de la shell. Por ejemplo. :'<,'>!sh
  4. 4

    Tal vez usted debería usar algo como

    :echo system('echo '.shellescape(@").' | YourCommand')

    A partir de algunos de vim-7.4 versión es mejor utilizar

    :echo system('YourCommand', getreg('"', 1, 1))

    . Esto es, básicamente, la única manera de mantener NUL bytes virgen deberían estar presentes en el archivo. Pasando @" en una u otra forma va a transformar NUL bytes en NL (newline).

    • Esto parece buena. Una cosa de menor importancia, es después de seleccionar el texto que usted tiene que ‘tirar’ con ‘y’, antes de ejecutar el comando. La selección de texto en el modo visual y ejecutar ese comando le da E481: No range allowed
    • Esta idea básica puede ser simplificado a :call system('YourCommand', @"). Una asignación va a hacer lo que sea necesario tirar para usted. Todos juntos, como se ve: map <silent> <Leader>y "9y:call system('YourCommand', @")<CR> El punto principal es que system() toma un 2do argumento, que está escrito para el programa de stdin, con lo que se evita escapar de todos los problemas.
    • Tienes razón, pero @" no es la mejor idea. Ver respuesta actualizada.
  5. 2

    @matias ‘s solución es que no funcione bien para mí, porque parece shellescape anexará \ para cada línea.

    Así que uso sed para lograr esto, y funciona muy bien!

    "dump selected lines
    function! DumpLines() range
      echo system('sed -n '.a:firstline.','.a:lastline.'p '.expand('%'))
    endfunction
    
    com! -range=% -nargs=0 Dump :<line1>,<line2>call DumpLines()
  6. 1

    Otra respuesta:

    function Pastebin() range
        let savedreg[email protected]"
        silent execute a:firstline.",".a:lastline."yank"
        python import vim, subprocess
        python p=subprocess.Popen(["pastebin"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
        python p.stdin.write(vim.eval('@"'))
        let @"=savedreg
        python p.stdin.close()
        python retstatus=p.poll()
        python print p.stdout.read()
    endfunction

    Requiere el soporte de python. Usarlo como matías’ función.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea