cygwin command to copy to windows clipboard - cygwin

I see here:
http://www.pgrs.net/2008/1/11/command-line-clipboard-access
that there's a way in linux and osx to copy to the clipboard from the command line. So I ran my cygwin setup.exe, but couldn't find the xsel package. I'm guessing maybe this package hasn't been ported to windows? Looks like there's a tool to do it in windows:
http://www.labnol.org/software/tutorials/copy-dos-command-line-output-clipboard-clip-exe/2506/
I guess I'll try that - but in the mean I figured I'd ask if anyone has found a good solution.

Cygwin comes with special device file called /dev/clipboard:
echo foobar > /dev/clipboard # Puts "foobar\n" on the clipboard
cat /dev/clipboard # Pastes clipboard to stdout

On the page you linked, there are comments hinting how to do it on windows:
On Windows, Cygwin comes with getclip
and putclip which do the same job.

I second the answer above
To cat text to the Windows clipboard
putclip < foo.txt
To pipe to a file whatever text is in the Windows clipboard
getclip > foo.txt

getclip/putclip is found in cygutils-extra package.

what about just
clip < file.extension
just tried in on my ssh key

Actually google "resource kit clip " for your windows clip and in cygwin terminal ( I use puttycyg works the following:
find | clip

Not exactly Ditto, but here's a clibboard logger.
#!/usr/bin/ksh
while true
do
if [[ "$(</dev/clipboard)" = "${LastClip}" ]]
then
sleep 2
else
LastClip="$(</dev/clipboard)"
echo "$(</dev/clipboard)" >> $HOME/cliplog.txt
sleep 1
fi
done

Related

Bash script produces bullets in filename

I new to bash scripts. By doing "Google search programming," I've managed to write this one:
#------------------------
_dir="/volume1/Shared/sqlbackup/"
_date=`date +"%Y_%m_%d_%H_%M_%S"`
_file="$_dir$_date.gz"
/usr/syno/mysql/bin/mysqldump -u username -ppassword database | gzip > "$_file"
#------------------------
At the end of running it using a Windows 7 telnet interface, I get a filename that looks something like this, when viewing it on a Windows 7 share:
2013_10_09_13_38_36.gz
The "?" boxes here show up as bullets (like •) on Windows. Obviously, I'm doing something wrong. Does anyone have suggestions.
Thanks.
You can use the dos2unix and unix2dos utilities to convert text files between Linux and Windows formatting. e.g.
dos2unix script.sh

How to run windows gvim from cygwin?

I am not able to run gvim from cygwin. When I try to open a new file with :
gvim filename
gvim opens a file with 'No name' and displays error as :
Error detected while processing command line
E492: Not editor command: C:\cygwin\home\chandan\l
Press enter or type command to continue
More problematic is that I can't open existing file in the path
>which gvim shows /usr/bin/gvim
I have put alias gvim=/cygdrive/c/Program\Files\(x86\)/Vim/vim73/gvim.exe still
I wrote cyg-wrapper.sh for this sole purpose.
It supports:
symbolic links
options that must not be interpreted as pathnames (see -c with gvim, or any flags starting with a minus sign).
In other words, it enables us to type:
gvim /etc/profile -c /PS1 -c "echo 'correctly opened'"
# or even:
cd ~/tmp ; ln -s ~/bin/cyg-wrapper.sh
gvim -d http://hermitte.free.fr/cygwin/cyg-wrapper.sh cyg-wrapper.sh
explorer -e
explorer "$vim"
explorer http://hermitte.free.fr/
Note: I use the following function in my .profile to run gvim with cyg-wrapper.sh
gvim() {
opt=''
if [ `expr "$*" : '.*tex\>'` -gt 0 ] ; then
opt='--servername LATEX '
fi
cyg-wrapper.sh "C:/Progra~1/Edition/vim/vim73/gvim.exe" --binary-opt=-c,--cmd,-T,-t,--servername,--remote-send,--remote-expr --cyg-verbose --fork=2 $opt "$#"
}
EDIT: Currently (Sept 26 2014, using Vim 7.4), Windows gVim uses C:\Windows\gvim.bat to launch gVim from the command line. Replacing the gvim.exe path in the gvim() function with this script allows launching gvim without changing the path to match the current Vim version (which may actually be in Progra~2); however, it appears to also open a superfluous cmd.exe window.
Found this thread, I find the answer from jens unacceptable. We're not asking to be told not to do it. I didn't like the other answers either there was always some quirk, like settings not used or an extra command line window popping up. I Did some digging and this works for me. No extra command line box for nothing and it uses my proper gvim settings.
alias gvim='HOME=/cygdrive/p/ cygstart /cygdrive/c/Program\ Files\ \(x86\)/Vim/vim74/gvim.exe'
You simply need to alter the HOME to your own. To find out what to put there run gvim from windows then put in ":echo $HOME" and hit enter in my case it shows P:\ so that translates to /cygdrive/p/
Also if your gvim.exe is in a different directory/version you'll need to adjust.
Now when I type 'gvim script.sh' at a cygwin command prompt it launches gvim with the file, all nice and neat!
UPDATE
I found a slightly better way to do this. Using the alias was tying up my session that I ran the gvim from, I wanted it to launch as a separate process, using "gvim &" is inelegant as it lists job number when launching and displays a "done" line when completed. I'm too fussy so I figured out how to get that all tidy by using a function.
Just add this to your .bash_functions file, it builds on the previous section regarding home directory and backslash use.
gvim() {
ORIGHOME=$HOME
HOME=/cygdrive/p/
/cygdrive/c/Program\ Files\ \(x86\)/Vim/vim74/gvim.exe $1 & disown
HOME=$ORIGHOME
} 2>/dev/null
UPDATE 2 for babun users!
Ok since having wrestled with this originally I have ended up scrapping the original cygwin install in favor of babun which seems to be a less troublesome setup for those wanting linux functionality in windows without a full blown virtual. Of course my gvim launch script broke, and I had to do the following in my .zshrc file (babun uses zsh, at first I resisted and switched it to bash but then relented as I figured they must have reason, and they did, I like it)
gvim() {
OLD_HOME=$HOME
OLD_VIMRUNTIME=$VIMRUNTIME
export HOME=/cygdrive/c/Users/gmitchell/
export VIMRUNTIME="C:\Program Files (x86)\VIM\vim74"
TARGET=$(cygpath -w $1)
(/cygdrive/c/Program\ Files\ \(x86\)/Vim/vim74/gvim.exe $TARGET &)
export HOME=$OLD_HOME
export VIMRUNTIME=$OLD_VIMRUNTIME
}
*Note: the surrounding curved braces ( ) stops the job id from messing up your clean shell, and you no longer need the "disown"
P.S. The only remaining annoyance with this now is that you cannot "exit" the babun shell until all gvim instances you've launched are closed. Maybe someone can figure that own out. I've tried. When you type exit it just hangs there until you've exited all gvims.
Do yourself a favor, don't attempt to run a windows gvim from cygwin. The set of environment variables is likely completely different, and the pain of backslash directory separators, blanks in filenames, inability to understand /cygwin paths makes this an exercise in futility.
Then, what? Install the cygwin version of gvim and forget about all these problems.
Here is all you need to do:
alias gvim="run.exe /cygdrive/c/Programming/Tools/Vim/vim74/gvim.exe"
Works also with Notepad++, like so:
alias np="run.exe /cygdrive/c/Programming/Tools/Notepad++/notepad++.exe"
I have the same problem
because of the $SHELL var
so, I simple do like this
alias gvim='cmd /c "set SHELL=cmd & start gvim"'
It works for me, may be this will be help you too.
and maybe you want use the same alias for vim.
I put the following function in my .bashrc:
function gvim
{
GVIM_CMD=/cygdrive/c/path/to/gVimPortable.exe
if [[ -z "$1" ]]
then
$GVIM_CMD
else
$GVIM_CMD `cygpath -w $1`
fi
}
This allows me to launch gVim from anywhere.
It works fine for files with spaces, too...
This is a take off on low351's answer. I was unhappy with leaving HOME changed in the cygwin terminal, since I use that locally for a cygwin HOME, not my windows home. But gvim is all setup using Windows HOME. I added this to my .zshrc:
# run windows gvim from command line
gvim() {
local OLD_HOME=$HOME
HOME=/cygdrive/c/Users/jason/
local TARGET=$(cygpath -w $1)
/cygdrive/c/Program\ Files\ \(x86\)/Vim/vim74/gvim.exe $TARGET & disown
HOME=$OLD_HOME
} 2>/dev/null
really, just storing and restoring HOME. Being local, OLD_HOME goes away when the function returns, so it doesn't pollute the environment. If you're editing a cygwin file, running it through cygpath -w will make it a file path that windows gvim understands. It also lets you use window paths (e.g. C:/tmp/foo.txt) but w/ unix '/' separators, so you can dispense with /cygdrive/c. I believe this is all compatible w/ bash. This gives the following output:
> gvim
[2] 5060
>
It seems like the main problem is the HOME and VIM variables which are appropriate to the cygwin environment get exported when running Windows gvim, causing problems because Windows gvim knows nothing of cygwin. This fixes it:
alias gvim='env -u HOME -u VIM /cygdrive/c/Program\ Files\ \(x86\)/Vim/vim74/gvim.exe'
I have Windows gvim set as the default application (in Windows) for many filetypes, so Windows gvim frequently gets opened via the open alias. This fixes that use case:
alias open='env -u HOME -u VIM cygstart'
I just renamed gvim.bat which comes with the standard Win32 vim installation to gvim and put it into /usr/bin.
I am also sharing settings beetween Win32 GVim and Cygwin VIM referring to this article:
http://vim.wikia.com/wiki/Synchronize_configuration_to_many_computers
This way i can have both Vim and Win32 Gvim running with the same plugins and settings.
Since I've tried all of these and had issues I'll show what I'm using. I wrote it in ruby and it handles everything I throw at it (files, directories, or nothing) without any errors/popups/etc.
I saved it as gvim in ~/Dropbox/bin/cygwin/ (which is in my PATH)
#!/usr/bin/env ruby
args=''
filepath=''
arg=ARGV[0]
if arg
if File.exist? arg
if File.file? arg
args+="--remote-tab-silent "
end
filepath=`cygpath -w '#{arg}'`.strip
filepath="'#{filepath}'"
end
else
end
exe="'/c/Program\ Files\ \(x86\)/vim/vim73/gvim.exe' #{args} #{filepath}"
spawn exe
Here's the script I use for ~/bin/gvim. It runs it as if I called gvim FOO from the "Run" dialog (thanks to the batch file being invoked by explorer.exe). Can't play too nicely with the command line, but a self-deleting batch file comes to the rescue.
#!/bin/bash
TEMPFILE_NAME=gvim-`date +%s`-${RANDOM}.bat
TEMPFILE=$TMP/$TEMPFILE_NAME
TEMPFILE_W=`cygpath --windows --absolute --long-name "$TEMPFILE"`
TARGET=
if [ "$1" = "" ] ; then
TARGET=`cygpath --windows --absolute --long-name "."`
else
TARGET=`cygpath --windows --absolute --long-name "$#" | tr '\n' ' '`
fi
WIN_GVIM=`where gvim.exe | tr -d '\r\n'`
WIN_GVIM=`cygpath "$WIN_GVIM" --windows --absolute --long-name`
unix2dos > $TEMPFILE << EOF
start "gvim" "$WIN_GVIM" $TARGET
DEL %~f0
EOF
chmod +x $TEMPFILE
explorer.exe "$TEMPFILE_W"
Special thanks to this answer for the explorer.exe technique.

Linux command to DOS

I have a file include some linux command and I want to run in on windows (DOS command).
The command is:
cat tmp/$id/index.html | sed -e 's/ID/$id/g' > a;mv a tmp/$id/index.html
What is the similar command in MS-DOS?
Thank you!
The problem is that natively there is no equivalent command to sed. You have two options from my point of view. Either create a vb script that does what you want (It will not take 1 line though - more like 10-15 I guess), or use something like GnuWin32 that gives you the option to run unix commands in windows terminal.
You could consider using powershell to do approximately the same thing. It supports cat and mv and you can get a sed like equivalent by using %{_ -replace "expression", "replace"}. Details here http://blogs.msdn.com/b/zainnab/archive/2007/07/09/grep-and-sed-with-powershell.aspx
Or consider using a linux like command prompt like bash which should be available through cygwin
I think this is impossible to do in "bare" command line (as you called DOS command), because cat and sed are separate utilities. If you want to port this script from Linux command shell to windows command line, I would advise you to download and install CygWin
DOS itself does not have support for that. You could try with a port of SED for DOS available here. If you can get Powershell, that's an option. Here's an example of using grep/sed with Powershell.
There are many options.
You can try to install cygwin or download and install Git and use Git-bash or add the bin directory to your PATH so you can run this command on your CMD prompt.
There is no such command(s) for MS-DOS.

Opening files from Filezilla to console Vim?

Sometimes I have the need to modify files that are in a FTP server, currently I have Filezilla opening them in sublime. But I'm moving to VIM and I haven't found a way to make the file open in VIM console. Probably works flawless for gVim but anyone have this working on the console?
I managed to have a console pop up with vim by invoking a custom shell script wrapper instead of vim itself.
#!/bin/bash
gnome-terminal -e "vim $1"
One of the drawbacks is that everytime a new window will pop up. Hope this helps.
This topic is quite old but Vim stays the best ! So, I'd like to share my experience.
I'm using Guake Terminal and Vim v8 on a Debian 9.2 environment. The solution posted by #soulseekah is great but does not allow multiple files open in this configuration.
As the accepted solution, we will need a bash script. The difference will be that we check if vim is running. If no, run it. If yes, open the file in a new tab.
Here we go :
#!/bin/bash
if pgrep -x "vim" > /dev/null ; then
guake -e ":tabedit $1";
else
guake -e "vim $1"
fi
Downsides :
Need to be in normal mode to open new files.
Not working with gnome-terminal.
Enjoy guys !
I use Midnight Commander to do the same thing & it works with console Vim as well as a lot of very useful other commands.

Terminal: Opening the current path in a window?

Often times, I find myself navigating very deep into a directory and wanting to open the graphical window (nautilus) for various reasons. So the question is simple:
After doing,
cd sampledirectory
cd sampledirectory2
How can I open this location in a GUI?
I assume Gnome with Nautilus:
nautilus .
To open in the current directory.
Replace nautilus with whichever File Manager you use (Dolphin, etc).
The most portable way should be using freedesktop's xdg-utils xdg-open. For example
$ xdg-open .
this has the advantage of choosing from your desktop preferences the tool to open different file types, like for example
$ xdg-open ~/Documents/mypresentation.odp
or
$ xdg-open ~/Pictures/mypic.png
nautilus --no-desktop . &
nautilus .
I've done this a zillion times.
Here is how I do it on every system:
Mac:
#!/bin/sh
open /System/Library/CoreServices/Finder.app ${1:-.}
Linux / BSD, if Gnome:
#!/bin/sh
nautilus ${1:-.}
Windows ... Cygwin ...
#!/bin/sh
[ $# -eq 1 ] && exec explorer "$(cygpath -w "$1")"
Similar to DigitalRoss' comment, on a Mac you can add the following to your ~/.bash_profile:
alias finder="open /System/Library/CoreServices/Finder.app ${1:-.}"
then, from any Terminal window session, you can simply type:
finder
to launch the Finder at your current location.
Surprised that you all not mention:
( dolphin . & )
Detaching programs form the terminal is always key for me because when you close the console window after just do
dolphin . &
... it will also close your file manager or whatever program you started this way together with it and probably nobody wants this.

Resources